kalendly 0.3.2 → 0.3.4

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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/types.ts","../src/core/utils.ts","../src/core/calendar-engine.ts","../src/core/index.ts","../src/web-components/CalendarElement.ts","../src/web-components/index.ts"],"sourcesContent":["// Known values keep autocomplete; any other string is still accepted\ntype Open<T extends string> = T | (string & {});\n\nexport interface CalendarEvent {\n id: string | number;\n date: string | Date;\n\n // Rendered as the event card's title. Availability mode never renders the\n // card, so callers there need not supply one.\n name?: string;\n\n // Last day of a multi-day event, inclusive. Absent means a single day.\n endDate?: string | Date;\n\n // Time fields\n startTime?: string;\n endTime?: string;\n allDay?: boolean;\n\n // Display & categorization\n description?: string;\n color?: string;\n category?: Open<\n 'work' | 'personal' | 'meeting' | 'deadline' | 'appointment' | 'other'\n >;\n location?: string;\n url?: string;\n\n // Status & priority\n status?: Open<'scheduled' | 'completed' | 'cancelled' | 'tentative'>;\n priority?: Open<'low' | 'medium' | 'high'>;\n\n // Availability bucket. Distinct from `status`: this is the caller's own\n // state mapped down to an opaque label for the availability layer, so\n // internal detail never reaches the calendar.\n availabilityStatus?: Open<'open' | 'conditional' | 'blocked'>;\n\n // Collaboration\n attendees?: string[];\n organizer?: string;\n\n // Reminders & recurrence\n reminders?: number[];\n recurring?: {\n frequency: 'daily' | 'weekly' | 'monthly' | 'yearly';\n interval?: number;\n endDate?: string | Date;\n daysOfWeek?: number[];\n };\n\n // Metadata\n notes?: string;\n tags?: string[];\n createdAt?: string | Date;\n updatedAt?: string | Date;\n\n // Flexibility for custom fields\n [key: string]: unknown;\n}\n\nexport interface CalendarDate {\n date: Date;\n isCurrentMonth: boolean;\n isToday: boolean;\n hasEvents: boolean;\n events: CalendarEvent[];\n}\n\nexport interface CalendarState {\n currentYear: number;\n currentMonth: number;\n currentDate: number;\n selectedDate: Date | null;\n selectedDayIndex: number | null;\n tasks: CalendarEvent[];\n}\n\nexport interface CategoryColorMap {\n [category: string]: string;\n}\n\nexport interface CalendarConfig {\n events: CalendarEvent[];\n initialDate?: Date;\n minYear?: number;\n maxYear?: number;\n weekStartsOn?: 0 | 1;\n categoryColors?: CategoryColorMap;\n monthCount?: number;\n}\n\nexport interface CalendarPane {\n year: number;\n month: number;\n monthAndYearText: string;\n calendarDates: CalendarDate[][];\n}\n\nexport interface CalendarActions {\n next: () => void;\n previous: () => void;\n jump: (year: number, month: number) => void;\n goToToday: () => void;\n isCurrentMonth: () => boolean;\n selectDate: (date: Date) => void;\n updateTasks: () => void;\n}\n\nexport interface CalendarViewModel extends CalendarState {\n months: string[];\n days: string[];\n years: number[];\n monthAndYearText: string;\n scheduleDay: string;\n panes: CalendarPane[];\n calendarDates: CalendarDate[][];\n}\n\nexport type CalendarEventHandler = (event: CalendarEvent) => void;\n\nexport interface CalendarProps {\n events: CalendarEvent[];\n initialDate?: Date;\n minYear?: number;\n maxYear?: number;\n weekStartsOn?: 0 | 1;\n useShortMonthNames?: boolean;\n onDateSelect?: (date: Date) => void;\n onEventClick?: CalendarEventHandler;\n onMonthChange?: (year: number, month: number) => void;\n}\n\nexport interface CalendarTheme {\n primary?: string;\n secondary?: string;\n tertiary?: string;\n textColor?: string;\n textLight?: string;\n background?: string;\n cellHover?: string;\n borderColor?: string;\n todayOutline?: string;\n selectedBg?: string;\n outOfRangeBg?: string;\n outOfRangeFg?: string;\n headerBg?: string;\n popupBg?: string;\n pickerBg?: string;\n pickerShadow?: string;\n eventIndicator?: string;\n onAccent?: string;\n link?: string;\n\n // Availability — traffic light\n openBg?: string;\n openFg?: string;\n conditionalBg?: string;\n conditionalFg?: string;\n blockedBg?: string;\n blockedFg?: string;\n rangeBg?: string;\n rangeOutline?: string;\n inRangeBg?: string;\n inRangeOutline?: string;\n\n // Badges — badgeBg/badgeText are the fallback for caller-defined values\n badgeBg?: string;\n badgeText?: string;\n badgeSuccessBg?: string;\n badgeSuccessText?: string;\n badgeInfoBg?: string;\n badgeInfoText?: string;\n badgeWarningBg?: string;\n badgeWarningText?: string;\n badgeDangerBg?: string;\n badgeDangerText?: string;\n badgeNeutralBg?: string;\n badgeNeutralText?: string;\n badgePositiveBg?: string;\n badgePositiveText?: string;\n badgeTentativeBg?: string;\n badgeTentativeText?: string;\n}\n","import { CalendarEvent, CalendarDate, CategoryColorMap } from './types';\n\nexport const MONTHS = [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec',\n];\n\nexport const MONTHS_FULL = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n];\n\nexport const DAYS = [\n 'Sunday',\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n];\n\nexport function normalizeDate(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0);\n}\n\nexport function isSameDay(date1: Date, date2: Date): boolean {\n return normalizeDate(date1).getTime() === normalizeDate(date2).getTime();\n}\n\nexport function isToday(date: Date): boolean {\n return isSameDay(date, new Date());\n}\n\nexport function generateYears(minYear?: number, maxYear?: number): number[] {\n const currentYear = new Date().getFullYear();\n const min = minYear ?? currentYear - 30;\n const max = maxYear ?? currentYear + 10;\n\n return Array.from({ length: max - min + 1 }, (_, i) => min + i);\n}\n\n// endDate is inclusive, matching the endDate cal-availability-select emits, so\n// a selection can be handed straight back as one event.\n// \"09:00-12:00,13:00-17:00\" to half-open [start, end) minute intervals.\n// Throws rather than dropping a bad range: a vendor who mistypes their opening\n// hours must hear about it, not quietly stop selling the afternoon.\nexport function parseHourRanges(\n value: string,\n slotDuration: number\n): Array<[number, number]> {\n const parts = value\n .split(',')\n .map(part => part.trim())\n .filter(Boolean);\n\n if (parts.length === 0) {\n throw new Error(\n `<kal-calendar> available-hours is empty. Omit the attribute to allow ` +\n `every hour, or name at least one HH:MM-HH:MM range.`\n );\n }\n\n const ranges = parts.map((part): [number, number] => {\n const halves = part.split('-');\n if (halves.length !== 2) {\n throw new Error(\n `<kal-calendar> available-hours range \"${part}\" is not HH:MM-HH:MM.`\n );\n }\n\n const [start, end] = halves.map(half => parseTimeToMinutes(half.trim()));\n if (start === null || end === null) {\n throw new Error(\n `<kal-calendar> available-hours range \"${part}\" has an unreadable ` +\n `time. Use 24-hour HH:MM.`\n );\n }\n if (start >= end) {\n throw new Error(\n `<kal-calendar> available-hours range \"${part}\" starts at or after ` +\n `it ends.`\n );\n }\n if (start % slotDuration !== 0 || end % slotDuration !== 0) {\n throw new Error(\n `<kal-calendar> available-hours range \"${part}\" does not land on a ` +\n `${slotDuration}-minute slot boundary.`\n );\n }\n\n return [start, end];\n });\n\n if (mergeIntervals(ranges).length !== ranges.length) {\n throw new Error(\n `<kal-calendar> available-hours ranges overlap or touch: \"${value}\". ` +\n `Write each bookable window once.`\n );\n }\n\n return ranges;\n}\n\n// Both bounds inclusive; either may be null to leave that end unbounded.\nexport function isDateWithinWindow(\n date: Date,\n min: Date | null,\n max: Date | null\n): boolean {\n const target = normalizeDate(date).getTime();\n\n if (min && target < normalizeDate(min).getTime()) return false;\n if (max && target > normalizeDate(max).getTime()) return false;\n\n return true;\n}\n\n// `days` holds getDay() values, 0 = Sunday. Null means every day is allowed.\nexport function isDayAllowed(date: Date, days: number[] | null): boolean {\n return days === null || days.includes(date.getDay());\n}\n\nexport function eventCoversDate(event: CalendarEvent, date: Date): boolean {\n const start = normalizeDate(new Date(event.date)).getTime();\n const target = normalizeDate(date).getTime();\n if (Number.isNaN(start)) return false;\n\n if (event.endDate === undefined || event.endDate === null) {\n return start === target;\n }\n\n const end = normalizeDate(new Date(event.endDate)).getTime();\n if (Number.isNaN(end)) {\n throw new Error(\n `<kal-calendar> event ${event.id} has an unreadable endDate: ` +\n `${String(event.endDate)}.`\n );\n }\n if (end < start) {\n throw new Error(\n `<kal-calendar> event ${event.id} has an endDate before its date: ` +\n `${String(event.endDate)} < ${String(event.date)}.`\n );\n }\n\n return target >= start && target <= end;\n}\n\nexport function getEventsForDate(\n events: CalendarEvent[],\n date: Date\n): CalendarEvent[] {\n return events.filter(event => eventCoversDate(event, date));\n}\n\nexport function hasEvents(events: CalendarEvent[], date: Date): boolean {\n return getEventsForDate(events, date).length > 0;\n}\n\nexport function generateCalendarDates(\n year: number,\n month: number,\n events: CalendarEvent[] = [],\n weekStartsOn: 0 | 1 = 0\n): CalendarDate[][] {\n const firstDay = new Date(year, month, 1);\n const lastDay = new Date(year, month + 1, 0);\n const daysInMonth = lastDay.getDate();\n const prevMonthLastDay = new Date(year, month, 0).getDate();\n\n let firstDayOfWeek = firstDay.getDay();\n if (weekStartsOn === 1) {\n firstDayOfWeek = firstDayOfWeek === 0 ? 6 : firstDayOfWeek - 1;\n }\n\n const dates: CalendarDate[][] = [];\n let day = 1;\n let nextMonthDay = 1;\n\n for (let week = 0; week < 6; week++) {\n const weekDates: CalendarDate[] = [];\n\n for (let dayOfWeek = 0; dayOfWeek < 7; dayOfWeek++) {\n if (week === 0 && dayOfWeek < firstDayOfWeek) {\n // Previous month days\n const prevDay = prevMonthLastDay - firstDayOfWeek + dayOfWeek + 1;\n const prevDate = new Date(year, month - 1, prevDay);\n const dateEvents = getEventsForDate(events, prevDate);\n weekDates.push({\n date: prevDate,\n isCurrentMonth: false,\n isToday: isToday(prevDate),\n hasEvents: dateEvents.length > 0,\n events: dateEvents,\n });\n } else if (day > daysInMonth) {\n // Next month days\n const nextDate = new Date(year, month + 1, nextMonthDay);\n const dateEvents = getEventsForDate(events, nextDate);\n weekDates.push({\n date: nextDate,\n isCurrentMonth: false,\n isToday: isToday(nextDate),\n hasEvents: dateEvents.length > 0,\n events: dateEvents,\n });\n nextMonthDay++;\n } else {\n // Current month days\n const currentDate = new Date(year, month, day);\n const dateEvents = getEventsForDate(events, currentDate);\n weekDates.push({\n date: currentDate,\n isCurrentMonth: true,\n isToday: isToday(currentDate),\n hasEvents: dateEvents.length > 0,\n events: dateEvents,\n });\n day++;\n }\n }\n\n dates.push(weekDates);\n }\n\n return dates;\n}\n\nexport function getCellClasses(calendarDate: CalendarDate): string[] {\n const classes: string[] = [];\n\n if (!calendarDate.isCurrentMonth) {\n classes.push('calendar-cell-other-month');\n }\n\n if (calendarDate.isToday) {\n classes.push('calendar-cell-today');\n }\n\n if (calendarDate.hasEvents) {\n classes.push('calendar-cell-has-event');\n }\n\n return classes;\n}\n\nexport function formatDateForDisplay(date: Date): string {\n return `${DAYS[date.getDay()]} ${date.getDate()}`;\n}\n\nexport function getMonthYearText(year: number, month: number): string {\n return `${MONTHS_FULL[month]} ${year}`;\n}\n\nexport function formatTimeRange(event: CalendarEvent): string {\n if (event.allDay || (!event.startTime && !event.endTime)) {\n return 'All day';\n }\n\n if (event.startTime && event.endTime) {\n return `${event.startTime} - ${event.endTime}`;\n }\n\n if (event.startTime) {\n return `${event.startTime}`;\n }\n\n return '';\n}\n\nexport function formatAttendees(attendees?: string[]): string {\n if (!attendees || attendees.length === 0) return '';\n\n if (attendees.length === 1) return attendees[0];\n if (attendees.length === 2) return attendees.join(' and ');\n\n return `${attendees.slice(0, -1).join(', ')}, and ${attendees[attendees.length - 1]}`;\n}\n\nexport function sortEventsByTime(events: CalendarEvent[]): CalendarEvent[] {\n return [...events].sort((a, b) => {\n const aAllDay = a.allDay || (!a.startTime && !a.endTime);\n const bAllDay = b.allDay || (!b.startTime && !b.endTime);\n\n if (aAllDay && !bAllDay) return -1;\n if (!aAllDay && bAllDay) return 1;\n\n if (!a.startTime || !b.startTime) return 0;\n return a.startTime.localeCompare(b.startTime);\n });\n}\n\nexport const DEFAULT_CATEGORY_COLORS: CategoryColorMap = {\n work: '#3b82f6',\n personal: '#8b5cf6',\n meeting: '#10b981',\n deadline: '#ef4444',\n appointment: '#f59e0b',\n other: '#6b7280',\n};\n\n// Dynamic function that accepts custom colors\nexport function getDefaultEventColor(\n category?: string,\n customColors?: CategoryColorMap\n): string {\n const colorMap = customColors || DEFAULT_CATEGORY_COLORS;\n\n if (category && colorMap[category]) {\n return colorMap[category];\n }\n\n // Default fallback color\n return '#fc8917';\n}\n\n// Helper to merge custom colors with defaults\nexport function mergeCategoryColors(\n customColors?: CategoryColorMap\n): CategoryColorMap {\n return {\n ...DEFAULT_CATEGORY_COLORS,\n ...customColors,\n };\n}\n\n// Validate if a color is a valid hex color\nexport function isValidHexColor(color: string): boolean {\n return /^#([0-9A-F]{3}){1,2}$/i.test(color);\n}\n\n// Get color for a category with validation\nexport function getCategoryColor(\n category: string,\n customColors?: CategoryColorMap\n): string {\n const colorMap = mergeCategoryColors(customColors);\n const color = colorMap[category] || colorMap.other || '#fc8917';\n\n return isValidHexColor(color) ? color : '#fc8917';\n}\n\nconst HTML_ESCAPES: Record<string, string> = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;',\n};\n\n// Escape a value for interpolation into HTML text or a quoted attribute\nexport function escapeHtml(value: unknown): string {\n if (value === null || value === undefined) return '';\n\n return String(value).replace(/[&<>\"']/g, char => HTML_ESCAPES[char]);\n}\n\n// Reduce a caller-supplied value to a single safe CSS class token\nexport function slugifyToken(value: string): string {\n return String(value)\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n}\n\n// Allow http(s), mailto and relative URLs; anything else (javascript:, data:,\n// vbscript:) collapses to a harmless anchor\nexport function safeUrl(value: string): string {\n // Browsers ignore control characters when resolving a scheme, so\n // `java\\0script:` and `java\\tscript:` both navigate. Strip them before\n // testing rather than after.\n const normalized = String(value)\n .split('')\n .filter(char => char.charCodeAt(0) > 0x20)\n .join('');\n\n if (/^(?:https?:|mailto:)/i.test(normalized)) return normalized;\n\n // Relative URLs have no scheme at all — a colon before the first slash,\n // question mark or hash means someone is naming one\n const schemeless = !/^[^/?#]*:/.test(normalized);\n\n return schemeless ? normalized : '#';\n}\n\n// Accept hex colors and bare CSS color keywords; reject anything that could\n// terminate the declaration or escape the style attribute\nexport function safeColor(value: string): string {\n const trimmed = String(value).trim();\n\n return isValidHexColor(trimmed) || /^[a-z]+$/i.test(trimmed)\n ? trimmed\n : '#3b82f6';\n}\n\nexport const MINUTES_PER_DAY = 1440;\nexport const DEFAULT_SLOT_DURATION = 60;\n\nexport function parseTimeToMinutes(time: unknown): number | null {\n if (typeof time !== 'string') return null;\n\n const match = /^(\\d{1,2}):(\\d{2})$/.exec(time.trim());\n if (!match) return null;\n\n const hours = Number(match[1]);\n const mins = Number(match[2]);\n if (hours > 24 || mins > 59 || (hours === 24 && mins > 0)) return null;\n\n return hours * 60 + mins;\n}\n\nexport function formatMinutes(total: number): string {\n const hours = Math.floor(total / 60);\n const mins = total % 60;\n return `${String(hours).padStart(2, '0')}:${String(mins).padStart(2, '0')}`;\n}\n\n// Absolute [start, end) in minutes. An end at or before the start is on the\n// following day, so a booking that crosses midnight is one interval rather than\n// two half-days. An unreadable time occupies the whole day — a booking surface\n// that cannot parse a time must not offer the slot.\nexport function eventInterval(\n event: CalendarEvent,\n slotDuration: number,\n onDay: Date\n): [number, number] | null {\n const day = normalizeDate(onDay).getTime();\n if (Number.isNaN(day)) return null;\n\n const base = day / 60000;\n const wholeDay: [number, number] = [base, base + MINUTES_PER_DAY];\n\n if (event.allDay || !event.startTime) return wholeDay;\n\n const from = parseTimeToMinutes(event.startTime);\n if (from === null) return wholeDay;\n\n if (event.endTime === undefined || event.endTime === null) {\n return [base + from, base + from + slotDuration];\n }\n\n const to = parseTimeToMinutes(event.endTime);\n if (to === null) return wholeDay;\n\n return [base + from, base + (to <= from ? to + MINUTES_PER_DAY : to)];\n}\n\nexport function mergeIntervals(\n intervals: Array<[number, number]>\n): Array<[number, number]> {\n const sorted = [...intervals].sort((a, b) => a[0] - b[0]);\n\n return sorted.reduce<Array<[number, number]>>((merged, [start, end]) => {\n const last = merged[merged.length - 1];\n if (last && start <= last[1]) last[1] = Math.max(last[1], end);\n else merged.push([start, end]);\n return merged;\n }, []);\n}\n\n// Which of the day's slots any booking overlaps. Events from the previous day\n// belong in `events` so a booking crossing midnight marks the morning it runs into.\nexport function bookedSlots(\n events: CalendarEvent[],\n date: Date,\n slotDuration: number = DEFAULT_SLOT_DURATION\n): boolean[] {\n const base = normalizeDate(date).getTime() / 60000;\n\n const previousDay = new Date(date);\n previousDay.setDate(previousDay.getDate() - 1);\n\n // A span's times repeat on each day it covers, so the window is anchored to\n // the day being drawn rather than the day the span began\n const intervals: Array<[number, number]> = [];\n for (const event of new Set(events)) {\n for (const day of [previousDay, date]) {\n if (!eventCoversDate(event, day)) continue;\n const interval = eventInterval(event, slotDuration, day);\n if (interval) intervals.push(interval);\n }\n }\n\n const merged = mergeIntervals(intervals);\n\n return Array.from(\n { length: Math.floor(MINUTES_PER_DAY / slotDuration) },\n (_, index) => {\n const start = base + index * slotDuration;\n const end = start + slotDuration;\n return merged.some(([from, to]) => start < to && end > from);\n }\n );\n}\n","import {\n CalendarEvent,\n CalendarState,\n CalendarConfig,\n CalendarActions,\n CalendarViewModel,\n CalendarPane,\n CategoryColorMap,\n} from './types';\nimport {\n generateCalendarDates,\n getEventsForDate,\n generateYears,\n getMonthYearText,\n formatDateForDisplay,\n mergeCategoryColors,\n getCategoryColor,\n MONTHS,\n DAYS,\n} from './utils';\n\nexport class CalendarEngine {\n private state: CalendarState;\n private config: CalendarConfig;\n private listeners: Set<() => void> = new Set();\n private categoryColors: CategoryColorMap;\n\n constructor(config: CalendarConfig) {\n this.config = config;\n this.categoryColors = mergeCategoryColors(config.categoryColors);\n\n const initialDate = config.initialDate || new Date();\n this.state = {\n currentYear: initialDate.getFullYear(),\n currentMonth: initialDate.getMonth(),\n currentDate: initialDate.getDate(),\n selectedDate: null,\n selectedDayIndex: null,\n tasks: [],\n };\n }\n\n /**\n * Subscribe to state changes\n */\n subscribe(listener: () => void): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n /**\n * Notify all listeners of state changes\n */\n private notify(): void {\n this.listeners.forEach(listener => listener());\n }\n\n /**\n * Get current state\n */\n getState(): CalendarState {\n return { ...this.state };\n }\n\n /**\n * Get view model with computed properties\n */\n getViewModel(): CalendarViewModel {\n const panes: CalendarPane[] = Array.from(\n { length: Math.max(1, this.config.monthCount ?? 1) },\n (_, offset) => {\n const anchor = new Date(\n this.state.currentYear,\n this.state.currentMonth + offset,\n 1\n );\n const year = anchor.getFullYear();\n const month = anchor.getMonth();\n\n return {\n year,\n month,\n monthAndYearText: getMonthYearText(year, month),\n calendarDates: generateCalendarDates(\n year,\n month,\n this.config.events,\n this.config.weekStartsOn\n ),\n };\n }\n );\n\n return {\n ...this.state,\n months: MONTHS,\n days: DAYS,\n years: generateYears(this.config.minYear, this.config.maxYear),\n monthAndYearText: panes[0].monthAndYearText,\n scheduleDay: this.state.selectedDate\n ? formatDateForDisplay(this.state.selectedDate)\n : '',\n panes,\n calendarDates: panes[0].calendarDates,\n };\n }\n\n /**\n * Get actions object\n */\n getActions(): CalendarActions {\n return {\n next: this.next.bind(this),\n previous: this.previous.bind(this),\n jump: this.jump.bind(this),\n goToToday: this.goToToday.bind(this),\n isCurrentMonth: this.isCurrentMonth.bind(this),\n selectDate: this.selectDate.bind(this),\n updateTasks: this.updateTasks.bind(this),\n };\n }\n\n /**\n * Navigate to next month\n */\n private next(): void {\n if (this.state.currentMonth === 11) {\n this.state.currentMonth = 0;\n this.state.currentYear++;\n } else {\n this.state.currentMonth++;\n }\n\n this.state.selectedDate = null;\n this.state.selectedDayIndex = null;\n this.updateTasks();\n this.notify();\n }\n\n /**\n * Navigate to previous month\n */\n private previous(): void {\n if (this.state.currentMonth === 0) {\n this.state.currentMonth = 11;\n this.state.currentYear--;\n } else {\n this.state.currentMonth--;\n }\n\n this.state.selectedDate = null;\n this.state.selectedDayIndex = null;\n this.updateTasks();\n this.notify();\n }\n\n /**\n * Jump to specific month and year\n */\n private jump(year: number, month: number): void {\n this.state.currentYear = year;\n this.state.currentMonth = month;\n this.state.selectedDate = null;\n this.state.selectedDayIndex = null;\n this.updateTasks();\n this.notify();\n }\n\n /**\n * Navigate to current month (today)\n */\n private goToToday(): void {\n const today = new Date();\n this.state.currentYear = today.getFullYear();\n this.state.currentMonth = today.getMonth();\n this.state.selectedDate = null;\n this.state.selectedDayIndex = null;\n this.updateTasks();\n this.notify();\n }\n\n /**\n * Check if currently viewing today's month\n */\n private isCurrentMonth(): boolean {\n const today = new Date();\n return (\n this.state.currentYear === today.getFullYear() &&\n this.state.currentMonth === today.getMonth()\n );\n }\n\n /**\n * Select a specific date\n */\n private selectDate(date: Date, dayIndex?: number): void {\n this.state.selectedDate = date;\n this.state.selectedDayIndex = dayIndex ?? null;\n this.state.currentDate = date.getDate();\n this.state.currentMonth = date.getMonth();\n this.state.currentYear = date.getFullYear();\n this.updateTasks();\n this.notify();\n }\n\n /**\n * Update tasks for the currently selected date\n */\n private updateTasks(): void {\n if (!this.state.selectedDate) {\n this.state.tasks = [];\n return;\n }\n\n this.state.tasks = getEventsForDate(\n this.config.events,\n this.state.selectedDate\n );\n }\n\n /**\n * Update events configuration\n */\n updateEvents(events: CalendarEvent[]): void {\n this.config.events = events;\n this.updateTasks();\n this.notify();\n }\n\n /**\n * Handle date cell click\n */\n handleDateClick(date: Date, dayIndex?: number): void {\n this.selectDate(date, dayIndex);\n }\n\n /**\n * Check if date has events\n */\n hasEventsForDate(date: Date): boolean {\n return getEventsForDate(this.config.events, date).length > 0;\n }\n\n /**\n * Get events for a specific date\n */\n getEventsForDate(date: Date): CalendarEvent[] {\n return getEventsForDate(this.config.events, date);\n }\n\n /**\n * Clear selected date\n */\n clearSelection(): void {\n this.state.selectedDate = null;\n this.state.selectedDayIndex = null;\n this.state.tasks = [];\n this.notify();\n }\n\n /**\n * Get category color (with custom colors support)\n */\n getCategoryColor(category?: string): string {\n if (!category) return '#fc8917';\n return getCategoryColor(category, this.categoryColors);\n }\n\n /**\n * Update category colors dynamically\n */\n updateCategoryColors(colors: CategoryColorMap): void {\n this.categoryColors = mergeCategoryColors(colors);\n this.notify();\n }\n\n /**\n * Get all category colors\n */\n getCategoryColors(): CategoryColorMap {\n return { ...this.categoryColors };\n }\n\n /**\n * Register a new category with color\n */\n registerCategory(name: string, color: string): void {\n this.categoryColors[name] = color;\n this.notify();\n }\n\n /**\n * Destroy the engine and cleanup listeners\n */\n destroy(): void {\n this.listeners.clear();\n }\n}\n","export * from './types';\nexport * from './utils';\nexport { CalendarEngine } from './calendar-engine';\n\n// Re-export commonly used utilities\nexport {\n MONTHS,\n MONTHS_FULL,\n DAYS,\n normalizeDate,\n isSameDay,\n isToday,\n generateYears,\n getEventsForDate,\n hasEvents,\n generateCalendarDates,\n getCellClasses,\n formatDateForDisplay,\n getMonthYearText,\n} from './utils';\n","import {\n CalendarEngine,\n getCellClasses,\n formatTimeRange,\n formatAttendees,\n bookedSlots,\n formatMinutes,\n parseHourRanges,\n isDateWithinWindow,\n isDayAllowed,\n DEFAULT_SLOT_DURATION,\n MINUTES_PER_DAY,\n escapeHtml,\n slugifyToken,\n safeUrl,\n safeColor,\n MONTHS_FULL,\n MONTHS,\n} from '../core';\nimport type {\n CalendarEvent,\n CalendarTheme,\n CalendarPane,\n CategoryColorMap,\n} from '../core';\n\nconst isSameDay = (a: Date, b: Date): boolean =>\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate();\n\nexport class CalendarElement extends HTMLElement {\n static observedAttributes = [\n 'initial-date',\n 'min-year',\n 'max-year',\n 'min-date',\n 'max-date',\n 'available-days',\n 'available-hours',\n 'week-starts-on',\n 'heading',\n 'months',\n 'slot-duration',\n 'title',\n 'use-short-month-names',\n 'availability-mode',\n 'selectable',\n 'loading',\n ];\n\n private static readonly themeMap: Record<keyof CalendarTheme, string> = {\n primary: '--calendar-primary-color',\n secondary: '--calendar-secondary-color',\n tertiary: '--calendar-tertiary-color',\n textColor: '--calendar-text-color',\n textLight: '--calendar-text-light',\n background: '--calendar-background',\n cellHover: '--calendar-cell-hover',\n borderColor: '--calendar-border-color',\n todayOutline: '--calendar-today-outline',\n selectedBg: '--calendar-selected-bg',\n outOfRangeBg: '--calendar-out-of-range-bg',\n outOfRangeFg: '--calendar-out-of-range-fg',\n headerBg: '--calendar-header-bg',\n popupBg: '--calendar-popup-bg',\n pickerBg: '--calendar-picker-bg',\n pickerShadow: '--calendar-picker-shadow',\n eventIndicator: '--calendar-event-indicator',\n onAccent: '--calendar-on-accent',\n link: '--calendar-link',\n openBg: '--calendar-open-bg',\n openFg: '--calendar-open-fg',\n conditionalBg: '--calendar-conditional-bg',\n conditionalFg: '--calendar-conditional-fg',\n blockedBg: '--calendar-blocked-bg',\n blockedFg: '--calendar-blocked-fg',\n rangeBg: '--calendar-range-bg',\n rangeOutline: '--calendar-range-outline',\n inRangeBg: '--calendar-in-range-bg',\n inRangeOutline: '--calendar-in-range-outline',\n badgeBg: '--calendar-badge-bg',\n badgeText: '--calendar-badge-text',\n badgeSuccessBg: '--calendar-badge-success-bg',\n badgeSuccessText: '--calendar-badge-success-text',\n badgeInfoBg: '--calendar-badge-info-bg',\n badgeInfoText: '--calendar-badge-info-text',\n badgeWarningBg: '--calendar-badge-warning-bg',\n badgeWarningText: '--calendar-badge-warning-text',\n badgeDangerBg: '--calendar-badge-danger-bg',\n badgeDangerText: '--calendar-badge-danger-text',\n badgeNeutralBg: '--calendar-badge-neutral-bg',\n badgeNeutralText: '--calendar-badge-neutral-text',\n badgePositiveBg: '--calendar-badge-positive-bg',\n badgePositiveText: '--calendar-badge-positive-text',\n badgeTentativeBg: '--calendar-badge-tentative-bg',\n badgeTentativeText: '--calendar-badge-tentative-text',\n };\n\n private engine: CalendarEngine | null = null;\n private unsubscribe: (() => void) | null = null;\n private actions: ReturnType<CalendarEngine['getActions']> | null = null;\n private pickerOpen = false;\n private yearInput = '';\n private yearInputValid = true;\n private listenersAttached = false;\n\n private clickOutsideHandler: ((e: MouseEvent) => void) | null = null;\n private delegatedClickHandler: ((e: MouseEvent) => void) | null = null;\n private delegatedInputHandler: ((e: Event) => void) | null = null;\n private delegatedBlurHandler: ((e: FocusEvent) => void) | null = null;\n private delegatedKeydownHandler: ((e: KeyboardEvent) => void) | null = null;\n\n // Rich property backing fields\n private _events: CalendarEvent[] = [];\n private _theme: CalendarTheme | null = null;\n private _categoryColors: CategoryColorMap | null = null;\n private _renderEvent: ((e: CalendarEvent) => string) | null = null;\n private _renderNoEvents: (() => string) | null = null;\n private _availabilityColors: Record<string, string> | null = null;\n private _selectableStatuses: string[] | null = null;\n private _initError: Error | null = null;\n private pendingUpdate: Promise<void> | null = null;\n\n // Selection state (availability mode — range)\n private _rangeStart: Date | null = null;\n private _rangeEnd: Date | null = null;\n private _timeRangeDate: Date | null = null;\n private _timeRangeStart: string | null = null;\n private _timeRangeEnd: string | null = null;\n private _timeRangeComplete = false;\n\n get events(): CalendarEvent[] {\n return this._events;\n }\n\n set events(val: CalendarEvent[]) {\n this._initError = null;\n this._events = val;\n if (this.engine) {\n this.engine.updateEvents(val);\n }\n }\n\n set theme(val: CalendarTheme) {\n this._theme = val;\n this.applyTheme();\n }\n\n set categoryColors(val: CategoryColorMap) {\n this._categoryColors = val;\n if (this.engine) {\n this.engine.updateCategoryColors(val);\n }\n }\n\n get availabilityColors(): Record<string, string> {\n return this._availabilityColors ?? {};\n }\n\n set availabilityColors(val: Record<string, string>) {\n this._initError = null;\n this._availabilityColors = val;\n if (this.engine) this.scheduleRender();\n }\n\n get selectableStatuses(): string[] {\n return this._selectableStatuses ?? [];\n }\n\n set selectableStatuses(val: string[]) {\n this._selectableStatuses = val;\n if (this.engine) this.scheduleRender();\n }\n\n set renderEvent(val: (e: CalendarEvent) => string) {\n this._renderEvent = val;\n if (this.engine) this.scheduleRender();\n // ignored when availability-mode attribute is set\n }\n\n set renderNoEvents(val: () => string) {\n this._renderNoEvents = val;\n if (this.engine) this.scheduleRender();\n // ignored when availability-mode attribute is set\n }\n\n get loading(): boolean {\n return this.hasAttribute('loading');\n }\n\n set loading(val: boolean) {\n if (val) this.setAttribute('loading', '');\n else this.removeAttribute('loading');\n }\n\n // Custom element reactions report rather than propagate, so a failure here\n // is kept and resurfaced at the next call the integrator makes\n private reaction(run: () => void): void {\n try {\n run();\n } catch (error) {\n this._initError = error as Error;\n throw error;\n }\n }\n\n connectedCallback(): void {\n this.classList.add('kalendly-calendar');\n this.reaction(() => {\n this.initEngine();\n this.render();\n });\n }\n\n disconnectedCallback(): void {\n this.cleanup();\n this.classList.remove('kalendly-calendar');\n this.innerHTML = '';\n }\n\n attributeChangedCallback(\n name: string,\n oldVal: string | null,\n newVal: string | null\n ): void {\n if (oldVal === newVal) return;\n if (name === 'loading') {\n this.scheduleRender();\n return;\n }\n if (name === 'selectable' && newVal === null) {\n this._rangeStart = null;\n this._rangeEnd = null;\n this._timeRangeDate = null;\n this._timeRangeStart = null;\n this._timeRangeEnd = null;\n this._timeRangeComplete = false;\n }\n this.reinit();\n }\n\n private get headingText(): string | null {\n const heading = this.getAttribute('heading');\n if (heading !== null) return heading;\n\n const title = this.getAttribute('title');\n if (title !== null && !CalendarElement.titleDeprecationWarned) {\n CalendarElement.titleDeprecationWarned = true;\n console.warn(\n `<kal-calendar> the title attribute is deprecated and will be removed ` +\n `in a future release — use heading instead. title is a global HTML ` +\n `attribute, so the browser also renders it as a tooltip over the ` +\n `whole calendar.`\n );\n }\n return title;\n }\n\n private static warnedMissingEnd = new Set<string>();\n\n private get slotDuration(): number {\n const raw = this.getAttribute('slot-duration');\n if (raw === null) return DEFAULT_SLOT_DURATION;\n\n const minutes = Number(raw);\n if (\n Number.isInteger(minutes) &&\n minutes > 0 &&\n MINUTES_PER_DAY % minutes === 0\n ) {\n return minutes;\n }\n\n console.warn(\n `<kal-calendar> slot-duration=\"${raw}\" must be a positive whole number of ` +\n `minutes that divides ${MINUTES_PER_DAY} — falling back to ` +\n `${DEFAULT_SLOT_DURATION}.`\n );\n return DEFAULT_SLOT_DURATION;\n }\n\n private warnMissingEndTime(events: CalendarEvent[]): void {\n for (const event of events) {\n if (!event.startTime || event.endTime) continue;\n\n const key = String(event.id);\n if (CalendarElement.warnedMissingEnd.has(key)) continue;\n CalendarElement.warnedMissingEnd.add(key);\n\n console.warn(\n `<kal-calendar> event ${key} has startTime but no endTime — occupying ` +\n `one ${this.slotDuration}-minute slot. Send an endTime to say how long ` +\n `it runs.`\n );\n }\n }\n\n private get monthCount(): number {\n const requested = Number(this.getAttribute('months') ?? 1);\n if (!Number.isInteger(requested) || requested < 1) return 1;\n\n return Math.min(requested, 2);\n }\n\n private get minYear(): number {\n const val = this.getAttribute('min-year');\n return val ? parseInt(val, 10) : new Date().getFullYear() - 30;\n }\n\n private get maxYear(): number {\n const val = this.getAttribute('max-year');\n return val ? parseInt(val, 10) : new Date().getFullYear() + 10;\n }\n\n private boundaryDate(attr: 'min-date' | 'max-date'): Date | null {\n const val = this.getAttribute(attr);\n if (!val) return null;\n\n const parsed = new Date(val);\n if (Number.isNaN(parsed.getTime())) {\n throw new Error(\n `<kal-calendar> ${attr} is unreadable: \"${val}\". Use a value Date can ` +\n `parse, the same as initial-date.`\n );\n }\n\n return parsed;\n }\n\n private get availableDays(): number[] | null {\n const val = this.getAttribute('available-days');\n if (val === null) return null;\n\n const parts = val\n .split(',')\n .map(part => part.trim())\n .filter(Boolean);\n\n if (parts.length === 0) {\n throw new Error(\n `<kal-calendar> available-days is empty. Omit the attribute to allow ` +\n `every day, or name at least one weekday.`\n );\n }\n\n return parts.map(part => {\n const day = Number(part);\n if (!Number.isInteger(day) || day < 0 || day > 6) {\n throw new Error(\n `<kal-calendar> available-days must list integers 0-6, 0 = Sunday. ` +\n `Got \"${part}\".`\n );\n }\n return day;\n });\n }\n\n private get availableHours(): Array<[number, number]> | null {\n const val = this.getAttribute('available-hours');\n if (val === null) return null;\n\n return parseHourRanges(val, this.slotDuration);\n }\n\n private initEngine(): void {\n const initialDateAttr = this.getAttribute('initial-date');\n const initialDate = initialDateAttr ? new Date(initialDateAttr) : undefined;\n const weekStartsOnAttr = this.getAttribute('week-starts-on');\n const weekStartsOn: 0 | 1 = weekStartsOnAttr === '1' ? 1 : 0;\n\n this.engine = new CalendarEngine({\n events: this._events,\n initialDate,\n minYear: this.minYear,\n maxYear: this.maxYear,\n weekStartsOn,\n categoryColors: this._categoryColors ?? undefined,\n monthCount: this.monthCount,\n });\n\n this.actions = this.engine.getActions();\n this.applyTheme();\n\n this.unsubscribe = this.engine.subscribe(() => {\n this.scheduleRender();\n });\n }\n\n private reinit(): void {\n if (!this.engine) return;\n this.cleanup();\n this.initEngine();\n this.scheduleRender();\n }\n\n private cleanup(): void {\n if (this.unsubscribe) {\n this.unsubscribe();\n this.unsubscribe = null;\n }\n\n if (this.delegatedClickHandler) {\n this.removeEventListener('click', this.delegatedClickHandler);\n this.delegatedClickHandler = null;\n }\n if (this.delegatedInputHandler) {\n this.removeEventListener('input', this.delegatedInputHandler);\n this.delegatedInputHandler = null;\n }\n if (this.delegatedBlurHandler) {\n this.removeEventListener('blur', this.delegatedBlurHandler, true);\n this.delegatedBlurHandler = null;\n }\n if (this.delegatedKeydownHandler) {\n this.removeEventListener('keydown', this.delegatedKeydownHandler);\n this.delegatedKeydownHandler = null;\n }\n if (this.clickOutsideHandler) {\n document.removeEventListener('click', this.clickOutsideHandler);\n this.clickOutsideHandler = null;\n }\n\n this.listenersAttached = false;\n\n if (this.engine) {\n this.engine.destroy();\n this.engine = null;\n }\n\n this.actions = null;\n }\n\n private applyTheme(): void {\n if (!this._theme) return;\n const root = document.documentElement;\n for (const key of Object.keys(CalendarElement.themeMap) as Array<\n keyof CalendarTheme\n >) {\n const value = this._theme[key];\n if (value) root.style.setProperty(CalendarElement.themeMap[key], value);\n }\n }\n\n private static readonly BUILT_IN_BUCKETS = ['blocked', 'conditional', 'open'];\n\n private static titleDeprecationWarned = false;\n\n private get knownBuckets(): string[] {\n return [\n ...CalendarElement.BUILT_IN_BUCKETS,\n ...Object.keys(this._availabilityColors ?? {}),\n ];\n }\n\n get updateComplete(): Promise<void> {\n return this.pendingUpdate ?? Promise.resolve();\n }\n\n private scheduleRender(): void {\n if (this.pendingUpdate) return;\n\n this.pendingUpdate = Promise.resolve().then(() => {\n this.pendingUpdate = null;\n try {\n this.render();\n } catch (error) {\n this._initError = error as Error;\n throw error;\n }\n });\n }\n\n private rethrowInitError(): void {\n if (this._initError) throw this._initError;\n }\n\n private assertStatusesDeclared(): void {\n if (!this.getAttribute('availability-mode')) return;\n\n const missing = this._events\n .filter(\n event =>\n typeof event.availabilityStatus !== 'string' ||\n event.availabilityStatus === ''\n )\n .map(event => String(event.id));\n\n if (missing.length) {\n throw new Error(\n `<kal-calendar> availability-mode requires availabilityStatus on every ` +\n `event. Missing on: ${missing.join(', ')}.`\n );\n }\n }\n\n private assertStatusesKnown(): void {\n const known = new Set(this.knownBuckets);\n const unknown = this._events\n .filter(event => !known.has(event.availabilityStatus as string))\n .map(event => `${event.id} (${event.availabilityStatus})`);\n\n if (unknown.length) {\n throw new Error(\n `<kal-calendar> availabilityStatus must name a built-in bucket ` +\n `(${CalendarElement.BUILT_IN_BUCKETS.join(', ')}) or a key of ` +\n `availabilityColors. Unrecognised on: ${unknown.join(', ')}.`\n );\n }\n }\n\n private resolveBucket(date: Date): string {\n if (!this.engine) return 'open';\n\n const declared = new Set(\n this.engine\n .getEventsForDate(date)\n .map(event => event.availabilityStatus as string)\n );\n if (declared.size === 0) return 'open';\n\n return this.knownBuckets.find(bucket => declared.has(bucket)) as string;\n }\n\n private assertHorizonOrdered(): void {\n const min = this.boundaryDate('min-date');\n const max = this.boundaryDate('max-date');\n\n if (min && max && min.getTime() > max.getTime()) {\n throw new Error(\n `<kal-calendar> min-date is after max-date: ` +\n `\"${this.getAttribute('min-date')}\" > \"${this.getAttribute('max-date')}\".`\n );\n }\n }\n\n // Whether the vendor offers this day at all, before any event is considered.\n private isDateOffered(date: Date): boolean {\n return (\n isDateWithinWindow(\n date,\n this.boundaryDate('min-date'),\n this.boundaryDate('max-date')\n ) && isDayAllowed(date, this.availableDays)\n );\n }\n\n private isDateSelectable(date: Date): boolean {\n if (!this.engine) return false;\n if (!this.isDateOffered(date)) return false;\n\n if (this._selectableStatuses) {\n return this._selectableStatuses.includes(this.resolveBucket(date));\n }\n\n return this.engine.getEventsForDate(date).length === 0;\n }\n\n private render(): void {\n if (!this.engine) return;\n\n const viewModel = this.engine.getViewModel();\n const useShortMonths = this.hasAttribute('use-short-month-names');\n const title = this.headingText;\n const minYear = this.minYear;\n const maxYear = this.maxYear;\n const availabilityMode = this.getAttribute('availability-mode');\n const selectable = this.hasAttribute('selectable');\n const isLoading = this.loading;\n\n if (availabilityMode) {\n this.assertStatusesDeclared();\n this.assertStatusesKnown();\n }\n\n // Up front, not in the grid: the grid only renders once a day is open.\n this.boundaryDate('min-date');\n this.boundaryDate('max-date');\n void this.availableDays;\n void this.availableHours;\n this.assertHorizonOrdered();\n\n const today = new Date();\n const todayMonth = today.getMonth();\n const todayYear = today.getFullYear();\n const isCurrentMonth =\n viewModel.currentYear === todayYear &&\n viewModel.currentMonth === todayMonth;\n\n const showScrollHint = viewModel.tasks.length > 3;\n\n const defaultRenderEvent = (event: CalendarEvent) => {\n const timeRange = formatTimeRange(event);\n const attendeesList = formatAttendees(event.attendees);\n\n let borderColor = safeColor(event.color || '#3b82f6');\n if (event.category) {\n borderColor = this.engine!.getCategoryColor(event.category);\n }\n\n const getCategoryLabel = (category?: string) => {\n const labels: Record<string, string> = {\n work: 'WORK',\n personal: 'PERSONAL',\n meeting: 'MEETING',\n deadline: 'DEADLINE',\n appointment: 'APPOINTMENT',\n other: 'OTHER',\n };\n return category ? labels[category] || category.toUpperCase() : '';\n };\n\n const getPriorityLabel = (priority?: string) => {\n const labels: Record<string, string> = {\n high: 'HIGH',\n medium: 'MEDIUM',\n low: 'LOW',\n };\n return priority ? labels[priority] || priority.toUpperCase() : '';\n };\n\n const getStatusLabel = (status?: string) => {\n const labels: Record<string, string> = {\n completed: 'COMPLETED',\n cancelled: 'CANCELLED',\n tentative: 'TENTATIVE',\n scheduled: 'SCHEDULED',\n };\n return status ? labels[status] || status.toUpperCase() : '';\n };\n\n return `\n <div class=\"event-card\" style=\"border-left-color: ${borderColor}\">\n <div class=\"event-header\">\n ${event.name ? `<div class=\"event-title\">${escapeHtml(event.name)}</div>` : ''}\n <div class=\"event-badges\">\n ${event.category ? `<span class=\"badge category category-${slugifyToken(event.category)}\">${escapeHtml(getCategoryLabel(event.category))}</span>` : ''}\n ${event.priority ? `<span class=\"badge priority priority-${slugifyToken(event.priority)}\">${escapeHtml(getPriorityLabel(event.priority))}</span>` : ''}\n ${event.status && event.status !== 'scheduled' ? `<span class=\"badge status status-${slugifyToken(event.status)}\">${escapeHtml(getStatusLabel(event.status))}</span>` : ''}\n </div>\n </div>\n\n ${\n timeRange\n ? `\n <div class=\"event-time\">\n <span class=\"event-time-label\">Time:</span>\n <span class=\"event-time-value\">${escapeHtml(timeRange)}</span>\n </div>\n `\n : ''\n }\n\n ${\n event.description\n ? `\n <div class=\"event-description\">${escapeHtml(event.description)}</div>\n `\n : ''\n }\n\n ${\n event.location\n ? `\n <div class=\"event-time\">\n <span class=\"event-time-label\">Location:</span>\n <span class=\"event-time-value\">${escapeHtml(event.location)}</span>\n </div>\n `\n : ''\n }\n\n ${\n attendeesList\n ? `\n <div class=\"event-time\">\n <span class=\"event-time-label\">Attendees:</span>\n <span class=\"event-time-value\">${escapeHtml(attendeesList)}</span>\n </div>\n `\n : ''\n }\n\n ${\n event.organizer\n ? `\n <div class=\"event-time\">\n <span class=\"event-time-label\">Organizer:</span>\n <span class=\"event-time-value\">${escapeHtml(event.organizer)}</span>\n </div>\n `\n : ''\n }\n\n ${\n event.notes\n ? `\n <div class=\"event-time\">\n <span class=\"event-time-label\">Notes:</span>\n <span class=\"event-time-value\">${escapeHtml(event.notes)}</span>\n </div>\n `\n : ''\n }\n\n ${\n event.url\n ? `\n <div class=\"event-time\">\n <a href=\"${escapeHtml(safeUrl(event.url as string))}\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"event-link\">\n View Details →\n </a>\n </div>\n `\n : ''\n }\n\n ${\n event.tags && event.tags.length > 0\n ? `\n <div class=\"event-tags\">\n ${event.tags.map((tag: string) => `<span class=\"event-tag\">${escapeHtml(tag)}</span>`).join('')}\n </div>\n `\n : ''\n }\n </div>\n `;\n };\n\n const defaultRenderNoEvents = () =>\n '<div class=\"no-events-message\">No events scheduled for this day.</div>';\n\n const renderEvent = this._renderEvent || defaultRenderEvent;\n const renderNoEvents = this._renderNoEvents || defaultRenderNoEvents;\n\n const renderTimeGrid = (date: Date): string => {\n const slotDuration = this.slotDuration;\n\n // A booking crossing midnight belongs to the day it started on, so the\n // previous day's events are needed to mark the morning it runs into\n const previousDay = new Date(date);\n previousDay.setDate(previousDay.getDate() - 1);\n const events = [\n ...this.engine!.getEventsForDate(previousDay),\n ...this.engine!.getEventsForDate(date),\n ];\n\n this.warnMissingEndTime(events);\n const booked = bookedSlots(events, date, slotDuration);\n\n const hours = this.availableHours;\n\n const slots = booked.map((isBooked, index) => {\n const slotStart = index * slotDuration;\n const slotEnd = slotStart + slotDuration;\n const startTime = formatMinutes(slotStart);\n const endTime = formatMinutes(slotEnd);\n\n const offered =\n hours === null ||\n hours.some(([from, to]) => slotStart >= from && slotEnd <= to);\n\n const inTimeRange =\n offered &&\n !isBooked &&\n selectable &&\n this._timeRangeStart !== null &&\n this._timeRangeEnd !== null &&\n isSameDay(this._timeRangeDate!, date) &&\n startTime >= this._timeRangeStart &&\n endTime <= this._timeRangeEnd;\n\n const isRangeStart = inTimeRange && startTime === this._timeRangeStart;\n const isRangeEnd = inTimeRange && endTime === this._timeRangeEnd;\n const isInRange = inTimeRange && !isRangeStart && !isRangeEnd;\n\n const slotClasses = [\n 'time-grid-slot',\n offered ? '' : 'time-grid-slot-out-of-range',\n isBooked ? 'time-grid-slot-blocked' : 'time-grid-slot-open',\n isRangeStart ? 'time-grid-slot-range-start' : '',\n isRangeEnd ? 'time-grid-slot-range-end' : '',\n isInRange ? 'time-grid-slot-in-range' : '',\n ]\n .filter(Boolean)\n .join(' ');\n\n // No data-action outside the offered hours, so cal-slot-select stays\n // silent for a slot the vendor never put up for sale.\n const slotAttrs =\n `${offered ? 'data-action=\"select-slot\" ' : ''}` +\n `data-start-time=\"${startTime}\" ` +\n `data-end-time=\"${endTime}\" data-date=\"${date.toISOString()}\" ` +\n `data-booked=\"${isBooked}\"`;\n\n const status = !offered ? 'Closed' : isBooked ? 'Booked' : 'Available';\n\n return `\n <div class=\"${slotClasses}\" ${slotAttrs}>\n <span class=\"time-grid-label\">${startTime}</span>\n <span class=\"time-grid-status\">${status}</span>\n </div>`;\n });\n\n const gridClasses = selectable\n ? 'time-grid time-grid-selectable'\n : 'time-grid';\n\n return `<div class=\"${gridClasses}\">${slots.join('')}</div>`;\n };\n\n const multiMonth = viewModel.panes.length > 1;\n\n const renderPane = (pane: CalendarPane): string => `\n <div class=\"calendar-pane\">\n ${\n multiMonth\n ? `<div class=\"calendar-pane-caption\">${escapeHtml(pane.monthAndYearText)}</div>`\n : ''\n }\n <table class=\"calendar-table calendar-table-bordered\">\n <thead>\n <tr>\n ${viewModel.days.map(day => `<th>${day.slice(0, 3)}</th>`).join('')}\n </tr>\n </thead>\n <tbody data-calendar-body>\n ${\n isLoading\n ? Array.from(\n { length: 6 },\n () =>\n `<tr>${Array.from(\n { length: 7 },\n () =>\n `<td class=\"calendar-skeleton\" aria-hidden=\"true\"></td>`\n ).join('')}</tr>`\n ).join('')\n : pane.calendarDates\n .map(\n week => `\n <tr>\n ${week\n .map((calendarDate, dayIndex) => {\n const classes = getCellClasses(calendarDate);\n const cellAttrs: string[] = [];\n\n if (\n viewModel.selectedDate &&\n isSameDay(\n calendarDate.date,\n viewModel.selectedDate\n )\n ) {\n classes.push('calendar-cell-selected');\n }\n if (\n availabilityMode &&\n calendarDate.isCurrentMonth\n ) {\n const bucket = this.resolveBucket(\n calendarDate.date\n );\n const custom = (this._availabilityColors ?? {})[\n bucket\n ];\n\n classes.push(\n `availability-${slugifyToken(bucket)}`\n );\n if (custom) {\n classes.push('availability-status');\n cellAttrs.push(\n `style=\"--availability-color: ${escapeHtml(safeColor(custom))}\"`\n );\n }\n if (!this.isDateSelectable(calendarDate.date)) {\n classes.push('availability-unselectable');\n }\n cellAttrs.push(\n `aria-label=\"${escapeHtml(bucket)}\"`\n );\n }\n if (\n availabilityMode === 'day' &&\n selectable &&\n calendarDate.isCurrentMonth\n ) {\n const d = calendarDate.date;\n if (\n this._rangeStart &&\n isSameDay(d, this._rangeStart)\n )\n classes.push('availability-range-start');\n if (\n this._rangeEnd &&\n isSameDay(d, this._rangeEnd)\n )\n classes.push('availability-range-end');\n if (this._rangeStart && this._rangeEnd) {\n if (d > this._rangeStart && d < this._rangeEnd)\n classes.push('availability-in-range');\n }\n }\n const dateString = calendarDate.date.toISOString();\n // Not offered means not a click target at all: no\n // data-clickable, so neither the delegated handler\n // nor the hover rule ever sees the cell.\n const offered = this.isDateOffered(\n calendarDate.date\n );\n if (!offered) {\n classes.push('calendar-cell-out-of-range');\n }\n return `\n <td\n class=\"${classes.join(' ')}\"\n data-date=\"${dateString}\"\n data-day-index=\"${dayIndex}\"\n ${offered ? 'data-clickable=\"true\"' : ''}\n ${cellAttrs.join(' ')}\n >\n ${calendarDate.date.getDate()}\n </td>\n `;\n })\n .join('')}\n </tr>\n `\n )\n .join('')\n }\n </tbody>\n </table>\n </div>\n `;\n const html = `\n ${\n title\n ? `\n <div class=\"calendar-title\">\n <h1>${escapeHtml(title)}</h1>\n </div>\n `\n : ''\n }\n\n <div class=\"calendar-content\">\n <div class=\"calendar-card\">\n <div class=\"calendar-nav-header\">\n <button type=\"button\" class=\"calendar-nav-arrow\" data-action=\"previous\" aria-label=\"Previous month\">\n &#8249;\n </button>\n\n <div class=\"calendar-picker-container\" data-picker-container>\n <button\n type=\"button\"\n class=\"calendar-picker-btn\"\n data-action=\"toggle-picker\"\n aria-expanded=\"${this.pickerOpen ? 'true' : 'false'}\"\n aria-haspopup=\"true\"\n >\n ${\n useShortMonths\n ? `${MONTHS[viewModel.currentMonth]} ${viewModel.currentYear}`\n : viewModel.monthAndYearText\n }\n <span class=\"calendar-picker-chevron\">&#9662;</span>\n </button>\n\n ${\n this.pickerOpen\n ? `\n <div class=\"calendar-picker-dropdown\">\n <div class=\"calendar-picker-year-row\">\n <button\n type=\"button\"\n class=\"calendar-picker-year-arrow\"\n data-action=\"year-prev\"\n ${viewModel.currentYear <= minYear ? 'disabled' : ''}\n aria-label=\"Previous year\"\n >&#8249;</button>\n <input\n type=\"text\"\n class=\"calendar-picker-year-input${!this.yearInputValid ? ' invalid' : ''}\"\n value=\"${escapeHtml(this.yearInput || viewModel.currentYear)}\"\n data-year-input\n aria-label=\"Year\"\n />\n <button\n type=\"button\"\n class=\"calendar-picker-year-arrow\"\n data-action=\"year-next\"\n ${viewModel.currentYear >= maxYear ? 'disabled' : ''}\n aria-label=\"Next year\"\n >&#8250;</button>\n </div>\n\n <div class=\"calendar-picker-months\">\n ${(useShortMonths ? MONTHS : MONTHS_FULL)\n .map((month, index) => {\n const isSelected = index === viewModel.currentMonth;\n const isCurrent =\n index === todayMonth &&\n viewModel.currentYear === todayYear;\n return `\n <button\n type=\"button\"\n class=\"calendar-picker-month${isSelected ? ' selected' : ''}${isCurrent ? ' current-month' : ''}\"\n data-action=\"select-month\"\n data-month=\"${index}\"\n >${month}</button>\n `;\n })\n .join('')}\n </div>\n </div>\n `\n : ''\n }\n </div>\n\n <button\n type=\"button\"\n class=\"calendar-today-btn\"\n data-action=\"today\"\n ${isCurrentMonth ? 'disabled' : ''}\n >Today</button>\n\n <button type=\"button\" class=\"calendar-nav-arrow\" data-action=\"next\" aria-label=\"Next month\">\n &#8250;\n </button>\n </div>\n\n <div class=\"calendar-panes\">\n ${viewModel.panes.map(renderPane).join('')}\n </div>\n\n ${\n !isLoading && availabilityMode !== 'day' && viewModel.selectedDate\n ? `\n <div class=\"date-popup\">\n <div class=\"popup-header\">\n <h2>${viewModel.scheduleDay}</h2>\n <button type=\"button\" class=\"popup-close\" data-action=\"close-popup\" aria-label=\"Close\">✕</button>\n </div>\n\n ${\n showScrollHint\n ? `\n <div class=\"scroll-hint\">\n ↓ Scroll to see more events ↓\n </div>\n `\n : ''\n }\n\n <div class=\"events-container\">\n ${\n availabilityMode === 'time'\n ? renderTimeGrid(viewModel.selectedDate!)\n : viewModel.tasks.length > 0\n ? viewModel.tasks\n .map(event => renderEvent(event))\n .join('')\n : renderNoEvents()\n }\n </div>\n </div>\n `\n : ''\n }\n </div>\n </div>\n `;\n\n this.innerHTML = html;\n this.attachEventListeners();\n }\n\n private attachEventListeners(): void {\n if (this.listenersAttached) return;\n this.listenersAttached = true;\n\n const minYear = this.minYear;\n const maxYear = this.maxYear;\n\n this.delegatedClickHandler = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n\n const cell = target.closest('td[data-clickable=\"true\"]') as HTMLElement;\n if (cell && cell.dataset.date) {\n e.stopPropagation();\n const date = new Date(cell.dataset.date);\n const dayIndex = parseInt(cell.dataset.dayIndex || '0');\n const availMode = this.getAttribute('availability-mode');\n const isSelectable = this.hasAttribute('selectable');\n\n if (availMode === 'day' && isSelectable) {\n if (this.isDateSelectable(date)) {\n let startDate: Date;\n let endDate: Date;\n if (this._rangeEnd !== null) {\n // State 2 (complete) → reset, start fresh\n this._rangeStart = date;\n this._rangeEnd = null;\n startDate = date;\n endDate = date;\n } else if (this._rangeStart === null) {\n // State 0 → first click\n this._rangeStart = date;\n startDate = date;\n endDate = date;\n } else {\n // State 1 → second click, complete the range if no booked day inside\n const [s, e] =\n this._rangeStart <= date\n ? [this._rangeStart, date]\n : [date, this._rangeStart];\n const cursor = new Date(s);\n cursor.setDate(cursor.getDate() + 1);\n let blocked = false;\n while (cursor < e) {\n if (!this.isDateSelectable(cursor)) {\n blocked = true;\n break;\n }\n cursor.setDate(cursor.getDate() + 1);\n }\n if (blocked) {\n // Booked day inside range — reset, start fresh from this click\n this._rangeStart = date;\n this._rangeEnd = null;\n } else {\n this._rangeStart = s;\n this._rangeEnd = e;\n }\n startDate = this._rangeStart;\n endDate = this._rangeEnd ?? this._rangeStart;\n }\n this.dispatchEvent(\n new CustomEvent('cal-availability-select', {\n bubbles: true,\n composed: true,\n detail: { startDate, endDate },\n })\n );\n }\n }\n\n if (availMode === 'time') {\n // Reset time range when a new day is opened\n this._timeRangeDate = null;\n this._timeRangeStart = null;\n this._timeRangeEnd = null;\n this._timeRangeComplete = false;\n }\n\n this.engine!.handleDateClick(date, dayIndex);\n this.dispatchEvent(\n new CustomEvent('cal-date-select', {\n bubbles: true,\n composed: true,\n detail: { date, events: this.engine!.getEventsForDate(date) },\n })\n );\n return;\n }\n\n const actionEl = target.closest('[data-action]') as HTMLElement;\n if (!actionEl) return;\n\n const action = actionEl.dataset.action;\n e.stopPropagation();\n\n switch (action) {\n case 'previous': {\n const vm = this.engine!.getViewModel();\n const tMonth = vm.currentMonth === 0 ? 11 : vm.currentMonth - 1;\n const tYear =\n vm.currentMonth === 0 ? vm.currentYear - 1 : vm.currentYear;\n this.dispatchMonthChange(tYear, tMonth);\n this.actions!.previous();\n break;\n }\n\n case 'next': {\n const vm = this.engine!.getViewModel();\n const tMonth = vm.currentMonth === 11 ? 0 : vm.currentMonth + 1;\n const tYear =\n vm.currentMonth === 11 ? vm.currentYear + 1 : vm.currentYear;\n this.dispatchMonthChange(tYear, tMonth);\n this.actions!.next();\n break;\n }\n\n case 'today': {\n const t = new Date();\n this.dispatchMonthChange(t.getFullYear(), t.getMonth());\n this.actions!.goToToday();\n this.pickerOpen = false;\n break;\n }\n\n case 'toggle-picker':\n this.pickerOpen = !this.pickerOpen;\n if (this.pickerOpen) {\n this.yearInput = String(this.engine!.getViewModel().currentYear);\n this.yearInputValid = true;\n }\n this.render();\n break;\n\n case 'year-prev': {\n const vm = this.engine!.getViewModel();\n if (vm.currentYear > minYear) {\n const newYear = vm.currentYear - 1;\n this.yearInput = String(newYear);\n this.updatePickerYear(newYear);\n this.dispatchMonthChange(newYear, vm.currentMonth);\n this.actions!.jump(newYear, vm.currentMonth);\n }\n break;\n }\n\n case 'year-next': {\n const vm = this.engine!.getViewModel();\n if (vm.currentYear < maxYear) {\n const newYear = vm.currentYear + 1;\n this.yearInput = String(newYear);\n this.updatePickerYear(newYear);\n this.dispatchMonthChange(newYear, vm.currentMonth);\n this.actions!.jump(newYear, vm.currentMonth);\n }\n break;\n }\n\n case 'select-month': {\n const month = parseInt(actionEl.dataset.month || '0', 10);\n const year = this.engine!.getViewModel().currentYear;\n this.dispatchMonthChange(year, month);\n this.actions!.jump(year, month);\n this.pickerOpen = false;\n break;\n }\n\n case 'close-popup':\n this._timeRangeDate = null;\n this._timeRangeStart = null;\n this._timeRangeEnd = null;\n this._timeRangeComplete = false;\n this.engine!.clearSelection();\n break;\n\n case 'select-slot': {\n const slotStart = actionEl.dataset.startTime!;\n const slotEnd = actionEl.dataset.endTime!;\n const slotDate = new Date(actionEl.dataset.date!);\n const slotBooked = actionEl.dataset.booked === 'true';\n\n // Reported for every slot, the way cal-date-select is for every day.\n // selectable gates the range machine below, not the click itself.\n this.dispatchEvent(\n new CustomEvent('cal-slot-select', {\n bubbles: true,\n composed: true,\n detail: {\n date: slotDate,\n startTime: slotStart,\n endTime: slotEnd,\n booked: slotBooked,\n },\n })\n );\n\n if (slotBooked || !this.hasAttribute('selectable')) break;\n\n if (this._timeRangeComplete) {\n // State 2 → reset, start fresh\n this._timeRangeDate = slotDate;\n this._timeRangeStart = slotStart;\n this._timeRangeEnd = slotEnd;\n this._timeRangeComplete = false;\n } else if (this._timeRangeStart === null) {\n // State 0 → first click\n this._timeRangeDate = slotDate;\n this._timeRangeStart = slotStart;\n this._timeRangeEnd = slotEnd;\n } else {\n // State 1 → second click, extend range\n const newStart =\n slotStart < this._timeRangeStart\n ? slotStart\n : this._timeRangeStart;\n const newEnd =\n slotEnd > this._timeRangeEnd! ? slotEnd : this._timeRangeEnd!;\n this._timeRangeStart = newStart;\n this._timeRangeEnd = newEnd;\n this._timeRangeComplete = true;\n }\n this.render();\n this.dispatchEvent(\n new CustomEvent('cal-availability-select', {\n bubbles: true,\n composed: true,\n detail: {\n date: this._timeRangeDate,\n startTime: this._timeRangeStart,\n endTime: this._timeRangeEnd,\n },\n })\n );\n break;\n }\n }\n };\n\n this.delegatedInputHandler = (e: Event) => {\n const target = e.target as HTMLInputElement;\n if (!target.matches('[data-year-input]')) return;\n\n const value = target.value;\n if (value === '' || /^\\d+$/.test(value)) {\n this.yearInput = value;\n const year = parseInt(value, 10);\n this.yearInputValid =\n value === '' || (year >= minYear && year <= maxYear);\n target.classList.toggle('invalid', !this.yearInputValid);\n }\n };\n\n this.delegatedBlurHandler = (e: FocusEvent) => {\n const target = e.target as HTMLInputElement;\n if (!target.matches('[data-year-input]')) return;\n\n const year = parseInt(this.yearInput, 10);\n const vm = this.engine!.getViewModel();\n if (isNaN(year) || year < minYear || year > maxYear) {\n this.yearInput = String(vm.currentYear);\n this.yearInputValid = true;\n target.value = this.yearInput;\n target.classList.remove('invalid');\n } else if (year !== vm.currentYear) {\n this.dispatchMonthChange(year, vm.currentMonth);\n this.actions!.jump(year, vm.currentMonth);\n }\n };\n\n this.delegatedKeydownHandler = (e: KeyboardEvent) => {\n const target = e.target as HTMLInputElement;\n if (!target.matches('[data-year-input]')) return;\n if (e.key === 'Enter') target.blur();\n };\n\n this.addEventListener('click', this.delegatedClickHandler);\n this.addEventListener('input', this.delegatedInputHandler);\n this.addEventListener('blur', this.delegatedBlurHandler, true);\n this.addEventListener('keydown', this.delegatedKeydownHandler);\n\n this.clickOutsideHandler = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n if (this.contains(target)) return;\n\n if (this.pickerOpen) {\n this.pickerOpen = false;\n this.render();\n return;\n }\n\n const popup = this.querySelector('.date-popup');\n if (popup) {\n this.engine!.clearSelection();\n }\n };\n\n document.addEventListener('click', this.clickOutsideHandler);\n }\n\n private updatePickerYear(year: number): void {\n const input = this.querySelector('[data-year-input]') as HTMLInputElement;\n if (input) input.value = String(year);\n\n const prevBtn = this.querySelector(\n '[data-action=\"year-prev\"]'\n ) as HTMLButtonElement;\n const nextBtn = this.querySelector(\n '[data-action=\"year-next\"]'\n ) as HTMLButtonElement;\n if (prevBtn) prevBtn.disabled = year <= this.minYear;\n if (nextBtn) nextBtn.disabled = year >= this.maxYear;\n }\n\n private dispatchMonthChange(year?: number, month?: number): void {\n if (!this.engine) return;\n const vm = this.engine.getViewModel();\n this.dispatchEvent(\n new CustomEvent('cal-month-change', {\n bubbles: true,\n composed: true,\n detail: {\n year: year ?? vm.currentYear,\n month: month ?? vm.currentMonth,\n },\n })\n );\n }\n\n // Public API\n updateEvents(events: CalendarEvent[]): void {\n this.events = events;\n }\n\n updateTheme(theme: CalendarTheme): void {\n this.theme = theme;\n }\n\n getCurrentDate(): Date | null {\n this.rethrowInitError();\n return this.engine?.getViewModel().selectedDate ?? null;\n }\n\n goToDate(date: Date): void {\n this.rethrowInitError();\n const year = date.getFullYear();\n const month = date.getMonth();\n this.dispatchMonthChange(year, month);\n this.actions?.jump(year, month);\n }\n\n getEngine(): CalendarEngine {\n this.rethrowInitError();\n if (!this.engine)\n throw new Error('CalendarElement is not connected to the DOM');\n return this.engine;\n }\n}\n\nexport function defineCalendarElement(tagName = 'kal-calendar'): void {\n if (typeof customElements !== 'undefined' && !customElements.get(tagName)) {\n customElements.define(tagName, CalendarElement);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kal-calendar': CalendarElement;\n }\n}\n","export { CalendarElement, defineCalendarElement } from './CalendarElement';\nexport type { CalendarElementProps, CalendarElementInstance } from './types';\nexport * from '../core';\n\n// Auto-register the custom element (guarded — safe to import multiple times)\nif (\n typeof customElements !== 'undefined' &&\n !customElements.get('kal-calendar')\n) {\n // Dynamic import keeps this out of the synchronous module evaluation path,\n // which prevents crashes in SSR environments where customElements is undefined\n // but window/document may not be fully available.\n import('./CalendarElement.js').then(({ CalendarElement }) => {\n if (!customElements.get('kal-calendar')) {\n customElements.define('kal-calendar', CalendarElement);\n }\n });\n}\n"],"mappings":"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","names":["isSameDay","e","CalendarElement"]}
1
+ {"version":3,"sources":["../src/core/types.ts","../src/core/utils.ts","../src/core/calendar-engine.ts","../src/core/index.ts","../src/web-components/CalendarElement.ts","../src/web-components/index.ts"],"sourcesContent":["// Known values keep autocomplete; any other string is still accepted\ntype Open<T extends string> = T | (string & {});\n\nexport interface CalendarEvent {\n id: string | number;\n date: string | Date;\n\n // Rendered as the event card's title. Availability mode never renders the\n // card, so callers there need not supply one.\n name?: string;\n\n // Last day of a multi-day event, inclusive. Absent means a single day.\n endDate?: string | Date;\n\n // Time fields\n startTime?: string;\n endTime?: string;\n allDay?: boolean;\n\n // Display & categorization\n description?: string;\n color?: string;\n category?: Open<\n 'work' | 'personal' | 'meeting' | 'deadline' | 'appointment' | 'other'\n >;\n location?: string;\n url?: string;\n\n // Status & priority\n status?: Open<'scheduled' | 'completed' | 'cancelled' | 'tentative'>;\n priority?: Open<'low' | 'medium' | 'high'>;\n\n // Availability bucket. Distinct from `status`: this is the caller's own\n // state mapped down to an opaque label for the availability layer, so\n // internal detail never reaches the calendar.\n availabilityStatus?: Open<'open' | 'conditional' | 'blocked'>;\n\n // Collaboration\n attendees?: string[];\n organizer?: string;\n\n // Reminders & recurrence\n reminders?: number[];\n recurring?: {\n frequency: 'daily' | 'weekly' | 'monthly' | 'yearly';\n interval?: number;\n endDate?: string | Date;\n daysOfWeek?: number[];\n };\n\n // Metadata\n notes?: string;\n tags?: string[];\n createdAt?: string | Date;\n updatedAt?: string | Date;\n\n // Flexibility for custom fields\n [key: string]: unknown;\n}\n\nexport interface CalendarDate {\n date: Date;\n isCurrentMonth: boolean;\n isToday: boolean;\n hasEvents: boolean;\n events: CalendarEvent[];\n}\n\nexport interface CalendarState {\n currentYear: number;\n currentMonth: number;\n currentDate: number;\n selectedDate: Date | null;\n selectedDayIndex: number | null;\n tasks: CalendarEvent[];\n}\n\nexport interface CategoryColorMap {\n [category: string]: string;\n}\n\nexport interface CalendarConfig {\n events: CalendarEvent[];\n initialDate?: Date;\n minYear?: number;\n maxYear?: number;\n weekStartsOn?: 0 | 1;\n categoryColors?: CategoryColorMap;\n monthCount?: number;\n}\n\nexport interface CalendarPane {\n year: number;\n month: number;\n monthAndYearText: string;\n calendarDates: CalendarDate[][];\n}\n\nexport interface CalendarActions {\n next: () => void;\n previous: () => void;\n jump: (year: number, month: number) => void;\n goToToday: () => void;\n isCurrentMonth: () => boolean;\n selectDate: (date: Date) => void;\n updateTasks: () => void;\n}\n\nexport interface CalendarViewModel extends CalendarState {\n months: string[];\n days: string[];\n years: number[];\n monthAndYearText: string;\n scheduleDay: string;\n panes: CalendarPane[];\n calendarDates: CalendarDate[][];\n}\n\nexport type CalendarEventHandler = (event: CalendarEvent) => void;\n\nexport interface CalendarProps {\n events: CalendarEvent[];\n initialDate?: Date;\n minYear?: number;\n maxYear?: number;\n weekStartsOn?: 0 | 1;\n useShortMonthNames?: boolean;\n onDateSelect?: (date: Date) => void;\n onEventClick?: CalendarEventHandler;\n onMonthChange?: (year: number, month: number) => void;\n}\n\nexport interface CalendarTheme {\n primary?: string;\n secondary?: string;\n tertiary?: string;\n textColor?: string;\n textLight?: string;\n background?: string;\n cellHover?: string;\n borderColor?: string;\n todayOutline?: string;\n selectedBg?: string;\n outOfRangeBg?: string;\n outOfRangeFg?: string;\n navArrowFg?: string;\n navArrowBg?: string;\n navArrowBorder?: string;\n navArrowHoverFg?: string;\n navArrowHoverBg?: string;\n inputInvalidBg?: string;\n popupHeaderFg?: string;\n popupCloseFg?: string;\n popupCloseBg?: string;\n popupCloseHoverBg?: string;\n headerBg?: string;\n popupBg?: string;\n pickerBg?: string;\n pickerShadow?: string;\n eventIndicator?: string;\n onAccent?: string;\n link?: string;\n\n // Availability — traffic light\n openBg?: string;\n openFg?: string;\n conditionalBg?: string;\n conditionalFg?: string;\n blockedBg?: string;\n blockedFg?: string;\n rangeBg?: string;\n rangeOutline?: string;\n inRangeBg?: string;\n inRangeOutline?: string;\n\n // Badges — badgeBg/badgeText are the fallback for caller-defined values\n badgeBg?: string;\n badgeText?: string;\n badgeSuccessBg?: string;\n badgeSuccessText?: string;\n badgeInfoBg?: string;\n badgeInfoText?: string;\n badgeWarningBg?: string;\n badgeWarningText?: string;\n badgeDangerBg?: string;\n badgeDangerText?: string;\n badgeNeutralBg?: string;\n badgeNeutralText?: string;\n badgePositiveBg?: string;\n badgePositiveText?: string;\n badgeTentativeBg?: string;\n badgeTentativeText?: string;\n}\n","import { CalendarEvent, CalendarDate, CategoryColorMap } from './types';\n\nexport const MONTHS = [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec',\n];\n\nexport const MONTHS_FULL = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n];\n\nexport const DAYS = [\n 'Sunday',\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n];\n\nexport function normalizeDate(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0);\n}\n\nexport function isSameDay(date1: Date, date2: Date): boolean {\n return normalizeDate(date1).getTime() === normalizeDate(date2).getTime();\n}\n\nexport function isToday(date: Date): boolean {\n return isSameDay(date, new Date());\n}\n\nexport function generateYears(minYear?: number, maxYear?: number): number[] {\n const currentYear = new Date().getFullYear();\n const min = minYear ?? currentYear - 30;\n const max = maxYear ?? currentYear + 10;\n\n return Array.from({ length: max - min + 1 }, (_, i) => min + i);\n}\n\n// endDate is inclusive, matching the endDate cal-availability-select emits, so\n// a selection can be handed straight back as one event.\n// \"09:00-12:00,13:00-17:00\" to half-open [start, end) minute intervals.\n// Throws rather than dropping a bad range: a vendor who mistypes their opening\n// hours must hear about it, not quietly stop selling the afternoon.\nexport function parseHourRanges(\n value: string,\n slotDuration: number\n): Array<[number, number]> {\n const parts = value\n .split(',')\n .map(part => part.trim())\n .filter(Boolean);\n\n if (parts.length === 0) {\n throw new Error(\n `<kal-calendar> available-hours is empty. Omit the attribute to allow ` +\n `every hour, or name at least one HH:MM-HH:MM range.`\n );\n }\n\n const ranges = parts.map((part): [number, number] => {\n const halves = part.split('-');\n if (halves.length !== 2) {\n throw new Error(\n `<kal-calendar> available-hours range \"${part}\" is not HH:MM-HH:MM.`\n );\n }\n\n const [start, end] = halves.map(half => parseTimeToMinutes(half.trim()));\n if (start === null || end === null) {\n throw new Error(\n `<kal-calendar> available-hours range \"${part}\" has an unreadable ` +\n `time. Use 24-hour HH:MM.`\n );\n }\n if (start >= end) {\n throw new Error(\n `<kal-calendar> available-hours range \"${part}\" starts at or after ` +\n `it ends.`\n );\n }\n if (start % slotDuration !== 0 || end % slotDuration !== 0) {\n throw new Error(\n `<kal-calendar> available-hours range \"${part}\" does not land on a ` +\n `${slotDuration}-minute slot boundary.`\n );\n }\n\n return [start, end];\n });\n\n if (mergeIntervals(ranges).length !== ranges.length) {\n throw new Error(\n `<kal-calendar> available-hours ranges overlap or touch: \"${value}\". ` +\n `Write each bookable window once.`\n );\n }\n\n return ranges;\n}\n\n// Both bounds inclusive; either may be null to leave that end unbounded.\nexport function isDateWithinWindow(\n date: Date,\n min: Date | null,\n max: Date | null\n): boolean {\n const target = normalizeDate(date).getTime();\n\n if (min && target < normalizeDate(min).getTime()) return false;\n if (max && target > normalizeDate(max).getTime()) return false;\n\n return true;\n}\n\n// `days` holds getDay() values, 0 = Sunday. Null means every day is allowed.\nexport function isDayAllowed(date: Date, days: number[] | null): boolean {\n return days === null || days.includes(date.getDay());\n}\n\nexport function eventCoversDate(event: CalendarEvent, date: Date): boolean {\n const start = normalizeDate(new Date(event.date)).getTime();\n const target = normalizeDate(date).getTime();\n if (Number.isNaN(start)) return false;\n\n if (event.endDate === undefined || event.endDate === null) {\n return start === target;\n }\n\n const end = normalizeDate(new Date(event.endDate)).getTime();\n if (Number.isNaN(end)) {\n throw new Error(\n `<kal-calendar> event ${event.id} has an unreadable endDate: ` +\n `${String(event.endDate)}.`\n );\n }\n if (end < start) {\n throw new Error(\n `<kal-calendar> event ${event.id} has an endDate before its date: ` +\n `${String(event.endDate)} < ${String(event.date)}.`\n );\n }\n\n return target >= start && target <= end;\n}\n\nexport function getEventsForDate(\n events: CalendarEvent[],\n date: Date\n): CalendarEvent[] {\n return events.filter(event => eventCoversDate(event, date));\n}\n\nexport function hasEvents(events: CalendarEvent[], date: Date): boolean {\n return getEventsForDate(events, date).length > 0;\n}\n\nexport function generateCalendarDates(\n year: number,\n month: number,\n events: CalendarEvent[] = [],\n weekStartsOn: 0 | 1 = 0\n): CalendarDate[][] {\n const firstDay = new Date(year, month, 1);\n const lastDay = new Date(year, month + 1, 0);\n const daysInMonth = lastDay.getDate();\n const prevMonthLastDay = new Date(year, month, 0).getDate();\n\n let firstDayOfWeek = firstDay.getDay();\n if (weekStartsOn === 1) {\n firstDayOfWeek = firstDayOfWeek === 0 ? 6 : firstDayOfWeek - 1;\n }\n\n const dates: CalendarDate[][] = [];\n let day = 1;\n let nextMonthDay = 1;\n\n for (let week = 0; week < 6; week++) {\n const weekDates: CalendarDate[] = [];\n\n for (let dayOfWeek = 0; dayOfWeek < 7; dayOfWeek++) {\n if (week === 0 && dayOfWeek < firstDayOfWeek) {\n // Previous month days\n const prevDay = prevMonthLastDay - firstDayOfWeek + dayOfWeek + 1;\n const prevDate = new Date(year, month - 1, prevDay);\n const dateEvents = getEventsForDate(events, prevDate);\n weekDates.push({\n date: prevDate,\n isCurrentMonth: false,\n isToday: isToday(prevDate),\n hasEvents: dateEvents.length > 0,\n events: dateEvents,\n });\n } else if (day > daysInMonth) {\n // Next month days\n const nextDate = new Date(year, month + 1, nextMonthDay);\n const dateEvents = getEventsForDate(events, nextDate);\n weekDates.push({\n date: nextDate,\n isCurrentMonth: false,\n isToday: isToday(nextDate),\n hasEvents: dateEvents.length > 0,\n events: dateEvents,\n });\n nextMonthDay++;\n } else {\n // Current month days\n const currentDate = new Date(year, month, day);\n const dateEvents = getEventsForDate(events, currentDate);\n weekDates.push({\n date: currentDate,\n isCurrentMonth: true,\n isToday: isToday(currentDate),\n hasEvents: dateEvents.length > 0,\n events: dateEvents,\n });\n day++;\n }\n }\n\n dates.push(weekDates);\n }\n\n return dates;\n}\n\nexport function getCellClasses(calendarDate: CalendarDate): string[] {\n const classes: string[] = [];\n\n if (!calendarDate.isCurrentMonth) {\n classes.push('calendar-cell-other-month');\n }\n\n if (calendarDate.isToday) {\n classes.push('calendar-cell-today');\n }\n\n if (calendarDate.hasEvents) {\n classes.push('calendar-cell-has-event');\n }\n\n return classes;\n}\n\nexport function formatDateForDisplay(date: Date): string {\n return `${DAYS[date.getDay()]} ${date.getDate()}`;\n}\n\nexport function getMonthYearText(year: number, month: number): string {\n return `${MONTHS_FULL[month]} ${year}`;\n}\n\nexport function formatTimeRange(event: CalendarEvent): string {\n if (event.allDay || (!event.startTime && !event.endTime)) {\n return 'All day';\n }\n\n if (event.startTime && event.endTime) {\n return `${event.startTime} - ${event.endTime}`;\n }\n\n if (event.startTime) {\n return `${event.startTime}`;\n }\n\n return '';\n}\n\nexport function formatAttendees(attendees?: string[]): string {\n if (!attendees || attendees.length === 0) return '';\n\n if (attendees.length === 1) return attendees[0];\n if (attendees.length === 2) return attendees.join(' and ');\n\n return `${attendees.slice(0, -1).join(', ')}, and ${attendees[attendees.length - 1]}`;\n}\n\nexport function sortEventsByTime(events: CalendarEvent[]): CalendarEvent[] {\n return [...events].sort((a, b) => {\n const aAllDay = a.allDay || (!a.startTime && !a.endTime);\n const bAllDay = b.allDay || (!b.startTime && !b.endTime);\n\n if (aAllDay && !bAllDay) return -1;\n if (!aAllDay && bAllDay) return 1;\n\n if (!a.startTime || !b.startTime) return 0;\n return a.startTime.localeCompare(b.startTime);\n });\n}\n\nexport const DEFAULT_CATEGORY_COLORS: CategoryColorMap = {\n work: '#3b82f6',\n personal: '#8b5cf6',\n meeting: '#10b981',\n deadline: '#ef4444',\n appointment: '#f59e0b',\n other: '#6b7280',\n};\n\n// Dynamic function that accepts custom colors\nexport function getDefaultEventColor(\n category?: string,\n customColors?: CategoryColorMap\n): string {\n const colorMap = customColors || DEFAULT_CATEGORY_COLORS;\n\n if (category && colorMap[category]) {\n return colorMap[category];\n }\n\n // Default fallback color\n return '#fc8917';\n}\n\n// Helper to merge custom colors with defaults\nexport function mergeCategoryColors(\n customColors?: CategoryColorMap\n): CategoryColorMap {\n return {\n ...DEFAULT_CATEGORY_COLORS,\n ...customColors,\n };\n}\n\n// Validate if a color is a valid hex color\nexport function isValidHexColor(color: string): boolean {\n return /^#([0-9A-F]{3}){1,2}$/i.test(color);\n}\n\n// Get color for a category with validation\nexport function getCategoryColor(\n category: string,\n customColors?: CategoryColorMap\n): string {\n const colorMap = mergeCategoryColors(customColors);\n const color = colorMap[category] || colorMap.other || '#fc8917';\n\n return isValidHexColor(color) ? color : '#fc8917';\n}\n\nconst HTML_ESCAPES: Record<string, string> = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;',\n};\n\n// Escape a value for interpolation into HTML text or a quoted attribute\nexport function escapeHtml(value: unknown): string {\n if (value === null || value === undefined) return '';\n\n return String(value).replace(/[&<>\"']/g, char => HTML_ESCAPES[char]);\n}\n\n// Reduce a caller-supplied value to a single safe CSS class token\nexport function slugifyToken(value: string): string {\n return String(value)\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n}\n\n// Allow http(s), mailto and relative URLs; anything else (javascript:, data:,\n// vbscript:) collapses to a harmless anchor\nexport function safeUrl(value: string): string {\n // Browsers ignore control characters when resolving a scheme, so\n // `java\\0script:` and `java\\tscript:` both navigate. Strip them before\n // testing rather than after.\n const normalized = String(value)\n .split('')\n .filter(char => char.charCodeAt(0) > 0x20)\n .join('');\n\n if (/^(?:https?:|mailto:)/i.test(normalized)) return normalized;\n\n // Relative URLs have no scheme at all — a colon before the first slash,\n // question mark or hash means someone is naming one\n const schemeless = !/^[^/?#]*:/.test(normalized);\n\n return schemeless ? normalized : '#';\n}\n\n// Accept hex colors and bare CSS color keywords; reject anything that could\n// terminate the declaration or escape the style attribute\nexport function safeColor(value: string): string {\n const trimmed = String(value).trim();\n\n return isValidHexColor(trimmed) || /^[a-z]+$/i.test(trimmed)\n ? trimmed\n : '#3b82f6';\n}\n\nexport const MINUTES_PER_DAY = 1440;\nexport const DEFAULT_SLOT_DURATION = 60;\n\nexport function parseTimeToMinutes(time: unknown): number | null {\n if (typeof time !== 'string') return null;\n\n const match = /^(\\d{1,2}):(\\d{2})$/.exec(time.trim());\n if (!match) return null;\n\n const hours = Number(match[1]);\n const mins = Number(match[2]);\n if (hours > 24 || mins > 59 || (hours === 24 && mins > 0)) return null;\n\n return hours * 60 + mins;\n}\n\nexport function formatMinutes(total: number): string {\n const hours = Math.floor(total / 60);\n const mins = total % 60;\n return `${String(hours).padStart(2, '0')}:${String(mins).padStart(2, '0')}`;\n}\n\n// Absolute [start, end) in minutes. An end at or before the start is on the\n// following day, so a booking that crosses midnight is one interval rather than\n// two half-days. An unreadable time occupies the whole day — a booking surface\n// that cannot parse a time must not offer the slot.\nexport function eventInterval(\n event: CalendarEvent,\n slotDuration: number,\n onDay: Date\n): [number, number] | null {\n const day = normalizeDate(onDay).getTime();\n if (Number.isNaN(day)) return null;\n\n const base = day / 60000;\n const wholeDay: [number, number] = [base, base + MINUTES_PER_DAY];\n\n if (event.allDay || !event.startTime) return wholeDay;\n\n const from = parseTimeToMinutes(event.startTime);\n if (from === null) return wholeDay;\n\n if (event.endTime === undefined || event.endTime === null) {\n return [base + from, base + from + slotDuration];\n }\n\n const to = parseTimeToMinutes(event.endTime);\n if (to === null) return wholeDay;\n\n return [base + from, base + (to <= from ? to + MINUTES_PER_DAY : to)];\n}\n\nexport function mergeIntervals(\n intervals: Array<[number, number]>\n): Array<[number, number]> {\n const sorted = [...intervals].sort((a, b) => a[0] - b[0]);\n\n return sorted.reduce<Array<[number, number]>>((merged, [start, end]) => {\n const last = merged[merged.length - 1];\n if (last && start <= last[1]) last[1] = Math.max(last[1], end);\n else merged.push([start, end]);\n return merged;\n }, []);\n}\n\n// Which of the day's slots any booking overlaps. Events from the previous day\n// belong in `events` so a booking crossing midnight marks the morning it runs into.\nexport function bookedSlots(\n events: CalendarEvent[],\n date: Date,\n slotDuration: number = DEFAULT_SLOT_DURATION\n): boolean[] {\n const base = normalizeDate(date).getTime() / 60000;\n\n const previousDay = new Date(date);\n previousDay.setDate(previousDay.getDate() - 1);\n\n // A span's times repeat on each day it covers, so the window is anchored to\n // the day being drawn rather than the day the span began\n const intervals: Array<[number, number]> = [];\n for (const event of new Set(events)) {\n for (const day of [previousDay, date]) {\n if (!eventCoversDate(event, day)) continue;\n const interval = eventInterval(event, slotDuration, day);\n if (interval) intervals.push(interval);\n }\n }\n\n const merged = mergeIntervals(intervals);\n\n return Array.from(\n { length: Math.floor(MINUTES_PER_DAY / slotDuration) },\n (_, index) => {\n const start = base + index * slotDuration;\n const end = start + slotDuration;\n return merged.some(([from, to]) => start < to && end > from);\n }\n );\n}\n","import {\n CalendarEvent,\n CalendarState,\n CalendarConfig,\n CalendarActions,\n CalendarViewModel,\n CalendarPane,\n CategoryColorMap,\n} from './types';\nimport {\n generateCalendarDates,\n getEventsForDate,\n generateYears,\n getMonthYearText,\n formatDateForDisplay,\n mergeCategoryColors,\n getCategoryColor,\n MONTHS,\n DAYS,\n} from './utils';\n\nexport class CalendarEngine {\n private state: CalendarState;\n private config: CalendarConfig;\n private listeners: Set<() => void> = new Set();\n private categoryColors: CategoryColorMap;\n\n constructor(config: CalendarConfig) {\n this.config = config;\n this.categoryColors = mergeCategoryColors(config.categoryColors);\n\n const initialDate = config.initialDate || new Date();\n this.state = {\n currentYear: initialDate.getFullYear(),\n currentMonth: initialDate.getMonth(),\n currentDate: initialDate.getDate(),\n selectedDate: null,\n selectedDayIndex: null,\n tasks: [],\n };\n }\n\n /**\n * Subscribe to state changes\n */\n subscribe(listener: () => void): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n /**\n * Notify all listeners of state changes\n */\n private notify(): void {\n this.listeners.forEach(listener => listener());\n }\n\n /**\n * Get current state\n */\n getState(): CalendarState {\n return { ...this.state };\n }\n\n /**\n * Get view model with computed properties\n */\n getViewModel(): CalendarViewModel {\n const panes: CalendarPane[] = Array.from(\n { length: Math.max(1, this.config.monthCount ?? 1) },\n (_, offset) => {\n const anchor = new Date(\n this.state.currentYear,\n this.state.currentMonth + offset,\n 1\n );\n const year = anchor.getFullYear();\n const month = anchor.getMonth();\n\n return {\n year,\n month,\n monthAndYearText: getMonthYearText(year, month),\n calendarDates: generateCalendarDates(\n year,\n month,\n this.config.events,\n this.config.weekStartsOn\n ),\n };\n }\n );\n\n return {\n ...this.state,\n months: MONTHS,\n days: DAYS,\n years: generateYears(this.config.minYear, this.config.maxYear),\n monthAndYearText: panes[0].monthAndYearText,\n scheduleDay: this.state.selectedDate\n ? formatDateForDisplay(this.state.selectedDate)\n : '',\n panes,\n calendarDates: panes[0].calendarDates,\n };\n }\n\n /**\n * Get actions object\n */\n getActions(): CalendarActions {\n return {\n next: this.next.bind(this),\n previous: this.previous.bind(this),\n jump: this.jump.bind(this),\n goToToday: this.goToToday.bind(this),\n isCurrentMonth: this.isCurrentMonth.bind(this),\n selectDate: this.selectDate.bind(this),\n updateTasks: this.updateTasks.bind(this),\n };\n }\n\n /**\n * Navigate to next month\n */\n private next(): void {\n if (this.state.currentMonth === 11) {\n this.state.currentMonth = 0;\n this.state.currentYear++;\n } else {\n this.state.currentMonth++;\n }\n\n this.state.selectedDate = null;\n this.state.selectedDayIndex = null;\n this.updateTasks();\n this.notify();\n }\n\n /**\n * Navigate to previous month\n */\n private previous(): void {\n if (this.state.currentMonth === 0) {\n this.state.currentMonth = 11;\n this.state.currentYear--;\n } else {\n this.state.currentMonth--;\n }\n\n this.state.selectedDate = null;\n this.state.selectedDayIndex = null;\n this.updateTasks();\n this.notify();\n }\n\n /**\n * Jump to specific month and year\n */\n private jump(year: number, month: number): void {\n this.state.currentYear = year;\n this.state.currentMonth = month;\n this.state.selectedDate = null;\n this.state.selectedDayIndex = null;\n this.updateTasks();\n this.notify();\n }\n\n /**\n * Navigate to current month (today)\n */\n private goToToday(): void {\n const today = new Date();\n this.state.currentYear = today.getFullYear();\n this.state.currentMonth = today.getMonth();\n this.state.selectedDate = null;\n this.state.selectedDayIndex = null;\n this.updateTasks();\n this.notify();\n }\n\n /**\n * Check if currently viewing today's month\n */\n private isCurrentMonth(): boolean {\n const today = new Date();\n return (\n this.state.currentYear === today.getFullYear() &&\n this.state.currentMonth === today.getMonth()\n );\n }\n\n /**\n * Select a specific date\n */\n private selectDate(date: Date, dayIndex?: number, navigate = true): void {\n this.state.selectedDate = date;\n this.state.selectedDayIndex = dayIndex ?? null;\n this.state.currentDate = date.getDate();\n if (navigate) {\n this.state.currentMonth = date.getMonth();\n this.state.currentYear = date.getFullYear();\n }\n this.updateTasks();\n this.notify();\n }\n\n /**\n * Update tasks for the currently selected date\n */\n private updateTasks(): void {\n if (!this.state.selectedDate) {\n this.state.tasks = [];\n return;\n }\n\n this.state.tasks = getEventsForDate(\n this.config.events,\n this.state.selectedDate\n );\n }\n\n /**\n * Update events configuration\n */\n updateEvents(events: CalendarEvent[]): void {\n this.config.events = events;\n this.updateTasks();\n this.notify();\n }\n\n /**\n * Handle date cell click\n */\n handleDateClick(\n date: Date,\n dayIndex?: number,\n options?: { navigate?: boolean }\n ): void {\n this.selectDate(date, dayIndex, options?.navigate !== false);\n }\n\n /**\n * Check if date has events\n */\n hasEventsForDate(date: Date): boolean {\n return getEventsForDate(this.config.events, date).length > 0;\n }\n\n /**\n * Get events for a specific date\n */\n getEventsForDate(date: Date): CalendarEvent[] {\n return getEventsForDate(this.config.events, date);\n }\n\n /**\n * Clear selected date\n */\n clearSelection(): void {\n this.state.selectedDate = null;\n this.state.selectedDayIndex = null;\n this.state.tasks = [];\n this.notify();\n }\n\n /**\n * Get category color (with custom colors support)\n */\n getCategoryColor(category?: string): string {\n if (!category) return '#fc8917';\n return getCategoryColor(category, this.categoryColors);\n }\n\n /**\n * Update category colors dynamically\n */\n updateCategoryColors(colors: CategoryColorMap): void {\n this.categoryColors = mergeCategoryColors(colors);\n this.notify();\n }\n\n /**\n * Get all category colors\n */\n getCategoryColors(): CategoryColorMap {\n return { ...this.categoryColors };\n }\n\n /**\n * Register a new category with color\n */\n registerCategory(name: string, color: string): void {\n this.categoryColors[name] = color;\n this.notify();\n }\n\n /**\n * Destroy the engine and cleanup listeners\n */\n destroy(): void {\n this.listeners.clear();\n }\n}\n","export * from './types';\nexport * from './utils';\nexport { CalendarEngine } from './calendar-engine';\n\n// Re-export commonly used utilities\nexport {\n MONTHS,\n MONTHS_FULL,\n DAYS,\n normalizeDate,\n isSameDay,\n isToday,\n generateYears,\n getEventsForDate,\n hasEvents,\n generateCalendarDates,\n getCellClasses,\n formatDateForDisplay,\n getMonthYearText,\n} from './utils';\n","import {\n CalendarEngine,\n getCellClasses,\n formatTimeRange,\n formatAttendees,\n bookedSlots,\n formatMinutes,\n parseHourRanges,\n isDateWithinWindow,\n isDayAllowed,\n DEFAULT_SLOT_DURATION,\n MINUTES_PER_DAY,\n escapeHtml,\n slugifyToken,\n safeUrl,\n safeColor,\n MONTHS_FULL,\n MONTHS,\n} from '../core';\nimport type {\n CalendarEvent,\n CalendarTheme,\n CalendarPane,\n CategoryColorMap,\n} from '../core';\n\nconst isSameDay = (a: Date, b: Date): boolean =>\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate();\n\nexport class CalendarElement extends HTMLElement {\n static observedAttributes = [\n 'initial-date',\n 'min-year',\n 'max-year',\n 'min-date',\n 'max-date',\n 'available-days',\n 'available-hours',\n 'week-starts-on',\n 'heading',\n 'months',\n 'slot-duration',\n 'title',\n 'use-short-month-names',\n 'availability-mode',\n 'selectable',\n 'loading',\n ];\n\n private static readonly themeMap: Record<keyof CalendarTheme, string> = {\n primary: '--calendar-primary-color',\n secondary: '--calendar-secondary-color',\n tertiary: '--calendar-tertiary-color',\n textColor: '--calendar-text-color',\n textLight: '--calendar-text-light',\n background: '--calendar-background',\n cellHover: '--calendar-cell-hover',\n borderColor: '--calendar-border-color',\n todayOutline: '--calendar-today-outline',\n selectedBg: '--calendar-selected-bg',\n outOfRangeBg: '--calendar-out-of-range-bg',\n outOfRangeFg: '--calendar-out-of-range-fg',\n navArrowFg: '--calendar-nav-arrow-fg',\n navArrowBg: '--calendar-nav-arrow-bg',\n navArrowBorder: '--calendar-nav-arrow-border',\n navArrowHoverFg: '--calendar-nav-arrow-hover-fg',\n navArrowHoverBg: '--calendar-nav-arrow-hover-bg',\n inputInvalidBg: '--calendar-input-invalid-bg',\n popupHeaderFg: '--calendar-popup-header-fg',\n popupCloseFg: '--calendar-popup-close-fg',\n popupCloseBg: '--calendar-popup-close-bg',\n popupCloseHoverBg: '--calendar-popup-close-hover-bg',\n headerBg: '--calendar-header-bg',\n popupBg: '--calendar-popup-bg',\n pickerBg: '--calendar-picker-bg',\n pickerShadow: '--calendar-picker-shadow',\n eventIndicator: '--calendar-event-indicator',\n onAccent: '--calendar-on-accent',\n link: '--calendar-link',\n openBg: '--calendar-open-bg',\n openFg: '--calendar-open-fg',\n conditionalBg: '--calendar-conditional-bg',\n conditionalFg: '--calendar-conditional-fg',\n blockedBg: '--calendar-blocked-bg',\n blockedFg: '--calendar-blocked-fg',\n rangeBg: '--calendar-range-bg',\n rangeOutline: '--calendar-range-outline',\n inRangeBg: '--calendar-in-range-bg',\n inRangeOutline: '--calendar-in-range-outline',\n badgeBg: '--calendar-badge-bg',\n badgeText: '--calendar-badge-text',\n badgeSuccessBg: '--calendar-badge-success-bg',\n badgeSuccessText: '--calendar-badge-success-text',\n badgeInfoBg: '--calendar-badge-info-bg',\n badgeInfoText: '--calendar-badge-info-text',\n badgeWarningBg: '--calendar-badge-warning-bg',\n badgeWarningText: '--calendar-badge-warning-text',\n badgeDangerBg: '--calendar-badge-danger-bg',\n badgeDangerText: '--calendar-badge-danger-text',\n badgeNeutralBg: '--calendar-badge-neutral-bg',\n badgeNeutralText: '--calendar-badge-neutral-text',\n badgePositiveBg: '--calendar-badge-positive-bg',\n badgePositiveText: '--calendar-badge-positive-text',\n badgeTentativeBg: '--calendar-badge-tentative-bg',\n badgeTentativeText: '--calendar-badge-tentative-text',\n };\n\n private engine: CalendarEngine | null = null;\n private unsubscribe: (() => void) | null = null;\n private actions: ReturnType<CalendarEngine['getActions']> | null = null;\n private pickerOpen = false;\n private yearInput = '';\n private yearInputValid = true;\n private listenersAttached = false;\n\n private clickOutsideHandler: ((e: MouseEvent) => void) | null = null;\n private delegatedClickHandler: ((e: MouseEvent) => void) | null = null;\n private delegatedInputHandler: ((e: Event) => void) | null = null;\n private delegatedBlurHandler: ((e: FocusEvent) => void) | null = null;\n private delegatedKeydownHandler: ((e: KeyboardEvent) => void) | null = null;\n\n // Rich property backing fields\n private _events: CalendarEvent[] = [];\n private _theme: CalendarTheme | null = null;\n private _categoryColors: CategoryColorMap | null = null;\n private _renderEvent: ((e: CalendarEvent) => string) | null = null;\n private _renderNoEvents: (() => string) | null = null;\n private _availabilityColors: Record<string, string> | null = null;\n private _selectableStatuses: string[] | null = null;\n private _initError: Error | null = null;\n private pendingUpdate: Promise<void> | null = null;\n\n // Selection state (availability mode — range)\n private _rangeStart: Date | null = null;\n private _rangeEnd: Date | null = null;\n private _timeRangeDate: Date | null = null;\n private _timeRangeStart: string | null = null;\n private _timeRangeEnd: string | null = null;\n private _timeRangeComplete = false;\n\n get events(): CalendarEvent[] {\n return this._events;\n }\n\n set events(val: CalendarEvent[]) {\n this._initError = null;\n this._events = val;\n if (this.engine) {\n this.engine.updateEvents(val);\n }\n }\n\n set theme(val: CalendarTheme) {\n this._theme = val;\n this.applyTheme();\n }\n\n set categoryColors(val: CategoryColorMap) {\n this._categoryColors = val;\n if (this.engine) {\n this.engine.updateCategoryColors(val);\n }\n }\n\n get availabilityColors(): Record<string, string> {\n return this._availabilityColors ?? {};\n }\n\n set availabilityColors(val: Record<string, string>) {\n this._initError = null;\n this._availabilityColors = val;\n if (this.engine) this.scheduleRender();\n }\n\n get selectableStatuses(): string[] {\n return this._selectableStatuses ?? [];\n }\n\n set selectableStatuses(val: string[]) {\n this._selectableStatuses = val;\n if (this.engine) this.scheduleRender();\n }\n\n set renderEvent(val: (e: CalendarEvent) => string) {\n this._renderEvent = val;\n if (this.engine) this.scheduleRender();\n // ignored when availability-mode attribute is set\n }\n\n set renderNoEvents(val: () => string) {\n this._renderNoEvents = val;\n if (this.engine) this.scheduleRender();\n // ignored when availability-mode attribute is set\n }\n\n get loading(): boolean {\n return this.hasAttribute('loading');\n }\n\n set loading(val: boolean) {\n if (val) this.setAttribute('loading', '');\n else this.removeAttribute('loading');\n }\n\n // Custom element reactions report rather than propagate, so a failure here\n // is kept and resurfaced at the next call the integrator makes\n private reaction(run: () => void): void {\n try {\n run();\n } catch (error) {\n this._initError = error as Error;\n throw error;\n }\n }\n\n connectedCallback(): void {\n this.classList.add('kalendly-calendar');\n this.reaction(() => {\n this.initEngine();\n this.render();\n });\n }\n\n disconnectedCallback(): void {\n this.cleanup();\n this.classList.remove('kalendly-calendar');\n this.innerHTML = '';\n }\n\n attributeChangedCallback(\n name: string,\n oldVal: string | null,\n newVal: string | null\n ): void {\n if (oldVal === newVal) return;\n if (name === 'loading') {\n this.scheduleRender();\n return;\n }\n if (name === 'selectable' && newVal === null) {\n this._rangeStart = null;\n this._rangeEnd = null;\n this._timeRangeDate = null;\n this._timeRangeStart = null;\n this._timeRangeEnd = null;\n this._timeRangeComplete = false;\n }\n this.reinit();\n }\n\n private get headingText(): string | null {\n const heading = this.getAttribute('heading');\n if (heading !== null) return heading;\n\n const title = this.getAttribute('title');\n if (title !== null && !CalendarElement.titleDeprecationWarned) {\n CalendarElement.titleDeprecationWarned = true;\n console.warn(\n `<kal-calendar> the title attribute is deprecated and will be removed ` +\n `in a future release — use heading instead. title is a global HTML ` +\n `attribute, so the browser also renders it as a tooltip over the ` +\n `whole calendar.`\n );\n }\n return title;\n }\n\n private static warnedMissingEnd = new Set<string>();\n\n private get slotDuration(): number {\n const raw = this.getAttribute('slot-duration');\n if (raw === null) return DEFAULT_SLOT_DURATION;\n\n const minutes = Number(raw);\n if (\n Number.isInteger(minutes) &&\n minutes > 0 &&\n MINUTES_PER_DAY % minutes === 0\n ) {\n return minutes;\n }\n\n console.warn(\n `<kal-calendar> slot-duration=\"${raw}\" must be a positive whole number of ` +\n `minutes that divides ${MINUTES_PER_DAY} — falling back to ` +\n `${DEFAULT_SLOT_DURATION}.`\n );\n return DEFAULT_SLOT_DURATION;\n }\n\n private warnMissingEndTime(events: CalendarEvent[]): void {\n for (const event of events) {\n if (!event.startTime || event.endTime) continue;\n\n const key = String(event.id);\n if (CalendarElement.warnedMissingEnd.has(key)) continue;\n CalendarElement.warnedMissingEnd.add(key);\n\n console.warn(\n `<kal-calendar> event ${key} has startTime but no endTime — occupying ` +\n `one ${this.slotDuration}-minute slot. Send an endTime to say how long ` +\n `it runs.`\n );\n }\n }\n\n private get monthCount(): number {\n const requested = Number(this.getAttribute('months') ?? 1);\n if (!Number.isInteger(requested) || requested < 1) return 1;\n\n return Math.min(requested, 2);\n }\n\n private get minYear(): number {\n const val = this.getAttribute('min-year');\n return val ? parseInt(val, 10) : new Date().getFullYear() - 30;\n }\n\n private get maxYear(): number {\n const val = this.getAttribute('max-year');\n return val ? parseInt(val, 10) : new Date().getFullYear() + 10;\n }\n\n private boundaryDate(attr: 'min-date' | 'max-date'): Date | null {\n const val = this.getAttribute(attr);\n if (!val) return null;\n\n const parsed = new Date(val);\n if (Number.isNaN(parsed.getTime())) {\n throw new Error(\n `<kal-calendar> ${attr} is unreadable: \"${val}\". Use a value Date can ` +\n `parse, the same as initial-date.`\n );\n }\n\n return parsed;\n }\n\n private get availableDays(): number[] | null {\n const val = this.getAttribute('available-days');\n if (val === null) return null;\n\n const parts = val\n .split(',')\n .map(part => part.trim())\n .filter(Boolean);\n\n if (parts.length === 0) {\n throw new Error(\n `<kal-calendar> available-days is empty. Omit the attribute to allow ` +\n `every day, or name at least one weekday.`\n );\n }\n\n return parts.map(part => {\n const day = Number(part);\n if (!Number.isInteger(day) || day < 0 || day > 6) {\n throw new Error(\n `<kal-calendar> available-days must list integers 0-6, 0 = Sunday. ` +\n `Got \"${part}\".`\n );\n }\n return day;\n });\n }\n\n private get availableHours(): Array<[number, number]> | null {\n const val = this.getAttribute('available-hours');\n if (val === null) return null;\n\n return parseHourRanges(val, this.slotDuration);\n }\n\n private initEngine(): void {\n const initialDateAttr = this.getAttribute('initial-date');\n const initialDate = initialDateAttr ? new Date(initialDateAttr) : undefined;\n const weekStartsOnAttr = this.getAttribute('week-starts-on');\n const weekStartsOn: 0 | 1 = weekStartsOnAttr === '1' ? 1 : 0;\n\n this.engine = new CalendarEngine({\n events: this._events,\n initialDate,\n minYear: this.minYear,\n maxYear: this.maxYear,\n weekStartsOn,\n categoryColors: this._categoryColors ?? undefined,\n monthCount: this.monthCount,\n });\n\n this.actions = this.engine.getActions();\n this.applyTheme();\n\n this.unsubscribe = this.engine.subscribe(() => {\n this.scheduleRender();\n });\n }\n\n private reinit(): void {\n if (!this.engine) return;\n this.cleanup();\n this.initEngine();\n this.scheduleRender();\n }\n\n private cleanup(): void {\n if (this.unsubscribe) {\n this.unsubscribe();\n this.unsubscribe = null;\n }\n\n if (this.delegatedClickHandler) {\n this.removeEventListener('click', this.delegatedClickHandler);\n this.delegatedClickHandler = null;\n }\n if (this.delegatedInputHandler) {\n this.removeEventListener('input', this.delegatedInputHandler);\n this.delegatedInputHandler = null;\n }\n if (this.delegatedBlurHandler) {\n this.removeEventListener('blur', this.delegatedBlurHandler, true);\n this.delegatedBlurHandler = null;\n }\n if (this.delegatedKeydownHandler) {\n this.removeEventListener('keydown', this.delegatedKeydownHandler);\n this.delegatedKeydownHandler = null;\n }\n if (this.clickOutsideHandler) {\n document.removeEventListener('click', this.clickOutsideHandler);\n this.clickOutsideHandler = null;\n }\n\n this.listenersAttached = false;\n\n if (this.engine) {\n this.engine.destroy();\n this.engine = null;\n }\n\n this.actions = null;\n }\n\n private applyTheme(): void {\n if (!this._theme) return;\n const root = document.documentElement;\n for (const key of Object.keys(CalendarElement.themeMap) as Array<\n keyof CalendarTheme\n >) {\n const value = this._theme[key];\n if (value) root.style.setProperty(CalendarElement.themeMap[key], value);\n }\n }\n\n private static readonly BUILT_IN_BUCKETS = ['blocked', 'conditional', 'open'];\n\n private static titleDeprecationWarned = false;\n\n private get knownBuckets(): string[] {\n return [\n ...CalendarElement.BUILT_IN_BUCKETS,\n ...Object.keys(this._availabilityColors ?? {}),\n ];\n }\n\n get updateComplete(): Promise<void> {\n return this.pendingUpdate ?? Promise.resolve();\n }\n\n private scheduleRender(): void {\n if (this.pendingUpdate) return;\n\n this.pendingUpdate = Promise.resolve().then(() => {\n this.pendingUpdate = null;\n try {\n this.render();\n } catch (error) {\n this._initError = error as Error;\n throw error;\n }\n });\n }\n\n private rethrowInitError(): void {\n if (this._initError) throw this._initError;\n }\n\n private assertStatusesDeclared(): void {\n if (!this.getAttribute('availability-mode')) return;\n\n const missing = this._events\n .filter(\n event =>\n typeof event.availabilityStatus !== 'string' ||\n event.availabilityStatus === ''\n )\n .map(event => String(event.id));\n\n if (missing.length) {\n throw new Error(\n `<kal-calendar> availability-mode requires availabilityStatus on every ` +\n `event. Missing on: ${missing.join(', ')}.`\n );\n }\n }\n\n private assertStatusesKnown(): void {\n const known = new Set(this.knownBuckets);\n const unknown = this._events\n .filter(event => !known.has(event.availabilityStatus as string))\n .map(event => `${event.id} (${event.availabilityStatus})`);\n\n if (unknown.length) {\n throw new Error(\n `<kal-calendar> availabilityStatus must name a built-in bucket ` +\n `(${CalendarElement.BUILT_IN_BUCKETS.join(', ')}) or a key of ` +\n `availabilityColors. Unrecognised on: ${unknown.join(', ')}.`\n );\n }\n }\n\n private resolveBucket(date: Date): string {\n if (!this.engine) return 'open';\n\n const declared = new Set(\n this.engine\n .getEventsForDate(date)\n .map(event => event.availabilityStatus as string)\n );\n if (declared.size === 0) return 'open';\n\n return this.knownBuckets.find(bucket => declared.has(bucket)) as string;\n }\n\n private assertHorizonOrdered(): void {\n const min = this.boundaryDate('min-date');\n const max = this.boundaryDate('max-date');\n\n if (min && max && min.getTime() > max.getTime()) {\n throw new Error(\n `<kal-calendar> min-date is after max-date: ` +\n `\"${this.getAttribute('min-date')}\" > \"${this.getAttribute('max-date')}\".`\n );\n }\n }\n\n // Whether the vendor offers this day at all, before any event is considered.\n private isDateOffered(date: Date): boolean {\n return (\n isDateWithinWindow(\n date,\n this.boundaryDate('min-date'),\n this.boundaryDate('max-date')\n ) && isDayAllowed(date, this.availableDays)\n );\n }\n\n private isDateSelectable(date: Date): boolean {\n if (!this.engine) return false;\n if (!this.isDateOffered(date)) return false;\n\n if (this._selectableStatuses) {\n return this._selectableStatuses.includes(this.resolveBucket(date));\n }\n\n return this.engine.getEventsForDate(date).length === 0;\n }\n\n private render(): void {\n if (!this.engine) return;\n\n const viewModel = this.engine.getViewModel();\n const useShortMonths = this.hasAttribute('use-short-month-names');\n const title = this.headingText;\n const minYear = this.minYear;\n const maxYear = this.maxYear;\n const availabilityMode = this.getAttribute('availability-mode');\n const selectable = this.hasAttribute('selectable');\n const isLoading = this.loading;\n\n if (availabilityMode) {\n this.assertStatusesDeclared();\n this.assertStatusesKnown();\n }\n\n // Up front, not in the grid: the grid only renders once a day is open.\n this.boundaryDate('min-date');\n this.boundaryDate('max-date');\n void this.availableDays;\n void this.availableHours;\n this.assertHorizonOrdered();\n\n const today = new Date();\n const todayMonth = today.getMonth();\n const todayYear = today.getFullYear();\n const isCurrentMonth =\n viewModel.currentYear === todayYear &&\n viewModel.currentMonth === todayMonth;\n\n const showScrollHint = viewModel.tasks.length > 3;\n\n const defaultRenderEvent = (event: CalendarEvent) => {\n const timeRange = formatTimeRange(event);\n const attendeesList = formatAttendees(event.attendees);\n\n let borderColor = safeColor(event.color || '#3b82f6');\n if (event.category) {\n borderColor = this.engine!.getCategoryColor(event.category);\n }\n\n const getCategoryLabel = (category?: string) => {\n const labels: Record<string, string> = {\n work: 'WORK',\n personal: 'PERSONAL',\n meeting: 'MEETING',\n deadline: 'DEADLINE',\n appointment: 'APPOINTMENT',\n other: 'OTHER',\n };\n return category ? labels[category] || category.toUpperCase() : '';\n };\n\n const getPriorityLabel = (priority?: string) => {\n const labels: Record<string, string> = {\n high: 'HIGH',\n medium: 'MEDIUM',\n low: 'LOW',\n };\n return priority ? labels[priority] || priority.toUpperCase() : '';\n };\n\n const getStatusLabel = (status?: string) => {\n const labels: Record<string, string> = {\n completed: 'COMPLETED',\n cancelled: 'CANCELLED',\n tentative: 'TENTATIVE',\n scheduled: 'SCHEDULED',\n };\n return status ? labels[status] || status.toUpperCase() : '';\n };\n\n return `\n <div class=\"event-card\" style=\"border-left-color: ${borderColor}\">\n <div class=\"event-header\">\n ${event.name ? `<div class=\"event-title\">${escapeHtml(event.name)}</div>` : ''}\n <div class=\"event-badges\">\n ${event.category ? `<span class=\"badge category category-${slugifyToken(event.category)}\">${escapeHtml(getCategoryLabel(event.category))}</span>` : ''}\n ${event.priority ? `<span class=\"badge priority priority-${slugifyToken(event.priority)}\">${escapeHtml(getPriorityLabel(event.priority))}</span>` : ''}\n ${event.status && event.status !== 'scheduled' ? `<span class=\"badge status status-${slugifyToken(event.status)}\">${escapeHtml(getStatusLabel(event.status))}</span>` : ''}\n </div>\n </div>\n\n ${\n timeRange\n ? `\n <div class=\"event-time\">\n <span class=\"event-time-label\">Time:</span>\n <span class=\"event-time-value\">${escapeHtml(timeRange)}</span>\n </div>\n `\n : ''\n }\n\n ${\n event.description\n ? `\n <div class=\"event-description\">${escapeHtml(event.description)}</div>\n `\n : ''\n }\n\n ${\n event.location\n ? `\n <div class=\"event-time\">\n <span class=\"event-time-label\">Location:</span>\n <span class=\"event-time-value\">${escapeHtml(event.location)}</span>\n </div>\n `\n : ''\n }\n\n ${\n attendeesList\n ? `\n <div class=\"event-time\">\n <span class=\"event-time-label\">Attendees:</span>\n <span class=\"event-time-value\">${escapeHtml(attendeesList)}</span>\n </div>\n `\n : ''\n }\n\n ${\n event.organizer\n ? `\n <div class=\"event-time\">\n <span class=\"event-time-label\">Organizer:</span>\n <span class=\"event-time-value\">${escapeHtml(event.organizer)}</span>\n </div>\n `\n : ''\n }\n\n ${\n event.notes\n ? `\n <div class=\"event-time\">\n <span class=\"event-time-label\">Notes:</span>\n <span class=\"event-time-value\">${escapeHtml(event.notes)}</span>\n </div>\n `\n : ''\n }\n\n ${\n event.url\n ? `\n <div class=\"event-time\">\n <a href=\"${escapeHtml(safeUrl(event.url as string))}\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"event-link\">\n View Details →\n </a>\n </div>\n `\n : ''\n }\n\n ${\n event.tags && event.tags.length > 0\n ? `\n <div class=\"event-tags\">\n ${event.tags.map((tag: string) => `<span class=\"event-tag\">${escapeHtml(tag)}</span>`).join('')}\n </div>\n `\n : ''\n }\n </div>\n `;\n };\n\n const defaultRenderNoEvents = () =>\n '<div class=\"no-events-message\">No events scheduled for this day.</div>';\n\n const renderEvent = this._renderEvent || defaultRenderEvent;\n const renderNoEvents = this._renderNoEvents || defaultRenderNoEvents;\n\n const renderTimeGrid = (date: Date): string => {\n const slotDuration = this.slotDuration;\n\n // A booking crossing midnight belongs to the day it started on, so the\n // previous day's events are needed to mark the morning it runs into\n const previousDay = new Date(date);\n previousDay.setDate(previousDay.getDate() - 1);\n const events = [\n ...this.engine!.getEventsForDate(previousDay),\n ...this.engine!.getEventsForDate(date),\n ];\n\n this.warnMissingEndTime(events);\n const booked = bookedSlots(events, date, slotDuration);\n\n const hours = this.availableHours;\n\n const slots = booked.map((isBooked, index) => {\n const slotStart = index * slotDuration;\n const slotEnd = slotStart + slotDuration;\n const startTime = formatMinutes(slotStart);\n const endTime = formatMinutes(slotEnd);\n\n const offered =\n hours === null ||\n hours.some(([from, to]) => slotStart >= from && slotEnd <= to);\n\n const inTimeRange =\n offered &&\n !isBooked &&\n selectable &&\n this._timeRangeStart !== null &&\n this._timeRangeEnd !== null &&\n isSameDay(this._timeRangeDate!, date) &&\n startTime >= this._timeRangeStart &&\n endTime <= this._timeRangeEnd;\n\n const isRangeStart = inTimeRange && startTime === this._timeRangeStart;\n const isRangeEnd = inTimeRange && endTime === this._timeRangeEnd;\n const isInRange = inTimeRange && !isRangeStart && !isRangeEnd;\n\n const slotClasses = [\n 'time-grid-slot',\n offered ? '' : 'time-grid-slot-out-of-range',\n isBooked ? 'time-grid-slot-blocked' : 'time-grid-slot-open',\n isRangeStart ? 'time-grid-slot-range-start' : '',\n isRangeEnd ? 'time-grid-slot-range-end' : '',\n isInRange ? 'time-grid-slot-in-range' : '',\n ]\n .filter(Boolean)\n .join(' ');\n\n // No data-action outside the offered hours, so cal-slot-select stays\n // silent for a slot the vendor never put up for sale.\n const slotAttrs =\n `${offered ? 'data-action=\"select-slot\" ' : ''}` +\n `data-start-time=\"${startTime}\" ` +\n `data-end-time=\"${endTime}\" data-date=\"${date.toISOString()}\" ` +\n `data-booked=\"${isBooked}\"`;\n\n const status = !offered ? 'Closed' : isBooked ? 'Booked' : 'Available';\n\n return `\n <div class=\"${slotClasses}\" ${slotAttrs}>\n <span class=\"time-grid-label\">${startTime}</span>\n <span class=\"time-grid-status\">${status}</span>\n </div>`;\n });\n\n const gridClasses = selectable\n ? 'time-grid time-grid-selectable'\n : 'time-grid';\n\n return `<div class=\"${gridClasses}\">${slots.join('')}</div>`;\n };\n\n const multiMonth = viewModel.panes.length > 1;\n\n const renderPane = (pane: CalendarPane): string => `\n <div class=\"calendar-pane\">\n ${\n multiMonth\n ? `<div class=\"calendar-pane-caption\">${escapeHtml(pane.monthAndYearText)}</div>`\n : ''\n }\n <table class=\"calendar-table calendar-table-bordered\">\n <thead>\n <tr>\n ${viewModel.days.map(day => `<th>${day.slice(0, 3)}</th>`).join('')}\n </tr>\n </thead>\n <tbody data-calendar-body>\n ${\n isLoading\n ? Array.from(\n { length: 6 },\n () =>\n `<tr>${Array.from(\n { length: 7 },\n () =>\n `<td class=\"calendar-skeleton\" aria-hidden=\"true\"></td>`\n ).join('')}</tr>`\n ).join('')\n : pane.calendarDates\n .map(\n week => `\n <tr>\n ${week\n .map((calendarDate, dayIndex) => {\n const classes = getCellClasses(calendarDate);\n const cellAttrs: string[] = [];\n\n if (\n viewModel.selectedDate &&\n isSameDay(\n calendarDate.date,\n viewModel.selectedDate\n )\n ) {\n classes.push('calendar-cell-selected');\n }\n if (availabilityMode) {\n const bucket = this.resolveBucket(\n calendarDate.date\n );\n const custom = (this._availabilityColors ?? {})[\n bucket\n ];\n\n classes.push(\n `availability-${slugifyToken(bucket)}`\n );\n if (custom) {\n classes.push('availability-status');\n cellAttrs.push(\n `style=\"--availability-color: ${escapeHtml(safeColor(custom))}\"`\n );\n }\n if (!this.isDateSelectable(calendarDate.date)) {\n classes.push('availability-unselectable');\n }\n cellAttrs.push(\n `aria-label=\"${escapeHtml(bucket)}\"`\n );\n }\n if (availabilityMode === 'day' && selectable) {\n const d = calendarDate.date;\n if (\n this._rangeStart &&\n isSameDay(d, this._rangeStart)\n )\n classes.push('availability-range-start');\n if (\n this._rangeEnd &&\n isSameDay(d, this._rangeEnd)\n )\n classes.push('availability-range-end');\n if (this._rangeStart && this._rangeEnd) {\n if (d > this._rangeStart && d < this._rangeEnd)\n classes.push('availability-in-range');\n }\n }\n const dateString = calendarDate.date.toISOString();\n // Not offered means not a click target at all: no\n // data-clickable, so neither the delegated handler\n // nor the hover rule ever sees the cell.\n const offered = this.isDateOffered(\n calendarDate.date\n );\n if (!offered) {\n classes.push('calendar-cell-out-of-range');\n }\n return `\n <td\n class=\"${classes.join(' ')}\"\n data-date=\"${dateString}\"\n data-day-index=\"${dayIndex}\"\n ${offered ? 'data-clickable=\"true\"' : ''}\n ${cellAttrs.join(' ')}\n >\n ${calendarDate.date.getDate()}\n </td>\n `;\n })\n .join('')}\n </tr>\n `\n )\n .join('')\n }\n </tbody>\n </table>\n </div>\n `;\n const html = `\n ${\n title\n ? `\n <div class=\"calendar-title\">\n <h1>${escapeHtml(title)}</h1>\n </div>\n `\n : ''\n }\n\n <div class=\"calendar-content\">\n <div class=\"calendar-card\">\n <div class=\"calendar-nav-header\">\n <button type=\"button\" class=\"calendar-nav-arrow\" data-action=\"previous\" aria-label=\"Previous month\">\n &#8249;\n </button>\n\n <div class=\"calendar-picker-container\" data-picker-container>\n <button\n type=\"button\"\n class=\"calendar-picker-btn\"\n data-action=\"toggle-picker\"\n aria-expanded=\"${this.pickerOpen ? 'true' : 'false'}\"\n aria-haspopup=\"true\"\n >\n ${\n useShortMonths\n ? `${MONTHS[viewModel.currentMonth]} ${viewModel.currentYear}`\n : viewModel.monthAndYearText\n }\n <span class=\"calendar-picker-chevron\">&#9662;</span>\n </button>\n\n ${\n this.pickerOpen\n ? `\n <div class=\"calendar-picker-dropdown\">\n <div class=\"calendar-picker-year-row\">\n <button\n type=\"button\"\n class=\"calendar-picker-year-arrow\"\n data-action=\"year-prev\"\n ${viewModel.currentYear <= minYear ? 'disabled' : ''}\n aria-label=\"Previous year\"\n >&#8249;</button>\n <input\n type=\"text\"\n class=\"calendar-picker-year-input${!this.yearInputValid ? ' invalid' : ''}\"\n value=\"${escapeHtml(this.yearInput || viewModel.currentYear)}\"\n data-year-input\n aria-label=\"Year\"\n />\n <button\n type=\"button\"\n class=\"calendar-picker-year-arrow\"\n data-action=\"year-next\"\n ${viewModel.currentYear >= maxYear ? 'disabled' : ''}\n aria-label=\"Next year\"\n >&#8250;</button>\n </div>\n\n <div class=\"calendar-picker-months\">\n ${(useShortMonths ? MONTHS : MONTHS_FULL)\n .map((month, index) => {\n const isSelected = index === viewModel.currentMonth;\n const isCurrent =\n index === todayMonth &&\n viewModel.currentYear === todayYear;\n return `\n <button\n type=\"button\"\n class=\"calendar-picker-month${isSelected ? ' selected' : ''}${isCurrent ? ' current-month' : ''}\"\n data-action=\"select-month\"\n data-month=\"${index}\"\n >${month}</button>\n `;\n })\n .join('')}\n </div>\n </div>\n `\n : ''\n }\n </div>\n\n <button\n type=\"button\"\n class=\"calendar-today-btn\"\n data-action=\"today\"\n ${isCurrentMonth ? 'disabled' : ''}\n >Today</button>\n\n <button type=\"button\" class=\"calendar-nav-arrow\" data-action=\"next\" aria-label=\"Next month\">\n &#8250;\n </button>\n </div>\n\n <div class=\"calendar-panes\">\n ${viewModel.panes.map(renderPane).join('')}\n </div>\n\n ${\n !isLoading && availabilityMode !== 'day' && viewModel.selectedDate\n ? `\n <div class=\"date-popup\">\n <div class=\"popup-header\">\n <h2>${viewModel.scheduleDay}</h2>\n <button type=\"button\" class=\"popup-close\" data-action=\"close-popup\" aria-label=\"Close\">✕</button>\n </div>\n\n ${\n showScrollHint\n ? `\n <div class=\"scroll-hint\">\n ↓ Scroll to see more events ↓\n </div>\n `\n : ''\n }\n\n <div class=\"events-container\">\n ${\n availabilityMode === 'time'\n ? renderTimeGrid(viewModel.selectedDate!)\n : viewModel.tasks.length > 0\n ? viewModel.tasks\n .map(event => renderEvent(event))\n .join('')\n : renderNoEvents()\n }\n </div>\n </div>\n `\n : ''\n }\n </div>\n </div>\n `;\n\n this.innerHTML = html;\n this.attachEventListeners();\n }\n\n private attachEventListeners(): void {\n if (this.listenersAttached) return;\n this.listenersAttached = true;\n\n const minYear = this.minYear;\n const maxYear = this.maxYear;\n\n this.delegatedClickHandler = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n\n const cell = target.closest('td[data-clickable=\"true\"]') as HTMLElement;\n if (cell && cell.dataset.date) {\n e.stopPropagation();\n const date = new Date(cell.dataset.date);\n const dayIndex = parseInt(cell.dataset.dayIndex || '0');\n const availMode = this.getAttribute('availability-mode');\n const isSelectable = this.hasAttribute('selectable');\n\n if (availMode === 'day' && isSelectable) {\n if (this.isDateSelectable(date)) {\n let startDate: Date;\n let endDate: Date;\n if (this._rangeEnd !== null) {\n // State 2 (complete) → reset, start fresh\n this._rangeStart = date;\n this._rangeEnd = null;\n startDate = date;\n endDate = date;\n } else if (this._rangeStart === null) {\n // State 0 → first click\n this._rangeStart = date;\n startDate = date;\n endDate = date;\n } else {\n // State 1 → second click, complete the range if no booked day inside\n const [s, e] =\n this._rangeStart <= date\n ? [this._rangeStart, date]\n : [date, this._rangeStart];\n const cursor = new Date(s);\n cursor.setDate(cursor.getDate() + 1);\n let blocked = false;\n while (cursor < e) {\n if (!this.isDateSelectable(cursor)) {\n blocked = true;\n break;\n }\n cursor.setDate(cursor.getDate() + 1);\n }\n if (blocked) {\n // Booked day inside range — reset, start fresh from this click\n this._rangeStart = date;\n this._rangeEnd = null;\n } else {\n this._rangeStart = s;\n this._rangeEnd = e;\n }\n startDate = this._rangeStart;\n endDate = this._rangeEnd ?? this._rangeStart;\n }\n this.dispatchEvent(\n new CustomEvent('cal-availability-select', {\n bubbles: true,\n composed: true,\n detail: { startDate, endDate },\n })\n );\n }\n }\n\n if (availMode === 'time') {\n // Reset time range when a new day is opened\n this._timeRangeDate = null;\n this._timeRangeStart = null;\n this._timeRangeEnd = null;\n this._timeRangeComplete = false;\n }\n\n this.engine!.handleDateClick(date, dayIndex, { navigate: false });\n this.dispatchEvent(\n new CustomEvent('cal-date-select', {\n bubbles: true,\n composed: true,\n detail: { date, events: this.engine!.getEventsForDate(date) },\n })\n );\n return;\n }\n\n const actionEl = target.closest('[data-action]') as HTMLElement;\n if (!actionEl) return;\n\n const action = actionEl.dataset.action;\n e.stopPropagation();\n\n switch (action) {\n case 'previous': {\n const vm = this.engine!.getViewModel();\n const tMonth = vm.currentMonth === 0 ? 11 : vm.currentMonth - 1;\n const tYear =\n vm.currentMonth === 0 ? vm.currentYear - 1 : vm.currentYear;\n this.dispatchMonthChange(tYear, tMonth);\n this.actions!.previous();\n break;\n }\n\n case 'next': {\n const vm = this.engine!.getViewModel();\n const tMonth = vm.currentMonth === 11 ? 0 : vm.currentMonth + 1;\n const tYear =\n vm.currentMonth === 11 ? vm.currentYear + 1 : vm.currentYear;\n this.dispatchMonthChange(tYear, tMonth);\n this.actions!.next();\n break;\n }\n\n case 'today': {\n const t = new Date();\n this.dispatchMonthChange(t.getFullYear(), t.getMonth());\n this.actions!.goToToday();\n this.pickerOpen = false;\n break;\n }\n\n case 'toggle-picker':\n this.pickerOpen = !this.pickerOpen;\n if (this.pickerOpen) {\n this.yearInput = String(this.engine!.getViewModel().currentYear);\n this.yearInputValid = true;\n }\n this.render();\n break;\n\n case 'year-prev': {\n const vm = this.engine!.getViewModel();\n if (vm.currentYear > minYear) {\n const newYear = vm.currentYear - 1;\n this.yearInput = String(newYear);\n this.updatePickerYear(newYear);\n this.dispatchMonthChange(newYear, vm.currentMonth);\n this.actions!.jump(newYear, vm.currentMonth);\n }\n break;\n }\n\n case 'year-next': {\n const vm = this.engine!.getViewModel();\n if (vm.currentYear < maxYear) {\n const newYear = vm.currentYear + 1;\n this.yearInput = String(newYear);\n this.updatePickerYear(newYear);\n this.dispatchMonthChange(newYear, vm.currentMonth);\n this.actions!.jump(newYear, vm.currentMonth);\n }\n break;\n }\n\n case 'select-month': {\n const month = parseInt(actionEl.dataset.month || '0', 10);\n const year = this.engine!.getViewModel().currentYear;\n this.dispatchMonthChange(year, month);\n this.actions!.jump(year, month);\n this.pickerOpen = false;\n break;\n }\n\n case 'close-popup':\n this._timeRangeDate = null;\n this._timeRangeStart = null;\n this._timeRangeEnd = null;\n this._timeRangeComplete = false;\n this.engine!.clearSelection();\n break;\n\n case 'select-slot': {\n const slotStart = actionEl.dataset.startTime!;\n const slotEnd = actionEl.dataset.endTime!;\n const slotDate = new Date(actionEl.dataset.date!);\n const slotBooked = actionEl.dataset.booked === 'true';\n\n // Reported for every slot, the way cal-date-select is for every day.\n // selectable gates the range machine below, not the click itself.\n this.dispatchEvent(\n new CustomEvent('cal-slot-select', {\n bubbles: true,\n composed: true,\n detail: {\n date: slotDate,\n startTime: slotStart,\n endTime: slotEnd,\n booked: slotBooked,\n },\n })\n );\n\n if (slotBooked || !this.hasAttribute('selectable')) break;\n\n if (this._timeRangeComplete) {\n // State 2 → reset, start fresh\n this._timeRangeDate = slotDate;\n this._timeRangeStart = slotStart;\n this._timeRangeEnd = slotEnd;\n this._timeRangeComplete = false;\n } else if (this._timeRangeStart === null) {\n // State 0 → first click\n this._timeRangeDate = slotDate;\n this._timeRangeStart = slotStart;\n this._timeRangeEnd = slotEnd;\n } else {\n // State 1 → second click, extend range\n const newStart =\n slotStart < this._timeRangeStart\n ? slotStart\n : this._timeRangeStart;\n const newEnd =\n slotEnd > this._timeRangeEnd! ? slotEnd : this._timeRangeEnd!;\n this._timeRangeStart = newStart;\n this._timeRangeEnd = newEnd;\n this._timeRangeComplete = true;\n }\n this.render();\n this.dispatchEvent(\n new CustomEvent('cal-availability-select', {\n bubbles: true,\n composed: true,\n detail: {\n date: this._timeRangeDate,\n startTime: this._timeRangeStart,\n endTime: this._timeRangeEnd,\n },\n })\n );\n break;\n }\n }\n };\n\n this.delegatedInputHandler = (e: Event) => {\n const target = e.target as HTMLInputElement;\n if (!target.matches('[data-year-input]')) return;\n\n const value = target.value;\n if (value === '' || /^\\d+$/.test(value)) {\n this.yearInput = value;\n const year = parseInt(value, 10);\n this.yearInputValid =\n value === '' || (year >= minYear && year <= maxYear);\n target.classList.toggle('invalid', !this.yearInputValid);\n }\n };\n\n this.delegatedBlurHandler = (e: FocusEvent) => {\n const target = e.target as HTMLInputElement;\n if (!target.matches('[data-year-input]')) return;\n\n const year = parseInt(this.yearInput, 10);\n const vm = this.engine!.getViewModel();\n if (isNaN(year) || year < minYear || year > maxYear) {\n this.yearInput = String(vm.currentYear);\n this.yearInputValid = true;\n target.value = this.yearInput;\n target.classList.remove('invalid');\n } else if (year !== vm.currentYear) {\n this.dispatchMonthChange(year, vm.currentMonth);\n this.actions!.jump(year, vm.currentMonth);\n }\n };\n\n this.delegatedKeydownHandler = (e: KeyboardEvent) => {\n const target = e.target as HTMLInputElement;\n if (!target.matches('[data-year-input]')) return;\n if (e.key === 'Enter') target.blur();\n };\n\n this.addEventListener('click', this.delegatedClickHandler);\n this.addEventListener('input', this.delegatedInputHandler);\n this.addEventListener('blur', this.delegatedBlurHandler, true);\n this.addEventListener('keydown', this.delegatedKeydownHandler);\n\n this.clickOutsideHandler = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n if (this.contains(target)) return;\n\n if (this.pickerOpen) {\n this.pickerOpen = false;\n this.render();\n return;\n }\n\n const popup = this.querySelector('.date-popup');\n if (popup) {\n this.engine!.clearSelection();\n }\n };\n\n document.addEventListener('click', this.clickOutsideHandler);\n }\n\n private updatePickerYear(year: number): void {\n const input = this.querySelector('[data-year-input]') as HTMLInputElement;\n if (input) input.value = String(year);\n\n const prevBtn = this.querySelector(\n '[data-action=\"year-prev\"]'\n ) as HTMLButtonElement;\n const nextBtn = this.querySelector(\n '[data-action=\"year-next\"]'\n ) as HTMLButtonElement;\n if (prevBtn) prevBtn.disabled = year <= this.minYear;\n if (nextBtn) nextBtn.disabled = year >= this.maxYear;\n }\n\n private dispatchMonthChange(year?: number, month?: number): void {\n if (!this.engine) return;\n const vm = this.engine.getViewModel();\n this.dispatchEvent(\n new CustomEvent('cal-month-change', {\n bubbles: true,\n composed: true,\n detail: {\n year: year ?? vm.currentYear,\n month: month ?? vm.currentMonth,\n },\n })\n );\n }\n\n // Public API\n updateEvents(events: CalendarEvent[]): void {\n this.events = events;\n }\n\n updateTheme(theme: CalendarTheme): void {\n this.theme = theme;\n }\n\n getCurrentDate(): Date | null {\n this.rethrowInitError();\n return this.engine?.getViewModel().selectedDate ?? null;\n }\n\n goToDate(date: Date): void {\n this.rethrowInitError();\n const year = date.getFullYear();\n const month = date.getMonth();\n this.dispatchMonthChange(year, month);\n this.actions?.jump(year, month);\n }\n\n getEngine(): CalendarEngine {\n this.rethrowInitError();\n if (!this.engine)\n throw new Error('CalendarElement is not connected to the DOM');\n return this.engine;\n }\n}\n\nexport function defineCalendarElement(tagName = 'kal-calendar'): void {\n if (typeof customElements !== 'undefined' && !customElements.get(tagName)) {\n customElements.define(tagName, CalendarElement);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kal-calendar': CalendarElement;\n }\n}\n","export { CalendarElement, defineCalendarElement } from './CalendarElement';\nexport type { CalendarElementProps, CalendarElementInstance } from './types';\nexport * from '../core';\n\n// Auto-register the custom element (guarded — safe to import multiple times)\nif (\n typeof customElements !== 'undefined' &&\n !customElements.get('kal-calendar')\n) {\n // Dynamic import keeps this out of the synchronous module evaluation path,\n // which prevents crashes in SSR environments where customElements is undefined\n // but window/document may not be fully available.\n import('./CalendarElement.js').then(({ CalendarElement }) => {\n if (!customElements.get('kal-calendar')) {\n customElements.define('kal-calendar', CalendarElement);\n }\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AC0CO,SAAS,cAAc,MAAkB;AAC9C,SAAO,IAAI,KAAK,KAAK,YAAY,GAAG,KAAK,SAAS,GAAG,KAAK,QAAQ,GAAG,GAAG,GAAG,CAAC;AAC9E;AAEO,SAAS,UAAU,OAAa,OAAsB;AAC3D,SAAO,cAAc,KAAK,EAAE,QAAQ,MAAM,cAAc,KAAK,EAAE,QAAQ;AACzE;AAEO,SAAS,QAAQ,MAAqB;AAC3C,SAAO,UAAU,MAAM,oBAAI,KAAK,CAAC;AACnC;AAEO,SAAS,cAAc,SAAkB,SAA4B;AAC1E,QAAM,eAAc,oBAAI,KAAK,GAAE,YAAY;AAC3C,QAAM,MAAM,WAAW,cAAc;AACrC,QAAM,MAAM,WAAW,cAAc;AAErC,SAAO,MAAM,KAAK,EAAE,QAAQ,MAAM,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,MAAM,CAAC;AAChE;AAOO,SAAS,gBACd,OACA,cACyB;AACzB,QAAM,QAAQ,MACX,MAAM,GAAG,EACT,IAAI,UAAQ,KAAK,KAAK,CAAC,EACvB,OAAO,OAAO;AAEjB,MAAI,MAAM,WAAW,GAAG;AACtB,UAAM,IAAI;AAAA,MACR;AAAA,IAEF;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,IAAI,CAAC,SAA2B;AACnD,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,QAAI,OAAO,WAAW,GAAG;AACvB,YAAM,IAAI;AAAA,QACR,yCAAyC,IAAI;AAAA,MAC/C;AAAA,IACF;AAEA,UAAM,CAAC,OAAO,GAAG,IAAI,OAAO,IAAI,UAAQ,mBAAmB,KAAK,KAAK,CAAC,CAAC;AACvE,QAAI,UAAU,QAAQ,QAAQ,MAAM;AAClC,YAAM,IAAI;AAAA,QACR,yCAAyC,IAAI;AAAA,MAE/C;AAAA,IACF;AACA,QAAI,SAAS,KAAK;AAChB,YAAM,IAAI;AAAA,QACR,yCAAyC,IAAI;AAAA,MAE/C;AAAA,IACF;AACA,QAAI,QAAQ,iBAAiB,KAAK,MAAM,iBAAiB,GAAG;AAC1D,YAAM,IAAI;AAAA,QACR,yCAAyC,IAAI,wBACxC,YAAY;AAAA,MACnB;AAAA,IACF;AAEA,WAAO,CAAC,OAAO,GAAG;AAAA,EACpB,CAAC;AAED,MAAI,eAAe,MAAM,EAAE,WAAW,OAAO,QAAQ;AACnD,UAAM,IAAI;AAAA,MACR,4DAA4D,KAAK;AAAA,IAEnE;AAAA,EACF;AAEA,SAAO;AACT;AAGO,SAAS,mBACd,MACA,KACA,KACS;AACT,QAAM,SAAS,cAAc,IAAI,EAAE,QAAQ;AAE3C,MAAI,OAAO,SAAS,cAAc,GAAG,EAAE,QAAQ,EAAG,QAAO;AACzD,MAAI,OAAO,SAAS,cAAc,GAAG,EAAE,QAAQ,EAAG,QAAO;AAEzD,SAAO;AACT;AAGO,SAAS,aAAa,MAAY,MAAgC;AACvE,SAAO,SAAS,QAAQ,KAAK,SAAS,KAAK,OAAO,CAAC;AACrD;AAEO,SAAS,gBAAgB,OAAsB,MAAqB;AACzE,QAAM,QAAQ,cAAc,IAAI,KAAK,MAAM,IAAI,CAAC,EAAE,QAAQ;AAC1D,QAAM,SAAS,cAAc,IAAI,EAAE,QAAQ;AAC3C,MAAI,OAAO,MAAM,KAAK,EAAG,QAAO;AAEhC,MAAI,MAAM,YAAY,UAAa,MAAM,YAAY,MAAM;AACzD,WAAO,UAAU;AAAA,EACnB;AAEA,QAAM,MAAM,cAAc,IAAI,KAAK,MAAM,OAAO,CAAC,EAAE,QAAQ;AAC3D,MAAI,OAAO,MAAM,GAAG,GAAG;AACrB,UAAM,IAAI;AAAA,MACR,wBAAwB,MAAM,EAAE,+BAC3B,OAAO,MAAM,OAAO,CAAC;AAAA,IAC5B;AAAA,EACF;AACA,MAAI,MAAM,OAAO;AACf,UAAM,IAAI;AAAA,MACR,wBAAwB,MAAM,EAAE,oCAC3B,OAAO,MAAM,OAAO,CAAC,MAAM,OAAO,MAAM,IAAI,CAAC;AAAA,IACpD;AAAA,EACF;AAEA,SAAO,UAAU,SAAS,UAAU;AACtC;AAEO,SAAS,iBACd,QACA,MACiB;AACjB,SAAO,OAAO,OAAO,WAAS,gBAAgB,OAAO,IAAI,CAAC;AAC5D;AAEO,SAAS,UAAU,QAAyB,MAAqB;AACtE,SAAO,iBAAiB,QAAQ,IAAI,EAAE,SAAS;AACjD;AAEO,SAAS,sBACd,MACA,OACA,SAA0B,CAAC,GAC3B,eAAsB,GACJ;AAClB,QAAM,WAAW,IAAI,KAAK,MAAM,OAAO,CAAC;AACxC,QAAM,UAAU,IAAI,KAAK,MAAM,QAAQ,GAAG,CAAC;AAC3C,QAAM,cAAc,QAAQ,QAAQ;AACpC,QAAM,mBAAmB,IAAI,KAAK,MAAM,OAAO,CAAC,EAAE,QAAQ;AAE1D,MAAI,iBAAiB,SAAS,OAAO;AACrC,MAAI,iBAAiB,GAAG;AACtB,qBAAiB,mBAAmB,IAAI,IAAI,iBAAiB;AAAA,EAC/D;AAEA,QAAM,QAA0B,CAAC;AACjC,MAAI,MAAM;AACV,MAAI,eAAe;AAEnB,WAAS,OAAO,GAAG,OAAO,GAAG,QAAQ;AACnC,UAAM,YAA4B,CAAC;AAEnC,aAAS,YAAY,GAAG,YAAY,GAAG,aAAa;AAClD,UAAI,SAAS,KAAK,YAAY,gBAAgB;AAE5C,cAAM,UAAU,mBAAmB,iBAAiB,YAAY;AAChE,cAAM,WAAW,IAAI,KAAK,MAAM,QAAQ,GAAG,OAAO;AAClD,cAAM,aAAa,iBAAiB,QAAQ,QAAQ;AACpD,kBAAU,KAAK;AAAA,UACb,MAAM;AAAA,UACN,gBAAgB;AAAA,UAChB,SAAS,QAAQ,QAAQ;AAAA,UACzB,WAAW,WAAW,SAAS;AAAA,UAC/B,QAAQ;AAAA,QACV,CAAC;AAAA,MACH,WAAW,MAAM,aAAa;AAE5B,cAAM,WAAW,IAAI,KAAK,MAAM,QAAQ,GAAG,YAAY;AACvD,cAAM,aAAa,iBAAiB,QAAQ,QAAQ;AACpD,kBAAU,KAAK;AAAA,UACb,MAAM;AAAA,UACN,gBAAgB;AAAA,UAChB,SAAS,QAAQ,QAAQ;AAAA,UACzB,WAAW,WAAW,SAAS;AAAA,UAC/B,QAAQ;AAAA,QACV,CAAC;AACD;AAAA,MACF,OAAO;AAEL,cAAM,cAAc,IAAI,KAAK,MAAM,OAAO,GAAG;AAC7C,cAAM,aAAa,iBAAiB,QAAQ,WAAW;AACvD,kBAAU,KAAK;AAAA,UACb,MAAM;AAAA,UACN,gBAAgB;AAAA,UAChB,SAAS,QAAQ,WAAW;AAAA,UAC5B,WAAW,WAAW,SAAS;AAAA,UAC/B,QAAQ;AAAA,QACV,CAAC;AACD;AAAA,MACF;AAAA,IACF;AAEA,UAAM,KAAK,SAAS;AAAA,EACtB;AAEA,SAAO;AACT;AAEO,SAAS,eAAe,cAAsC;AACnE,QAAM,UAAoB,CAAC;AAE3B,MAAI,CAAC,aAAa,gBAAgB;AAChC,YAAQ,KAAK,2BAA2B;AAAA,EAC1C;AAEA,MAAI,aAAa,SAAS;AACxB,YAAQ,KAAK,qBAAqB;AAAA,EACpC;AAEA,MAAI,aAAa,WAAW;AAC1B,YAAQ,KAAK,yBAAyB;AAAA,EACxC;AAEA,SAAO;AACT;AAEO,SAAS,qBAAqB,MAAoB;AACvD,SAAO,GAAG,KAAK,KAAK,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;AACjD;AAEO,SAAS,iBAAiB,MAAc,OAAuB;AACpE,SAAO,GAAG,YAAY,KAAK,CAAC,IAAI,IAAI;AACtC;AAEO,SAAS,gBAAgB,OAA8B;AAC5D,MAAI,MAAM,UAAW,CAAC,MAAM,aAAa,CAAC,MAAM,SAAU;AACxD,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,aAAa,MAAM,SAAS;AACpC,WAAO,GAAG,MAAM,SAAS,MAAM,MAAM,OAAO;AAAA,EAC9C;AAEA,MAAI,MAAM,WAAW;AACnB,WAAO,GAAG,MAAM,SAAS;AAAA,EAC3B;AAEA,SAAO;AACT;AAEO,SAAS,gBAAgB,WAA8B;AAC5D,MAAI,CAAC,aAAa,UAAU,WAAW,EAAG,QAAO;AAEjD,MAAI,UAAU,WAAW,EAAG,QAAO,UAAU,CAAC;AAC9C,MAAI,UAAU,WAAW,EAAG,QAAO,UAAU,KAAK,OAAO;AAEzD,SAAO,GAAG,UAAU,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI,CAAC,SAAS,UAAU,UAAU,SAAS,CAAC,CAAC;AACrF;AAEO,SAAS,iBAAiB,QAA0C;AACzE,SAAO,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM;AAChC,UAAM,UAAU,EAAE,UAAW,CAAC,EAAE,aAAa,CAAC,EAAE;AAChD,UAAM,UAAU,EAAE,UAAW,CAAC,EAAE,aAAa,CAAC,EAAE;AAEhD,QAAI,WAAW,CAAC,QAAS,QAAO;AAChC,QAAI,CAAC,WAAW,QAAS,QAAO;AAEhC,QAAI,CAAC,EAAE,aAAa,CAAC,EAAE,UAAW,QAAO;AACzC,WAAO,EAAE,UAAU,cAAc,EAAE,SAAS;AAAA,EAC9C,CAAC;AACH;AAYO,SAAS,qBACd,UACA,cACQ;AACR,QAAM,WAAW,gBAAgB;AAEjC,MAAI,YAAY,SAAS,QAAQ,GAAG;AAClC,WAAO,SAAS,QAAQ;AAAA,EAC1B;AAGA,SAAO;AACT;AAGO,SAAS,oBACd,cACkB;AAClB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACF;AAGO,SAAS,gBAAgB,OAAwB;AACtD,SAAO,yBAAyB,KAAK,KAAK;AAC5C;AAGO,SAAS,iBACd,UACA,cACQ;AACR,QAAM,WAAW,oBAAoB,YAAY;AACjD,QAAM,QAAQ,SAAS,QAAQ,KAAK,SAAS,SAAS;AAEtD,SAAO,gBAAgB,KAAK,IAAI,QAAQ;AAC1C;AAWO,SAAS,WAAW,OAAwB;AACjD,MAAI,UAAU,QAAQ,UAAU,OAAW,QAAO;AAElD,SAAO,OAAO,KAAK,EAAE,QAAQ,YAAY,UAAQ,aAAa,IAAI,CAAC;AACrE;AAGO,SAAS,aAAa,OAAuB;AAClD,SAAO,OAAO,KAAK,EAChB,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE;AAC3B;AAIO,SAAS,QAAQ,OAAuB;AAI7C,QAAM,aAAa,OAAO,KAAK,EAC5B,MAAM,EAAE,EACR,OAAO,UAAQ,KAAK,WAAW,CAAC,IAAI,EAAI,EACxC,KAAK,EAAE;AAEV,MAAI,wBAAwB,KAAK,UAAU,EAAG,QAAO;AAIrD,QAAM,aAAa,CAAC,YAAY,KAAK,UAAU;AAE/C,SAAO,aAAa,aAAa;AACnC;AAIO,SAAS,UAAU,OAAuB;AAC/C,QAAM,UAAU,OAAO,KAAK,EAAE,KAAK;AAEnC,SAAO,gBAAgB,OAAO,KAAK,YAAY,KAAK,OAAO,IACvD,UACA;AACN;AAKO,SAAS,mBAAmB,MAA8B;AAC/D,MAAI,OAAO,SAAS,SAAU,QAAO;AAErC,QAAM,QAAQ,sBAAsB,KAAK,KAAK,KAAK,CAAC;AACpD,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,QAAQ,OAAO,MAAM,CAAC,CAAC;AAC7B,QAAM,OAAO,OAAO,MAAM,CAAC,CAAC;AAC5B,MAAI,QAAQ,MAAM,OAAO,MAAO,UAAU,MAAM,OAAO,EAAI,QAAO;AAElE,SAAO,QAAQ,KAAK;AACtB;AAEO,SAAS,cAAc,OAAuB;AACnD,QAAM,QAAQ,KAAK,MAAM,QAAQ,EAAE;AACnC,QAAM,OAAO,QAAQ;AACrB,SAAO,GAAG,OAAO,KAAK,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,OAAO,IAAI,EAAE,SAAS,GAAG,GAAG,CAAC;AAC3E;AAMO,SAAS,cACd,OACA,cACA,OACyB;AACzB,QAAM,MAAM,cAAc,KAAK,EAAE,QAAQ;AACzC,MAAI,OAAO,MAAM,GAAG,EAAG,QAAO;AAE9B,QAAM,OAAO,MAAM;AACnB,QAAM,WAA6B,CAAC,MAAM,OAAO,eAAe;AAEhE,MAAI,MAAM,UAAU,CAAC,MAAM,UAAW,QAAO;AAE7C,QAAM,OAAO,mBAAmB,MAAM,SAAS;AAC/C,MAAI,SAAS,KAAM,QAAO;AAE1B,MAAI,MAAM,YAAY,UAAa,MAAM,YAAY,MAAM;AACzD,WAAO,CAAC,OAAO,MAAM,OAAO,OAAO,YAAY;AAAA,EACjD;AAEA,QAAM,KAAK,mBAAmB,MAAM,OAAO;AAC3C,MAAI,OAAO,KAAM,QAAO;AAExB,SAAO,CAAC,OAAO,MAAM,QAAQ,MAAM,OAAO,KAAK,kBAAkB,GAAG;AACtE;AAEO,SAAS,eACd,WACyB;AACzB,QAAM,SAAS,CAAC,GAAG,SAAS,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AAExD,SAAO,OAAO,OAAgC,CAAC,QAAQ,CAAC,OAAO,GAAG,MAAM;AACtE,UAAM,OAAO,OAAO,OAAO,SAAS,CAAC;AACrC,QAAI,QAAQ,SAAS,KAAK,CAAC,EAAG,MAAK,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC,GAAG,GAAG;AAAA,QACxD,QAAO,KAAK,CAAC,OAAO,GAAG,CAAC;AAC7B,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AACP;AAIO,SAAS,YACd,QACA,MACA,eAAuB,uBACZ;AACX,QAAM,OAAO,cAAc,IAAI,EAAE,QAAQ,IAAI;AAE7C,QAAM,cAAc,IAAI,KAAK,IAAI;AACjC,cAAY,QAAQ,YAAY,QAAQ,IAAI,CAAC;AAI7C,QAAM,YAAqC,CAAC;AAC5C,aAAW,SAAS,IAAI,IAAI,MAAM,GAAG;AACnC,eAAW,OAAO,CAAC,aAAa,IAAI,GAAG;AACrC,UAAI,CAAC,gBAAgB,OAAO,GAAG,EAAG;AAClC,YAAM,WAAW,cAAc,OAAO,cAAc,GAAG;AACvD,UAAI,SAAU,WAAU,KAAK,QAAQ;AAAA,IACvC;AAAA,EACF;AAEA,QAAM,SAAS,eAAe,SAAS;AAEvC,SAAO,MAAM;AAAA,IACX,EAAE,QAAQ,KAAK,MAAM,kBAAkB,YAAY,EAAE;AAAA,IACrD,CAAC,GAAG,UAAU;AACZ,YAAM,QAAQ,OAAO,QAAQ;AAC7B,YAAM,MAAM,QAAQ;AACpB,aAAO,OAAO,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,QAAQ,MAAM,MAAM,IAAI;AAAA,IAC7D;AAAA,EACF;AACF;AAlgBA,IAEa,QAeA,aAeA,MAyRA,yBAkDP,cAqDO,iBACA;AAjab;AAAA;AAAA;AAEO,IAAM,SAAS;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEO,IAAM,cAAc;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEO,IAAM,OAAO;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAiRO,IAAM,0BAA4C;AAAA,MACvD,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,MACT,UAAU;AAAA,MACV,aAAa;AAAA,MACb,OAAO;AAAA,IACT;AA2CA,IAAM,eAAuC;AAAA,MAC3C,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AA+CO,IAAM,kBAAkB;AACxB,IAAM,wBAAwB;AAAA;AAAA;;;ACjarC,IAqBa;AArBb;AAAA;AAAA;AASA;AAYO,IAAM,iBAAN,MAAqB;AAAA,MAM1B,YAAY,QAAwB;AAHpC,aAAQ,YAA6B,oBAAI,IAAI;AAI3C,aAAK,SAAS;AACd,aAAK,iBAAiB,oBAAoB,OAAO,cAAc;AAE/D,cAAM,cAAc,OAAO,eAAe,oBAAI,KAAK;AACnD,aAAK,QAAQ;AAAA,UACX,aAAa,YAAY,YAAY;AAAA,UACrC,cAAc,YAAY,SAAS;AAAA,UACnC,aAAa,YAAY,QAAQ;AAAA,UACjC,cAAc;AAAA,UACd,kBAAkB;AAAA,UAClB,OAAO,CAAC;AAAA,QACV;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,UAAU,UAAkC;AAC1C,aAAK,UAAU,IAAI,QAAQ;AAC3B,eAAO,MAAM,KAAK,UAAU,OAAO,QAAQ;AAAA,MAC7C;AAAA;AAAA;AAAA;AAAA,MAKQ,SAAe;AACrB,aAAK,UAAU,QAAQ,cAAY,SAAS,CAAC;AAAA,MAC/C;AAAA;AAAA;AAAA;AAAA,MAKA,WAA0B;AACxB,eAAO,EAAE,GAAG,KAAK,MAAM;AAAA,MACzB;AAAA;AAAA;AAAA;AAAA,MAKA,eAAkC;AAChC,cAAM,QAAwB,MAAM;AAAA,UAClC,EAAE,QAAQ,KAAK,IAAI,GAAG,KAAK,OAAO,cAAc,CAAC,EAAE;AAAA,UACnD,CAAC,GAAG,WAAW;AACb,kBAAM,SAAS,IAAI;AAAA,cACjB,KAAK,MAAM;AAAA,cACX,KAAK,MAAM,eAAe;AAAA,cAC1B;AAAA,YACF;AACA,kBAAM,OAAO,OAAO,YAAY;AAChC,kBAAM,QAAQ,OAAO,SAAS;AAE9B,mBAAO;AAAA,cACL;AAAA,cACA;AAAA,cACA,kBAAkB,iBAAiB,MAAM,KAAK;AAAA,cAC9C,eAAe;AAAA,gBACb;AAAA,gBACA;AAAA,gBACA,KAAK,OAAO;AAAA,gBACZ,KAAK,OAAO;AAAA,cACd;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,eAAO;AAAA,UACL,GAAG,KAAK;AAAA,UACR,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,OAAO,cAAc,KAAK,OAAO,SAAS,KAAK,OAAO,OAAO;AAAA,UAC7D,kBAAkB,MAAM,CAAC,EAAE;AAAA,UAC3B,aAAa,KAAK,MAAM,eACpB,qBAAqB,KAAK,MAAM,YAAY,IAC5C;AAAA,UACJ;AAAA,UACA,eAAe,MAAM,CAAC,EAAE;AAAA,QAC1B;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,aAA8B;AAC5B,eAAO;AAAA,UACL,MAAM,KAAK,KAAK,KAAK,IAAI;AAAA,UACzB,UAAU,KAAK,SAAS,KAAK,IAAI;AAAA,UACjC,MAAM,KAAK,KAAK,KAAK,IAAI;AAAA,UACzB,WAAW,KAAK,UAAU,KAAK,IAAI;AAAA,UACnC,gBAAgB,KAAK,eAAe,KAAK,IAAI;AAAA,UAC7C,YAAY,KAAK,WAAW,KAAK,IAAI;AAAA,UACrC,aAAa,KAAK,YAAY,KAAK,IAAI;AAAA,QACzC;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,OAAa;AACnB,YAAI,KAAK,MAAM,iBAAiB,IAAI;AAClC,eAAK,MAAM,eAAe;AAC1B,eAAK,MAAM;AAAA,QACb,OAAO;AACL,eAAK,MAAM;AAAA,QACb;AAEA,aAAK,MAAM,eAAe;AAC1B,aAAK,MAAM,mBAAmB;AAC9B,aAAK,YAAY;AACjB,aAAK,OAAO;AAAA,MACd;AAAA;AAAA;AAAA;AAAA,MAKQ,WAAiB;AACvB,YAAI,KAAK,MAAM,iBAAiB,GAAG;AACjC,eAAK,MAAM,eAAe;AAC1B,eAAK,MAAM;AAAA,QACb,OAAO;AACL,eAAK,MAAM;AAAA,QACb;AAEA,aAAK,MAAM,eAAe;AAC1B,aAAK,MAAM,mBAAmB;AAC9B,aAAK,YAAY;AACjB,aAAK,OAAO;AAAA,MACd;AAAA;AAAA;AAAA;AAAA,MAKQ,KAAK,MAAc,OAAqB;AAC9C,aAAK,MAAM,cAAc;AACzB,aAAK,MAAM,eAAe;AAC1B,aAAK,MAAM,eAAe;AAC1B,aAAK,MAAM,mBAAmB;AAC9B,aAAK,YAAY;AACjB,aAAK,OAAO;AAAA,MACd;AAAA;AAAA;AAAA;AAAA,MAKQ,YAAkB;AACxB,cAAM,QAAQ,oBAAI,KAAK;AACvB,aAAK,MAAM,cAAc,MAAM,YAAY;AAC3C,aAAK,MAAM,eAAe,MAAM,SAAS;AACzC,aAAK,MAAM,eAAe;AAC1B,aAAK,MAAM,mBAAmB;AAC9B,aAAK,YAAY;AACjB,aAAK,OAAO;AAAA,MACd;AAAA;AAAA;AAAA;AAAA,MAKQ,iBAA0B;AAChC,cAAM,QAAQ,oBAAI,KAAK;AACvB,eACE,KAAK,MAAM,gBAAgB,MAAM,YAAY,KAC7C,KAAK,MAAM,iBAAiB,MAAM,SAAS;AAAA,MAE/C;AAAA;AAAA;AAAA;AAAA,MAKQ,WAAW,MAAY,UAAmB,WAAW,MAAY;AACvE,aAAK,MAAM,eAAe;AAC1B,aAAK,MAAM,mBAAmB,YAAY;AAC1C,aAAK,MAAM,cAAc,KAAK,QAAQ;AACtC,YAAI,UAAU;AACZ,eAAK,MAAM,eAAe,KAAK,SAAS;AACxC,eAAK,MAAM,cAAc,KAAK,YAAY;AAAA,QAC5C;AACA,aAAK,YAAY;AACjB,aAAK,OAAO;AAAA,MACd;AAAA;AAAA;AAAA;AAAA,MAKQ,cAAoB;AAC1B,YAAI,CAAC,KAAK,MAAM,cAAc;AAC5B,eAAK,MAAM,QAAQ,CAAC;AACpB;AAAA,QACF;AAEA,aAAK,MAAM,QAAQ;AAAA,UACjB,KAAK,OAAO;AAAA,UACZ,KAAK,MAAM;AAAA,QACb;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,aAAa,QAA+B;AAC1C,aAAK,OAAO,SAAS;AACrB,aAAK,YAAY;AACjB,aAAK,OAAO;AAAA,MACd;AAAA;AAAA;AAAA;AAAA,MAKA,gBACE,MACA,UACA,SACM;AACN,aAAK,WAAW,MAAM,UAAU,SAAS,aAAa,KAAK;AAAA,MAC7D;AAAA;AAAA;AAAA;AAAA,MAKA,iBAAiB,MAAqB;AACpC,eAAO,iBAAiB,KAAK,OAAO,QAAQ,IAAI,EAAE,SAAS;AAAA,MAC7D;AAAA;AAAA;AAAA;AAAA,MAKA,iBAAiB,MAA6B;AAC5C,eAAO,iBAAiB,KAAK,OAAO,QAAQ,IAAI;AAAA,MAClD;AAAA;AAAA;AAAA;AAAA,MAKA,iBAAuB;AACrB,aAAK,MAAM,eAAe;AAC1B,aAAK,MAAM,mBAAmB;AAC9B,aAAK,MAAM,QAAQ,CAAC;AACpB,aAAK,OAAO;AAAA,MACd;AAAA;AAAA;AAAA;AAAA,MAKA,iBAAiB,UAA2B;AAC1C,YAAI,CAAC,SAAU,QAAO;AACtB,eAAO,iBAAiB,UAAU,KAAK,cAAc;AAAA,MACvD;AAAA;AAAA;AAAA;AAAA,MAKA,qBAAqB,QAAgC;AACnD,aAAK,iBAAiB,oBAAoB,MAAM;AAChD,aAAK,OAAO;AAAA,MACd;AAAA;AAAA;AAAA;AAAA,MAKA,oBAAsC;AACpC,eAAO,EAAE,GAAG,KAAK,eAAe;AAAA,MAClC;AAAA;AAAA;AAAA;AAAA,MAKA,iBAAiB,MAAc,OAAqB;AAClD,aAAK,eAAe,IAAI,IAAI;AAC5B,aAAK,OAAO;AAAA,MACd;AAAA;AAAA;AAAA;AAAA,MAKA,UAAgB;AACd,aAAK,UAAU,MAAM;AAAA,MACvB;AAAA,IACF;AAAA;AAAA;;;AC/SA;AAAA;AAAA;AAAA;AACA;AACA;AAGA;AAAA;AAAA;;;ACLA;AAAA;AAAA;AAAA;AAAA;AAi6CO,SAAS,sBAAsB,UAAU,gBAAsB;AACpE,MAAI,OAAO,mBAAmB,eAAe,CAAC,eAAe,IAAI,OAAO,GAAG;AACzE,mBAAe,OAAO,SAAS,eAAe;AAAA,EAChD;AACF;AAr6CA,IA0BMA,YAKO;AA/Bb;AAAA;AAAA;AAAA;AA0BA,IAAMA,aAAY,CAAC,GAAS,MAC1B,EAAE,YAAY,MAAM,EAAE,YAAY,KAClC,EAAE,SAAS,MAAM,EAAE,SAAS,KAC5B,EAAE,QAAQ,MAAM,EAAE,QAAQ;AAErB,IAAM,mBAAN,MAAM,yBAAwB,YAAY;AAAA,MAA1C;AAAA;AA8EL,aAAQ,SAAgC;AACxC,aAAQ,cAAmC;AAC3C,aAAQ,UAA2D;AACnE,aAAQ,aAAa;AACrB,aAAQ,YAAY;AACpB,aAAQ,iBAAiB;AACzB,aAAQ,oBAAoB;AAE5B,aAAQ,sBAAwD;AAChE,aAAQ,wBAA0D;AAClE,aAAQ,wBAAqD;AAC7D,aAAQ,uBAAyD;AACjE,aAAQ,0BAA+D;AAGvE;AAAA,aAAQ,UAA2B,CAAC;AACpC,aAAQ,SAA+B;AACvC,aAAQ,kBAA2C;AACnD,aAAQ,eAAsD;AAC9D,aAAQ,kBAAyC;AACjD,aAAQ,sBAAqD;AAC7D,aAAQ,sBAAuC;AAC/C,aAAQ,aAA2B;AACnC,aAAQ,gBAAsC;AAG9C;AAAA,aAAQ,cAA2B;AACnC,aAAQ,YAAyB;AACjC,aAAQ,iBAA8B;AACtC,aAAQ,kBAAiC;AACzC,aAAQ,gBAA+B;AACvC,aAAQ,qBAAqB;AAAA;AAAA,MAE7B,IAAI,SAA0B;AAC5B,eAAO,KAAK;AAAA,MACd;AAAA,MAEA,IAAI,OAAO,KAAsB;AAC/B,aAAK,aAAa;AAClB,aAAK,UAAU;AACf,YAAI,KAAK,QAAQ;AACf,eAAK,OAAO,aAAa,GAAG;AAAA,QAC9B;AAAA,MACF;AAAA,MAEA,IAAI,MAAM,KAAoB;AAC5B,aAAK,SAAS;AACd,aAAK,WAAW;AAAA,MAClB;AAAA,MAEA,IAAI,eAAe,KAAuB;AACxC,aAAK,kBAAkB;AACvB,YAAI,KAAK,QAAQ;AACf,eAAK,OAAO,qBAAqB,GAAG;AAAA,QACtC;AAAA,MACF;AAAA,MAEA,IAAI,qBAA6C;AAC/C,eAAO,KAAK,uBAAuB,CAAC;AAAA,MACtC;AAAA,MAEA,IAAI,mBAAmB,KAA6B;AAClD,aAAK,aAAa;AAClB,aAAK,sBAAsB;AAC3B,YAAI,KAAK,OAAQ,MAAK,eAAe;AAAA,MACvC;AAAA,MAEA,IAAI,qBAA+B;AACjC,eAAO,KAAK,uBAAuB,CAAC;AAAA,MACtC;AAAA,MAEA,IAAI,mBAAmB,KAAe;AACpC,aAAK,sBAAsB;AAC3B,YAAI,KAAK,OAAQ,MAAK,eAAe;AAAA,MACvC;AAAA,MAEA,IAAI,YAAY,KAAmC;AACjD,aAAK,eAAe;AACpB,YAAI,KAAK,OAAQ,MAAK,eAAe;AAAA,MAEvC;AAAA,MAEA,IAAI,eAAe,KAAmB;AACpC,aAAK,kBAAkB;AACvB,YAAI,KAAK,OAAQ,MAAK,eAAe;AAAA,MAEvC;AAAA,MAEA,IAAI,UAAmB;AACrB,eAAO,KAAK,aAAa,SAAS;AAAA,MACpC;AAAA,MAEA,IAAI,QAAQ,KAAc;AACxB,YAAI,IAAK,MAAK,aAAa,WAAW,EAAE;AAAA,YACnC,MAAK,gBAAgB,SAAS;AAAA,MACrC;AAAA;AAAA;AAAA,MAIQ,SAAS,KAAuB;AACtC,YAAI;AACF,cAAI;AAAA,QACN,SAAS,OAAO;AACd,eAAK,aAAa;AAClB,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,MAEA,oBAA0B;AACxB,aAAK,UAAU,IAAI,mBAAmB;AACtC,aAAK,SAAS,MAAM;AAClB,eAAK,WAAW;AAChB,eAAK,OAAO;AAAA,QACd,CAAC;AAAA,MACH;AAAA,MAEA,uBAA6B;AAC3B,aAAK,QAAQ;AACb,aAAK,UAAU,OAAO,mBAAmB;AACzC,aAAK,YAAY;AAAA,MACnB;AAAA,MAEA,yBACE,MACA,QACA,QACM;AACN,YAAI,WAAW,OAAQ;AACvB,YAAI,SAAS,WAAW;AACtB,eAAK,eAAe;AACpB;AAAA,QACF;AACA,YAAI,SAAS,gBAAgB,WAAW,MAAM;AAC5C,eAAK,cAAc;AACnB,eAAK,YAAY;AACjB,eAAK,iBAAiB;AACtB,eAAK,kBAAkB;AACvB,eAAK,gBAAgB;AACrB,eAAK,qBAAqB;AAAA,QAC5B;AACA,aAAK,OAAO;AAAA,MACd;AAAA,MAEA,IAAY,cAA6B;AACvC,cAAM,UAAU,KAAK,aAAa,SAAS;AAC3C,YAAI,YAAY,KAAM,QAAO;AAE7B,cAAM,QAAQ,KAAK,aAAa,OAAO;AACvC,YAAI,UAAU,QAAQ,CAAC,iBAAgB,wBAAwB;AAC7D,2BAAgB,yBAAyB;AACzC,kBAAQ;AAAA,YACN;AAAA,UAIF;AAAA,QACF;AACA,eAAO;AAAA,MACT;AAAA,MAIA,IAAY,eAAuB;AACjC,cAAM,MAAM,KAAK,aAAa,eAAe;AAC7C,YAAI,QAAQ,KAAM,QAAO;AAEzB,cAAM,UAAU,OAAO,GAAG;AAC1B,YACE,OAAO,UAAU,OAAO,KACxB,UAAU,KACV,kBAAkB,YAAY,GAC9B;AACA,iBAAO;AAAA,QACT;AAEA,gBAAQ;AAAA,UACN,iCAAiC,GAAG,6DACV,eAAe,2BACpC,qBAAqB;AAAA,QAC5B;AACA,eAAO;AAAA,MACT;AAAA,MAEQ,mBAAmB,QAA+B;AACxD,mBAAW,SAAS,QAAQ;AAC1B,cAAI,CAAC,MAAM,aAAa,MAAM,QAAS;AAEvC,gBAAM,MAAM,OAAO,MAAM,EAAE;AAC3B,cAAI,iBAAgB,iBAAiB,IAAI,GAAG,EAAG;AAC/C,2BAAgB,iBAAiB,IAAI,GAAG;AAExC,kBAAQ;AAAA,YACN,wBAAwB,GAAG,sDAClB,KAAK,YAAY;AAAA,UAE5B;AAAA,QACF;AAAA,MACF;AAAA,MAEA,IAAY,aAAqB;AAC/B,cAAM,YAAY,OAAO,KAAK,aAAa,QAAQ,KAAK,CAAC;AACzD,YAAI,CAAC,OAAO,UAAU,SAAS,KAAK,YAAY,EAAG,QAAO;AAE1D,eAAO,KAAK,IAAI,WAAW,CAAC;AAAA,MAC9B;AAAA,MAEA,IAAY,UAAkB;AAC5B,cAAM,MAAM,KAAK,aAAa,UAAU;AACxC,eAAO,MAAM,SAAS,KAAK,EAAE,KAAI,oBAAI,KAAK,GAAE,YAAY,IAAI;AAAA,MAC9D;AAAA,MAEA,IAAY,UAAkB;AAC5B,cAAM,MAAM,KAAK,aAAa,UAAU;AACxC,eAAO,MAAM,SAAS,KAAK,EAAE,KAAI,oBAAI,KAAK,GAAE,YAAY,IAAI;AAAA,MAC9D;AAAA,MAEQ,aAAa,MAA4C;AAC/D,cAAM,MAAM,KAAK,aAAa,IAAI;AAClC,YAAI,CAAC,IAAK,QAAO;AAEjB,cAAM,SAAS,IAAI,KAAK,GAAG;AAC3B,YAAI,OAAO,MAAM,OAAO,QAAQ,CAAC,GAAG;AAClC,gBAAM,IAAI;AAAA,YACR,kBAAkB,IAAI,oBAAoB,GAAG;AAAA,UAE/C;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA,MAEA,IAAY,gBAAiC;AAC3C,cAAM,MAAM,KAAK,aAAa,gBAAgB;AAC9C,YAAI,QAAQ,KAAM,QAAO;AAEzB,cAAM,QAAQ,IACX,MAAM,GAAG,EACT,IAAI,UAAQ,KAAK,KAAK,CAAC,EACvB,OAAO,OAAO;AAEjB,YAAI,MAAM,WAAW,GAAG;AACtB,gBAAM,IAAI;AAAA,YACR;AAAA,UAEF;AAAA,QACF;AAEA,eAAO,MAAM,IAAI,UAAQ;AACvB,gBAAM,MAAM,OAAO,IAAI;AACvB,cAAI,CAAC,OAAO,UAAU,GAAG,KAAK,MAAM,KAAK,MAAM,GAAG;AAChD,kBAAM,IAAI;AAAA,cACR,0EACU,IAAI;AAAA,YAChB;AAAA,UACF;AACA,iBAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,MAEA,IAAY,iBAAiD;AAC3D,cAAM,MAAM,KAAK,aAAa,iBAAiB;AAC/C,YAAI,QAAQ,KAAM,QAAO;AAEzB,eAAO,gBAAgB,KAAK,KAAK,YAAY;AAAA,MAC/C;AAAA,MAEQ,aAAmB;AACzB,cAAM,kBAAkB,KAAK,aAAa,cAAc;AACxD,cAAM,cAAc,kBAAkB,IAAI,KAAK,eAAe,IAAI;AAClE,cAAM,mBAAmB,KAAK,aAAa,gBAAgB;AAC3D,cAAM,eAAsB,qBAAqB,MAAM,IAAI;AAE3D,aAAK,SAAS,IAAI,eAAe;AAAA,UAC/B,QAAQ,KAAK;AAAA,UACb;AAAA,UACA,SAAS,KAAK;AAAA,UACd,SAAS,KAAK;AAAA,UACd;AAAA,UACA,gBAAgB,KAAK,mBAAmB;AAAA,UACxC,YAAY,KAAK;AAAA,QACnB,CAAC;AAED,aAAK,UAAU,KAAK,OAAO,WAAW;AACtC,aAAK,WAAW;AAEhB,aAAK,cAAc,KAAK,OAAO,UAAU,MAAM;AAC7C,eAAK,eAAe;AAAA,QACtB,CAAC;AAAA,MACH;AAAA,MAEQ,SAAe;AACrB,YAAI,CAAC,KAAK,OAAQ;AAClB,aAAK,QAAQ;AACb,aAAK,WAAW;AAChB,aAAK,eAAe;AAAA,MACtB;AAAA,MAEQ,UAAgB;AACtB,YAAI,KAAK,aAAa;AACpB,eAAK,YAAY;AACjB,eAAK,cAAc;AAAA,QACrB;AAEA,YAAI,KAAK,uBAAuB;AAC9B,eAAK,oBAAoB,SAAS,KAAK,qBAAqB;AAC5D,eAAK,wBAAwB;AAAA,QAC/B;AACA,YAAI,KAAK,uBAAuB;AAC9B,eAAK,oBAAoB,SAAS,KAAK,qBAAqB;AAC5D,eAAK,wBAAwB;AAAA,QAC/B;AACA,YAAI,KAAK,sBAAsB;AAC7B,eAAK,oBAAoB,QAAQ,KAAK,sBAAsB,IAAI;AAChE,eAAK,uBAAuB;AAAA,QAC9B;AACA,YAAI,KAAK,yBAAyB;AAChC,eAAK,oBAAoB,WAAW,KAAK,uBAAuB;AAChE,eAAK,0BAA0B;AAAA,QACjC;AACA,YAAI,KAAK,qBAAqB;AAC5B,mBAAS,oBAAoB,SAAS,KAAK,mBAAmB;AAC9D,eAAK,sBAAsB;AAAA,QAC7B;AAEA,aAAK,oBAAoB;AAEzB,YAAI,KAAK,QAAQ;AACf,eAAK,OAAO,QAAQ;AACpB,eAAK,SAAS;AAAA,QAChB;AAEA,aAAK,UAAU;AAAA,MACjB;AAAA,MAEQ,aAAmB;AACzB,YAAI,CAAC,KAAK,OAAQ;AAClB,cAAM,OAAO,SAAS;AACtB,mBAAW,OAAO,OAAO,KAAK,iBAAgB,QAAQ,GAEnD;AACD,gBAAM,QAAQ,KAAK,OAAO,GAAG;AAC7B,cAAI,MAAO,MAAK,MAAM,YAAY,iBAAgB,SAAS,GAAG,GAAG,KAAK;AAAA,QACxE;AAAA,MACF;AAAA,MAMA,IAAY,eAAyB;AACnC,eAAO;AAAA,UACL,GAAG,iBAAgB;AAAA,UACnB,GAAG,OAAO,KAAK,KAAK,uBAAuB,CAAC,CAAC;AAAA,QAC/C;AAAA,MACF;AAAA,MAEA,IAAI,iBAAgC;AAClC,eAAO,KAAK,iBAAiB,QAAQ,QAAQ;AAAA,MAC/C;AAAA,MAEQ,iBAAuB;AAC7B,YAAI,KAAK,cAAe;AAExB,aAAK,gBAAgB,QAAQ,QAAQ,EAAE,KAAK,MAAM;AAChD,eAAK,gBAAgB;AACrB,cAAI;AACF,iBAAK,OAAO;AAAA,UACd,SAAS,OAAO;AACd,iBAAK,aAAa;AAClB,kBAAM;AAAA,UACR;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MAEQ,mBAAyB;AAC/B,YAAI,KAAK,WAAY,OAAM,KAAK;AAAA,MAClC;AAAA,MAEQ,yBAA+B;AACrC,YAAI,CAAC,KAAK,aAAa,mBAAmB,EAAG;AAE7C,cAAM,UAAU,KAAK,QAClB;AAAA,UACC,WACE,OAAO,MAAM,uBAAuB,YACpC,MAAM,uBAAuB;AAAA,QACjC,EACC,IAAI,WAAS,OAAO,MAAM,EAAE,CAAC;AAEhC,YAAI,QAAQ,QAAQ;AAClB,gBAAM,IAAI;AAAA,YACR,4FACwB,QAAQ,KAAK,IAAI,CAAC;AAAA,UAC5C;AAAA,QACF;AAAA,MACF;AAAA,MAEQ,sBAA4B;AAClC,cAAM,QAAQ,IAAI,IAAI,KAAK,YAAY;AACvC,cAAM,UAAU,KAAK,QAClB,OAAO,WAAS,CAAC,MAAM,IAAI,MAAM,kBAA4B,CAAC,EAC9D,IAAI,WAAS,GAAG,MAAM,EAAE,KAAK,MAAM,kBAAkB,GAAG;AAE3D,YAAI,QAAQ,QAAQ;AAClB,gBAAM,IAAI;AAAA,YACR,kEACM,iBAAgB,iBAAiB,KAAK,IAAI,CAAC,sDACP,QAAQ,KAAK,IAAI,CAAC;AAAA,UAC9D;AAAA,QACF;AAAA,MACF;AAAA,MAEQ,cAAc,MAAoB;AACxC,YAAI,CAAC,KAAK,OAAQ,QAAO;AAEzB,cAAM,WAAW,IAAI;AAAA,UACnB,KAAK,OACF,iBAAiB,IAAI,EACrB,IAAI,WAAS,MAAM,kBAA4B;AAAA,QACpD;AACA,YAAI,SAAS,SAAS,EAAG,QAAO;AAEhC,eAAO,KAAK,aAAa,KAAK,YAAU,SAAS,IAAI,MAAM,CAAC;AAAA,MAC9D;AAAA,MAEQ,uBAA6B;AACnC,cAAM,MAAM,KAAK,aAAa,UAAU;AACxC,cAAM,MAAM,KAAK,aAAa,UAAU;AAExC,YAAI,OAAO,OAAO,IAAI,QAAQ,IAAI,IAAI,QAAQ,GAAG;AAC/C,gBAAM,IAAI;AAAA,YACR,+CACM,KAAK,aAAa,UAAU,CAAC,QAAQ,KAAK,aAAa,UAAU,CAAC;AAAA,UAC1E;AAAA,QACF;AAAA,MACF;AAAA;AAAA,MAGQ,cAAc,MAAqB;AACzC,eACE;AAAA,UACE;AAAA,UACA,KAAK,aAAa,UAAU;AAAA,UAC5B,KAAK,aAAa,UAAU;AAAA,QAC9B,KAAK,aAAa,MAAM,KAAK,aAAa;AAAA,MAE9C;AAAA,MAEQ,iBAAiB,MAAqB;AAC5C,YAAI,CAAC,KAAK,OAAQ,QAAO;AACzB,YAAI,CAAC,KAAK,cAAc,IAAI,EAAG,QAAO;AAEtC,YAAI,KAAK,qBAAqB;AAC5B,iBAAO,KAAK,oBAAoB,SAAS,KAAK,cAAc,IAAI,CAAC;AAAA,QACnE;AAEA,eAAO,KAAK,OAAO,iBAAiB,IAAI,EAAE,WAAW;AAAA,MACvD;AAAA,MAEQ,SAAe;AACrB,YAAI,CAAC,KAAK,OAAQ;AAElB,cAAM,YAAY,KAAK,OAAO,aAAa;AAC3C,cAAM,iBAAiB,KAAK,aAAa,uBAAuB;AAChE,cAAM,QAAQ,KAAK;AACnB,cAAM,UAAU,KAAK;AACrB,cAAM,UAAU,KAAK;AACrB,cAAM,mBAAmB,KAAK,aAAa,mBAAmB;AAC9D,cAAM,aAAa,KAAK,aAAa,YAAY;AACjD,cAAM,YAAY,KAAK;AAEvB,YAAI,kBAAkB;AACpB,eAAK,uBAAuB;AAC5B,eAAK,oBAAoB;AAAA,QAC3B;AAGA,aAAK,aAAa,UAAU;AAC5B,aAAK,aAAa,UAAU;AAC5B,aAAK,KAAK;AACV,aAAK,KAAK;AACV,aAAK,qBAAqB;AAE1B,cAAM,QAAQ,oBAAI,KAAK;AACvB,cAAM,aAAa,MAAM,SAAS;AAClC,cAAM,YAAY,MAAM,YAAY;AACpC,cAAM,iBACJ,UAAU,gBAAgB,aAC1B,UAAU,iBAAiB;AAE7B,cAAM,iBAAiB,UAAU,MAAM,SAAS;AAEhD,cAAM,qBAAqB,CAAC,UAAyB;AACnD,gBAAM,YAAY,gBAAgB,KAAK;AACvC,gBAAM,gBAAgB,gBAAgB,MAAM,SAAS;AAErD,cAAI,cAAc,UAAU,MAAM,SAAS,SAAS;AACpD,cAAI,MAAM,UAAU;AAClB,0BAAc,KAAK,OAAQ,iBAAiB,MAAM,QAAQ;AAAA,UAC5D;AAEA,gBAAM,mBAAmB,CAAC,aAAsB;AAC9C,kBAAM,SAAiC;AAAA,cACrC,MAAM;AAAA,cACN,UAAU;AAAA,cACV,SAAS;AAAA,cACT,UAAU;AAAA,cACV,aAAa;AAAA,cACb,OAAO;AAAA,YACT;AACA,mBAAO,WAAW,OAAO,QAAQ,KAAK,SAAS,YAAY,IAAI;AAAA,UACjE;AAEA,gBAAM,mBAAmB,CAAC,aAAsB;AAC9C,kBAAM,SAAiC;AAAA,cACrC,MAAM;AAAA,cACN,QAAQ;AAAA,cACR,KAAK;AAAA,YACP;AACA,mBAAO,WAAW,OAAO,QAAQ,KAAK,SAAS,YAAY,IAAI;AAAA,UACjE;AAEA,gBAAM,iBAAiB,CAAC,WAAoB;AAC1C,kBAAM,SAAiC;AAAA,cACrC,WAAW;AAAA,cACX,WAAW;AAAA,cACX,WAAW;AAAA,cACX,WAAW;AAAA,YACb;AACA,mBAAO,SAAS,OAAO,MAAM,KAAK,OAAO,YAAY,IAAI;AAAA,UAC3D;AAEA,iBAAO;AAAA,4DAC+C,WAAW;AAAA;AAAA,cAEzD,MAAM,OAAO,4BAA4B,WAAW,MAAM,IAAI,CAAC,WAAW,EAAE;AAAA;AAAA,gBAE1E,MAAM,WAAW,wCAAwC,aAAa,MAAM,QAAQ,CAAC,KAAK,WAAW,iBAAiB,MAAM,QAAQ,CAAC,CAAC,YAAY,EAAE;AAAA,gBACpJ,MAAM,WAAW,wCAAwC,aAAa,MAAM,QAAQ,CAAC,KAAK,WAAW,iBAAiB,MAAM,QAAQ,CAAC,CAAC,YAAY,EAAE;AAAA,gBACpJ,MAAM,UAAU,MAAM,WAAW,cAAc,oCAAoC,aAAa,MAAM,MAAM,CAAC,KAAK,WAAW,eAAe,MAAM,MAAM,CAAC,CAAC,YAAY,EAAE;AAAA;AAAA;AAAA;AAAA,YAK5K,YACI;AAAA;AAAA;AAAA,6CAG6B,WAAW,SAAS,CAAC;AAAA;AAAA,cAGlD,EACN;AAAA;AAAA,YAGE,MAAM,cACF;AAAA,2CAC2B,WAAW,MAAM,WAAW,CAAC;AAAA,cAExD,EACN;AAAA;AAAA,YAGE,MAAM,WACF;AAAA;AAAA;AAAA,6CAG6B,WAAW,MAAM,QAAQ,CAAC;AAAA;AAAA,cAGvD,EACN;AAAA;AAAA,YAGE,gBACI;AAAA;AAAA;AAAA,6CAG6B,WAAW,aAAa,CAAC;AAAA;AAAA,cAGtD,EACN;AAAA;AAAA,YAGE,MAAM,YACF;AAAA;AAAA;AAAA,6CAG6B,WAAW,MAAM,SAAS,CAAC;AAAA;AAAA,cAGxD,EACN;AAAA;AAAA,YAGE,MAAM,QACF;AAAA;AAAA;AAAA,6CAG6B,WAAW,MAAM,KAAK,CAAC;AAAA;AAAA,cAGpD,EACN;AAAA;AAAA,YAGE,MAAM,MACF;AAAA;AAAA,uBAEO,WAAW,QAAQ,MAAM,GAAa,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA,cAK/C,EACN;AAAA;AAAA,YAGE,MAAM,QAAQ,MAAM,KAAK,SAAS,IAC9B;AAAA;AAAA,cAEF,MAAM,KAAK,IAAI,CAAC,QAAgB,2BAA2B,WAAW,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC;AAAA;AAAA,cAG3F,EACN;AAAA;AAAA;AAAA,QAGN;AAEA,cAAM,wBAAwB,MAC5B;AAEF,cAAM,cAAc,KAAK,gBAAgB;AACzC,cAAM,iBAAiB,KAAK,mBAAmB;AAE/C,cAAM,iBAAiB,CAAC,SAAuB;AAC7C,gBAAM,eAAe,KAAK;AAI1B,gBAAM,cAAc,IAAI,KAAK,IAAI;AACjC,sBAAY,QAAQ,YAAY,QAAQ,IAAI,CAAC;AAC7C,gBAAM,SAAS;AAAA,YACb,GAAG,KAAK,OAAQ,iBAAiB,WAAW;AAAA,YAC5C,GAAG,KAAK,OAAQ,iBAAiB,IAAI;AAAA,UACvC;AAEA,eAAK,mBAAmB,MAAM;AAC9B,gBAAM,SAAS,YAAY,QAAQ,MAAM,YAAY;AAErD,gBAAM,QAAQ,KAAK;AAEnB,gBAAM,QAAQ,OAAO,IAAI,CAAC,UAAU,UAAU;AAC5C,kBAAM,YAAY,QAAQ;AAC1B,kBAAM,UAAU,YAAY;AAC5B,kBAAM,YAAY,cAAc,SAAS;AACzC,kBAAM,UAAU,cAAc,OAAO;AAErC,kBAAM,UACJ,UAAU,QACV,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,aAAa,QAAQ,WAAW,EAAE;AAE/D,kBAAM,cACJ,WACA,CAAC,YACD,cACA,KAAK,oBAAoB,QACzB,KAAK,kBAAkB,QACvBA,WAAU,KAAK,gBAAiB,IAAI,KACpC,aAAa,KAAK,mBAClB,WAAW,KAAK;AAElB,kBAAM,eAAe,eAAe,cAAc,KAAK;AACvD,kBAAM,aAAa,eAAe,YAAY,KAAK;AACnD,kBAAM,YAAY,eAAe,CAAC,gBAAgB,CAAC;AAEnD,kBAAM,cAAc;AAAA,cAClB;AAAA,cACA,UAAU,KAAK;AAAA,cACf,WAAW,2BAA2B;AAAA,cACtC,eAAe,+BAA+B;AAAA,cAC9C,aAAa,6BAA6B;AAAA,cAC1C,YAAY,4BAA4B;AAAA,YAC1C,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAIX,kBAAM,YACJ,GAAG,UAAU,+BAA+B,EAAE,oBAC1B,SAAS,oBACX,OAAO,gBAAgB,KAAK,YAAY,CAAC,kBAC3C,QAAQ;AAE1B,kBAAM,SAAS,CAAC,UAAU,WAAW,WAAW,WAAW;AAE3D,mBAAO;AAAA,wBACS,WAAW,KAAK,SAAS;AAAA,4CACL,SAAS;AAAA,6CACR,MAAM;AAAA;AAAA,UAE7C,CAAC;AAED,gBAAM,cAAc,aAChB,mCACA;AAEJ,iBAAO,eAAe,WAAW,KAAK,MAAM,KAAK,EAAE,CAAC;AAAA,QACtD;AAEA,cAAM,aAAa,UAAU,MAAM,SAAS;AAE5C,cAAM,aAAa,CAAC,SAA+B;AAAA;AAAA,YAG3C,aACI,sCAAsC,WAAW,KAAK,gBAAgB,CAAC,WACvE,EACN;AAAA;AAAA;AAAA;AAAA,oBAIU,UAAU,KAAK,IAAI,SAAO,OAAO,IAAI,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;AAAA;AAAA;AAAA;AAAA,kBAKnE,YACI,MAAM;AAAA,UACJ,EAAE,QAAQ,EAAE;AAAA,UACZ,MACE,OAAO,MAAM;AAAA,YACX,EAAE,QAAQ,EAAE;AAAA,YACZ,MACE;AAAA,UACJ,EAAE,KAAK,EAAE,CAAC;AAAA,QACd,EAAE,KAAK,EAAE,IACT,KAAK,cACF;AAAA,UACC,UAAQ;AAAA;AAAA,0BAER,KACC,IAAI,CAAC,cAAc,aAAa;AAC/B,kBAAM,UAAU,eAAe,YAAY;AAC3C,kBAAM,YAAsB,CAAC;AAE7B,gBACE,UAAU,gBACVA;AAAA,cACE,aAAa;AAAA,cACb,UAAU;AAAA,YACZ,GACA;AACA,sBAAQ,KAAK,wBAAwB;AAAA,YACvC;AACA,gBAAI,kBAAkB;AACpB,oBAAM,SAAS,KAAK;AAAA,gBAClB,aAAa;AAAA,cACf;AACA,oBAAM,UAAU,KAAK,uBAAuB,CAAC,GAC3C,MACF;AAEA,sBAAQ;AAAA,gBACN,gBAAgB,aAAa,MAAM,CAAC;AAAA,cACtC;AACA,kBAAI,QAAQ;AACV,wBAAQ,KAAK,qBAAqB;AAClC,0BAAU;AAAA,kBACR,gCAAgC,WAAW,UAAU,MAAM,CAAC,CAAC;AAAA,gBAC/D;AAAA,cACF;AACA,kBAAI,CAAC,KAAK,iBAAiB,aAAa,IAAI,GAAG;AAC7C,wBAAQ,KAAK,2BAA2B;AAAA,cAC1C;AACA,wBAAU;AAAA,gBACR,eAAe,WAAW,MAAM,CAAC;AAAA,cACnC;AAAA,YACF;AACA,gBAAI,qBAAqB,SAAS,YAAY;AAC5C,oBAAM,IAAI,aAAa;AACvB,kBACE,KAAK,eACLA,WAAU,GAAG,KAAK,WAAW;AAE7B,wBAAQ,KAAK,0BAA0B;AACzC,kBACE,KAAK,aACLA,WAAU,GAAG,KAAK,SAAS;AAE3B,wBAAQ,KAAK,wBAAwB;AACvC,kBAAI,KAAK,eAAe,KAAK,WAAW;AACtC,oBAAI,IAAI,KAAK,eAAe,IAAI,KAAK;AACnC,0BAAQ,KAAK,uBAAuB;AAAA,cACxC;AAAA,YACF;AACA,kBAAM,aAAa,aAAa,KAAK,YAAY;AAIjD,kBAAM,UAAU,KAAK;AAAA,cACnB,aAAa;AAAA,YACf;AACA,gBAAI,CAAC,SAAS;AACZ,sBAAQ,KAAK,4BAA4B;AAAA,YAC3C;AACA,mBAAO;AAAA;AAAA,uCAEI,QAAQ,KAAK,GAAG,CAAC;AAAA,2CACb,UAAU;AAAA,gDACL,QAAQ;AAAA,gCACxB,UAAU,0BAA0B,EAAE;AAAA,gCACtC,UAAU,KAAK,GAAG,CAAC;AAAA;AAAA,gCAEnB,aAAa,KAAK,QAAQ,CAAC;AAAA;AAAA;AAAA,UAGjC,CAAC,EACA,KAAK,EAAE,CAAC;AAAA;AAAA;AAAA,QAGX,EACC,KAAK,EAAE,CAChB;AAAA;AAAA;AAAA;AAAA;AAKZ,cAAM,OAAO;AAAA,QAET,QACI;AAAA;AAAA,cAEE,WAAW,KAAK,CAAC;AAAA;AAAA,UAGnB,EACN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iCAc2B,KAAK,aAAa,SAAS,OAAO;AAAA;AAAA;AAAA,kBAIjD,iBACI,GAAG,OAAO,UAAU,YAAY,CAAC,IAAI,UAAU,WAAW,KAC1D,UAAU,gBAChB;AAAA;AAAA;AAAA;AAAA,gBAKA,KAAK,aACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAOI,UAAU,eAAe,UAAU,aAAa,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA,yDAKjB,CAAC,KAAK,iBAAiB,aAAa,EAAE;AAAA,+BAChE,WAAW,KAAK,aAAa,UAAU,WAAW,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAQ1D,UAAU,eAAe,UAAU,aAAa,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAMnD,iBAAiB,SAAS,aAC1B,IAAI,CAAC,OAAO,UAAU;AACrB,gBAAM,aAAa,UAAU,UAAU;AACvC,gBAAM,YACJ,UAAU,cACV,UAAU,gBAAgB;AAC5B,iBAAO;AAAA;AAAA;AAAA,wDAGyB,aAAa,cAAc,EAAE,GAAG,YAAY,mBAAmB,EAAE;AAAA;AAAA,wCAEjF,KAAK;AAAA,2BAClB,KAAK;AAAA;AAAA,QAEV,CAAC,EACA,KAAK,EAAE,CAAC;AAAA;AAAA;AAAA,kBAIX,EACN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAOE,iBAAiB,aAAa,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cASlC,UAAU,MAAM,IAAI,UAAU,EAAE,KAAK,EAAE,CAAC;AAAA;AAAA;AAAA,YAI1C,CAAC,aAAa,qBAAqB,SAAS,UAAU,eAClD;AAAA;AAAA;AAAA,sBAGM,UAAU,WAAW;AAAA;AAAA;AAAA;AAAA,gBAK3B,iBACI;AAAA;AAAA;AAAA;AAAA,kBAKA,EACN;AAAA;AAAA;AAAA,kBAII,qBAAqB,SACjB,eAAe,UAAU,YAAa,IACtC,UAAU,MAAM,SAAS,IACvB,UAAU,MACP,IAAI,WAAS,YAAY,KAAK,CAAC,EAC/B,KAAK,EAAE,IACV,eAAe,CACvB;AAAA;AAAA;AAAA,cAIA,EACN;AAAA;AAAA;AAAA;AAKN,aAAK,YAAY;AACjB,aAAK,qBAAqB;AAAA,MAC5B;AAAA,MAEQ,uBAA6B;AACnC,YAAI,KAAK,kBAAmB;AAC5B,aAAK,oBAAoB;AAEzB,cAAM,UAAU,KAAK;AACrB,cAAM,UAAU,KAAK;AAErB,aAAK,wBAAwB,CAAC,MAAkB;AAC9C,gBAAM,SAAS,EAAE;AAEjB,gBAAM,OAAO,OAAO,QAAQ,2BAA2B;AACvD,cAAI,QAAQ,KAAK,QAAQ,MAAM;AAC7B,cAAE,gBAAgB;AAClB,kBAAM,OAAO,IAAI,KAAK,KAAK,QAAQ,IAAI;AACvC,kBAAM,WAAW,SAAS,KAAK,QAAQ,YAAY,GAAG;AACtD,kBAAM,YAAY,KAAK,aAAa,mBAAmB;AACvD,kBAAM,eAAe,KAAK,aAAa,YAAY;AAEnD,gBAAI,cAAc,SAAS,cAAc;AACvC,kBAAI,KAAK,iBAAiB,IAAI,GAAG;AAC/B,oBAAI;AACJ,oBAAI;AACJ,oBAAI,KAAK,cAAc,MAAM;AAE3B,uBAAK,cAAc;AACnB,uBAAK,YAAY;AACjB,8BAAY;AACZ,4BAAU;AAAA,gBACZ,WAAW,KAAK,gBAAgB,MAAM;AAEpC,uBAAK,cAAc;AACnB,8BAAY;AACZ,4BAAU;AAAA,gBACZ,OAAO;AAEL,wBAAM,CAAC,GAAGC,EAAC,IACT,KAAK,eAAe,OAChB,CAAC,KAAK,aAAa,IAAI,IACvB,CAAC,MAAM,KAAK,WAAW;AAC7B,wBAAM,SAAS,IAAI,KAAK,CAAC;AACzB,yBAAO,QAAQ,OAAO,QAAQ,IAAI,CAAC;AACnC,sBAAI,UAAU;AACd,yBAAO,SAASA,IAAG;AACjB,wBAAI,CAAC,KAAK,iBAAiB,MAAM,GAAG;AAClC,gCAAU;AACV;AAAA,oBACF;AACA,2BAAO,QAAQ,OAAO,QAAQ,IAAI,CAAC;AAAA,kBACrC;AACA,sBAAI,SAAS;AAEX,yBAAK,cAAc;AACnB,yBAAK,YAAY;AAAA,kBACnB,OAAO;AACL,yBAAK,cAAc;AACnB,yBAAK,YAAYA;AAAA,kBACnB;AACA,8BAAY,KAAK;AACjB,4BAAU,KAAK,aAAa,KAAK;AAAA,gBACnC;AACA,qBAAK;AAAA,kBACH,IAAI,YAAY,2BAA2B;AAAA,oBACzC,SAAS;AAAA,oBACT,UAAU;AAAA,oBACV,QAAQ,EAAE,WAAW,QAAQ;AAAA,kBAC/B,CAAC;AAAA,gBACH;AAAA,cACF;AAAA,YACF;AAEA,gBAAI,cAAc,QAAQ;AAExB,mBAAK,iBAAiB;AACtB,mBAAK,kBAAkB;AACvB,mBAAK,gBAAgB;AACrB,mBAAK,qBAAqB;AAAA,YAC5B;AAEA,iBAAK,OAAQ,gBAAgB,MAAM,UAAU,EAAE,UAAU,MAAM,CAAC;AAChE,iBAAK;AAAA,cACH,IAAI,YAAY,mBAAmB;AAAA,gBACjC,SAAS;AAAA,gBACT,UAAU;AAAA,gBACV,QAAQ,EAAE,MAAM,QAAQ,KAAK,OAAQ,iBAAiB,IAAI,EAAE;AAAA,cAC9D,CAAC;AAAA,YACH;AACA;AAAA,UACF;AAEA,gBAAM,WAAW,OAAO,QAAQ,eAAe;AAC/C,cAAI,CAAC,SAAU;AAEf,gBAAM,SAAS,SAAS,QAAQ;AAChC,YAAE,gBAAgB;AAElB,kBAAQ,QAAQ;AAAA,YACd,KAAK,YAAY;AACf,oBAAM,KAAK,KAAK,OAAQ,aAAa;AACrC,oBAAM,SAAS,GAAG,iBAAiB,IAAI,KAAK,GAAG,eAAe;AAC9D,oBAAM,QACJ,GAAG,iBAAiB,IAAI,GAAG,cAAc,IAAI,GAAG;AAClD,mBAAK,oBAAoB,OAAO,MAAM;AACtC,mBAAK,QAAS,SAAS;AACvB;AAAA,YACF;AAAA,YAEA,KAAK,QAAQ;AACX,oBAAM,KAAK,KAAK,OAAQ,aAAa;AACrC,oBAAM,SAAS,GAAG,iBAAiB,KAAK,IAAI,GAAG,eAAe;AAC9D,oBAAM,QACJ,GAAG,iBAAiB,KAAK,GAAG,cAAc,IAAI,GAAG;AACnD,mBAAK,oBAAoB,OAAO,MAAM;AACtC,mBAAK,QAAS,KAAK;AACnB;AAAA,YACF;AAAA,YAEA,KAAK,SAAS;AACZ,oBAAM,IAAI,oBAAI,KAAK;AACnB,mBAAK,oBAAoB,EAAE,YAAY,GAAG,EAAE,SAAS,CAAC;AACtD,mBAAK,QAAS,UAAU;AACxB,mBAAK,aAAa;AAClB;AAAA,YACF;AAAA,YAEA,KAAK;AACH,mBAAK,aAAa,CAAC,KAAK;AACxB,kBAAI,KAAK,YAAY;AACnB,qBAAK,YAAY,OAAO,KAAK,OAAQ,aAAa,EAAE,WAAW;AAC/D,qBAAK,iBAAiB;AAAA,cACxB;AACA,mBAAK,OAAO;AACZ;AAAA,YAEF,KAAK,aAAa;AAChB,oBAAM,KAAK,KAAK,OAAQ,aAAa;AACrC,kBAAI,GAAG,cAAc,SAAS;AAC5B,sBAAM,UAAU,GAAG,cAAc;AACjC,qBAAK,YAAY,OAAO,OAAO;AAC/B,qBAAK,iBAAiB,OAAO;AAC7B,qBAAK,oBAAoB,SAAS,GAAG,YAAY;AACjD,qBAAK,QAAS,KAAK,SAAS,GAAG,YAAY;AAAA,cAC7C;AACA;AAAA,YACF;AAAA,YAEA,KAAK,aAAa;AAChB,oBAAM,KAAK,KAAK,OAAQ,aAAa;AACrC,kBAAI,GAAG,cAAc,SAAS;AAC5B,sBAAM,UAAU,GAAG,cAAc;AACjC,qBAAK,YAAY,OAAO,OAAO;AAC/B,qBAAK,iBAAiB,OAAO;AAC7B,qBAAK,oBAAoB,SAAS,GAAG,YAAY;AACjD,qBAAK,QAAS,KAAK,SAAS,GAAG,YAAY;AAAA,cAC7C;AACA;AAAA,YACF;AAAA,YAEA,KAAK,gBAAgB;AACnB,oBAAM,QAAQ,SAAS,SAAS,QAAQ,SAAS,KAAK,EAAE;AACxD,oBAAM,OAAO,KAAK,OAAQ,aAAa,EAAE;AACzC,mBAAK,oBAAoB,MAAM,KAAK;AACpC,mBAAK,QAAS,KAAK,MAAM,KAAK;AAC9B,mBAAK,aAAa;AAClB;AAAA,YACF;AAAA,YAEA,KAAK;AACH,mBAAK,iBAAiB;AACtB,mBAAK,kBAAkB;AACvB,mBAAK,gBAAgB;AACrB,mBAAK,qBAAqB;AAC1B,mBAAK,OAAQ,eAAe;AAC5B;AAAA,YAEF,KAAK,eAAe;AAClB,oBAAM,YAAY,SAAS,QAAQ;AACnC,oBAAM,UAAU,SAAS,QAAQ;AACjC,oBAAM,WAAW,IAAI,KAAK,SAAS,QAAQ,IAAK;AAChD,oBAAM,aAAa,SAAS,QAAQ,WAAW;AAI/C,mBAAK;AAAA,gBACH,IAAI,YAAY,mBAAmB;AAAA,kBACjC,SAAS;AAAA,kBACT,UAAU;AAAA,kBACV,QAAQ;AAAA,oBACN,MAAM;AAAA,oBACN,WAAW;AAAA,oBACX,SAAS;AAAA,oBACT,QAAQ;AAAA,kBACV;AAAA,gBACF,CAAC;AAAA,cACH;AAEA,kBAAI,cAAc,CAAC,KAAK,aAAa,YAAY,EAAG;AAEpD,kBAAI,KAAK,oBAAoB;AAE3B,qBAAK,iBAAiB;AACtB,qBAAK,kBAAkB;AACvB,qBAAK,gBAAgB;AACrB,qBAAK,qBAAqB;AAAA,cAC5B,WAAW,KAAK,oBAAoB,MAAM;AAExC,qBAAK,iBAAiB;AACtB,qBAAK,kBAAkB;AACvB,qBAAK,gBAAgB;AAAA,cACvB,OAAO;AAEL,sBAAM,WACJ,YAAY,KAAK,kBACb,YACA,KAAK;AACX,sBAAM,SACJ,UAAU,KAAK,gBAAiB,UAAU,KAAK;AACjD,qBAAK,kBAAkB;AACvB,qBAAK,gBAAgB;AACrB,qBAAK,qBAAqB;AAAA,cAC5B;AACA,mBAAK,OAAO;AACZ,mBAAK;AAAA,gBACH,IAAI,YAAY,2BAA2B;AAAA,kBACzC,SAAS;AAAA,kBACT,UAAU;AAAA,kBACV,QAAQ;AAAA,oBACN,MAAM,KAAK;AAAA,oBACX,WAAW,KAAK;AAAA,oBAChB,SAAS,KAAK;AAAA,kBAChB;AAAA,gBACF,CAAC;AAAA,cACH;AACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,aAAK,wBAAwB,CAAC,MAAa;AACzC,gBAAM,SAAS,EAAE;AACjB,cAAI,CAAC,OAAO,QAAQ,mBAAmB,EAAG;AAE1C,gBAAM,QAAQ,OAAO;AACrB,cAAI,UAAU,MAAM,QAAQ,KAAK,KAAK,GAAG;AACvC,iBAAK,YAAY;AACjB,kBAAM,OAAO,SAAS,OAAO,EAAE;AAC/B,iBAAK,iBACH,UAAU,MAAO,QAAQ,WAAW,QAAQ;AAC9C,mBAAO,UAAU,OAAO,WAAW,CAAC,KAAK,cAAc;AAAA,UACzD;AAAA,QACF;AAEA,aAAK,uBAAuB,CAAC,MAAkB;AAC7C,gBAAM,SAAS,EAAE;AACjB,cAAI,CAAC,OAAO,QAAQ,mBAAmB,EAAG;AAE1C,gBAAM,OAAO,SAAS,KAAK,WAAW,EAAE;AACxC,gBAAM,KAAK,KAAK,OAAQ,aAAa;AACrC,cAAI,MAAM,IAAI,KAAK,OAAO,WAAW,OAAO,SAAS;AACnD,iBAAK,YAAY,OAAO,GAAG,WAAW;AACtC,iBAAK,iBAAiB;AACtB,mBAAO,QAAQ,KAAK;AACpB,mBAAO,UAAU,OAAO,SAAS;AAAA,UACnC,WAAW,SAAS,GAAG,aAAa;AAClC,iBAAK,oBAAoB,MAAM,GAAG,YAAY;AAC9C,iBAAK,QAAS,KAAK,MAAM,GAAG,YAAY;AAAA,UAC1C;AAAA,QACF;AAEA,aAAK,0BAA0B,CAAC,MAAqB;AACnD,gBAAM,SAAS,EAAE;AACjB,cAAI,CAAC,OAAO,QAAQ,mBAAmB,EAAG;AAC1C,cAAI,EAAE,QAAQ,QAAS,QAAO,KAAK;AAAA,QACrC;AAEA,aAAK,iBAAiB,SAAS,KAAK,qBAAqB;AACzD,aAAK,iBAAiB,SAAS,KAAK,qBAAqB;AACzD,aAAK,iBAAiB,QAAQ,KAAK,sBAAsB,IAAI;AAC7D,aAAK,iBAAiB,WAAW,KAAK,uBAAuB;AAE7D,aAAK,sBAAsB,CAAC,MAAkB;AAC5C,gBAAM,SAAS,EAAE;AACjB,cAAI,KAAK,SAAS,MAAM,EAAG;AAE3B,cAAI,KAAK,YAAY;AACnB,iBAAK,aAAa;AAClB,iBAAK,OAAO;AACZ;AAAA,UACF;AAEA,gBAAM,QAAQ,KAAK,cAAc,aAAa;AAC9C,cAAI,OAAO;AACT,iBAAK,OAAQ,eAAe;AAAA,UAC9B;AAAA,QACF;AAEA,iBAAS,iBAAiB,SAAS,KAAK,mBAAmB;AAAA,MAC7D;AAAA,MAEQ,iBAAiB,MAAoB;AAC3C,cAAM,QAAQ,KAAK,cAAc,mBAAmB;AACpD,YAAI,MAAO,OAAM,QAAQ,OAAO,IAAI;AAEpC,cAAM,UAAU,KAAK;AAAA,UACnB;AAAA,QACF;AACA,cAAM,UAAU,KAAK;AAAA,UACnB;AAAA,QACF;AACA,YAAI,QAAS,SAAQ,WAAW,QAAQ,KAAK;AAC7C,YAAI,QAAS,SAAQ,WAAW,QAAQ,KAAK;AAAA,MAC/C;AAAA,MAEQ,oBAAoB,MAAe,OAAsB;AAC/D,YAAI,CAAC,KAAK,OAAQ;AAClB,cAAM,KAAK,KAAK,OAAO,aAAa;AACpC,aAAK;AAAA,UACH,IAAI,YAAY,oBAAoB;AAAA,YAClC,SAAS;AAAA,YACT,UAAU;AAAA,YACV,QAAQ;AAAA,cACN,MAAM,QAAQ,GAAG;AAAA,cACjB,OAAO,SAAS,GAAG;AAAA,YACrB;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAAA;AAAA,MAGA,aAAa,QAA+B;AAC1C,aAAK,SAAS;AAAA,MAChB;AAAA,MAEA,YAAY,OAA4B;AACtC,aAAK,QAAQ;AAAA,MACf;AAAA,MAEA,iBAA8B;AAC5B,aAAK,iBAAiB;AACtB,eAAO,KAAK,QAAQ,aAAa,EAAE,gBAAgB;AAAA,MACrD;AAAA,MAEA,SAAS,MAAkB;AACzB,aAAK,iBAAiB;AACtB,cAAM,OAAO,KAAK,YAAY;AAC9B,cAAM,QAAQ,KAAK,SAAS;AAC5B,aAAK,oBAAoB,MAAM,KAAK;AACpC,aAAK,SAAS,KAAK,MAAM,KAAK;AAAA,MAChC;AAAA,MAEA,YAA4B;AAC1B,aAAK,iBAAiB;AACtB,YAAI,CAAC,KAAK;AACR,gBAAM,IAAI,MAAM,6CAA6C;AAC/D,eAAO,KAAK;AAAA,MACd;AAAA,IACF;AA/3CE,IADW,iBACJ,qBAAqB;AAAA,MAC1B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,IApBW,iBAoBa,WAAgD;AAAA,MACtE,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA,MACV,WAAW;AAAA,MACX,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,aAAa;AAAA,MACb,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,MACjB,gBAAgB;AAAA,MAChB,eAAe;AAAA,MACf,cAAc;AAAA,MACd,cAAc;AAAA,MACd,mBAAmB;AAAA,MACnB,UAAU;AAAA,MACV,SAAS;AAAA,MACT,UAAU;AAAA,MACV,cAAc;AAAA,MACd,gBAAgB;AAAA,MAChB,UAAU;AAAA,MACV,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,eAAe;AAAA,MACf,eAAe;AAAA,MACf,WAAW;AAAA,MACX,WAAW;AAAA,MACX,SAAS;AAAA,MACT,cAAc;AAAA,MACd,WAAW;AAAA,MACX,gBAAgB;AAAA,MAChB,SAAS;AAAA,MACT,WAAW;AAAA,MACX,gBAAgB;AAAA,MAChB,kBAAkB;AAAA,MAClB,aAAa;AAAA,MACb,eAAe;AAAA,MACf,gBAAgB;AAAA,MAChB,kBAAkB;AAAA,MAClB,eAAe;AAAA,MACf,iBAAiB;AAAA,MACjB,gBAAgB;AAAA,MAChB,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,MACjB,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,oBAAoB;AAAA,IACtB;AAkKA,IA9OW,iBA8OI,mBAAmB,oBAAI,IAAY;AAyLlD,IAvaW,iBAuaa,mBAAmB,CAAC,WAAW,eAAe,MAAM;AAE5E,IAzaW,iBAyaI,yBAAyB;AAzanC,IAAM,kBAAN;AAAA;AAAA;;;AC/BP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA;AAGA,IACE,OAAO,mBAAmB,eAC1B,CAAC,eAAe,IAAI,cAAc,GAClC;AAIA,kFAA+B,KAAK,CAAC,EAAE,iBAAAC,iBAAgB,MAAM;AAC3D,QAAI,CAAC,eAAe,IAAI,cAAc,GAAG;AACvC,qBAAe,OAAO,gBAAgBA,gBAAe;AAAA,IACvD;AAAA,EACF,CAAC;AACH;","names":["isSameDay","e","CalendarElement"]}