kalendly 0.1.7 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +377 -662
- package/dist/core/index.js +3 -3
- package/dist/index.d.mts +61 -602
- package/dist/index.d.ts +61 -602
- package/dist/index.js +963 -2375
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +937 -2364
- package/dist/index.mjs.map +1 -1
- package/dist/{vanilla/index.umd.js → index.umd.js} +438 -244
- package/dist/index.umd.js.map +1 -0
- package/dist/styles/calendar.css +96 -0
- package/package.json +54 -118
- package/dist/react/index.d.mts +0 -251
- package/dist/react/index.d.ts +0 -251
- package/dist/react/index.js +0 -969
- package/dist/react/index.js.map +0 -1
- package/dist/react/index.mjs +0 -924
- package/dist/react/index.mjs.map +0 -1
- package/dist/react-native/index.d.mts +0 -642
- package/dist/react-native/index.d.ts +0 -642
- package/dist/react-native/index.js +0 -1649
- package/dist/react-native/index.js.map +0 -1
- package/dist/react-native/index.mjs +0 -1615
- package/dist/react-native/index.mjs.map +0 -1
- package/dist/vanilla/index.d.mts +0 -271
- package/dist/vanilla/index.d.ts +0 -271
- package/dist/vanilla/index.js +0 -1064
- package/dist/vanilla/index.js.map +0 -1
- package/dist/vanilla/index.mjs +0 -1013
- package/dist/vanilla/index.mjs.map +0 -1
- package/dist/vanilla/index.umd.js.map +0 -1
- package/dist/vue/components/Calendar.vue.d.ts +0 -43
- package/dist/vue/components/Calendar.vue.d.ts.map +0 -1
- package/dist/vue/index.d.ts +0 -134
- package/dist/vue/index.d.ts.map +0 -1
- package/dist/vue/index.js +0 -1
- package/dist/vue/index.mjs +0 -717
- package/dist/vue/types.d.ts +0 -21
- package/dist/vue/types.d.ts.map +0 -1
package/dist/react/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/react/index.tsx","../../src/react/components/Calendar.tsx","../../src/core/utils.ts","../../src/core/calendar-engine.ts","../../src/react/components/DatePopup.tsx"],"sourcesContent":["export { Calendar } from './components/Calendar';\nexport { DatePopup } from './components/DatePopup';\nexport * from './types';\n\n// Re-export core types and utilities for convenience\nexport * from '../core';\n","import React, {\n useEffect,\n useState,\n useCallback,\n useMemo,\n useRef,\n} from 'react';\nimport {\n CalendarEngine,\n getCellClasses,\n MONTHS_FULL,\n MONTHS,\n} from '../../core';\nimport { CalendarComponentProps } from '../types';\nimport { DatePopup } from './DatePopup';\n\nexport const Calendar: React.FC<CalendarComponentProps> = ({\n events,\n initialDate,\n minYear,\n maxYear,\n weekStartsOn = 0,\n useShortMonthNames = false,\n onDateSelect,\n onEventClick,\n onMonthChange,\n className = '',\n style,\n renderEvent,\n renderNoEvents,\n title,\n theme,\n}) => {\n const engine = useMemo(\n () =>\n new CalendarEngine({\n events,\n initialDate,\n minYear,\n maxYear,\n weekStartsOn,\n }),\n [events, initialDate, minYear, maxYear, weekStartsOn]\n );\n\n const [, forceUpdate] = useState({});\n const rerender = useCallback(() => forceUpdate({}), []);\n\n // Picker state\n const [pickerOpen, setPickerOpen] = useState(false);\n const [yearInput, setYearInput] = useState('');\n const [yearInputValid, setYearInputValid] = useState(true);\n const pickerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const unsubscribe = engine.subscribe(rerender);\n return unsubscribe;\n }, [engine, rerender]);\n\n useEffect(() => {\n engine.updateEvents(events);\n }, [engine, events]);\n\n useEffect(() => {\n return () => {\n engine.destroy();\n };\n }, [engine]);\n\n useEffect(() => {\n if (theme) {\n const root = document.documentElement;\n if (theme.primary)\n root.style.setProperty('--calendar-primary-color', theme.primary);\n if (theme.secondary)\n root.style.setProperty('--calendar-secondary-color', theme.secondary);\n if (theme.tertiary)\n root.style.setProperty('--calendar-tertiary-color', theme.tertiary);\n if (theme.textColor)\n root.style.setProperty('--calendar-text-color', theme.textColor);\n if (theme.textLight)\n root.style.setProperty('--calendar-text-light', theme.textLight);\n if (theme.background)\n root.style.setProperty('--calendar-background', theme.background);\n if (theme.cellHover)\n root.style.setProperty('--calendar-cell-hover', theme.cellHover);\n if (theme.borderColor)\n root.style.setProperty('--calendar-border-color', theme.borderColor);\n if (theme.todayOutline)\n root.style.setProperty('--calendar-today-outline', theme.todayOutline);\n if (theme.selectedBg)\n root.style.setProperty('--calendar-selected-bg', theme.selectedBg);\n if (theme.eventIndicator)\n root.style.setProperty(\n '--calendar-event-indicator',\n theme.eventIndicator\n );\n }\n }, [theme]);\n\n const viewModel = engine.getViewModel();\n const actions = engine.getActions();\n const { selectedDate, tasks } = viewModel;\n\n const handleDateClick = (\n event: React.MouseEvent<HTMLTableSectionElement>\n ) => {\n const td = (event.target as HTMLElement).closest('td');\n if (!td) return;\n\n const tr = td.parentElement as HTMLTableRowElement | null;\n if (!tr) return;\n\n const weekIndex = tr.rowIndex - 1; // -1 because of thead\n const dayIndex = Array.from(tr.children).indexOf(td);\n\n const calendarDate = viewModel.calendarDates[weekIndex]?.[dayIndex];\n if (!calendarDate) return;\n\n engine.handleDateClick(calendarDate.date, dayIndex);\n onDateSelect?.(calendarDate.date);\n };\n\n const handleMonthChange = useCallback(() => {\n onMonthChange?.(viewModel.currentYear, viewModel.currentMonth);\n }, [onMonthChange, viewModel.currentYear, viewModel.currentMonth]);\n\n const handleNext = () => {\n actions.next();\n handleMonthChange();\n };\n\n const handlePrevious = () => {\n actions.previous();\n handleMonthChange();\n };\n\n const handleGoToToday = () => {\n actions.goToToday();\n setPickerOpen(false);\n const today = new Date();\n onMonthChange?.(today.getFullYear(), today.getMonth());\n };\n\n const togglePicker = () => {\n const newOpen = !pickerOpen;\n setPickerOpen(newOpen);\n if (newOpen) {\n setYearInput(String(viewModel.currentYear));\n setYearInputValid(true);\n }\n };\n\n const today = new Date();\n const computedMinYear = minYear ?? today.getFullYear() - 30;\n const computedMaxYear = maxYear ?? today.getFullYear() + 10;\n\n const handleYearInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n if (value === '' || /^\\d+$/.test(value)) {\n setYearInput(value);\n const year = parseInt(value, 10);\n setYearInputValid(\n value === '' || (year >= computedMinYear && year <= computedMaxYear)\n );\n }\n };\n\n const handleYearInputBlur = () => {\n const year = parseInt(yearInput, 10);\n if (isNaN(year) || year < computedMinYear || year > computedMaxYear) {\n setYearInput(String(viewModel.currentYear));\n setYearInputValid(true);\n } else {\n actions.jump(year, viewModel.currentMonth);\n handleMonthChange();\n }\n };\n\n const handleYearPrev = () => {\n const newYear = viewModel.currentYear - 1;\n if (newYear >= computedMinYear) {\n actions.jump(newYear, viewModel.currentMonth);\n setYearInput(String(newYear));\n handleMonthChange();\n }\n };\n\n const handleYearNext = () => {\n const newYear = viewModel.currentYear + 1;\n if (newYear <= computedMaxYear) {\n actions.jump(newYear, viewModel.currentMonth);\n setYearInput(String(newYear));\n handleMonthChange();\n }\n };\n\n const handleMonthSelect = (month: number) => {\n actions.jump(viewModel.currentYear, month);\n setPickerOpen(false);\n handleMonthChange();\n };\n\n // Close picker on outside click\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n pickerRef.current &&\n !pickerRef.current.contains(event.target as Node)\n ) {\n setPickerOpen(false);\n }\n };\n\n if (pickerOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n }\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [pickerOpen]);\n\n return (\n <div className={`kalendly-calendar ${className}`} style={style}>\n {title && (\n <div className=\"page--title\">\n <h1>{title}</h1>\n </div>\n )}\n\n <div className=\"calendar--content\">\n <div className=\"calendar--card\">\n {/* Navigation Header */}\n <div className=\"calendar--nav-header\">\n <button\n type=\"button\"\n className=\"calendar--nav-arrow\"\n onClick={handlePrevious}\n aria-label=\"Previous month\"\n >\n ‹\n </button>\n\n <div className=\"calendar--picker-container\" ref={pickerRef}>\n <button\n type=\"button\"\n className=\"calendar--picker-btn\"\n onClick={togglePicker}\n // aria-expanded={pickerOpen ? \"true\" : \"false\"}\n {...{ 'aria-expanded': pickerOpen }}\n aria-haspopup=\"true\"\n >\n {useShortMonthNames\n ? `${MONTHS[viewModel.currentMonth]} ${viewModel.currentYear}`\n : viewModel.monthAndYearText}\n <span className=\"calendar--picker-chevron\">▾</span>\n </button>\n\n {pickerOpen && (\n <div className=\"calendar--picker-dropdown\">\n <div className=\"calendar--picker-year-row\">\n <button\n type=\"button\"\n className=\"calendar--picker-year-arrow\"\n onClick={handleYearPrev}\n disabled={viewModel.currentYear <= computedMinYear}\n aria-label=\"Previous year\"\n >\n ‹\n </button>\n <input\n type=\"text\"\n className={`calendar--picker-year-input${!yearInputValid ? ' invalid' : ''}`}\n value={yearInput}\n onChange={handleYearInputChange}\n onBlur={handleYearInputBlur}\n onKeyDown={e => {\n if (e.key === 'Enter') handleYearInputBlur();\n }}\n aria-label=\"Year\"\n />\n <button\n type=\"button\"\n className=\"calendar--picker-year-arrow\"\n onClick={handleYearNext}\n disabled={viewModel.currentYear >= computedMaxYear}\n aria-label=\"Next year\"\n >\n ›\n </button>\n </div>\n\n <div className=\"calendar--picker-months\">\n {(useShortMonthNames ? MONTHS : MONTHS_FULL).map(\n (month, index) => {\n const isSelected = index === viewModel.currentMonth;\n const isCurrentMonth =\n index === today.getMonth() &&\n viewModel.currentYear === today.getFullYear();\n return (\n <button\n key={month}\n type=\"button\"\n className={`calendar--picker-month${isSelected ? ' selected' : ''}${isCurrentMonth ? ' current-month' : ''}`}\n onClick={() => handleMonthSelect(index)}\n >\n {month}\n </button>\n );\n }\n )}\n </div>\n </div>\n )}\n </div>\n\n <button\n type=\"button\"\n className=\"calendar--today-btn\"\n onClick={handleGoToToday}\n disabled={actions.isCurrentMonth()}\n >\n Today\n </button>\n\n <button\n type=\"button\"\n className=\"calendar--nav-arrow\"\n onClick={handleNext}\n aria-label=\"Next month\"\n >\n ›\n </button>\n </div>\n\n <table className=\"calendar--table calendar--table--bordered\">\n <thead>\n <tr>\n {viewModel.days.map(day => (\n <th key={day}>{day.slice(0, 3)}</th>\n ))}\n </tr>\n </thead>\n <tbody onClick={handleDateClick}>\n {viewModel.calendarDates.map((week, weekIndex) => (\n <tr key={weekIndex}>\n {week.map((calendarDate, dayIndex) => {\n const cellClasses = getCellClasses(calendarDate);\n return (\n <td\n key={`${weekIndex}-${dayIndex}`}\n className={cellClasses.join(' ')}\n >\n {calendarDate.date.getDate()}\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n\n <DatePopup\n isVisible={!!selectedDate}\n selectedDate={selectedDate}\n events={tasks}\n scheduleDay={viewModel.scheduleDay}\n popupPositionClass={viewModel.popupPositionClass}\n onClose={() => engine.clearSelection()}\n onEventClick={onEventClick}\n renderEvent={renderEvent}\n renderNoEvents={renderNoEvents}\n />\n </div>\n </div>\n </div>\n );\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\nexport function getEventsForDate(\n events: CalendarEvent[],\n date: Date\n): CalendarEvent[] {\n const normalizedTargetDate = normalizeDate(date);\n\n return events.filter(event => {\n const eventDate = normalizeDate(new Date(event.date));\n return eventDate.getTime() === normalizedTargetDate.getTime();\n });\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 getPopupPositionClass(selectedDayIndex: number | null): string {\n if (selectedDayIndex === null) return 'popup-center-bottom';\n\n if (selectedDayIndex < 3) {\n return 'popup-right';\n } else if (selectedDayIndex > 4) {\n return 'popup-left';\n } else {\n return 'popup-center-bottom';\n }\n}\n\nexport function getCellClasses(calendarDate: CalendarDate): string[] {\n const classes: string[] = [];\n\n if (!calendarDate.isCurrentMonth) {\n classes.push('other-month');\n }\n\n if (calendarDate.isToday) {\n classes.push('schedule--current--exam');\n }\n\n if (calendarDate.hasEvents) {\n classes.push('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","import {\n CalendarEvent,\n CalendarState,\n CalendarConfig,\n CalendarActions,\n CalendarViewModel,\n CategoryColorMap,\n} from './types';\nimport {\n generateCalendarDates,\n getEventsForDate,\n generateYears,\n getPopupPositionClass,\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 calendarDates = generateCalendarDates(\n this.state.currentYear,\n this.state.currentMonth,\n this.config.events,\n this.config.weekStartsOn\n );\n\n return {\n ...this.state,\n months: MONTHS,\n days: DAYS,\n years: generateYears(this.config.minYear, this.config.maxYear),\n monthAndYearText: getMonthYearText(\n this.state.currentYear,\n this.state.currentMonth\n ),\n scheduleDay: this.state.selectedDate\n ? formatDateForDisplay(this.state.selectedDate)\n : '',\n calendarDates,\n popupPositionClass: getPopupPositionClass(this.state.selectedDayIndex),\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","import React from 'react';\nimport { DatePopupProps } from '../types';\nimport { formatTimeRange, formatAttendees } from '../../core/utils';\n\nconst PriorityBadge: React.FC<{ priority?: string }> = ({ priority }) => {\n if (!priority) return null;\n\n const priorityConfig = {\n high: { label: 'HIGH', className: 'badge priority-high' },\n medium: { label: 'MEDIUM', className: 'badge priority-medium' },\n low: { label: 'LOW', className: 'badge priority-low' },\n };\n\n const config = priorityConfig[priority as keyof typeof priorityConfig];\n if (!config) return null;\n\n return <span className={config.className}>{config.label}</span>;\n};\n\nconst StatusBadge: React.FC<{ status?: string }> = ({ status }) => {\n if (!status || status === 'scheduled') return null;\n\n const statusConfig = {\n completed: { label: 'COMPLETED', className: 'badge status-completed' },\n cancelled: { label: 'CANCELLED', className: 'badge status-cancelled' },\n tentative: { label: 'TENTATIVE', className: 'badge status-tentative' },\n };\n\n const config = statusConfig[status as keyof typeof statusConfig];\n if (!config) return null;\n\n return <span className={config.className}>{config.label}</span>;\n};\n\nconst CategoryBadge: React.FC<{ category?: string }> = ({ category }) => {\n if (!category) return null;\n\n const categoryConfig = {\n work: { label: 'WORK', className: 'badge category-work' },\n personal: { label: 'PERSONAL', className: 'badge category-personal' },\n meeting: { label: 'MEETING', className: 'badge category-meeting' },\n deadline: { label: 'DEADLINE', className: 'badge category-deadline' },\n appointment: {\n label: 'APPOINTMENT',\n className: 'badge category-appointment',\n },\n other: { label: 'OTHER', className: 'badge category-other' },\n };\n\n const config = categoryConfig[category as keyof typeof categoryConfig];\n if (!config) return null;\n\n return <span className={config.className}>{config.label}</span>;\n};\n\nexport const DatePopup: React.FC<DatePopupProps> = ({\n isVisible,\n selectedDate,\n events,\n scheduleDay,\n popupPositionClass,\n onEventClick,\n onClose,\n renderEvent,\n renderNoEvents,\n}) => {\n if (!isVisible || !selectedDate) return null;\n\n const handleEventClick = (event: DatePopupProps['events'][number]) => {\n onEventClick?.(event);\n };\n\n const showScrollHint = events.length > 3;\n\n const defaultRenderEvent = (event: DatePopupProps['events'][number]) => {\n const timeRange = formatTimeRange(event);\n const attendeesList = formatAttendees(event.attendees);\n\n return (\n <div\n key={event.id || event.name}\n className={`event-card${onEventClick ? ' clickable' : ''}`}\n onClick={() => handleEventClick(event)}\n style={{\n borderLeftColor: event.color || undefined,\n }}\n >\n <div className=\"event-header\">\n <div className=\"event-title\">{event.name}</div>\n <div className=\"event-badges\">\n <CategoryBadge category={event.category} />\n <PriorityBadge priority={event.priority} />\n <StatusBadge status={event.status} />\n </div>\n </div>\n\n {timeRange && (\n <div className=\"event-time\">\n <span className=\"event-time-label\">Time:</span>\n <span className=\"event-time-value\">{timeRange}</span>\n </div>\n )}\n\n {event.description && (\n <div className=\"event-description\">{event.description}</div>\n )}\n\n {event.location && (\n <div className=\"event-time\">\n <span className=\"event-time-label\">Location:</span>\n <span className=\"event-time-value\">{event.location}</span>\n </div>\n )}\n\n {attendeesList && (\n <div className=\"event-time\">\n <span className=\"event-time-label\">Attendees:</span>\n <span className=\"event-time-value\">{attendeesList}</span>\n </div>\n )}\n\n {event.organizer && (\n <div className=\"event-time\">\n <span className=\"event-time-label\">Organizer:</span>\n <span className=\"event-time-value\">{event.organizer}</span>\n </div>\n )}\n\n {event.notes && (\n <div className=\"event-time\">\n <span className=\"event-time-label\">Notes:</span>\n <span className=\"event-time-value\">{event.notes}</span>\n </div>\n )}\n\n {event.url && (\n <div className=\"event-time\">\n <a\n href={event.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"event-link\"\n onClick={e => e.stopPropagation()}\n >\n View Details →\n </a>\n </div>\n )}\n\n {event.tags && event.tags.length > 0 && (\n <div className=\"event-tags\">\n {event.tags.map((tag: string, idx: number) => (\n <span key={idx} className=\"event-tag\">\n {tag}\n </span>\n ))}\n </div>\n )}\n </div>\n );\n };\n\n const defaultRenderNoEvents = () => (\n <div className=\"no-events-message\">No events scheduled for this day.</div>\n );\n\n return (\n <div className={`date-popup ${popupPositionClass}`}>\n <div className=\"popup-header\">\n <h2>{scheduleDay}</h2>\n <button\n type=\"button\"\n className=\"popup-close\"\n onClick={onClose}\n aria-label=\"Close\"\n >\n ✕\n </button>\n </div>\n\n {showScrollHint && (\n <div className=\"scroll-hint\">↓ Scroll to see more events ↓</div>\n )}\n\n <div className=\"events-container\">\n {events.length > 0\n ? events.map(event =>\n renderEvent ? (\n <div\n key={event.id || event.name}\n className={`event-card${onEventClick ? ' clickable' : ''}`}\n onClick={() => handleEventClick(event)}\n >\n {renderEvent(event)}\n </div>\n ) : (\n defaultRenderEvent(event)\n )\n )\n : renderNoEvents\n ? renderNoEvents()\n : defaultRenderNoEvents()}\n </div>\n </div>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;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;;;ACAA,mBAMO;;;ACJA,IAAM,SAAS;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,cAAc;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,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;AAEO,SAAS,iBACd,QACA,MACiB;AACjB,QAAM,uBAAuB,cAAc,IAAI;AAE/C,SAAO,OAAO,OAAO,WAAS;AAC5B,UAAM,YAAY,cAAc,IAAI,KAAK,MAAM,IAAI,CAAC;AACpD,WAAO,UAAU,QAAQ,MAAM,qBAAqB,QAAQ;AAAA,EAC9D,CAAC;AACH;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,sBAAsB,kBAAyC;AAC7E,MAAI,qBAAqB,KAAM,QAAO;AAEtC,MAAI,mBAAmB,GAAG;AACxB,WAAO;AAAA,EACT,WAAW,mBAAmB,GAAG;AAC/B,WAAO;AAAA,EACT,OAAO;AACL,WAAO;AAAA,EACT;AACF;AAEO,SAAS,eAAe,cAAsC;AACnE,QAAM,UAAoB,CAAC;AAE3B,MAAI,CAAC,aAAa,gBAAgB;AAChC,YAAQ,KAAK,aAAa;AAAA,EAC5B;AAEA,MAAI,aAAa,SAAS;AACxB,YAAQ,KAAK,yBAAyB;AAAA,EACxC;AAEA,MAAI,aAAa,WAAW;AAC1B,YAAQ,KAAK,YAAY;AAAA,EAC3B;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;AAEO,IAAM,0BAA4C;AAAA,EACvD,MAAM;AAAA,EACN,UAAU;AAAA,EACV,SAAS;AAAA,EACT,UAAU;AAAA,EACV,aAAa;AAAA,EACb,OAAO;AACT;AAGO,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;;;AC1PO,IAAM,iBAAN,MAAqB;AAAA,EAM1B,YAAY,QAAwB;AAHpC,SAAQ,YAA6B,oBAAI,IAAI;AAI3C,SAAK,SAAS;AACd,SAAK,iBAAiB,oBAAoB,OAAO,cAAc;AAE/D,UAAM,cAAc,OAAO,eAAe,oBAAI,KAAK;AACnD,SAAK,QAAQ;AAAA,MACX,aAAa,YAAY,YAAY;AAAA,MACrC,cAAc,YAAY,SAAS;AAAA,MACnC,aAAa,YAAY,QAAQ;AAAA,MACjC,cAAc;AAAA,MACd,kBAAkB;AAAA,MAClB,OAAO,CAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,UAAkC;AAC1C,SAAK,UAAU,IAAI,QAAQ;AAC3B,WAAO,MAAM,KAAK,UAAU,OAAO,QAAQ;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAe;AACrB,SAAK,UAAU,QAAQ,cAAY,SAAS,CAAC;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,WAA0B;AACxB,WAAO,EAAE,GAAG,KAAK,MAAM;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,eAAkC;AAChC,UAAM,gBAAgB;AAAA,MACpB,KAAK,MAAM;AAAA,MACX,KAAK,MAAM;AAAA,MACX,KAAK,OAAO;AAAA,MACZ,KAAK,OAAO;AAAA,IACd;AAEA,WAAO;AAAA,MACL,GAAG,KAAK;AAAA,MACR,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,OAAO,cAAc,KAAK,OAAO,SAAS,KAAK,OAAO,OAAO;AAAA,MAC7D,kBAAkB;AAAA,QAChB,KAAK,MAAM;AAAA,QACX,KAAK,MAAM;AAAA,MACb;AAAA,MACA,aAAa,KAAK,MAAM,eACpB,qBAAqB,KAAK,MAAM,YAAY,IAC5C;AAAA,MACJ;AAAA,MACA,oBAAoB,sBAAsB,KAAK,MAAM,gBAAgB;AAAA,IACvE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAA8B;AAC5B,WAAO;AAAA,MACL,MAAM,KAAK,KAAK,KAAK,IAAI;AAAA,MACzB,UAAU,KAAK,SAAS,KAAK,IAAI;AAAA,MACjC,MAAM,KAAK,KAAK,KAAK,IAAI;AAAA,MACzB,WAAW,KAAK,UAAU,KAAK,IAAI;AAAA,MACnC,gBAAgB,KAAK,eAAe,KAAK,IAAI;AAAA,MAC7C,YAAY,KAAK,WAAW,KAAK,IAAI;AAAA,MACrC,aAAa,KAAK,YAAY,KAAK,IAAI;AAAA,IACzC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,OAAa;AACnB,QAAI,KAAK,MAAM,iBAAiB,IAAI;AAClC,WAAK,MAAM,eAAe;AAC1B,WAAK,MAAM;AAAA,IACb,OAAO;AACL,WAAK,MAAM;AAAA,IACb;AAEA,SAAK,MAAM,eAAe;AAC1B,SAAK,MAAM,mBAAmB;AAC9B,SAAK,YAAY;AACjB,SAAK,OAAO;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAiB;AACvB,QAAI,KAAK,MAAM,iBAAiB,GAAG;AACjC,WAAK,MAAM,eAAe;AAC1B,WAAK,MAAM;AAAA,IACb,OAAO;AACL,WAAK,MAAM;AAAA,IACb;AAEA,SAAK,MAAM,eAAe;AAC1B,SAAK,MAAM,mBAAmB;AAC9B,SAAK,YAAY;AACjB,SAAK,OAAO;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKQ,KAAK,MAAc,OAAqB;AAC9C,SAAK,MAAM,cAAc;AACzB,SAAK,MAAM,eAAe;AAC1B,SAAK,MAAM,eAAe;AAC1B,SAAK,MAAM,mBAAmB;AAC9B,SAAK,YAAY;AACjB,SAAK,OAAO;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAkB;AACxB,UAAM,QAAQ,oBAAI,KAAK;AACvB,SAAK,MAAM,cAAc,MAAM,YAAY;AAC3C,SAAK,MAAM,eAAe,MAAM,SAAS;AACzC,SAAK,MAAM,eAAe;AAC1B,SAAK,MAAM,mBAAmB;AAC9B,SAAK,YAAY;AACjB,SAAK,OAAO;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAA0B;AAChC,UAAM,QAAQ,oBAAI,KAAK;AACvB,WACE,KAAK,MAAM,gBAAgB,MAAM,YAAY,KAC7C,KAAK,MAAM,iBAAiB,MAAM,SAAS;AAAA,EAE/C;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAW,MAAY,UAAyB;AACtD,SAAK,MAAM,eAAe;AAC1B,SAAK,MAAM,mBAAmB,YAAY;AAC1C,SAAK,MAAM,cAAc,KAAK,QAAQ;AACtC,SAAK,MAAM,eAAe,KAAK,SAAS;AACxC,SAAK,MAAM,cAAc,KAAK,YAAY;AAC1C,SAAK,YAAY;AACjB,SAAK,OAAO;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAoB;AAC1B,QAAI,CAAC,KAAK,MAAM,cAAc;AAC5B,WAAK,MAAM,QAAQ,CAAC;AACpB;AAAA,IACF;AAEA,SAAK,MAAM,QAAQ;AAAA,MACjB,KAAK,OAAO;AAAA,MACZ,KAAK,MAAM;AAAA,IACb;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,QAA+B;AAC1C,SAAK,OAAO,SAAS;AACrB,SAAK,YAAY;AACjB,SAAK,OAAO;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,MAAY,UAAyB;AACnD,SAAK,WAAW,MAAM,QAAQ;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,MAAqB;AACpC,WAAO,iBAAiB,KAAK,OAAO,QAAQ,IAAI,EAAE,SAAS;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,MAA6B;AAC5C,WAAO,iBAAiB,KAAK,OAAO,QAAQ,IAAI;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAuB;AACrB,SAAK,MAAM,eAAe;AAC1B,SAAK,MAAM,mBAAmB;AAC9B,SAAK,MAAM,QAAQ,CAAC;AACpB,SAAK,OAAO;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,UAA2B;AAC1C,QAAI,CAAC,SAAU,QAAO;AACtB,WAAO,iBAAiB,UAAU,KAAK,cAAc;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAqB,QAAgC;AACnD,SAAK,iBAAiB,oBAAoB,MAAM;AAChD,SAAK,OAAO;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAsC;AACpC,WAAO,EAAE,GAAG,KAAK,eAAe;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,MAAc,OAAqB;AAClD,SAAK,eAAe,IAAI,IAAI;AAC5B,SAAK,OAAO;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACd,SAAK,UAAU,MAAM;AAAA,EACvB;AACF;;;AC1QS;AAZT,IAAM,gBAAiD,CAAC,EAAE,SAAS,MAAM;AACvE,MAAI,CAAC,SAAU,QAAO;AAEtB,QAAM,iBAAiB;AAAA,IACrB,MAAM,EAAE,OAAO,QAAQ,WAAW,sBAAsB;AAAA,IACxD,QAAQ,EAAE,OAAO,UAAU,WAAW,wBAAwB;AAAA,IAC9D,KAAK,EAAE,OAAO,OAAO,WAAW,qBAAqB;AAAA,EACvD;AAEA,QAAM,SAAS,eAAe,QAAuC;AACrE,MAAI,CAAC,OAAQ,QAAO;AAEpB,SAAO,4CAAC,UAAK,WAAW,OAAO,WAAY,iBAAO,OAAM;AAC1D;AAEA,IAAM,cAA6C,CAAC,EAAE,OAAO,MAAM;AACjE,MAAI,CAAC,UAAU,WAAW,YAAa,QAAO;AAE9C,QAAM,eAAe;AAAA,IACnB,WAAW,EAAE,OAAO,aAAa,WAAW,yBAAyB;AAAA,IACrE,WAAW,EAAE,OAAO,aAAa,WAAW,yBAAyB;AAAA,IACrE,WAAW,EAAE,OAAO,aAAa,WAAW,yBAAyB;AAAA,EACvE;AAEA,QAAM,SAAS,aAAa,MAAmC;AAC/D,MAAI,CAAC,OAAQ,QAAO;AAEpB,SAAO,4CAAC,UAAK,WAAW,OAAO,WAAY,iBAAO,OAAM;AAC1D;AAEA,IAAM,gBAAiD,CAAC,EAAE,SAAS,MAAM;AACvE,MAAI,CAAC,SAAU,QAAO;AAEtB,QAAM,iBAAiB;AAAA,IACrB,MAAM,EAAE,OAAO,QAAQ,WAAW,sBAAsB;AAAA,IACxD,UAAU,EAAE,OAAO,YAAY,WAAW,0BAA0B;AAAA,IACpE,SAAS,EAAE,OAAO,WAAW,WAAW,yBAAyB;AAAA,IACjE,UAAU,EAAE,OAAO,YAAY,WAAW,0BAA0B;AAAA,IACpE,aAAa;AAAA,MACX,OAAO;AAAA,MACP,WAAW;AAAA,IACb;AAAA,IACA,OAAO,EAAE,OAAO,SAAS,WAAW,uBAAuB;AAAA,EAC7D;AAEA,QAAM,SAAS,eAAe,QAAuC;AACrE,MAAI,CAAC,OAAQ,QAAO;AAEpB,SAAO,4CAAC,UAAK,WAAW,OAAO,WAAY,iBAAO,OAAM;AAC1D;AAEO,IAAM,YAAsC,CAAC;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,MAAI,CAAC,aAAa,CAAC,aAAc,QAAO;AAExC,QAAM,mBAAmB,CAAC,UAA4C;AACpE,mBAAe,KAAK;AAAA,EACtB;AAEA,QAAM,iBAAiB,OAAO,SAAS;AAEvC,QAAM,qBAAqB,CAAC,UAA4C;AACtE,UAAM,YAAY,gBAAgB,KAAK;AACvC,UAAM,gBAAgB,gBAAgB,MAAM,SAAS;AAErD,WACE;AAAA,MAAC;AAAA;AAAA,QAEC,WAAW,aAAa,eAAe,eAAe,EAAE;AAAA,QACxD,SAAS,MAAM,iBAAiB,KAAK;AAAA,QACrC,OAAO;AAAA,UACL,iBAAiB,MAAM,SAAS;AAAA,QAClC;AAAA,QAEA;AAAA,uDAAC,SAAI,WAAU,gBACb;AAAA,wDAAC,SAAI,WAAU,eAAe,gBAAM,MAAK;AAAA,YACzC,6CAAC,SAAI,WAAU,gBACb;AAAA,0DAAC,iBAAc,UAAU,MAAM,UAAU;AAAA,cACzC,4CAAC,iBAAc,UAAU,MAAM,UAAU;AAAA,cACzC,4CAAC,eAAY,QAAQ,MAAM,QAAQ;AAAA,eACrC;AAAA,aACF;AAAA,UAEC,aACC,6CAAC,SAAI,WAAU,cACb;AAAA,wDAAC,UAAK,WAAU,oBAAmB,mBAAK;AAAA,YACxC,4CAAC,UAAK,WAAU,oBAAoB,qBAAU;AAAA,aAChD;AAAA,UAGD,MAAM,eACL,4CAAC,SAAI,WAAU,qBAAqB,gBAAM,aAAY;AAAA,UAGvD,MAAM,YACL,6CAAC,SAAI,WAAU,cACb;AAAA,wDAAC,UAAK,WAAU,oBAAmB,uBAAS;AAAA,YAC5C,4CAAC,UAAK,WAAU,oBAAoB,gBAAM,UAAS;AAAA,aACrD;AAAA,UAGD,iBACC,6CAAC,SAAI,WAAU,cACb;AAAA,wDAAC,UAAK,WAAU,oBAAmB,wBAAU;AAAA,YAC7C,4CAAC,UAAK,WAAU,oBAAoB,yBAAc;AAAA,aACpD;AAAA,UAGD,MAAM,aACL,6CAAC,SAAI,WAAU,cACb;AAAA,wDAAC,UAAK,WAAU,oBAAmB,wBAAU;AAAA,YAC7C,4CAAC,UAAK,WAAU,oBAAoB,gBAAM,WAAU;AAAA,aACtD;AAAA,UAGD,MAAM,SACL,6CAAC,SAAI,WAAU,cACb;AAAA,wDAAC,UAAK,WAAU,oBAAmB,oBAAM;AAAA,YACzC,4CAAC,UAAK,WAAU,oBAAoB,gBAAM,OAAM;AAAA,aAClD;AAAA,UAGD,MAAM,OACL,4CAAC,SAAI,WAAU,cACb;AAAA,YAAC;AAAA;AAAA,cACC,MAAM,MAAM;AAAA,cACZ,QAAO;AAAA,cACP,KAAI;AAAA,cACJ,WAAU;AAAA,cACV,SAAS,OAAK,EAAE,gBAAgB;AAAA,cACjC;AAAA;AAAA,UAED,GACF;AAAA,UAGD,MAAM,QAAQ,MAAM,KAAK,SAAS,KACjC,4CAAC,SAAI,WAAU,cACZ,gBAAM,KAAK,IAAI,CAAC,KAAa,QAC5B,4CAAC,UAAe,WAAU,aACvB,iBADQ,GAEX,CACD,GACH;AAAA;AAAA;AAAA,MA5EG,MAAM,MAAM,MAAM;AAAA,IA8EzB;AAAA,EAEJ;AAEA,QAAM,wBAAwB,MAC5B,4CAAC,SAAI,WAAU,qBAAoB,+CAAiC;AAGtE,SACE,6CAAC,SAAI,WAAW,cAAc,kBAAkB,IAC9C;AAAA,iDAAC,SAAI,WAAU,gBACb;AAAA,kDAAC,QAAI,uBAAY;AAAA,MACjB;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAAS;AAAA,UACT,cAAW;AAAA,UACZ;AAAA;AAAA,MAED;AAAA,OACF;AAAA,IAEC,kBACC,4CAAC,SAAI,WAAU,eAAc,qDAA6B;AAAA,IAG5D,4CAAC,SAAI,WAAU,oBACZ,iBAAO,SAAS,IACb,OAAO;AAAA,MAAI,WACT,cACE;AAAA,QAAC;AAAA;AAAA,UAEC,WAAW,aAAa,eAAe,eAAe,EAAE;AAAA,UACxD,SAAS,MAAM,iBAAiB,KAAK;AAAA,UAEpC,sBAAY,KAAK;AAAA;AAAA,QAJb,MAAM,MAAM,MAAM;AAAA,MAKzB,IAEA,mBAAmB,KAAK;AAAA,IAE5B,IACA,iBACE,eAAe,IACf,sBAAsB,GAC9B;AAAA,KACF;AAEJ;;;AHmBU,IAAAA,sBAAA;AAhNH,IAAM,WAA6C,CAAC;AAAA,EACzD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf,qBAAqB;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,aAAS;AAAA,IACb,MACE,IAAI,eAAe;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,IACH,CAAC,QAAQ,aAAa,SAAS,SAAS,YAAY;AAAA,EACtD;AAEA,QAAM,CAAC,EAAE,WAAW,QAAI,uBAAS,CAAC,CAAC;AACnC,QAAM,eAAW,0BAAY,MAAM,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC;AAGtD,QAAM,CAAC,YAAY,aAAa,QAAI,uBAAS,KAAK;AAClD,QAAM,CAAC,WAAW,YAAY,QAAI,uBAAS,EAAE;AAC7C,QAAM,CAAC,gBAAgB,iBAAiB,QAAI,uBAAS,IAAI;AACzD,QAAM,gBAAY,qBAAuB,IAAI;AAE7C,8BAAU,MAAM;AACd,UAAM,cAAc,OAAO,UAAU,QAAQ;AAC7C,WAAO;AAAA,EACT,GAAG,CAAC,QAAQ,QAAQ,CAAC;AAErB,8BAAU,MAAM;AACd,WAAO,aAAa,MAAM;AAAA,EAC5B,GAAG,CAAC,QAAQ,MAAM,CAAC;AAEnB,8BAAU,MAAM;AACd,WAAO,MAAM;AACX,aAAO,QAAQ;AAAA,IACjB;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,8BAAU,MAAM;AACd,QAAI,OAAO;AACT,YAAM,OAAO,SAAS;AACtB,UAAI,MAAM;AACR,aAAK,MAAM,YAAY,4BAA4B,MAAM,OAAO;AAClE,UAAI,MAAM;AACR,aAAK,MAAM,YAAY,8BAA8B,MAAM,SAAS;AACtE,UAAI,MAAM;AACR,aAAK,MAAM,YAAY,6BAA6B,MAAM,QAAQ;AACpE,UAAI,MAAM;AACR,aAAK,MAAM,YAAY,yBAAyB,MAAM,SAAS;AACjE,UAAI,MAAM;AACR,aAAK,MAAM,YAAY,yBAAyB,MAAM,SAAS;AACjE,UAAI,MAAM;AACR,aAAK,MAAM,YAAY,yBAAyB,MAAM,UAAU;AAClE,UAAI,MAAM;AACR,aAAK,MAAM,YAAY,yBAAyB,MAAM,SAAS;AACjE,UAAI,MAAM;AACR,aAAK,MAAM,YAAY,2BAA2B,MAAM,WAAW;AACrE,UAAI,MAAM;AACR,aAAK,MAAM,YAAY,4BAA4B,MAAM,YAAY;AACvE,UAAI,MAAM;AACR,aAAK,MAAM,YAAY,0BAA0B,MAAM,UAAU;AACnE,UAAI,MAAM;AACR,aAAK,MAAM;AAAA,UACT;AAAA,UACA,MAAM;AAAA,QACR;AAAA,IACJ;AAAA,EACF,GAAG,CAAC,KAAK,CAAC;AAEV,QAAM,YAAY,OAAO,aAAa;AACtC,QAAM,UAAU,OAAO,WAAW;AAClC,QAAM,EAAE,cAAc,MAAM,IAAI;AAEhC,QAAM,kBAAkB,CACtB,UACG;AACH,UAAM,KAAM,MAAM,OAAuB,QAAQ,IAAI;AACrD,QAAI,CAAC,GAAI;AAET,UAAM,KAAK,GAAG;AACd,QAAI,CAAC,GAAI;AAET,UAAM,YAAY,GAAG,WAAW;AAChC,UAAM,WAAW,MAAM,KAAK,GAAG,QAAQ,EAAE,QAAQ,EAAE;AAEnD,UAAM,eAAe,UAAU,cAAc,SAAS,IAAI,QAAQ;AAClE,QAAI,CAAC,aAAc;AAEnB,WAAO,gBAAgB,aAAa,MAAM,QAAQ;AAClD,mBAAe,aAAa,IAAI;AAAA,EAClC;AAEA,QAAM,wBAAoB,0BAAY,MAAM;AAC1C,oBAAgB,UAAU,aAAa,UAAU,YAAY;AAAA,EAC/D,GAAG,CAAC,eAAe,UAAU,aAAa,UAAU,YAAY,CAAC;AAEjE,QAAM,aAAa,MAAM;AACvB,YAAQ,KAAK;AACb,sBAAkB;AAAA,EACpB;AAEA,QAAM,iBAAiB,MAAM;AAC3B,YAAQ,SAAS;AACjB,sBAAkB;AAAA,EACpB;AAEA,QAAM,kBAAkB,MAAM;AAC5B,YAAQ,UAAU;AAClB,kBAAc,KAAK;AACnB,UAAMC,SAAQ,oBAAI,KAAK;AACvB,oBAAgBA,OAAM,YAAY,GAAGA,OAAM,SAAS,CAAC;AAAA,EACvD;AAEA,QAAM,eAAe,MAAM;AACzB,UAAM,UAAU,CAAC;AACjB,kBAAc,OAAO;AACrB,QAAI,SAAS;AACX,mBAAa,OAAO,UAAU,WAAW,CAAC;AAC1C,wBAAkB,IAAI;AAAA,IACxB;AAAA,EACF;AAEA,QAAM,QAAQ,oBAAI,KAAK;AACvB,QAAM,kBAAkB,WAAW,MAAM,YAAY,IAAI;AACzD,QAAM,kBAAkB,WAAW,MAAM,YAAY,IAAI;AAEzD,QAAM,wBAAwB,CAAC,MAA2C;AACxE,UAAM,QAAQ,EAAE,OAAO;AACvB,QAAI,UAAU,MAAM,QAAQ,KAAK,KAAK,GAAG;AACvC,mBAAa,KAAK;AAClB,YAAM,OAAO,SAAS,OAAO,EAAE;AAC/B;AAAA,QACE,UAAU,MAAO,QAAQ,mBAAmB,QAAQ;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AAEA,QAAM,sBAAsB,MAAM;AAChC,UAAM,OAAO,SAAS,WAAW,EAAE;AACnC,QAAI,MAAM,IAAI,KAAK,OAAO,mBAAmB,OAAO,iBAAiB;AACnE,mBAAa,OAAO,UAAU,WAAW,CAAC;AAC1C,wBAAkB,IAAI;AAAA,IACxB,OAAO;AACL,cAAQ,KAAK,MAAM,UAAU,YAAY;AACzC,wBAAkB;AAAA,IACpB;AAAA,EACF;AAEA,QAAM,iBAAiB,MAAM;AAC3B,UAAM,UAAU,UAAU,cAAc;AACxC,QAAI,WAAW,iBAAiB;AAC9B,cAAQ,KAAK,SAAS,UAAU,YAAY;AAC5C,mBAAa,OAAO,OAAO,CAAC;AAC5B,wBAAkB;AAAA,IACpB;AAAA,EACF;AAEA,QAAM,iBAAiB,MAAM;AAC3B,UAAM,UAAU,UAAU,cAAc;AACxC,QAAI,WAAW,iBAAiB;AAC9B,cAAQ,KAAK,SAAS,UAAU,YAAY;AAC5C,mBAAa,OAAO,OAAO,CAAC;AAC5B,wBAAkB;AAAA,IACpB;AAAA,EACF;AAEA,QAAM,oBAAoB,CAAC,UAAkB;AAC3C,YAAQ,KAAK,UAAU,aAAa,KAAK;AACzC,kBAAc,KAAK;AACnB,sBAAkB;AAAA,EACpB;AAGA,8BAAU,MAAM;AACd,UAAM,qBAAqB,CAAC,UAAsB;AAChD,UACE,UAAU,WACV,CAAC,UAAU,QAAQ,SAAS,MAAM,MAAc,GAChD;AACA,sBAAc,KAAK;AAAA,MACrB;AAAA,IACF;AAEA,QAAI,YAAY;AACd,eAAS,iBAAiB,aAAa,kBAAkB;AAAA,IAC3D;AACA,WAAO,MAAM,SAAS,oBAAoB,aAAa,kBAAkB;AAAA,EAC3E,GAAG,CAAC,UAAU,CAAC;AAEf,SACE,8CAAC,SAAI,WAAW,qBAAqB,SAAS,IAAI,OAC/C;AAAA,aACC,6CAAC,SAAI,WAAU,eACb,uDAAC,QAAI,iBAAM,GACb;AAAA,IAGF,6CAAC,SAAI,WAAU,qBACb,wDAAC,SAAI,WAAU,kBAEb;AAAA,oDAAC,SAAI,WAAU,wBACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS;AAAA,YACT,cAAW;AAAA,YACZ;AAAA;AAAA,QAED;AAAA,QAEA,8CAAC,SAAI,WAAU,8BAA6B,KAAK,WAC/C;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,SAAS;AAAA,cAER,GAAG,EAAE,iBAAiB,WAAW;AAAA,cAClC,iBAAc;AAAA,cAEb;AAAA,qCACG,GAAG,OAAO,UAAU,YAAY,CAAC,IAAI,UAAU,WAAW,KAC1D,UAAU;AAAA,gBACd,6CAAC,UAAK,WAAU,4BAA2B,oBAAO;AAAA;AAAA;AAAA,UACpD;AAAA,UAEC,cACC,8CAAC,SAAI,WAAU,6BACb;AAAA,0DAAC,SAAI,WAAU,6BACb;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,SAAS;AAAA,kBACT,UAAU,UAAU,eAAe;AAAA,kBACnC,cAAW;AAAA,kBACZ;AAAA;AAAA,cAED;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAW,8BAA8B,CAAC,iBAAiB,aAAa,EAAE;AAAA,kBAC1E,OAAO;AAAA,kBACP,UAAU;AAAA,kBACV,QAAQ;AAAA,kBACR,WAAW,OAAK;AACd,wBAAI,EAAE,QAAQ,QAAS,qBAAoB;AAAA,kBAC7C;AAAA,kBACA,cAAW;AAAA;AAAA,cACb;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,SAAS;AAAA,kBACT,UAAU,UAAU,eAAe;AAAA,kBACnC,cAAW;AAAA,kBACZ;AAAA;AAAA,cAED;AAAA,eACF;AAAA,YAEA,6CAAC,SAAI,WAAU,2BACX,gCAAqB,SAAS,aAAa;AAAA,cAC3C,CAAC,OAAO,UAAU;AAChB,sBAAM,aAAa,UAAU,UAAU;AACvC,sBAAM,iBACJ,UAAU,MAAM,SAAS,KACzB,UAAU,gBAAgB,MAAM,YAAY;AAC9C,uBACE;AAAA,kBAAC;AAAA;AAAA,oBAEC,MAAK;AAAA,oBACL,WAAW,yBAAyB,aAAa,cAAc,EAAE,GAAG,iBAAiB,mBAAmB,EAAE;AAAA,oBAC1G,SAAS,MAAM,kBAAkB,KAAK;AAAA,oBAErC;AAAA;AAAA,kBALI;AAAA,gBAMP;AAAA,cAEJ;AAAA,YACF,GACF;AAAA,aACF;AAAA,WAEJ;AAAA,QAEA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS;AAAA,YACT,UAAU,QAAQ,eAAe;AAAA,YAClC;AAAA;AAAA,QAED;AAAA,QAEA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS;AAAA,YACT,cAAW;AAAA,YACZ;AAAA;AAAA,QAED;AAAA,SACF;AAAA,MAEA,8CAAC,WAAM,WAAU,6CACf;AAAA,qDAAC,WACC,uDAAC,QACE,oBAAU,KAAK,IAAI,SAClB,6CAAC,QAAc,cAAI,MAAM,GAAG,CAAC,KAApB,GAAsB,CAChC,GACH,GACF;AAAA,QACA,6CAAC,WAAM,SAAS,iBACb,oBAAU,cAAc,IAAI,CAAC,MAAM,cAClC,6CAAC,QACE,eAAK,IAAI,CAAC,cAAc,aAAa;AACpC,gBAAM,cAAc,eAAe,YAAY;AAC/C,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,WAAW,YAAY,KAAK,GAAG;AAAA,cAE9B,uBAAa,KAAK,QAAQ;AAAA;AAAA,YAHtB,GAAG,SAAS,IAAI,QAAQ;AAAA,UAI/B;AAAA,QAEJ,CAAC,KAXM,SAYT,CACD,GACH;AAAA,SACF;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW,CAAC,CAAC;AAAA,UACb;AAAA,UACA,QAAQ;AAAA,UACR,aAAa,UAAU;AAAA,UACvB,oBAAoB,UAAU;AAAA,UAC9B,SAAS,MAAM,OAAO,eAAe;AAAA,UACrC;AAAA,UACA;AAAA,UACA;AAAA;AAAA,MACF;AAAA,OACF,GACF;AAAA,KACF;AAEJ;","names":["import_jsx_runtime","today"]}
|