kalendly 0.1.7 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +317 -681
- package/dist/core/index.js +3 -3
- package/dist/index.d.mts +48 -602
- package/dist/index.d.ts +48 -602
- package/dist/index.js +753 -2359
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +727 -2348
- package/dist/index.mjs.map +1 -1
- package/dist/{vanilla/index.umd.js → index.umd.js} +218 -218
- package/dist/index.umd.js.map +1 -0
- package/package.json +41 -91
- 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/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/utils.ts","../src/core/calendar-engine.ts","../src/react/index.tsx","../src/react/components/Calendar.tsx","../src/react/components/DatePopup.tsx","../src/react-native/index.tsx","../src/react-native/components/Calendar.tsx","../src/react-native/components/DatePopup.tsx","../src/styles/react-native-styles.ts","../src/vanilla/index.ts","../src/vanilla/Calendar.ts","../src/index.ts"],"sourcesContent":["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","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 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","export { Calendar } from './components/Calendar';\nexport { DatePopup } from './components/DatePopup';\nexport * from './types';\nexport { calendarStyles } from '../styles/react-native-styles';\n\n// Re-export core types and utilities for convenience\nexport * from '../core';\n","import React, { useEffect, useState, useCallback, useMemo } from 'react';\nimport {\n View,\n Text,\n TouchableOpacity,\n ScrollView,\n TextInput,\n Modal,\n Pressable,\n Dimensions,\n StyleSheet,\n} from 'react-native';\nimport {\n CalendarEngine,\n getCellClasses,\n MONTHS_FULL,\n MONTHS,\n} from '../../core';\nimport { CalendarComponentProps } from '../types';\nimport { DatePopup } from './DatePopup';\nimport {\n getResponsiveStyles,\n CalendarColors,\n} from '../../styles/react-native-styles';\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 style,\n containerStyle,\n headerStyle,\n headerTextStyle,\n cellStyle,\n cellTextStyle,\n renderEvent,\n renderNoEvents,\n title,\n showCloseButton = true,\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 // Map CalendarTheme to CalendarColors format\n const themeColors = useMemo<Partial<CalendarColors> | undefined>(() => {\n if (!theme) return undefined;\n return {\n primary: theme.primary,\n secondary: theme.secondary,\n tertiary: theme.tertiary,\n text: theme.textColor,\n border: theme.borderColor,\n todayOutline: theme.todayOutline,\n eventIndicator: theme.eventIndicator,\n background: theme.background,\n };\n }, [theme]);\n\n // Generate responsive styles based on screen dimensions and theme\n const calendarStyles = useMemo(() => {\n const { width, height } = Dimensions.get('window');\n return getResponsiveStyles(width, height, themeColors);\n }, [themeColors]);\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\n const today = new Date();\n const todayMonth = today.getMonth();\n const todayYear = today.getFullYear();\n const computedMinYear = minYear ?? todayYear - 30;\n const computedMaxYear = maxYear ?? todayYear + 10;\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 const viewModel = engine.getViewModel();\n const actions = engine.getActions();\n const { selectedDate, tasks } = viewModel;\n\n const isCurrentMonth =\n viewModel.currentYear === todayYear &&\n viewModel.currentMonth === todayMonth;\n\n const handleDatePress = (date: Date, dayIndex: number) => {\n engine.handleDateClick(date, dayIndex);\n onDateSelect?.(date);\n };\n\n const handleNext = () => {\n actions.next();\n onMonthChange?.(viewModel.currentYear, viewModel.currentMonth);\n };\n\n const handlePrevious = () => {\n actions.previous();\n onMonthChange?.(viewModel.currentYear, viewModel.currentMonth);\n };\n\n const handleGoToToday = () => {\n actions.goToToday();\n setPickerOpen(false);\n onMonthChange?.(todayYear, todayMonth);\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 handleYearInputChange = (value: string) => {\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 handleYearInputSubmit = () => {\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 onMonthChange?.(year, viewModel.currentMonth);\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 onMonthChange?.(newYear, viewModel.currentMonth);\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 onMonthChange?.(newYear, viewModel.currentMonth);\n }\n };\n\n const handleMonthSelect = (month: number) => {\n actions.jump(viewModel.currentYear, month);\n setPickerOpen(false);\n onMonthChange?.(viewModel.currentYear, month);\n };\n\n const closePopup = () => {\n engine.clearSelection();\n };\n\n return (\n <ScrollView style={[calendarStyles.container, containerStyle]}>\n {title && (\n <View style={calendarStyles.titleContainer}>\n <Text style={calendarStyles.title}>{title}</Text>\n </View>\n )}\n\n <View style={[calendarStyles.contentContainer, style]}>\n <View style={calendarStyles.card}>\n {/* Navigation Header */}\n <View style={[pickerStyles.navHeader, headerStyle]}>\n <TouchableOpacity\n style={pickerStyles.navArrow}\n onPress={handlePrevious}\n >\n <Text style={pickerStyles.navArrowText}>‹</Text>\n </TouchableOpacity>\n\n <TouchableOpacity\n style={pickerStyles.pickerBtn}\n onPress={togglePicker}\n >\n <Text style={[pickerStyles.pickerBtnText, headerTextStyle]}>\n {useShortMonthNames\n ? `${MONTHS[viewModel.currentMonth]} ${viewModel.currentYear}`\n : viewModel.monthAndYearText}\n </Text>\n <Text style={pickerStyles.chevron}>▼</Text>\n </TouchableOpacity>\n\n <TouchableOpacity\n style={[\n pickerStyles.todayBtn,\n isCurrentMonth && pickerStyles.todayBtnDisabled,\n ]}\n onPress={handleGoToToday}\n disabled={isCurrentMonth}\n >\n <Text\n style={[\n pickerStyles.todayBtnText,\n isCurrentMonth && pickerStyles.todayBtnTextDisabled,\n ]}\n >\n Today\n </Text>\n </TouchableOpacity>\n\n <TouchableOpacity\n style={pickerStyles.navArrow}\n onPress={handleNext}\n >\n <Text style={pickerStyles.navArrowText}>›</Text>\n </TouchableOpacity>\n </View>\n\n {/* Month/Year Picker Modal */}\n <Modal\n visible={pickerOpen}\n transparent\n animationType=\"fade\"\n onRequestClose={() => setPickerOpen(false)}\n >\n <Pressable\n style={pickerStyles.modalOverlay}\n onPress={() => setPickerOpen(false)}\n >\n <Pressable\n style={pickerStyles.pickerDropdown}\n onPress={e => e.stopPropagation()}\n >\n {/* Year Selector */}\n <View style={pickerStyles.yearRow}>\n <TouchableOpacity\n style={pickerStyles.yearArrow}\n onPress={handleYearPrev}\n disabled={viewModel.currentYear <= computedMinYear}\n >\n <Text\n style={[\n pickerStyles.yearArrowText,\n viewModel.currentYear <= computedMinYear &&\n pickerStyles.yearArrowDisabled,\n ]}\n >\n ‹\n </Text>\n </TouchableOpacity>\n\n <TextInput\n style={[\n pickerStyles.yearInput,\n !yearInputValid && pickerStyles.yearInputInvalid,\n ]}\n value={yearInput}\n onChangeText={handleYearInputChange}\n onSubmitEditing={handleYearInputSubmit}\n onBlur={handleYearInputSubmit}\n keyboardType=\"number-pad\"\n maxLength={4}\n />\n\n <TouchableOpacity\n style={pickerStyles.yearArrow}\n onPress={handleYearNext}\n disabled={viewModel.currentYear >= computedMaxYear}\n >\n <Text\n style={[\n pickerStyles.yearArrowText,\n viewModel.currentYear >= computedMaxYear &&\n pickerStyles.yearArrowDisabled,\n ]}\n >\n ›\n </Text>\n </TouchableOpacity>\n </View>\n\n {/* Month Grid */}\n <View style={pickerStyles.monthGrid}>\n {(useShortMonthNames ? MONTHS : MONTHS_FULL).map(\n (month, index) => {\n const isSelected = index === viewModel.currentMonth;\n const isCurrent =\n index === todayMonth &&\n viewModel.currentYear === todayYear;\n return (\n <TouchableOpacity\n key={month}\n style={[\n pickerStyles.monthBtn,\n isSelected && pickerStyles.monthBtnSelected,\n isCurrent && pickerStyles.monthBtnCurrent,\n ]}\n onPress={() => handleMonthSelect(index)}\n >\n <Text\n style={[\n pickerStyles.monthBtnText,\n isSelected && pickerStyles.monthBtnTextSelected,\n ]}\n >\n {month}\n </Text>\n </TouchableOpacity>\n );\n }\n )}\n </View>\n </Pressable>\n </Pressable>\n </Modal>\n\n <View style={calendarStyles.table}>\n {/* Table Header */}\n <View style={calendarStyles.tableHeader}>\n {viewModel.days.map(day => (\n <View key={day} style={calendarStyles.tableHeaderCell}>\n <Text style={calendarStyles.tableHeaderText}>\n {day.slice(0, 3)}\n </Text>\n </View>\n ))}\n </View>\n\n {/* Calendar Rows */}\n {viewModel.calendarDates.map((week, weekIndex) => (\n <View key={weekIndex} style={calendarStyles.tableRow}>\n {week.map((calendarDate, dayIndex) => {\n const cellClasses = getCellClasses(calendarDate);\n const isToday = cellClasses.includes(\n 'schedule--current--exam'\n );\n const hasEvents = cellClasses.includes('has--event');\n const isOtherMonth = cellClasses.includes('other-month');\n\n return (\n <TouchableOpacity\n key={`${weekIndex}-${dayIndex}`}\n style={[\n calendarStyles.tableCell,\n cellStyle,\n isToday && calendarStyles.cellToday,\n hasEvents && calendarStyles.cellWithEvents,\n isOtherMonth && pickerStyles.cellOtherMonth,\n ]}\n onPress={() => {\n handleDatePress(calendarDate.date, dayIndex);\n }}\n >\n <Text\n style={[\n calendarStyles.tableCellText,\n cellTextStyle,\n isToday && calendarStyles.cellTodayText,\n isOtherMonth && pickerStyles.cellOtherMonthText,\n ]}\n >\n {calendarDate.date.getDate()}\n </Text>\n {hasEvents && (\n <View style={calendarStyles.eventIndicator} />\n )}\n </TouchableOpacity>\n );\n })}\n </View>\n ))}\n </View>\n </View>\n </View>\n\n <DatePopup\n visible={!!selectedDate}\n selectedDate={selectedDate}\n events={tasks}\n scheduleDay={viewModel.scheduleDay}\n onClose={closePopup}\n onEventClick={onEventClick}\n renderEvent={renderEvent}\n renderNoEvents={renderNoEvents}\n showCloseButton={showCloseButton}\n />\n </ScrollView>\n );\n};\n\n// Picker styles for React Native\nconst pickerStyles = StyleSheet.create({\n navHeader: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n paddingVertical: 12,\n paddingHorizontal: 8,\n backgroundColor: '#f8f9fa',\n borderBottomWidth: 2,\n borderBottomColor: '#dee2e6',\n gap: 8,\n },\n navArrow: {\n width: 36,\n height: 36,\n borderRadius: 6,\n borderWidth: 1,\n borderColor: '#dee2e6',\n backgroundColor: '#fff',\n alignItems: 'center',\n justifyContent: 'center',\n },\n navArrowText: {\n fontSize: 20,\n color: '#2c3e50',\n },\n pickerBtn: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 16,\n paddingVertical: 8,\n borderRadius: 6,\n borderWidth: 1,\n borderColor: '#dee2e6',\n backgroundColor: '#fff',\n gap: 8,\n },\n pickerBtnText: {\n fontSize: 16,\n fontWeight: '600',\n color: '#2c3e50',\n },\n chevron: {\n fontSize: 10,\n color: '#2c3e50',\n },\n todayBtn: {\n paddingHorizontal: 16,\n paddingVertical: 8,\n borderRadius: 6,\n borderWidth: 1,\n borderColor: '#dee2e6',\n backgroundColor: '#fff',\n },\n todayBtnDisabled: {\n opacity: 0.5,\n },\n todayBtnText: {\n fontSize: 14,\n fontWeight: '500',\n color: '#2c3e50',\n },\n todayBtnTextDisabled: {\n color: '#9ca3af',\n },\n modalOverlay: {\n flex: 1,\n backgroundColor: 'rgba(0, 0, 0, 0.3)',\n justifyContent: 'center',\n alignItems: 'center',\n },\n pickerDropdown: {\n backgroundColor: '#fff',\n borderRadius: 12,\n padding: 16,\n minWidth: 280,\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 4 },\n shadowOpacity: 0.15,\n shadowRadius: 20,\n elevation: 10,\n },\n yearRow: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 12,\n marginBottom: 16,\n paddingBottom: 12,\n borderBottomWidth: 1,\n borderBottomColor: '#dee2e6',\n },\n yearArrow: {\n width: 32,\n height: 32,\n borderRadius: 6,\n backgroundColor: '#f3f4f6',\n alignItems: 'center',\n justifyContent: 'center',\n },\n yearArrowText: {\n fontSize: 18,\n fontWeight: '600',\n color: '#2c3e50',\n },\n yearArrowDisabled: {\n opacity: 0.3,\n },\n yearInput: {\n width: 80,\n paddingVertical: 6,\n paddingHorizontal: 8,\n borderRadius: 6,\n borderWidth: 1,\n borderColor: '#dee2e6',\n textAlign: 'center',\n fontSize: 18,\n fontWeight: '600',\n color: '#2c3e50',\n },\n yearInputInvalid: {\n borderColor: '#ef4444',\n backgroundColor: '#fef2f2',\n },\n monthGrid: {\n flexDirection: 'row',\n flexWrap: 'wrap',\n gap: 8,\n },\n monthBtn: {\n width: '30%',\n paddingVertical: 10,\n borderRadius: 6,\n backgroundColor: '#f9fafb',\n alignItems: 'center',\n },\n monthBtnSelected: {\n backgroundColor: '#fc8917',\n },\n monthBtnCurrent: {\n borderWidth: 1,\n borderColor: '#fc8917',\n },\n monthBtnText: {\n fontSize: 14,\n fontWeight: '500',\n color: '#2c3e50',\n },\n monthBtnTextSelected: {\n color: '#fff',\n fontWeight: '600',\n },\n cellOtherMonth: {\n backgroundColor: '#f9fafb',\n },\n cellOtherMonthText: {\n color: '#9ca3af',\n },\n});\n","import React from 'react';\nimport {\n Modal,\n View,\n Text,\n TouchableOpacity,\n ScrollView,\n Linking,\n useWindowDimensions,\n ViewStyle,\n TextStyle,\n} from 'react-native';\nimport { DatePopupProps } from '../types';\nimport { getResponsiveStyles } from '../../styles/react-native-styles';\nimport { formatTimeRange, formatAttendees } from '../../core/utils';\n\ntype BadgeStyles = {\n badge: ViewStyle;\n badgeText: TextStyle;\n priorityBadgeHigh: ViewStyle;\n priorityBadgeMedium: ViewStyle;\n priorityBadgeLow: ViewStyle;\n statusBadgeCompleted: ViewStyle;\n statusBadgeCancelled: ViewStyle;\n statusBadgeTentative: ViewStyle;\n categoryBadgeWork: ViewStyle;\n categoryBadgePersonal: ViewStyle;\n categoryBadgeMeeting: ViewStyle;\n categoryBadgeDeadline: ViewStyle;\n categoryBadgeAppointment: ViewStyle;\n categoryBadgeOther: ViewStyle;\n};\n\nconst PriorityBadge: React.FC<{ priority?: string; styles: BadgeStyles }> = ({\n priority,\n styles,\n}) => {\n if (!priority) return null;\n\n const priorityConfig: Record<string, { label: string; style: ViewStyle }> = {\n high: { label: 'HIGH', style: styles.priorityBadgeHigh },\n medium: { label: 'MEDIUM', style: styles.priorityBadgeMedium },\n low: { label: 'LOW', style: styles.priorityBadgeLow },\n };\n\n const config = priorityConfig[priority];\n if (!config) return null;\n\n return (\n <View style={[styles.badge, config.style]}>\n <Text style={styles.badgeText}>{config.label}</Text>\n </View>\n );\n};\n\nconst StatusBadge: React.FC<{ status?: string; styles: BadgeStyles }> = ({\n status,\n styles,\n}) => {\n if (!status || status === 'scheduled') return null;\n\n const statusConfig: Record<string, { label: string; style: ViewStyle }> = {\n completed: { label: 'COMPLETED', style: styles.statusBadgeCompleted },\n cancelled: { label: 'CANCELLED', style: styles.statusBadgeCancelled },\n tentative: { label: 'TENTATIVE', style: styles.statusBadgeTentative },\n };\n\n const config = statusConfig[status];\n if (!config) return null;\n\n return (\n <View style={[styles.badge, config.style]}>\n <Text style={styles.badgeText}>{config.label}</Text>\n </View>\n );\n};\n\nconst CategoryBadge: React.FC<{ category?: string; styles: BadgeStyles }> = ({\n category,\n styles,\n}) => {\n if (!category) return null;\n\n const categoryConfig: Record<string, { label: string; style: ViewStyle }> = {\n work: { label: 'WORK', style: styles.categoryBadgeWork },\n personal: { label: 'PERSONAL', style: styles.categoryBadgePersonal },\n meeting: { label: 'MEETING', style: styles.categoryBadgeMeeting },\n deadline: { label: 'DEADLINE', style: styles.categoryBadgeDeadline },\n appointment: {\n label: 'APPOINTMENT',\n style: styles.categoryBadgeAppointment,\n },\n other: { label: 'OTHER', style: styles.categoryBadgeOther },\n };\n\n const config = categoryConfig[category];\n if (!config) return null;\n\n return (\n <View style={[styles.badge, config.style]}>\n <Text style={styles.badgeText}>{config.label}</Text>\n </View>\n );\n};\n\nexport const DatePopup: React.FC<DatePopupProps> = ({\n visible,\n selectedDate,\n events,\n scheduleDay,\n onClose,\n onEventClick,\n renderEvent,\n renderNoEvents,\n showCloseButton = true,\n}) => {\n const { width, height } = useWindowDimensions();\n const calendarStyles = getResponsiveStyles(width, height);\n\n if (!selectedDate) return null;\n\n const showScrollHint = events.length > 3;\n\n const handleEventClick = (event: DatePopupProps['events'][number]) => {\n onEventClick?.(event);\n };\n\n const defaultRenderEvent = (event: DatePopupProps['events'][number]) => {\n const timeRange = formatTimeRange(event);\n const attendeesList = formatAttendees(event.attendees);\n\n const handleUrlPress = () => {\n if (event.url) {\n Linking.openURL(event.url).catch(err =>\n console.error('Failed to open URL:', err)\n );\n }\n };\n\n const eventContent = (\n <>\n <View style={calendarStyles.eventHeader}>\n <Text style={calendarStyles.eventTitle}>{event.name}</Text>\n <View style={calendarStyles.eventBadges}>\n <CategoryBadge category={event.category} styles={calendarStyles} />\n <PriorityBadge priority={event.priority} styles={calendarStyles} />\n <StatusBadge status={event.status} styles={calendarStyles} />\n </View>\n </View>\n\n {timeRange && (\n <View style={calendarStyles.eventTime}>\n <Text style={calendarStyles.eventTimeLabel}>Time:</Text>\n <Text style={calendarStyles.eventTimeValue}>{timeRange}</Text>\n </View>\n )}\n\n {event.description && (\n <Text style={calendarStyles.eventDescription}>\n {event.description}\n </Text>\n )}\n\n {event.location && (\n <View style={calendarStyles.eventTime}>\n <Text style={calendarStyles.eventTimeLabel}>Location:</Text>\n <Text style={calendarStyles.eventTimeValue}>{event.location}</Text>\n </View>\n )}\n\n {attendeesList && (\n <View style={calendarStyles.eventTime}>\n <Text style={calendarStyles.eventTimeLabel}>Attendees:</Text>\n <Text style={calendarStyles.eventTimeValue}>{attendeesList}</Text>\n </View>\n )}\n\n {event.organizer && (\n <View style={calendarStyles.eventTime}>\n <Text style={calendarStyles.eventTimeLabel}>Organizer:</Text>\n <Text style={calendarStyles.eventTimeValue}>{event.organizer}</Text>\n </View>\n )}\n\n {event.notes && (\n <View style={calendarStyles.eventTime}>\n <Text style={calendarStyles.eventTimeLabel}>Notes:</Text>\n <Text style={calendarStyles.eventTimeValue}>{event.notes}</Text>\n </View>\n )}\n\n {event.url && (\n <TouchableOpacity\n onPress={handleUrlPress}\n style={calendarStyles.eventUrlContainer}\n >\n <Text style={calendarStyles.eventLink}>View Details →</Text>\n </TouchableOpacity>\n )}\n\n {event.tags && event.tags.length > 0 && (\n <View style={calendarStyles.eventTags}>\n {event.tags.map((tag: string, idx: number) => (\n <View key={idx} style={calendarStyles.eventTag}>\n <Text style={calendarStyles.eventTagText}>{tag}</Text>\n </View>\n ))}\n </View>\n )}\n </>\n );\n\n if (onEventClick) {\n return (\n <TouchableOpacity\n key={event.id || event.name}\n style={[\n calendarStyles.eventCard,\n event.color && { borderLeftColor: event.color },\n ]}\n onPress={() => handleEventClick(event)}\n activeOpacity={0.7}\n >\n {eventContent}\n </TouchableOpacity>\n );\n }\n\n return (\n <View\n key={event.id || event.name}\n style={[\n calendarStyles.eventCard,\n event.color && { borderLeftColor: event.color },\n ]}\n >\n {eventContent}\n </View>\n );\n };\n\n const defaultRenderNoEvents = () => (\n <View style={calendarStyles.noEventsMessage}>\n <Text style={calendarStyles.noEventsText}>\n No events scheduled for this day.\n </Text>\n </View>\n );\n\n return (\n <Modal\n visible={visible}\n transparent\n animationType=\"fade\"\n onRequestClose={onClose}\n >\n <TouchableOpacity\n style={calendarStyles.popupOverlay}\n activeOpacity={1}\n onPress={onClose}\n >\n <TouchableOpacity\n style={calendarStyles.popup}\n activeOpacity={1}\n onPress={e => e.stopPropagation()}\n >\n <View style={calendarStyles.popupHeader}>\n <Text style={calendarStyles.popupHeaderText}>{scheduleDay}</Text>\n {showCloseButton && (\n <TouchableOpacity\n style={calendarStyles.popupCloseButton}\n onPress={onClose}\n accessibilityLabel=\"Close\"\n >\n <Text style={calendarStyles.popupCloseText}>✕</Text>\n </TouchableOpacity>\n )}\n </View>\n\n {showScrollHint && (\n <View style={calendarStyles.scrollHint}>\n <Text style={calendarStyles.scrollHintText}>\n ↓ Scroll to see more events ↓\n </Text>\n </View>\n )}\n\n <ScrollView\n style={calendarStyles.eventsContainer}\n showsVerticalScrollIndicator={true}\n >\n {events.length > 0 ? (\n <View style={calendarStyles.eventsList}>\n {events.map(event =>\n renderEvent ? renderEvent(event) : defaultRenderEvent(event)\n )}\n </View>\n ) : renderNoEvents ? (\n renderNoEvents()\n ) : (\n defaultRenderNoEvents()\n )}\n </ScrollView>\n </TouchableOpacity>\n </TouchableOpacity>\n </Modal>\n );\n};\n","import { StyleSheet } from 'react-native';\n\nexport const defaultColors = {\n primary: '#fc8917',\n secondary: '#fca045',\n tertiary: '#fdb873',\n text: '#2c3e50',\n border: '#dee2e6',\n todayOutline: '#f7db04',\n eventIndicator: '#1890ff',\n background: '#fff',\n white: '#ffffff',\n scrollHint: '#fff3e0',\n scrollHintText: '#f59e0b',\n};\n\nexport type CalendarColors = typeof defaultColors;\n\nexport const getResponsiveStyles = (\n width: number,\n height: number,\n customColors?: Partial<CalendarColors>\n) => {\n const colors = { ...defaultColors, ...customColors };\n // Device type detection\n const isTablet = width >= 768;\n const isSmallPhone = width < 375;\n const isPhone = width < 768;\n\n // Responsive dimensions\n const cellSize = (width - 60) / 7;\n\n // Popup dimensions based on device type\n const popupWidth = isTablet ? 500 : isPhone ? width * 0.95 : width * 0.9;\n const popupMaxWidth = isTablet ? 500 : isPhone ? width : 400;\n const popupMaxHeight = isTablet ? height * 0.8 : height * 0.85;\n\n // Font sizes\n const headerFontSize = isTablet ? 18 : isSmallPhone ? 15 : 16;\n const eventTitleSize = isTablet ? 16 : isSmallPhone ? 14 : 15;\n const eventDetailSize = isTablet ? 13 : isSmallPhone ? 11 : 12;\n const badgeFontSize = isTablet ? 10 : isSmallPhone ? 9 : 9;\n\n // Padding\n const eventCardPadding = isTablet ? 14 : isSmallPhone ? 10 : 12;\n const containerPadding = isTablet ? 15 : isSmallPhone ? 10 : 12;\n\n return StyleSheet.create({\n container: {\n flex: 1,\n backgroundColor: colors.background,\n },\n\n titleContainer: {\n paddingVertical: 20,\n alignItems: 'center',\n },\n\n title: {\n fontSize: 24,\n fontWeight: '600',\n color: colors.text,\n },\n\n contentContainer: {\n marginHorizontal: 20,\n marginTop: 20,\n },\n\n card: {\n backgroundColor: colors.background,\n borderRadius: 8,\n shadowColor: '#000',\n shadowOffset: {\n width: 0,\n height: 2,\n },\n shadowOpacity: 0.1,\n shadowRadius: 3.84,\n elevation: 5,\n overflow: 'hidden',\n },\n\n cardHeader: {\n backgroundColor: colors.tertiary,\n paddingVertical: 15,\n paddingHorizontal: 20,\n borderBottomWidth: 1,\n borderBottomColor: colors.border,\n },\n\n cardHeaderText: {\n fontSize: 18,\n fontWeight: '500',\n color: colors.text,\n textAlign: 'center',\n },\n\n table: {\n backgroundColor: colors.background,\n },\n\n tableHeader: {\n flexDirection: 'row',\n backgroundColor: 'rgba(252, 137, 23, 0.1)',\n borderBottomWidth: 2,\n borderBottomColor: colors.border,\n },\n\n tableHeaderCell: {\n flex: 1,\n paddingVertical: 12,\n borderRightWidth: 1,\n borderRightColor: colors.border,\n alignItems: 'center',\n justifyContent: 'center',\n },\n\n tableHeaderText: {\n fontSize: 14,\n fontWeight: '600',\n color: colors.text,\n },\n\n tableRow: {\n flexDirection: 'row',\n borderBottomWidth: 1,\n borderBottomColor: colors.border,\n },\n\n tableCell: {\n flex: 1,\n height: cellSize,\n borderRightWidth: 1,\n borderRightColor: colors.border,\n alignItems: 'center',\n justifyContent: 'center',\n position: 'relative',\n },\n\n tableCellText: {\n fontSize: 16,\n color: colors.text,\n },\n\n cellToday: {\n borderWidth: 2,\n borderColor: colors.todayOutline,\n },\n\n cellTodayText: {\n fontWeight: 'bold',\n },\n\n cellWithEvents: {\n backgroundColor: 'rgba(252, 160, 69, 0.3)',\n },\n\n eventIndicator: {\n position: 'absolute',\n bottom: 2,\n width: 4,\n height: 4,\n backgroundColor: colors.eventIndicator,\n borderRadius: 2,\n },\n\n navigationContainer: {\n flexDirection: 'row',\n justifyContent: 'space-between',\n paddingHorizontal: 20,\n paddingVertical: 20,\n gap: 15,\n },\n\n navigationButton: {\n flex: 1,\n backgroundColor: 'transparent',\n borderWidth: 1,\n borderColor: colors.primary,\n borderRadius: 6,\n paddingVertical: 12,\n paddingHorizontal: 16,\n alignItems: 'center',\n justifyContent: 'center',\n },\n\n navigationButtonText: {\n color: colors.primary,\n fontSize: 16,\n fontWeight: '500',\n },\n\n navigationButtonPressed: {\n backgroundColor: colors.primary,\n },\n\n navigationButtonTextPressed: {\n color: colors.white,\n },\n\n jumpForm: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n paddingHorizontal: 20,\n paddingBottom: 20,\n gap: 10,\n },\n\n jumpLabel: {\n fontSize: 18,\n fontWeight: '300',\n color: colors.text,\n },\n\n jumpSelect: {\n borderWidth: 1,\n borderColor: colors.border,\n borderRadius: 6,\n paddingHorizontal: 12,\n paddingVertical: 8,\n backgroundColor: colors.background,\n minWidth: 80,\n },\n\n jumpSelectText: {\n fontSize: 16,\n color: colors.text,\n textAlign: 'center',\n },\n\n // RESPONSIVE POPUP STYLES\n popupOverlay: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n justifyContent: 'center',\n alignItems: 'center',\n zIndex: 1000,\n },\n\n popup: {\n backgroundColor: colors.white,\n borderRadius: 8,\n width: popupWidth,\n maxWidth: popupMaxWidth,\n maxHeight: popupMaxHeight,\n shadowColor: '#000',\n shadowOffset: {\n width: 0,\n height: 4,\n },\n shadowOpacity: 0.3,\n shadowRadius: 6,\n elevation: 8,\n overflow: 'hidden',\n },\n\n popupHeader: {\n backgroundColor: colors.primary,\n paddingVertical: isTablet ? 15 : 12,\n paddingHorizontal: isTablet ? 20 : 15,\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n },\n\n popupHeaderText: {\n fontSize: headerFontSize,\n fontWeight: '600',\n color: colors.white,\n flex: 1,\n },\n\n popupCloseButton: {\n width: isTablet ? 32 : isSmallPhone ? 26 : 28,\n height: isTablet ? 32 : isSmallPhone ? 26 : 28,\n backgroundColor: 'rgba(255, 255, 255, 0.2)',\n borderRadius: 16,\n alignItems: 'center',\n justifyContent: 'center',\n },\n\n popupCloseText: {\n color: colors.white,\n fontSize: isTablet ? 20 : isSmallPhone ? 16 : 18,\n fontWeight: 'bold',\n },\n\n scrollHint: {\n backgroundColor: colors.scrollHint,\n paddingVertical: isTablet ? 10 : 8,\n paddingHorizontal: containerPadding,\n alignItems: 'center',\n },\n\n scrollHintText: {\n color: colors.scrollHintText,\n fontSize: isTablet ? 13 : isSmallPhone ? 11 : 12,\n fontWeight: '500',\n },\n\n eventsContainer: {\n maxHeight: popupMaxHeight - 150,\n },\n\n eventsList: {\n padding: containerPadding,\n gap: isTablet ? 12 : 10,\n },\n\n eventCard: {\n backgroundColor: colors.white,\n borderRadius: 6,\n padding: eventCardPadding,\n borderLeftWidth: 4,\n borderLeftColor: colors.primary,\n borderWidth: 1,\n borderColor: '#e5e7eb',\n shadowColor: '#000',\n shadowOffset: {\n width: 0,\n height: 1,\n },\n shadowOpacity: 0.05,\n shadowRadius: 2,\n elevation: 1,\n },\n\n eventHeader: {\n marginBottom: 10,\n },\n\n eventTitle: {\n fontSize: eventTitleSize,\n color: '#1f2937',\n fontWeight: '600',\n marginBottom: 8,\n },\n\n eventBadges: {\n flexDirection: 'row',\n gap: 6,\n flexWrap: 'wrap',\n },\n\n badge: {\n paddingHorizontal: isTablet ? 8 : 6,\n paddingVertical: isTablet ? 3 : 2,\n borderRadius: 10,\n },\n\n badgeText: {\n fontSize: badgeFontSize,\n fontWeight: '600',\n textTransform: 'uppercase',\n letterSpacing: 0.3,\n },\n\n priorityBadgeHigh: {\n backgroundColor: '#fee2e2',\n },\n\n priorityBadgeMedium: {\n backgroundColor: '#fef3c7',\n },\n\n priorityBadgeLow: {\n backgroundColor: '#dcfce7',\n },\n\n statusBadgeCompleted: {\n backgroundColor: '#d1fae5',\n },\n\n statusBadgeCancelled: {\n backgroundColor: '#fee2e2',\n },\n\n statusBadgeTentative: {\n backgroundColor: '#e0e7ff',\n },\n\n categoryBadgeWork: {\n backgroundColor: '#dbeafe',\n },\n\n categoryBadgePersonal: {\n backgroundColor: '#fef3c7',\n },\n\n categoryBadgeMeeting: {\n backgroundColor: '#d1fae5',\n },\n\n categoryBadgeDeadline: {\n backgroundColor: '#fee2e2',\n },\n\n categoryBadgeAppointment: {\n backgroundColor: '#fef3c7',\n },\n\n categoryBadgeOther: {\n backgroundColor: '#f3f4f6',\n },\n\n eventTime: {\n flexDirection: isSmallPhone ? 'column' : 'row',\n gap: isSmallPhone ? 2 : 8,\n marginBottom: 6,\n },\n\n eventTimeLabel: {\n fontSize: eventDetailSize,\n fontWeight: '600',\n color: '#6b7280',\n minWidth: isSmallPhone ? undefined : isTablet ? 80 : 70,\n textAlign: 'left',\n },\n\n eventTimeValue: {\n fontSize: eventDetailSize,\n color: '#374151',\n flex: 1,\n },\n\n eventDescription: {\n color: '#4b5563',\n fontSize: eventDetailSize,\n lineHeight: isTablet ? 20 : 18,\n marginTop: 10,\n marginBottom: 10,\n paddingVertical: 8,\n paddingHorizontal: 12,\n backgroundColor: '#f9fafb',\n borderLeftWidth: 2,\n borderLeftColor: '#e5e7eb',\n borderRadius: 4,\n textAlign: 'left',\n },\n\n eventUrlContainer: {\n marginTop: 8,\n },\n\n eventLink: {\n color: '#2563eb',\n fontSize: eventDetailSize,\n fontWeight: '500',\n },\n\n eventTags: {\n flexDirection: 'row',\n flexWrap: 'wrap',\n gap: 6,\n marginTop: 8,\n },\n\n eventTag: {\n paddingHorizontal: isTablet ? 10 : 8,\n paddingVertical: isTablet ? 3 : 2,\n backgroundColor: '#e0f2fe',\n borderRadius: 12,\n },\n\n eventTagText: {\n fontSize: isTablet ? 11 : 10,\n color: '#0369a1',\n fontWeight: '500',\n },\n\n noEventsMessage: {\n padding: containerPadding,\n paddingVertical: isTablet ? 30 : 20,\n alignItems: 'center',\n },\n\n noEventsText: {\n fontSize: isTablet ? 14 : 13,\n color: '#6b7280',\n textAlign: 'center',\n },\n });\n};\n\n// Export default styles for backwards compatibility\nexport const calendarStyles = getResponsiveStyles(375, 667);\nexport default calendarStyles;\n","export { VanillaCalendar, createCalendar } from './Calendar';\nexport * from './types';\n\n// Re-export core types and utilities for convenience\nexport * from '../core';\n","import {\n CalendarEngine,\n getCellClasses,\n formatTimeRange,\n formatAttendees,\n MONTHS_FULL,\n MONTHS,\n} from '../core';\nimport { VanillaCalendarProps, VanillaCalendarInstance } from './types';\n\nexport class VanillaCalendar implements VanillaCalendarInstance {\n private engine: CalendarEngine;\n private container: HTMLElement;\n private unsubscribe: (() => void) | null = null;\n private props: VanillaCalendarProps;\n private actions: ReturnType<CalendarEngine['getActions']>;\n private pickerOpen: boolean = false;\n private yearInput: string = '';\n private yearInputValid: boolean = true;\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 private listenersAttached: boolean = false;\n\n constructor(props: VanillaCalendarProps) {\n this.props = props;\n\n if (typeof props.container === 'string') {\n const element = document.querySelector(props.container);\n if (!element) {\n throw new Error(`Container element \"${props.container}\" not found`);\n }\n this.container = element as HTMLElement;\n } else {\n this.container = props.container;\n }\n\n this.engine = new CalendarEngine({\n events: props.events,\n initialDate: props.initialDate,\n minYear: props.minYear,\n maxYear: props.maxYear,\n weekStartsOn: props.weekStartsOn,\n });\n\n this.actions = this.engine.getActions();\n\n this.applyTheme();\n this.init();\n }\n\n private applyTheme(): void {\n if (this.props.theme) {\n const root = document.documentElement;\n const theme = this.props.theme;\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 }\n\n private init(): void {\n this.container.classList.add('kalendly-calendar');\n if (this.props.className) {\n this.container.classList.add(this.props.className);\n }\n\n this.unsubscribe = this.engine.subscribe(() => {\n this.render();\n });\n\n this.render();\n }\n\n private render(): void {\n const viewModel = this.engine.getViewModel();\n\n const defaultRenderEvent = (\n event: VanillaCalendarProps['events'][number]\n ) => {\n const timeRange = formatTimeRange(event);\n const attendeesList = formatAttendees(event.attendees);\n\n let borderColor = 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 <div class=\"event-title\">${event.name}</div>\n <div class=\"event-badges\">\n ${event.category ? `<span class=\"badge category-${event.category}\">${getCategoryLabel(event.category)}</span>` : ''}\n ${event.priority ? `<span class=\"badge priority-${event.priority}\">${getPriorityLabel(event.priority)}</span>` : ''}\n ${event.status && event.status !== 'scheduled' ? `<span class=\"badge status-${event.status}\">${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\">${timeRange}</span>\n </div>\n `\n : ''\n }\n \n ${\n event.description\n ? `\n <div class=\"event-description\">${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\">${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\">${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\">${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\">${event.notes}</span>\n </div>\n `\n : ''\n }\n \n ${\n event.url\n ? `\n <div class=\"event-time\">\n <a href=\"${event.url}\" 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\">${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.props.renderEvent || defaultRenderEvent;\n const renderNoEvents = this.props.renderNoEvents || defaultRenderNoEvents;\n\n const showScrollHint = viewModel.tasks.length > 3;\n\n const today = new Date();\n const todayMonth = today.getMonth();\n const todayYear = today.getFullYear();\n const minYear = this.props.minYear ?? todayYear - 30;\n const maxYear = this.props.maxYear ?? todayYear + 10;\n const isCurrentMonth =\n viewModel.currentYear === todayYear &&\n viewModel.currentMonth === todayMonth;\n\n const html = `\n ${\n this.props.title\n ? `\n <div class=\"page--title\">\n <h1>${this.props.title}</h1>\n </div>\n `\n : ''\n }\n\n <div class=\"calendar--content\">\n <div class=\"calendar--card\">\n <!-- Navigation Header -->\n <div class=\"calendar--nav-header\">\n <button type=\"button\" class=\"calendar--nav-arrow\" data-action=\"previous\" aria-label=\"Previous month\">\n ‹\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 this.props.useShortMonthNames\n ? `${MONTHS[viewModel.currentMonth]} ${viewModel.currentYear}`\n : viewModel.monthAndYearText\n }\n <span class=\"calendar--picker-chevron\">▾</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 >‹</button>\n <input\n type=\"text\"\n class=\"calendar--picker-year-input${!this.yearInputValid ? ' invalid' : ''}\"\n value=\"${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 >›</button>\n </div>\n\n <div class=\"calendar--picker-months\">\n ${(this.props.useShortMonthNames ? 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 ›\n </button>\n </div>\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 ${viewModel.calendarDates\n .map(\n week => `\n <tr>\n ${week\n .map((calendarDate, dayIndex) => {\n const classes = getCellClasses(calendarDate);\n const dateString = calendarDate.date.toISOString();\n return `\n <td\n class=\"${classes.join(' ')}\"\n data-date=\"${dateString}\"\n data-day-index=\"${dayIndex}\"\n data-clickable=\"true\"\n >\n ${calendarDate.date.getDate()}\n </td>\n `;\n })\n .join('')}\n </tr>\n `\n )\n .join('')}\n </tbody>\n </table>\n\n ${\n viewModel.selectedDate\n ? `\n <div class=\"date-popup ${viewModel.popupPositionClass}\">\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 viewModel.tasks.length > 0\n ? `\n ${viewModel.tasks.map(event => renderEvent(event)).join('')}\n `\n : renderNoEvents()\n }\n </div>\n </div>\n `\n : ''\n }\n </div>\n </div>\n `;\n\n this.container.innerHTML = html;\n this.attachEventListeners();\n }\n\n private attachEventListeners(): void {\n // Only attach delegated listeners once\n if (this.listenersAttached) return;\n this.listenersAttached = true;\n\n const today = new Date();\n const todayYear = today.getFullYear();\n const todayMonth = today.getMonth();\n const minYear = this.props.minYear ?? todayYear - 30;\n const maxYear = this.props.maxYear ?? todayYear + 10;\n\n // Single delegated click handler for all actions\n this.delegatedClickHandler = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n\n // Handle calendar date clicks\n const cell = target.closest('td[data-clickable=\"true\"]') as HTMLElement;\n if (cell && cell.dataset.date) {\n e.stopPropagation(); // Prevent document handler from clearing selection after render\n const date = new Date(cell.dataset.date);\n const dayIndex = parseInt(cell.dataset.dayIndex || '0');\n this.engine.handleDateClick(date, dayIndex);\n this.container.dispatchEvent(\n new CustomEvent('dateSelect', { detail: { date, dayIndex } })\n );\n return;\n }\n\n // Handle button actions via data-action attribute\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 this.actions.previous();\n this.dispatchMonthChange();\n break;\n\n case 'next':\n this.actions.next();\n this.dispatchMonthChange();\n break;\n\n case 'today':\n this.actions.goToToday();\n this.pickerOpen = false;\n this.container.dispatchEvent(\n new CustomEvent('monthChange', {\n detail: { year: todayYear, month: todayMonth },\n })\n );\n break;\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.actions.jump(newYear, vm.currentMonth);\n this.dispatchMonthChange();\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.actions.jump(newYear, vm.currentMonth);\n this.dispatchMonthChange();\n }\n break;\n }\n\n case 'select-month': {\n const month = parseInt(actionEl.dataset.month || '0', 10);\n this.actions.jump(this.engine.getViewModel().currentYear, month);\n this.pickerOpen = false;\n this.dispatchMonthChange();\n break;\n }\n\n case 'close-popup':\n this.engine.clearSelection();\n break;\n }\n };\n\n // Delegated input handler for year input\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 // Update input styling without full re-render\n target.classList.toggle('invalid', !this.yearInputValid);\n }\n };\n\n // Delegated blur handler for year input\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.actions.jump(year, vm.currentMonth);\n this.dispatchMonthChange();\n }\n };\n\n // Delegated keydown handler for year input\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') {\n target.blur();\n }\n };\n\n // Attach delegated listeners to container\n this.container.addEventListener('click', this.delegatedClickHandler);\n this.container.addEventListener('input', this.delegatedInputHandler);\n this.container.addEventListener('blur', this.delegatedBlurHandler, true);\n this.container.addEventListener('keydown', this.delegatedKeydownHandler);\n\n // Click outside handler for picker and popup\n this.clickOutsideHandler = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n\n // Ignore clicks inside container (handled by delegated handler)\n if (this.container.contains(target)) return;\n\n // Close picker on outside click\n if (this.pickerOpen) {\n this.pickerOpen = false;\n this.render();\n return;\n }\n\n // Close popup on outside click\n const popup = this.container.querySelector('.date-popup');\n if (popup) {\n this.engine.clearSelection();\n }\n };\n\n document.addEventListener('click', this.clickOutsideHandler);\n }\n\n // Targeted update for picker year - avoids full DOM rebuild\n private updatePickerYear(year: number): void {\n const input = this.container.querySelector(\n '[data-year-input]'\n ) as HTMLInputElement;\n if (input) {\n input.value = String(year);\n }\n\n // Update year arrow disabled states\n const today = new Date();\n const todayYear = today.getFullYear();\n const minYear = this.props.minYear ?? todayYear - 30;\n const maxYear = this.props.maxYear ?? todayYear + 10;\n\n const prevBtn = this.container.querySelector(\n '[data-action=\"year-prev\"]'\n ) as HTMLButtonElement;\n const nextBtn = this.container.querySelector(\n '[data-action=\"year-next\"]'\n ) as HTMLButtonElement;\n\n if (prevBtn) prevBtn.disabled = year <= minYear;\n if (nextBtn) nextBtn.disabled = year >= maxYear;\n }\n\n private dispatchMonthChange(): void {\n const vm = this.engine.getViewModel();\n this.container.dispatchEvent(\n new CustomEvent('monthChange', {\n detail: { year: vm.currentYear, month: vm.currentMonth },\n })\n );\n }\n\n public updateEvents(events: import('../core').CalendarEvent[]): void {\n this.engine.updateEvents(events);\n }\n\n public updateTheme(theme: import('../core').CalendarTheme): void {\n this.props.theme = theme;\n this.applyTheme();\n }\n\n public getCurrentDate(): Date | null {\n return this.engine.getViewModel().selectedDate;\n }\n\n public goToDate(date: Date): void {\n this.actions.jump(date.getFullYear(), date.getMonth());\n }\n\n public getEngine(): CalendarEngine {\n return this.engine;\n }\n\n public destroy(): void {\n if (this.unsubscribe) {\n this.unsubscribe();\n this.unsubscribe = null;\n }\n\n // Clean up delegated listeners\n if (this.delegatedClickHandler) {\n this.container.removeEventListener('click', this.delegatedClickHandler);\n this.delegatedClickHandler = null;\n }\n if (this.delegatedInputHandler) {\n this.container.removeEventListener('input', this.delegatedInputHandler);\n this.delegatedInputHandler = null;\n }\n if (this.delegatedBlurHandler) {\n this.container.removeEventListener(\n 'blur',\n this.delegatedBlurHandler,\n true\n );\n this.delegatedBlurHandler = null;\n }\n if (this.delegatedKeydownHandler) {\n this.container.removeEventListener(\n 'keydown',\n this.delegatedKeydownHandler\n );\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 this.engine.destroy();\n this.container.innerHTML = '';\n this.container.classList.remove('kalendly-calendar');\n\n if (this.props.className) {\n this.container.classList.remove(this.props.className);\n }\n }\n}\n\nexport function createCalendar(\n props: VanillaCalendarProps\n): VanillaCalendarInstance {\n return new VanillaCalendar(props);\n}\n","// Main entry point - exports core functionality\n// For framework-specific implementations, use:\n// - kalendly/vanilla\n// - kalendly/react\n// - kalendly/vue\n// - kalendly/react-native\n\n// Core exports\nexport * from './core';\n\n// Framework-specific exports (Vue is excluded as it's built separately with Vite)\nexport * as React from './react';\nexport * as ReactNative from './react-native';\nexport * as Vanilla from './vanilla';\n\n// Main package info\nexport const version = '1.0.0';\nexport const name = 'kalendly';\n\n// Convenience re-exports for common usage\nexport { Calendar as ReactCalendar } from './react';\nexport { Calendar as ReactNativeCalendar } from './react-native';\nexport { createCalendar as createVanillaCalendar } from './vanilla';\n\n// Note: For Vue, import directly from 'kalendly/vue'\n"],"mappings":"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","names":["name","jsx","jsxs","today","Calendar","DatePopup","useEffect","useState","useCallback","useMemo","View","Text","TouchableOpacity","ScrollView","Modal","StyleSheet","jsx","jsxs","PriorityBadge","StatusBadge","CategoryBadge","DatePopup","calendarStyles","jsx","jsxs","Calendar","useMemo","calendarStyles","useState","useCallback","useEffect","ScrollView","View","Text","TouchableOpacity","Modal","isToday","hasEvents","DatePopup","StyleSheet"]}
|
|
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":["export interface CalendarEvent {\n id: string | number;\n name: string;\n date: 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?:\n | 'work'\n | 'personal'\n | 'meeting'\n | 'deadline'\n | 'appointment'\n | 'other';\n location?: string;\n url?: string;\n\n // Status & priority\n status?: 'scheduled' | 'completed' | 'cancelled' | 'tentative';\n priority?: 'low' | 'medium' | 'high';\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}\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 PopupPosition {\n class:\n | 'popup-left'\n | 'popup-right'\n | 'popup-center-top'\n | 'popup-center-bottom';\n style?: Record<string, string | number>;\n}\n\nexport interface CalendarViewModel extends CalendarState {\n months: string[];\n days: string[];\n years: number[];\n monthAndYearText: string;\n scheduleDay: string;\n calendarDates: CalendarDate[][];\n popupPositionClass: string;\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 eventIndicator?: 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\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","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 getPopupPositionClass,\n getCellClasses,\n formatDateForDisplay,\n getMonthYearText,\n} from './utils';\n","import {\n CalendarEngine,\n getCellClasses,\n formatTimeRange,\n formatAttendees,\n MONTHS_FULL,\n MONTHS,\n} from '../core';\nimport type { CalendarEvent, CalendarTheme, CategoryColorMap } from '../core';\n\nexport class CalendarElement extends HTMLElement {\n static observedAttributes = [\n 'initial-date',\n 'min-year',\n 'max-year',\n 'week-starts-on',\n 'title',\n 'use-short-month-names',\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\n get events(): CalendarEvent[] {\n return this._events;\n }\n\n set events(val: CalendarEvent[]) {\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 set renderEvent(val: (e: CalendarEvent) => string) {\n this._renderEvent = val;\n if (this.engine) this.render();\n }\n\n set renderNoEvents(val: () => string) {\n this._renderNoEvents = val;\n if (this.engine) this.render();\n }\n\n connectedCallback(): void {\n this.classList.add('kalendly-calendar');\n this.initEngine();\n this.render();\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 this.reinit();\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 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 });\n\n this.actions = this.engine.getActions();\n this.applyTheme();\n\n this.unsubscribe = this.engine.subscribe(() => {\n this.render();\n });\n }\n\n private reinit(): void {\n if (!this.engine) return;\n this.cleanup();\n this.initEngine();\n this.render();\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 const t = this._theme;\n if (t.primary)\n root.style.setProperty('--calendar-primary-color', t.primary);\n if (t.secondary)\n root.style.setProperty('--calendar-secondary-color', t.secondary);\n if (t.tertiary)\n root.style.setProperty('--calendar-tertiary-color', t.tertiary);\n if (t.textColor)\n root.style.setProperty('--calendar-text-color', t.textColor);\n if (t.textLight)\n root.style.setProperty('--calendar-text-light', t.textLight);\n if (t.background)\n root.style.setProperty('--calendar-background', t.background);\n if (t.cellHover)\n root.style.setProperty('--calendar-cell-hover', t.cellHover);\n if (t.borderColor)\n root.style.setProperty('--calendar-border-color', t.borderColor);\n if (t.todayOutline)\n root.style.setProperty('--calendar-today-outline', t.todayOutline);\n if (t.selectedBg)\n root.style.setProperty('--calendar-selected-bg', t.selectedBg);\n if (t.eventIndicator)\n root.style.setProperty('--calendar-event-indicator', t.eventIndicator);\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.getAttribute('title');\n const minYear = this.minYear;\n const maxYear = this.maxYear;\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 = 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 <div class=\"event-title\">${event.name}</div>\n <div class=\"event-badges\">\n ${event.category ? `<span class=\"badge category-${event.category}\">${getCategoryLabel(event.category)}</span>` : ''}\n ${event.priority ? `<span class=\"badge priority-${event.priority}\">${getPriorityLabel(event.priority)}</span>` : ''}\n ${event.status && event.status !== 'scheduled' ? `<span class=\"badge status-${event.status}\">${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\">${timeRange}</span>\n </div>\n `\n : ''\n }\n\n ${\n event.description\n ? `\n <div class=\"event-description\">${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\">${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\">${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\">${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\">${event.notes}</span>\n </div>\n `\n : ''\n }\n\n ${\n event.url\n ? `\n <div class=\"event-time\">\n <a href=\"${event.url}\" 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\">${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 html = `\n ${\n title\n ? `\n <div class=\"page--title\">\n <h1>${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 ‹\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\">▾</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 >‹</button>\n <input\n type=\"text\"\n class=\"calendar--picker-year-input${!this.yearInputValid ? ' invalid' : ''}\"\n value=\"${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 >›</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 ›\n </button>\n </div>\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 ${viewModel.calendarDates\n .map(\n week => `\n <tr>\n ${week\n .map((calendarDate, dayIndex) => {\n const classes = getCellClasses(calendarDate);\n const dateString = calendarDate.date.toISOString();\n return `\n <td\n class=\"${classes.join(' ')}\"\n data-date=\"${dateString}\"\n data-day-index=\"${dayIndex}\"\n data-clickable=\"true\"\n >\n ${calendarDate.date.getDate()}\n </td>\n `;\n })\n .join('')}\n </tr>\n `\n )\n .join('')}\n </tbody>\n </table>\n\n ${\n viewModel.selectedDate\n ? `\n <div class=\"date-popup ${viewModel.popupPositionClass}\">\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 viewModel.tasks.length > 0\n ? viewModel.tasks.map(event => renderEvent(event)).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 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 this.actions!.previous();\n this.dispatchMonthChange();\n break;\n\n case 'next':\n this.actions!.next();\n this.dispatchMonthChange();\n break;\n\n case 'today':\n this.actions!.goToToday();\n this.pickerOpen = false;\n this.dispatchMonthChange();\n break;\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.actions!.jump(newYear, vm.currentMonth);\n this.dispatchMonthChange();\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.actions!.jump(newYear, vm.currentMonth);\n this.dispatchMonthChange();\n }\n break;\n }\n\n case 'select-month': {\n const month = parseInt(actionEl.dataset.month || '0', 10);\n this.actions!.jump(this.engine!.getViewModel().currentYear, month);\n this.pickerOpen = false;\n this.dispatchMonthChange();\n break;\n }\n\n case 'close-popup':\n this.engine!.clearSelection();\n break;\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.actions!.jump(year, vm.currentMonth);\n this.dispatchMonthChange();\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(): 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: { year: vm.currentYear, month: vm.currentMonth },\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 return this.engine?.getViewModel().selectedDate ?? null;\n }\n\n goToDate(date: Date): void {\n this.actions?.jump(date.getFullYear(), date.getMonth());\n }\n\n getEngine(): CalendarEngine {\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","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":["CalendarElement"]}
|