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/react-native/components/Calendar.tsx","../../src/core/utils.ts","../../src/core/calendar-engine.ts","../../src/react-native/components/DatePopup.tsx","../../src/styles/react-native-styles.ts"],"sourcesContent":["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 { CalendarEvent, CalendarDate, CategoryColorMap } from './types';\n\nexport const MONTHS = [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec',\n];\n\nexport const MONTHS_FULL = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n];\n\nexport const DAYS = [\n 'Sunday',\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n];\n\nexport function normalizeDate(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0);\n}\n\nexport function isSameDay(date1: Date, date2: Date): boolean {\n return normalizeDate(date1).getTime() === normalizeDate(date2).getTime();\n}\n\nexport function isToday(date: Date): boolean {\n return isSameDay(date, new Date());\n}\n\nexport function generateYears(minYear?: number, maxYear?: number): number[] {\n const currentYear = new Date().getFullYear();\n const min = minYear ?? currentYear - 30;\n const max = maxYear ?? currentYear + 10;\n\n return Array.from({ length: max - min + 1 }, (_, i) => min + i);\n}\n\nexport function getEventsForDate(\n events: CalendarEvent[],\n date: Date\n): CalendarEvent[] {\n const normalizedTargetDate = normalizeDate(date);\n\n return events.filter(event => {\n const eventDate = normalizeDate(new Date(event.date));\n return eventDate.getTime() === normalizedTargetDate.getTime();\n });\n}\n\nexport function hasEvents(events: CalendarEvent[], date: Date): boolean {\n return getEventsForDate(events, date).length > 0;\n}\n\nexport function generateCalendarDates(\n year: number,\n month: number,\n events: CalendarEvent[] = [],\n weekStartsOn: 0 | 1 = 0\n): CalendarDate[][] {\n const firstDay = new Date(year, month, 1);\n const lastDay = new Date(year, month + 1, 0);\n const daysInMonth = lastDay.getDate();\n const prevMonthLastDay = new Date(year, month, 0).getDate();\n\n let firstDayOfWeek = firstDay.getDay();\n if (weekStartsOn === 1) {\n firstDayOfWeek = firstDayOfWeek === 0 ? 6 : firstDayOfWeek - 1;\n }\n\n const dates: CalendarDate[][] = [];\n let day = 1;\n let nextMonthDay = 1;\n\n for (let week = 0; week < 6; week++) {\n const weekDates: CalendarDate[] = [];\n\n for (let dayOfWeek = 0; dayOfWeek < 7; dayOfWeek++) {\n if (week === 0 && dayOfWeek < firstDayOfWeek) {\n // Previous month days\n const prevDay = prevMonthLastDay - firstDayOfWeek + dayOfWeek + 1;\n const prevDate = new Date(year, month - 1, prevDay);\n const dateEvents = getEventsForDate(events, prevDate);\n weekDates.push({\n date: prevDate,\n isCurrentMonth: false,\n isToday: isToday(prevDate),\n hasEvents: dateEvents.length > 0,\n events: dateEvents,\n });\n } else if (day > daysInMonth) {\n // Next month days\n const nextDate = new Date(year, month + 1, nextMonthDay);\n const dateEvents = getEventsForDate(events, nextDate);\n weekDates.push({\n date: nextDate,\n isCurrentMonth: false,\n isToday: isToday(nextDate),\n hasEvents: dateEvents.length > 0,\n events: dateEvents,\n });\n nextMonthDay++;\n } else {\n // Current month days\n const currentDate = new Date(year, month, day);\n const dateEvents = getEventsForDate(events, currentDate);\n weekDates.push({\n date: currentDate,\n isCurrentMonth: true,\n isToday: isToday(currentDate),\n hasEvents: dateEvents.length > 0,\n events: dateEvents,\n });\n day++;\n }\n }\n\n dates.push(weekDates);\n }\n\n return dates;\n}\n\nexport function getPopupPositionClass(selectedDayIndex: number | null): string {\n if (selectedDayIndex === null) return 'popup-center-bottom';\n\n if (selectedDayIndex < 3) {\n return 'popup-right';\n } else if (selectedDayIndex > 4) {\n return 'popup-left';\n } else {\n return 'popup-center-bottom';\n }\n}\n\nexport function getCellClasses(calendarDate: CalendarDate): string[] {\n const classes: string[] = [];\n\n if (!calendarDate.isCurrentMonth) {\n classes.push('other-month');\n }\n\n if (calendarDate.isToday) {\n classes.push('schedule--current--exam');\n }\n\n if (calendarDate.hasEvents) {\n classes.push('has--event');\n }\n\n return classes;\n}\n\nexport function formatDateForDisplay(date: Date): string {\n return `${DAYS[date.getDay()]} ${date.getDate()}`;\n}\n\nexport function getMonthYearText(year: number, month: number): string {\n return `${MONTHS_FULL[month]} ${year}`;\n}\n\nexport function formatTimeRange(event: CalendarEvent): string {\n if (event.allDay || (!event.startTime && !event.endTime)) {\n return 'All day';\n }\n\n if (event.startTime && event.endTime) {\n return `${event.startTime} - ${event.endTime}`;\n }\n\n if (event.startTime) {\n return `${event.startTime}`;\n }\n\n return '';\n}\n\nexport function formatAttendees(attendees?: string[]): string {\n if (!attendees || attendees.length === 0) return '';\n\n if (attendees.length === 1) return attendees[0];\n if (attendees.length === 2) return attendees.join(' and ');\n\n return `${attendees.slice(0, -1).join(', ')}, and ${attendees[attendees.length - 1]}`;\n}\n\nexport function sortEventsByTime(events: CalendarEvent[]): CalendarEvent[] {\n return [...events].sort((a, b) => {\n const aAllDay = a.allDay || (!a.startTime && !a.endTime);\n const bAllDay = b.allDay || (!b.startTime && !b.endTime);\n\n if (aAllDay && !bAllDay) return -1;\n if (!aAllDay && bAllDay) return 1;\n\n if (!a.startTime || !b.startTime) return 0;\n return a.startTime.localeCompare(b.startTime);\n });\n}\n\nexport const DEFAULT_CATEGORY_COLORS: CategoryColorMap = {\n work: '#3b82f6',\n personal: '#8b5cf6',\n meeting: '#10b981',\n deadline: '#ef4444',\n appointment: '#f59e0b',\n other: '#6b7280',\n};\n\n// Dynamic function that accepts custom colors\nexport function getDefaultEventColor(\n category?: string,\n customColors?: CategoryColorMap\n): string {\n const colorMap = customColors || DEFAULT_CATEGORY_COLORS;\n\n if (category && colorMap[category]) {\n return colorMap[category];\n }\n\n // Default fallback color\n return '#fc8917';\n}\n\n// Helper to merge custom colors with defaults\nexport function mergeCategoryColors(\n customColors?: CategoryColorMap\n): CategoryColorMap {\n return {\n ...DEFAULT_CATEGORY_COLORS,\n ...customColors,\n };\n}\n\n// Validate if a color is a valid hex color\nexport function isValidHexColor(color: string): boolean {\n return /^#([0-9A-F]{3}){1,2}$/i.test(color);\n}\n\n// Get color for a category with validation\nexport function getCategoryColor(\n category: string,\n customColors?: CategoryColorMap\n): string {\n const colorMap = mergeCategoryColors(customColors);\n const color = colorMap[category] || colorMap.other || '#fc8917';\n\n return isValidHexColor(color) ? color : '#fc8917';\n}\n","import {\n CalendarEvent,\n CalendarState,\n CalendarConfig,\n CalendarActions,\n CalendarViewModel,\n CategoryColorMap,\n} from './types';\nimport {\n generateCalendarDates,\n getEventsForDate,\n generateYears,\n getPopupPositionClass,\n getMonthYearText,\n formatDateForDisplay,\n mergeCategoryColors,\n getCategoryColor,\n MONTHS,\n DAYS,\n} from './utils';\n\nexport class CalendarEngine {\n private state: CalendarState;\n private config: CalendarConfig;\n private listeners: Set<() => void> = new Set();\n private categoryColors: CategoryColorMap;\n\n constructor(config: CalendarConfig) {\n this.config = config;\n this.categoryColors = mergeCategoryColors(config.categoryColors);\n\n const initialDate = config.initialDate || new Date();\n this.state = {\n currentYear: initialDate.getFullYear(),\n currentMonth: initialDate.getMonth(),\n currentDate: initialDate.getDate(),\n selectedDate: null,\n selectedDayIndex: null,\n tasks: [],\n };\n }\n\n /**\n * Subscribe to state changes\n */\n subscribe(listener: () => void): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n /**\n * Notify all listeners of state changes\n */\n private notify(): void {\n this.listeners.forEach(listener => listener());\n }\n\n /**\n * Get current state\n */\n getState(): CalendarState {\n return { ...this.state };\n }\n\n /**\n * Get view model with computed properties\n */\n getViewModel(): CalendarViewModel {\n const calendarDates = generateCalendarDates(\n this.state.currentYear,\n this.state.currentMonth,\n this.config.events,\n this.config.weekStartsOn\n );\n\n return {\n ...this.state,\n months: MONTHS,\n days: DAYS,\n years: generateYears(this.config.minYear, this.config.maxYear),\n monthAndYearText: getMonthYearText(\n this.state.currentYear,\n this.state.currentMonth\n ),\n scheduleDay: this.state.selectedDate\n ? formatDateForDisplay(this.state.selectedDate)\n : '',\n calendarDates,\n popupPositionClass: getPopupPositionClass(this.state.selectedDayIndex),\n };\n }\n\n /**\n * Get actions object\n */\n getActions(): CalendarActions {\n return {\n next: this.next.bind(this),\n previous: this.previous.bind(this),\n jump: this.jump.bind(this),\n goToToday: this.goToToday.bind(this),\n isCurrentMonth: this.isCurrentMonth.bind(this),\n selectDate: this.selectDate.bind(this),\n updateTasks: this.updateTasks.bind(this),\n };\n }\n\n /**\n * Navigate to next month\n */\n private next(): void {\n if (this.state.currentMonth === 11) {\n this.state.currentMonth = 0;\n this.state.currentYear++;\n } else {\n this.state.currentMonth++;\n }\n\n this.state.selectedDate = null;\n this.state.selectedDayIndex = null;\n this.updateTasks();\n this.notify();\n }\n\n /**\n * Navigate to previous month\n */\n private previous(): void {\n if (this.state.currentMonth === 0) {\n this.state.currentMonth = 11;\n this.state.currentYear--;\n } else {\n this.state.currentMonth--;\n }\n\n this.state.selectedDate = null;\n this.state.selectedDayIndex = null;\n this.updateTasks();\n this.notify();\n }\n\n /**\n * Jump to specific month and year\n */\n private jump(year: number, month: number): void {\n this.state.currentYear = year;\n this.state.currentMonth = month;\n this.state.selectedDate = null;\n this.state.selectedDayIndex = null;\n this.updateTasks();\n this.notify();\n }\n\n /**\n * Navigate to current month (today)\n */\n private goToToday(): void {\n const today = new Date();\n this.state.currentYear = today.getFullYear();\n this.state.currentMonth = today.getMonth();\n this.state.selectedDate = null;\n this.state.selectedDayIndex = null;\n this.updateTasks();\n this.notify();\n }\n\n /**\n * Check if currently viewing today's month\n */\n private isCurrentMonth(): boolean {\n const today = new Date();\n return (\n this.state.currentYear === today.getFullYear() &&\n this.state.currentMonth === today.getMonth()\n );\n }\n\n /**\n * Select a specific date\n */\n private selectDate(date: Date, dayIndex?: number): void {\n this.state.selectedDate = date;\n this.state.selectedDayIndex = dayIndex ?? null;\n this.state.currentDate = date.getDate();\n this.state.currentMonth = date.getMonth();\n this.state.currentYear = date.getFullYear();\n this.updateTasks();\n this.notify();\n }\n\n /**\n * Update tasks for the currently selected date\n */\n private updateTasks(): void {\n if (!this.state.selectedDate) {\n this.state.tasks = [];\n return;\n }\n\n this.state.tasks = getEventsForDate(\n this.config.events,\n this.state.selectedDate\n );\n }\n\n /**\n * Update events configuration\n */\n updateEvents(events: CalendarEvent[]): void {\n this.config.events = events;\n this.updateTasks();\n this.notify();\n }\n\n /**\n * Handle date cell click\n */\n handleDateClick(date: Date, dayIndex?: number): void {\n this.selectDate(date, dayIndex);\n }\n\n /**\n * Check if date has events\n */\n hasEventsForDate(date: Date): boolean {\n return getEventsForDate(this.config.events, date).length > 0;\n }\n\n /**\n * Get events for a specific date\n */\n getEventsForDate(date: Date): CalendarEvent[] {\n return getEventsForDate(this.config.events, date);\n }\n\n /**\n * Clear selected date\n */\n clearSelection(): void {\n this.state.selectedDate = null;\n this.state.selectedDayIndex = null;\n this.state.tasks = [];\n this.notify();\n }\n\n /**\n * Get category color (with custom colors support)\n */\n getCategoryColor(category?: string): string {\n if (!category) return '#fc8917';\n return getCategoryColor(category, this.categoryColors);\n }\n\n /**\n * Update category colors dynamically\n */\n updateCategoryColors(colors: CategoryColorMap): void {\n this.categoryColors = mergeCategoryColors(colors);\n this.notify();\n }\n\n /**\n * Get all category colors\n */\n getCategoryColors(): CategoryColorMap {\n return { ...this.categoryColors };\n }\n\n /**\n * Register a new category with color\n */\n registerCategory(name: string, color: string): void {\n this.categoryColors[name] = color;\n this.notify();\n }\n\n /**\n * Destroy the engine and cleanup listeners\n */\n destroy(): void {\n this.listeners.clear();\n }\n}\n","import React from 'react';\nimport {\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"],"mappings":"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","names":["View","Text","TouchableOpacity","ScrollView","Modal","StyleSheet","calendarStyles","jsx","jsxs","calendarStyles","ScrollView","View","Text","TouchableOpacity","Modal","isToday","hasEvents","StyleSheet"]}
@@ -1,265 +0,0 @@
1
- interface CalendarEvent {
2
- id: string | number;
3
- name: string;
4
- date: string | Date;
5
- startTime?: string;
6
- endTime?: string;
7
- allDay?: boolean;
8
- description?: string;
9
- color?: string;
10
- category?: 'work' | 'personal' | 'meeting' | 'deadline' | 'appointment' | 'other';
11
- location?: string;
12
- url?: string;
13
- status?: 'scheduled' | 'completed' | 'cancelled' | 'tentative';
14
- priority?: 'low' | 'medium' | 'high';
15
- attendees?: string[];
16
- organizer?: string;
17
- reminders?: number[];
18
- recurring?: {
19
- frequency: 'daily' | 'weekly' | 'monthly' | 'yearly';
20
- interval?: number;
21
- endDate?: string | Date;
22
- daysOfWeek?: number[];
23
- };
24
- notes?: string;
25
- tags?: string[];
26
- createdAt?: string | Date;
27
- updatedAt?: string | Date;
28
- [key: string]: unknown;
29
- }
30
- interface CalendarDate {
31
- date: Date;
32
- isCurrentMonth: boolean;
33
- isToday: boolean;
34
- hasEvents: boolean;
35
- events: CalendarEvent[];
36
- }
37
- interface CalendarState {
38
- currentYear: number;
39
- currentMonth: number;
40
- currentDate: number;
41
- selectedDate: Date | null;
42
- selectedDayIndex: number | null;
43
- tasks: CalendarEvent[];
44
- }
45
- interface CategoryColorMap {
46
- [category: string]: string;
47
- }
48
- interface CalendarConfig {
49
- events: CalendarEvent[];
50
- initialDate?: Date;
51
- minYear?: number;
52
- maxYear?: number;
53
- weekStartsOn?: 0 | 1;
54
- categoryColors?: CategoryColorMap;
55
- }
56
- interface CalendarActions {
57
- next: () => void;
58
- previous: () => void;
59
- jump: (year: number, month: number) => void;
60
- goToToday: () => void;
61
- isCurrentMonth: () => boolean;
62
- selectDate: (date: Date) => void;
63
- updateTasks: () => void;
64
- }
65
- interface PopupPosition {
66
- class: 'popup-left' | 'popup-right' | 'popup-center-top' | 'popup-center-bottom';
67
- style?: Record<string, string | number>;
68
- }
69
- interface CalendarViewModel extends CalendarState {
70
- months: string[];
71
- days: string[];
72
- years: number[];
73
- monthAndYearText: string;
74
- scheduleDay: string;
75
- calendarDates: CalendarDate[][];
76
- popupPositionClass: string;
77
- }
78
- type CalendarEventHandler = (event: CalendarEvent) => void;
79
- interface CalendarProps {
80
- events: CalendarEvent[];
81
- initialDate?: Date;
82
- minYear?: number;
83
- maxYear?: number;
84
- weekStartsOn?: 0 | 1;
85
- useShortMonthNames?: boolean;
86
- onDateSelect?: (date: Date) => void;
87
- onEventClick?: CalendarEventHandler;
88
- onMonthChange?: (year: number, month: number) => void;
89
- }
90
- interface CalendarTheme {
91
- primary?: string;
92
- secondary?: string;
93
- tertiary?: string;
94
- textColor?: string;
95
- textLight?: string;
96
- background?: string;
97
- cellHover?: string;
98
- borderColor?: string;
99
- todayOutline?: string;
100
- selectedBg?: string;
101
- eventIndicator?: string;
102
- }
103
-
104
- declare const MONTHS: string[];
105
- declare const MONTHS_FULL: string[];
106
- declare const DAYS: string[];
107
- declare function normalizeDate(date: Date): Date;
108
- declare function isSameDay(date1: Date, date2: Date): boolean;
109
- declare function isToday(date: Date): boolean;
110
- declare function generateYears(minYear?: number, maxYear?: number): number[];
111
- declare function getEventsForDate(events: CalendarEvent[], date: Date): CalendarEvent[];
112
- declare function hasEvents(events: CalendarEvent[], date: Date): boolean;
113
- declare function generateCalendarDates(year: number, month: number, events?: CalendarEvent[], weekStartsOn?: 0 | 1): CalendarDate[][];
114
- declare function getPopupPositionClass(selectedDayIndex: number | null): string;
115
- declare function getCellClasses(calendarDate: CalendarDate): string[];
116
- declare function formatDateForDisplay(date: Date): string;
117
- declare function getMonthYearText(year: number, month: number): string;
118
- declare function formatTimeRange(event: CalendarEvent): string;
119
- declare function formatAttendees(attendees?: string[]): string;
120
- declare function sortEventsByTime(events: CalendarEvent[]): CalendarEvent[];
121
- declare const DEFAULT_CATEGORY_COLORS: CategoryColorMap;
122
- declare function getDefaultEventColor(category?: string, customColors?: CategoryColorMap): string;
123
- declare function mergeCategoryColors(customColors?: CategoryColorMap): CategoryColorMap;
124
- declare function isValidHexColor(color: string): boolean;
125
- declare function getCategoryColor(category: string, customColors?: CategoryColorMap): string;
126
-
127
- declare class CalendarEngine {
128
- private state;
129
- private config;
130
- private listeners;
131
- private categoryColors;
132
- constructor(config: CalendarConfig);
133
- /**
134
- * Subscribe to state changes
135
- */
136
- subscribe(listener: () => void): () => void;
137
- /**
138
- * Notify all listeners of state changes
139
- */
140
- private notify;
141
- /**
142
- * Get current state
143
- */
144
- getState(): CalendarState;
145
- /**
146
- * Get view model with computed properties
147
- */
148
- getViewModel(): CalendarViewModel;
149
- /**
150
- * Get actions object
151
- */
152
- getActions(): CalendarActions;
153
- /**
154
- * Navigate to next month
155
- */
156
- private next;
157
- /**
158
- * Navigate to previous month
159
- */
160
- private previous;
161
- /**
162
- * Jump to specific month and year
163
- */
164
- private jump;
165
- /**
166
- * Navigate to current month (today)
167
- */
168
- private goToToday;
169
- /**
170
- * Check if currently viewing today's month
171
- */
172
- private isCurrentMonth;
173
- /**
174
- * Select a specific date
175
- */
176
- private selectDate;
177
- /**
178
- * Update tasks for the currently selected date
179
- */
180
- private updateTasks;
181
- /**
182
- * Update events configuration
183
- */
184
- updateEvents(events: CalendarEvent[]): void;
185
- /**
186
- * Handle date cell click
187
- */
188
- handleDateClick(date: Date, dayIndex?: number): void;
189
- /**
190
- * Check if date has events
191
- */
192
- hasEventsForDate(date: Date): boolean;
193
- /**
194
- * Get events for a specific date
195
- */
196
- getEventsForDate(date: Date): CalendarEvent[];
197
- /**
198
- * Clear selected date
199
- */
200
- clearSelection(): void;
201
- /**
202
- * Get category color (with custom colors support)
203
- */
204
- getCategoryColor(category?: string): string;
205
- /**
206
- * Update category colors dynamically
207
- */
208
- updateCategoryColors(colors: CategoryColorMap): void;
209
- /**
210
- * Get all category colors
211
- */
212
- getCategoryColors(): CategoryColorMap;
213
- /**
214
- * Register a new category with color
215
- */
216
- registerCategory(name: string, color: string): void;
217
- /**
218
- * Destroy the engine and cleanup listeners
219
- */
220
- destroy(): void;
221
- }
222
-
223
- interface VanillaCalendarProps extends CalendarProps {
224
- container: HTMLElement | string;
225
- className?: string;
226
- title?: string;
227
- renderEvent?: (event: CalendarEvent) => string;
228
- renderNoEvents?: () => string;
229
- theme?: CalendarTheme;
230
- }
231
- interface VanillaCalendarInstance {
232
- destroy: () => void;
233
- updateEvents: (events: CalendarEvent[]) => void;
234
- updateTheme: (theme: CalendarTheme) => void;
235
- getCurrentDate: () => Date | null;
236
- goToDate: (date: Date) => void;
237
- getEngine: () => CalendarEngine;
238
- }
239
-
240
- declare class VanillaCalendar implements VanillaCalendarInstance {
241
- private engine;
242
- private container;
243
- private unsubscribe;
244
- private props;
245
- private actions;
246
- private pickerOpen;
247
- private yearInput;
248
- private yearInputValid;
249
- private clickOutsideHandler;
250
- constructor(props: VanillaCalendarProps);
251
- private applyTheme;
252
- private init;
253
- private render;
254
- private attachEventListeners;
255
- private dispatchMonthChange;
256
- updateEvents(events: CalendarEvent[]): void;
257
- updateTheme(theme: CalendarTheme): void;
258
- getCurrentDate(): Date | null;
259
- goToDate(date: Date): void;
260
- getEngine(): CalendarEngine;
261
- destroy(): void;
262
- }
263
- declare function createCalendar(props: VanillaCalendarProps): VanillaCalendarInstance;
264
-
265
- export { type CalendarActions, type CalendarConfig, type CalendarDate, CalendarEngine, type CalendarEvent, type CalendarEventHandler, type CalendarProps, type CalendarState, type CalendarTheme, type CalendarViewModel, type CategoryColorMap, DAYS, DEFAULT_CATEGORY_COLORS, MONTHS, MONTHS_FULL, type PopupPosition, VanillaCalendar, type VanillaCalendarInstance, type VanillaCalendarProps, createCalendar, formatAttendees, formatDateForDisplay, formatTimeRange, generateCalendarDates, generateYears, getCategoryColor, getCellClasses, getDefaultEventColor, getEventsForDate, getMonthYearText, getPopupPositionClass, hasEvents, isSameDay, isToday, isValidHexColor, mergeCategoryColors, normalizeDate, sortEventsByTime };