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.
- package/README.md +734 -0
- package/dist/booking.es.js +1845 -0
- package/dist/booking.es.js.map +1 -0
- package/dist/booking.umd.js +888 -0
- package/dist/booking.umd.js.map +1 -0
- package/dist/calkit.es.js +5230 -0
- package/dist/calkit.es.js.map +1 -0
- package/dist/calkit.umd.js +2164 -0
- package/dist/calkit.umd.js.map +1 -0
- package/dist/datepicker.es.js +1619 -0
- package/dist/datepicker.es.js.map +1 -0
- package/dist/datepicker.umd.js +818 -0
- package/dist/datepicker.umd.js.map +1 -0
- package/dist/scheduler.es.js +3235 -0
- package/dist/scheduler.es.js.map +1 -0
- package/dist/scheduler.umd.js +1547 -0
- package/dist/scheduler.umd.js.map +1 -0
- package/dist/timepicker.es.js +962 -0
- package/dist/timepicker.es.js.map +1 -0
- package/dist/timepicker.umd.js +517 -0
- package/dist/timepicker.umd.js.map +1 -0
- package/llms.txt +594 -0
- package/package.json +58 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduler.umd.js","sources":["../src/core/base-component.js","../src/core/state.js","../src/core/dates.js","../src/core/times.js","../src/core/scheduler-utils.js","../src/components/scheduler/scheduler-data.js","../src/styles/tokens.js","../src/styles/reset.js","../src/styles/animations.js","../src/components/datepicker/navigation.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/shared/status-message.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/entries/scheduler.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","/**\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 * 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","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","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","/**\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 * 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","/**\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 { CalScheduler } from '../components/scheduler/index.js';\n\nif (!customElements.get('cal-scheduler')) {\n customElements.define('cal-scheduler', CalScheduler);\n}\n\nexport { CalScheduler };\n"],"names":["CalendarBase","sheets","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","today","addMonths","delta","addDays","n","buildMonthGrid","daysInMonth","startOffset","cells","todayStr","daysInPrev","dateString","next","parseTime","str","trimmed","ampmMatch","hours","minutes","period","match24","formatTime","mm","timeToMinutes","t","minutesToTime","generateSlots","startTime","endTime","intervalMinutes","slots","startMin","endMin","currentTime","now","getWeekStart","diff","getWeekDates","start","dates","getViewTitle","view","anchorDate","weekDates","first","last","getEventsForDate","events","ev","resolveEventOverlaps","sorted","aStart","bStart","aEnd","columns","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","tokens","reset","animations","chevronLeft","chevronRight","renderSchedulerNav","title","onPrev","onNext","onToday","onViewChange","nav","left","prevBtn","nextBtn","todayBtn","titleEl","tabs","v","tab","schedulerNavStyles","renderTimeAxis","slotHeight","axis","time","parsed","slot","label","timeAxisStyles","renderResourceHeader","width","header","dot","color","badge","renderResourceHeaderRow","row","resourceHeaderStyles","renderEventBlock","event","gridStartTime","onClick","eventContent","showTime","draggable","block","isLocked","top","bottom","height","colWidth","custom","wrapper","startParsed","endParsed","handle","e","renderAllDayChip","chip","renderMonthChip","text","eventBlockStyles","renderSlotPrompt","resourceName","onCreate","card","info","startP","endP","timeEl","dateEl","resEl","btn","slotPromptStyles","renderDayView","layout","resourceMode","selectedSlot","onSlotClick","onEventClick","onSlotCreate","container","isTabsMode","showResources","allDayEvents","timedEvents","allDayRow","chips","headerRow","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","cell","dayAllDay","dotsWrapper","visibleDots","visibleChips","headerSpacer","dayHeader","dayName","dayNum","resRow","resLabel","colsWrapper","dayCol","dayTimedEvents","resEvents","todayIdx","colPercent","weekViewStyles","MAX_VISIBLE_EVENTS","renderMonthView","selectedResourceId","selectedDate","weekdayRow","grid","cellEl","eventsContainer","visible","overflow","more","monthViewStyles","renderSchedulerGridSkeleton","rows","col","body","timeLabel","renderSchedulerMonthSkeleton","weekdays","num","chipCount","schedulerSkeletonStyles","icons","renderStatusMessage","onDismiss","banner","icon","closeBtn","statusMessageStyles","renderEventDetail","onClose","actions","onAction","backdrop","accent","timeRow","timeText","dateRow","dateText","de","resText","entries","metaSection","val","actionsRow","action","handleKey","eventDetailStyles","renderResourceTabs","onResourceFilter","tabBar","allTab","resourceTabsStyles","renderFab","fabStyles","DRAG_THRESHOLD","createDragManager","shadowRoot","getConfig","getViewInfo","getEvents","onMove","onResize","enabled","mode","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","destroy","dragStyles","componentStyles","CalScheduler","dateAttr","viewAttr","layoutAttr","_a","oldVal","newVal","newDate","_isSlotAvailable","actionLabel","root","children","child","currentView","showTabs","rid","filteredEvents","viewResources","selected","cols","st","et"],"mappings":"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"}
|