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.umd.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","host","_a","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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"}