calkit 0.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calkit.es.js","sources":["../src/core/base-component.js","../src/core/state.js","../src/core/dates.js","../src/styles/tokens.js","../src/styles/reset.js","../src/styles/animations.js","../src/components/booking/booking-data.js","../src/components/datepicker/calendar-grid.js","../src/components/datepicker/navigation.js","../src/components/datepicker/month-year-picker.js","../src/components/datepicker/presets.js","../src/components/datepicker/popover.js","../src/components/shared/loading-skeleton.js","../src/components/shared/status-message.js","../src/components/datepicker/index.js","../src/core/times.js","../src/components/timepicker/time-grid.js","../src/components/booking/index.js","../src/components/timepicker/index.js","../src/core/scheduler-utils.js","../src/components/scheduler/scheduler-data.js","../src/components/scheduler/scheduler-nav.js","../src/components/scheduler/time-axis.js","../src/components/scheduler/resource-header.js","../src/components/scheduler/event-block.js","../src/components/scheduler/slot-prompt.js","../src/components/scheduler/day-view.js","../src/components/scheduler/week-view.js","../src/components/scheduler/month-view.js","../src/components/scheduler/scheduler-skeleton.js","../src/components/scheduler/event-detail.js","../src/components/scheduler/resource-tabs.js","../src/components/scheduler/fab-button.js","../src/components/scheduler/drag-manager.js","../src/components/scheduler/index.js","../src/index.js"],"sourcesContent":["/**\n * Shared base class for all calendar web components.\n * Provides Shadow DOM setup, style injection, render lifecycle, and helpers.\n */\nexport class CalendarBase extends HTMLElement {\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n this._initialized = false;\n }\n\n /** Override in subclass — return array of CSSStyleSheet or CSS strings. */\n static get styles() {\n return [];\n }\n\n connectedCallback() {\n if (!this._initialized) {\n this._adoptStyles();\n this._initialized = true;\n }\n this.render();\n }\n\n _adoptStyles() {\n const sheets = this.constructor.styles;\n if (!sheets.length) return;\n\n // Try constructable stylesheets first\n if ('adoptedStyleSheets' in this.shadowRoot) {\n this.shadowRoot.adoptedStyleSheets = sheets.map((s) => {\n if (s instanceof CSSStyleSheet) return s;\n const sheet = new CSSStyleSheet();\n sheet.replaceSync(s);\n return sheet;\n });\n } else {\n // Fallback: inject <style> tags\n for (const s of sheets) {\n const el = document.createElement('style');\n el.textContent = s instanceof CSSStyleSheet ? '' : s;\n this.shadowRoot.prepend(el);\n }\n }\n }\n\n /** Subclasses override to update Shadow DOM. */\n render() {}\n\n /** Dispatch a composed, bubbling custom event. */\n emit(name, detail = {}) {\n this.dispatchEvent(\n new CustomEvent(name, { detail, bubbles: true, composed: true })\n );\n }\n\n /** Show an inline status banner. */\n showStatus(type, message, opts = {}) {\n if (!this._store) return;\n const { autoDismiss, dismissible = true } = opts;\n clearTimeout(this._statusTimer);\n this._store.set({ statusType: type, statusMessage: message, statusDismissible: dismissible });\n this.emit('cal:status', { type, message });\n if (autoDismiss && autoDismiss > 0) {\n this._statusTimer = setTimeout(() => this.clearStatus(), autoDismiss);\n }\n }\n\n /** Clear the status banner. */\n clearStatus() {\n if (!this._store) return;\n clearTimeout(this._statusTimer);\n this._store.set({ statusType: null, statusMessage: null, statusDismissible: true });\n this.emit('cal:status', { type: null, message: null });\n }\n\n /** Query within shadow root. */\n $(selector) {\n return this.shadowRoot.querySelector(selector);\n }\n\n $$(selector) {\n return this.shadowRoot.querySelectorAll(selector);\n }\n}\n","/**\n * Minimal pub/sub reactive store.\n * Usage:\n * const store = createStore({ count: 0 });\n * store.subscribe((state) => console.log(state.count));\n * store.set({ count: 1 });\n */\nexport function createStore(initial) {\n let state = { ...initial };\n const listeners = new Set();\n\n return {\n get(key) {\n return state[key];\n },\n\n set(partial) {\n const prev = state;\n state = { ...state, ...partial };\n // Only notify if something actually changed\n let changed = false;\n for (const key of Object.keys(partial)) {\n if (prev[key] !== state[key]) {\n changed = true;\n break;\n }\n }\n if (changed) {\n for (const fn of listeners) fn(state, prev);\n }\n },\n\n getState() {\n return state;\n },\n\n subscribe(fn) {\n listeners.add(fn);\n return () => listeners.delete(fn);\n },\n };\n}\n","export const MONTH_NAMES = [\n 'January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December',\n];\n\nconst SHORT_WEEKDAYS = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'];\nconst DAY_NAMES = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\nconst SHORT_DAY_NAMES = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n\n/**\n * Get the full or short day name for a date string.\n * @param {string} dateStr - ISO date string\n * @param {'long'|'short'} format\n * @returns {string}\n */\nexport function getDayName(dateStr, format = 'short') {\n const d = parseDate(dateStr);\n if (!d) return '';\n return format === 'long' ? DAY_NAMES[d.getDay()] : SHORT_DAY_NAMES[d.getDay()];\n}\n\n/**\n * Returns weekday labels starting from `firstDay` (0 = Sunday).\n */\nexport function getWeekdayLabels(firstDay = 0) {\n const labels = [];\n for (let i = 0; i < 7; i++) {\n labels.push(SHORT_WEEKDAYS[(firstDay + i) % 7]);\n }\n return labels;\n}\n\nexport function getDaysInMonth(year, month) {\n return new Date(year, month + 1, 0).getDate();\n}\n\nexport function getFirstDayOfMonth(year, month) {\n return new Date(year, month, 1).getDay();\n}\n\n/** Returns \"YYYY-MM-DD\" string for a Date or {year, month, day}. */\nexport function toDateString(date) {\n if (typeof date === 'string') return date;\n const d = date instanceof Date ? date : new Date(date.year, date.month, date.day);\n const y = d.getFullYear();\n const m = String(d.getMonth() + 1).padStart(2, '0');\n const day = String(d.getDate()).padStart(2, '0');\n return `${y}-${m}-${day}`;\n}\n\n/** Parse an ISO date string or Date into a Date object at midnight local. */\nexport function parseDate(value) {\n if (!value) return null;\n if (value instanceof Date) return value;\n if (typeof value === 'string') {\n const [y, m, d] = value.split('-').map(Number);\n if (!y || !m || !d) return null;\n return new Date(y, m - 1, d);\n }\n return null;\n}\n\nexport function isSameDay(a, b) {\n if (!a || !b) return false;\n const da = parseDate(a);\n const db = parseDate(b);\n if (!da || !db) return false;\n return da.getFullYear() === db.getFullYear()\n && da.getMonth() === db.getMonth()\n && da.getDate() === db.getDate();\n}\n\nexport function isInRange(date, start, end) {\n if (!date || !start || !end) return false;\n const d = parseDate(date);\n const s = parseDate(start);\n const e = parseDate(end);\n if (!d || !s || !e) return false;\n const dt = d.getTime();\n const st = Math.min(s.getTime(), e.getTime());\n const et = Math.max(s.getTime(), e.getTime());\n return dt >= st && dt <= et;\n}\n\nexport function isBefore(a, b) {\n const da = parseDate(a);\n const db = parseDate(b);\n if (!da || !db) return false;\n return da.getTime() < db.getTime();\n}\n\nexport function isAfter(a, b) {\n const da = parseDate(a);\n const db = parseDate(b);\n if (!da || !db) return false;\n return da.getTime() > db.getTime();\n}\n\nexport function today() {\n return toDateString(new Date());\n}\n\nexport function addMonths(year, month, delta) {\n const d = new Date(year, month + delta, 1);\n return { year: d.getFullYear(), month: d.getMonth() };\n}\n\n/**\n * Checks if two date ranges overlap.\n * When allowSameDay=true, checkout/checkin on same day is NOT treated as overlap.\n */\nexport function rangesOverlap(startA, endA, startB, endB, allowSameDay = false) {\n if (!startA || !endA || !startB || !endB) return false;\n if (allowSameDay) {\n return startA < endB && endA > startB;\n }\n return startA <= endB && endA >= startB;\n}\n\n/** Returns ISO date string offset by N days. */\nexport function addDays(dateStr, n) {\n const d = parseDate(dateStr);\n if (!d) return dateStr;\n d.setDate(d.getDate() + n);\n return toDateString(d);\n}\n\n/** Returns array of all ISO date strings in range (inclusive). */\nexport function getDateRange(start, end) {\n const result = [];\n const s = parseDate(start);\n const e = parseDate(end);\n if (!s || !e) return result;\n const current = new Date(s);\n while (current <= e) {\n result.push(toDateString(current));\n current.setDate(current.getDate() + 1);\n }\n return result;\n}\n\n/**\n * Build a 42-cell (6×7) grid for the given month.\n * Each cell: { year, month, day, dateString, isCurrentMonth, isToday }\n * `firstDay` = 0 (Sun) .. 6 (Sat).\n */\nexport function buildMonthGrid(year, month, firstDay = 0) {\n const daysInMonth = getDaysInMonth(year, month);\n const rawStartDay = getFirstDayOfMonth(year, month);\n const startOffset = (rawStartDay - firstDay + 7) % 7;\n const cells = [];\n const todayStr = today();\n\n // Previous month fill\n const prev = addMonths(year, month, -1);\n const daysInPrev = getDaysInMonth(prev.year, prev.month);\n for (let i = startOffset - 1; i >= 0; i--) {\n const day = daysInPrev - i;\n const dateString = toDateString({ year: prev.year, month: prev.month, day });\n cells.push({ year: prev.year, month: prev.month, day, dateString, isCurrentMonth: false, isToday: dateString === todayStr });\n }\n\n // Current month\n for (let day = 1; day <= daysInMonth; day++) {\n const dateString = toDateString({ year, month, day });\n cells.push({ year, month, day, dateString, isCurrentMonth: true, isToday: dateString === todayStr });\n }\n\n // Next month fill\n const next = addMonths(year, month, 1);\n let i = 1;\n while (cells.length < 42) {\n const dateString = toDateString({ year: next.year, month: next.month, day: i });\n cells.push({ year: next.year, month: next.month, day: i, dateString, isCurrentMonth: false, isToday: dateString === todayStr });\n i++;\n }\n\n return cells;\n}\n","export const tokens = `\n :host {\n /* Light theme (default) */\n --cal-bg: 0 0% 100%;\n --cal-bg-muted: 240 5% 96%;\n --cal-fg: 240 6% 10%;\n --cal-fg-muted: 240 4% 46%;\n --cal-border: 240 6% 90%;\n --cal-accent: 240 6% 10%;\n --cal-accent-fg: 0 0% 100%;\n --cal-accent-subtle: 240 5% 96%;\n --cal-hover: 240 5% 93%;\n --cal-ring: 240 6% 10%;\n --cal-radius: 8px;\n --cal-radius-sm: 6px;\n --cal-cell-size: 36px;\n --cal-transition: 150ms ease;\n\n /* Booking color palette (softer / less saturated) */\n --cal-booking-blue-bg: 217 55% 94%;\n --cal-booking-blue-fg: 217 60% 35%;\n --cal-booking-green-bg: 152 45% 93%;\n --cal-booking-green-fg: 152 55% 28%;\n --cal-booking-red-bg: 4 50% 94%;\n --cal-booking-red-fg: 4 55% 40%;\n --cal-booking-orange-bg: 30 55% 93%;\n --cal-booking-orange-fg: 30 60% 35%;\n --cal-booking-gray-bg: 240 8% 94%;\n --cal-booking-gray-fg: 240 8% 38%;\n\n /* Booking hover tokens */\n --cal-booking-blue-hover: 217 55% 88%;\n --cal-booking-green-hover: 152 45% 87%;\n --cal-booking-red-hover: 4 50% 88%;\n --cal-booking-orange-hover: 30 55% 87%;\n --cal-booking-gray-hover: 240 8% 88%;\n\n /* Scheduler tokens */\n --cal-sched-grid-line: 240 6% 94%;\n --cal-sched-now-line: 4 70% 55%;\n --cal-sched-slot-hover: 240 5% 97%;\n --cal-sched-header-bg: 240 5% 98%;\n\n /* Status tokens */\n --cal-status-error-bg: 4 50% 95%;\n --cal-status-error-fg: 4 55% 40%;\n --cal-status-error-border: 4 50% 85%;\n --cal-status-warning-bg: 40 55% 95%;\n --cal-status-warning-fg: 40 60% 35%;\n --cal-status-warning-border: 40 50% 85%;\n --cal-status-info-bg: 217 55% 95%;\n --cal-status-info-fg: 217 60% 35%;\n --cal-status-info-border: 217 50% 85%;\n --cal-status-success-bg: 152 45% 95%;\n --cal-status-success-fg: 152 55% 28%;\n --cal-status-success-border: 152 45% 85%;\n }\n\n :host([theme=\"dark\"]) {\n --cal-bg: 240 6% 10%;\n --cal-bg-muted: 240 4% 16%;\n --cal-fg: 0 0% 98%;\n --cal-fg-muted: 240 4% 54%;\n --cal-border: 240 4% 20%;\n --cal-accent: 0 0% 98%;\n --cal-accent-fg: 240 6% 10%;\n --cal-accent-subtle: 240 4% 16%;\n --cal-hover: 240 4% 20%;\n --cal-ring: 0 0% 98%;\n\n --cal-booking-blue-bg: 217 50% 25%;\n --cal-booking-blue-fg: 217 80% 75%;\n --cal-booking-green-bg: 142 40% 22%;\n --cal-booking-green-fg: 142 70% 70%;\n --cal-booking-red-bg: 4 45% 25%;\n --cal-booking-red-fg: 4 70% 75%;\n --cal-booking-orange-bg: 30 45% 25%;\n --cal-booking-orange-fg: 30 80% 75%;\n --cal-booking-gray-bg: 240 5% 22%;\n --cal-booking-gray-fg: 240 5% 65%;\n\n --cal-booking-blue-hover: 217 50% 30%;\n --cal-booking-green-hover: 142 40% 27%;\n --cal-booking-red-hover: 4 45% 30%;\n --cal-booking-orange-hover: 30 45% 30%;\n --cal-booking-gray-hover: 240 5% 27%;\n\n --cal-sched-grid-line: 240 4% 18%;\n --cal-sched-now-line: 4 55% 55%;\n --cal-sched-slot-hover: 240 4% 14%;\n --cal-sched-header-bg: 240 5% 12%;\n\n --cal-status-error-bg: 4 45% 20%;\n --cal-status-error-fg: 4 70% 75%;\n --cal-status-error-border: 4 45% 30%;\n --cal-status-warning-bg: 40 45% 20%;\n --cal-status-warning-fg: 40 80% 75%;\n --cal-status-warning-border: 40 45% 30%;\n --cal-status-info-bg: 217 50% 20%;\n --cal-status-info-fg: 217 80% 75%;\n --cal-status-info-border: 217 50% 30%;\n --cal-status-success-bg: 152 40% 18%;\n --cal-status-success-fg: 152 70% 70%;\n --cal-status-success-border: 152 40% 28%;\n }\n\n :host([theme=\"auto\"]) {\n --cal-bg: 0 0% 100%;\n --cal-bg-muted: 240 5% 96%;\n --cal-fg: 240 6% 10%;\n --cal-fg-muted: 240 4% 46%;\n --cal-border: 240 6% 90%;\n --cal-accent: 240 6% 10%;\n --cal-accent-fg: 0 0% 100%;\n --cal-accent-subtle: 240 5% 96%;\n --cal-hover: 240 5% 93%;\n --cal-ring: 240 6% 10%;\n }\n\n @media (prefers-color-scheme: dark) {\n :host([theme=\"auto\"]) {\n --cal-bg: 240 6% 10%;\n --cal-bg-muted: 240 4% 16%;\n --cal-fg: 0 0% 98%;\n --cal-fg-muted: 240 4% 54%;\n --cal-border: 240 4% 20%;\n --cal-accent: 0 0% 98%;\n --cal-accent-fg: 240 6% 10%;\n --cal-accent-subtle: 240 4% 16%;\n --cal-hover: 240 4% 20%;\n --cal-ring: 0 0% 98%;\n\n --cal-booking-blue-bg: 217 50% 25%;\n --cal-booking-blue-fg: 217 80% 75%;\n --cal-booking-green-bg: 142 40% 22%;\n --cal-booking-green-fg: 142 70% 70%;\n --cal-booking-red-bg: 4 45% 25%;\n --cal-booking-red-fg: 4 70% 75%;\n --cal-booking-orange-bg: 30 45% 25%;\n --cal-booking-orange-fg: 30 80% 75%;\n --cal-booking-gray-bg: 240 5% 22%;\n --cal-booking-gray-fg: 240 5% 65%;\n\n --cal-booking-blue-hover: 217 50% 30%;\n --cal-booking-green-hover: 142 40% 27%;\n --cal-booking-red-hover: 4 45% 30%;\n --cal-booking-orange-hover: 30 45% 30%;\n --cal-booking-gray-hover: 240 5% 27%;\n\n --cal-sched-grid-line: 240 4% 18%;\n --cal-sched-now-line: 4 55% 55%;\n --cal-sched-slot-hover: 240 4% 14%;\n --cal-sched-header-bg: 240 5% 12%;\n\n --cal-status-error-bg: 4 45% 20%;\n --cal-status-error-fg: 4 70% 75%;\n --cal-status-error-border: 4 45% 30%;\n --cal-status-warning-bg: 40 45% 20%;\n --cal-status-warning-fg: 40 80% 75%;\n --cal-status-warning-border: 40 45% 30%;\n --cal-status-info-bg: 217 50% 20%;\n --cal-status-info-fg: 217 80% 75%;\n --cal-status-info-border: 217 50% 30%;\n --cal-status-success-bg: 152 40% 18%;\n --cal-status-success-fg: 152 70% 70%;\n --cal-status-success-border: 152 40% 28%;\n }\n }\n`;\n","export const reset = `\n :host {\n display: inline-block;\n font-family: inherit;\n font-size: 14px;\n line-height: 1.5;\n color: hsl(var(--cal-fg));\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n }\n\n :host([display=\"inline\"]) {\n display: inline-block;\n }\n\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n button {\n font: inherit;\n color: inherit;\n background: none;\n border: none;\n padding: 0;\n margin: 0;\n cursor: pointer;\n -webkit-tap-highlight-color: transparent;\n }\n\n button:focus-visible {\n outline: 2px solid hsl(var(--cal-ring));\n outline-offset: 2px;\n border-radius: var(--cal-radius-sm);\n }\n\n [hidden] {\n display: none !important;\n }\n`;\n","export const animations = `\n @keyframes cal-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n\n @keyframes cal-slide-up {\n from {\n opacity: 0;\n transform: translateY(4px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n @keyframes cal-slide-left {\n from {\n opacity: 0;\n transform: translateX(16px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n }\n\n @keyframes cal-slide-right {\n from {\n opacity: 0;\n transform: translateX(-16px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n }\n\n .cal-animate-fade { animation: cal-fade-in 150ms cubic-bezier(0.16, 1, 0.3, 1); }\n .cal-animate-slide-up { animation: cal-slide-up 200ms cubic-bezier(0.16, 1, 0.3, 1); }\n .cal-animate-slide-left { animation: cal-slide-left 200ms cubic-bezier(0.16, 1, 0.3, 1); }\n .cal-animate-slide-right { animation: cal-slide-right 200ms cubic-bezier(0.16, 1, 0.3, 1); }\n\n @keyframes cal-shimmer {\n 0% { background-position: -200% 0; }\n 100% { background-position: 200% 0; }\n }\n\n .cal-skeleton {\n background: linear-gradient(\n 90deg,\n hsl(var(--cal-bg-muted)) 25%,\n hsl(var(--cal-hover)) 50%,\n hsl(var(--cal-bg-muted)) 75%\n );\n background-size: 200% 100%;\n animation: cal-shimmer 1.5s infinite ease-in-out;\n border-radius: 999px;\n }\n\n .cal-skeleton--rect {\n border-radius: var(--cal-radius-sm);\n }\n`;\n","/**\n * Booking data layer: cell status resolution, validation, and color palette.\n */\n\n/** Color palette mapping from booking color names to CSS token pairs. */\nexport const BOOKING_COLORS = {\n blue: { bg: 'var(--cal-booking-blue-bg)', fg: 'var(--cal-booking-blue-fg)', hover: 'var(--cal-booking-blue-hover)' },\n green: { bg: 'var(--cal-booking-green-bg)', fg: 'var(--cal-booking-green-fg)', hover: 'var(--cal-booking-green-hover)' },\n red: { bg: 'var(--cal-booking-red-bg)', fg: 'var(--cal-booking-red-fg)', hover: 'var(--cal-booking-red-hover)' },\n orange: { bg: 'var(--cal-booking-orange-bg)', fg: 'var(--cal-booking-orange-fg)', hover: 'var(--cal-booking-orange-hover)' },\n gray: { bg: 'var(--cal-booking-gray-bg)', fg: 'var(--cal-booking-gray-fg)', hover: 'var(--cal-booking-gray-hover)' },\n};\n\nconst DEFAULT_COLOR = 'blue';\n\nfunction getColorTokens(colorName) {\n return BOOKING_COLORS[colorName] || BOOKING_COLORS[DEFAULT_COLOR];\n}\n\n/**\n * Resolve cell status for a single date given bookings, dayData, and labelFormula.\n *\n * Priority: labelFormula > dayData > derived from bookings.\n *\n * @param {string} dateStr - ISO date string\n * @param {Array} bookings - array of { id, start, end, label, color }\n * @param {Object} dayData - map of dateStr → { label, status }\n * @param {Function|null} labelFormula - (dateStr) => { label, status }\n * @returns {{ status, label, checkoutBooking, checkinBooking, halfDay, colorOut, colorIn, colorFull }}\n */\nexport function resolveCellData(dateStr, bookings = [], dayData = {}, labelFormula = null) {\n // Find bookings that touch this date\n const checkoutBooking = bookings.find((b) => b.end === dateStr);\n const checkinBooking = bookings.find((b) => b.start === dateStr);\n const spanningBooking = bookings.find(\n (b) => b.start < dateStr && b.end > dateStr\n );\n\n // Derive base status from bookings\n let status = 'available';\n let label = null;\n let halfDay = false;\n let colorOut = null;\n let colorIn = null;\n let colorFull = null;\n\n if (checkoutBooking && checkinBooking) {\n // Half-day: one booking ends, another begins\n status = 'half-day';\n halfDay = true;\n colorOut = getColorTokens(checkoutBooking.color || DEFAULT_COLOR);\n colorIn = getColorTokens(checkinBooking.color || DEFAULT_COLOR);\n } else if (spanningBooking) {\n status = 'booked';\n colorFull = getColorTokens(spanningBooking.color || DEFAULT_COLOR);\n } else if (checkinBooking && !checkoutBooking) {\n // First day of a booking — only the incoming triangle is filled\n status = 'checkin-only';\n colorIn = getColorTokens(checkinBooking.color || DEFAULT_COLOR);\n } else if (checkoutBooking && !checkinBooking) {\n // Last day of a booking (checkout day — could be selectable as checkout boundary)\n status = 'checkout-only';\n colorOut = getColorTokens(checkoutBooking.color || DEFAULT_COLOR);\n }\n\n // Override with dayData (static)\n const staticData = dayData[dateStr];\n if (staticData) {\n if (staticData.status) status = staticData.status;\n if (staticData.label !== undefined) label = staticData.label;\n }\n\n // Override with labelFormula (highest priority)\n if (labelFormula) {\n const formulaResult = labelFormula(dateStr);\n if (formulaResult) {\n if (formulaResult.status) status = formulaResult.status;\n if (formulaResult.label !== undefined) label = formulaResult.label;\n }\n }\n\n return { status, label, checkoutBooking, checkinBooking, halfDay, colorOut, colorIn, colorFull };\n}\n\n/**\n * Validate if a selection range overlaps any existing booking.\n * Same-day checkout/checkin overlap is allowed.\n *\n * @param {string} start - selection start date\n * @param {string} end - selection end date\n * @param {Array} bookings - existing bookings\n * @returns {boolean} true if selection is valid (no overlap)\n */\nexport function isSelectionValid(start, end, bookings = []) {\n if (!start || !end) return true;\n const selStart = start < end ? start : end;\n const selEnd = start < end ? end : start;\n\n for (const booking of bookings) {\n // Same-day boundary is allowed: selection ending on booking start, or starting on booking end\n if (selStart < booking.end && selEnd > booking.start) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Check if a hover preview range would be invalid.\n */\nexport function isHoverRangeInvalid(rangeStart, hoverDate, bookings = []) {\n if (!rangeStart || !hoverDate) return false;\n return !isSelectionValid(rangeStart, hoverDate, bookings);\n}\n","import { buildMonthGrid, getWeekdayLabels, isSameDay, isInRange } from '../../core/dates.js';\nimport { resolveCellData, isHoverRangeInvalid } from '../booking/booking-data.js';\n\n/**\n * Renders a 7×6 month grid.\n * Supports both datepicker mode (default) and booking mode (when bookings param is provided).\n *\n * @param {object} options\n * @param {number} options.year\n * @param {number} options.month\n * @param {number} options.firstDay - 0=Sun, 1=Mon\n * @param {string[]} options.selectedDates - ISO date strings\n * @param {string|null} options.rangeStart\n * @param {string|null} options.rangeEnd\n * @param {string|null} options.hoverDate - for range preview\n * @param {string|null} options.minDate\n * @param {string|null} options.maxDate\n * @param {string[]} options.disabledDates\n * @param {string} options.mode - single|range|multi\n * @param {string|null} options.focusedDate - date that should receive tabindex=0\n * @param {function} options.onSelect\n * @param {function} options.onHover\n * @param {Array|null} options.bookings - booking data (enables booking mode)\n * @param {Object|null} options.dayData - map of dateStr → { label, status }\n * @param {Function|null} options.labelFormula - (dateStr) => { label, status }\n * @param {boolean} options.showLabelsOnHover - show booking labels as tooltips\n * @returns {HTMLElement}\n */\nexport function renderCalendarGrid(options) {\n const {\n year, month, firstDay = 0,\n selectedDates = [], rangeStart, rangeEnd, hoverDate,\n minDate, maxDate, disabledDates = [],\n mode = 'single', focusedDate,\n onSelect, onHover,\n // Booking-specific params\n bookings = null, dayData = null, labelFormula = null,\n showLabelsOnHover = false,\n } = options;\n\n const isBookingMode = bookings !== null;\n\n const grid = document.createElement('div');\n grid.setAttribute('role', 'grid');\n grid.classList.add('cal-grid');\n\n // Weekday header row\n const headerRow = document.createElement('div');\n headerRow.setAttribute('role', 'row');\n headerRow.classList.add('cal-weekdays');\n for (const label of getWeekdayLabels(firstDay)) {\n const cell = document.createElement('div');\n cell.setAttribute('role', 'columnheader');\n cell.setAttribute('aria-label', label);\n cell.classList.add('cal-weekday');\n cell.textContent = label;\n headerRow.appendChild(cell);\n }\n grid.appendChild(headerRow);\n\n // Day cells\n const cells = buildMonthGrid(year, month, firstDay);\n const effectiveEnd = mode === 'range' && rangeStart && !rangeEnd && hoverDate\n ? hoverDate\n : (isBookingMode && rangeStart && !rangeEnd && hoverDate ? hoverDate : rangeEnd);\n\n // Booking: detect invalid hover range\n const hoverInvalid = isBookingMode\n ? isHoverRangeInvalid(rangeStart, hoverDate, bookings)\n : false;\n\n let row;\n cells.forEach((cell, i) => {\n if (i % 7 === 0) {\n row = document.createElement('div');\n row.setAttribute('role', 'row');\n row.classList.add('cal-row');\n grid.appendChild(row);\n }\n\n const btn = document.createElement('button');\n btn.setAttribute('role', 'gridcell');\n btn.setAttribute('part', 'day');\n btn.classList.add('cal-day');\n\n const dateStr = cell.dateString;\n btn.dataset.date = dateStr;\n\n // Accessibility label\n const dateObj = new Date(cell.year, cell.month, cell.day);\n btn.setAttribute('aria-label', dateObj.toLocaleDateString('en-US', {\n weekday: 'long', year: 'numeric', month: 'long', day: 'numeric',\n }));\n\n // Outside month\n if (!cell.isCurrentMonth) {\n btn.classList.add('cal-day--outside');\n }\n\n // Today\n if (cell.isToday) {\n btn.classList.add('cal-day--today');\n }\n\n // --- Booking mode: resolve cell data and apply booking classes ---\n let cellData = null;\n let bookingDisabled = false;\n\n if (isBookingMode) {\n cellData = resolveCellData(dateStr, bookings, dayData || {}, labelFormula);\n const { status, label, halfDay, colorOut, colorIn, colorFull } = cellData;\n\n if (status === 'booked') {\n btn.classList.add('cal-day--booked');\n if (colorFull) {\n btn.style.setProperty('--booking-bg', `hsl(${colorFull.bg})`);\n btn.style.setProperty('--booking-fg', `hsl(${colorFull.fg})`);\n btn.style.setProperty('--booking-hover', `hsl(${colorFull.hover})`);\n }\n bookingDisabled = true;\n }\n\n if (status === 'blocked') {\n btn.classList.add('cal-day--blocked');\n bookingDisabled = true;\n }\n\n if (halfDay) {\n btn.classList.add('cal-day--half-day');\n if (colorOut) btn.style.setProperty('--half-day-color-out', `hsl(${colorOut.bg})`);\n if (colorIn) btn.style.setProperty('--half-day-color-in', `hsl(${colorIn.bg})`);\n bookingDisabled = true;\n }\n\n if (status === 'checkout-only') {\n btn.classList.add('cal-day--checkout-only');\n if (colorOut) {\n btn.style.setProperty('--half-day-color-out', `hsl(${colorOut.bg})`);\n }\n }\n\n if (status === 'checkin-only') {\n btn.classList.add('cal-day--checkin-only');\n if (colorIn) {\n btn.style.setProperty('--half-day-color-in', `hsl(${colorIn.bg})`);\n }\n }\n\n // Tooltip: show booking label on hover\n if (showLabelsOnHover) {\n let tooltipLabel = null;\n if (halfDay && cellData.checkoutBooking && cellData.checkinBooking) {\n tooltipLabel = `${cellData.checkoutBooking.label || ''} / ${cellData.checkinBooking.label || ''}`;\n } else if (status === 'booked') {\n const spanning = bookings.find((b) => b.start <= dateStr && b.end > dateStr);\n if (spanning) tooltipLabel = spanning.label;\n } else if (status === 'checkout-only' && cellData.checkoutBooking) {\n tooltipLabel = cellData.checkoutBooking.label;\n } else if (status === 'checkin-only' && cellData.checkinBooking) {\n tooltipLabel = cellData.checkinBooking.label;\n }\n if (tooltipLabel) {\n btn.setAttribute('data-booking-label', tooltipLabel);\n }\n }\n\n // Invalid range preview\n if (hoverInvalid && rangeStart && !rangeEnd && hoverDate) {\n const lo = rangeStart < hoverDate ? rangeStart : hoverDate;\n const hi = rangeStart < hoverDate ? hoverDate : rangeStart;\n if (dateStr >= lo && dateStr <= hi) {\n btn.classList.add('cal-day--invalid-range');\n }\n }\n }\n\n // --- Selected ---\n if (isBookingMode) {\n // In booking mode, selected means rangeStart or rangeEnd\n const isSelected = rangeStart && rangeEnd\n && (isSameDay(dateStr, rangeStart) || isSameDay(dateStr, rangeEnd));\n if (isSelected) {\n btn.classList.add('cal-day--selected');\n btn.setAttribute('aria-selected', 'true');\n } else {\n btn.setAttribute('aria-selected', 'false');\n }\n } else {\n const isSelected = selectedDates.some((d) => isSameDay(d, dateStr));\n if (isSelected) {\n btn.classList.add('cal-day--selected');\n btn.setAttribute('aria-selected', 'true');\n } else {\n btn.setAttribute('aria-selected', 'false');\n }\n }\n\n // Range highlighting\n if ((mode === 'range' || isBookingMode) && rangeStart && effectiveEnd) {\n const isStart = isSameDay(dateStr, rangeStart);\n const isEnd = isSameDay(dateStr, effectiveEnd);\n const inRange = isInRange(dateStr, rangeStart, effectiveEnd);\n\n if (isStart) btn.classList.add('cal-day--range-start');\n if (isEnd) btn.classList.add('cal-day--range-end');\n if (inRange && !isStart && !isEnd) btn.classList.add('cal-day--in-range');\n }\n\n // Disabled\n const isDisabled = isDateDisabled(dateStr, minDate, maxDate, disabledDates);\n const effectiveDisabled = isDisabled || bookingDisabled;\n if (effectiveDisabled) {\n btn.classList.add('cal-day--disabled');\n btn.disabled = true;\n btn.setAttribute('aria-disabled', 'true');\n }\n\n // Focus management\n if (focusedDate && isSameDay(dateStr, focusedDate)) {\n btn.setAttribute('tabindex', '0');\n } else {\n btn.setAttribute('tabindex', '-1');\n }\n\n // --- Cell content ---\n if (isBookingMode && cellData && cellData.label != null) {\n // Sublabel layout: number + label\n btn.classList.add('cal-day--with-label');\n const numSpan = document.createElement('span');\n numSpan.classList.add('cal-day__number');\n numSpan.textContent = cell.day;\n btn.appendChild(numSpan);\n\n const labelSpan = document.createElement('span');\n labelSpan.classList.add('cal-day__label');\n labelSpan.textContent = cellData.label;\n btn.appendChild(labelSpan);\n } else {\n btn.textContent = cell.day;\n }\n\n // Events\n if (!effectiveDisabled) {\n btn.addEventListener('click', () => onSelect?.(dateStr));\n btn.addEventListener('mouseenter', () => onHover?.(dateStr));\n } else if (isBookingMode) {\n // Even disabled booking cells trigger hover for range preview\n btn.addEventListener('mouseenter', () => onHover?.(dateStr));\n }\n\n row.appendChild(btn);\n });\n\n grid.addEventListener('mouseleave', () => onHover?.(null));\n\n return grid;\n}\n\nfunction isDateDisabled(dateStr, minDate, maxDate, disabledDates) {\n if (disabledDates.includes(dateStr)) return true;\n if (minDate && dateStr < minDate) return true;\n if (maxDate && dateStr > maxDate) return true;\n return false;\n}\n\nexport const calendarGridStyles = `\n .cal-grid {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .cal-weekdays {\n display: grid;\n grid-template-columns: repeat(7, var(--cal-cell-size));\n gap: 0;\n margin-bottom: 4px;\n }\n\n .cal-weekday {\n display: flex;\n align-items: center;\n justify-content: center;\n height: var(--cal-cell-size);\n font-size: 12px;\n font-weight: 500;\n color: hsl(var(--cal-fg-muted));\n user-select: none;\n }\n\n .cal-row {\n display: grid;\n grid-template-columns: repeat(7, var(--cal-cell-size));\n gap: 0;\n }\n\n .cal-day {\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--cal-cell-size);\n height: var(--cal-cell-size);\n font-size: 14px;\n border-radius: var(--cal-radius-sm);\n transition: background var(--cal-transition), color var(--cal-transition);\n position: relative;\n user-select: none;\n }\n\n .cal-day:not(.cal-day--disabled):not(.cal-day--selected):not(.cal-day--booked):not(.cal-day--half-day):not(.cal-day--blocked):not(.cal-day--checkout-only):not(.cal-day--checkin-only):hover {\n background: hsl(var(--cal-hover));\n }\n\n .cal-day--outside {\n color: hsl(var(--cal-fg-muted));\n opacity: 0.4;\n }\n\n .cal-day--today:not(.cal-day--selected):not(.cal-day--booked):not(.cal-day--half-day):not(.cal-day--checkout-only):not(.cal-day--checkin-only) {\n border: 1px solid hsl(var(--cal-border));\n font-weight: 600;\n }\n\n .cal-day--selected {\n background: hsl(var(--cal-accent));\n color: hsl(var(--cal-accent-fg));\n font-weight: 600;\n }\n\n .cal-day--range-start {\n background: hsl(var(--cal-accent));\n color: hsl(var(--cal-accent-fg));\n font-weight: 600;\n border-radius: var(--cal-radius-sm) 0 0 var(--cal-radius-sm);\n }\n\n .cal-day--range-end {\n background: hsl(var(--cal-accent));\n color: hsl(var(--cal-accent-fg));\n font-weight: 600;\n border-radius: 0 var(--cal-radius-sm) var(--cal-radius-sm) 0;\n }\n\n .cal-day--range-start.cal-day--range-end {\n border-radius: var(--cal-radius-sm);\n }\n\n .cal-day--in-range {\n background: hsl(var(--cal-accent-subtle));\n border-radius: 0;\n }\n\n .cal-day--in-range:hover {\n background: hsl(var(--cal-accent-subtle)) !important;\n }\n\n .cal-day--disabled {\n opacity: 0.3;\n cursor: not-allowed;\n }\n\n /* ── Booking-specific styles ── */\n\n /* Booked (fully occupied) */\n .cal-day--booked {\n background: var(--booking-bg, hsl(var(--cal-booking-blue-bg)));\n color: var(--booking-fg, hsl(var(--cal-booking-blue-fg)));\n cursor: not-allowed;\n }\n\n .cal-day--booked:hover {\n background: var(--booking-hover, hsl(var(--cal-booking-blue-hover)));\n }\n\n /* Blocked */\n .cal-day--blocked {\n background: hsl(var(--cal-bg-muted));\n opacity: 0.4;\n cursor: not-allowed;\n }\n\n /* Half-day diagonal (checkout + checkin on same day) */\n .cal-day--half-day {\n background: linear-gradient(135deg,\n var(--half-day-color-out, hsl(var(--cal-booking-blue-bg))) 49.5%,\n hsl(var(--cal-bg)) 49.5%, hsl(var(--cal-bg)) 50.5%,\n var(--half-day-color-in, hsl(var(--cal-booking-green-bg))) 50.5%);\n cursor: not-allowed;\n }\n\n /* Checkout-only (last day of a booking — outgoing triangle) */\n .cal-day--checkout-only {\n background: linear-gradient(135deg,\n var(--half-day-color-out, hsl(var(--cal-booking-blue-bg))) 49.5%,\n hsl(var(--cal-bg)) 49.5%);\n }\n\n /* Checkin-only (first day of a booking — incoming triangle) */\n .cal-day--checkin-only {\n background: linear-gradient(135deg,\n hsl(var(--cal-bg)) 50.5%,\n var(--half-day-color-in, hsl(var(--cal-booking-blue-bg))) 50.5%);\n }\n\n /* Diagonal cells: standard text color for clean contrast */\n .cal-day--half-day,\n .cal-day--checkout-only,\n .cal-day--checkin-only {\n color: hsl(var(--cal-fg));\n }\n\n /* ── Diagonal + selection compounds ── */\n\n /* Checkout-only — range boundary: accent-subtle fill + refined ring */\n .cal-day--checkout-only.cal-day--range-start,\n .cal-day--checkout-only.cal-day--range-end,\n .cal-day--checkout-only.cal-day--selected {\n background: linear-gradient(135deg,\n var(--half-day-color-out, hsl(var(--cal-booking-blue-bg))) 49.5%,\n hsl(var(--cal-accent-subtle)) 50.5%);\n color: hsl(var(--cal-fg));\n box-shadow: inset 0 0 0 1.5px hsl(var(--cal-accent) / 0.3);\n }\n\n /* Checkout-only — in range: accent-subtle fill */\n .cal-day--checkout-only.cal-day--in-range {\n background: linear-gradient(135deg,\n var(--half-day-color-out, hsl(var(--cal-booking-blue-bg))) 49.5%,\n hsl(var(--cal-accent-subtle)) 50.5%);\n }\n\n /* Checkin-only — range boundary: accent-subtle fill + refined ring */\n .cal-day--checkin-only.cal-day--range-start,\n .cal-day--checkin-only.cal-day--range-end,\n .cal-day--checkin-only.cal-day--selected {\n background: linear-gradient(135deg,\n hsl(var(--cal-accent-subtle)) 49.5%,\n var(--half-day-color-in, hsl(var(--cal-booking-blue-bg))) 50.5%);\n color: hsl(var(--cal-fg));\n box-shadow: inset 0 0 0 1.5px hsl(var(--cal-accent) / 0.3);\n }\n\n /* Checkin-only — in range: accent-subtle fill */\n .cal-day--checkin-only.cal-day--in-range {\n background: linear-gradient(135deg,\n hsl(var(--cal-accent-subtle)) 49.5%,\n var(--half-day-color-in, hsl(var(--cal-booking-blue-bg))) 50.5%);\n }\n\n /* Half-day in range — accent-subtle stripe between booking triangles */\n .cal-day--half-day.cal-day--in-range {\n background: linear-gradient(135deg,\n var(--half-day-color-out, hsl(var(--cal-booking-blue-bg))) 49.5%,\n hsl(var(--cal-accent-subtle)) 49.5%, hsl(var(--cal-accent-subtle)) 50.5%,\n var(--half-day-color-in, hsl(var(--cal-booking-green-bg))) 50.5%);\n }\n\n /* Invalid range preview (crosses a booking) */\n .cal-day--invalid-range {\n background: hsl(var(--cal-booking-red-bg));\n border-radius: 0;\n }\n\n /* Booked/half-day/diagonal cells stay opaque even when disabled */\n .cal-day--disabled.cal-day--booked,\n .cal-day--disabled.cal-day--half-day,\n .cal-day--disabled.cal-day--checkout-only,\n .cal-day--disabled.cal-day--checkin-only {\n opacity: 1;\n }\n\n /* Sublabel spans */\n .cal-day__number {\n font-size: 13px;\n font-weight: 500;\n line-height: 1;\n }\n\n .cal-day__label {\n font-size: 9px;\n font-weight: 500;\n line-height: 1;\n opacity: 0.8;\n }\n\n .cal-day--with-label {\n flex-direction: column;\n gap: 1px;\n }\n\n /* CSS Tooltip */\n .cal-day[data-booking-label] {\n overflow: visible;\n }\n\n .cal-day[data-booking-label]:hover::after {\n content: attr(data-booking-label);\n position: absolute;\n bottom: calc(100% + 6px);\n left: 50%;\n transform: translateX(-50%);\n padding: 4px 8px;\n font-size: 11px;\n font-weight: 500;\n white-space: nowrap;\n color: hsl(var(--cal-accent-fg));\n background: hsl(var(--cal-accent));\n border-radius: 4px;\n pointer-events: none;\n z-index: 10;\n }\n\n .cal-day[data-booking-label]:hover::before {\n content: '';\n position: absolute;\n bottom: calc(100% + 2px);\n left: 50%;\n transform: translateX(-50%);\n border: 4px solid transparent;\n border-top-color: hsl(var(--cal-accent));\n pointer-events: none;\n z-index: 10;\n }\n`;\n","import { MONTH_NAMES } from '../../core/dates.js';\n\nexport const chevronLeft = `<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M10 12L6 8l4-4\"/></svg>`;\nexport const chevronRight = `<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M6 4l4 4-4 4\"/></svg>`;\n\n/**\n * Renders month/year navigation header.\n * @param {object} options\n * @param {number} options.year\n * @param {number} options.month\n * @param {function} options.onPrev\n * @param {function} options.onNext\n * @param {function} [options.onTitleClick] - If provided, title becomes a clickable button\n * @returns {HTMLElement}\n */\nexport function renderNavigation({ year, month, onPrev, onNext, onTitleClick }) {\n const nav = document.createElement('div');\n nav.classList.add('cal-nav');\n\n const prevBtn = document.createElement('button');\n prevBtn.classList.add('cal-nav__btn', 'cal-nav__btn--prev');\n prevBtn.innerHTML = chevronLeft;\n prevBtn.setAttribute('aria-label', 'Previous month');\n prevBtn.addEventListener('click', onPrev);\n\n const titleTag = onTitleClick ? 'button' : 'div';\n const title = document.createElement(titleTag);\n title.classList.add('cal-nav__title');\n if (onTitleClick) {\n title.classList.add('cal-nav__title--interactive');\n title.setAttribute('aria-label', `Select month and year, currently ${MONTH_NAMES[month]} ${year}`);\n title.addEventListener('click', onTitleClick);\n }\n title.setAttribute('aria-live', 'polite');\n title.textContent = `${MONTH_NAMES[month]} ${year}`;\n\n const nextBtn = document.createElement('button');\n nextBtn.classList.add('cal-nav__btn', 'cal-nav__btn--next');\n nextBtn.innerHTML = chevronRight;\n nextBtn.setAttribute('aria-label', 'Next month');\n nextBtn.addEventListener('click', onNext);\n\n nav.appendChild(prevBtn);\n nav.appendChild(title);\n nav.appendChild(nextBtn);\n\n return nav;\n}\n\nexport const navigationStyles = `\n .cal-nav {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 4px;\n margin-bottom: 8px;\n }\n\n .cal-nav__btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border-radius: var(--cal-radius-sm);\n color: hsl(var(--cal-fg));\n transition: background var(--cal-transition);\n }\n\n .cal-nav__btn:hover {\n background: hsl(var(--cal-hover));\n }\n\n .cal-nav__title {\n font-size: 14px;\n font-weight: 600;\n color: hsl(var(--cal-fg));\n user-select: none;\n }\n\n .cal-nav__title--interactive {\n cursor: pointer;\n padding: 2px 8px;\n border-radius: var(--cal-radius-sm);\n transition: background var(--cal-transition);\n }\n\n .cal-nav__title--interactive:hover {\n background: hsl(var(--cal-hover));\n }\n`;\n","import { chevronLeft, chevronRight } from './navigation.js';\n\nconst SHORT_MONTHS = [\n 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\n 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec',\n];\n\n/**\n * Renders a month/year quick-select picker (3×4 month grid with year arrows).\n * @param {object} options\n * @param {number} options.pickerYear - Year displayed in the picker\n * @param {number} options.viewMonth - Currently viewed month (0-11)\n * @param {number} options.viewYear - Currently viewed year\n * @param {function} options.onMonthSelect - (month, year) => void\n * @param {function} options.onYearPrev - Go to previous year\n * @param {function} options.onYearNext - Go to next year\n * @param {function} options.onClose - Close the picker\n * @returns {HTMLElement}\n */\nexport function renderMonthYearPicker({\n pickerYear, viewMonth, viewYear,\n onMonthSelect, onYearPrev, onYearNext, onClose,\n}) {\n const wrapper = document.createElement('div');\n wrapper.classList.add('cal-myp', 'cal-animate-fade');\n\n // Year navigation row\n const yearNav = document.createElement('div');\n yearNav.classList.add('cal-myp__year-nav');\n\n const prevBtn = document.createElement('button');\n prevBtn.classList.add('cal-nav__btn');\n prevBtn.innerHTML = chevronLeft;\n prevBtn.setAttribute('aria-label', 'Previous year');\n prevBtn.addEventListener('click', onYearPrev);\n\n const yearLabel = document.createElement('div');\n yearLabel.classList.add('cal-myp__year-label');\n yearLabel.textContent = pickerYear;\n\n const nextBtn = document.createElement('button');\n nextBtn.classList.add('cal-nav__btn');\n nextBtn.innerHTML = chevronRight;\n nextBtn.setAttribute('aria-label', 'Next year');\n nextBtn.addEventListener('click', onYearNext);\n\n yearNav.appendChild(prevBtn);\n yearNav.appendChild(yearLabel);\n yearNav.appendChild(nextBtn);\n wrapper.appendChild(yearNav);\n\n // 3×4 month grid\n const grid = document.createElement('div');\n grid.classList.add('cal-myp__grid');\n\n const now = new Date();\n const todayMonth = now.getMonth();\n const todayYear = now.getFullYear();\n\n for (let m = 0; m < 12; m++) {\n const cell = document.createElement('button');\n cell.classList.add('cal-myp__cell');\n cell.textContent = SHORT_MONTHS[m];\n\n // Currently viewed month\n if (m === viewMonth && pickerYear === viewYear) {\n cell.classList.add('cal-myp__cell--active');\n }\n\n // Real current month (today)\n if (m === todayMonth && pickerYear === todayYear) {\n cell.classList.add('cal-myp__cell--today');\n }\n\n cell.addEventListener('click', () => onMonthSelect(m, pickerYear));\n grid.appendChild(cell);\n }\n\n wrapper.appendChild(grid);\n\n // Escape key\n wrapper.addEventListener('keydown', (e) => {\n if (e.key === 'Escape') {\n e.stopPropagation();\n onClose();\n }\n });\n\n return wrapper;\n}\n\nexport const monthYearPickerStyles = `\n .cal-myp {\n width: calc(7 * var(--cal-cell-size));\n }\n\n .cal-myp__year-nav {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 4px;\n margin-bottom: 8px;\n }\n\n .cal-myp__year-label {\n font-size: 14px;\n font-weight: 600;\n color: hsl(var(--cal-fg));\n user-select: none;\n }\n\n .cal-myp__grid {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 4px;\n }\n\n .cal-myp__cell {\n display: flex;\n align-items: center;\n justify-content: center;\n height: calc(var(--cal-cell-size) * 1.5);\n font-size: 13px;\n font-weight: 500;\n color: hsl(var(--cal-fg));\n border-radius: var(--cal-radius-sm);\n cursor: pointer;\n transition: background var(--cal-transition);\n user-select: none;\n }\n\n .cal-myp__cell:hover {\n background: hsl(var(--cal-hover));\n }\n\n .cal-myp__cell--active {\n background: hsl(var(--cal-accent));\n color: hsl(var(--cal-accent-fg));\n font-weight: 600;\n }\n\n .cal-myp__cell--active:hover {\n background: hsl(var(--cal-accent));\n }\n\n .cal-myp__cell--today:not(.cal-myp__cell--active) {\n border: 1px solid hsl(var(--cal-border));\n font-weight: 600;\n }\n`;\n","import { today, toDateString } from '../../core/dates.js';\n\n/**\n * Returns an array of built-in preset definitions.\n */\nexport function getBuiltinPresets() {\n return [\n {\n key: 'today',\n label: 'Today',\n resolve() {\n const t = today();\n return { start: t, end: t };\n },\n },\n {\n key: 'this-week',\n label: 'This Week',\n resolve() {\n const now = new Date();\n const day = now.getDay();\n const start = new Date(now);\n start.setDate(now.getDate() - day);\n const end = new Date(start);\n end.setDate(start.getDate() + 6);\n return { start: toDateString(start), end: toDateString(end) };\n },\n },\n {\n key: 'next-7',\n label: 'Next 7 Days',\n resolve() {\n const start = new Date();\n const end = new Date();\n end.setDate(start.getDate() + 6);\n return { start: toDateString(start), end: toDateString(end) };\n },\n },\n {\n key: 'next-30',\n label: 'Next 30 Days',\n resolve() {\n const start = new Date();\n const end = new Date();\n end.setDate(start.getDate() + 29);\n return { start: toDateString(start), end: toDateString(end) };\n },\n },\n ];\n}\n\n/**\n * Renders preset pill chips.\n * @param {object} options\n * @param {string[]} options.presetKeys - which presets to show (e.g. ['today', 'next-7'])\n * @param {function} options.onSelect - called with { start, end }\n * @returns {HTMLElement}\n */\nexport function renderPresets({ presetKeys, onSelect }) {\n const container = document.createElement('div');\n container.classList.add('cal-presets');\n\n const builtins = getBuiltinPresets();\n const presets = presetKeys\n .map((key) => builtins.find((p) => p.key === key))\n .filter(Boolean);\n\n for (const preset of presets) {\n const chip = document.createElement('button');\n chip.classList.add('cal-preset');\n chip.textContent = preset.label;\n chip.addEventListener('click', () => {\n onSelect?.(preset.resolve());\n });\n container.appendChild(chip);\n }\n\n return container;\n}\n\nexport const presetsStyles = `\n .cal-presets {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n padding: 8px 4px;\n border-top: 1px solid hsl(var(--cal-border));\n margin-top: 8px;\n }\n\n .cal-preset {\n display: inline-flex;\n align-items: center;\n height: 28px;\n padding: 0 10px;\n font-size: 12px;\n font-weight: 500;\n border-radius: 999px;\n background: hsl(var(--cal-bg-muted));\n color: hsl(var(--cal-fg));\n transition: background var(--cal-transition);\n }\n\n .cal-preset:hover {\n background: hsl(var(--cal-hover));\n }\n`;\n","/**\n * Creates a popover panel anchored to a trigger element.\n * @param {object} options\n * @param {HTMLElement} options.trigger - the element that opens the popover\n * @param {HTMLElement} options.content - the popover body\n * @param {function} options.onClose\n * @returns {{ panel: HTMLElement, open: function, close: function, destroy: function }}\n */\nexport function createPopover({ trigger, content, onClose }) {\n const panel = document.createElement('div');\n panel.classList.add('cal-popover');\n panel.setAttribute('role', 'dialog');\n panel.setAttribute('aria-modal', 'false');\n panel.style.display = 'none';\n panel.appendChild(content);\n\n let isOpen = false;\n\n function position() {\n // Reset position classes\n panel.classList.remove('cal-popover--above');\n\n const triggerRect = trigger.getBoundingClientRect();\n const panelHeight = panel.offsetHeight;\n const spaceBelow = window.innerHeight - triggerRect.bottom;\n const spaceAbove = triggerRect.top;\n\n // Prefer below, flip above if not enough space\n if (spaceBelow < panelHeight + 8 && spaceAbove > spaceBelow) {\n panel.classList.add('cal-popover--above');\n panel.style.top = 'auto';\n panel.style.bottom = '100%';\n panel.style.marginBottom = '4px';\n panel.style.marginTop = '0';\n } else {\n panel.style.top = '100%';\n panel.style.bottom = 'auto';\n panel.style.marginTop = '4px';\n panel.style.marginBottom = '0';\n }\n }\n\n function open() {\n if (isOpen) return;\n isOpen = true;\n panel.style.display = '';\n panel.classList.add('cal-animate-slide-up');\n // Measure after display\n requestAnimationFrame(() => position());\n document.addEventListener('click', outsideClick, true);\n document.addEventListener('keydown', escapeKey, true);\n }\n\n function close() {\n if (!isOpen) return;\n isOpen = false;\n panel.style.display = 'none';\n panel.classList.remove('cal-animate-slide-up');\n document.removeEventListener('click', outsideClick, true);\n document.removeEventListener('keydown', escapeKey, true);\n onClose?.();\n }\n\n function outsideClick(e) {\n // Check if click is inside the shadow host that contains our trigger/panel\n const host = trigger.getRootNode()?.host;\n if (host && !host.contains(e.target) && e.target !== host) {\n close();\n }\n }\n\n function escapeKey(e) {\n if (e.key === 'Escape') {\n e.stopPropagation();\n close();\n }\n }\n\n function destroy() {\n // Teardown without firing onClose (which would mutate store during render)\n if (isOpen) {\n isOpen = false;\n panel.style.display = 'none';\n panel.classList.remove('cal-animate-slide-up');\n }\n document.removeEventListener('click', outsideClick, true);\n document.removeEventListener('keydown', escapeKey, true);\n }\n\n return { panel, open, close, destroy, get isOpen() { return isOpen; } };\n}\n\nexport const popoverStyles = `\n .cal-popover-wrapper {\n position: relative;\n display: inline-block;\n }\n\n .cal-popover {\n position: absolute;\n left: 0;\n z-index: 50;\n background: hsl(var(--cal-bg));\n border: 1px solid hsl(var(--cal-border));\n border-radius: var(--cal-radius);\n box-shadow: 0 4px 16px -2px rgba(0, 0, 0, 0.08), 0 2px 6px -2px rgba(0, 0, 0, 0.04);\n padding: 12px;\n }\n\n .cal-trigger {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n height: 36px;\n padding: 0 12px;\n font-size: 14px;\n border: 1px solid hsl(var(--cal-border));\n border-radius: var(--cal-radius-sm);\n background: hsl(var(--cal-bg));\n color: hsl(var(--cal-fg));\n cursor: pointer;\n transition: border-color var(--cal-transition);\n white-space: nowrap;\n }\n\n .cal-trigger:hover {\n border-color: hsl(var(--cal-fg-muted));\n }\n\n .cal-trigger--placeholder {\n color: hsl(var(--cal-fg-muted));\n }\n\n .cal-trigger__icon {\n display: flex;\n color: hsl(var(--cal-fg-muted));\n }\n`;\n","/**\n * Loading skeleton renderers for shimmer placeholders.\n */\n\n/**\n * Render a skeleton matching the time grid layout.\n * @param {object} options\n * @param {number} options.columns - grid columns (default 3)\n * @param {number} options.rows - number of rows (default 4)\n * @param {boolean} options.durationLabels - wider pills for duration labels\n * @returns {HTMLElement}\n */\nexport function renderTimeGridSkeleton({ columns = 3, rows = 4, durationLabels = false } = {}) {\n const wrapper = document.createElement('div');\n wrapper.setAttribute('role', 'status');\n wrapper.setAttribute('aria-label', 'Loading...');\n wrapper.classList.add('cal-skeleton-time-grid');\n if (durationLabels) wrapper.classList.add('cal-skeleton-time-grid--duration');\n\n const count = columns * rows;\n for (let i = 0; i < count; i++) {\n const pill = document.createElement('div');\n pill.classList.add('cal-skeleton');\n wrapper.appendChild(pill);\n }\n return wrapper;\n}\n\n/**\n * Render a skeleton matching the calendar day grid layout.\n * @param {object} options\n * @param {number} options.rows - number of week rows (default 5)\n * @returns {HTMLElement}\n */\nexport function renderCalendarGridSkeleton({ rows = 5 } = {}) {\n const wrapper = document.createElement('div');\n wrapper.setAttribute('role', 'status');\n wrapper.setAttribute('aria-label', 'Loading...');\n wrapper.classList.add('cal-skeleton-calendar-grid');\n\n // Header row (7 day labels)\n for (let i = 0; i < 7; i++) {\n const label = document.createElement('div');\n label.classList.add('cal-skeleton', 'cal-skeleton-calendar-grid__header');\n wrapper.appendChild(label);\n }\n\n // Day cells\n const count = 7 * rows;\n for (let i = 0; i < count; i++) {\n const cell = document.createElement('div');\n cell.classList.add('cal-skeleton', 'cal-skeleton-calendar-grid__day');\n wrapper.appendChild(cell);\n }\n return wrapper;\n}\n\nexport const loadingSkeletonStyles = `\n .cal-skeleton-time-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(80px, 1fr));\n gap: 6px;\n padding: 4px;\n }\n\n .cal-skeleton-time-grid--duration {\n grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));\n }\n\n .cal-skeleton-time-grid .cal-skeleton {\n height: 40px;\n }\n\n .cal-skeleton-calendar-grid {\n display: grid;\n grid-template-columns: repeat(7, 1fr);\n gap: 2px;\n padding: 4px;\n }\n\n .cal-skeleton-calendar-grid__header {\n height: 20px;\n margin-bottom: 4px;\n }\n\n .cal-skeleton-calendar-grid__day {\n height: var(--cal-cell-size, 36px);\n aspect-ratio: 1;\n border-radius: var(--cal-radius-sm) !important;\n }\n`;\n","/**\n * Status message renderer — inline banners with type-specific icons and colors.\n */\n\nconst icons = {\n error: `<svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"><circle cx=\"7\" cy=\"7\" r=\"6\"/><path d=\"M7 4v3M7 9.5v.01\"/></svg>`,\n warning: `<svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"><path d=\"M7 1.5L1 12.5h12L7 1.5zM7 6v2.5M7 10.5v.01\"/></svg>`,\n info: `<svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"><circle cx=\"7\" cy=\"7\" r=\"6\"/><path d=\"M7 6.5V10M7 4.5v.01\"/></svg>`,\n success: `<svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"><circle cx=\"7\" cy=\"7\" r=\"6\"/><path d=\"M4.5 7l2 2L9.5 5\"/></svg>`,\n};\n\n/**\n * Render a status message banner.\n * @param {object} options\n * @param {'error'|'warning'|'info'|'success'} options.type\n * @param {string} options.message\n * @param {boolean} options.dismissible\n * @param {function} options.onDismiss\n * @returns {HTMLElement}\n */\nexport function renderStatusMessage({ type = 'info', message, dismissible = true, onDismiss }) {\n const banner = document.createElement('div');\n banner.classList.add('cal-status', `cal-status--${type}`, 'cal-animate-slide-up');\n banner.setAttribute('role', type === 'error' ? 'alert' : 'status');\n banner.setAttribute('aria-live', type === 'error' ? 'assertive' : 'polite');\n\n const icon = document.createElement('span');\n icon.classList.add('cal-status__icon');\n icon.innerHTML = icons[type] || icons.info;\n banner.appendChild(icon);\n\n const text = document.createElement('span');\n text.classList.add('cal-status__text');\n text.textContent = message;\n banner.appendChild(text);\n\n if (dismissible) {\n const closeBtn = document.createElement('button');\n closeBtn.classList.add('cal-status__close');\n closeBtn.setAttribute('aria-label', 'Dismiss');\n closeBtn.innerHTML = `<svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"><path d=\"M3 3l6 6M9 3l-6 6\"/></svg>`;\n closeBtn.addEventListener('click', () => onDismiss?.());\n banner.appendChild(closeBtn);\n }\n\n return banner;\n}\n\nexport const statusMessageStyles = `\n .cal-status {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border-radius: var(--cal-radius-sm);\n font-size: 12px;\n line-height: 1.4;\n margin-bottom: 8px;\n }\n\n .cal-status__icon {\n flex-shrink: 0;\n display: flex;\n }\n\n .cal-status__text {\n flex: 1;\n min-width: 0;\n }\n\n .cal-status__close {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n border-radius: 4px;\n cursor: pointer;\n opacity: 0.7;\n transition: opacity var(--cal-transition);\n }\n\n .cal-status__close:hover {\n opacity: 1;\n }\n\n .cal-status--error {\n background: hsl(var(--cal-status-error-bg));\n color: hsl(var(--cal-status-error-fg));\n border: 1px solid hsl(var(--cal-status-error-border));\n }\n\n .cal-status--warning {\n background: hsl(var(--cal-status-warning-bg));\n color: hsl(var(--cal-status-warning-fg));\n border: 1px solid hsl(var(--cal-status-warning-border));\n }\n\n .cal-status--info {\n background: hsl(var(--cal-status-info-bg));\n color: hsl(var(--cal-status-info-fg));\n border: 1px solid hsl(var(--cal-status-info-border));\n }\n\n .cal-status--success {\n background: hsl(var(--cal-status-success-bg));\n color: hsl(var(--cal-status-success-fg));\n border: 1px solid hsl(var(--cal-status-success-border));\n }\n`;\n","import { CalendarBase } from '../../core/base-component.js';\nimport { createStore } from '../../core/state.js';\nimport {\n today, parseDate, toDateString, isSameDay, addMonths, MONTH_NAMES,\n} from '../../core/dates.js';\nimport { tokens } from '../../styles/tokens.js';\nimport { reset } from '../../styles/reset.js';\nimport { animations } from '../../styles/animations.js';\nimport { renderCalendarGrid, calendarGridStyles } from './calendar-grid.js';\nimport { renderNavigation, navigationStyles } from './navigation.js';\nimport { renderMonthYearPicker, monthYearPickerStyles } from './month-year-picker.js';\nimport { renderPresets, presetsStyles } from './presets.js';\nimport { createPopover, popoverStyles } from './popover.js';\nimport { renderCalendarGridSkeleton, loadingSkeletonStyles } from '../shared/loading-skeleton.js';\nimport { renderStatusMessage, statusMessageStyles } from '../shared/status-message.js';\n\nconst calendarIcon = `<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"2\" y=\"3\" width=\"12\" height=\"11\" rx=\"2\"/><path d=\"M5 1v3M11 1v3M2 7h12\"/></svg>`;\n\nconst componentStyles = `\n .cal-picker {\n background: hsl(var(--cal-bg));\n border-radius: var(--cal-radius);\n user-select: none;\n }\n\n :host([display=\"inline\"]) .cal-picker {\n border: 1px solid hsl(var(--cal-border));\n padding: 12px;\n }\n\n .cal-months {\n display: flex;\n gap: 16px;\n }\n\n .cal-month {\n flex: 0 0 auto;\n }\n`;\n\nexport class CalDatepicker extends CalendarBase {\n static get styles() {\n return [tokens, reset, animations, calendarGridStyles, navigationStyles, monthYearPickerStyles, presetsStyles, popoverStyles, loadingSkeletonStyles, statusMessageStyles, componentStyles];\n }\n\n static get observedAttributes() {\n return ['mode', 'display', 'theme', 'value', 'min-date', 'max-date', 'disabled-dates', 'first-day', 'locale', 'presets', 'placeholder', 'loading'];\n }\n\n constructor() {\n super();\n\n const now = new Date();\n this._store = createStore({\n viewYear: now.getFullYear(),\n viewMonth: now.getMonth(),\n selectedDates: [],\n rangeStart: null,\n rangeEnd: null,\n hoverDate: null,\n isOpen: false,\n focusedDate: today(),\n navDirection: null,\n pickingMonth: false,\n pickerYear: now.getFullYear(),\n statusType: null,\n statusMessage: null,\n statusDismissible: true,\n });\n\n this._popover = null;\n this._unsubscribe = null;\n this._rendering = false;\n }\n\n // -- Attribute getters --\n get mode() { return this.getAttribute('mode') || 'single'; }\n get display() { return this.getAttribute('display') || 'inline'; }\n get placeholder() { return this.getAttribute('placeholder') || 'Select date'; }\n get firstDay() { return parseInt(this.getAttribute('first-day') || '0', 10); }\n get minDate() { return this.getAttribute('min-date') || null; }\n get maxDate() { return this.getAttribute('max-date') || null; }\n\n get loading() { return this.hasAttribute('loading'); }\n set loading(val) { val ? this.setAttribute('loading', '') : this.removeAttribute('loading'); }\n\n get disabledDates() {\n const attr = this.getAttribute('disabled-dates');\n return attr ? attr.split(',').map((d) => d.trim()) : [];\n }\n\n get presetKeys() {\n const attr = this.getAttribute('presets');\n return attr ? attr.split(',').map((k) => k.trim()) : [];\n }\n\n // -- Value property --\n get value() {\n const state = this._store.getState();\n if (this.mode === 'range') {\n return state.rangeStart && state.rangeEnd\n ? { start: state.rangeStart, end: state.rangeEnd }\n : null;\n }\n if (this.mode === 'multi') {\n return [...state.selectedDates];\n }\n return state.selectedDates[0] || null;\n }\n\n set value(val) {\n if (this.mode === 'range' && val && typeof val === 'object') {\n const start = typeof val.start === 'string' ? val.start : toDateString(val.start);\n const end = typeof val.end === 'string' ? val.end : toDateString(val.end);\n this._store.set({\n rangeStart: start,\n rangeEnd: end,\n selectedDates: [start, end],\n });\n this._navigateToDate(start);\n } else if (this.mode === 'multi' && Array.isArray(val)) {\n this._store.set({ selectedDates: val });\n if (val.length) this._navigateToDate(val[0]);\n } else if (typeof val === 'string') {\n this._store.set({ selectedDates: [val], rangeStart: null, rangeEnd: null });\n this._navigateToDate(val);\n } else {\n this._store.set({ selectedDates: [], rangeStart: null, rangeEnd: null });\n }\n }\n\n _navigateToDate(dateStr) {\n const d = parseDate(dateStr);\n if (d) {\n this._store.set({ viewYear: d.getFullYear(), viewMonth: d.getMonth() });\n }\n }\n\n connectedCallback() {\n super.connectedCallback();\n this._unsubscribe = this._store.subscribe((state, prev) => {\n if (this._rendering) return;\n // Hover-only change → toggle range classes without DOM rebuild\n const hoverOnly = state.hoverDate !== prev.hoverDate\n && state.viewYear === prev.viewYear && state.viewMonth === prev.viewMonth\n && state.selectedDates === prev.selectedDates\n && state.rangeStart === prev.rangeStart && state.rangeEnd === prev.rangeEnd\n && state.isOpen === prev.isOpen && state.navDirection === prev.navDirection\n && state.pickingMonth === prev.pickingMonth && state.pickerYear === prev.pickerYear;\n hoverOnly ? this._updateGridHighlight(state) : this.render();\n });\n\n // Parse initial value attribute\n const valueAttr = this.getAttribute('value');\n if (valueAttr) {\n if (this.mode === 'range' && valueAttr.includes('/')) {\n const [start, end] = valueAttr.split('/');\n this.value = { start, end };\n } else if (this.mode === 'multi' && valueAttr.includes(',')) {\n this.value = valueAttr.split(',').map((d) => d.trim());\n } else {\n this.value = valueAttr;\n }\n }\n }\n\n disconnectedCallback() {\n this._unsubscribe?.();\n this._popover?.destroy();\n clearTimeout(this._statusTimer);\n }\n\n attributeChangedCallback(name, oldVal, newVal) {\n if (oldVal === newVal) return;\n if (name === 'value' && this._initialized) {\n // Re-parse value\n if (this.mode === 'range' && newVal && newVal.includes('/')) {\n const [start, end] = newVal.split('/');\n this.value = { start, end };\n } else if (this.mode === 'multi' && newVal && newVal.includes(',')) {\n this.value = newVal.split(',').map((d) => d.trim());\n } else {\n this.value = newVal;\n }\n }\n if (this._initialized) this.render();\n }\n\n // -- Selection logic --\n _handleSelect(dateStr) {\n const state = this._store.getState();\n\n if (this.mode === 'single') {\n this._store.set({\n selectedDates: [dateStr],\n focusedDate: dateStr,\n });\n this.emit('cal:change', { value: dateStr });\n if (this.display === 'popover') this.close();\n } else if (this.mode === 'range') {\n if (!state.rangeStart || state.rangeEnd) {\n // Start new range\n this._store.set({\n rangeStart: dateStr,\n rangeEnd: null,\n selectedDates: [dateStr],\n focusedDate: dateStr,\n });\n } else {\n // Complete range — ensure start <= end\n let start = state.rangeStart;\n let end = dateStr;\n if (start > end) [start, end] = [end, start];\n this._store.set({\n rangeStart: start,\n rangeEnd: end,\n selectedDates: [start, end],\n hoverDate: null,\n focusedDate: end,\n });\n this.emit('cal:change', { value: { start, end } });\n if (this.display === 'popover') this.close();\n }\n } else if (this.mode === 'multi') {\n const dates = [...state.selectedDates];\n const idx = dates.findIndex((d) => isSameDay(d, dateStr));\n if (idx >= 0) {\n dates.splice(idx, 1);\n } else {\n dates.push(dateStr);\n }\n dates.sort();\n this._store.set({ selectedDates: dates, focusedDate: dateStr });\n this.emit('cal:change', { value: dates });\n }\n }\n\n _handleHover(dateStr) {\n if (this.mode === 'range') {\n this._store.set({ hoverDate: dateStr });\n }\n }\n\n _handlePresetSelect({ start, end }) {\n this._store.set({\n rangeStart: start,\n rangeEnd: end,\n selectedDates: [start, end],\n hoverDate: null,\n });\n this._navigateToDate(start);\n this.emit('cal:change', { value: { start, end } });\n if (this.display === 'popover') this.close();\n }\n\n // -- Navigation --\n _prevMonth() {\n const { viewYear, viewMonth } = this._store.getState();\n const { year, month } = addMonths(viewYear, viewMonth, -1);\n this._store.set({ viewYear: year, viewMonth: month, navDirection: 'prev' });\n this.emit('cal:month-change', { year, month });\n }\n\n _nextMonth() {\n const { viewYear, viewMonth } = this._store.getState();\n const { year, month } = addMonths(viewYear, viewMonth, 1);\n this._store.set({ viewYear: year, viewMonth: month, navDirection: 'next' });\n this.emit('cal:month-change', { year, month });\n }\n\n // -- Month picker --\n _toggleMonthPicker() {\n const state = this._store.getState();\n this._store.set({\n pickingMonth: !state.pickingMonth,\n pickerYear: state.viewYear,\n });\n }\n\n _selectMonthFromPicker(month, year) {\n this._store.set({\n viewYear: year,\n viewMonth: month,\n pickingMonth: false,\n });\n this.emit('cal:month-change', { year, month });\n }\n\n // -- Keyboard --\n _handleKeydown(e) {\n // Close month picker on Escape before anything else\n if (e.key === 'Escape' && this._store.get('pickingMonth')) {\n e.stopPropagation();\n this._store.set({ pickingMonth: false });\n return;\n }\n\n const state = this._store.getState();\n const focused = parseDate(state.focusedDate);\n if (!focused) return;\n\n let newDate = null;\n switch (e.key) {\n case 'ArrowLeft':\n newDate = new Date(focused);\n newDate.setDate(focused.getDate() - 1);\n break;\n case 'ArrowRight':\n newDate = new Date(focused);\n newDate.setDate(focused.getDate() + 1);\n break;\n case 'ArrowUp':\n newDate = new Date(focused);\n newDate.setDate(focused.getDate() - 7);\n break;\n case 'ArrowDown':\n newDate = new Date(focused);\n newDate.setDate(focused.getDate() + 7);\n break;\n case 'Enter':\n case ' ':\n e.preventDefault();\n this._handleSelect(state.focusedDate);\n return;\n case 'Escape':\n if (this.display === 'popover') this.close();\n return;\n default:\n return;\n }\n\n if (newDate) {\n e.preventDefault();\n const dateStr = toDateString(newDate);\n\n // If navigating out of current view month, advance\n if (newDate.getMonth() !== state.viewMonth || newDate.getFullYear() !== state.viewYear) {\n this._store.set({\n viewYear: newDate.getFullYear(),\n viewMonth: newDate.getMonth(),\n focusedDate: dateStr,\n navDirection: newDate > focused ? 'next' : 'prev',\n });\n } else {\n this._store.set({ focusedDate: dateStr });\n }\n\n // Focus the new cell after render\n requestAnimationFrame(() => {\n const cell = this.$(`[data-date=\"${dateStr}\"]`);\n cell?.focus();\n });\n }\n }\n\n // -- Lightweight hover highlight (no DOM rebuild) --\n _updateGridHighlight(state) {\n const buttons = this.$$('.cal-day');\n const { rangeStart, hoverDate } = state;\n const effectiveEnd = rangeStart && !state.rangeEnd && hoverDate ? hoverDate : state.rangeEnd;\n\n for (const btn of buttons) {\n const dateStr = btn.dataset.date;\n if (!dateStr || btn.classList.contains('cal-day--disabled')) continue;\n\n const isStart = dateStr === rangeStart;\n const isEnd = dateStr === effectiveEnd;\n\n let inRange = false;\n if (rangeStart && effectiveEnd) {\n const lo = rangeStart < effectiveEnd ? rangeStart : effectiveEnd;\n const hi = rangeStart < effectiveEnd ? effectiveEnd : rangeStart;\n inRange = dateStr >= lo && dateStr <= hi && !isStart && !isEnd;\n }\n\n btn.classList.toggle('cal-day--range-start', isStart && !!effectiveEnd);\n btn.classList.toggle('cal-day--range-end', isEnd && !!effectiveEnd);\n btn.classList.toggle('cal-day--in-range', inRange);\n }\n }\n\n // -- Public API --\n open() {\n if (this._popover) {\n this._popover.open();\n this._store.set({ isOpen: true });\n this.emit('cal:open');\n }\n }\n\n close() {\n if (this._popover) {\n this._popover.close();\n this._store.set({ isOpen: false });\n this.emit('cal:close');\n }\n }\n\n goToMonth(month, year) {\n this._store.set({ viewYear: year, viewMonth: month });\n }\n\n // -- Render --\n _renderCalendarContent() {\n const state = this._store.getState();\n const container = document.createElement('div');\n container.classList.add('cal-picker');\n\n // Status banner\n if (state.statusType && state.statusMessage) {\n container.appendChild(renderStatusMessage({\n type: state.statusType,\n message: state.statusMessage,\n dismissible: state.statusDismissible,\n onDismiss: () => this.clearStatus(),\n }));\n }\n\n if (this.loading) {\n const monthsWrapper = document.createElement('div');\n monthsWrapper.classList.add('cal-months');\n const monthEl = document.createElement('div');\n monthEl.classList.add('cal-month');\n monthEl.appendChild(renderCalendarGridSkeleton());\n monthsWrapper.appendChild(monthEl);\n container.appendChild(monthsWrapper);\n container.addEventListener('keydown', (e) => this._handleKeydown(e));\n return container;\n }\n\n const monthsWrapper = document.createElement('div');\n monthsWrapper.classList.add('cal-months');\n\n // Determine if we show dual months (range mode with enough space)\n const showDual = this.mode === 'range' && this.hasAttribute('dual');\n const monthCount = showDual ? 2 : 1;\n\n for (let i = 0; i < monthCount; i++) {\n const { year, month } = i === 0\n ? { year: state.viewYear, month: state.viewMonth }\n : addMonths(state.viewYear, state.viewMonth, 1);\n\n const monthEl = document.createElement('div');\n monthEl.classList.add('cal-month');\n\n // Navigation only on first month (or single)\n if (i === 0) {\n monthEl.appendChild(renderNavigation({\n year, month,\n onPrev: state.pickingMonth ? () => {} : () => this._prevMonth(),\n onNext: state.pickingMonth ? () => {} : () => { if (!showDual) this._nextMonth(); },\n onTitleClick: () => this._toggleMonthPicker(),\n }));\n }\n\n if (i === 1) {\n monthEl.appendChild(renderNavigation({\n year, month,\n onPrev: () => {},\n onNext: () => this._nextMonth(),\n }));\n }\n\n // Month picker replaces day grid for first panel\n if (state.pickingMonth && i === 0) {\n const picker = renderMonthYearPicker({\n pickerYear: state.pickerYear,\n viewMonth: state.viewMonth,\n viewYear: state.viewYear,\n onMonthSelect: (m, y) => this._selectMonthFromPicker(m, y),\n onYearPrev: () => this._store.set({ pickerYear: state.pickerYear - 1 }),\n onYearNext: () => this._store.set({ pickerYear: state.pickerYear + 1 }),\n onClose: () => this._store.set({ pickingMonth: false }),\n });\n monthEl.appendChild(picker);\n } else {\n const animClass = state.navDirection === 'next'\n ? 'cal-animate-slide-left'\n : state.navDirection === 'prev'\n ? 'cal-animate-slide-right'\n : '';\n\n const grid = renderCalendarGrid({\n year, month,\n firstDay: this.firstDay,\n selectedDates: state.selectedDates,\n rangeStart: state.rangeStart,\n rangeEnd: state.rangeEnd,\n hoverDate: state.hoverDate,\n minDate: this.minDate,\n maxDate: this.maxDate,\n disabledDates: this.disabledDates,\n mode: this.mode,\n focusedDate: state.focusedDate,\n onSelect: (d) => this._handleSelect(d),\n onHover: (d) => this._handleHover(d),\n });\n\n if (animClass) grid.classList.add(animClass);\n monthEl.appendChild(grid);\n }\n monthsWrapper.appendChild(monthEl);\n }\n\n container.appendChild(monthsWrapper);\n\n // Presets\n if (this.mode === 'range' && this.presetKeys.length) {\n container.appendChild(renderPresets({\n presetKeys: this.presetKeys,\n onSelect: (range) => this._handlePresetSelect(range),\n }));\n }\n\n // Keyboard\n container.addEventListener('keydown', (e) => this._handleKeydown(e));\n\n return container;\n }\n\n _formatTriggerText() {\n const state = this._store.getState();\n if (this.mode === 'range' && state.rangeStart && state.rangeEnd) {\n return `${this._formatShortDate(state.rangeStart)} – ${this._formatShortDate(state.rangeEnd)}`;\n }\n if (state.selectedDates.length) {\n if (this.mode === 'multi') {\n return `${state.selectedDates.length} dates selected`;\n }\n return this._formatShortDate(state.selectedDates[0]);\n }\n return null;\n }\n\n _formatShortDate(dateStr) {\n const d = parseDate(dateStr);\n if (!d) return dateStr;\n return `${MONTH_NAMES[d.getMonth()].slice(0, 3)} ${d.getDate()}, ${d.getFullYear()}`;\n }\n\n render() {\n if (this._rendering) return;\n this._rendering = true;\n\n const root = this.shadowRoot;\n\n // Clear non-style children\n const children = [...root.childNodes];\n for (const child of children) {\n if (child.nodeName !== 'STYLE' && !(child instanceof CSSStyleSheet)) {\n root.removeChild(child);\n }\n }\n\n // Clean up old popover\n this._popover?.destroy();\n this._popover = null;\n\n if (this.display === 'popover') {\n const wrapper = document.createElement('div');\n wrapper.classList.add('cal-popover-wrapper');\n\n // Trigger button\n const trigger = document.createElement('button');\n trigger.classList.add('cal-trigger');\n\n const icon = document.createElement('span');\n icon.classList.add('cal-trigger__icon');\n icon.innerHTML = calendarIcon;\n trigger.appendChild(icon);\n\n const text = this._formatTriggerText();\n const label = document.createElement('span');\n if (text) {\n label.textContent = text;\n } else {\n label.textContent = this.placeholder;\n label.classList.add('cal-trigger--placeholder');\n }\n trigger.appendChild(label);\n\n wrapper.appendChild(trigger);\n\n // Popover content\n const content = this._renderCalendarContent();\n const popover = createPopover({\n trigger,\n content,\n onClose: () => {\n this._store.set({ isOpen: false });\n this.emit('cal:close');\n },\n });\n\n wrapper.appendChild(popover.panel);\n root.appendChild(wrapper);\n\n trigger.addEventListener('click', (e) => {\n e.stopPropagation();\n if (popover.isOpen) {\n this.close();\n } else {\n this.open();\n }\n });\n\n this._popover = popover;\n\n // If already open (re-render while open), stay open\n if (this._store.get('isOpen')) {\n popover.open();\n }\n } else {\n // Inline\n root.appendChild(this._renderCalendarContent());\n }\n\n // Clear navDirection after render so animation doesn't repeat\n this._store.set({ navDirection: null });\n\n this._rendering = false;\n }\n}\n","/**\n * Time utility functions for the time picker component.\n */\n\n/**\n * Parse a time string into { hours, minutes }.\n * Handles \"09:00\", \"9:00 AM\", \"14:30\", \"2:30 PM\".\n */\nexport function parseTime(str) {\n if (!str || typeof str !== 'string') return null;\n const trimmed = str.trim().toUpperCase();\n const ampmMatch = trimmed.match(/^(\\d{1,2}):(\\d{2})\\s*(AM|PM)$/);\n if (ampmMatch) {\n let hours = parseInt(ampmMatch[1], 10);\n const minutes = parseInt(ampmMatch[2], 10);\n const period = ampmMatch[3];\n if (period === 'AM' && hours === 12) hours = 0;\n if (period === 'PM' && hours !== 12) hours += 12;\n return { hours, minutes };\n }\n const match24 = trimmed.match(/^(\\d{1,2}):(\\d{2})$/);\n if (match24) {\n return { hours: parseInt(match24[1], 10), minutes: parseInt(match24[2], 10) };\n }\n return null;\n}\n\n/**\n * Format hours/minutes into a display string.\n * @param {number} hours\n * @param {number} minutes\n * @param {'12h'|'24h'} format\n */\nexport function formatTime(hours, minutes, format = '24h') {\n const mm = String(minutes).padStart(2, '0');\n if (format === '12h') {\n const period = hours >= 12 ? 'PM' : 'AM';\n const h = hours % 12 || 12;\n return `${h}:${mm} ${period}`;\n }\n return `${String(hours).padStart(2, '0')}:${mm}`;\n}\n\n/** Convert a time string (HH:MM or h:MM AM/PM) to minutes since midnight. */\nexport function timeToMinutes(str) {\n const t = parseTime(str);\n if (!t) return 0;\n return t.hours * 60 + t.minutes;\n}\n\n/** Convert minutes since midnight back to \"HH:MM\". */\nexport function minutesToTime(n) {\n const hours = Math.floor(n / 60) % 24;\n const minutes = n % 60;\n return `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}`;\n}\n\n/**\n * Generate time slots between start and end times.\n * @param {string} startTime - e.g. \"09:00\"\n * @param {string} endTime - e.g. \"17:00\"\n * @param {number} intervalMinutes - e.g. 30\n * @returns {string[]} - e.g. [\"09:00\", \"09:30\", \"10:00\", ...]\n */\nexport function generateSlots(startTime, endTime, intervalMinutes) {\n const slots = [];\n const startMin = timeToMinutes(startTime);\n const endMin = timeToMinutes(endTime);\n for (let m = startMin; m <= endMin; m += intervalMinutes) {\n slots.push(minutesToTime(m));\n }\n return slots;\n}\n\n/**\n * Generate time slots with duration labels (e.g. \"09:00–09:30\").\n * @param {string} startTime - e.g. \"09:00\"\n * @param {string} endTime - e.g. \"17:00\"\n * @param {number} intervalMinutes - e.g. 30\n * @param {'12h'|'24h'} format\n * @returns {Array<{time: string, displayText: string}>}\n */\nexport function generateDurationSlots(startTime, endTime, intervalMinutes, format = '24h') {\n const slots = [];\n const startMin = timeToMinutes(startTime);\n const endMin = timeToMinutes(endTime);\n for (let m = startMin; m <= endMin; m += intervalMinutes) {\n const time = minutesToTime(m);\n const nextMin = m + intervalMinutes;\n const endSlotTime = minutesToTime(Math.min(nextMin, endMin + intervalMinutes));\n const parsed = parseTime(time);\n const parsedEnd = parseTime(endSlotTime);\n const fromText = parsed ? formatTime(parsed.hours, parsed.minutes, format) : time;\n const toText = parsedEnd ? formatTime(parsedEnd.hours, parsedEnd.minutes, format) : endSlotTime;\n slots.push({ time, displayText: `${fromText}\\u2013${toText}` });\n }\n return slots;\n}\n\n/** Returns true if time A is strictly before time B. */\nexport function isTimeBefore(a, b) {\n return timeToMinutes(a) < timeToMinutes(b);\n}\n\n/**\n * Check if two time ranges overlap (exclusive boundaries).\n * @param {string} startA - \"HH:MM\"\n * @param {string} endA - \"HH:MM\"\n * @param {string} startB - \"HH:MM\"\n * @param {string} endB - \"HH:MM\"\n * @returns {boolean}\n */\nexport function timeRangesOverlap(startA, endA, startB, endB) {\n const a0 = timeToMinutes(startA);\n const a1 = timeToMinutes(endA);\n const b0 = timeToMinutes(startB);\n const b1 = timeToMinutes(endB);\n return a0 < b1 && a1 > b0;\n}\n\n/**\n * Get the current time as \"HH:MM\".\n * @returns {string}\n */\nexport function currentTime() {\n const now = new Date();\n return `${String(now.getHours()).padStart(2, '0')}:${String(now.getMinutes()).padStart(2, '0')}`;\n}\n\n/** Returns true if time is within [start, end] inclusive. */\nexport function isTimeInRange(time, start, end) {\n const t = timeToMinutes(time);\n const s = timeToMinutes(start);\n const e = timeToMinutes(end);\n const lo = Math.min(s, e);\n const hi = Math.max(s, e);\n return t >= lo && t <= hi;\n}\n","/**\n * Time slot grid renderer — pill-shaped slot buttons in a responsive grid.\n */\nimport { formatTime, parseTime, isTimeInRange } from '../../core/times.js';\n\n/**\n * @param {object} options\n * @param {Array<{time: string, label?: string, available?: boolean}>} options.slots\n * @param {string} options.mode - single|multi|range\n * @param {string|null} options.format - '12h'|'24h'\n * @param {string|string[]|{start,end}|null} options.selected\n * @param {string|null} options.hoverTime - for range preview\n * @param {string|null} options.rangeStart - for range mode in-progress\n * @param {string[]} options.unavailableTimes\n * @param {function} options.onSelect\n * @param {function} options.onHover\n * @returns {HTMLElement}\n */\nexport function renderTimeGrid(options) {\n const {\n slots = [], mode = 'single', format = '24h',\n selected, hoverTime, rangeStart,\n unavailableTimes = [],\n onSelect, onHover,\n durationLabels = false,\n } = options;\n\n const grid = document.createElement('div');\n grid.classList.add('cal-time-grid');\n if (durationLabels) grid.classList.add('cal-time-grid--duration');\n grid.setAttribute('role', 'listbox');\n if (mode === 'multi') grid.setAttribute('aria-multiselectable', 'true');\n\n for (const slot of slots) {\n const btn = document.createElement('button');\n btn.classList.add('cal-time-slot');\n btn.setAttribute('role', 'option');\n btn.dataset.time = slot.time;\n\n // Format display text — slot.displayText takes priority\n const parsed = parseTime(slot.time);\n const displayTime = slot.displayText\n ? slot.displayText\n : (parsed ? formatTime(parsed.hours, parsed.minutes, format) : slot.time);\n\n const timeSpan = document.createElement('span');\n timeSpan.classList.add('cal-time-slot__time');\n timeSpan.textContent = displayTime;\n btn.appendChild(timeSpan);\n\n if (slot.label) {\n const labelSpan = document.createElement('span');\n labelSpan.classList.add('cal-time-slot__label');\n labelSpan.textContent = slot.label;\n btn.appendChild(labelSpan);\n }\n\n // Available/unavailable\n const isUnavailable = slot.available === false || unavailableTimes.includes(slot.time);\n if (isUnavailable) {\n btn.classList.add('cal-time-slot--unavailable');\n btn.disabled = true;\n btn.setAttribute('aria-disabled', 'true');\n }\n\n // Selected state\n const isSelected = isSlotSelected(slot.time, selected, mode);\n if (isSelected) {\n btn.classList.add('cal-time-slot--selected');\n btn.setAttribute('aria-selected', 'true');\n } else {\n btn.setAttribute('aria-selected', 'false');\n }\n\n // Range in-progress preview\n if (mode === 'range' && rangeStart && !isRangeComplete(selected) && hoverTime) {\n const inRange = isTimeInRange(slot.time, rangeStart, hoverTime);\n const isStart = slot.time === rangeStart;\n const isEnd = slot.time === hoverTime;\n if (inRange && !isStart && !isEnd) {\n btn.classList.add('cal-time-slot--in-range');\n }\n if (isStart) btn.classList.add('cal-time-slot--range-start');\n if (isEnd) btn.classList.add('cal-time-slot--range-end');\n } else if (mode === 'range' && selected && typeof selected === 'object' && selected.start && selected.end) {\n // Completed range\n const inRange = isTimeInRange(slot.time, selected.start, selected.end);\n const isStart = slot.time === selected.start;\n const isEnd = slot.time === selected.end;\n if (isStart) btn.classList.add('cal-time-slot--range-start', 'cal-time-slot--selected');\n if (isEnd) btn.classList.add('cal-time-slot--range-end', 'cal-time-slot--selected');\n if (inRange && !isStart && !isEnd) btn.classList.add('cal-time-slot--in-range');\n }\n\n // Events\n if (!isUnavailable) {\n btn.addEventListener('click', () => onSelect?.(slot.time));\n btn.addEventListener('mouseenter', () => onHover?.(slot.time));\n }\n\n grid.appendChild(btn);\n }\n\n grid.addEventListener('mouseleave', () => onHover?.(null));\n\n return grid;\n}\n\nfunction isSlotSelected(time, selected, mode) {\n if (!selected) return false;\n if (mode === 'single') return selected === time;\n if (mode === 'multi') return Array.isArray(selected) && selected.includes(time);\n if (mode === 'range') {\n if (typeof selected === 'object' && selected.start && selected.end) {\n return selected.start === time || selected.end === time;\n }\n }\n return false;\n}\n\nfunction isRangeComplete(selected) {\n return selected && typeof selected === 'object' && selected.start && selected.end;\n}\n\nexport const timeGridStyles = `\n .cal-time-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(80px, 1fr));\n gap: 6px;\n max-height: 280px;\n overflow-y: auto;\n padding: 4px;\n }\n\n .cal-time-grid::-webkit-scrollbar {\n width: 6px;\n }\n\n .cal-time-grid::-webkit-scrollbar-track {\n background: transparent;\n }\n\n .cal-time-grid::-webkit-scrollbar-thumb {\n background: hsl(var(--cal-border));\n border-radius: 3px;\n }\n\n .cal-time-slot {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 40px;\n padding: 0 8px;\n border-radius: 999px;\n font-size: 13px;\n background: hsl(var(--cal-bg-muted));\n color: hsl(var(--cal-fg));\n transition: background var(--cal-transition), color var(--cal-transition);\n gap: 1px;\n }\n\n .cal-time-slot:not(.cal-time-slot--unavailable):not(.cal-time-slot--selected):hover {\n background: hsl(var(--cal-hover));\n }\n\n .cal-time-slot__time {\n font-weight: 500;\n line-height: 1;\n }\n\n .cal-time-slot__label {\n font-size: 9px;\n opacity: 0.7;\n line-height: 1;\n }\n\n .cal-time-slot--selected {\n background: hsl(var(--cal-accent));\n color: hsl(var(--cal-accent-fg));\n font-weight: 600;\n }\n\n .cal-time-slot--in-range {\n background: hsl(var(--cal-accent-subtle));\n }\n\n .cal-time-slot--range-start,\n .cal-time-slot--range-end {\n background: hsl(var(--cal-accent));\n color: hsl(var(--cal-accent-fg));\n font-weight: 600;\n }\n\n .cal-time-slot--unavailable {\n opacity: 0.3;\n cursor: not-allowed;\n }\n\n .cal-time-grid--duration {\n grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));\n }\n\n .cal-time-grid--duration .cal-time-slot {\n font-size: 12px;\n }\n`;\n","import { CalendarBase } from '../../core/base-component.js';\nimport { createStore } from '../../core/state.js';\nimport {\n today, parseDate, toDateString, isSameDay, addMonths, MONTH_NAMES,\n} from '../../core/dates.js';\nimport { generateSlots, generateDurationSlots } from '../../core/times.js';\nimport { tokens } from '../../styles/tokens.js';\nimport { reset } from '../../styles/reset.js';\nimport { animations } from '../../styles/animations.js';\nimport { renderNavigation, navigationStyles } from '../datepicker/navigation.js';\nimport { renderMonthYearPicker, monthYearPickerStyles } from '../datepicker/month-year-picker.js';\nimport { createPopover, popoverStyles } from '../datepicker/popover.js';\nimport { renderCalendarGrid, calendarGridStyles } from '../datepicker/calendar-grid.js';\nimport { renderTimeGrid, timeGridStyles } from '../timepicker/time-grid.js';\nimport { isSelectionValid } from './booking-data.js';\nimport { renderTimeGridSkeleton, renderCalendarGridSkeleton, loadingSkeletonStyles } from '../shared/loading-skeleton.js';\nimport { renderStatusMessage, statusMessageStyles } from '../shared/status-message.js';\n\nconst calendarIcon = `<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"2\" y=\"3\" width=\"12\" height=\"11\" rx=\"2\"/><path d=\"M5 1v3M11 1v3M2 7h12\"/></svg>`;\n\nconst componentStyles = `\n .cal-picker {\n background: hsl(var(--cal-bg));\n border-radius: var(--cal-radius);\n user-select: none;\n }\n\n :host([display=\"inline\"]) .cal-picker {\n border: 1px solid hsl(var(--cal-border));\n padding: 12px;\n }\n\n .cal-months {\n display: flex;\n gap: 16px;\n }\n\n .cal-month {\n flex: 0 0 auto;\n }\n\n /* Time section */\n .cal-booking-time-section {\n margin-top: 12px;\n padding-top: 12px;\n border-top: 1px solid hsl(var(--cal-border));\n }\n\n .cal-booking-time-header {\n font-size: 13px;\n font-weight: 600;\n color: hsl(var(--cal-fg));\n margin-bottom: 8px;\n }\n`;\n\nexport class CalBooking extends CalendarBase {\n static get styles() {\n return [tokens, reset, animations, calendarGridStyles, timeGridStyles, navigationStyles, monthYearPickerStyles, popoverStyles, loadingSkeletonStyles, statusMessageStyles, componentStyles];\n }\n\n static get observedAttributes() {\n return [\n 'theme', 'display', 'min-date', 'max-date', 'first-day',\n 'placeholder', 'dual', 'show-labels-on-hover',\n 'time-slots', 'time-start', 'time-end', 'time-interval', 'time-format',\n 'duration-labels', 'loading',\n ];\n }\n\n constructor() {\n super();\n\n const now = new Date();\n this._store = createStore({\n viewYear: now.getFullYear(),\n viewMonth: now.getMonth(),\n rangeStart: null,\n rangeEnd: null,\n hoverDate: null,\n isOpen: false,\n focusedDate: today(),\n navDirection: null,\n pickingMonth: false,\n pickerYear: now.getFullYear(),\n // Time state\n startTime: null,\n endTime: null,\n timeSelectPhase: null, // null | 'start' | 'end'\n // Status\n statusType: null,\n statusMessage: null,\n statusDismissible: true,\n });\n\n this._bookings = [];\n this._dayData = {};\n this._labelFormula = null;\n this._timeSlots = null; // explicit slot definitions\n this._popover = null;\n this._unsubscribe = null;\n this._rendering = false;\n }\n\n // -- Attribute getters --\n get display() { return this.getAttribute('display') || 'inline'; }\n get placeholder() { return this.getAttribute('placeholder') || 'Select dates'; }\n get firstDay() { return parseInt(this.getAttribute('first-day') || '0', 10); }\n get minDate() { return this.getAttribute('min-date') || null; }\n get maxDate() { return this.getAttribute('max-date') || null; }\n get showLabelsOnHover() { return this.hasAttribute('show-labels-on-hover'); }\n get timeSlotsEnabled() { return this.hasAttribute('time-slots'); }\n get timeStartTime() { return this.getAttribute('time-start') || '09:00'; }\n get timeEndTime() { return this.getAttribute('time-end') || '17:00'; }\n get timeInterval() { return parseInt(this.getAttribute('time-interval') || '60', 10); }\n get timeFormat() { return this.getAttribute('time-format') || '24h'; }\n get durationLabels() { return this.hasAttribute('duration-labels'); }\n get loading() { return this.hasAttribute('loading'); }\n set loading(val) { val ? this.setAttribute('loading', '') : this.removeAttribute('loading'); }\n\n // -- Properties --\n get bookings() { return this._bookings; }\n set bookings(val) {\n this._bookings = Array.isArray(val) ? val : [];\n if (this._initialized) this.render();\n }\n\n get dayData() { return this._dayData; }\n set dayData(val) {\n this._dayData = val && typeof val === 'object' ? val : {};\n if (this._initialized) this.render();\n }\n\n get labelFormula() { return this._labelFormula; }\n set labelFormula(fn) {\n this._labelFormula = typeof fn === 'function' ? fn : null;\n if (this._initialized) this.render();\n }\n\n get timeSlots() { return this._timeSlots; }\n set timeSlots(val) {\n this._timeSlots = Array.isArray(val) ? val : null;\n if (this._initialized) this.render();\n }\n\n get value() {\n const state = this._store.getState();\n if (!state.rangeStart || !state.rangeEnd) return null;\n const val = { start: state.rangeStart, end: state.rangeEnd };\n if (this.timeSlotsEnabled) {\n if (state.startTime) val.startTime = state.startTime;\n if (state.endTime) val.endTime = state.endTime;\n }\n return val;\n }\n\n set value(val) {\n if (val && typeof val === 'object' && val.start && val.end) {\n const start = typeof val.start === 'string' ? val.start : toDateString(val.start);\n const end = typeof val.end === 'string' ? val.end : toDateString(val.end);\n const updates = { rangeStart: start, rangeEnd: end };\n if (val.startTime) updates.startTime = val.startTime;\n if (val.endTime) updates.endTime = val.endTime;\n this._store.set(updates);\n this._navigateToDate(start);\n } else {\n this._store.set({\n rangeStart: null, rangeEnd: null,\n startTime: null, endTime: null, timeSelectPhase: null,\n });\n }\n }\n\n _navigateToDate(dateStr) {\n const d = parseDate(dateStr);\n if (d) {\n this._store.set({ viewYear: d.getFullYear(), viewMonth: d.getMonth() });\n }\n }\n\n connectedCallback() {\n super.connectedCallback();\n this._unsubscribe = this._store.subscribe((state, prev) => {\n if (this._rendering) return;\n // Hover-only change → lightweight CSS update\n const hoverOnly = state.hoverDate !== prev.hoverDate\n && state.viewYear === prev.viewYear && state.viewMonth === prev.viewMonth\n && state.rangeStart === prev.rangeStart && state.rangeEnd === prev.rangeEnd\n && state.isOpen === prev.isOpen && state.navDirection === prev.navDirection\n && state.pickingMonth === prev.pickingMonth && state.pickerYear === prev.pickerYear\n && state.timeSelectPhase === prev.timeSelectPhase;\n hoverOnly ? this._updateGridHighlight(state) : this.render();\n });\n\n // Parse bookings from attribute (JSON fallback)\n const bookingsAttr = this.getAttribute('bookings');\n if (bookingsAttr && !this._bookings.length) {\n try { this._bookings = JSON.parse(bookingsAttr); } catch (e) { /* ignore */ }\n }\n }\n\n disconnectedCallback() {\n this._unsubscribe?.();\n this._popover?.destroy();\n clearTimeout(this._statusTimer);\n }\n\n attributeChangedCallback(name, oldVal, newVal) {\n if (oldVal === newVal) return;\n if (this._initialized) this.render();\n }\n\n // -- Selection --\n _handleSelect(dateStr) {\n const state = this._store.getState();\n\n if (!state.rangeStart || state.rangeEnd) {\n // Start new range — reset time state\n this._store.set({\n rangeStart: dateStr,\n rangeEnd: null,\n hoverDate: null,\n focusedDate: dateStr,\n startTime: null,\n endTime: null,\n timeSelectPhase: null,\n });\n } else {\n // Complete range\n let start = state.rangeStart;\n let end = dateStr;\n if (start > end) [start, end] = [end, start];\n\n // Validate against bookings\n if (!isSelectionValid(start, end, this._bookings)) {\n this.emit('cal:selection-invalid', { start, end });\n this._store.set({\n rangeStart: null, rangeEnd: null, hoverDate: null,\n startTime: null, endTime: null, timeSelectPhase: null,\n });\n this.showStatus('error', 'Selection overlaps an existing booking', { autoDismiss: 4000 });\n return;\n }\n\n if (this.timeSlotsEnabled) {\n // Don't emit change yet — enter time selection phase\n this._store.set({\n rangeStart: start,\n rangeEnd: end,\n hoverDate: null,\n focusedDate: end,\n timeSelectPhase: 'start',\n });\n } else {\n this._store.set({\n rangeStart: start,\n rangeEnd: end,\n hoverDate: null,\n focusedDate: end,\n });\n this.emit('cal:change', { value: { start, end } });\n if (this.display === 'popover') this.close();\n }\n }\n }\n\n _handleTimeSelect(time) {\n const state = this._store.getState();\n\n if (state.timeSelectPhase === 'start') {\n this._store.set({ startTime: time, timeSelectPhase: 'end' });\n } else if (state.timeSelectPhase === 'end') {\n this._store.set({ endTime: time, timeSelectPhase: null });\n // Emit full value with times\n const value = {\n start: state.rangeStart,\n end: state.rangeEnd,\n startTime: state.startTime,\n endTime: time,\n };\n this.emit('cal:change', { value });\n if (this.display === 'popover') this.close();\n }\n }\n\n _handleHover(dateStr) {\n this._store.set({ hoverDate: dateStr });\n }\n\n // -- Lightweight hover highlight --\n _updateGridHighlight(state) {\n const buttons = this.$$('.cal-day');\n const { rangeStart, hoverDate } = state;\n const effectiveEnd = rangeStart && !state.rangeEnd && hoverDate ? hoverDate : state.rangeEnd;\n\n // Inline check for invalid hover\n let hoverRangeInvalid = false;\n if (rangeStart && !state.rangeEnd && hoverDate) {\n const lo = rangeStart < hoverDate ? rangeStart : hoverDate;\n const hi = rangeStart < hoverDate ? hoverDate : rangeStart;\n for (const b of this._bookings) {\n if (lo < b.end && hi > b.start) { hoverRangeInvalid = true; break; }\n }\n }\n\n for (const btn of buttons) {\n const dateStr = btn.dataset.date;\n if (!dateStr) continue;\n\n const isStart = dateStr === rangeStart && !!effectiveEnd;\n const isEnd = dateStr === effectiveEnd && !!effectiveEnd;\n\n let inRange = false;\n if (rangeStart && effectiveEnd) {\n const lo = rangeStart < effectiveEnd ? rangeStart : effectiveEnd;\n const hi = rangeStart < effectiveEnd ? effectiveEnd : rangeStart;\n inRange = dateStr >= lo && dateStr <= hi && !isStart && !isEnd;\n }\n\n const invalidRange = hoverRangeInvalid && rangeStart && !state.rangeEnd && hoverDate\n && (() => {\n const lo = rangeStart < hoverDate ? rangeStart : hoverDate;\n const hi = rangeStart < hoverDate ? hoverDate : rangeStart;\n return dateStr >= lo && dateStr <= hi;\n })();\n\n btn.classList.toggle('cal-day--range-start', isStart);\n btn.classList.toggle('cal-day--range-end', isEnd);\n btn.classList.toggle('cal-day--in-range', inRange);\n btn.classList.toggle('cal-day--invalid-range', !!invalidRange);\n }\n }\n\n // -- Navigation --\n _prevMonth() {\n const { viewYear, viewMonth } = this._store.getState();\n const { year, month } = addMonths(viewYear, viewMonth, -1);\n this._store.set({ viewYear: year, viewMonth: month, navDirection: 'prev' });\n this.emit('cal:month-change', { year, month });\n }\n\n _nextMonth() {\n const { viewYear, viewMonth } = this._store.getState();\n const { year, month } = addMonths(viewYear, viewMonth, 1);\n this._store.set({ viewYear: year, viewMonth: month, navDirection: 'next' });\n this.emit('cal:month-change', { year, month });\n }\n\n // -- Month picker --\n _toggleMonthPicker() {\n const state = this._store.getState();\n this._store.set({\n pickingMonth: !state.pickingMonth,\n pickerYear: state.viewYear,\n });\n }\n\n _selectMonthFromPicker(month, year) {\n this._store.set({\n viewYear: year,\n viewMonth: month,\n pickingMonth: false,\n });\n this.emit('cal:month-change', { year, month });\n }\n\n // -- Keyboard --\n _handleKeydown(e) {\n if (e.key === 'Escape' && this._store.get('pickingMonth')) {\n e.stopPropagation();\n this._store.set({ pickingMonth: false });\n return;\n }\n\n const state = this._store.getState();\n const focused = parseDate(state.focusedDate);\n if (!focused) return;\n\n let newDate = null;\n switch (e.key) {\n case 'ArrowLeft':\n newDate = new Date(focused); newDate.setDate(focused.getDate() - 1); break;\n case 'ArrowRight':\n newDate = new Date(focused); newDate.setDate(focused.getDate() + 1); break;\n case 'ArrowUp':\n newDate = new Date(focused); newDate.setDate(focused.getDate() - 7); break;\n case 'ArrowDown':\n newDate = new Date(focused); newDate.setDate(focused.getDate() + 7); break;\n case 'Enter':\n case ' ':\n e.preventDefault();\n this._handleSelect(state.focusedDate);\n return;\n case 'Escape':\n if (this.display === 'popover') this.close();\n return;\n default: return;\n }\n\n if (newDate) {\n e.preventDefault();\n const dateStr = toDateString(newDate);\n if (newDate.getMonth() !== state.viewMonth || newDate.getFullYear() !== state.viewYear) {\n this._store.set({\n viewYear: newDate.getFullYear(), viewMonth: newDate.getMonth(),\n focusedDate: dateStr, navDirection: newDate > focused ? 'next' : 'prev',\n });\n } else {\n this._store.set({ focusedDate: dateStr });\n }\n requestAnimationFrame(() => {\n const cell = this.$(`[data-date=\"${dateStr}\"]`);\n cell?.focus();\n });\n }\n }\n\n // -- Public API --\n open() {\n if (this._popover) {\n this._popover.open();\n this._store.set({ isOpen: true });\n this.emit('cal:open');\n }\n }\n\n close() {\n if (this._popover) {\n this._popover.close();\n this._store.set({ isOpen: false });\n this.emit('cal:close');\n }\n }\n\n goToMonth(month, year) {\n this._store.set({ viewYear: year, viewMonth: month });\n }\n\n // -- Time slots generation --\n _getTimeSlotArray() {\n if (this._timeSlots) {\n return this._timeSlots;\n }\n // Generate from attributes\n if (this.durationLabels) {\n return generateDurationSlots(this.timeStartTime, this.timeEndTime, this.timeInterval, this.timeFormat)\n .map((slot) => ({ ...slot, available: true }));\n }\n const times = generateSlots(this.timeStartTime, this.timeEndTime, this.timeInterval);\n return times.map((t) => ({ time: t, available: true }));\n }\n\n // -- Render --\n _renderCalendarContent() {\n const state = this._store.getState();\n const container = document.createElement('div');\n container.classList.add('cal-picker');\n\n // Status banner\n if (state.statusType && state.statusMessage) {\n container.appendChild(renderStatusMessage({\n type: state.statusType,\n message: state.statusMessage,\n dismissible: state.statusDismissible,\n onDismiss: () => this.clearStatus(),\n }));\n }\n\n if (this.loading) {\n const monthsWrapper = document.createElement('div');\n monthsWrapper.classList.add('cal-months');\n const monthEl = document.createElement('div');\n monthEl.classList.add('cal-month');\n monthEl.appendChild(renderCalendarGridSkeleton());\n monthsWrapper.appendChild(monthEl);\n container.appendChild(monthsWrapper);\n if (this.timeSlotsEnabled) {\n const timeSection = document.createElement('div');\n timeSection.classList.add('cal-booking-time-section');\n timeSection.appendChild(renderTimeGridSkeleton({ durationLabels: this.durationLabels }));\n container.appendChild(timeSection);\n }\n container.addEventListener('keydown', (e) => this._handleKeydown(e));\n return container;\n }\n\n const monthsWrapper = document.createElement('div');\n monthsWrapper.classList.add('cal-months');\n\n const showDual = this.hasAttribute('dual');\n const monthCount = showDual ? 2 : 1;\n\n for (let i = 0; i < monthCount; i++) {\n const { year, month } = i === 0\n ? { year: state.viewYear, month: state.viewMonth }\n : addMonths(state.viewYear, state.viewMonth, 1);\n\n const monthEl = document.createElement('div');\n monthEl.classList.add('cal-month');\n\n if (i === 0) {\n monthEl.appendChild(renderNavigation({\n year, month,\n onPrev: state.pickingMonth ? () => {} : () => this._prevMonth(),\n onNext: state.pickingMonth ? () => {} : () => { if (!showDual) this._nextMonth(); },\n onTitleClick: () => this._toggleMonthPicker(),\n }));\n }\n\n if (i === 1) {\n monthEl.appendChild(renderNavigation({\n year, month,\n onPrev: () => {},\n onNext: () => this._nextMonth(),\n }));\n }\n\n // Month picker replaces day grid for first panel\n if (state.pickingMonth && i === 0) {\n const picker = renderMonthYearPicker({\n pickerYear: state.pickerYear,\n viewMonth: state.viewMonth,\n viewYear: state.viewYear,\n onMonthSelect: (m, y) => this._selectMonthFromPicker(m, y),\n onYearPrev: () => this._store.set({ pickerYear: state.pickerYear - 1 }),\n onYearNext: () => this._store.set({ pickerYear: state.pickerYear + 1 }),\n onClose: () => this._store.set({ pickingMonth: false }),\n });\n monthEl.appendChild(picker);\n } else {\n const animClass = state.navDirection === 'next'\n ? 'cal-animate-slide-left'\n : state.navDirection === 'prev'\n ? 'cal-animate-slide-right'\n : '';\n\n const grid = renderCalendarGrid({\n year, month,\n firstDay: this.firstDay,\n rangeStart: state.rangeStart,\n rangeEnd: state.rangeEnd,\n hoverDate: state.hoverDate,\n minDate: this.minDate,\n maxDate: this.maxDate,\n focusedDate: state.focusedDate,\n mode: 'range',\n onSelect: (d) => this._handleSelect(d),\n onHover: (d) => this._handleHover(d),\n // Booking-specific params\n bookings: this._bookings,\n dayData: this._dayData,\n labelFormula: this._labelFormula,\n showLabelsOnHover: this.showLabelsOnHover,\n });\n\n if (animClass) grid.classList.add(animClass);\n monthEl.appendChild(grid);\n }\n monthsWrapper.appendChild(monthEl);\n }\n\n container.appendChild(monthsWrapper);\n\n // Time section (date-then-time flow) — hidden when month picker is open\n if (this.timeSlotsEnabled && state.timeSelectPhase && !state.pickingMonth) {\n const timeSection = document.createElement('div');\n timeSection.classList.add('cal-booking-time-section');\n\n const header = document.createElement('div');\n header.classList.add('cal-booking-time-header');\n header.textContent = state.timeSelectPhase === 'start'\n ? 'Select check-in time'\n : 'Select check-out time';\n timeSection.appendChild(header);\n\n const slots = this._getTimeSlotArray();\n const timeGrid = renderTimeGrid({\n slots,\n mode: 'single',\n format: this.timeFormat,\n selected: state.timeSelectPhase === 'end' ? state.startTime : null,\n onSelect: (t) => this._handleTimeSelect(t),\n onHover: () => {},\n durationLabels: this.durationLabels,\n });\n timeSection.appendChild(timeGrid);\n\n container.appendChild(timeSection);\n }\n\n container.addEventListener('keydown', (e) => this._handleKeydown(e));\n\n return container;\n }\n\n _formatTriggerText() {\n const state = this._store.getState();\n if (state.rangeStart && state.rangeEnd) {\n let text = `${this._formatShortDate(state.rangeStart)} – ${this._formatShortDate(state.rangeEnd)}`;\n if (state.startTime && state.endTime) {\n text += ` (${state.startTime} – ${state.endTime})`;\n }\n return text;\n }\n return null;\n }\n\n _formatShortDate(dateStr) {\n const d = parseDate(dateStr);\n if (!d) return dateStr;\n return `${MONTH_NAMES[d.getMonth()].slice(0, 3)} ${d.getDate()}, ${d.getFullYear()}`;\n }\n\n render() {\n if (this._rendering) return;\n this._rendering = true;\n\n const root = this.shadowRoot;\n\n // Clear non-style children\n const children = [...root.childNodes];\n for (const child of children) {\n if (child.nodeName !== 'STYLE' && !(child instanceof CSSStyleSheet)) {\n root.removeChild(child);\n }\n }\n\n this._popover?.destroy();\n this._popover = null;\n\n if (this.display === 'popover') {\n const wrapper = document.createElement('div');\n wrapper.classList.add('cal-popover-wrapper');\n\n const trigger = document.createElement('button');\n trigger.classList.add('cal-trigger');\n\n const icon = document.createElement('span');\n icon.classList.add('cal-trigger__icon');\n icon.innerHTML = calendarIcon;\n trigger.appendChild(icon);\n\n const text = this._formatTriggerText();\n const label = document.createElement('span');\n if (text) {\n label.textContent = text;\n } else {\n label.textContent = this.placeholder;\n label.classList.add('cal-trigger--placeholder');\n }\n trigger.appendChild(label);\n wrapper.appendChild(trigger);\n\n const content = this._renderCalendarContent();\n const popover = createPopover({\n trigger,\n content,\n onClose: () => {\n this._store.set({ isOpen: false });\n this.emit('cal:close');\n },\n });\n\n wrapper.appendChild(popover.panel);\n root.appendChild(wrapper);\n\n trigger.addEventListener('click', (e) => {\n e.stopPropagation();\n if (popover.isOpen) {\n this.close();\n } else {\n this.open();\n }\n });\n\n this._popover = popover;\n if (this._store.get('isOpen')) {\n popover.open();\n }\n } else {\n root.appendChild(this._renderCalendarContent());\n }\n\n this._store.set({ navDirection: null });\n this._rendering = false;\n }\n}\n","import { CalendarBase } from '../../core/base-component.js';\nimport { createStore } from '../../core/state.js';\nimport { generateSlots, generateDurationSlots, timeToMinutes } from '../../core/times.js';\nimport { tokens } from '../../styles/tokens.js';\nimport { reset } from '../../styles/reset.js';\nimport { animations } from '../../styles/animations.js';\nimport { createPopover, popoverStyles } from '../datepicker/popover.js';\nimport { renderTimeGrid, timeGridStyles } from './time-grid.js';\nimport { renderTimeGridSkeleton, loadingSkeletonStyles } from '../shared/loading-skeleton.js';\nimport { renderStatusMessage, statusMessageStyles } from '../shared/status-message.js';\n\nconst clockIcon = `<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"8\" cy=\"8\" r=\"6\"/><path d=\"M8 4.5V8l2.5 1.5\"/></svg>`;\n\nconst componentStyles = `\n .cal-timepicker {\n background: hsl(var(--cal-bg));\n border-radius: var(--cal-radius);\n user-select: none;\n min-width: 200px;\n }\n\n :host([display=\"inline\"]) .cal-timepicker {\n border: 1px solid hsl(var(--cal-border));\n padding: 12px;\n }\n\n .cal-timepicker__header {\n font-size: 14px;\n font-weight: 600;\n color: hsl(var(--cal-fg));\n margin-bottom: 8px;\n padding: 0 4px;\n }\n`;\n\nexport class CalTimepicker extends CalendarBase {\n static get styles() {\n return [tokens, reset, animations, timeGridStyles, popoverStyles, loadingSkeletonStyles, statusMessageStyles, componentStyles];\n }\n\n static get observedAttributes() {\n return ['mode', 'display', 'theme', 'start-time', 'end-time', 'interval', 'format', 'placeholder', 'value', 'duration-labels', 'loading'];\n }\n\n constructor() {\n super();\n\n this._store = createStore({\n selected: null, // string | string[] | {start, end}\n rangeStart: null, // for range mode in-progress\n hoverTime: null,\n isOpen: false,\n statusType: null,\n statusMessage: null,\n statusDismissible: true,\n });\n\n this._slots = null; // explicit slots (highest priority)\n this._unavailableTimes = [];\n this._popover = null;\n this._unsubscribe = null;\n this._rendering = false;\n }\n\n // -- Attribute getters --\n get mode() { return this.getAttribute('mode') || 'single'; }\n get display() { return this.getAttribute('display') || 'inline'; }\n get placeholder() { return this.getAttribute('placeholder') || 'Select time'; }\n get startTime() { return this.getAttribute('start-time') || '09:00'; }\n get endTime() { return this.getAttribute('end-time') || '17:00'; }\n get interval() { return parseInt(this.getAttribute('interval') || '30', 10); }\n get format() { return this.getAttribute('format') || '24h'; }\n get durationLabels() { return this.hasAttribute('duration-labels'); }\n get loading() { return this.hasAttribute('loading'); }\n set loading(val) { val ? this.setAttribute('loading', '') : this.removeAttribute('loading'); }\n\n // -- Properties --\n get slots() { return this._slots; }\n set slots(val) {\n this._slots = Array.isArray(val) ? val : null;\n if (this._initialized) this.render();\n }\n\n get unavailableTimes() { return this._unavailableTimes; }\n set unavailableTimes(val) {\n this._unavailableTimes = Array.isArray(val) ? val : [];\n if (this._initialized) this.render();\n }\n\n get value() {\n const state = this._store.getState();\n return state.selected;\n }\n\n set value(val) {\n if (this.mode === 'single' && typeof val === 'string') {\n this._store.set({ selected: val, rangeStart: null });\n } else if (this.mode === 'multi' && Array.isArray(val)) {\n this._store.set({ selected: [...val].sort((a, b) => timeToMinutes(a) - timeToMinutes(b)), rangeStart: null });\n } else if (this.mode === 'range' && val && typeof val === 'object') {\n this._store.set({ selected: { start: val.start, end: val.end }, rangeStart: null });\n } else {\n this._store.set({ selected: null, rangeStart: null });\n }\n }\n\n _getEffectiveSlots() {\n // Priority 1: explicit slots property\n if (this._slots) return this._slots;\n // Priority 2: auto-generate from attributes\n if (this.durationLabels) {\n const durationSlots = generateDurationSlots(this.startTime, this.endTime, this.interval, this.format);\n return durationSlots.map((slot) => ({\n ...slot,\n available: !this._unavailableTimes.includes(slot.time),\n }));\n }\n const times = generateSlots(this.startTime, this.endTime, this.interval);\n return times.map((time) => ({\n time,\n available: !this._unavailableTimes.includes(time),\n }));\n }\n\n connectedCallback() {\n super.connectedCallback();\n this._unsubscribe = this._store.subscribe((state, prev) => {\n if (this._rendering) return;\n // Hover-only → lightweight update\n const hoverOnly = state.hoverTime !== prev.hoverTime\n && state.selected === prev.selected\n && state.rangeStart === prev.rangeStart\n && state.isOpen === prev.isOpen;\n hoverOnly ? this._updateSlotHighlight(state) : this.render();\n });\n\n // Parse initial value attribute\n const valueAttr = this.getAttribute('value');\n if (valueAttr) {\n if (this.mode === 'multi' && valueAttr.includes(',')) {\n this.value = valueAttr.split(',').map((t) => t.trim());\n } else if (this.mode === 'range' && valueAttr.includes('/')) {\n const [start, end] = valueAttr.split('/');\n this.value = { start: start.trim(), end: end.trim() };\n } else {\n this.value = valueAttr;\n }\n }\n }\n\n disconnectedCallback() {\n this._unsubscribe?.();\n this._popover?.destroy();\n clearTimeout(this._statusTimer);\n }\n\n attributeChangedCallback(name, oldVal, newVal) {\n if (oldVal === newVal) return;\n if (name === 'value' && this._initialized) {\n if (this.mode === 'multi' && newVal && newVal.includes(',')) {\n this.value = newVal.split(',').map((t) => t.trim());\n } else if (this.mode === 'range' && newVal && newVal.includes('/')) {\n const [start, end] = newVal.split('/');\n this.value = { start: start.trim(), end: end.trim() };\n } else {\n this.value = newVal;\n }\n }\n if (this._initialized) this.render();\n }\n\n // -- Selection --\n _handleSelect(time) {\n const state = this._store.getState();\n\n if (this.mode === 'single') {\n this._store.set({ selected: time });\n this.emit('cal:time-change', { value: time });\n if (this.display === 'popover') this.close();\n } else if (this.mode === 'multi') {\n const current = Array.isArray(state.selected) ? [...state.selected] : [];\n const idx = current.indexOf(time);\n if (idx >= 0) {\n current.splice(idx, 1);\n } else {\n current.push(time);\n }\n current.sort((a, b) => timeToMinutes(a) - timeToMinutes(b));\n this._store.set({ selected: current });\n this.emit('cal:time-change', { value: current });\n } else if (this.mode === 'range') {\n if (!state.rangeStart || (state.selected && typeof state.selected === 'object' && state.selected.start && state.selected.end)) {\n // Start new range\n this._store.set({ rangeStart: time, selected: null, hoverTime: null });\n } else {\n // Complete range\n let start = state.rangeStart;\n let end = time;\n if (timeToMinutes(start) > timeToMinutes(end)) [start, end] = [end, start];\n const value = { start, end };\n this._store.set({ selected: value, rangeStart: null, hoverTime: null });\n this.emit('cal:time-change', { value });\n if (this.display === 'popover') this.close();\n }\n }\n }\n\n _handleHover(time) {\n if (this.mode === 'range') {\n this._store.set({ hoverTime: time });\n }\n }\n\n // -- Lightweight hover highlight --\n _updateSlotHighlight(state) {\n const buttons = this.$$('.cal-time-slot');\n const { rangeStart, hoverTime, selected } = state;\n const rangeComplete = selected && typeof selected === 'object' && selected.start && selected.end;\n\n for (const btn of buttons) {\n const time = btn.dataset.time;\n if (!time || btn.disabled) continue;\n\n if (rangeStart && !rangeComplete && hoverTime) {\n const lo = timeToMinutes(rangeStart) < timeToMinutes(hoverTime) ? rangeStart : hoverTime;\n const hi = timeToMinutes(rangeStart) < timeToMinutes(hoverTime) ? hoverTime : rangeStart;\n const t = timeToMinutes(time);\n const inRange = t > timeToMinutes(lo) && t < timeToMinutes(hi);\n const isStart = time === rangeStart;\n const isEnd = time === hoverTime;\n\n btn.classList.toggle('cal-time-slot--range-start', isStart);\n btn.classList.toggle('cal-time-slot--range-end', isEnd);\n btn.classList.toggle('cal-time-slot--in-range', inRange);\n } else if (!rangeStart) {\n btn.classList.remove('cal-time-slot--range-start', 'cal-time-slot--range-end', 'cal-time-slot--in-range');\n }\n }\n }\n\n // -- Public API --\n open() {\n if (this._popover) {\n this._popover.open();\n this._store.set({ isOpen: true });\n this.emit('cal:open');\n }\n }\n\n close() {\n if (this._popover) {\n this._popover.close();\n this._store.set({ isOpen: false });\n this.emit('cal:close');\n }\n }\n\n // -- Render --\n _renderTimepickerContent() {\n const state = this._store.getState();\n const container = document.createElement('div');\n container.classList.add('cal-timepicker');\n\n // Status banner\n if (state.statusType && state.statusMessage) {\n container.appendChild(renderStatusMessage({\n type: state.statusType,\n message: state.statusMessage,\n dismissible: state.statusDismissible,\n onDismiss: () => this.clearStatus(),\n }));\n }\n\n const header = document.createElement('div');\n header.classList.add('cal-timepicker__header');\n header.textContent = 'Select Time';\n container.appendChild(header);\n\n if (this.loading) {\n container.appendChild(renderTimeGridSkeleton({ durationLabels: this.durationLabels }));\n } else {\n const slots = this._getEffectiveSlots();\n const grid = renderTimeGrid({\n slots,\n mode: this.mode,\n format: this.format,\n selected: state.selected,\n hoverTime: state.hoverTime,\n rangeStart: state.rangeStart,\n unavailableTimes: this._unavailableTimes,\n onSelect: (t) => this._handleSelect(t),\n onHover: (t) => this._handleHover(t),\n durationLabels: this.durationLabels,\n });\n container.appendChild(grid);\n }\n\n return container;\n }\n\n _formatTriggerText() {\n const state = this._store.getState();\n if (!state.selected) return null;\n if (this.mode === 'single' && typeof state.selected === 'string') {\n return state.selected;\n }\n if (this.mode === 'multi' && Array.isArray(state.selected) && state.selected.length) {\n return `${state.selected.length} time${state.selected.length > 1 ? 's' : ''} selected`;\n }\n if (this.mode === 'range' && typeof state.selected === 'object' && state.selected.start) {\n return `${state.selected.start} – ${state.selected.end}`;\n }\n return null;\n }\n\n render() {\n if (this._rendering) return;\n this._rendering = true;\n\n const root = this.shadowRoot;\n\n // Clear non-style children\n const children = [...root.childNodes];\n for (const child of children) {\n if (child.nodeName !== 'STYLE' && !(child instanceof CSSStyleSheet)) {\n root.removeChild(child);\n }\n }\n\n this._popover?.destroy();\n this._popover = null;\n\n if (this.display === 'popover') {\n const wrapper = document.createElement('div');\n wrapper.classList.add('cal-popover-wrapper');\n\n const trigger = document.createElement('button');\n trigger.classList.add('cal-trigger');\n\n const icon = document.createElement('span');\n icon.classList.add('cal-trigger__icon');\n icon.innerHTML = clockIcon;\n trigger.appendChild(icon);\n\n const text = this._formatTriggerText();\n const label = document.createElement('span');\n if (text) {\n label.textContent = text;\n } else {\n label.textContent = this.placeholder;\n label.classList.add('cal-trigger--placeholder');\n }\n trigger.appendChild(label);\n wrapper.appendChild(trigger);\n\n const content = this._renderTimepickerContent();\n const popover = createPopover({\n trigger,\n content,\n onClose: () => {\n this._store.set({ isOpen: false });\n this.emit('cal:close');\n },\n });\n\n wrapper.appendChild(popover.panel);\n root.appendChild(wrapper);\n\n trigger.addEventListener('click', (e) => {\n e.stopPropagation();\n if (popover.isOpen) {\n this.close();\n } else {\n this.open();\n }\n });\n\n this._popover = popover;\n if (this._store.get('isOpen')) {\n popover.open();\n }\n } else {\n root.appendChild(this._renderTimepickerContent());\n }\n\n this._rendering = false;\n }\n}\n","/**\n * Scheduler utility functions — week computation, overlap resolution, time/pixel math.\n */\n\nimport { parseDate, toDateString, addDays, today } from './dates.js';\nimport { timeToMinutes, minutesToTime } from './times.js';\nimport { MONTH_NAMES } from './dates.js';\n\n/**\n * Get the start of the week containing dateStr.\n * @param {string} dateStr - ISO date string\n * @param {number} firstDay - 0=Sun, 1=Mon, etc.\n * @returns {string} ISO date string of week start\n */\nexport function getWeekStart(dateStr, firstDay = 0) {\n const d = parseDate(dateStr);\n if (!d) return dateStr;\n const day = d.getDay();\n const diff = (day - firstDay + 7) % 7;\n d.setDate(d.getDate() - diff);\n return toDateString(d);\n}\n\n/**\n * Get all 7 dates of the week containing dateStr.\n * @param {string} dateStr - ISO date string\n * @param {number} firstDay - 0=Sun, 1=Mon, etc.\n * @returns {string[]} 7 ISO date strings\n */\nexport function getWeekDates(dateStr, firstDay = 0) {\n const start = getWeekStart(dateStr, firstDay);\n const dates = [];\n for (let i = 0; i < 7; i++) {\n dates.push(addDays(start, i));\n }\n return dates;\n}\n\n/**\n * Get display title for the current view.\n * @param {'day'|'week'|'month'} view\n * @param {string} anchorDate - ISO date\n * @param {string[]} weekDates - for week view\n * @returns {string}\n */\nexport function getViewTitle(view, anchorDate, weekDates) {\n const d = parseDate(anchorDate);\n if (!d) return '';\n\n if (view === 'day') {\n return `${MONTH_NAMES[d.getMonth()]} ${d.getDate()}, ${d.getFullYear()}`;\n }\n\n if (view === 'week' && weekDates && weekDates.length === 7) {\n const first = parseDate(weekDates[0]);\n const last = parseDate(weekDates[6]);\n if (!first || !last) return '';\n if (first.getMonth() === last.getMonth()) {\n return `${MONTH_NAMES[first.getMonth()]} ${first.getDate()}\\u2013${last.getDate()}, ${first.getFullYear()}`;\n }\n if (first.getFullYear() === last.getFullYear()) {\n return `${MONTH_NAMES[first.getMonth()].slice(0, 3)} ${first.getDate()} \\u2013 ${MONTH_NAMES[last.getMonth()].slice(0, 3)} ${last.getDate()}, ${first.getFullYear()}`;\n }\n return `${MONTH_NAMES[first.getMonth()].slice(0, 3)} ${first.getDate()}, ${first.getFullYear()} \\u2013 ${MONTH_NAMES[last.getMonth()].slice(0, 3)} ${last.getDate()}, ${last.getFullYear()}`;\n }\n\n if (view === 'month') {\n return `${MONTH_NAMES[d.getMonth()]} ${d.getFullYear()}`;\n }\n\n return '';\n}\n\n/**\n * Filter events that fall on a specific date.\n * @param {Event[]} events\n * @param {string} dateStr - ISO date\n * @returns {Event[]}\n */\nexport function getEventsForDate(events, dateStr) {\n return events.filter((ev) => {\n if (!ev.start) return false;\n // All-day or multi-day event\n if (ev.end && ev.end !== ev.start) {\n return dateStr >= ev.start && dateStr <= ev.end;\n }\n return ev.start === dateStr;\n });\n}\n\n/**\n * Filter events that overlap with a date range.\n * @param {Event[]} events\n * @param {string} startDate\n * @param {string} endDate\n * @returns {Event[]}\n */\nexport function getEventsForRange(events, startDate, endDate) {\n return events.filter((ev) => {\n if (!ev.start) return false;\n const evEnd = ev.end || ev.start;\n return ev.start <= endDate && evEnd >= startDate;\n });\n}\n\n/**\n * Resolve overlapping timed events for side-by-side stacking.\n * Adds _col and _totalCols to each event.\n * @param {Event[]} events - timed events for a single day+resource\n * @returns {Event[]} same events with _col and _totalCols set\n */\nexport function resolveEventOverlaps(events) {\n if (!events.length) return events;\n\n // Sort by start time, then by duration (longer first)\n const sorted = [...events].sort((a, b) => {\n const aStart = timeToMinutes(a.startTime || '00:00');\n const bStart = timeToMinutes(b.startTime || '00:00');\n if (aStart !== bStart) return aStart - bStart;\n const aEnd = timeToMinutes(a.endTime || '23:59');\n const bEnd = timeToMinutes(b.endTime || '23:59');\n return (bEnd - bStart) - (aEnd - aStart);\n });\n\n // Build overlap groups\n const columns = []; // each column tracks the end time of its last event\n\n for (const ev of sorted) {\n const evStart = timeToMinutes(ev.startTime || '00:00');\n const evEnd = timeToMinutes(ev.endTime || '23:59');\n\n // Find first column where event fits (no overlap)\n let placed = false;\n for (let c = 0; c < columns.length; c++) {\n if (evStart >= columns[c]) {\n ev._col = c;\n columns[c] = evEnd;\n placed = true;\n break;\n }\n }\n if (!placed) {\n ev._col = columns.length;\n columns.push(evEnd);\n }\n }\n\n // Calculate total columns for each group of overlapping events\n // Simple approach: for each event, total cols = max columns used by overlapping events\n for (const ev of sorted) {\n const evStart = timeToMinutes(ev.startTime || '00:00');\n const evEnd = timeToMinutes(ev.endTime || '23:59');\n let maxCol = ev._col;\n for (const other of sorted) {\n const oStart = timeToMinutes(other.startTime || '00:00');\n const oEnd = timeToMinutes(other.endTime || '23:59');\n if (oStart < evEnd && oEnd > evStart) {\n maxCol = Math.max(maxCol, other._col);\n }\n }\n ev._totalCols = maxCol + 1;\n }\n\n return sorted;\n}\n\n/**\n * Convert a time string to pixel offset from grid start.\n * @param {string} timeStr - \"HH:MM\"\n * @param {string} startTime - grid start time\n * @param {number} slotSize - pixels per slot\n * @param {number} interval - minutes per slot\n * @returns {number}\n */\nexport function timeToPixelOffset(timeStr, startTime, slotSize, interval) {\n const mins = timeToMinutes(timeStr) - timeToMinutes(startTime);\n return (mins / interval) * slotSize;\n}\n\n/**\n * Convert pixel offset to time string.\n * @param {number} px - pixel offset\n * @param {string} startTime - grid start time\n * @param {number} slotSize - pixels per slot\n * @param {number} interval - minutes per slot\n * @returns {string} \"HH:MM\"\n */\nexport function pixelOffsetToTime(px, startTime, slotSize, interval) {\n const mins = (px / slotSize) * interval;\n const totalMins = timeToMinutes(startTime) + mins;\n return minutesToTime(Math.round(totalMins));\n}\n\n/**\n * Snap a time to the nearest slot boundary.\n * @param {string} timeStr - \"HH:MM\"\n * @param {number} interval - minutes\n * @returns {string} snapped \"HH:MM\"\n */\nexport function snapToSlot(timeStr, interval) {\n const mins = timeToMinutes(timeStr);\n const snapped = Math.round(mins / interval) * interval;\n return minutesToTime(snapped);\n}\n","/**\n * Scheduler data utilities — event filtering, availability engine.\n */\n\nimport { timeToMinutes, minutesToTime } from '../../core/times.js';\nimport { addDays, today } from '../../core/dates.js';\nimport { getEventsForDate } from '../../core/scheduler-utils.js';\n\n/**\n * Get events for a specific resource on a specific date.\n * @param {Event[]} events\n * @param {string} resourceId\n * @param {string} dateStr\n * @returns {Event[]}\n */\nexport function getResourceDayEvents(events, resourceId, dateStr) {\n return getEventsForDate(events, dateStr).filter(\n (ev) => ev.resourceId === resourceId\n );\n}\n\n/**\n * Check if a time slot is available for a resource on a date.\n * @param {Event[]} events\n * @param {string} resourceId\n * @param {string} dateStr\n * @param {string} startTime - \"HH:MM\"\n * @param {string} endTime - \"HH:MM\"\n * @returns {boolean}\n */\nexport function isSlotAvailable(events, resourceId, dateStr, startTime, endTime) {\n const dayEvents = getResourceDayEvents(events, resourceId, dateStr);\n const slotStart = timeToMinutes(startTime);\n const slotEnd = timeToMinutes(endTime);\n\n for (const ev of dayEvents) {\n // Skip all-day events in time-slot checks\n if (!ev.startTime || !ev.endTime) continue;\n const evStart = timeToMinutes(ev.startTime);\n const evEnd = timeToMinutes(ev.endTime);\n if (slotStart < evEnd && slotEnd > evStart) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Find the first available slot matching criteria.\n * Searches up to 14 days from opts.date (or today).\n * @param {object} opts\n * @param {string} [opts.date] - start searching from this date\n * @param {number} opts.duration - required duration in minutes\n * @param {string} [opts.resourceId] - specific resource, or search all\n * @param {number} [opts.minCapacity] - minimum resource capacity\n * @param {Resource[]} resources\n * @param {Event[]} events\n * @param {number} interval - slot interval in minutes\n * @param {string} [dayStart='08:00'] - day grid start\n * @param {string} [dayEnd='18:00'] - day grid end\n * @returns {{ resourceId: string, date: string, startTime: string, endTime: string } | null}\n */\nexport function findAvailableSlot(opts, resources, events, interval, dayStart = '08:00', dayEnd = '18:00') {\n const { duration, resourceId, minCapacity } = opts;\n const startDate = opts.date || today();\n const searchDays = 14;\n\n // Filter resources\n let candidateResources = resources;\n if (resourceId) {\n candidateResources = resources.filter((r) => r.id === resourceId);\n }\n if (minCapacity) {\n candidateResources = candidateResources.filter(\n (r) => r.capacity && r.capacity >= minCapacity\n );\n }\n\n const dayStartMin = timeToMinutes(dayStart);\n const dayEndMin = timeToMinutes(dayEnd);\n\n for (let d = 0; d < searchDays; d++) {\n const dateStr = addDays(startDate, d);\n\n for (const resource of candidateResources) {\n // Try each slot\n for (let m = dayStartMin; m + duration <= dayEndMin; m += interval) {\n const slotStart = minutesToTime(m);\n const slotEnd = minutesToTime(m + duration);\n\n if (isSlotAvailable(events, resource.id, dateStr, slotStart, slotEnd)) {\n return {\n resourceId: resource.id,\n date: dateStr,\n startTime: slotStart,\n endTime: slotEnd,\n };\n }\n }\n }\n }\n\n return null;\n}\n","/**\n * Scheduler navigation renderer — prev/next/today + Day/Week/Month view tabs.\n */\n\nimport { chevronLeft, chevronRight } from '../datepicker/navigation.js';\n\n/**\n * Render the scheduler navigation bar.\n * @param {object} options\n * @param {string} options.title - current view title\n * @param {'day'|'week'|'month'} options.view - current view\n * @param {function} options.onPrev\n * @param {function} options.onNext\n * @param {function} options.onToday\n * @param {function} options.onViewChange - called with new view string\n * @returns {HTMLElement}\n */\nexport function renderSchedulerNav({ title, view, onPrev, onNext, onToday, onViewChange }) {\n const nav = document.createElement('div');\n nav.classList.add('cal-sched-nav');\n\n // Left group: prev / next / today / title\n const left = document.createElement('div');\n left.classList.add('cal-sched-nav__left');\n\n const prevBtn = document.createElement('button');\n prevBtn.classList.add('cal-sched-nav__btn');\n prevBtn.innerHTML = chevronLeft;\n prevBtn.setAttribute('aria-label', 'Previous');\n prevBtn.addEventListener('click', onPrev);\n\n const nextBtn = document.createElement('button');\n nextBtn.classList.add('cal-sched-nav__btn');\n nextBtn.innerHTML = chevronRight;\n nextBtn.setAttribute('aria-label', 'Next');\n nextBtn.addEventListener('click', onNext);\n\n const todayBtn = document.createElement('button');\n todayBtn.classList.add('cal-sched-nav__today');\n todayBtn.textContent = 'Today';\n todayBtn.addEventListener('click', onToday);\n\n const titleEl = document.createElement('span');\n titleEl.classList.add('cal-sched-nav__title');\n titleEl.setAttribute('aria-live', 'polite');\n titleEl.textContent = title;\n\n left.appendChild(prevBtn);\n left.appendChild(nextBtn);\n left.appendChild(todayBtn);\n left.appendChild(titleEl);\n\n // Right group: view tabs\n const tabs = document.createElement('div');\n tabs.classList.add('cal-sched-nav__tabs');\n\n for (const v of ['day', 'week', 'month']) {\n const tab = document.createElement('button');\n tab.classList.add('cal-sched-nav__tab');\n if (v === view) tab.classList.add('cal-sched-nav__tab--active');\n tab.textContent = v.charAt(0).toUpperCase() + v.slice(1);\n tab.addEventListener('click', () => onViewChange(v));\n tabs.appendChild(tab);\n }\n\n nav.appendChild(left);\n nav.appendChild(tabs);\n\n return nav;\n}\n\nexport const schedulerNavStyles = `\n .cal-sched-nav {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 0;\n gap: 8px;\n }\n\n .cal-sched-nav__left {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n\n .cal-sched-nav__btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border-radius: var(--cal-radius-sm);\n color: hsl(var(--cal-fg));\n transition: background var(--cal-transition);\n }\n\n .cal-sched-nav__btn:hover {\n background: hsl(var(--cal-hover));\n }\n\n .cal-sched-nav__today {\n font-size: 13px;\n font-weight: 500;\n color: hsl(var(--cal-fg));\n padding: 4px 12px;\n border-radius: var(--cal-radius-sm);\n border: 1px solid hsl(var(--cal-border));\n margin-left: 4px;\n margin-right: 8px;\n transition: background var(--cal-transition);\n }\n\n .cal-sched-nav__today:hover {\n background: hsl(var(--cal-hover));\n }\n\n .cal-sched-nav__title {\n font-size: 14px;\n font-weight: 600;\n color: hsl(var(--cal-fg));\n user-select: none;\n }\n\n .cal-sched-nav__tabs {\n display: flex;\n gap: 0;\n border: 1px solid hsl(var(--cal-border));\n border-radius: var(--cal-radius-sm);\n overflow: hidden;\n }\n\n .cal-sched-nav__tab {\n font-size: 13px;\n font-weight: 500;\n color: hsl(var(--cal-fg-muted));\n padding: 4px 12px;\n transition: all var(--cal-transition);\n border-right: 1px solid hsl(var(--cal-border));\n }\n\n .cal-sched-nav__tab:last-child {\n border-right: none;\n }\n\n .cal-sched-nav__tab:hover {\n background: hsl(var(--cal-hover));\n color: hsl(var(--cal-fg));\n }\n\n .cal-sched-nav__tab--active {\n background: hsl(var(--cal-accent));\n color: hsl(var(--cal-accent-fg));\n }\n\n .cal-sched-nav__tab--active:hover {\n background: hsl(var(--cal-accent));\n color: hsl(var(--cal-accent-fg));\n }\n`;\n","/**\n * Time axis renderer — hour labels along the time axis.\n */\n\nimport { generateSlots, parseTime, formatTime } from '../../core/times.js';\n\n/**\n * Render the time axis with hour labels.\n * @param {object} options\n * @param {string} options.startTime - \"HH:MM\"\n * @param {string} options.endTime - \"HH:MM\"\n * @param {number} options.interval - minutes per slot\n * @param {number} options.slotHeight - pixels per slot\n * @param {'12h'|'24h'} options.format\n * @returns {HTMLElement}\n */\nexport function renderTimeAxis({ startTime, endTime, interval, slotHeight, format }) {\n const axis = document.createElement('div');\n axis.classList.add('cal-sched-time-axis');\n\n const slots = generateSlots(startTime, endTime, interval);\n const slotsPerHour = 60 / interval;\n\n for (let i = 0; i < slots.length; i++) {\n const time = slots[i];\n const parsed = parseTime(time);\n if (!parsed) continue;\n\n const slot = document.createElement('div');\n slot.classList.add('cal-sched-time-axis__slot');\n slot.style.height = `${slotHeight}px`;\n\n // Only show label at hour boundaries\n if (parsed.minutes === 0) {\n const label = document.createElement('span');\n label.classList.add('cal-sched-time-axis__label');\n label.textContent = formatTime(parsed.hours, parsed.minutes, format);\n slot.appendChild(label);\n }\n\n axis.appendChild(slot);\n }\n\n return axis;\n}\n\nexport const timeAxisStyles = `\n .cal-sched-time-axis {\n display: flex;\n flex-direction: column;\n flex-shrink: 0;\n width: 56px;\n border-right: 1px solid hsl(var(--cal-sched-grid-line));\n }\n\n .cal-sched-time-axis__slot {\n position: relative;\n display: flex;\n align-items: flex-start;\n justify-content: flex-end;\n padding-right: 8px;\n border-bottom: 1px solid hsl(var(--cal-sched-grid-line));\n }\n\n .cal-sched-time-axis__label {\n font-size: 11px;\n color: hsl(var(--cal-fg-muted));\n transform: translateY(-7px);\n white-space: nowrap;\n user-select: none;\n }\n`;\n","/**\n * Resource header renderer — resource names with color dot + optional capacity badge.\n */\n\n/**\n * Render a resource header cell.\n * @param {object} options\n * @param {object} options.resource - { id, name, color?, capacity? }\n * @param {number} [options.width] - optional fixed width\n * @returns {HTMLElement}\n */\nexport function renderResourceHeader({ resource, width }) {\n const header = document.createElement('div');\n header.classList.add('cal-sched-resource-header');\n if (width) header.style.width = `${width}px`;\n header.style.flex = width ? `0 0 ${width}px` : '1 1 0';\n\n const dot = document.createElement('span');\n dot.classList.add('cal-sched-resource-header__dot');\n const color = resource.color || 'blue';\n dot.style.background = `hsl(var(--cal-booking-${color}-fg))`;\n header.appendChild(dot);\n\n const name = document.createElement('span');\n name.classList.add('cal-sched-resource-header__name');\n name.textContent = resource.name;\n header.appendChild(name);\n\n if (resource.capacity) {\n const badge = document.createElement('span');\n badge.classList.add('cal-sched-resource-header__capacity');\n badge.textContent = resource.capacity;\n badge.setAttribute('title', `Capacity: ${resource.capacity}`);\n header.appendChild(badge);\n }\n\n return header;\n}\n\n/**\n * Render a row of resource headers.\n * @param {object} options\n * @param {object[]} options.resources\n * @returns {HTMLElement}\n */\nexport function renderResourceHeaderRow({ resources }) {\n const row = document.createElement('div');\n row.classList.add('cal-sched-resource-header-row');\n\n for (const resource of resources) {\n row.appendChild(renderResourceHeader({ resource }));\n }\n\n return row;\n}\n\nexport const resourceHeaderStyles = `\n .cal-sched-resource-header-row {\n display: flex;\n border-bottom: 1px solid hsl(var(--cal-sched-grid-line));\n background: hsl(var(--cal-sched-header-bg));\n }\n\n .cal-sched-resource-header {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px;\n min-width: 0;\n border-right: 1px solid hsl(var(--cal-sched-grid-line));\n }\n\n .cal-sched-resource-header:last-child {\n border-right: none;\n }\n\n .cal-sched-resource-header__dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex-shrink: 0;\n }\n\n .cal-sched-resource-header__name {\n font-size: 13px;\n font-weight: 500;\n color: hsl(var(--cal-fg));\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .cal-sched-resource-header__capacity {\n font-size: 11px;\n color: hsl(var(--cal-fg-muted));\n background: hsl(var(--cal-bg-muted));\n padding: 1px 6px;\n border-radius: 999px;\n flex-shrink: 0;\n }\n`;\n","/**\n * Event block renderer — absolutely positioned card for timed events.\n */\n\nimport { timeToPixelOffset } from '../../core/scheduler-utils.js';\nimport { parseTime, formatTime } from '../../core/times.js';\n\n/**\n * Render an event block (timed event card).\n * @param {object} options\n * @param {object} options.event - event object\n * @param {string} options.gridStartTime - grid start time\n * @param {number} options.slotHeight - pixels per slot\n * @param {number} options.interval - minutes per slot\n * @param {'12h'|'24h'} options.format\n * @param {function} [options.onClick]\n * @param {function} [options.eventContent] - custom content renderer\n * @param {boolean} [options.showTime] - show time row in default rendering\n * @param {object} [options.resource] - resource object\n * @param {boolean} [options.draggable] - enable drag handles\n * @returns {HTMLElement}\n */\nexport function renderEventBlock({ event, gridStartTime, slotHeight, interval, format, onClick, eventContent, showTime = true, resource, draggable }) {\n const block = document.createElement('div');\n block.classList.add('cal-sched-event');\n block.setAttribute('role', 'button');\n block.setAttribute('tabindex', '0');\n block.dataset.eventId = event.id;\n\n const isLocked = !!event.locked;\n\n if (draggable && !isLocked) {\n block.dataset.draggable = 'true';\n }\n\n if (isLocked) {\n block.classList.add('cal-sched-event--locked');\n }\n\n const color = event.color || 'blue';\n block.style.setProperty('--ev-bg', `var(--cal-booking-${color}-bg)`);\n block.style.setProperty('--ev-fg', `var(--cal-booking-${color}-fg)`);\n\n // Position\n if (event.startTime && event.endTime) {\n const top = timeToPixelOffset(event.startTime, gridStartTime, slotHeight, interval);\n const bottom = timeToPixelOffset(event.endTime, gridStartTime, slotHeight, interval);\n const height = Math.max(bottom - top, slotHeight * 0.5);\n block.style.top = `${top}px`;\n block.style.height = `${height}px`;\n\n // Overlap columns\n if (event._totalCols > 1) {\n const colWidth = 100 / event._totalCols;\n block.style.left = `${event._col * colWidth}%`;\n block.style.width = `${colWidth}%`;\n }\n }\n\n // Content\n if (typeof eventContent === 'function') {\n const custom = eventContent(event, resource);\n const wrapper = document.createElement('div');\n wrapper.classList.add('cal-sched-event__custom');\n if (custom instanceof HTMLElement) {\n wrapper.appendChild(custom);\n } else if (custom != null) {\n wrapper.textContent = String(custom);\n }\n block.appendChild(wrapper);\n } else {\n const title = document.createElement('div');\n title.classList.add('cal-sched-event__title');\n title.textContent = event.title || '';\n block.appendChild(title);\n\n if (showTime && event.startTime && event.endTime) {\n const time = document.createElement('div');\n time.classList.add('cal-sched-event__time');\n const startParsed = parseTime(event.startTime);\n const endParsed = parseTime(event.endTime);\n if (startParsed && endParsed) {\n time.textContent = `${formatTime(startParsed.hours, startParsed.minutes, format)}\\u2013${formatTime(endParsed.hours, endParsed.minutes, format)}`;\n }\n block.appendChild(time);\n }\n }\n\n // Resize handle for draggable events (skip locked)\n if (draggable && !isLocked) {\n const handle = document.createElement('div');\n handle.classList.add('cal-sched-event__resize-handle');\n block.appendChild(handle);\n }\n\n if (onClick) {\n block.addEventListener('click', (e) => {\n if (block.dataset.wasDragged) {\n delete block.dataset.wasDragged;\n return;\n }\n e.stopPropagation();\n onClick(event);\n });\n block.addEventListener('keydown', (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n e.stopPropagation();\n onClick(event);\n }\n });\n }\n\n return block;\n}\n\n/**\n * Render an all-day event chip.\n * @param {object} options\n * @param {object} options.event\n * @param {function} [options.onClick]\n * @param {function} [options.eventContent] - custom content renderer\n * @param {object} [options.resource] - resource object\n * @returns {HTMLElement}\n */\nexport function renderAllDayChip({ event, onClick, eventContent, resource }) {\n const chip = document.createElement('div');\n chip.classList.add('cal-sched-allday-chip');\n chip.dataset.eventId = event.id;\n\n const color = event.color || 'blue';\n chip.style.setProperty('--ev-bg', `var(--cal-booking-${color}-bg)`);\n chip.style.setProperty('--ev-fg', `var(--cal-booking-${color}-fg)`);\n\n if (typeof eventContent === 'function') {\n const custom = eventContent(event, resource);\n if (custom instanceof HTMLElement) {\n chip.appendChild(custom);\n } else if (custom != null) {\n chip.textContent = String(custom);\n }\n } else {\n chip.textContent = event.title || '';\n }\n\n if (onClick) {\n chip.addEventListener('click', (e) => {\n e.stopPropagation();\n onClick(event);\n });\n }\n\n return chip;\n}\n\n/**\n * Render a month-view event chip (small pill).\n * @param {object} options\n * @param {object} options.event\n * @param {'12h'|'24h'} options.format\n * @param {function} [options.onClick]\n * @param {function} [options.eventContent] - custom content renderer\n * @param {object} [options.resource] - resource object\n * @returns {HTMLElement}\n */\nexport function renderMonthChip({ event, format, onClick, eventContent, resource }) {\n const chip = document.createElement('div');\n chip.classList.add('cal-sched-month-chip');\n chip.dataset.eventId = event.id;\n\n const color = event.color || 'blue';\n chip.style.setProperty('--ev-bg', `var(--cal-booking-${color}-bg)`);\n chip.style.setProperty('--ev-fg', `var(--cal-booking-${color}-fg)`);\n\n if (typeof eventContent === 'function') {\n const custom = eventContent(event, resource);\n if (custom instanceof HTMLElement) {\n chip.appendChild(custom);\n } else if (custom != null) {\n chip.textContent = String(custom);\n }\n } else {\n const dot = document.createElement('span');\n dot.classList.add('cal-sched-month-chip__dot');\n dot.style.background = `hsl(var(--cal-booking-${color}-fg))`;\n chip.appendChild(dot);\n\n const text = document.createElement('span');\n text.classList.add('cal-sched-month-chip__text');\n if (event.startTime) {\n const parsed = parseTime(event.startTime);\n const timeStr = parsed ? formatTime(parsed.hours, parsed.minutes, format) : event.startTime;\n text.textContent = `${timeStr} ${event.title || ''}`;\n } else {\n text.textContent = event.title || '';\n }\n chip.appendChild(text);\n }\n\n if (onClick) {\n chip.addEventListener('click', (e) => {\n e.stopPropagation();\n onClick(event);\n });\n }\n\n return chip;\n}\n\nexport const eventBlockStyles = `\n .cal-sched-event {\n position: absolute;\n left: 2px;\n right: 2px;\n background: hsl(var(--ev-bg));\n color: hsl(var(--ev-fg));\n border-left: 3px solid hsl(var(--ev-fg));\n border-radius: var(--cal-radius-sm);\n padding: 2px 6px;\n font-size: 12px;\n line-height: 1.3;\n overflow: hidden;\n cursor: pointer;\n transition: box-shadow var(--cal-transition);\n z-index: 1;\n }\n\n .cal-sched-event:hover {\n box-shadow: 0 2px 8px -2px rgba(0, 0, 0, 0.1);\n z-index: 2;\n }\n\n .cal-sched-event:focus-visible {\n outline: 2px solid hsl(var(--cal-ring));\n outline-offset: 1px;\n }\n\n .cal-sched-event__title {\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .cal-sched-event__time {\n font-size: 11px;\n opacity: 0.8;\n white-space: nowrap;\n }\n\n .cal-sched-event__custom {\n overflow: hidden;\n }\n\n .cal-sched-event--locked {\n cursor: default;\n opacity: 0.85;\n }\n\n .cal-sched-event--locked::after {\n content: '';\n position: absolute;\n top: 3px;\n right: 4px;\n width: 10px;\n height: 10px;\n background: currentColor;\n opacity: 0.25;\n mask-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='currentColor'%3E%3Cpath d='M11 5V4a3 3 0 0 0-6 0v1H4v7h8V5h-1ZM6 4a2 2 0 1 1 4 0v1H6V4Z'/%3E%3C/svg%3E\");\n mask-size: contain;\n mask-repeat: no-repeat;\n -webkit-mask-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='currentColor'%3E%3Cpath d='M11 5V4a3 3 0 0 0-6 0v1H4v7h8V5h-1ZM6 4a2 2 0 1 1 4 0v1H6V4Z'/%3E%3C/svg%3E\");\n -webkit-mask-size: contain;\n -webkit-mask-repeat: no-repeat;\n }\n\n .cal-sched-allday-chip {\n background: hsl(var(--ev-bg));\n color: hsl(var(--ev-fg));\n border-left: 3px solid hsl(var(--ev-fg));\n border-radius: var(--cal-radius-sm);\n padding: 2px 8px;\n font-size: 12px;\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n cursor: pointer;\n transition: box-shadow var(--cal-transition);\n }\n\n .cal-sched-allday-chip:hover {\n box-shadow: 0 2px 8px -2px rgba(0, 0, 0, 0.1);\n }\n\n .cal-sched-month-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n background: hsl(var(--ev-bg));\n color: hsl(var(--ev-fg));\n border-radius: var(--cal-radius-sm);\n padding: 1px 6px;\n font-size: 11px;\n cursor: pointer;\n overflow: hidden;\n transition: box-shadow var(--cal-transition);\n }\n\n .cal-sched-month-chip:hover {\n box-shadow: 0 2px 8px -2px rgba(0, 0, 0, 0.1);\n }\n\n .cal-sched-month-chip__dot {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n flex-shrink: 0;\n }\n\n .cal-sched-month-chip__text {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n`;\n","/**\n * Slot selection prompt — small floating card anchored to a selected slot.\n */\n\nimport { parseTime, formatTime } from '../../core/times.js';\n\n/**\n * Render the slot prompt card.\n * @param {object} options\n * @param {string} options.date - ISO date string\n * @param {string} [options.startTime] - slot start time (null for month view)\n * @param {string} [options.endTime] - slot end time (null for month view)\n * @param {string} [options.resourceName] - resource label to display\n * @param {'12h'|'24h'} [options.format] - time format\n * @param {function} options.onCreate - called when \"+\" button is clicked\n * @returns {HTMLElement}\n */\nexport function renderSlotPrompt({ date, startTime, endTime, resourceName, format, onCreate }) {\n const card = document.createElement('div');\n card.classList.add('cal-sched-slot-prompt', 'cal-animate-fade');\n\n const info = document.createElement('div');\n info.classList.add('cal-sched-slot-prompt__info');\n\n // Time range (day/week views)\n if (startTime && endTime) {\n const startP = parseTime(startTime);\n const endP = parseTime(endTime);\n const timeEl = document.createElement('div');\n timeEl.classList.add('cal-sched-slot-prompt__time');\n if (startP && endP) {\n timeEl.textContent = `${formatTime(startP.hours, startP.minutes, format)}\\u2013${formatTime(endP.hours, endP.minutes, format)}`;\n }\n info.appendChild(timeEl);\n } else {\n // Month view — show date\n const dateEl = document.createElement('div');\n dateEl.classList.add('cal-sched-slot-prompt__time');\n dateEl.textContent = date;\n info.appendChild(dateEl);\n }\n\n // Resource name\n if (resourceName) {\n const resEl = document.createElement('div');\n resEl.classList.add('cal-sched-slot-prompt__resource');\n resEl.textContent = resourceName;\n info.appendChild(resEl);\n }\n\n card.appendChild(info);\n\n // Create button\n const btn = document.createElement('button');\n btn.classList.add('cal-sched-slot-prompt__btn');\n btn.setAttribute('aria-label', 'Create event');\n btn.innerHTML = `<svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><path d=\"M7 3v8M3 7h8\"/></svg>`;\n btn.addEventListener('click', (e) => {\n e.stopPropagation();\n onCreate?.();\n });\n card.appendChild(btn);\n\n // Prevent click-through\n card.addEventListener('click', (e) => e.stopPropagation());\n\n return card;\n}\n\nexport const slotPromptStyles = `\n .cal-sched-slot-prompt {\n position: absolute;\n z-index: 10;\n display: flex;\n align-items: center;\n gap: 8px;\n background: hsl(var(--cal-bg));\n border: 1px solid hsl(var(--cal-border));\n border-radius: var(--cal-radius);\n box-shadow: 0 4px 16px -2px rgba(0, 0, 0, 0.1), 0 1px 4px -1px rgba(0, 0, 0, 0.06);\n padding: 6px 8px 6px 12px;\n font-size: 12px;\n color: hsl(var(--cal-fg));\n white-space: nowrap;\n pointer-events: auto;\n }\n\n .cal-sched-slot-prompt__info {\n display: flex;\n flex-direction: column;\n gap: 1px;\n }\n\n .cal-sched-slot-prompt__time {\n font-weight: 600;\n font-size: 12px;\n }\n\n .cal-sched-slot-prompt__resource {\n font-size: 11px;\n color: hsl(var(--cal-fg-muted));\n }\n\n .cal-sched-slot-prompt__btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n border-radius: var(--cal-radius-sm);\n background: hsl(var(--cal-accent));\n color: hsl(var(--cal-accent-fg));\n flex-shrink: 0;\n transition: opacity var(--cal-transition);\n }\n\n .cal-sched-slot-prompt__btn:hover {\n opacity: 0.85;\n }\n\n /* Selected slot highlight */\n .cal-sched-week__slot--selected,\n .cal-sched-day__slot--selected {\n background: hsl(var(--cal-accent-subtle));\n box-shadow: inset 0 0 0 1.5px hsl(var(--cal-accent));\n z-index: 1;\n position: relative;\n }\n\n .cal-sched-month__cell--selected {\n background: hsl(var(--cal-accent-subtle));\n box-shadow: inset 0 0 0 1.5px hsl(var(--cal-accent));\n }\n`;\n","/**\n * Day view renderer — time axis + resource lanes + events + slot grid + all-day row + now-line.\n */\n\nimport { generateSlots, timeToMinutes, currentTime, formatTime, parseTime } from '../../core/times.js';\nimport { today, isSameDay } from '../../core/dates.js';\nimport { getEventsForDate, resolveEventOverlaps, timeToPixelOffset } from '../../core/scheduler-utils.js';\nimport { renderTimeAxis, timeAxisStyles } from './time-axis.js';\nimport { renderResourceHeaderRow, resourceHeaderStyles } from './resource-header.js';\nimport { renderEventBlock, renderAllDayChip, eventBlockStyles } from './event-block.js';\nimport { renderSlotPrompt } from './slot-prompt.js';\n\n/**\n * Render the day view.\n */\nexport function renderDayView({\n date, resources, events, startTime, endTime, interval, slotHeight, format, layout,\n resourceMode, selectedSlot,\n eventContent, showTime = true, draggable,\n onSlotClick, onEventClick, onSlotCreate,\n}) {\n const container = document.createElement('div');\n container.classList.add('cal-sched-day');\n if (layout === 'horizontal') container.classList.add('cal-sched-day--horizontal');\n\n const isTabsMode = resourceMode === 'tabs';\n const showResources = resources.length > 1 && !isTabsMode;\n const dayEvents = getEventsForDate(events, date);\n const allDayEvents = dayEvents.filter((ev) => !ev.startTime || !ev.endTime);\n const timedEvents = dayEvents.filter((ev) => ev.startTime && ev.endTime);\n const slots = generateSlots(startTime, endTime, interval);\n\n // All-day row\n if (allDayEvents.length > 0) {\n const allDayRow = document.createElement('div');\n allDayRow.classList.add('cal-sched-day__allday');\n\n const label = document.createElement('div');\n label.classList.add('cal-sched-day__allday-label');\n label.textContent = 'All day';\n allDayRow.appendChild(label);\n\n const chips = document.createElement('div');\n chips.classList.add('cal-sched-day__allday-chips');\n\n for (const ev of allDayEvents) {\n const resource = resources.find((r) => r.id === ev.resourceId);\n chips.appendChild(renderAllDayChip({\n event: ev,\n onClick: (event) => onEventClick?.(event, ev.resourceId, resource),\n eventContent,\n resource,\n }));\n }\n allDayRow.appendChild(chips);\n container.appendChild(allDayRow);\n }\n\n // Resource headers (if multiple)\n if (showResources) {\n const headerRow = document.createElement('div');\n headerRow.classList.add('cal-sched-day__header');\n\n // Spacer for time axis\n const spacer = document.createElement('div');\n spacer.classList.add('cal-sched-day__header-spacer');\n headerRow.appendChild(spacer);\n\n headerRow.appendChild(renderResourceHeaderRow({ resources }));\n container.appendChild(headerRow);\n }\n\n // Grid area: time axis + lanes\n const gridArea = document.createElement('div');\n gridArea.classList.add('cal-sched-day__grid-area');\n\n // Time axis\n gridArea.appendChild(renderTimeAxis({ startTime, endTime, interval, slotHeight, format }));\n\n // Lanes wrapper\n const lanesWrapper = document.createElement('div');\n lanesWrapper.classList.add('cal-sched-day__lanes');\n\n if (showResources) {\n // Columns mode — one lane per resource\n for (const resource of resources) {\n const lane = document.createElement('div');\n lane.classList.add('cal-sched-day__lane');\n lane.style.flex = '1 1 0';\n lane.dataset.resourceId = resource.id;\n lane.dataset.date = date;\n\n for (let i = 0; i < slots.length; i++) {\n const slotEl = document.createElement('div');\n slotEl.classList.add('cal-sched-day__slot');\n slotEl.style.height = `${slotHeight}px`;\n slotEl.dataset.time = slots[i];\n slotEl.dataset.resourceId = resource.id;\n\n const slotEnd = i < slots.length - 1 ? slots[i + 1] : endTime;\n\n // Slot selection highlight\n if (selectedSlot && selectedSlot.date === date && selectedSlot.startTime === slots[i] && selectedSlot.resourceId === resource.id) {\n slotEl.classList.add('cal-sched-day__slot--selected');\n slotEl.appendChild(renderSlotPrompt({\n date,\n startTime: slots[i],\n endTime: slotEnd,\n resourceName: resource.name,\n format,\n onCreate: () => onSlotCreate?.(date, slots[i], slotEnd, resource.id, resource),\n }));\n }\n\n slotEl.addEventListener('click', () => {\n onSlotClick?.(date, slots[i], slotEnd, resource.id, resource);\n });\n\n lane.appendChild(slotEl);\n }\n\n const resTimedEvents = timedEvents.filter((ev) => ev.resourceId === resource.id);\n const resolved = resolveEventOverlaps(resTimedEvents);\n\n for (const ev of resolved) {\n lane.appendChild(renderEventBlock({\n event: ev,\n gridStartTime: startTime,\n slotHeight,\n interval,\n format,\n onClick: (event) => onEventClick?.(event, resource.id, resource),\n eventContent,\n showTime,\n resource,\n draggable,\n }));\n }\n\n lanesWrapper.appendChild(lane);\n }\n } else {\n // Single lane — single resource OR tabs mode (all resources overlaid)\n const lane = document.createElement('div');\n lane.classList.add('cal-sched-day__lane');\n lane.style.flex = '1 1 0';\n lane.dataset.date = date;\n\n const defaultResource = resources.length === 1 ? resources[0] : null;\n if (defaultResource) lane.dataset.resourceId = defaultResource.id;\n\n for (let i = 0; i < slots.length; i++) {\n const slotEl = document.createElement('div');\n slotEl.classList.add('cal-sched-day__slot');\n slotEl.style.height = `${slotHeight}px`;\n slotEl.dataset.time = slots[i];\n\n const slotEnd = i < slots.length - 1 ? slots[i + 1] : endTime;\n const slotResId = defaultResource?.id || null;\n\n // Slot selection highlight\n if (selectedSlot && selectedSlot.date === date && selectedSlot.startTime === slots[i]\n && (selectedSlot.resourceId === slotResId || (!selectedSlot.resourceId && !slotResId))) {\n slotEl.classList.add('cal-sched-day__slot--selected');\n slotEl.appendChild(renderSlotPrompt({\n date,\n startTime: slots[i],\n endTime: slotEnd,\n resourceName: defaultResource?.name || null,\n format,\n onCreate: () => onSlotCreate?.(date, slots[i], slotEnd, slotResId, defaultResource),\n }));\n }\n\n slotEl.addEventListener('click', () => {\n onSlotClick?.(date, slots[i], slotEnd, slotResId, defaultResource);\n });\n\n lane.appendChild(slotEl);\n }\n\n // All events in single lane\n const resolved = resolveEventOverlaps(timedEvents);\n for (const ev of resolved) {\n const resource = resources.find((r) => r.id === ev.resourceId) || resources[0];\n lane.appendChild(renderEventBlock({\n event: ev,\n gridStartTime: startTime,\n slotHeight,\n interval,\n format,\n onClick: (event) => onEventClick?.(event, ev.resourceId, resource),\n eventContent,\n showTime,\n resource,\n draggable,\n }));\n }\n\n lanesWrapper.appendChild(lane);\n }\n\n gridArea.appendChild(lanesWrapper);\n\n // Now line\n const todayStr = today();\n if (isSameDay(date, todayStr)) {\n const now = currentTime();\n const nowMins = timeToMinutes(now);\n const startMins = timeToMinutes(startTime);\n const endMins = timeToMinutes(endTime);\n\n if (nowMins >= startMins && nowMins <= endMins) {\n const top = timeToPixelOffset(now, startTime, slotHeight, interval);\n const nowLine = document.createElement('div');\n nowLine.classList.add('cal-sched-now-line');\n nowLine.style.top = `${top}px`;\n\n const dot = document.createElement('div');\n dot.classList.add('cal-sched-now-line__dot');\n nowLine.appendChild(dot);\n\n lanesWrapper.appendChild(nowLine);\n }\n }\n\n container.appendChild(gridArea);\n return container;\n}\n\nexport const dayViewStyles = `\n .cal-sched-day {\n display: flex;\n flex-direction: column;\n border: 1px solid hsl(var(--cal-sched-grid-line));\n border-radius: var(--cal-radius);\n overflow: hidden;\n }\n\n .cal-sched-day__allday {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n border-bottom: 1px solid hsl(var(--cal-sched-grid-line));\n background: hsl(var(--cal-sched-header-bg));\n flex-wrap: wrap;\n }\n\n .cal-sched-day__allday-label {\n font-size: 11px;\n color: hsl(var(--cal-fg-muted));\n flex-shrink: 0;\n width: 48px;\n }\n\n .cal-sched-day__allday-chips {\n display: flex;\n gap: 4px;\n flex-wrap: wrap;\n flex: 1;\n }\n\n .cal-sched-day__header {\n display: flex;\n background: hsl(var(--cal-sched-header-bg));\n position: sticky;\n top: 0;\n z-index: 3;\n }\n\n .cal-sched-day__header-spacer {\n width: 56px;\n flex-shrink: 0;\n border-right: 1px solid hsl(var(--cal-sched-grid-line));\n }\n\n .cal-sched-day__grid-area {\n display: flex;\n overflow-y: auto;\n position: relative;\n padding-top: 8px;\n }\n\n .cal-sched-day__lanes {\n display: flex;\n flex: 1;\n position: relative;\n }\n\n .cal-sched-day__lane {\n position: relative;\n border-right: 1px solid hsl(var(--cal-sched-grid-line));\n }\n\n .cal-sched-day__lane:last-child {\n border-right: none;\n }\n\n .cal-sched-day__slot {\n border-bottom: 1px solid hsl(var(--cal-sched-grid-line));\n cursor: pointer;\n transition: background var(--cal-transition);\n }\n\n .cal-sched-day__slot:hover {\n background: hsl(var(--cal-sched-slot-hover));\n }\n\n /* Now line */\n .cal-sched-now-line {\n position: absolute;\n left: 0;\n right: 0;\n height: 2px;\n background: hsl(var(--cal-sched-now-line));\n z-index: 5;\n pointer-events: none;\n }\n\n .cal-sched-now-line__dot {\n position: absolute;\n left: -4px;\n top: -3px;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: hsl(var(--cal-sched-now-line));\n }\n\n /* Horizontal layout */\n .cal-sched-day--horizontal .cal-sched-day__grid-area {\n flex-direction: column;\n }\n\n .cal-sched-day--horizontal .cal-sched-day__lanes {\n flex-direction: column;\n }\n\n .cal-sched-day--horizontal .cal-sched-day__lane {\n display: flex;\n border-right: none;\n border-bottom: 1px solid hsl(var(--cal-sched-grid-line));\n }\n\n .cal-sched-day--horizontal .cal-sched-day__lane:last-child {\n border-bottom: none;\n }\n\n .cal-sched-day--horizontal .cal-sched-day__slot {\n border-bottom: none;\n border-right: 1px solid hsl(var(--cal-sched-grid-line));\n flex: 0 0 auto;\n }\n\n .cal-sched-day--horizontal .cal-sched-time-axis {\n flex-direction: row;\n width: auto;\n border-right: none;\n border-bottom: 1px solid hsl(var(--cal-sched-grid-line));\n }\n\n .cal-sched-day--horizontal .cal-sched-time-axis__slot {\n border-bottom: none;\n border-right: 1px solid hsl(var(--cal-sched-grid-line));\n align-items: center;\n justify-content: center;\n padding: 4px 0;\n }\n`;\n","/**\n * Week view renderer — 7 day columns, each subdivided by resources.\n */\n\nimport { generateSlots, timeToMinutes, currentTime, formatTime, parseTime } from '../../core/times.js';\nimport { today, isSameDay, getDayName, parseDate } from '../../core/dates.js';\nimport {\n getWeekDates, getEventsForDate, resolveEventOverlaps, timeToPixelOffset,\n} from '../../core/scheduler-utils.js';\nimport { renderTimeAxis, timeAxisStyles } from './time-axis.js';\nimport { renderEventBlock, renderAllDayChip, eventBlockStyles } from './event-block.js';\nimport { renderSlotPrompt } from './slot-prompt.js';\n\nconst MAX_ALLDAY_CHIPS = 3;\nconst MAX_ALLDAY_DOTS = 5;\n\n/**\n * Render the week view.\n */\nexport function renderWeekView({\n date, firstDay, resources, events, startTime, endTime, interval, slotHeight, format, layout,\n resourceMode, selectedSlot,\n eventContent, showTime = true, draggable,\n allDayCollapsed, onToggleAllDay,\n onSlotClick, onEventClick, onSlotCreate,\n}) {\n const container = document.createElement('div');\n container.classList.add('cal-sched-week');\n if (layout === 'horizontal') container.classList.add('cal-sched-week--horizontal');\n\n const weekDates = getWeekDates(date, firstDay);\n const isTabsMode = resourceMode === 'tabs';\n // Show sub-lanes only in columns mode with multiple resources\n const showResources = resources.length > 1 && !isTabsMode;\n const slots = generateSlots(startTime, endTime, interval);\n const todayStr = today();\n\n // All-day row\n const allDayByDate = {};\n for (const d of weekDates) {\n const dayEvts = getEventsForDate(events, d).filter((ev) => !ev.startTime || !ev.endTime);\n if (dayEvts.length) allDayByDate[d] = dayEvts;\n }\n\n const hasAllDay = Object.keys(allDayByDate).length > 0;\n\n if (hasAllDay) {\n const allDayRow = document.createElement('div');\n allDayRow.classList.add('cal-sched-week__allday');\n if (allDayCollapsed) allDayRow.classList.add('cal-sched-week__allday--collapsed');\n\n const spacer = document.createElement('div');\n spacer.classList.add('cal-sched-week__allday-spacer');\n\n const spacerLabel = document.createElement('span');\n spacerLabel.textContent = 'All day';\n spacer.appendChild(spacerLabel);\n\n // Toggle button\n const toggleBtn = document.createElement('button');\n toggleBtn.classList.add('cal-sched-week__allday-toggle');\n toggleBtn.setAttribute('aria-label', allDayCollapsed ? 'Expand all-day events' : 'Collapse all-day events');\n toggleBtn.innerHTML = allDayCollapsed\n ? `<svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 5l3 3 3-3\"/></svg>`\n : `<svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 7l3-3 3 3\"/></svg>`;\n toggleBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n onToggleAllDay?.();\n });\n spacer.appendChild(toggleBtn);\n\n allDayRow.appendChild(spacer);\n\n for (const d of weekDates) {\n const cell = document.createElement('div');\n cell.classList.add('cal-sched-week__allday-cell');\n\n const dayAllDay = allDayByDate[d] || [];\n\n if (allDayCollapsed) {\n // Collapsed: show colored dots\n if (dayAllDay.length > 0) {\n const dotsWrapper = document.createElement('div');\n dotsWrapper.classList.add('cal-sched-week__allday-dots');\n\n const visibleDots = dayAllDay.slice(0, MAX_ALLDAY_DOTS);\n for (const ev of visibleDots) {\n const dot = document.createElement('span');\n dot.classList.add('cal-sched-week__allday-dot');\n const color = ev.color || 'blue';\n dot.style.background = `hsl(var(--cal-booking-${color}-fg))`;\n dotsWrapper.appendChild(dot);\n }\n\n if (dayAllDay.length > MAX_ALLDAY_DOTS) {\n const badge = document.createElement('span');\n badge.classList.add('cal-sched-week__allday-overflow');\n badge.textContent = `+${dayAllDay.length - MAX_ALLDAY_DOTS}`;\n dotsWrapper.appendChild(badge);\n }\n\n cell.appendChild(dotsWrapper);\n }\n } else {\n // Expanded: show chips with overflow\n const visibleChips = dayAllDay.slice(0, MAX_ALLDAY_CHIPS);\n for (const ev of visibleChips) {\n const resource = resources.find((r) => r.id === ev.resourceId);\n cell.appendChild(renderAllDayChip({\n event: ev,\n onClick: (event) => onEventClick?.(event, ev.resourceId, resource),\n eventContent,\n resource,\n }));\n }\n\n if (dayAllDay.length > MAX_ALLDAY_CHIPS) {\n const badge = document.createElement('span');\n badge.classList.add('cal-sched-week__allday-overflow');\n badge.textContent = `+${dayAllDay.length - MAX_ALLDAY_CHIPS}`;\n cell.appendChild(badge);\n }\n }\n allDayRow.appendChild(cell);\n }\n container.appendChild(allDayRow);\n }\n\n // Day headers\n const headerRow = document.createElement('div');\n headerRow.classList.add('cal-sched-week__header');\n\n const headerSpacer = document.createElement('div');\n headerSpacer.classList.add('cal-sched-week__header-spacer');\n headerRow.appendChild(headerSpacer);\n\n for (const d of weekDates) {\n const parsed = parseDate(d);\n const dayHeader = document.createElement('div');\n dayHeader.classList.add('cal-sched-week__day-header');\n if (isSameDay(d, todayStr)) dayHeader.classList.add('cal-sched-week__day-header--today');\n\n const dayName = document.createElement('span');\n dayName.classList.add('cal-sched-week__day-name');\n dayName.textContent = getDayName(d);\n\n const dayNum = document.createElement('span');\n dayNum.classList.add('cal-sched-week__day-num');\n if (isSameDay(d, todayStr)) dayNum.classList.add('cal-sched-week__day-num--today');\n dayNum.textContent = parsed ? parsed.getDate() : '';\n\n dayHeader.appendChild(dayName);\n dayHeader.appendChild(dayNum);\n\n // Sub-resource headers\n if (showResources) {\n const resRow = document.createElement('div');\n resRow.classList.add('cal-sched-week__res-row');\n for (const r of resources) {\n const resLabel = document.createElement('span');\n resLabel.classList.add('cal-sched-week__res-label');\n const dot = document.createElement('span');\n dot.classList.add('cal-sched-week__res-dot');\n dot.style.background = `hsl(var(--cal-booking-${r.color || 'blue'}-fg))`;\n resLabel.appendChild(dot);\n resLabel.appendChild(document.createTextNode(r.name));\n resRow.appendChild(resLabel);\n }\n dayHeader.appendChild(resRow);\n }\n\n headerRow.appendChild(dayHeader);\n }\n container.appendChild(headerRow);\n\n // Grid area\n const gridArea = document.createElement('div');\n gridArea.classList.add('cal-sched-week__grid-area');\n\n // Time axis\n gridArea.appendChild(renderTimeAxis({ startTime, endTime, interval, slotHeight, format }));\n\n // Day columns\n const colsWrapper = document.createElement('div');\n colsWrapper.classList.add('cal-sched-week__cols');\n\n for (const d of weekDates) {\n const dayCol = document.createElement('div');\n dayCol.classList.add('cal-sched-week__day-col');\n dayCol.dataset.date = d;\n if (isSameDay(d, todayStr)) dayCol.classList.add('cal-sched-week__day-col--today');\n\n const dayTimedEvents = getEventsForDate(events, d).filter((ev) => ev.startTime && ev.endTime);\n\n if (showResources) {\n // Sub-lanes per resource (columns mode)\n for (const resource of resources) {\n const lane = document.createElement('div');\n lane.classList.add('cal-sched-week__lane');\n lane.dataset.resourceId = resource.id;\n\n for (let i = 0; i < slots.length; i++) {\n const slotEl = document.createElement('div');\n slotEl.classList.add('cal-sched-week__slot');\n slotEl.style.height = `${slotHeight}px`;\n slotEl.dataset.time = slots[i];\n\n const slotEnd = i < slots.length - 1 ? slots[i + 1] : endTime;\n\n // Slot selection highlight\n if (selectedSlot && selectedSlot.date === d && selectedSlot.startTime === slots[i] && selectedSlot.resourceId === resource.id) {\n slotEl.classList.add('cal-sched-week__slot--selected');\n slotEl.appendChild(renderSlotPrompt({\n date: d,\n startTime: slots[i],\n endTime: slotEnd,\n resourceName: resource.name,\n format,\n onCreate: () => onSlotCreate?.(d, slots[i], slotEnd, resource.id, resource),\n }));\n }\n\n slotEl.addEventListener('click', () => {\n onSlotClick?.(d, slots[i], slotEnd, resource.id, resource);\n });\n\n lane.appendChild(slotEl);\n }\n\n const resEvents = dayTimedEvents.filter((ev) => ev.resourceId === resource.id);\n const resolved = resolveEventOverlaps(resEvents);\n for (const ev of resolved) {\n lane.appendChild(renderEventBlock({\n event: ev,\n gridStartTime: startTime,\n slotHeight,\n interval,\n format,\n onClick: (event) => onEventClick?.(event, resource.id, resource),\n eventContent,\n showTime,\n resource,\n draggable,\n }));\n }\n\n dayCol.appendChild(lane);\n }\n } else {\n // Single-lane: single resource OR tabs mode (all resources overlaid)\n const lane = document.createElement('div');\n lane.classList.add('cal-sched-week__lane', 'cal-sched-week__lane--full');\n\n // In tabs mode, determine the effective resource for slot clicks\n const defaultResource = resources.length === 1 ? resources[0] : null;\n if (defaultResource) lane.dataset.resourceId = defaultResource.id;\n\n for (let i = 0; i < slots.length; i++) {\n const slotEl = document.createElement('div');\n slotEl.classList.add('cal-sched-week__slot');\n slotEl.style.height = `${slotHeight}px`;\n slotEl.dataset.time = slots[i];\n\n const slotEnd = i < slots.length - 1 ? slots[i + 1] : endTime;\n const slotResId = defaultResource?.id || null;\n\n // Slot selection highlight\n if (selectedSlot && selectedSlot.date === d && selectedSlot.startTime === slots[i]\n && (selectedSlot.resourceId === slotResId || (!selectedSlot.resourceId && !slotResId))) {\n slotEl.classList.add('cal-sched-week__slot--selected');\n slotEl.appendChild(renderSlotPrompt({\n date: d,\n startTime: slots[i],\n endTime: slotEnd,\n resourceName: defaultResource?.name || null,\n format,\n onCreate: () => onSlotCreate?.(d, slots[i], slotEnd, slotResId, defaultResource),\n }));\n }\n\n slotEl.addEventListener('click', () => {\n onSlotClick?.(d, slots[i], slotEnd, slotResId, defaultResource);\n });\n\n lane.appendChild(slotEl);\n }\n\n // All events in single lane, overlapped\n const resolved = resolveEventOverlaps(dayTimedEvents);\n for (const ev of resolved) {\n const resource = resources.find((r) => r.id === ev.resourceId) || resources[0];\n lane.appendChild(renderEventBlock({\n event: ev,\n gridStartTime: startTime,\n slotHeight,\n interval,\n format,\n onClick: (event) => onEventClick?.(event, ev.resourceId, resource),\n eventContent,\n showTime,\n resource,\n draggable,\n }));\n }\n\n dayCol.appendChild(lane);\n }\n\n colsWrapper.appendChild(dayCol);\n }\n\n // Now line (across today's column)\n if (weekDates.includes(todayStr)) {\n const now = currentTime();\n const nowMins = timeToMinutes(now);\n const startMins = timeToMinutes(startTime);\n const endMins = timeToMinutes(endTime);\n if (nowMins >= startMins && nowMins <= endMins) {\n const todayIdx = weekDates.indexOf(todayStr);\n const top = timeToPixelOffset(now, startTime, slotHeight, interval);\n // Now line is placed in the cols wrapper\n const nowLine = document.createElement('div');\n nowLine.classList.add('cal-sched-now-line', 'cal-sched-now-line--week');\n nowLine.style.top = `${top}px`;\n const colPercent = 100 / 7;\n nowLine.style.left = `${todayIdx * colPercent}%`;\n nowLine.style.width = `${colPercent}%`;\n\n const dot = document.createElement('div');\n dot.classList.add('cal-sched-now-line__dot');\n nowLine.appendChild(dot);\n\n colsWrapper.appendChild(nowLine);\n }\n }\n\n gridArea.appendChild(colsWrapper);\n container.appendChild(gridArea);\n\n return container;\n}\n\nexport const weekViewStyles = `\n .cal-sched-week {\n display: flex;\n flex-direction: column;\n border: 1px solid hsl(var(--cal-sched-grid-line));\n border-radius: var(--cal-radius);\n overflow: hidden;\n }\n\n .cal-sched-week__allday {\n display: flex;\n border-bottom: 1px solid hsl(var(--cal-sched-grid-line));\n background: hsl(var(--cal-sched-header-bg));\n }\n\n .cal-sched-week__allday-spacer {\n width: 56px;\n flex-shrink: 0;\n font-size: 11px;\n color: hsl(var(--cal-fg-muted));\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n justify-content: center;\n gap: 4px;\n padding-right: 8px;\n border-right: 1px solid hsl(var(--cal-sched-grid-line));\n }\n\n .cal-sched-week__allday-toggle {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n border-radius: var(--cal-radius-sm);\n background: transparent;\n color: hsl(var(--cal-fg-muted));\n cursor: pointer;\n transition: background var(--cal-transition), color var(--cal-transition);\n }\n\n .cal-sched-week__allday-toggle:hover {\n background: hsl(var(--cal-sched-slot-hover));\n color: hsl(var(--cal-fg));\n }\n\n .cal-sched-week__allday-cell {\n flex: 1;\n display: flex;\n gap: 2px;\n padding: 4px;\n flex-wrap: wrap;\n border-right: 1px solid hsl(var(--cal-sched-grid-line));\n max-height: 80px;\n overflow: hidden;\n align-items: flex-start;\n align-content: flex-start;\n }\n\n .cal-sched-week__allday--collapsed .cal-sched-week__allday-cell {\n max-height: 28px;\n align-items: center;\n align-content: center;\n }\n\n .cal-sched-week__allday-cell:last-child {\n border-right: none;\n }\n\n .cal-sched-week__allday-overflow {\n font-size: 10px;\n color: hsl(var(--cal-fg-muted));\n padding: 1px 4px;\n white-space: nowrap;\n }\n\n .cal-sched-week__allday-dots {\n display: flex;\n align-items: center;\n gap: 3px;\n }\n\n .cal-sched-week__allday-dot {\n width: 7px;\n height: 7px;\n border-radius: 50%;\n flex-shrink: 0;\n }\n\n .cal-sched-week__header {\n display: flex;\n background: hsl(var(--cal-sched-header-bg));\n border-bottom: 1px solid hsl(var(--cal-sched-grid-line));\n position: sticky;\n top: 0;\n z-index: 3;\n }\n\n .cal-sched-week__header-spacer {\n width: 56px;\n flex-shrink: 0;\n border-right: 1px solid hsl(var(--cal-sched-grid-line));\n }\n\n .cal-sched-week__day-header {\n flex: 1;\n text-align: center;\n padding: 8px 4px;\n border-right: 1px solid hsl(var(--cal-sched-grid-line));\n }\n\n .cal-sched-week__day-header:last-child {\n border-right: none;\n }\n\n .cal-sched-week__day-name {\n display: block;\n font-size: 11px;\n color: hsl(var(--cal-fg-muted));\n font-weight: 500;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .cal-sched-week__day-num {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n font-size: 14px;\n font-weight: 600;\n color: hsl(var(--cal-fg));\n border-radius: 50%;\n }\n\n .cal-sched-week__day-num--today {\n background: hsl(var(--cal-accent));\n color: hsl(var(--cal-accent-fg));\n }\n\n .cal-sched-week__res-row {\n display: flex;\n justify-content: center;\n gap: 8px;\n margin-top: 4px;\n }\n\n .cal-sched-week__res-label {\n display: flex;\n align-items: center;\n gap: 3px;\n font-size: 10px;\n color: hsl(var(--cal-fg-muted));\n }\n\n .cal-sched-week__res-dot {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n }\n\n .cal-sched-week__grid-area {\n display: flex;\n overflow-y: auto;\n position: relative;\n padding-top: 8px;\n }\n\n .cal-sched-week__cols {\n display: flex;\n flex: 1;\n position: relative;\n }\n\n .cal-sched-week__day-col {\n flex: 1;\n display: flex;\n border-right: 1px solid hsl(var(--cal-sched-grid-line));\n position: relative;\n }\n\n .cal-sched-week__day-col:last-child {\n border-right: none;\n }\n\n .cal-sched-week__lane {\n flex: 1;\n position: relative;\n border-right: 1px solid hsl(var(--cal-sched-grid-line) / 0.5);\n }\n\n .cal-sched-week__lane:last-child {\n border-right: none;\n }\n\n .cal-sched-week__lane--full {\n border-right: none;\n }\n\n .cal-sched-week__slot {\n border-bottom: 1px solid hsl(var(--cal-sched-grid-line));\n cursor: pointer;\n transition: background var(--cal-transition);\n }\n\n .cal-sched-week__slot:hover {\n background: hsl(var(--cal-sched-slot-hover));\n }\n\n .cal-sched-now-line--week {\n position: absolute;\n height: 2px;\n background: hsl(var(--cal-sched-now-line));\n z-index: 5;\n pointer-events: none;\n }\n`;\n","/**\n * Month view renderer — month grid with event chips + resource tab filtering.\n */\n\nimport { buildMonthGrid, getWeekdayLabels, parseDate, isSameDay, today } from '../../core/dates.js';\nimport { getEventsForDate } from '../../core/scheduler-utils.js';\nimport { renderMonthChip, eventBlockStyles } from './event-block.js';\nimport { renderSlotPrompt } from './slot-prompt.js';\n\nconst MAX_VISIBLE_EVENTS = 3;\n\n/**\n * Render the month view.\n * @param {object} options\n * @param {string} options.date - anchor date (YYYY-MM-DD)\n * @param {number} options.firstDay\n * @param {object[]} options.resources\n * @param {object[]} options.events\n * @param {'12h'|'24h'} options.format\n * @param {string|null} options.selectedResourceId - resource filter (null = all)\n * @param {function} options.onSlotClick - (date)\n * @param {function} options.onEventClick - (event, resourceId, resource)\n * @param {function} options.onResourceFilter - (resourceId|null)\n * @returns {HTMLElement}\n */\nexport function renderMonthView({\n date, firstDay, resources, events, format,\n selectedResourceId, selectedDate, eventContent,\n onSlotClick, onEventClick, onSlotCreate,\n}) {\n const container = document.createElement('div');\n container.classList.add('cal-sched-month');\n\n const d = parseDate(date);\n if (!d) return container;\n\n const year = d.getFullYear();\n const month = d.getMonth();\n const todayStr = today();\n\n // Weekday labels\n const weekdayRow = document.createElement('div');\n weekdayRow.classList.add('cal-sched-month__weekdays');\n const labels = getWeekdayLabels(firstDay);\n for (const label of labels) {\n const el = document.createElement('div');\n el.classList.add('cal-sched-month__weekday');\n el.textContent = label;\n weekdayRow.appendChild(el);\n }\n container.appendChild(weekdayRow);\n\n // Month grid\n const grid = document.createElement('div');\n grid.classList.add('cal-sched-month__grid');\n\n const cells = buildMonthGrid(year, month, firstDay);\n\n for (const cell of cells) {\n const cellEl = document.createElement('div');\n cellEl.classList.add('cal-sched-month__cell');\n if (!cell.isCurrentMonth) cellEl.classList.add('cal-sched-month__cell--outside');\n if (cell.isToday) cellEl.classList.add('cal-sched-month__cell--today');\n if (selectedDate && cell.dateString === selectedDate) cellEl.classList.add('cal-sched-month__cell--selected');\n\n cellEl.addEventListener('click', (e) => {\n // Only fire if not clicking an event chip\n if (e.target.closest('.cal-sched-month-chip')) return;\n onSlotClick?.(cell.dateString);\n });\n\n // Day number\n const dayNum = document.createElement('div');\n dayNum.classList.add('cal-sched-month__day-num');\n if (cell.isToday) dayNum.classList.add('cal-sched-month__day-num--today');\n dayNum.textContent = cell.day;\n cellEl.appendChild(dayNum);\n\n // Events for this day\n let dayEvents = getEventsForDate(events, cell.dateString);\n if (selectedResourceId) {\n dayEvents = dayEvents.filter((ev) => ev.resourceId === selectedResourceId);\n }\n\n // Sort: timed events first (by start time), then all-day\n dayEvents.sort((a, b) => {\n if (a.startTime && !b.startTime) return -1;\n if (!a.startTime && b.startTime) return 1;\n if (a.startTime && b.startTime) return a.startTime.localeCompare(b.startTime);\n return 0;\n });\n\n const eventsContainer = document.createElement('div');\n eventsContainer.classList.add('cal-sched-month__events');\n\n const visible = dayEvents.slice(0, MAX_VISIBLE_EVENTS);\n const overflow = dayEvents.length - MAX_VISIBLE_EVENTS;\n\n for (const ev of visible) {\n const resource = resources.find((r) => r.id === ev.resourceId);\n eventsContainer.appendChild(renderMonthChip({\n event: ev,\n format,\n onClick: (event) => onEventClick?.(event, ev.resourceId, resource),\n eventContent,\n resource,\n }));\n }\n\n if (overflow > 0) {\n const more = document.createElement('div');\n more.classList.add('cal-sched-month__more');\n more.textContent = `+${overflow} more`;\n eventsContainer.appendChild(more);\n }\n\n cellEl.appendChild(eventsContainer);\n\n // Slot prompt on selected cell\n if (selectedDate && cell.dateString === selectedDate) {\n cellEl.style.position = 'relative';\n cellEl.appendChild(renderSlotPrompt({\n date: cell.dateString,\n startTime: null,\n endTime: null,\n resourceName: null,\n format,\n onCreate: () => onSlotCreate?.(cell.dateString),\n }));\n }\n\n grid.appendChild(cellEl);\n }\n\n container.appendChild(grid);\n return container;\n}\n\nexport const monthViewStyles = `\n .cal-sched-month {\n border: 1px solid hsl(var(--cal-sched-grid-line));\n border-radius: var(--cal-radius);\n overflow: hidden;\n }\n\n .cal-sched-month__weekdays {\n display: grid;\n grid-template-columns: repeat(7, minmax(0, 1fr));\n border-bottom: 1px solid hsl(var(--cal-sched-grid-line));\n background: hsl(var(--cal-sched-header-bg));\n }\n\n .cal-sched-month__weekday {\n font-size: 11px;\n font-weight: 500;\n color: hsl(var(--cal-fg-muted));\n text-align: center;\n padding: 8px 4px;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .cal-sched-month__grid {\n display: grid;\n grid-template-columns: repeat(7, minmax(0, 1fr));\n }\n\n .cal-sched-month__cell {\n min-height: 100px;\n border-right: 1px solid hsl(var(--cal-sched-grid-line));\n border-bottom: 1px solid hsl(var(--cal-sched-grid-line));\n padding: 4px;\n cursor: pointer;\n transition: background var(--cal-transition);\n }\n\n .cal-sched-month__cell:nth-child(7n) {\n border-right: none;\n }\n\n .cal-sched-month__cell:hover {\n background: hsl(var(--cal-sched-slot-hover));\n }\n\n .cal-sched-month__cell--outside {\n opacity: 0.4;\n }\n\n .cal-sched-month__day-num {\n font-size: 13px;\n font-weight: 500;\n color: hsl(var(--cal-fg));\n margin-bottom: 4px;\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .cal-sched-month__day-num--today {\n background: hsl(var(--cal-accent));\n color: hsl(var(--cal-accent-fg));\n border-radius: 50%;\n }\n\n .cal-sched-month__events {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .cal-sched-month__more {\n font-size: 11px;\n color: hsl(var(--cal-fg-muted));\n padding: 1px 6px;\n cursor: pointer;\n }\n\n .cal-sched-month__more:hover {\n color: hsl(var(--cal-fg));\n }\n`;\n","/**\n * Loading skeleton renderers for the scheduler component.\n */\n\n/**\n * Render a day/week view skeleton with time slots.\n * @param {object} options\n * @param {number} options.columns - number of day/resource columns\n * @param {number} options.rows - number of time slot rows\n * @param {number} options.slotHeight - pixel height per slot\n * @returns {HTMLElement}\n */\nexport function renderSchedulerGridSkeleton({ columns = 3, rows = 10, slotHeight = 48 } = {}) {\n const wrapper = document.createElement('div');\n wrapper.setAttribute('role', 'status');\n wrapper.setAttribute('aria-label', 'Loading...');\n wrapper.classList.add('cal-sched-skeleton-grid');\n\n // Header row\n const header = document.createElement('div');\n header.classList.add('cal-sched-skeleton-grid__header');\n const headerSpacer = document.createElement('div');\n headerSpacer.classList.add('cal-sched-skeleton-grid__spacer');\n header.appendChild(headerSpacer);\n for (let c = 0; c < columns; c++) {\n const col = document.createElement('div');\n col.classList.add('cal-skeleton', 'cal-sched-skeleton-grid__col-header');\n header.appendChild(col);\n }\n wrapper.appendChild(header);\n\n // Grid body\n const body = document.createElement('div');\n body.classList.add('cal-sched-skeleton-grid__body');\n\n for (let r = 0; r < rows; r++) {\n const row = document.createElement('div');\n row.classList.add('cal-sched-skeleton-grid__row');\n row.style.height = `${slotHeight}px`;\n\n // Time label\n const timeLabel = document.createElement('div');\n timeLabel.classList.add('cal-skeleton', 'cal-sched-skeleton-grid__time');\n row.appendChild(timeLabel);\n\n // Slot cells\n for (let c = 0; c < columns; c++) {\n const cell = document.createElement('div');\n cell.classList.add('cal-sched-skeleton-grid__cell');\n\n // Randomly add fake event blocks\n if (Math.random() < 0.15) {\n const ev = document.createElement('div');\n ev.classList.add('cal-skeleton', 'cal-skeleton--rect', 'cal-sched-skeleton-grid__event');\n ev.style.height = `${slotHeight * (1 + Math.floor(Math.random() * 2))}px`;\n cell.appendChild(ev);\n }\n\n row.appendChild(cell);\n }\n\n body.appendChild(row);\n }\n\n wrapper.appendChild(body);\n return wrapper;\n}\n\n/**\n * Render a month view skeleton.\n * @returns {HTMLElement}\n */\nexport function renderSchedulerMonthSkeleton() {\n const wrapper = document.createElement('div');\n wrapper.setAttribute('role', 'status');\n wrapper.setAttribute('aria-label', 'Loading...');\n wrapper.classList.add('cal-sched-skeleton-month');\n\n // Weekday header\n const weekdays = document.createElement('div');\n weekdays.classList.add('cal-sched-skeleton-month__weekdays');\n for (let i = 0; i < 7; i++) {\n const label = document.createElement('div');\n label.classList.add('cal-skeleton', 'cal-sched-skeleton-month__weekday');\n weekdays.appendChild(label);\n }\n wrapper.appendChild(weekdays);\n\n // Grid cells (5 rows x 7 cols)\n const grid = document.createElement('div');\n grid.classList.add('cal-sched-skeleton-month__grid');\n for (let i = 0; i < 35; i++) {\n const cell = document.createElement('div');\n cell.classList.add('cal-sched-skeleton-month__cell');\n\n const num = document.createElement('div');\n num.classList.add('cal-skeleton', 'cal-sched-skeleton-month__num');\n cell.appendChild(num);\n\n // Random event chips\n const chipCount = Math.floor(Math.random() * 3);\n for (let c = 0; c < chipCount; c++) {\n const chip = document.createElement('div');\n chip.classList.add('cal-skeleton', 'cal-skeleton--rect', 'cal-sched-skeleton-month__chip');\n cell.appendChild(chip);\n }\n\n grid.appendChild(cell);\n }\n wrapper.appendChild(grid);\n\n return wrapper;\n}\n\nexport const schedulerSkeletonStyles = `\n .cal-sched-skeleton-grid {\n border: 1px solid hsl(var(--cal-sched-grid-line));\n border-radius: var(--cal-radius);\n overflow: hidden;\n }\n\n .cal-sched-skeleton-grid__header {\n display: flex;\n background: hsl(var(--cal-sched-header-bg));\n border-bottom: 1px solid hsl(var(--cal-sched-grid-line));\n padding: 12px 0;\n }\n\n .cal-sched-skeleton-grid__spacer {\n width: 56px;\n flex-shrink: 0;\n }\n\n .cal-sched-skeleton-grid__col-header {\n flex: 1;\n height: 20px;\n margin: 0 12px;\n }\n\n .cal-sched-skeleton-grid__body {\n display: flex;\n flex-direction: column;\n }\n\n .cal-sched-skeleton-grid__row {\n display: flex;\n border-bottom: 1px solid hsl(var(--cal-sched-grid-line));\n }\n\n .cal-sched-skeleton-grid__time {\n width: 36px;\n height: 12px;\n margin: 4px 10px;\n flex-shrink: 0;\n }\n\n .cal-sched-skeleton-grid__cell {\n flex: 1;\n border-right: 1px solid hsl(var(--cal-sched-grid-line));\n position: relative;\n padding: 2px;\n }\n\n .cal-sched-skeleton-grid__cell:last-child {\n border-right: none;\n }\n\n .cal-sched-skeleton-grid__event {\n width: 80%;\n min-height: 24px;\n }\n\n .cal-sched-skeleton-month {\n border: 1px solid hsl(var(--cal-sched-grid-line));\n border-radius: var(--cal-radius);\n overflow: hidden;\n }\n\n .cal-sched-skeleton-month__weekdays {\n display: grid;\n grid-template-columns: repeat(7, 1fr);\n gap: 8px;\n padding: 12px;\n background: hsl(var(--cal-sched-header-bg));\n border-bottom: 1px solid hsl(var(--cal-sched-grid-line));\n }\n\n .cal-sched-skeleton-month__weekday {\n height: 14px;\n }\n\n .cal-sched-skeleton-month__grid {\n display: grid;\n grid-template-columns: repeat(7, 1fr);\n }\n\n .cal-sched-skeleton-month__cell {\n min-height: 80px;\n border-right: 1px solid hsl(var(--cal-sched-grid-line));\n border-bottom: 1px solid hsl(var(--cal-sched-grid-line));\n padding: 6px;\n }\n\n .cal-sched-skeleton-month__cell:nth-child(7n) {\n border-right: none;\n }\n\n .cal-sched-skeleton-month__num {\n width: 20px;\n height: 14px;\n margin-bottom: 6px;\n }\n\n .cal-sched-skeleton-month__chip {\n height: 16px;\n margin-bottom: 2px;\n width: 85%;\n }\n`;\n","/**\n * Event detail popover — shows event info when clicking an event block.\n */\n\nimport { parseTime, formatTime } from '../../core/times.js';\nimport { getDayName, parseDate, MONTH_NAMES } from '../../core/dates.js';\n\n/**\n * Render an event detail popover card.\n * @param {object} options\n * @param {object} options.event\n * @param {object} [options.resource]\n * @param {'12h'|'24h'} options.format\n * @param {function} options.onClose\n * @returns {HTMLElement}\n */\nexport function renderEventDetail({ event, resource, format, onClose, actions, onAction }) {\n // Backdrop\n const backdrop = document.createElement('div');\n backdrop.classList.add('cal-sched-detail-backdrop');\n backdrop.addEventListener('click', onClose);\n\n // Card\n const card = document.createElement('div');\n card.classList.add('cal-sched-detail', 'cal-animate-fade');\n card.addEventListener('click', (e) => e.stopPropagation());\n\n // Close button\n const closeBtn = document.createElement('button');\n closeBtn.classList.add('cal-sched-detail__close');\n closeBtn.setAttribute('aria-label', 'Close');\n closeBtn.innerHTML = `<svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"><path d=\"M4 4l6 6M10 4l-6 6\"/></svg>`;\n closeBtn.addEventListener('click', onClose);\n card.appendChild(closeBtn);\n\n // Color accent\n const color = event.color || 'blue';\n const accent = document.createElement('div');\n accent.classList.add('cal-sched-detail__accent');\n accent.style.background = `hsl(var(--cal-booking-${color}-fg))`;\n card.appendChild(accent);\n\n // Title\n const title = document.createElement('div');\n title.classList.add('cal-sched-detail__title');\n title.textContent = event.title || 'Untitled';\n card.appendChild(title);\n\n // Time row\n if (event.startTime && event.endTime) {\n const timeRow = document.createElement('div');\n timeRow.classList.add('cal-sched-detail__row');\n\n const icon = document.createElement('span');\n icon.classList.add('cal-sched-detail__icon');\n icon.innerHTML = `<svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"><circle cx=\"7\" cy=\"7\" r=\"5.5\"/><path d=\"M7 4v3.5l2.5 1.5\"/></svg>`;\n timeRow.appendChild(icon);\n\n const startP = parseTime(event.startTime);\n const endP = parseTime(event.endTime);\n const timeText = document.createElement('span');\n if (startP && endP) {\n timeText.textContent = `${formatTime(startP.hours, startP.minutes, format)}\\u2013${formatTime(endP.hours, endP.minutes, format)}`;\n }\n timeRow.appendChild(timeText);\n card.appendChild(timeRow);\n }\n\n // Date row\n if (event.start) {\n const dateRow = document.createElement('div');\n dateRow.classList.add('cal-sched-detail__row');\n\n const icon = document.createElement('span');\n icon.classList.add('cal-sched-detail__icon');\n icon.innerHTML = `<svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"><rect x=\"1.5\" y=\"2.5\" width=\"11\" height=\"9.5\" rx=\"1.5\"/><path d=\"M4.5 1v2.5M9.5 1v2.5M1.5 5.5h11\"/></svg>`;\n dateRow.appendChild(icon);\n\n const d = parseDate(event.start);\n const dateText = document.createElement('span');\n if (d) {\n let text = `${getDayName(event.start, 'long')}, ${MONTH_NAMES[d.getMonth()]} ${d.getDate()}`;\n if (event.end && event.end !== event.start) {\n const de = parseDate(event.end);\n if (de) {\n text += ` \\u2013 ${MONTH_NAMES[de.getMonth()]} ${de.getDate()}`;\n }\n }\n dateText.textContent = text;\n }\n dateRow.appendChild(dateText);\n card.appendChild(dateRow);\n }\n\n // Resource row\n if (resource && resource.name) {\n const resRow = document.createElement('div');\n resRow.classList.add('cal-sched-detail__row');\n\n const dot = document.createElement('span');\n dot.classList.add('cal-sched-detail__res-dot');\n dot.style.background = `hsl(var(--cal-booking-${resource.color || 'blue'}-fg))`;\n resRow.appendChild(dot);\n\n const resText = document.createElement('span');\n resText.textContent = resource.name;\n if (resource.capacity) {\n resText.textContent += ` (capacity: ${resource.capacity})`;\n }\n resRow.appendChild(resText);\n card.appendChild(resRow);\n }\n\n // Metadata\n if (event.metadata && typeof event.metadata === 'object') {\n const entries = Object.entries(event.metadata);\n if (entries.length > 0) {\n const metaSection = document.createElement('div');\n metaSection.classList.add('cal-sched-detail__meta');\n for (const [key, value] of entries) {\n const row = document.createElement('div');\n row.classList.add('cal-sched-detail__meta-row');\n const label = document.createElement('span');\n label.classList.add('cal-sched-detail__meta-label');\n label.textContent = key;\n const val = document.createElement('span');\n val.textContent = String(value);\n row.appendChild(label);\n row.appendChild(val);\n metaSection.appendChild(row);\n }\n card.appendChild(metaSection);\n }\n }\n\n // Action buttons\n if (actions && actions.length > 0) {\n const actionsRow = document.createElement('div');\n actionsRow.classList.add('cal-sched-detail__actions');\n for (const action of actions) {\n const btn = document.createElement('button');\n btn.classList.add('cal-sched-detail__action');\n if (action.type === 'danger') btn.classList.add('cal-sched-detail__action--danger');\n btn.textContent = action.label;\n btn.addEventListener('click', () => {\n onAction?.(action.label);\n });\n actionsRow.appendChild(btn);\n }\n card.appendChild(actionsRow);\n }\n\n backdrop.appendChild(card);\n\n // Escape key\n const handleKey = (e) => {\n if (e.key === 'Escape') {\n onClose();\n }\n };\n backdrop.addEventListener('keydown', handleKey);\n requestAnimationFrame(() => closeBtn.focus());\n\n return backdrop;\n}\n\nexport const eventDetailStyles = `\n .cal-sched-detail-backdrop {\n position: absolute;\n inset: 0;\n z-index: 20;\n display: flex;\n align-items: flex-start;\n justify-content: center;\n padding-top: 80px;\n background: rgba(0, 0, 0, 0.06);\n }\n\n .cal-sched-detail {\n position: relative;\n background: hsl(var(--cal-bg));\n border: 1px solid hsl(var(--cal-border));\n border-radius: var(--cal-radius);\n box-shadow: 0 8px 30px -4px rgba(0, 0, 0, 0.12), 0 2px 8px -2px rgba(0, 0, 0, 0.06);\n padding: 16px 20px;\n min-width: 260px;\n max-width: 340px;\n font-size: 13px;\n color: hsl(var(--cal-fg));\n user-select: text;\n }\n\n .cal-sched-detail__close {\n position: absolute;\n top: 10px;\n right: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border-radius: var(--cal-radius-sm);\n color: hsl(var(--cal-fg-muted));\n transition: background var(--cal-transition), color var(--cal-transition);\n }\n\n .cal-sched-detail__close:hover {\n background: hsl(var(--cal-hover));\n color: hsl(var(--cal-fg));\n }\n\n .cal-sched-detail__accent {\n width: 32px;\n height: 4px;\n border-radius: 2px;\n margin-bottom: 10px;\n }\n\n .cal-sched-detail__title {\n font-size: 15px;\n font-weight: 600;\n margin-bottom: 12px;\n padding-right: 24px;\n }\n\n .cal-sched-detail__row {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 4px 0;\n color: hsl(var(--cal-fg-muted));\n font-size: 13px;\n }\n\n .cal-sched-detail__icon {\n display: flex;\n flex-shrink: 0;\n color: hsl(var(--cal-fg-muted));\n }\n\n .cal-sched-detail__res-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex-shrink: 0;\n margin-left: 3px;\n margin-right: 3px;\n }\n\n .cal-sched-detail__meta {\n margin-top: 10px;\n padding-top: 10px;\n border-top: 1px solid hsl(var(--cal-border));\n }\n\n .cal-sched-detail__meta-row {\n display: flex;\n justify-content: space-between;\n padding: 2px 0;\n font-size: 12px;\n color: hsl(var(--cal-fg-muted));\n }\n\n .cal-sched-detail__meta-label {\n font-weight: 500;\n text-transform: capitalize;\n }\n\n .cal-sched-detail__actions {\n display: flex;\n gap: 6px;\n margin-top: 14px;\n padding-top: 12px;\n border-top: 1px solid hsl(var(--cal-border));\n }\n\n .cal-sched-detail__action {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 6px 12px;\n font-size: 12px;\n font-weight: 500;\n border-radius: var(--cal-radius-sm);\n border: 1px solid hsl(var(--cal-border));\n color: hsl(var(--cal-fg));\n background: hsl(var(--cal-bg));\n transition: background var(--cal-transition);\n cursor: pointer;\n }\n\n .cal-sched-detail__action:hover {\n background: hsl(var(--cal-hover));\n }\n\n .cal-sched-detail__action--danger {\n color: hsl(var(--cal-status-error-fg));\n border-color: hsl(var(--cal-status-error-border));\n }\n\n .cal-sched-detail__action--danger:hover {\n background: hsl(var(--cal-status-error-bg));\n }\n`;\n","/**\n * Resource tabs renderer — shared tab bar for filtering by resource across all views.\n */\n\n/**\n * Render the resource tab bar.\n * @param {object} options\n * @param {object[]} options.resources - resource objects with id, name, color\n * @param {string|null} options.selectedResourceId - currently active filter (null = \"All\")\n * @param {function} options.onResourceFilter - called with resourceId or null\n * @returns {HTMLElement}\n */\nexport function renderResourceTabs({ resources, selectedResourceId, onResourceFilter }) {\n const tabBar = document.createElement('div');\n tabBar.classList.add('cal-sched-res-tabs');\n\n const allTab = document.createElement('button');\n allTab.classList.add('cal-sched-res-tabs__tab');\n if (!selectedResourceId) allTab.classList.add('cal-sched-res-tabs__tab--active');\n allTab.textContent = 'All';\n allTab.addEventListener('click', () => onResourceFilter?.(null));\n tabBar.appendChild(allTab);\n\n for (const r of resources) {\n const tab = document.createElement('button');\n tab.classList.add('cal-sched-res-tabs__tab');\n if (selectedResourceId === r.id) tab.classList.add('cal-sched-res-tabs__tab--active');\n\n const dot = document.createElement('span');\n dot.classList.add('cal-sched-res-tabs__dot');\n dot.style.background = `hsl(var(--cal-booking-${r.color || 'blue'}-fg))`;\n tab.appendChild(dot);\n tab.appendChild(document.createTextNode(r.name));\n tab.addEventListener('click', () => onResourceFilter?.(r.id));\n tabBar.appendChild(tab);\n }\n\n return tabBar;\n}\n\nexport const resourceTabsStyles = `\n .cal-sched-res-tabs {\n display: flex;\n gap: 4px;\n padding: 8px 12px;\n border-bottom: 1px solid hsl(var(--cal-sched-grid-line));\n background: hsl(var(--cal-sched-header-bg));\n flex-wrap: wrap;\n }\n\n .cal-sched-res-tabs__tab {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n font-weight: 500;\n color: hsl(var(--cal-fg-muted));\n padding: 4px 10px;\n border-radius: var(--cal-radius-sm);\n border: 1px solid hsl(var(--cal-border));\n transition: all var(--cal-transition);\n }\n\n .cal-sched-res-tabs__tab:hover {\n background: hsl(var(--cal-hover));\n color: hsl(var(--cal-fg));\n }\n\n .cal-sched-res-tabs__tab--active {\n background: hsl(var(--cal-accent));\n color: hsl(var(--cal-accent-fg));\n border-color: hsl(var(--cal-accent));\n }\n\n .cal-sched-res-tabs__tab--active:hover {\n background: hsl(var(--cal-accent));\n color: hsl(var(--cal-accent-fg));\n }\n\n .cal-sched-res-tabs__dot {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n }\n`;\n","/**\n * Floating action button (FAB) — circular \"+\" button anchored to bottom-right.\n */\n\n/**\n * Render the FAB button.\n * @param {object} options\n * @param {function} options.onClick\n * @returns {HTMLElement}\n */\nexport function renderFab({ onClick }) {\n const btn = document.createElement('button');\n btn.classList.add('cal-sched-fab');\n btn.setAttribute('aria-label', 'Create event');\n btn.innerHTML = `<svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><path d=\"M10 4v12M4 10h12\"/></svg>`;\n\n btn.addEventListener('click', (e) => {\n e.stopPropagation();\n onClick?.();\n });\n\n return btn;\n}\n\nexport const fabStyles = `\n .cal-sched-fab {\n position: absolute;\n bottom: 16px;\n right: 16px;\n width: 48px;\n height: 48px;\n border-radius: 50%;\n background: hsl(var(--cal-accent));\n color: hsl(var(--cal-accent-fg));\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 4px 12px -2px rgba(0, 0, 0, 0.2), 0 2px 4px -1px rgba(0, 0, 0, 0.1);\n cursor: pointer;\n z-index: 8;\n transition: transform var(--cal-transition), box-shadow var(--cal-transition);\n }\n\n .cal-sched-fab:hover {\n transform: scale(1.08);\n box-shadow: 0 6px 16px -2px rgba(0, 0, 0, 0.25), 0 3px 6px -1px rgba(0, 0, 0, 0.12);\n }\n\n .cal-sched-fab:active {\n transform: scale(0.96);\n }\n\n .cal-sched-fab:focus-visible {\n outline: 2px solid hsl(var(--cal-ring));\n outline-offset: 2px;\n }\n`;\n","/**\n * Drag manager — pointer-event-based drag system for moving, resizing, and creating events.\n */\n\nimport { timeToMinutes, minutesToTime } from '../../core/times.js';\nimport { pixelOffsetToTime, snapToSlot, timeToPixelOffset } from '../../core/scheduler-utils.js';\n\nconst DRAG_THRESHOLD = 4; // pixels before drag initiates\n\n/**\n * Create a drag manager for the scheduler.\n * @param {object} options\n * @param {ShadowRoot} options.shadowRoot\n * @param {function} options.getConfig - () => { slotHeight, interval, startTime, endTime, format, snapInterval, minDuration, maxDuration }\n * @param {function} options.getViewInfo - () => { view, anchorDate, weekDates, resources, resourceMode, selectedResourceId }\n * @param {function} options.getEvents - () => events[]\n * @param {function} options.onMove - ({ event, from, to }) => void\n * @param {function} options.onResize - ({ event, from, to }) => void\n * @param {function} options.onCreate - ({ date, startTime, endTime, resourceId }) => void\n * @returns {{ enable(), disable(), destroy() }}\n */\nexport function createDragManager({ shadowRoot, getConfig, getViewInfo, getEvents, onMove, onResize, onCreate }) {\n let enabled = false;\n let mode = null; // 'move' | 'resize' | 'create'\n let dragEvent = null;\n let ghost = null;\n let originalBlock = null;\n let grabOffsetX = 0;\n let grabOffsetY = 0;\n let startPointerX = 0;\n let startPointerY = 0;\n let hasMoved = false;\n let originalEndTime = null;\n let originalStartTime = null;\n let originalDate = null;\n let originalResourceId = null;\n let timeLabel = null;\n let dropPreview = null; // unified drop zone overlay element\n let capturedPointerId = null;\n let capturedElement = null;\n\n // Create mode state\n let createPreview = null;\n let createDate = null;\n let createResourceId = null;\n let createStartTime = null;\n let createGridTop = 0;\n\n function handlePointerDown(e) {\n if (!enabled) return;\n // Ignore right clicks\n if (e.button !== 0) return;\n\n const resizeHandle = e.target.closest('.cal-sched-event__resize-handle');\n const eventBlock = e.target.closest('.cal-sched-event[data-draggable=\"true\"]');\n\n if (eventBlock) {\n // Event drag or resize\n const eventId = eventBlock.dataset.eventId;\n const events = getEvents();\n dragEvent = events.find((ev) => ev.id === eventId);\n if (!dragEvent) return;\n\n e.preventDefault();\n e.stopPropagation();\n\n capturedElement = eventBlock;\n capturedPointerId = e.pointerId;\n eventBlock.setPointerCapture(e.pointerId);\n\n startPointerX = e.clientX;\n startPointerY = e.clientY;\n hasMoved = false;\n\n originalStartTime = dragEvent.startTime;\n originalEndTime = dragEvent.endTime;\n originalDate = dragEvent.start;\n originalResourceId = dragEvent.resourceId;\n\n if (resizeHandle) {\n mode = 'resize';\n originalBlock = eventBlock;\n originalBlock.classList.add('cal-sched-event--resizing');\n } else {\n mode = 'move';\n originalBlock = eventBlock;\n }\n } else {\n // Check if clicking on an empty slot for drag-to-create\n const slotEl = e.target.closest('[data-time]');\n if (!slotEl) return;\n\n // Don't interfere with slot prompts or other interactive elements\n if (e.target.closest('.cal-sched-slot-prompt')) return;\n\n const target = resolveDropTarget(e.clientX, e.clientY);\n if (!target) return;\n\n e.preventDefault();\n\n mode = 'create';\n startPointerX = e.clientX;\n startPointerY = e.clientY;\n hasMoved = false;\n createDate = target.date;\n createResourceId = target.resourceId;\n createStartTime = target.time;\n\n // Compute grid top for positioning\n const slots = shadowRoot.querySelectorAll('[data-time]');\n if (slots.length > 0) {\n createGridTop = slots[0].getBoundingClientRect().top;\n }\n\n capturedElement = slotEl;\n capturedPointerId = e.pointerId;\n slotEl.setPointerCapture(e.pointerId);\n }\n\n shadowRoot.addEventListener('pointermove', handlePointerMove);\n shadowRoot.addEventListener('pointerup', handlePointerUp);\n }\n\n function handlePointerMove(e) {\n if (!mode) return;\n\n const dx = e.clientX - startPointerX;\n const dy = e.clientY - startPointerY;\n const dist = Math.sqrt(dx * dx + dy * dy);\n\n if (!hasMoved && dist < DRAG_THRESHOLD) return;\n hasMoved = true;\n\n if (mode === 'move') {\n // Lazy-create ghost on first real move\n if (!ghost && originalBlock) {\n const rect = originalBlock.getBoundingClientRect();\n grabOffsetX = startPointerX - rect.left;\n grabOffsetY = startPointerY - rect.top;\n\n ghost = originalBlock.cloneNode(true);\n ghost.classList.add('cal-sched-event--ghost');\n // Clear the absolute positioning from the event block CSS\n ghost.style.cssText = `\n position: fixed;\n width: ${rect.width}px;\n height: ${rect.height}px;\n left: ${rect.left}px;\n top: ${rect.top}px;\n z-index: 1000;\n pointer-events: none;\n opacity: 0.85;\n box-shadow: 0 8px 24px -4px rgba(0,0,0,0.2);\n background: hsl(var(--ev-bg));\n color: hsl(var(--ev-fg));\n border-left: 3px solid hsl(var(--ev-fg));\n border-radius: var(--cal-radius-sm);\n padding: 2px 6px;\n font-size: 12px;\n line-height: 1.3;\n overflow: hidden;\n `;\n // Copy the CSS custom properties for colors\n ghost.style.setProperty('--ev-bg', originalBlock.style.getPropertyValue('--ev-bg'));\n ghost.style.setProperty('--ev-fg', originalBlock.style.getPropertyValue('--ev-fg'));\n shadowRoot.appendChild(ghost);\n\n originalBlock.classList.add('cal-sched-event--dragging');\n }\n\n // Update ghost position\n if (ghost) {\n ghost.style.left = `${e.clientX - grabOffsetX}px`;\n ghost.style.top = `${e.clientY - grabOffsetY}px`;\n }\n\n // Resolve drop target\n const target = resolveDropTarget(e.clientX, e.clientY);\n if (target) {\n highlightDropTarget(target);\n } else {\n clearDropHighlight();\n }\n } else if (mode === 'resize') {\n const config = getConfig();\n const snap = config.snapInterval || config.interval;\n const pixelsPerSnap = config.slotHeight * (snap / config.interval);\n const deltaY = e.clientY - startPointerY;\n const deltaSnaps = Math.round(deltaY / pixelsPerSnap);\n const deltaMins = deltaSnaps * snap;\n\n const origEndMins = timeToMinutes(originalEndTime);\n const origStartMins = timeToMinutes(originalStartTime);\n let newEndMins = origEndMins + deltaMins;\n\n // Enforce minimum duration (default: 1 snap unit)\n const minDuration = config.minDuration || snap;\n const minEndMins = origStartMins + minDuration;\n if (newEndMins < minEndMins) newEndMins = minEndMins;\n\n // Enforce maximum duration\n if (config.maxDuration) {\n const maxEndMins = origStartMins + config.maxDuration;\n if (newEndMins > maxEndMins) newEndMins = maxEndMins;\n }\n\n // Enforce grid bounds\n const maxMins = timeToMinutes(config.endTime);\n if (newEndMins > maxMins) newEndMins = maxMins;\n\n const newEndTime = minutesToTime(newEndMins);\n\n // Update block height visually\n if (originalBlock) {\n const newTop = timeToPixelOffset(originalStartTime, config.startTime, config.slotHeight, config.interval);\n const newBottom = timeToPixelOffset(newEndTime, config.startTime, config.slotHeight, config.interval);\n originalBlock.style.height = `${Math.max(newBottom - newTop, config.slotHeight * 0.5)}px`;\n }\n\n // Show floating time label\n showTimeLabel(e.clientX, e.clientY, newEndTime, config.format);\n } else if (mode === 'create') {\n const config = getConfig();\n const snap = config.snapInterval || config.interval;\n const relativeY = e.clientY - createGridTop;\n const rawTime = pixelOffsetToTime(Math.max(0, relativeY), config.startTime, config.slotHeight, config.interval);\n const snappedTime = snapToSlot(rawTime, snap);\n const snappedMins = timeToMinutes(snappedTime);\n const startMins = timeToMinutes(createStartTime);\n const gridEndMins = timeToMinutes(config.endTime);\n\n // Enforce minimum duration (default: 1 snap unit)\n const minDuration = config.minDuration || snap;\n let endMins = Math.max(snappedMins, startMins + minDuration);\n\n // Enforce maximum duration\n if (config.maxDuration) {\n const maxEndMins = startMins + config.maxDuration;\n if (endMins > maxEndMins) endMins = maxEndMins;\n }\n\n if (endMins > gridEndMins) endMins = gridEndMins;\n const currentEndTime = minutesToTime(endMins);\n\n // Create or update preview block\n if (!createPreview) {\n createPreview = document.createElement('div');\n createPreview.classList.add('cal-sched-create-preview');\n\n // Find the parent lane to attach the preview\n let parentLane = null;\n if (createResourceId) {\n parentLane = shadowRoot.querySelector(`[data-resource-id=\"${createResourceId}\"][data-date=\"${createDate}\"]`);\n if (!parentLane) {\n parentLane = shadowRoot.querySelector(`[data-date=\"${createDate}\"] [data-resource-id=\"${createResourceId}\"]`);\n }\n }\n if (!parentLane) {\n parentLane = shadowRoot.querySelector(`[data-date=\"${createDate}\"] .cal-sched-week__lane`) ||\n shadowRoot.querySelector(`[data-date=\"${createDate}\"] .cal-sched-day__lane`) ||\n shadowRoot.querySelector(`[data-date=\"${createDate}\"]`);\n }\n if (parentLane) {\n parentLane.appendChild(createPreview);\n }\n }\n\n if (createPreview) {\n const config2 = getConfig();\n const top = timeToPixelOffset(createStartTime, config2.startTime, config2.slotHeight, config2.interval);\n const bottom = timeToPixelOffset(currentEndTime, config2.startTime, config2.slotHeight, config2.interval);\n createPreview.style.top = `${top}px`;\n createPreview.style.height = `${Math.max(bottom - top, config2.slotHeight * 0.5)}px`;\n\n // Store current end for use on pointerup\n createPreview.dataset.endTime = currentEndTime;\n }\n\n showTimeLabel(e.clientX, e.clientY, currentEndTime, config.format);\n }\n }\n\n function handlePointerUp(e) {\n if (!mode) return;\n\n shadowRoot.removeEventListener('pointermove', handlePointerMove);\n shadowRoot.removeEventListener('pointerup', handlePointerUp);\n\n if (capturedElement && capturedPointerId != null) {\n try { capturedElement.releasePointerCapture(capturedPointerId); } catch (_) {}\n capturedElement = null;\n capturedPointerId = null;\n }\n\n if (mode === 'move') {\n clearDropHighlight();\n\n if (ghost) {\n ghost.remove();\n ghost = null;\n }\n\n if (originalBlock) {\n originalBlock.classList.remove('cal-sched-event--dragging');\n }\n\n if (hasMoved) {\n // Mark to prevent click-through to event detail\n if (originalBlock) originalBlock.dataset.wasDragged = 'true';\n\n const target = resolveDropTarget(e.clientX, e.clientY);\n if (target && dragEvent) {\n const config = getConfig();\n const durationMins = timeToMinutes(originalEndTime) - timeToMinutes(originalStartTime);\n const newStartTime = target.time;\n const newStartMins = timeToMinutes(newStartTime);\n const newEndMins = Math.min(newStartMins + durationMins, timeToMinutes(config.endTime));\n const newEndTime = minutesToTime(newEndMins);\n\n const from = {\n date: originalDate,\n startTime: originalStartTime,\n endTime: originalEndTime,\n resourceId: originalResourceId,\n };\n const to = {\n date: target.date,\n startTime: newStartTime,\n endTime: newEndTime,\n resourceId: target.resourceId || originalResourceId,\n };\n\n if (from.date !== to.date || from.startTime !== to.startTime || from.resourceId !== to.resourceId) {\n onMove?.({ event: dragEvent, from, to });\n }\n }\n }\n // If !hasMoved, it was just a click — let it propagate normally for event detail\n } else if (mode === 'resize') {\n if (hasMoved) {\n const config = getConfig();\n const snap = config.snapInterval || config.interval;\n const pixelsPerSnap = config.slotHeight * (snap / config.interval);\n const deltaY = e.clientY - startPointerY;\n const deltaSnaps = Math.round(deltaY / pixelsPerSnap);\n const deltaMins = deltaSnaps * snap;\n\n const origEndMins = timeToMinutes(originalEndTime);\n const origStartMins = timeToMinutes(originalStartTime);\n let newEndMins = origEndMins + deltaMins;\n\n const minDuration = config.minDuration || snap;\n const minEndMins = origStartMins + minDuration;\n if (newEndMins < minEndMins) newEndMins = minEndMins;\n\n if (config.maxDuration) {\n const maxEndMins = origStartMins + config.maxDuration;\n if (newEndMins > maxEndMins) newEndMins = maxEndMins;\n }\n\n const maxMins = timeToMinutes(config.endTime);\n if (newEndMins > maxMins) newEndMins = maxMins;\n\n const newEndTime = minutesToTime(newEndMins);\n\n if (originalBlock) originalBlock.dataset.wasDragged = 'true';\n\n if (newEndTime !== originalEndTime && dragEvent) {\n onResize?.({\n event: dragEvent,\n from: { endTime: originalEndTime },\n to: { endTime: newEndTime },\n });\n }\n }\n\n if (originalBlock) {\n originalBlock.classList.remove('cal-sched-event--resizing');\n }\n\n hideTimeLabel();\n } else if (mode === 'create') {\n hideTimeLabel();\n\n const endTime = createPreview?.dataset.endTime || null;\n\n if (createPreview) {\n createPreview.remove();\n createPreview = null;\n }\n\n if (hasMoved && createDate && createStartTime && endTime) {\n onCreate?.({\n date: createDate,\n startTime: createStartTime,\n endTime,\n resourceId: createResourceId,\n });\n }\n\n createDate = null;\n createResourceId = null;\n createStartTime = null;\n createGridTop = 0;\n }\n\n // Reset shared state\n mode = null;\n dragEvent = null;\n originalBlock = null;\n grabOffsetX = 0;\n grabOffsetY = 0;\n startPointerX = 0;\n startPointerY = 0;\n hasMoved = false;\n originalEndTime = null;\n originalStartTime = null;\n originalDate = null;\n originalResourceId = null;\n }\n\n /**\n * Resolve drop target from cursor position using data attributes on grid elements.\n */\n function resolveDropTarget(clientX, clientY) {\n const config = getConfig();\n\n // Find date column under cursor\n const dateCols = shadowRoot.querySelectorAll('[data-date]');\n let targetDate = null;\n let targetResourceId = null;\n\n for (const col of dateCols) {\n const rect = col.getBoundingClientRect();\n if (clientX >= rect.left && clientX <= rect.right) {\n targetDate = col.dataset.date;\n\n // Check for resource lane\n if (col.dataset.resourceId) {\n targetResourceId = col.dataset.resourceId;\n } else {\n // Check child lanes for resource\n const lanes = col.querySelectorAll('[data-resource-id]');\n for (const lane of lanes) {\n const laneRect = lane.getBoundingClientRect();\n if (clientX >= laneRect.left && clientX <= laneRect.right) {\n targetResourceId = lane.dataset.resourceId;\n break;\n }\n }\n }\n break;\n }\n }\n\n if (!targetDate) return null;\n\n // Resolve time from Y position\n const slots = shadowRoot.querySelectorAll('[data-time]');\n if (slots.length === 0) return null;\n\n const firstSlot = slots[0];\n const gridTop = firstSlot.getBoundingClientRect().top;\n const relativeY = clientY - gridTop;\n\n if (relativeY < 0) return null;\n\n const snap = config.snapInterval || config.interval;\n const rawTime = pixelOffsetToTime(relativeY, config.startTime, config.slotHeight, config.interval);\n const snappedTime = snapToSlot(rawTime, snap);\n\n // Clamp to grid bounds\n const snappedMins = timeToMinutes(snappedTime);\n const startMins = timeToMinutes(config.startTime);\n const endMins = timeToMinutes(config.endTime);\n if (snappedMins < startMins || snappedMins >= endMins) return null;\n\n return {\n date: targetDate,\n time: snappedTime,\n resourceId: targetResourceId,\n };\n }\n\n function highlightDropTarget(target) {\n clearDropHighlight();\n\n const config = getConfig();\n\n // Compute event duration\n let durationMins = config.interval;\n if (dragEvent && originalStartTime && originalEndTime) {\n durationMins = timeToMinutes(originalEndTime) - timeToMinutes(originalStartTime);\n }\n\n const dropStartMins = timeToMinutes(target.time);\n let dropEndMins = dropStartMins + durationMins;\n\n // Clamp to grid bounds\n const gridEndMins = timeToMinutes(config.endTime);\n if (dropEndMins > gridEndMins) dropEndMins = gridEndMins;\n\n const dropEndTime = minutesToTime(dropEndMins);\n\n // Find the lane container\n let lane = findLane(target.date, target.resourceId);\n if (!lane) return;\n\n // Create unified overlay positioned with timeToPixelOffset\n dropPreview = document.createElement('div');\n dropPreview.classList.add('cal-sched-drop-preview');\n\n const top = timeToPixelOffset(target.time, config.startTime, config.slotHeight, config.interval);\n const bottom = timeToPixelOffset(dropEndTime, config.startTime, config.slotHeight, config.interval);\n dropPreview.style.top = `${top}px`;\n dropPreview.style.height = `${Math.max(bottom - top, config.slotHeight * 0.5)}px`;\n\n lane.appendChild(dropPreview);\n }\n\n function clearDropHighlight() {\n if (dropPreview) {\n dropPreview.remove();\n dropPreview = null;\n }\n }\n\n function findLane(date, resourceId) {\n if (resourceId) {\n let lane = shadowRoot.querySelector(\n `[data-resource-id=\"${resourceId}\"][data-date=\"${date}\"]`\n );\n if (!lane) {\n lane = shadowRoot.querySelector(\n `[data-date=\"${date}\"] [data-resource-id=\"${resourceId}\"]`\n );\n }\n if (lane) return lane;\n }\n // Fallback: find a lane-like container inside the date column\n const dateCol = shadowRoot.querySelector(`[data-date=\"${date}\"]`);\n if (!dateCol) return null;\n return dateCol.querySelector('.cal-sched-week__lane') ||\n dateCol.querySelector('.cal-sched-day__lane') ||\n dateCol;\n }\n\n function showTimeLabel(x, y, time, format) {\n if (!timeLabel) {\n timeLabel = document.createElement('div');\n timeLabel.classList.add('cal-sched-drag-time-label');\n shadowRoot.appendChild(timeLabel);\n }\n const { hours, minutes } = parseTimeStr(time);\n const formatted = format === '12h'\n ? formatTime12(hours, minutes)\n : time;\n timeLabel.textContent = formatted;\n timeLabel.style.left = `${x + 12}px`;\n timeLabel.style.top = `${y - 8}px`;\n }\n\n function hideTimeLabel() {\n if (timeLabel) {\n timeLabel.remove();\n timeLabel = null;\n }\n }\n\n function parseTimeStr(str) {\n const [h, m] = str.split(':').map(Number);\n return { hours: h, minutes: m };\n }\n\n function formatTime12(h, m) {\n const period = h >= 12 ? 'PM' : 'AM';\n const h12 = h % 12 || 12;\n return `${h12}:${String(m).padStart(2, '0')} ${period}`;\n }\n\n function enable() {\n if (enabled) return;\n enabled = true;\n shadowRoot.addEventListener('pointerdown', handlePointerDown);\n }\n\n function disable() {\n enabled = false;\n shadowRoot.removeEventListener('pointerdown', handlePointerDown);\n shadowRoot.removeEventListener('pointermove', handlePointerMove);\n shadowRoot.removeEventListener('pointerup', handlePointerUp);\n cleanup();\n }\n\n function cleanup() {\n if (ghost) { ghost.remove(); ghost = null; }\n if (createPreview) { createPreview.remove(); createPreview = null; }\n if (originalBlock) {\n originalBlock.classList.remove('cal-sched-event--dragging', 'cal-sched-event--resizing');\n originalBlock = null;\n }\n clearDropHighlight();\n hideTimeLabel();\n mode = null;\n dragEvent = null;\n hasMoved = false;\n }\n\n function destroy() {\n disable();\n }\n\n return { enable, disable, destroy };\n}\n\nexport const dragStyles = `\n [data-draggable=\"true\"] {\n cursor: grab;\n }\n\n [data-draggable=\"true\"]:active {\n cursor: grabbing;\n }\n\n .cal-sched-event--dragging {\n opacity: 0.3;\n pointer-events: none;\n }\n\n .cal-sched-event--ghost {\n pointer-events: none;\n }\n\n .cal-sched-event--resizing {\n z-index: 10;\n }\n\n .cal-sched-event__resize-handle {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n height: 6px;\n cursor: ns-resize;\n border-radius: 0 0 var(--cal-radius-sm) var(--cal-radius-sm);\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .cal-sched-event__resize-handle::after {\n content: '';\n width: 20px;\n height: 2px;\n border-radius: 1px;\n background: currentColor;\n opacity: 0.3;\n transition: opacity var(--cal-transition);\n }\n\n .cal-sched-event__resize-handle:hover::after {\n opacity: 0.6;\n }\n\n .cal-sched-drop-preview {\n position: absolute;\n left: 2px;\n right: 2px;\n background: hsl(var(--cal-accent) / 0.12);\n border: 1.5px solid hsl(var(--cal-accent) / 0.5);\n border-radius: var(--cal-radius-sm);\n z-index: 3;\n pointer-events: none;\n transition: top 0.05s ease, height 0.05s ease;\n }\n\n .cal-sched-create-preview {\n position: absolute;\n left: 2px;\n right: 2px;\n background: hsl(var(--cal-accent) / 0.15);\n border: 1.5px dashed hsl(var(--cal-accent));\n border-radius: var(--cal-radius-sm);\n z-index: 4;\n pointer-events: none;\n transition: height 0.05s ease;\n }\n\n .cal-sched-drag-time-label {\n position: fixed;\n background: hsl(var(--cal-fg));\n color: hsl(var(--cal-bg));\n font-size: 11px;\n font-weight: 500;\n padding: 2px 6px;\n border-radius: var(--cal-radius-sm);\n pointer-events: none;\n z-index: 1001;\n white-space: nowrap;\n }\n`;\n","/**\n * CalScheduler — Flexible resource scheduling calendar view.\n */\n\nimport { CalendarBase } from '../../core/base-component.js';\nimport { createStore } from '../../core/state.js';\nimport { today, addDays, parseDate, toDateString, addMonths } from '../../core/dates.js';\nimport { timeToMinutes } from '../../core/times.js';\nimport { getWeekDates, getViewTitle } from '../../core/scheduler-utils.js';\nimport { findAvailableSlot, isSlotAvailable as _isSlotAvailable } from './scheduler-data.js';\nimport { tokens } from '../../styles/tokens.js';\nimport { reset } from '../../styles/reset.js';\nimport { animations } from '../../styles/animations.js';\nimport { renderSchedulerNav, schedulerNavStyles } from './scheduler-nav.js';\nimport { timeAxisStyles } from './time-axis.js';\nimport { resourceHeaderStyles } from './resource-header.js';\nimport { eventBlockStyles } from './event-block.js';\nimport { renderDayView, dayViewStyles } from './day-view.js';\nimport { renderWeekView, weekViewStyles } from './week-view.js';\nimport { renderMonthView, monthViewStyles } from './month-view.js';\nimport { renderSchedulerGridSkeleton, renderSchedulerMonthSkeleton, schedulerSkeletonStyles } from './scheduler-skeleton.js';\nimport { renderStatusMessage, statusMessageStyles } from '../shared/status-message.js';\nimport { renderEventDetail, eventDetailStyles } from './event-detail.js';\nimport { renderResourceTabs, resourceTabsStyles } from './resource-tabs.js';\nimport { slotPromptStyles } from './slot-prompt.js';\nimport { renderFab, fabStyles } from './fab-button.js';\nimport { createDragManager, dragStyles } from './drag-manager.js';\n\nconst componentStyles = `\n .cal-sched {\n background: hsl(var(--cal-bg));\n border-radius: var(--cal-radius);\n user-select: none;\n font-size: 14px;\n }\n\n .cal-sched__body {\n position: relative;\n }\n`;\n\nexport class CalScheduler extends CalendarBase {\n static get styles() {\n return [\n tokens, reset, animations,\n schedulerNavStyles, timeAxisStyles, resourceHeaderStyles, eventBlockStyles,\n dayViewStyles, weekViewStyles, monthViewStyles,\n schedulerSkeletonStyles, statusMessageStyles, eventDetailStyles,\n resourceTabsStyles, slotPromptStyles, fabStyles, dragStyles,\n componentStyles,\n ];\n }\n\n static get observedAttributes() {\n return [\n 'theme', 'view', 'layout', 'date', 'start-time', 'end-time',\n 'interval', 'format', 'first-day', 'loading', 'slot-height',\n 'resource-mode', 'show-event-time', 'show-fab', 'draggable-events',\n 'snap-interval', 'min-duration', 'max-duration',\n ];\n }\n\n constructor() {\n super();\n\n this._store = createStore({\n view: 'week',\n anchorDate: today(),\n layout: 'vertical',\n selectedResourceId: null,\n // Slot selection\n selectedSlot: null,\n // Event detail\n detailEvent: null,\n detailResource: null,\n // Status\n statusType: null,\n statusMessage: null,\n statusDismissible: true,\n // All-day collapse\n allDayCollapsed: false,\n });\n\n this._resources = [];\n this._events = [];\n this._eventActions = [];\n this._eventContent = null;\n this._unsubscribe = null;\n this._rendering = false;\n this._nowTimer = null;\n this._dragManager = null;\n }\n\n // -- Attribute getters --\n get view() { return this.getAttribute('view') || this._store.get('view'); }\n get layout() { return this.getAttribute('layout') || this._store.get('layout'); }\n get startTime() { return this.getAttribute('start-time') || '08:00'; }\n get endTime() { return this.getAttribute('end-time') || '18:00'; }\n get interval() { return parseInt(this.getAttribute('interval') || '30', 10); }\n get format() { return this.getAttribute('format') || '24h'; }\n get firstDay() { return parseInt(this.getAttribute('first-day') || '0', 10); }\n get slotHeight() { return parseInt(this.getAttribute('slot-height') || '48', 10); }\n get resourceMode() { return this.getAttribute('resource-mode') || 'tabs'; }\n get loading() { return this.hasAttribute('loading'); }\n set loading(val) { val ? this.setAttribute('loading', '') : this.removeAttribute('loading'); }\n get showEventTime() { return this.getAttribute('show-event-time') !== 'false'; }\n get showFab() { return this.hasAttribute('show-fab'); }\n get draggableEvents() { return this.hasAttribute('draggable-events'); }\n get snapInterval() { const v = this.getAttribute('snap-interval'); return v ? parseInt(v, 10) : null; }\n get minDuration() { const v = this.getAttribute('min-duration'); return v ? parseInt(v, 10) : null; }\n get maxDuration() { const v = this.getAttribute('max-duration'); return v ? parseInt(v, 10) : null; }\n\n // -- Properties --\n get resources() { return this._resources; }\n set resources(val) {\n this._resources = Array.isArray(val) ? val : [];\n if (this._initialized) this.render();\n }\n\n get events() { return this._events; }\n set events(val) {\n this._events = Array.isArray(val) ? val : [];\n if (this._initialized) this.render();\n }\n\n get eventActions() { return this._eventActions; }\n set eventActions(val) {\n this._eventActions = Array.isArray(val) ? val : [];\n if (this._initialized) this.render();\n }\n\n get eventContent() { return this._eventContent; }\n set eventContent(val) {\n this._eventContent = typeof val === 'function' ? val : null;\n if (this._initialized) this.render();\n }\n\n get value() { return this._lastSlotValue || null; }\n\n // -- Lifecycle --\n connectedCallback() {\n // Read date attribute into store\n const dateAttr = this.getAttribute('date');\n if (dateAttr) {\n this._store.set({ anchorDate: dateAttr });\n }\n const viewAttr = this.getAttribute('view');\n if (viewAttr) {\n this._store.set({ view: viewAttr });\n }\n const layoutAttr = this.getAttribute('layout');\n if (layoutAttr) {\n this._store.set({ layout: layoutAttr });\n }\n\n super.connectedCallback();\n\n this._unsubscribe = this._store.subscribe(() => {\n if (!this._rendering) this.render();\n });\n\n // Auto-update now line every 60s\n this._nowTimer = setInterval(() => {\n const view = this._store.get('view');\n if (view === 'day' || view === 'week') {\n this.render();\n }\n }, 60000);\n\n if (this.draggableEvents) this._initDrag();\n }\n\n disconnectedCallback() {\n this._unsubscribe?.();\n clearInterval(this._nowTimer);\n clearTimeout(this._statusTimer);\n this._destroyDrag();\n if (this._escHandler) {\n document.removeEventListener('keydown', this._escHandler);\n this._escHandler = null;\n }\n }\n\n attributeChangedCallback(name, oldVal, newVal) {\n if (oldVal === newVal) return;\n if (name === 'date' && newVal) {\n this._store.set({ anchorDate: newVal });\n return;\n }\n if (name === 'view' && newVal) {\n this._store.set({ view: newVal });\n return;\n }\n if (name === 'layout' && newVal) {\n this._store.set({ layout: newVal });\n return;\n }\n if (name === 'draggable-events') {\n if (newVal !== null) {\n this._initDrag();\n } else {\n this._destroyDrag();\n }\n }\n if (this._initialized) this.render();\n }\n\n // -- Public methods --\n goToDate(dateStr) {\n this._store.set({ anchorDate: dateStr });\n this.emit('cal:date-change', { date: dateStr, view: this._store.get('view') });\n }\n\n setView(view) {\n if (!['day', 'week', 'month'].includes(view)) return;\n this._store.set({ view });\n this.emit('cal:view-change', { view, date: this._store.get('anchorDate') });\n }\n\n today() {\n this.goToDate(today());\n }\n\n next() {\n const state = this._store.getState();\n const d = parseDate(state.anchorDate);\n if (!d) return;\n\n let newDate;\n if (state.view === 'day') {\n newDate = addDays(state.anchorDate, 1);\n } else if (state.view === 'week') {\n newDate = addDays(state.anchorDate, 7);\n } else {\n const { year, month } = addMonths(d.getFullYear(), d.getMonth(), 1);\n newDate = toDateString(new Date(year, month, 1));\n }\n\n this._store.set({ anchorDate: newDate });\n this.emit('cal:date-change', { date: newDate, view: state.view });\n }\n\n prev() {\n const state = this._store.getState();\n const d = parseDate(state.anchorDate);\n if (!d) return;\n\n let newDate;\n if (state.view === 'day') {\n newDate = addDays(state.anchorDate, -1);\n } else if (state.view === 'week') {\n newDate = addDays(state.anchorDate, -7);\n } else {\n const { year, month } = addMonths(d.getFullYear(), d.getMonth(), -1);\n newDate = toDateString(new Date(year, month, 1));\n }\n\n this._store.set({ anchorDate: newDate });\n this.emit('cal:date-change', { date: newDate, view: state.view });\n }\n\n findAvailableSlot(opts) {\n return findAvailableSlot(\n opts,\n this._resources,\n this._events,\n this.interval,\n this.startTime,\n this.endTime,\n );\n }\n\n isSlotAvailable(date, startTime, endTime, resourceId) {\n return _isSlotAvailable(this._events, resourceId, date, startTime, endTime);\n }\n\n // -- Event handlers --\n _handleSlotClick(date, startTime, endTime, resourceId, resource) {\n this._lastSlotValue = { date, startTime, endTime, resourceId, resource };\n this._store.set({ selectedSlot: { date, startTime, endTime, resourceId, resource } });\n this.emit('cal:slot-select', { date, startTime, endTime, resourceId, resource });\n }\n\n _handleSlotCreate(date, startTime, endTime, resourceId, resource) {\n this.emit('cal:slot-create', { date, startTime, endTime, resourceId, resource });\n }\n\n _dismissSlot() {\n this._store.set({ selectedSlot: null });\n }\n\n _handleEventClick(event, resourceId, resource) {\n this._dismissSlot();\n this._store.set({ detailEvent: event, detailResource: resource || null });\n this.emit('cal:event-click', { event, resourceId, resource });\n }\n\n _closeDetail() {\n this._store.set({ detailEvent: null, detailResource: null });\n }\n\n _handleViewChange(view) {\n this._dismissSlot();\n this.setView(view);\n }\n\n _handleResourceFilter(resourceId) {\n this._dismissSlot();\n this._store.set({ selectedResourceId: resourceId });\n }\n\n _handleEventAction(actionLabel) {\n const state = this._store.getState();\n const event = state.detailEvent;\n const resource = state.detailResource;\n this.emit('cal:event-action', {\n action: actionLabel,\n event,\n resourceId: event?.resourceId,\n resource,\n });\n }\n\n _initDrag() {\n if (this._dragManager) return;\n this._dragManager = createDragManager({\n shadowRoot: this.shadowRoot,\n getConfig: () => ({\n slotHeight: this.slotHeight,\n interval: this.interval,\n startTime: this.startTime,\n endTime: this.endTime,\n format: this.format,\n snapInterval: this.snapInterval,\n minDuration: this.minDuration,\n maxDuration: this.maxDuration,\n }),\n getViewInfo: () => {\n const state = this._store.getState();\n return {\n view: state.view,\n anchorDate: state.anchorDate,\n weekDates: getWeekDates(state.anchorDate, this.firstDay),\n resources: this._resources.length > 0 ? this._resources : [{ id: '__default', name: '' }],\n resourceMode: this.resourceMode,\n selectedResourceId: state.selectedResourceId,\n };\n },\n getEvents: () => this._events,\n onMove: (detail) => {\n this.emit('cal:event-move', detail);\n },\n onResize: (detail) => {\n this.emit('cal:event-resize', detail);\n },\n onCreate: (detail) => {\n const resource = this._resources.find((r) => r.id === detail.resourceId) || null;\n this.emit('cal:slot-create', { ...detail, resource });\n },\n });\n this._dragManager.enable();\n }\n\n _destroyDrag() {\n if (this._dragManager) {\n this._dragManager.destroy();\n this._dragManager = null;\n }\n }\n\n _handleFabClick() {\n const state = this._store.getState();\n this.emit('cal:fab-create', { date: state.anchorDate, view: state.view });\n }\n\n // -- Render --\n render() {\n if (this._rendering) return;\n this._rendering = true;\n\n const root = this.shadowRoot;\n\n // Clear non-style children\n const children = [...root.childNodes];\n for (const child of children) {\n if (child.nodeName !== 'STYLE' && !(child instanceof CSSStyleSheet)) {\n root.removeChild(child);\n }\n }\n\n const state = this._store.getState();\n const wrapper = document.createElement('div');\n wrapper.classList.add('cal-sched');\n\n // Status banner\n if (state.statusType && state.statusMessage) {\n wrapper.appendChild(renderStatusMessage({\n type: state.statusType,\n message: state.statusMessage,\n dismissible: state.statusDismissible,\n onDismiss: () => this.clearStatus(),\n }));\n }\n\n const currentView = state.view;\n const anchorDate = state.anchorDate;\n const weekDates = getWeekDates(anchorDate, this.firstDay);\n const title = getViewTitle(currentView, anchorDate, weekDates);\n const resourceMode = this.resourceMode;\n\n // Navigation\n wrapper.appendChild(renderSchedulerNav({\n title,\n view: currentView,\n onPrev: () => this.prev(),\n onNext: () => this.next(),\n onToday: () => this.today(),\n onViewChange: (v) => this._handleViewChange(v),\n }));\n\n // Ensure at least one resource\n const resources = this._resources.length > 0\n ? this._resources\n : [{ id: '__default', name: '' }];\n\n // Resource tabs (shown in tabs mode with multiple resources)\n const showTabs = resourceMode === 'tabs' && resources.length > 1 && resources[0].id !== '__default';\n if (showTabs && !this.loading) {\n wrapper.appendChild(renderResourceTabs({\n resources,\n selectedResourceId: state.selectedResourceId,\n onResourceFilter: (rid) => this._handleResourceFilter(rid),\n }));\n }\n\n // Filter events by selected resource tab\n let filteredEvents = this._events;\n if (showTabs && state.selectedResourceId) {\n filteredEvents = this._events.filter((ev) => ev.resourceId === state.selectedResourceId);\n }\n\n // In tabs mode with a specific resource selected, pass just that resource\n let viewResources = resources;\n if (showTabs && state.selectedResourceId) {\n const selected = resources.find((r) => r.id === state.selectedResourceId);\n if (selected) viewResources = [selected];\n }\n\n // Body\n const body = document.createElement('div');\n body.classList.add('cal-sched__body');\n\n if (this.loading) {\n if (currentView === 'month') {\n body.appendChild(renderSchedulerMonthSkeleton());\n } else {\n const cols = currentView === 'week' ? 7 : Math.max(this._resources.length, 1);\n body.appendChild(renderSchedulerGridSkeleton({\n columns: cols,\n rows: Math.ceil((timeToMinutes(this.endTime) - timeToMinutes(this.startTime)) / this.interval),\n slotHeight: this.slotHeight,\n }));\n }\n } else {\n if (currentView === 'day') {\n body.appendChild(renderDayView({\n date: anchorDate,\n resources: viewResources,\n events: filteredEvents,\n startTime: this.startTime,\n endTime: this.endTime,\n interval: this.interval,\n slotHeight: this.slotHeight,\n format: this.format,\n layout: state.layout,\n resourceMode,\n selectedSlot: state.selectedSlot,\n eventContent: this._eventContent,\n showTime: this.showEventTime,\n draggable: this.draggableEvents,\n onSlotClick: (d, st, et, rid, r) => this._handleSlotClick(d, st, et, rid, r),\n onEventClick: (ev, rid, r) => this._handleEventClick(ev, rid, r),\n onSlotCreate: (d, st, et, rid, r) => this._handleSlotCreate(d, st, et, rid, r),\n }));\n } else if (currentView === 'week') {\n body.appendChild(renderWeekView({\n date: anchorDate,\n firstDay: this.firstDay,\n resources: viewResources,\n events: filteredEvents,\n startTime: this.startTime,\n endTime: this.endTime,\n interval: this.interval,\n slotHeight: this.slotHeight,\n format: this.format,\n layout: state.layout,\n resourceMode,\n selectedSlot: state.selectedSlot,\n eventContent: this._eventContent,\n showTime: this.showEventTime,\n draggable: this.draggableEvents,\n allDayCollapsed: state.allDayCollapsed,\n onToggleAllDay: () => this._store.set({ allDayCollapsed: !state.allDayCollapsed }),\n onSlotClick: (d, st, et, rid, r) => this._handleSlotClick(d, st, et, rid, r),\n onEventClick: (ev, rid, r) => this._handleEventClick(ev, rid, r),\n onSlotCreate: (d, st, et, rid, r) => this._handleSlotCreate(d, st, et, rid, r),\n }));\n } else if (currentView === 'month') {\n body.appendChild(renderMonthView({\n date: anchorDate,\n firstDay: this.firstDay,\n resources: viewResources,\n events: filteredEvents,\n format: this.format,\n selectedResourceId: state.selectedResourceId,\n selectedDate: state.selectedSlot?.date || null,\n eventContent: this._eventContent,\n onSlotClick: (d) => this._handleSlotClick(d, null, null, null, null),\n onEventClick: (ev, rid, r) => this._handleEventClick(ev, rid, r),\n onSlotCreate: (d) => this._handleSlotCreate(d, null, null, null, null),\n }));\n }\n }\n\n wrapper.appendChild(body);\n\n // Event detail popover\n if (state.detailEvent) {\n body.appendChild(renderEventDetail({\n event: state.detailEvent,\n resource: state.detailResource,\n format: this.format,\n onClose: () => this._closeDetail(),\n actions: this._eventActions,\n onAction: (label) => this._handleEventAction(label),\n }));\n }\n\n // FAB button\n if (this.showFab && !this.loading) {\n body.appendChild(renderFab({\n onClick: () => this._handleFabClick(),\n }));\n }\n\n root.appendChild(wrapper);\n\n // Escape key dismisses slot selection\n if (!this._escHandler) {\n this._escHandler = (e) => {\n if (e.key === 'Escape') {\n if (this._store.get('selectedSlot')) {\n this._dismissSlot();\n }\n }\n };\n this.shadowRoot.addEventListener('keydown', this._escHandler);\n // Also listen on the host for non-focusable areas\n document.addEventListener('keydown', this._escHandler);\n }\n\n this._rendering = false;\n }\n}\n","import { CalDatepicker } from './components/datepicker/index.js';\nimport { CalBooking } from './components/booking/index.js';\nimport { CalTimepicker } from './components/timepicker/index.js';\nimport { CalScheduler } from './components/scheduler/index.js';\n\n// Guard against double-registration\nif (!customElements.get('cal-datepicker')) {\n customElements.define('cal-datepicker', CalDatepicker);\n}\n\nif (!customElements.get('cal-booking')) {\n customElements.define('cal-booking', CalBooking);\n}\n\nif (!customElements.get('cal-timepicker')) {\n customElements.define('cal-timepicker', CalTimepicker);\n}\n\nif (!customElements.get('cal-scheduler')) {\n customElements.define('cal-scheduler', CalScheduler);\n}\n\nexport { CalDatepicker, CalBooking, CalTimepicker, CalScheduler };\n"],"names":["CalendarBase","sheets","s","sheet","el","name","detail","type","message","opts","autoDismiss","dismissible","selector","createStore","initial","state","listeners","key","partial","prev","changed","fn","MONTH_NAMES","SHORT_WEEKDAYS","DAY_NAMES","SHORT_DAY_NAMES","getDayName","dateStr","format","d","parseDate","getWeekdayLabels","firstDay","labels","i","getDaysInMonth","year","month","getFirstDayOfMonth","toDateString","date","y","m","day","value","isSameDay","a","b","da","db","isInRange","start","end","e","dt","st","et","today","addMonths","delta","addDays","n","buildMonthGrid","daysInMonth","startOffset","cells","todayStr","daysInPrev","dateString","next","tokens","reset","animations","BOOKING_COLORS","DEFAULT_COLOR","getColorTokens","colorName","resolveCellData","bookings","dayData","labelFormula","checkoutBooking","checkinBooking","spanningBooking","status","label","halfDay","colorOut","colorIn","colorFull","staticData","formulaResult","isSelectionValid","selStart","selEnd","booking","isHoverRangeInvalid","rangeStart","hoverDate","renderCalendarGrid","options","selectedDates","rangeEnd","minDate","maxDate","disabledDates","mode","focusedDate","onSelect","onHover","showLabelsOnHover","isBookingMode","grid","headerRow","cell","effectiveEnd","hoverInvalid","row","btn","dateObj","cellData","bookingDisabled","tooltipLabel","spanning","lo","hi","isStart","isEnd","inRange","effectiveDisabled","isDateDisabled","numSpan","labelSpan","calendarGridStyles","chevronLeft","chevronRight","renderNavigation","onPrev","onNext","onTitleClick","nav","prevBtn","titleTag","title","nextBtn","navigationStyles","SHORT_MONTHS","renderMonthYearPicker","pickerYear","viewMonth","viewYear","onMonthSelect","onYearPrev","onYearNext","onClose","wrapper","yearNav","yearLabel","now","todayMonth","todayYear","monthYearPickerStyles","getBuiltinPresets","t","renderPresets","presetKeys","container","builtins","presets","p","preset","chip","presetsStyles","createPopover","trigger","content","panel","isOpen","position","triggerRect","panelHeight","spaceBelow","spaceAbove","open","outsideClick","escapeKey","close","_a","host","destroy","popoverStyles","renderTimeGridSkeleton","columns","rows","durationLabels","count","pill","renderCalendarGridSkeleton","loadingSkeletonStyles","icons","renderStatusMessage","onDismiss","banner","icon","text","closeBtn","statusMessageStyles","calendarIcon","componentStyles","CalDatepicker","val","attr","k","valueAttr","_b","oldVal","newVal","dates","idx","focused","newDate","buttons","monthsWrapper","monthEl","showDual","monthCount","picker","animClass","range","root","children","child","popover","parseTime","str","trimmed","ampmMatch","hours","minutes","period","match24","formatTime","mm","timeToMinutes","minutesToTime","generateSlots","startTime","endTime","intervalMinutes","slots","startMin","endMin","generateDurationSlots","time","nextMin","endSlotTime","parsed","parsedEnd","fromText","toText","currentTime","isTimeInRange","renderTimeGrid","selected","hoverTime","unavailableTimes","slot","displayTime","timeSpan","isUnavailable","isSlotSelected","isRangeComplete","timeGridStyles","CalBooking","updates","bookingsAttr","hoverRangeInvalid","invalidRange","timeSection","header","timeGrid","clockIcon","CalTimepicker","current","rangeComplete","getWeekStart","diff","getWeekDates","getViewTitle","view","anchorDate","weekDates","first","last","getEventsForDate","events","ev","resolveEventOverlaps","sorted","aStart","bStart","aEnd","evStart","evEnd","placed","c","maxCol","other","oStart","oEnd","timeToPixelOffset","timeStr","slotSize","interval","pixelOffsetToTime","px","mins","totalMins","snapToSlot","snapped","getResourceDayEvents","resourceId","isSlotAvailable","dayEvents","slotStart","slotEnd","findAvailableSlot","resources","dayStart","dayEnd","duration","minCapacity","startDate","searchDays","candidateResources","r","dayStartMin","dayEndMin","resource","renderSchedulerNav","onToday","onViewChange","left","todayBtn","titleEl","tabs","v","tab","schedulerNavStyles","renderTimeAxis","slotHeight","axis","timeAxisStyles","renderResourceHeader","width","dot","color","badge","renderResourceHeaderRow","resourceHeaderStyles","renderEventBlock","event","gridStartTime","onClick","eventContent","showTime","draggable","block","isLocked","top","bottom","height","colWidth","custom","startParsed","endParsed","handle","renderAllDayChip","renderMonthChip","eventBlockStyles","renderSlotPrompt","resourceName","onCreate","card","info","startP","endP","timeEl","dateEl","resEl","slotPromptStyles","renderDayView","layout","resourceMode","selectedSlot","onSlotClick","onEventClick","onSlotCreate","isTabsMode","showResources","allDayEvents","timedEvents","allDayRow","chips","spacer","gridArea","lanesWrapper","lane","slotEl","resTimedEvents","resolved","defaultResource","slotResId","nowMins","startMins","endMins","nowLine","dayViewStyles","MAX_ALLDAY_CHIPS","MAX_ALLDAY_DOTS","renderWeekView","allDayCollapsed","onToggleAllDay","allDayByDate","dayEvts","spacerLabel","toggleBtn","dayAllDay","dotsWrapper","visibleDots","visibleChips","headerSpacer","dayHeader","dayName","dayNum","resRow","resLabel","colsWrapper","dayCol","dayTimedEvents","resEvents","todayIdx","colPercent","weekViewStyles","MAX_VISIBLE_EVENTS","renderMonthView","selectedResourceId","selectedDate","weekdayRow","cellEl","eventsContainer","visible","overflow","more","monthViewStyles","renderSchedulerGridSkeleton","col","body","timeLabel","renderSchedulerMonthSkeleton","weekdays","num","chipCount","schedulerSkeletonStyles","renderEventDetail","actions","onAction","backdrop","accent","timeRow","timeText","dateRow","dateText","de","resText","entries","metaSection","actionsRow","action","handleKey","eventDetailStyles","renderResourceTabs","onResourceFilter","tabBar","allTab","resourceTabsStyles","renderFab","fabStyles","DRAG_THRESHOLD","createDragManager","shadowRoot","getConfig","getViewInfo","getEvents","onMove","onResize","enabled","dragEvent","ghost","originalBlock","grabOffsetX","grabOffsetY","startPointerX","startPointerY","hasMoved","originalEndTime","originalStartTime","originalDate","originalResourceId","dropPreview","capturedPointerId","capturedElement","createPreview","createDate","createResourceId","createStartTime","createGridTop","handlePointerDown","resizeHandle","eventBlock","eventId","target","resolveDropTarget","handlePointerMove","handlePointerUp","dx","dy","dist","rect","highlightDropTarget","clearDropHighlight","config","snap","pixelsPerSnap","deltaY","deltaMins","origEndMins","origStartMins","newEndMins","minDuration","minEndMins","maxEndMins","maxMins","newEndTime","newTop","newBottom","showTimeLabel","relativeY","rawTime","snappedTime","snappedMins","gridEndMins","currentEndTime","parentLane","config2","durationMins","newStartTime","newStartMins","from","to","hideTimeLabel","clientX","clientY","dateCols","targetDate","targetResourceId","lanes","laneRect","gridTop","dropEndMins","dropEndTime","findLane","dateCol","x","parseTimeStr","formatted","formatTime12","h","enable","disable","cleanup","dragStyles","CalScheduler","dateAttr","viewAttr","layoutAttr","_isSlotAvailable","actionLabel","currentView","showTabs","rid","filteredEvents","viewResources","cols"],"mappings":"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AW5E,IAAU4E,KACrBC,KAAW7E,IAAU6E;AAE3B;AAEO,MAAM6B,KAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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"}