kalendly 0.1.6 → 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.
Files changed (38) hide show
  1. package/README.md +318 -680
  2. package/dist/core/index.js +3 -3
  3. package/dist/index.d.mts +53 -601
  4. package/dist/index.d.ts +53 -601
  5. package/dist/index.js +760 -2350
  6. package/dist/index.js.map +1 -1
  7. package/dist/index.mjs +734 -2339
  8. package/dist/index.mjs.map +1 -1
  9. package/dist/{vanilla/index.umd.js → index.umd.js} +323 -307
  10. package/dist/index.umd.js.map +1 -0
  11. package/package.json +41 -91
  12. package/dist/react/index.d.mts +0 -251
  13. package/dist/react/index.d.ts +0 -251
  14. package/dist/react/index.js +0 -969
  15. package/dist/react/index.js.map +0 -1
  16. package/dist/react/index.mjs +0 -924
  17. package/dist/react/index.mjs.map +0 -1
  18. package/dist/react-native/index.d.mts +0 -642
  19. package/dist/react-native/index.d.ts +0 -642
  20. package/dist/react-native/index.js +0 -1649
  21. package/dist/react-native/index.js.map +0 -1
  22. package/dist/react-native/index.mjs +0 -1615
  23. package/dist/react-native/index.mjs.map +0 -1
  24. package/dist/vanilla/index.d.mts +0 -265
  25. package/dist/vanilla/index.d.ts +0 -265
  26. package/dist/vanilla/index.js +0 -1048
  27. package/dist/vanilla/index.js.map +0 -1
  28. package/dist/vanilla/index.mjs +0 -997
  29. package/dist/vanilla/index.mjs.map +0 -1
  30. package/dist/vanilla/index.umd.js.map +0 -1
  31. package/dist/vue/components/Calendar.vue.d.ts +0 -43
  32. package/dist/vue/components/Calendar.vue.d.ts.map +0 -1
  33. package/dist/vue/index.d.ts +0 -134
  34. package/dist/vue/index.d.ts.map +0 -1
  35. package/dist/vue/index.js +0 -1
  36. package/dist/vue/index.mjs +0 -717
  37. package/dist/vue/types.d.ts +0 -21
  38. package/dist/vue/types.d.ts.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/core/utils.ts","../../src/core/calendar-engine.ts","../../src/vanilla/Calendar.ts"],"sourcesContent":["import { CalendarEvent, CalendarDate, CategoryColorMap } from './types';\n\nexport const MONTHS = [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec',\n];\n\nexport const MONTHS_FULL = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n];\n\nexport const DAYS = [\n 'Sunday',\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n];\n\nexport function normalizeDate(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0);\n}\n\nexport function isSameDay(date1: Date, date2: Date): boolean {\n return normalizeDate(date1).getTime() === normalizeDate(date2).getTime();\n}\n\nexport function isToday(date: Date): boolean {\n return isSameDay(date, new Date());\n}\n\nexport function generateYears(minYear?: number, maxYear?: number): number[] {\n const currentYear = new Date().getFullYear();\n const min = minYear ?? currentYear - 30;\n const max = maxYear ?? currentYear + 10;\n\n return Array.from({ length: max - min + 1 }, (_, i) => min + i);\n}\n\nexport function getEventsForDate(\n events: CalendarEvent[],\n date: Date\n): CalendarEvent[] {\n const normalizedTargetDate = normalizeDate(date);\n\n return events.filter(event => {\n const eventDate = normalizeDate(new Date(event.date));\n return eventDate.getTime() === normalizedTargetDate.getTime();\n });\n}\n\nexport function hasEvents(events: CalendarEvent[], date: Date): boolean {\n return getEventsForDate(events, date).length > 0;\n}\n\nexport function generateCalendarDates(\n year: number,\n month: number,\n events: CalendarEvent[] = [],\n weekStartsOn: 0 | 1 = 0\n): CalendarDate[][] {\n const firstDay = new Date(year, month, 1);\n const lastDay = new Date(year, month + 1, 0);\n const daysInMonth = lastDay.getDate();\n const prevMonthLastDay = new Date(year, month, 0).getDate();\n\n let firstDayOfWeek = firstDay.getDay();\n if (weekStartsOn === 1) {\n firstDayOfWeek = firstDayOfWeek === 0 ? 6 : firstDayOfWeek - 1;\n }\n\n const dates: CalendarDate[][] = [];\n let day = 1;\n let nextMonthDay = 1;\n\n for (let week = 0; week < 6; week++) {\n const weekDates: CalendarDate[] = [];\n\n for (let dayOfWeek = 0; dayOfWeek < 7; dayOfWeek++) {\n if (week === 0 && dayOfWeek < firstDayOfWeek) {\n // Previous month days\n const prevDay = prevMonthLastDay - firstDayOfWeek + dayOfWeek + 1;\n const prevDate = new Date(year, month - 1, prevDay);\n const dateEvents = getEventsForDate(events, prevDate);\n weekDates.push({\n date: prevDate,\n isCurrentMonth: false,\n isToday: isToday(prevDate),\n hasEvents: dateEvents.length > 0,\n events: dateEvents,\n });\n } else if (day > daysInMonth) {\n // Next month days\n const nextDate = new Date(year, month + 1, nextMonthDay);\n const dateEvents = getEventsForDate(events, nextDate);\n weekDates.push({\n date: nextDate,\n isCurrentMonth: false,\n isToday: isToday(nextDate),\n hasEvents: dateEvents.length > 0,\n events: dateEvents,\n });\n nextMonthDay++;\n } else {\n // Current month days\n const currentDate = new Date(year, month, day);\n const dateEvents = getEventsForDate(events, currentDate);\n weekDates.push({\n date: currentDate,\n isCurrentMonth: true,\n isToday: isToday(currentDate),\n hasEvents: dateEvents.length > 0,\n events: dateEvents,\n });\n day++;\n }\n }\n\n dates.push(weekDates);\n }\n\n return dates;\n}\n\nexport function getPopupPositionClass(selectedDayIndex: number | null): string {\n if (selectedDayIndex === null) return 'popup-center-bottom';\n\n if (selectedDayIndex < 3) {\n return 'popup-right';\n } else if (selectedDayIndex > 4) {\n return 'popup-left';\n } else {\n return 'popup-center-bottom';\n }\n}\n\nexport function getCellClasses(calendarDate: CalendarDate): string[] {\n const classes: string[] = [];\n\n if (!calendarDate.isCurrentMonth) {\n classes.push('other-month');\n }\n\n if (calendarDate.isToday) {\n classes.push('schedule--current--exam');\n }\n\n if (calendarDate.hasEvents) {\n classes.push('has--event');\n }\n\n return classes;\n}\n\nexport function formatDateForDisplay(date: Date): string {\n return `${DAYS[date.getDay()]} ${date.getDate()}`;\n}\n\nexport function getMonthYearText(year: number, month: number): string {\n return `${MONTHS_FULL[month]} ${year}`;\n}\n\nexport function formatTimeRange(event: CalendarEvent): string {\n if (event.allDay || (!event.startTime && !event.endTime)) {\n return 'All day';\n }\n\n if (event.startTime && event.endTime) {\n return `${event.startTime} - ${event.endTime}`;\n }\n\n if (event.startTime) {\n return `${event.startTime}`;\n }\n\n return '';\n}\n\nexport function formatAttendees(attendees?: string[]): string {\n if (!attendees || attendees.length === 0) return '';\n\n if (attendees.length === 1) return attendees[0];\n if (attendees.length === 2) return attendees.join(' and ');\n\n return `${attendees.slice(0, -1).join(', ')}, and ${attendees[attendees.length - 1]}`;\n}\n\nexport function sortEventsByTime(events: CalendarEvent[]): CalendarEvent[] {\n return [...events].sort((a, b) => {\n const aAllDay = a.allDay || (!a.startTime && !a.endTime);\n const bAllDay = b.allDay || (!b.startTime && !b.endTime);\n\n if (aAllDay && !bAllDay) return -1;\n if (!aAllDay && bAllDay) return 1;\n\n if (!a.startTime || !b.startTime) return 0;\n return a.startTime.localeCompare(b.startTime);\n });\n}\n\nexport const DEFAULT_CATEGORY_COLORS: CategoryColorMap = {\n work: '#3b82f6',\n personal: '#8b5cf6',\n meeting: '#10b981',\n deadline: '#ef4444',\n appointment: '#f59e0b',\n other: '#6b7280',\n};\n\n// Dynamic function that accepts custom colors\nexport function getDefaultEventColor(\n category?: string,\n customColors?: CategoryColorMap\n): string {\n const colorMap = customColors || DEFAULT_CATEGORY_COLORS;\n\n if (category && colorMap[category]) {\n return colorMap[category];\n }\n\n // Default fallback color\n return '#fc8917';\n}\n\n// Helper to merge custom colors with defaults\nexport function mergeCategoryColors(\n customColors?: CategoryColorMap\n): CategoryColorMap {\n return {\n ...DEFAULT_CATEGORY_COLORS,\n ...customColors,\n };\n}\n\n// Validate if a color is a valid hex color\nexport function isValidHexColor(color: string): boolean {\n return /^#([0-9A-F]{3}){1,2}$/i.test(color);\n}\n\n// Get color for a category with validation\nexport function getCategoryColor(\n category: string,\n customColors?: CategoryColorMap\n): string {\n const colorMap = mergeCategoryColors(customColors);\n const color = colorMap[category] || colorMap.other || '#fc8917';\n\n return isValidHexColor(color) ? color : '#fc8917';\n}\n","import {\n CalendarEvent,\n CalendarState,\n CalendarConfig,\n CalendarActions,\n CalendarViewModel,\n CategoryColorMap,\n} from './types';\nimport {\n generateCalendarDates,\n getEventsForDate,\n generateYears,\n getPopupPositionClass,\n getMonthYearText,\n formatDateForDisplay,\n mergeCategoryColors,\n getCategoryColor,\n MONTHS,\n DAYS,\n} from './utils';\n\nexport class CalendarEngine {\n private state: CalendarState;\n private config: CalendarConfig;\n private listeners: Set<() => void> = new Set();\n private categoryColors: CategoryColorMap;\n\n constructor(config: CalendarConfig) {\n this.config = config;\n this.categoryColors = mergeCategoryColors(config.categoryColors);\n\n const initialDate = config.initialDate || new Date();\n this.state = {\n currentYear: initialDate.getFullYear(),\n currentMonth: initialDate.getMonth(),\n currentDate: initialDate.getDate(),\n selectedDate: null,\n selectedDayIndex: null,\n tasks: [],\n };\n }\n\n /**\n * Subscribe to state changes\n */\n subscribe(listener: () => void): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n /**\n * Notify all listeners of state changes\n */\n private notify(): void {\n this.listeners.forEach(listener => listener());\n }\n\n /**\n * Get current state\n */\n getState(): CalendarState {\n return { ...this.state };\n }\n\n /**\n * Get view model with computed properties\n */\n getViewModel(): CalendarViewModel {\n const calendarDates = generateCalendarDates(\n this.state.currentYear,\n this.state.currentMonth,\n this.config.events,\n this.config.weekStartsOn\n );\n\n return {\n ...this.state,\n months: MONTHS,\n days: DAYS,\n years: generateYears(this.config.minYear, this.config.maxYear),\n monthAndYearText: getMonthYearText(\n this.state.currentYear,\n this.state.currentMonth\n ),\n scheduleDay: this.state.selectedDate\n ? formatDateForDisplay(this.state.selectedDate)\n : '',\n calendarDates,\n popupPositionClass: getPopupPositionClass(this.state.selectedDayIndex),\n };\n }\n\n /**\n * Get actions object\n */\n getActions(): CalendarActions {\n return {\n next: this.next.bind(this),\n previous: this.previous.bind(this),\n jump: this.jump.bind(this),\n goToToday: this.goToToday.bind(this),\n isCurrentMonth: this.isCurrentMonth.bind(this),\n selectDate: this.selectDate.bind(this),\n updateTasks: this.updateTasks.bind(this),\n };\n }\n\n /**\n * Navigate to next month\n */\n private next(): void {\n if (this.state.currentMonth === 11) {\n this.state.currentMonth = 0;\n this.state.currentYear++;\n } else {\n this.state.currentMonth++;\n }\n\n this.state.selectedDate = null;\n this.state.selectedDayIndex = null;\n this.updateTasks();\n this.notify();\n }\n\n /**\n * Navigate to previous month\n */\n private previous(): void {\n if (this.state.currentMonth === 0) {\n this.state.currentMonth = 11;\n this.state.currentYear--;\n } else {\n this.state.currentMonth--;\n }\n\n this.state.selectedDate = null;\n this.state.selectedDayIndex = null;\n this.updateTasks();\n this.notify();\n }\n\n /**\n * Jump to specific month and year\n */\n private jump(year: number, month: number): void {\n this.state.currentYear = year;\n this.state.currentMonth = month;\n this.state.selectedDate = null;\n this.state.selectedDayIndex = null;\n this.updateTasks();\n this.notify();\n }\n\n /**\n * Navigate to current month (today)\n */\n private goToToday(): void {\n const today = new Date();\n this.state.currentYear = today.getFullYear();\n this.state.currentMonth = today.getMonth();\n this.state.selectedDate = null;\n this.state.selectedDayIndex = null;\n this.updateTasks();\n this.notify();\n }\n\n /**\n * Check if currently viewing today's month\n */\n private isCurrentMonth(): boolean {\n const today = new Date();\n return (\n this.state.currentYear === today.getFullYear() &&\n this.state.currentMonth === today.getMonth()\n );\n }\n\n /**\n * Select a specific date\n */\n private selectDate(date: Date, dayIndex?: number): void {\n this.state.selectedDate = date;\n this.state.selectedDayIndex = dayIndex ?? null;\n this.state.currentDate = date.getDate();\n this.state.currentMonth = date.getMonth();\n this.state.currentYear = date.getFullYear();\n this.updateTasks();\n this.notify();\n }\n\n /**\n * Update tasks for the currently selected date\n */\n private updateTasks(): void {\n if (!this.state.selectedDate) {\n this.state.tasks = [];\n return;\n }\n\n this.state.tasks = getEventsForDate(\n this.config.events,\n this.state.selectedDate\n );\n }\n\n /**\n * Update events configuration\n */\n updateEvents(events: CalendarEvent[]): void {\n this.config.events = events;\n this.updateTasks();\n this.notify();\n }\n\n /**\n * Handle date cell click\n */\n handleDateClick(date: Date, dayIndex?: number): void {\n this.selectDate(date, dayIndex);\n }\n\n /**\n * Check if date has events\n */\n hasEventsForDate(date: Date): boolean {\n return getEventsForDate(this.config.events, date).length > 0;\n }\n\n /**\n * Get events for a specific date\n */\n getEventsForDate(date: Date): CalendarEvent[] {\n return getEventsForDate(this.config.events, date);\n }\n\n /**\n * Clear selected date\n */\n clearSelection(): void {\n this.state.selectedDate = null;\n this.state.selectedDayIndex = null;\n this.state.tasks = [];\n this.notify();\n }\n\n /**\n * Get category color (with custom colors support)\n */\n getCategoryColor(category?: string): string {\n if (!category) return '#fc8917';\n return getCategoryColor(category, this.categoryColors);\n }\n\n /**\n * Update category colors dynamically\n */\n updateCategoryColors(colors: CategoryColorMap): void {\n this.categoryColors = mergeCategoryColors(colors);\n this.notify();\n }\n\n /**\n * Get all category colors\n */\n getCategoryColors(): CategoryColorMap {\n return { ...this.categoryColors };\n }\n\n /**\n * Register a new category with color\n */\n registerCategory(name: string, color: string): void {\n this.categoryColors[name] = color;\n this.notify();\n }\n\n /**\n * Destroy the engine and cleanup listeners\n */\n destroy(): void {\n this.listeners.clear();\n }\n}\n","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\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 &#8249;\n </button>\n\n <div class=\"calendar--picker-container\" data-picker-container>\n <button\n type=\"button\"\n class=\"calendar--picker-btn\"\n data-action=\"toggle-picker\"\n aria-expanded=\"${this.pickerOpen ? 'true' : 'false'}\"\n aria-haspopup=\"true\"\n >\n ${\n this.props.useShortMonthNames\n ? `${MONTHS[viewModel.currentMonth]} ${viewModel.currentYear}`\n : viewModel.monthAndYearText\n }\n <span class=\"calendar--picker-chevron\">&#9662;</span>\n </button>\n\n ${\n this.pickerOpen\n ? `\n <div class=\"calendar--picker-dropdown\">\n <div class=\"calendar--picker-year-row\">\n <button\n type=\"button\"\n class=\"calendar--picker-year-arrow\"\n data-action=\"year-prev\"\n ${viewModel.currentYear <= minYear ? 'disabled' : ''}\n aria-label=\"Previous year\"\n >&#8249;</button>\n <input\n type=\"text\"\n class=\"calendar--picker-year-input${!this.yearInputValid ? ' invalid' : ''}\"\n value=\"${this.yearInput || viewModel.currentYear}\"\n data-year-input\n aria-label=\"Year\"\n />\n <button\n type=\"button\"\n class=\"calendar--picker-year-arrow\"\n data-action=\"year-next\"\n ${viewModel.currentYear >= maxYear ? 'disabled' : ''}\n aria-label=\"Next year\"\n >&#8250;</button>\n </div>\n\n <div class=\"calendar--picker-months\">\n ${(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 &#8250;\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 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 // Calendar body click handler\n const tableBody = this.container.querySelector('[data-calendar-body]');\n if (tableBody) {\n tableBody.addEventListener('click', e => {\n const target = e.target as HTMLElement;\n const cell = target.closest('td[data-clickable=\"true\"]') as HTMLElement;\n\n if (cell && cell.dataset.date) {\n const date = new Date(cell.dataset.date);\n const dayIndex = parseInt(cell.dataset.dayIndex || '0');\n this.engine.handleDateClick(date, dayIndex);\n\n this.container.dispatchEvent(\n new CustomEvent('dateSelect', {\n detail: { date, dayIndex },\n })\n );\n }\n });\n }\n\n // Previous/Next navigation\n const prevBtn = this.container.querySelector('[data-action=\"previous\"]');\n const nextBtn = this.container.querySelector('[data-action=\"next\"]');\n\n if (prevBtn) {\n prevBtn.addEventListener('click', () => {\n this.actions.previous();\n this.dispatchMonthChange();\n });\n }\n\n if (nextBtn) {\n nextBtn.addEventListener('click', () => {\n this.actions.next();\n this.dispatchMonthChange();\n });\n }\n\n // Today button\n const todayBtn = this.container.querySelector('[data-action=\"today\"]');\n if (todayBtn) {\n todayBtn.addEventListener('click', () => {\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 });\n }\n\n // Picker toggle\n const pickerBtn = this.container.querySelector(\n '[data-action=\"toggle-picker\"]'\n );\n if (pickerBtn) {\n pickerBtn.addEventListener('click', e => {\n e.stopPropagation(); // Prevent document click handler from immediately closing 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 });\n }\n\n // Year navigation in picker\n const yearPrevBtn = this.container.querySelector(\n '[data-action=\"year-prev\"]'\n );\n const yearNextBtn = this.container.querySelector(\n '[data-action=\"year-next\"]'\n );\n\n if (yearPrevBtn) {\n yearPrevBtn.addEventListener('click', e => {\n e.stopPropagation();\n const vm = this.engine.getViewModel();\n if (vm.currentYear > minYear) {\n this.actions.jump(vm.currentYear - 1, vm.currentMonth);\n this.yearInput = String(vm.currentYear - 1);\n this.dispatchMonthChange();\n }\n });\n }\n\n if (yearNextBtn) {\n yearNextBtn.addEventListener('click', e => {\n e.stopPropagation();\n const vm = this.engine.getViewModel();\n if (vm.currentYear < maxYear) {\n this.actions.jump(vm.currentYear + 1, vm.currentMonth);\n this.yearInput = String(vm.currentYear + 1);\n this.dispatchMonthChange();\n }\n });\n }\n\n // Year input in picker\n const yearInputEl = this.container.querySelector(\n '[data-year-input]'\n ) as HTMLInputElement;\n if (yearInputEl) {\n yearInputEl.addEventListener('input', e => {\n e.stopPropagation();\n const value = (e.target as HTMLInputElement).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 this.render();\n }\n });\n\n yearInputEl.addEventListener('blur', e => {\n e.stopPropagation();\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 } else {\n this.actions.jump(year, vm.currentMonth);\n this.dispatchMonthChange();\n }\n this.render();\n });\n\n yearInputEl.addEventListener('keydown', e => {\n if (e.key === 'Enter') {\n yearInputEl.blur();\n }\n });\n }\n\n // Month selection in picker\n const monthBtns = this.container.querySelectorAll(\n '[data-action=\"select-month\"]'\n );\n monthBtns.forEach(btn => {\n btn.addEventListener('click', e => {\n e.stopPropagation();\n const month = parseInt((btn as HTMLElement).dataset.month || '0', 10);\n this.actions.jump(this.engine.getViewModel().currentYear, month);\n this.pickerOpen = false;\n this.dispatchMonthChange();\n });\n });\n\n // Close popup button\n const closeBtn = this.container.querySelector(\n '[data-action=\"close-popup\"]'\n );\n if (closeBtn) {\n closeBtn.addEventListener('click', e => {\n e.stopPropagation();\n this.engine.clearSelection();\n });\n }\n\n // Click outside handler for picker and popup\n if (this.clickOutsideHandler) {\n document.removeEventListener('click', this.clickOutsideHandler);\n }\n\n this.clickOutsideHandler = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n // Prevent closing picker if click is on the picker button\n const pickerBtn = this.container.querySelector(\n '[data-action=\"toggle-picker\"]'\n );\n if (pickerBtn && (target === pickerBtn || pickerBtn.contains(target))) {\n return;\n }\n // Close picker on outside click\n const pickerContainer = this.container.querySelector(\n '[data-picker-container]'\n );\n if (\n this.pickerOpen &&\n pickerContainer &&\n !pickerContainer.contains(target)\n ) {\n this.pickerOpen = false;\n this.render();\n return;\n }\n // Close popup on outside click\n const popup = this.container.querySelector('.date-popup');\n if (\n popup &&\n !popup.contains(target) &&\n !target.closest('[data-calendar-body]')\n ) {\n this.engine.clearSelection();\n }\n };\n\n document.addEventListener('click', this.clickOutsideHandler);\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 if (this.clickOutsideHandler) {\n document.removeEventListener('click', this.clickOutsideHandler);\n this.clickOutsideHandler = null;\n }\n\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":["pickerBtn"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/vanilla/index.ts","../../src/core/utils.ts","../../src/core/calendar-engine.ts","../../src/vanilla/Calendar.ts"],"sourcesContent":["export { VanillaCalendar, createCalendar } from './Calendar';\nexport * from './types';\n\n// Re-export core types and utilities for convenience\nexport * from '../core';\n","import { CalendarEvent, CalendarDate, CategoryColorMap } from './types';\n\nexport const MONTHS = [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec',\n];\n\nexport const MONTHS_FULL = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n];\n\nexport const DAYS = [\n 'Sunday',\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n];\n\nexport function normalizeDate(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0);\n}\n\nexport function isSameDay(date1: Date, date2: Date): boolean {\n return normalizeDate(date1).getTime() === normalizeDate(date2).getTime();\n}\n\nexport function isToday(date: Date): boolean {\n return isSameDay(date, new Date());\n}\n\nexport function generateYears(minYear?: number, maxYear?: number): number[] {\n const currentYear = new Date().getFullYear();\n const min = minYear ?? currentYear - 30;\n const max = maxYear ?? currentYear + 10;\n\n return Array.from({ length: max - min + 1 }, (_, i) => min + i);\n}\n\nexport function getEventsForDate(\n events: CalendarEvent[],\n date: Date\n): CalendarEvent[] {\n const normalizedTargetDate = normalizeDate(date);\n\n return events.filter(event => {\n const eventDate = normalizeDate(new Date(event.date));\n return eventDate.getTime() === normalizedTargetDate.getTime();\n });\n}\n\nexport function hasEvents(events: CalendarEvent[], date: Date): boolean {\n return getEventsForDate(events, date).length > 0;\n}\n\nexport function generateCalendarDates(\n year: number,\n month: number,\n events: CalendarEvent[] = [],\n weekStartsOn: 0 | 1 = 0\n): CalendarDate[][] {\n const firstDay = new Date(year, month, 1);\n const lastDay = new Date(year, month + 1, 0);\n const daysInMonth = lastDay.getDate();\n const prevMonthLastDay = new Date(year, month, 0).getDate();\n\n let firstDayOfWeek = firstDay.getDay();\n if (weekStartsOn === 1) {\n firstDayOfWeek = firstDayOfWeek === 0 ? 6 : firstDayOfWeek - 1;\n }\n\n const dates: CalendarDate[][] = [];\n let day = 1;\n let nextMonthDay = 1;\n\n for (let week = 0; week < 6; week++) {\n const weekDates: CalendarDate[] = [];\n\n for (let dayOfWeek = 0; dayOfWeek < 7; dayOfWeek++) {\n if (week === 0 && dayOfWeek < firstDayOfWeek) {\n // Previous month days\n const prevDay = prevMonthLastDay - firstDayOfWeek + dayOfWeek + 1;\n const prevDate = new Date(year, month - 1, prevDay);\n const dateEvents = getEventsForDate(events, prevDate);\n weekDates.push({\n date: prevDate,\n isCurrentMonth: false,\n isToday: isToday(prevDate),\n hasEvents: dateEvents.length > 0,\n events: dateEvents,\n });\n } else if (day > daysInMonth) {\n // Next month days\n const nextDate = new Date(year, month + 1, nextMonthDay);\n const dateEvents = getEventsForDate(events, nextDate);\n weekDates.push({\n date: nextDate,\n isCurrentMonth: false,\n isToday: isToday(nextDate),\n hasEvents: dateEvents.length > 0,\n events: dateEvents,\n });\n nextMonthDay++;\n } else {\n // Current month days\n const currentDate = new Date(year, month, day);\n const dateEvents = getEventsForDate(events, currentDate);\n weekDates.push({\n date: currentDate,\n isCurrentMonth: true,\n isToday: isToday(currentDate),\n hasEvents: dateEvents.length > 0,\n events: dateEvents,\n });\n day++;\n }\n }\n\n dates.push(weekDates);\n }\n\n return dates;\n}\n\nexport function getPopupPositionClass(selectedDayIndex: number | null): string {\n if (selectedDayIndex === null) return 'popup-center-bottom';\n\n if (selectedDayIndex < 3) {\n return 'popup-right';\n } else if (selectedDayIndex > 4) {\n return 'popup-left';\n } else {\n return 'popup-center-bottom';\n }\n}\n\nexport function getCellClasses(calendarDate: CalendarDate): string[] {\n const classes: string[] = [];\n\n if (!calendarDate.isCurrentMonth) {\n classes.push('other-month');\n }\n\n if (calendarDate.isToday) {\n classes.push('schedule--current--exam');\n }\n\n if (calendarDate.hasEvents) {\n classes.push('has--event');\n }\n\n return classes;\n}\n\nexport function formatDateForDisplay(date: Date): string {\n return `${DAYS[date.getDay()]} ${date.getDate()}`;\n}\n\nexport function getMonthYearText(year: number, month: number): string {\n return `${MONTHS_FULL[month]} ${year}`;\n}\n\nexport function formatTimeRange(event: CalendarEvent): string {\n if (event.allDay || (!event.startTime && !event.endTime)) {\n return 'All day';\n }\n\n if (event.startTime && event.endTime) {\n return `${event.startTime} - ${event.endTime}`;\n }\n\n if (event.startTime) {\n return `${event.startTime}`;\n }\n\n return '';\n}\n\nexport function formatAttendees(attendees?: string[]): string {\n if (!attendees || attendees.length === 0) return '';\n\n if (attendees.length === 1) return attendees[0];\n if (attendees.length === 2) return attendees.join(' and ');\n\n return `${attendees.slice(0, -1).join(', ')}, and ${attendees[attendees.length - 1]}`;\n}\n\nexport function sortEventsByTime(events: CalendarEvent[]): CalendarEvent[] {\n return [...events].sort((a, b) => {\n const aAllDay = a.allDay || (!a.startTime && !a.endTime);\n const bAllDay = b.allDay || (!b.startTime && !b.endTime);\n\n if (aAllDay && !bAllDay) return -1;\n if (!aAllDay && bAllDay) return 1;\n\n if (!a.startTime || !b.startTime) return 0;\n return a.startTime.localeCompare(b.startTime);\n });\n}\n\nexport const DEFAULT_CATEGORY_COLORS: CategoryColorMap = {\n work: '#3b82f6',\n personal: '#8b5cf6',\n meeting: '#10b981',\n deadline: '#ef4444',\n appointment: '#f59e0b',\n other: '#6b7280',\n};\n\n// Dynamic function that accepts custom colors\nexport function getDefaultEventColor(\n category?: string,\n customColors?: CategoryColorMap\n): string {\n const colorMap = customColors || DEFAULT_CATEGORY_COLORS;\n\n if (category && colorMap[category]) {\n return colorMap[category];\n }\n\n // Default fallback color\n return '#fc8917';\n}\n\n// Helper to merge custom colors with defaults\nexport function mergeCategoryColors(\n customColors?: CategoryColorMap\n): CategoryColorMap {\n return {\n ...DEFAULT_CATEGORY_COLORS,\n ...customColors,\n };\n}\n\n// Validate if a color is a valid hex color\nexport function isValidHexColor(color: string): boolean {\n return /^#([0-9A-F]{3}){1,2}$/i.test(color);\n}\n\n// Get color for a category with validation\nexport function getCategoryColor(\n category: string,\n customColors?: CategoryColorMap\n): string {\n const colorMap = mergeCategoryColors(customColors);\n const color = colorMap[category] || colorMap.other || '#fc8917';\n\n return isValidHexColor(color) ? color : '#fc8917';\n}\n","import {\n CalendarEvent,\n CalendarState,\n CalendarConfig,\n CalendarActions,\n CalendarViewModel,\n CategoryColorMap,\n} from './types';\nimport {\n generateCalendarDates,\n getEventsForDate,\n generateYears,\n getPopupPositionClass,\n getMonthYearText,\n formatDateForDisplay,\n mergeCategoryColors,\n getCategoryColor,\n MONTHS,\n DAYS,\n} from './utils';\n\nexport class CalendarEngine {\n private state: CalendarState;\n private config: CalendarConfig;\n private listeners: Set<() => void> = new Set();\n private categoryColors: CategoryColorMap;\n\n constructor(config: CalendarConfig) {\n this.config = config;\n this.categoryColors = mergeCategoryColors(config.categoryColors);\n\n const initialDate = config.initialDate || new Date();\n this.state = {\n currentYear: initialDate.getFullYear(),\n currentMonth: initialDate.getMonth(),\n currentDate: initialDate.getDate(),\n selectedDate: null,\n selectedDayIndex: null,\n tasks: [],\n };\n }\n\n /**\n * Subscribe to state changes\n */\n subscribe(listener: () => void): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n /**\n * Notify all listeners of state changes\n */\n private notify(): void {\n this.listeners.forEach(listener => listener());\n }\n\n /**\n * Get current state\n */\n getState(): CalendarState {\n return { ...this.state };\n }\n\n /**\n * Get view model with computed properties\n */\n getViewModel(): CalendarViewModel {\n const calendarDates = generateCalendarDates(\n this.state.currentYear,\n this.state.currentMonth,\n this.config.events,\n this.config.weekStartsOn\n );\n\n return {\n ...this.state,\n months: MONTHS,\n days: DAYS,\n years: generateYears(this.config.minYear, this.config.maxYear),\n monthAndYearText: getMonthYearText(\n this.state.currentYear,\n this.state.currentMonth\n ),\n scheduleDay: this.state.selectedDate\n ? formatDateForDisplay(this.state.selectedDate)\n : '',\n calendarDates,\n popupPositionClass: getPopupPositionClass(this.state.selectedDayIndex),\n };\n }\n\n /**\n * Get actions object\n */\n getActions(): CalendarActions {\n return {\n next: this.next.bind(this),\n previous: this.previous.bind(this),\n jump: this.jump.bind(this),\n goToToday: this.goToToday.bind(this),\n isCurrentMonth: this.isCurrentMonth.bind(this),\n selectDate: this.selectDate.bind(this),\n updateTasks: this.updateTasks.bind(this),\n };\n }\n\n /**\n * Navigate to next month\n */\n private next(): void {\n if (this.state.currentMonth === 11) {\n this.state.currentMonth = 0;\n this.state.currentYear++;\n } else {\n this.state.currentMonth++;\n }\n\n this.state.selectedDate = null;\n this.state.selectedDayIndex = null;\n this.updateTasks();\n this.notify();\n }\n\n /**\n * Navigate to previous month\n */\n private previous(): void {\n if (this.state.currentMonth === 0) {\n this.state.currentMonth = 11;\n this.state.currentYear--;\n } else {\n this.state.currentMonth--;\n }\n\n this.state.selectedDate = null;\n this.state.selectedDayIndex = null;\n this.updateTasks();\n this.notify();\n }\n\n /**\n * Jump to specific month and year\n */\n private jump(year: number, month: number): void {\n this.state.currentYear = year;\n this.state.currentMonth = month;\n this.state.selectedDate = null;\n this.state.selectedDayIndex = null;\n this.updateTasks();\n this.notify();\n }\n\n /**\n * Navigate to current month (today)\n */\n private goToToday(): void {\n const today = new Date();\n this.state.currentYear = today.getFullYear();\n this.state.currentMonth = today.getMonth();\n this.state.selectedDate = null;\n this.state.selectedDayIndex = null;\n this.updateTasks();\n this.notify();\n }\n\n /**\n * Check if currently viewing today's month\n */\n private isCurrentMonth(): boolean {\n const today = new Date();\n return (\n this.state.currentYear === today.getFullYear() &&\n this.state.currentMonth === today.getMonth()\n );\n }\n\n /**\n * Select a specific date\n */\n private selectDate(date: Date, dayIndex?: number): void {\n this.state.selectedDate = date;\n this.state.selectedDayIndex = dayIndex ?? null;\n this.state.currentDate = date.getDate();\n this.state.currentMonth = date.getMonth();\n this.state.currentYear = date.getFullYear();\n this.updateTasks();\n this.notify();\n }\n\n /**\n * Update tasks for the currently selected date\n */\n private updateTasks(): void {\n if (!this.state.selectedDate) {\n this.state.tasks = [];\n return;\n }\n\n this.state.tasks = getEventsForDate(\n this.config.events,\n this.state.selectedDate\n );\n }\n\n /**\n * Update events configuration\n */\n updateEvents(events: CalendarEvent[]): void {\n this.config.events = events;\n this.updateTasks();\n this.notify();\n }\n\n /**\n * Handle date cell click\n */\n handleDateClick(date: Date, dayIndex?: number): void {\n this.selectDate(date, dayIndex);\n }\n\n /**\n * Check if date has events\n */\n hasEventsForDate(date: Date): boolean {\n return getEventsForDate(this.config.events, date).length > 0;\n }\n\n /**\n * Get events for a specific date\n */\n getEventsForDate(date: Date): CalendarEvent[] {\n return getEventsForDate(this.config.events, date);\n }\n\n /**\n * Clear selected date\n */\n clearSelection(): void {\n this.state.selectedDate = null;\n this.state.selectedDayIndex = null;\n this.state.tasks = [];\n this.notify();\n }\n\n /**\n * Get category color (with custom colors support)\n */\n getCategoryColor(category?: string): string {\n if (!category) return '#fc8917';\n return getCategoryColor(category, this.categoryColors);\n }\n\n /**\n * Update category colors dynamically\n */\n updateCategoryColors(colors: CategoryColorMap): void {\n this.categoryColors = mergeCategoryColors(colors);\n this.notify();\n }\n\n /**\n * Get all category colors\n */\n getCategoryColors(): CategoryColorMap {\n return { ...this.categoryColors };\n }\n\n /**\n * Register a new category with color\n */\n registerCategory(name: string, color: string): void {\n this.categoryColors[name] = color;\n this.notify();\n }\n\n /**\n * Destroy the engine and cleanup listeners\n */\n destroy(): void {\n this.listeners.clear();\n }\n}\n","import {\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\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 &#8249;\n </button>\n\n <div class=\"calendar--picker-container\" data-picker-container>\n <button\n type=\"button\"\n class=\"calendar--picker-btn\"\n data-action=\"toggle-picker\"\n aria-expanded=\"${this.pickerOpen ? 'true' : 'false'}\"\n aria-haspopup=\"true\"\n >\n ${\n this.props.useShortMonthNames\n ? `${MONTHS[viewModel.currentMonth]} ${viewModel.currentYear}`\n : viewModel.monthAndYearText\n }\n <span class=\"calendar--picker-chevron\">&#9662;</span>\n </button>\n\n ${\n this.pickerOpen\n ? `\n <div class=\"calendar--picker-dropdown\">\n <div class=\"calendar--picker-year-row\">\n <button\n type=\"button\"\n class=\"calendar--picker-year-arrow\"\n data-action=\"year-prev\"\n ${viewModel.currentYear <= minYear ? 'disabled' : ''}\n aria-label=\"Previous year\"\n >&#8249;</button>\n <input\n type=\"text\"\n class=\"calendar--picker-year-input${!this.yearInputValid ? ' invalid' : ''}\"\n value=\"${this.yearInput || viewModel.currentYear}\"\n data-year-input\n aria-label=\"Year\"\n />\n <button\n type=\"button\"\n class=\"calendar--picker-year-arrow\"\n data-action=\"year-next\"\n ${viewModel.currentYear >= maxYear ? 'disabled' : ''}\n aria-label=\"Next year\"\n >&#8250;</button>\n </div>\n\n <div class=\"calendar--picker-months\">\n ${(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 &#8250;\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 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 // Calendar body click handler\n const tableBody = this.container.querySelector('[data-calendar-body]');\n if (tableBody) {\n tableBody.addEventListener('click', e => {\n const target = e.target as HTMLElement;\n const cell = target.closest('td[data-clickable=\"true\"]') as HTMLElement;\n\n if (cell && cell.dataset.date) {\n const date = new Date(cell.dataset.date);\n const dayIndex = parseInt(cell.dataset.dayIndex || '0');\n this.engine.handleDateClick(date, dayIndex);\n\n this.container.dispatchEvent(\n new CustomEvent('dateSelect', {\n detail: { date, dayIndex },\n })\n );\n }\n });\n }\n\n // Previous/Next navigation\n const prevBtn = this.container.querySelector('[data-action=\"previous\"]');\n const nextBtn = this.container.querySelector('[data-action=\"next\"]');\n\n if (prevBtn) {\n prevBtn.addEventListener('click', () => {\n this.actions.previous();\n this.dispatchMonthChange();\n });\n }\n\n if (nextBtn) {\n nextBtn.addEventListener('click', () => {\n this.actions.next();\n this.dispatchMonthChange();\n });\n }\n\n // Today button\n const todayBtn = this.container.querySelector('[data-action=\"today\"]');\n if (todayBtn) {\n todayBtn.addEventListener('click', () => {\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 });\n }\n\n // Picker toggle\n const pickerBtn = this.container.querySelector(\n '[data-action=\"toggle-picker\"]'\n );\n if (pickerBtn) {\n pickerBtn.addEventListener('click', e => {\n e.stopPropagation(); // Prevent document click handler from immediately closing 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 });\n }\n\n // Year navigation in picker\n const yearPrevBtn = this.container.querySelector(\n '[data-action=\"year-prev\"]'\n );\n const yearNextBtn = this.container.querySelector(\n '[data-action=\"year-next\"]'\n );\n\n if (yearPrevBtn) {\n yearPrevBtn.addEventListener('click', e => {\n e.stopPropagation();\n const vm = this.engine.getViewModel();\n if (vm.currentYear > minYear) {\n this.actions.jump(vm.currentYear - 1, vm.currentMonth);\n this.yearInput = String(vm.currentYear - 1);\n this.dispatchMonthChange();\n }\n });\n }\n\n if (yearNextBtn) {\n yearNextBtn.addEventListener('click', e => {\n e.stopPropagation();\n const vm = this.engine.getViewModel();\n if (vm.currentYear < maxYear) {\n this.actions.jump(vm.currentYear + 1, vm.currentMonth);\n this.yearInput = String(vm.currentYear + 1);\n this.dispatchMonthChange();\n }\n });\n }\n\n // Year input in picker\n const yearInputEl = this.container.querySelector(\n '[data-year-input]'\n ) as HTMLInputElement;\n if (yearInputEl) {\n yearInputEl.addEventListener('input', e => {\n e.stopPropagation();\n const value = (e.target as HTMLInputElement).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 this.render();\n }\n });\n\n yearInputEl.addEventListener('blur', e => {\n e.stopPropagation();\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 } else {\n this.actions.jump(year, vm.currentMonth);\n this.dispatchMonthChange();\n }\n this.render();\n });\n\n yearInputEl.addEventListener('keydown', e => {\n if (e.key === 'Enter') {\n yearInputEl.blur();\n }\n });\n }\n\n // Month selection in picker\n const monthBtns = this.container.querySelectorAll(\n '[data-action=\"select-month\"]'\n );\n monthBtns.forEach(btn => {\n btn.addEventListener('click', e => {\n e.stopPropagation();\n const month = parseInt((btn as HTMLElement).dataset.month || '0', 10);\n this.actions.jump(this.engine.getViewModel().currentYear, month);\n this.pickerOpen = false;\n this.dispatchMonthChange();\n });\n });\n\n // Close popup button\n const closeBtn = this.container.querySelector(\n '[data-action=\"close-popup\"]'\n );\n if (closeBtn) {\n closeBtn.addEventListener('click', e => {\n e.stopPropagation();\n this.engine.clearSelection();\n });\n }\n\n // Click outside handler for picker and popup\n if (this.clickOutsideHandler) {\n document.removeEventListener('click', this.clickOutsideHandler);\n }\n\n this.clickOutsideHandler = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n // Prevent closing picker if click is on the picker button\n const pickerBtn = this.container.querySelector(\n '[data-action=\"toggle-picker\"]'\n );\n if (pickerBtn && (target === pickerBtn || pickerBtn.contains(target))) {\n return;\n }\n // Close picker on outside click\n const pickerContainer = this.container.querySelector(\n '[data-picker-container]'\n );\n if (\n this.pickerOpen &&\n pickerContainer &&\n !pickerContainer.contains(target)\n ) {\n this.pickerOpen = false;\n this.render();\n return;\n }\n // Close popup on outside click\n const popup = this.container.querySelector('.date-popup');\n if (\n popup &&\n !popup.contains(target) &&\n !target.closest('[data-calendar-body]')\n ) {\n this.engine.clearSelection();\n }\n };\n\n document.addEventListener('click', this.clickOutsideHandler);\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 if (this.clickOutsideHandler) {\n document.removeEventListener('click', this.clickOutsideHandler);\n this.clickOutsideHandler = null;\n }\n\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":["pickerBtn"]}
@@ -1,43 +0,0 @@
1
- import { VueCalendarProps } from '../types';
2
- import { CalendarEvent } from '../../core/types';
3
- import { DefineComponent, ComponentOptionsMixin, PublicProps, ComponentProvideOptions } from 'vue';
4
- declare function __VLS_template(): {
5
- attrs: Partial<{}>;
6
- slots: {
7
- title?(_: {}): any;
8
- event?(_: {
9
- event: CalendarEvent;
10
- }): any;
11
- 'no-events'?(_: {}): any;
12
- };
13
- refs: {
14
- pickerRef: HTMLDivElement;
15
- };
16
- rootEl: HTMLDivElement;
17
- };
18
- type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
19
- declare const __VLS_component: DefineComponent<VueCalendarProps, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
20
- "date-select": (date: Date) => any;
21
- "event-click": (event: CalendarEvent) => any;
22
- "month-change": (year: number, month: number) => any;
23
- }, string, PublicProps, Readonly<VueCalendarProps> & Readonly<{
24
- "onDate-select"?: ((date: Date) => any) | undefined;
25
- "onEvent-click"?: ((event: CalendarEvent) => any) | undefined;
26
- "onMonth-change"?: ((year: number, month: number) => any) | undefined;
27
- }>, {
28
- class: string;
29
- style: Record<string, string | number>;
30
- events: CalendarEvent[];
31
- weekStartsOn: 0 | 1;
32
- useShortMonthNames: boolean;
33
- }, {}, {}, {}, string, ComponentProvideOptions, false, {
34
- pickerRef: HTMLDivElement;
35
- }, HTMLDivElement>;
36
- declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
37
- export default _default;
38
- type __VLS_WithTemplateSlots<T, S> = T & {
39
- new (): {
40
- $slots: S;
41
- };
42
- };
43
- //# sourceMappingURL=Calendar.vue.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Calendar.vue.d.ts","sourceRoot":"","sources":["../../../src/vue/components/Calendar.vue"],"names":[],"mappings":";AA0QA;AAgjBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAgB,MAAM,kBAAkB,CAAC;AA0RpE,iBAAS,cAAc;WAuVT,OAAO,IAA6B;;uBAbvB,GAAG;;;YACH,GAAG;6BACG,GAAG;;;;;;EAgBnC;AAyCD,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAC9D,QAAA,MAAM,eAAe;;;;;;;;;;;;;;;;kBAUnB,CAAC;wBACkB,uBAAuB,CAAC,OAAO,eAAe,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAAnG,wBAAoG;AAapG,KAAK,uBAAuB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IACxC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KAEV,CAAA;CACD,CAAC"}
@@ -1,134 +0,0 @@
1
- import { App, CreateComponentPublicInstanceWithMixins, ComponentOptionsMixin, PublicProps, GlobalComponents, GlobalDirectives, ComponentProvideOptions, ComponentOptionsBase, VNodeProps, AllowedComponentProps, ComponentCustomProps } from 'vue';
2
- import { VueCalendarProps } from './types';
3
- import { CalendarEvent } from '../core';
4
- export { default as Calendar } from './components/Calendar.vue';
5
- export * from './types';
6
- export * from '../core';
7
- export declare function install(app: App): void;
8
- declare const _default: {
9
- install: typeof install;
10
- Calendar: {
11
- new (...args: any[]): CreateComponentPublicInstanceWithMixins<Readonly<VueCalendarProps> & Readonly<{
12
- "onDate-select"?: ((date: Date) => any) | undefined;
13
- "onEvent-click"?: ((event: CalendarEvent) => any) | undefined;
14
- "onMonth-change"?: ((year: number, month: number) => any) | undefined;
15
- }>, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
16
- "date-select": (date: Date) => any;
17
- "event-click": (event: CalendarEvent) => any;
18
- "month-change": (year: number, month: number) => any;
19
- }, PublicProps, {
20
- class: string;
21
- style: Record<string, string | number>;
22
- events: CalendarEvent[];
23
- weekStartsOn: 0 | 1;
24
- useShortMonthNames: boolean;
25
- }, false, {}, {}, GlobalComponents, GlobalDirectives, string, {
26
- pickerRef: HTMLDivElement;
27
- }, HTMLDivElement, ComponentProvideOptions, {
28
- P: {};
29
- B: {};
30
- D: {};
31
- C: {};
32
- M: {};
33
- Defaults: {};
34
- }, Readonly<VueCalendarProps> & Readonly<{
35
- "onDate-select"?: ((date: Date) => any) | undefined;
36
- "onEvent-click"?: ((event: CalendarEvent) => any) | undefined;
37
- "onMonth-change"?: ((year: number, month: number) => any) | undefined;
38
- }>, {}, {}, {}, {}, {
39
- class: string;
40
- style: Record<string, string | number>;
41
- events: CalendarEvent[];
42
- weekStartsOn: 0 | 1;
43
- useShortMonthNames: boolean;
44
- }>;
45
- __isFragment?: never;
46
- __isTeleport?: never;
47
- __isSuspense?: never;
48
- } & ComponentOptionsBase<Readonly<VueCalendarProps> & Readonly<{
49
- "onDate-select"?: ((date: Date) => any) | undefined;
50
- "onEvent-click"?: ((event: CalendarEvent) => any) | undefined;
51
- "onMonth-change"?: ((year: number, month: number) => any) | undefined;
52
- }>, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
53
- "date-select": (date: Date) => any;
54
- "event-click": (event: CalendarEvent) => any;
55
- "month-change": (year: number, month: number) => any;
56
- }, string, {
57
- class: string;
58
- style: Record<string, string | number>;
59
- events: CalendarEvent[];
60
- weekStartsOn: 0 | 1;
61
- useShortMonthNames: boolean;
62
- }, {}, string, {}, GlobalComponents, GlobalDirectives, string, ComponentProvideOptions> & VNodeProps & AllowedComponentProps & ComponentCustomProps & (new () => {
63
- $slots: {
64
- title?(_: {}): any;
65
- event?(_: {
66
- event: CalendarEvent;
67
- }): any;
68
- 'no-events'?(_: {}): any;
69
- };
70
- });
71
- };
72
- export default _default;
73
- export declare function createCalendar(_props: VueCalendarProps): {
74
- new (...args: any[]): CreateComponentPublicInstanceWithMixins<Readonly<VueCalendarProps> & Readonly<{
75
- "onDate-select"?: ((date: Date) => any) | undefined;
76
- "onEvent-click"?: ((event: CalendarEvent) => any) | undefined;
77
- "onMonth-change"?: ((year: number, month: number) => any) | undefined;
78
- }>, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
79
- "date-select": (date: Date) => any;
80
- "event-click": (event: CalendarEvent) => any;
81
- "month-change": (year: number, month: number) => any;
82
- }, PublicProps, {
83
- class: string;
84
- style: Record<string, string | number>;
85
- events: CalendarEvent[];
86
- weekStartsOn: 0 | 1;
87
- useShortMonthNames: boolean;
88
- }, false, {}, {}, GlobalComponents, GlobalDirectives, string, {
89
- pickerRef: HTMLDivElement;
90
- }, HTMLDivElement, ComponentProvideOptions, {
91
- P: {};
92
- B: {};
93
- D: {};
94
- C: {};
95
- M: {};
96
- Defaults: {};
97
- }, Readonly<VueCalendarProps> & Readonly<{
98
- "onDate-select"?: ((date: Date) => any) | undefined;
99
- "onEvent-click"?: ((event: CalendarEvent) => any) | undefined;
100
- "onMonth-change"?: ((year: number, month: number) => any) | undefined;
101
- }>, {}, {}, {}, {}, {
102
- class: string;
103
- style: Record<string, string | number>;
104
- events: CalendarEvent[];
105
- weekStartsOn: 0 | 1;
106
- useShortMonthNames: boolean;
107
- }>;
108
- __isFragment?: never;
109
- __isTeleport?: never;
110
- __isSuspense?: never;
111
- } & ComponentOptionsBase<Readonly<VueCalendarProps> & Readonly<{
112
- "onDate-select"?: ((date: Date) => any) | undefined;
113
- "onEvent-click"?: ((event: CalendarEvent) => any) | undefined;
114
- "onMonth-change"?: ((year: number, month: number) => any) | undefined;
115
- }>, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
116
- "date-select": (date: Date) => any;
117
- "event-click": (event: CalendarEvent) => any;
118
- "month-change": (year: number, month: number) => any;
119
- }, string, {
120
- class: string;
121
- style: Record<string, string | number>;
122
- events: CalendarEvent[];
123
- weekStartsOn: 0 | 1;
124
- useShortMonthNames: boolean;
125
- }, {}, string, {}, GlobalComponents, GlobalDirectives, string, ComponentProvideOptions> & VNodeProps & AllowedComponentProps & ComponentCustomProps & (new () => {
126
- $slots: {
127
- title?(_: {}): any;
128
- event?(_: {
129
- event: CalendarEvent;
130
- }): any;
131
- 'no-events'?(_: {}): any;
132
- };
133
- });
134
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vue/index.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE/B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAGhD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAChE,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AAGxB,wBAAgB,OAAO,CAAC,GAAG,EAAE,GAAG,QAE/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGD,wBAGE;AAGF,wBAAgB,cAAc,CAAC,MAAM,EAAE,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAEtD"}
package/dist/vue/index.js DELETED
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("vue"),B=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],T=["January","February","March","April","May","June","July","August","September","October","November","December"],x=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];function M(t){return new Date(t.getFullYear(),t.getMonth(),t.getDate(),0,0,0)}function $(t,n){return M(t).getTime()===M(n).getTime()}function _(t){return $(t,new Date)}function w(t,n){const s=new Date().getFullYear(),i=t??s-30,c=n??s+10;return Array.from({length:c-i+1},(b,l)=>i+l)}function f(t,n){const s=M(n);return t.filter(i=>M(new Date(i.date)).getTime()===s.getTime())}function me(t,n){return f(t,n).length>0}function I(t,n,s=[],i=0){const c=new Date(t,n,1),l=new Date(t,n+1,0).getDate(),Y=new Date(t,n,0).getDate();let h=c.getDay();i===1&&(h=h===0?6:h-1);const m=[];let p=1,k=1;for(let D=0;D<6;D++){const C=[];for(let g=0;g<7;g++)if(D===0&&g<h){const u=Y-h+g+1,d=new Date(t,n-1,u),E=f(s,d);C.push({date:d,isCurrentMonth:!1,isToday:_(d),hasEvents:E.length>0,events:E})}else if(p>l){const u=new Date(t,n+1,k),d=f(s,u);C.push({date:u,isCurrentMonth:!1,isToday:_(u),hasEvents:d.length>0,events:d}),k++}else{const u=new Date(t,n,p),d=f(s,u);C.push({date:u,isCurrentMonth:!0,isToday:_(u),hasEvents:d.length>0,events:d}),p++}m.push(C)}return m}function z(t){return t===null?"popup-center-bottom":t<3?"popup-right":t>4?"popup-left":"popup-center-bottom"}function H(t){const n=[];return t.isCurrentMonth||n.push("other-month"),t.isToday&&n.push("schedule--current--exam"),t.hasEvents&&n.push("has--event"),n}function R(t){return`${x[t.getDay()]} ${t.getDate()}`}function U(t,n){return`${T[n]} ${t}`}function j(t){return t.allDay||!t.startTime&&!t.endTime?"All day":t.startTime&&t.endTime?`${t.startTime} - ${t.endTime}`:t.startTime?`${t.startTime}`:""}function J(t){return!t||t.length===0?"":t.length===1?t[0]:t.length===2?t.join(" and "):`${t.slice(0,-1).join(", ")}, and ${t[t.length-1]}`}function pe(t){return[...t].sort((n,s)=>{const i=n.allDay||!n.startTime&&!n.endTime,c=s.allDay||!s.startTime&&!s.endTime;return i&&!c?-1:!i&&c?1:!n.startTime||!s.startTime?0:n.startTime.localeCompare(s.startTime)})}const L={work:"#3b82f6",personal:"#8b5cf6",meeting:"#10b981",deadline:"#ef4444",appointment:"#f59e0b",other:"#6b7280"};function ye(t,n){const s=n||L;return t&&s[t]?s[t]:"#fc8917"}function V(t){return{...L,...t}}function G(t){return/^#([0-9A-F]{3}){1,2}$/i.test(t)}function W(t,n){const s=V(n),i=s[t]||s.other||"#fc8917";return G(i)?i:"#fc8917"}class K{constructor(n){this.listeners=new Set,this.config=n,this.categoryColors=V(n.categoryColors);const s=n.initialDate||new Date;this.state={currentYear:s.getFullYear(),currentMonth:s.getMonth(),currentDate:s.getDate(),selectedDate:null,selectedDayIndex:null,tasks:[]}}subscribe(n){return this.listeners.add(n),()=>this.listeners.delete(n)}notify(){this.listeners.forEach(n=>n())}getState(){return{...this.state}}getViewModel(){const n=I(this.state.currentYear,this.state.currentMonth,this.config.events,this.config.weekStartsOn);return{...this.state,months:B,days:x,years:w(this.config.minYear,this.config.maxYear),monthAndYearText:U(this.state.currentYear,this.state.currentMonth),scheduleDay:this.state.selectedDate?R(this.state.selectedDate):"",calendarDates:n,popupPositionClass:z(this.state.selectedDayIndex)}}getActions(){return{next:this.next.bind(this),previous:this.previous.bind(this),jump:this.jump.bind(this),goToToday:this.goToToday.bind(this),isCurrentMonth:this.isCurrentMonth.bind(this),selectDate:this.selectDate.bind(this),updateTasks:this.updateTasks.bind(this)}}next(){this.state.currentMonth===11?(this.state.currentMonth=0,this.state.currentYear++):this.state.currentMonth++,this.state.selectedDate=null,this.state.selectedDayIndex=null,this.updateTasks(),this.notify()}previous(){this.state.currentMonth===0?(this.state.currentMonth=11,this.state.currentYear--):this.state.currentMonth--,this.state.selectedDate=null,this.state.selectedDayIndex=null,this.updateTasks(),this.notify()}jump(n,s){this.state.currentYear=n,this.state.currentMonth=s,this.state.selectedDate=null,this.state.selectedDayIndex=null,this.updateTasks(),this.notify()}goToToday(){const n=new Date;this.state.currentYear=n.getFullYear(),this.state.currentMonth=n.getMonth(),this.state.selectedDate=null,this.state.selectedDayIndex=null,this.updateTasks(),this.notify()}isCurrentMonth(){const n=new Date;return this.state.currentYear===n.getFullYear()&&this.state.currentMonth===n.getMonth()}selectDate(n,s){this.state.selectedDate=n,this.state.selectedDayIndex=s??null,this.state.currentDate=n.getDate(),this.state.currentMonth=n.getMonth(),this.state.currentYear=n.getFullYear(),this.updateTasks(),this.notify()}updateTasks(){if(!this.state.selectedDate){this.state.tasks=[];return}this.state.tasks=f(this.config.events,this.state.selectedDate)}updateEvents(n){this.config.events=n,this.updateTasks(),this.notify()}handleDateClick(n,s){this.selectDate(n,s)}hasEventsForDate(n){return f(this.config.events,n).length>0}getEventsForDate(n){return f(this.config.events,n)}clearSelection(){this.state.selectedDate=null,this.state.selectedDayIndex=null,this.state.tasks=[],this.notify()}getCategoryColor(n){return n?W(n,this.categoryColors):"#fc8917"}updateCategoryColors(n){this.categoryColors=V(n),this.notify()}getCategoryColors(){return{...this.categoryColors}}registerCategory(n,s){this.categoryColors[n]=s,this.notify()}destroy(){this.listeners.clear()}}const ge={key:0,class:"page--title"},ve={class:"calendar--content"},fe={class:"calendar--card"},ke={class:"calendar--nav-header"},De=["aria-expanded"],Ce={key:0,class:"calendar--picker-dropdown"},Ee={class:"calendar--picker-year-row"},be=["disabled"],Ne=["value"],Me=["disabled"],_e={class:"calendar--picker-months"},Be=["onClick"],Ve=["disabled"],Se={class:"calendar--table calendar--table--bordered"},Ye={class:"popup-header"},Te={key:0,class:"scroll-hint"},xe={class:"events-container"},Le=["onClick"],Oe={class:"event-header"},Ae={class:"event-title"},Pe={class:"event-badges"},Fe={key:0,class:"event-time"},$e={class:"event-time-value"},we={key:1,class:"event-description"},Ie={key:2,class:"event-time"},ze={class:"event-time-value"},He={key:3,class:"event-time"},Re={class:"event-time-value"},Ue={key:4,class:"event-time"},je={class:"event-time-value"},Je={key:5,class:"event-time"},Ge={class:"event-time-value"},We={key:6,class:"event-time"},Ke=["href"],qe={key:7,class:"event-tags"},Qe={key:1,class:"no-events-message"},S=e.defineComponent({__name:"Calendar",props:{class:{default:""},style:{default:()=>({})},title:{},theme:{},events:{default:()=>[]},initialDate:{},minYear:{},maxYear:{},weekStartsOn:{default:0},useShortMonthNames:{type:Boolean,default:!1},onDateSelect:{},onEventClick:{},onMonthChange:{}},emits:["date-select","event-click","month-change"],setup(t,{emit:n}){const s=t,i=n,c=new K({events:s.events,initialDate:s.initialDate,minYear:s.minYear,maxYear:s.maxYear,weekStartsOn:s.weekStartsOn}),b=e.ref(0),l=e.computed(()=>(b.value,c.getViewModel())),Y=e.computed(()=>l.value.tasks.length>3),h=c.getActions(),m=e.ref(!1),p=e.ref(""),k=e.ref(!0),D=e.ref(null),C=new Date,g=C.getMonth(),u=C.getFullYear(),d=e.computed(()=>s.minYear??u-30),E=e.computed(()=>s.maxYear??u+10),Q=e.computed(()=>l.value.currentYear===u&&l.value.currentMonth===g),X=a=>a?H(a):"",O=a=>j(a),Z=a=>J(a),ee=a=>({work:"WORK",personal:"PERSONAL",meeting:"MEETING",deadline:"DEADLINE",appointment:"APPOINTMENT",other:"OTHER"})[a]||a.toUpperCase(),te=a=>({high:"HIGH",medium:"MEDIUM",low:"LOW"})[a]||a.toUpperCase(),ne=a=>({completed:"COMPLETED",cancelled:"CANCELLED",tentative:"TENTATIVE",scheduled:"SCHEDULED"})[a]||a.toUpperCase(),ae=a=>{const o=a.target.closest("td");if(!o)return;const r=o.parentElement;if(!r)return;const y=r.rowIndex-1,v=Array.from(r.children).indexOf(o),N=l.value.calendarDates[y]?.[v];N&&(c.handleDateClick(N.date,v),i("date-select",N.date))},re=()=>{h.next(),i("month-change",l.value.currentYear,l.value.currentMonth)},se=()=>{h.previous(),i("month-change",l.value.currentYear,l.value.currentMonth)},oe=()=>{c.clearSelection()},le=()=>{m.value=!m.value,m.value&&(p.value=String(l.value.currentYear),k.value=!0)},ie=()=>{h.goToToday(),m.value=!1,i("month-change",u,g)},ce=a=>{const o=a.target.value;if(o===""||/^\d+$/.test(o)){p.value=o;const r=parseInt(o,10);k.value=o===""||r>=d.value&&r<=E.value}},A=()=>{const a=parseInt(p.value,10);isNaN(a)||a<d.value||a>E.value?(p.value=String(l.value.currentYear),k.value=!0):(h.jump(a,l.value.currentMonth),i("month-change",a,l.value.currentMonth))},ue=()=>{const a=l.value.currentYear-1;a>=d.value&&(h.jump(a,l.value.currentMonth),p.value=String(a),i("month-change",a,l.value.currentMonth))},de=()=>{const a=l.value.currentYear+1;a<=E.value&&(h.jump(a,l.value.currentMonth),p.value=String(a),i("month-change",a,l.value.currentMonth))},he=a=>{h.jump(l.value.currentYear,a),m.value=!1,i("month-change",l.value.currentYear,a)},P=a=>{D.value&&!D.value.contains(a.target)&&(m.value=!1)};e.watch(()=>s.events,a=>{c.updateEvents(a),b.value++},{deep:!0}),e.watch(()=>s.theme,a=>{if(a){const o=document.documentElement;a.primary&&o.style.setProperty("--calendar-primary-color",a.primary),a.secondary&&o.style.setProperty("--calendar-secondary-color",a.secondary),a.tertiary&&o.style.setProperty("--calendar-tertiary-color",a.tertiary),a.textColor&&o.style.setProperty("--calendar-text-color",a.textColor),a.textLight&&o.style.setProperty("--calendar-text-light",a.textLight),a.background&&o.style.setProperty("--calendar-background",a.background),a.cellHover&&o.style.setProperty("--calendar-cell-hover",a.cellHover),a.borderColor&&o.style.setProperty("--calendar-border-color",a.borderColor),a.todayOutline&&o.style.setProperty("--calendar-today-outline",a.todayOutline),a.selectedBg&&o.style.setProperty("--calendar-selected-bg",a.selectedBg),a.eventIndicator&&o.style.setProperty("--calendar-event-indicator",a.eventIndicator)}},{immediate:!0,deep:!0});let F=null;return e.onMounted(()=>{F=c.subscribe(()=>{b.value++}),document.addEventListener("mousedown",P)}),e.onUnmounted(()=>{F?.(),c.destroy(),document.removeEventListener("mousedown",P)}),(a,o)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["kalendly-calendar",s.class]),style:e.normalizeStyle(s.style)},[t.title||a.$slots.title?(e.openBlock(),e.createElementBlock("div",ge,[e.renderSlot(a.$slots,"title",{},()=>[e.createElementVNode("h1",null,e.toDisplayString(t.title),1)])])):e.createCommentVNode("",!0),e.createElementVNode("div",ve,[e.createElementVNode("div",fe,[e.createElementVNode("div",ke,[e.createElementVNode("button",{type:"button",class:"calendar--nav-arrow","aria-label":"Previous month",onClick:se}," ‹ "),e.createElementVNode("div",{ref_key:"pickerRef",ref:D,class:"calendar--picker-container"},[e.createElementVNode("button",{type:"button",class:"calendar--picker-btn","aria-expanded":m.value?"true":"false","aria-haspopup":"true",onClick:le},[e.createTextVNode(e.toDisplayString(s.useShortMonthNames?`${e.unref(B)[l.value.currentMonth]} ${l.value.currentYear}`:l.value.monthAndYearText)+" ",1),o[1]||(o[1]=e.createElementVNode("span",{class:"calendar--picker-chevron"},"▾",-1))],8,De),m.value?(e.openBlock(),e.createElementBlock("div",Ce,[e.createElementVNode("div",Ee,[e.createElementVNode("button",{type:"button",class:"calendar--picker-year-arrow",disabled:l.value.currentYear<=d.value,"aria-label":"Previous year",onClick:ue}," ‹ ",8,be),e.createElementVNode("input",{type:"text",class:e.normalizeClass(["calendar--picker-year-input",{invalid:!k.value}]),value:p.value,"aria-label":"Year",onInput:ce,onBlur:A,onKeydown:e.withKeys(A,["enter"])},null,42,Ne),e.createElementVNode("button",{type:"button",class:"calendar--picker-year-arrow",disabled:l.value.currentYear>=E.value,"aria-label":"Next year",onClick:de}," › ",8,Me)]),e.createElementVNode("div",_e,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(s.useShortMonthNames?e.unref(B):e.unref(T),(r,y)=>(e.openBlock(),e.createElementBlock("button",{key:r,type:"button",class:e.normalizeClass(["calendar--picker-month",{selected:y===l.value.currentMonth},{"current-month":y===e.unref(g)&&l.value.currentYear===e.unref(u)}]),onClick:v=>he(y)},e.toDisplayString(r),11,Be))),128))])])):e.createCommentVNode("",!0)],512),e.createElementVNode("button",{type:"button",class:"calendar--today-btn",disabled:Q.value,onClick:ie}," Today ",8,Ve),e.createElementVNode("button",{type:"button",class:"calendar--nav-arrow","aria-label":"Next month",onClick:re}," › ")]),e.createElementVNode("table",Se,[e.createElementVNode("thead",null,[e.createElementVNode("tr",null,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.value.days,r=>(e.openBlock(),e.createElementBlock("th",{key:r},e.toDisplayString(r.slice(0,3)),1))),128))])]),e.createElementVNode("tbody",{onClick:ae},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.value.calendarDates,(r,y)=>(e.openBlock(),e.createElementBlock("tr",{key:y},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(r,(v,N)=>(e.openBlock(),e.createElementBlock("td",{key:`${y}-${N}`,class:e.normalizeClass(X(v))},e.toDisplayString(v.date.getDate()),3))),128))]))),128))])]),l.value.selectedDate?(e.openBlock(),e.createElementBlock("div",{key:0,class:e.normalizeClass(["date-popup",l.value.popupPositionClass])},[e.createElementVNode("div",Ye,[e.createElementVNode("h2",null,e.toDisplayString(l.value.scheduleDay),1),e.createElementVNode("button",{type:"button",class:"popup-close","aria-label":"Close",onClick:oe}," ✕ ")]),Y.value?(e.openBlock(),e.createElementBlock("div",Te," ↓ Scroll to see more events ↓ ")):e.createCommentVNode("",!0),e.createElementVNode("div",xe,[l.value.tasks.length>0?(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:0},e.renderList(l.value.tasks,r=>(e.openBlock(),e.createElementBlock("div",{key:r.id||r.name,class:"event-card",style:e.normalizeStyle([{borderLeftColor:r.color},{cursor:"pointer"}]),onClick:y=>i("event-click",r)},[e.renderSlot(a.$slots,"event",{event:r},()=>[e.createElementVNode("div",Oe,[e.createElementVNode("div",Ae,e.toDisplayString(r.name),1),e.createElementVNode("div",Pe,[r.category?(e.openBlock(),e.createElementBlock("span",{key:0,class:e.normalizeClass(`badge category-${r.category}`)},e.toDisplayString(ee(r.category)),3)):e.createCommentVNode("",!0),r.priority?(e.openBlock(),e.createElementBlock("span",{key:1,class:e.normalizeClass(`badge priority-${r.priority}`)},e.toDisplayString(te(r.priority)),3)):e.createCommentVNode("",!0),r.status&&r.status!=="scheduled"?(e.openBlock(),e.createElementBlock("span",{key:2,class:e.normalizeClass(`badge status-${r.status}`)},e.toDisplayString(ne(r.status)),3)):e.createCommentVNode("",!0)])]),O(r)?(e.openBlock(),e.createElementBlock("div",Fe,[o[2]||(o[2]=e.createElementVNode("span",{class:"event-time-label"},"Time:",-1)),e.createElementVNode("span",$e,e.toDisplayString(O(r)),1)])):e.createCommentVNode("",!0),r.description?(e.openBlock(),e.createElementBlock("div",we,e.toDisplayString(r.description),1)):e.createCommentVNode("",!0),r.location?(e.openBlock(),e.createElementBlock("div",Ie,[o[3]||(o[3]=e.createElementVNode("span",{class:"event-time-label"},"Location:",-1)),e.createElementVNode("span",ze,e.toDisplayString(r.location),1)])):e.createCommentVNode("",!0),r.attendees&&r.attendees.length>0?(e.openBlock(),e.createElementBlock("div",He,[o[4]||(o[4]=e.createElementVNode("span",{class:"event-time-label"},"Attendees:",-1)),e.createElementVNode("span",Re,e.toDisplayString(Z(r.attendees)),1)])):e.createCommentVNode("",!0),r.organizer?(e.openBlock(),e.createElementBlock("div",Ue,[o[5]||(o[5]=e.createElementVNode("span",{class:"event-time-label"},"Organizer:",-1)),e.createElementVNode("span",je,e.toDisplayString(r.organizer),1)])):e.createCommentVNode("",!0),r.notes?(e.openBlock(),e.createElementBlock("div",Je,[o[6]||(o[6]=e.createElementVNode("span",{class:"event-time-label"},"Notes:",-1)),e.createElementVNode("span",Ge,e.toDisplayString(r.notes),1)])):e.createCommentVNode("",!0),r.url?(e.openBlock(),e.createElementBlock("div",We,[e.createElementVNode("a",{href:r.url,target:"_blank",rel:"noopener noreferrer",class:"event-link",onClick:o[0]||(o[0]=e.withModifiers(()=>{},["stop"]))}," View Details → ",8,Ke)])):e.createCommentVNode("",!0),r.tags&&r.tags.length>0?(e.openBlock(),e.createElementBlock("div",qe,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(r.tags,(y,v)=>(e.openBlock(),e.createElementBlock("span",{key:v,class:"event-tag"},e.toDisplayString(y),1))),128))])):e.createCommentVNode("",!0)])],12,Le))),128)):(e.openBlock(),e.createElementBlock("div",Qe,[e.renderSlot(a.$slots,"no-events",{},()=>[o[7]||(o[7]=e.createTextVNode(" No events scheduled for this day. ",-1))])]))])],2)):e.createCommentVNode("",!0)])])],6))}});function q(t){t.component("Kalendly",S)}const Xe={install:q,Calendar:S};function Ze(t){return S}exports.Calendar=S;exports.CalendarEngine=K;exports.DAYS=x;exports.DEFAULT_CATEGORY_COLORS=L;exports.MONTHS=B;exports.MONTHS_FULL=T;exports.createCalendar=Ze;exports.default=Xe;exports.formatAttendees=J;exports.formatDateForDisplay=R;exports.formatTimeRange=j;exports.generateCalendarDates=I;exports.generateYears=w;exports.getCategoryColor=W;exports.getCellClasses=H;exports.getDefaultEventColor=ye;exports.getEventsForDate=f;exports.getMonthYearText=U;exports.getPopupPositionClass=z;exports.hasEvents=me;exports.install=q;exports.isSameDay=$;exports.isToday=_;exports.isValidHexColor=G;exports.mergeCategoryColors=V;exports.normalizeDate=M;exports.sortEventsByTime=pe;