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.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../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"],"sourcesContent":["// 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","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"],"mappings":"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","names":["Calendar","name","import_jsx_runtime","today","Calendar","DatePopup","import_react","import_react_native","import_react_native","import_jsx_runtime","PriorityBadge","StatusBadge","CategoryBadge","DatePopup","calendarStyles","import_jsx_runtime","Calendar","calendarStyles","isToday","hasEvents","DatePopup"]}
|
|
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"]}
|