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.
- package/README.md +318 -680
- package/dist/core/index.js +3 -3
- package/dist/index.d.mts +53 -601
- package/dist/index.d.ts +53 -601
- package/dist/index.js +760 -2350
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +734 -2339
- package/dist/index.mjs.map +1 -1
- package/dist/{vanilla/index.umd.js → index.umd.js} +323 -307
- package/dist/index.umd.js.map +1 -0
- package/package.json +41 -91
- package/dist/react/index.d.mts +0 -251
- package/dist/react/index.d.ts +0 -251
- package/dist/react/index.js +0 -969
- package/dist/react/index.js.map +0 -1
- package/dist/react/index.mjs +0 -924
- package/dist/react/index.mjs.map +0 -1
- package/dist/react-native/index.d.mts +0 -642
- package/dist/react-native/index.d.ts +0 -642
- package/dist/react-native/index.js +0 -1649
- package/dist/react-native/index.js.map +0 -1
- package/dist/react-native/index.mjs +0 -1615
- package/dist/react-native/index.mjs.map +0 -1
- package/dist/vanilla/index.d.mts +0 -265
- package/dist/vanilla/index.d.ts +0 -265
- package/dist/vanilla/index.js +0 -1048
- package/dist/vanilla/index.js.map +0 -1
- package/dist/vanilla/index.mjs +0 -997
- package/dist/vanilla/index.mjs.map +0 -1
- package/dist/vanilla/index.umd.js.map +0 -1
- package/dist/vue/components/Calendar.vue.d.ts +0 -43
- package/dist/vue/components/Calendar.vue.d.ts.map +0 -1
- package/dist/vue/index.d.ts +0 -134
- package/dist/vue/index.d.ts.map +0 -1
- package/dist/vue/index.js +0 -1
- package/dist/vue/index.mjs +0 -717
- package/dist/vue/types.d.ts +0 -21
- package/dist/vue/types.d.ts.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/react-native/index.tsx","../../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":["export { Calendar } from './components/Calendar';\nexport { DatePopup } from './components/DatePopup';\nexport * from './types';\nexport { calendarStyles } from '../styles/react-native-styles';\n\n// Re-export core types and utilities for convenience\nexport * from '../core';\n","import React, { useEffect, useState, useCallback, useMemo } from 'react';\nimport {\n View,\n Text,\n TouchableOpacity,\n ScrollView,\n TextInput,\n Modal,\n Pressable,\n Dimensions,\n StyleSheet,\n} from 'react-native';\nimport {\n CalendarEngine,\n getCellClasses,\n MONTHS_FULL,\n MONTHS,\n} from '../../core';\nimport { CalendarComponentProps } from '../types';\nimport { DatePopup } from './DatePopup';\nimport {\n getResponsiveStyles,\n CalendarColors,\n} from '../../styles/react-native-styles';\n\nexport const Calendar: React.FC<CalendarComponentProps> = ({\n events,\n initialDate,\n minYear,\n maxYear,\n weekStartsOn = 0,\n useShortMonthNames = false,\n onDateSelect,\n onEventClick,\n onMonthChange,\n style,\n containerStyle,\n headerStyle,\n headerTextStyle,\n cellStyle,\n cellTextStyle,\n renderEvent,\n renderNoEvents,\n title,\n showCloseButton = true,\n theme,\n}) => {\n const engine = useMemo(\n () =>\n new CalendarEngine({\n events,\n initialDate,\n minYear,\n maxYear,\n weekStartsOn,\n }),\n [events, initialDate, minYear, maxYear, weekStartsOn]\n );\n\n // Map CalendarTheme to CalendarColors format\n const themeColors = useMemo<Partial<CalendarColors> | undefined>(() => {\n if (!theme) return undefined;\n return {\n primary: theme.primary,\n secondary: theme.secondary,\n tertiary: theme.tertiary,\n text: theme.textColor,\n border: theme.borderColor,\n todayOutline: theme.todayOutline,\n eventIndicator: theme.eventIndicator,\n background: theme.background,\n };\n }, [theme]);\n\n // Generate responsive styles based on screen dimensions and theme\n const calendarStyles = useMemo(() => {\n const { width, height } = Dimensions.get('window');\n return getResponsiveStyles(width, height, themeColors);\n }, [themeColors]);\n\n const [, forceUpdate] = useState({});\n const rerender = useCallback(() => forceUpdate({}), []);\n\n // Picker state\n const [pickerOpen, setPickerOpen] = useState(false);\n const [yearInput, setYearInput] = useState('');\n const [yearInputValid, setYearInputValid] = useState(true);\n\n const today = new Date();\n const todayMonth = today.getMonth();\n const todayYear = today.getFullYear();\n const computedMinYear = minYear ?? todayYear - 30;\n const computedMaxYear = maxYear ?? todayYear + 10;\n\n useEffect(() => {\n const unsubscribe = engine.subscribe(rerender);\n return unsubscribe;\n }, [engine, rerender]);\n\n useEffect(() => {\n engine.updateEvents(events);\n }, [engine, events]);\n\n useEffect(() => {\n return () => {\n engine.destroy();\n };\n }, [engine]);\n\n const viewModel = engine.getViewModel();\n const actions = engine.getActions();\n const { selectedDate, tasks } = viewModel;\n\n const isCurrentMonth =\n viewModel.currentYear === todayYear &&\n viewModel.currentMonth === todayMonth;\n\n const handleDatePress = (date: Date, dayIndex: number) => {\n engine.handleDateClick(date, dayIndex);\n onDateSelect?.(date);\n };\n\n const handleNext = () => {\n actions.next();\n onMonthChange?.(viewModel.currentYear, viewModel.currentMonth);\n };\n\n const handlePrevious = () => {\n actions.previous();\n onMonthChange?.(viewModel.currentYear, viewModel.currentMonth);\n };\n\n const handleGoToToday = () => {\n actions.goToToday();\n setPickerOpen(false);\n onMonthChange?.(todayYear, todayMonth);\n };\n\n const togglePicker = () => {\n const newOpen = !pickerOpen;\n setPickerOpen(newOpen);\n if (newOpen) {\n setYearInput(String(viewModel.currentYear));\n setYearInputValid(true);\n }\n };\n\n const handleYearInputChange = (value: string) => {\n if (value === '' || /^\\d+$/.test(value)) {\n setYearInput(value);\n const year = parseInt(value, 10);\n setYearInputValid(\n value === '' || (year >= computedMinYear && year <= computedMaxYear)\n );\n }\n };\n\n const handleYearInputSubmit = () => {\n const year = parseInt(yearInput, 10);\n if (isNaN(year) || year < computedMinYear || year > computedMaxYear) {\n setYearInput(String(viewModel.currentYear));\n setYearInputValid(true);\n } else {\n actions.jump(year, viewModel.currentMonth);\n onMonthChange?.(year, viewModel.currentMonth);\n }\n };\n\n const handleYearPrev = () => {\n const newYear = viewModel.currentYear - 1;\n if (newYear >= computedMinYear) {\n actions.jump(newYear, viewModel.currentMonth);\n setYearInput(String(newYear));\n onMonthChange?.(newYear, viewModel.currentMonth);\n }\n };\n\n const handleYearNext = () => {\n const newYear = viewModel.currentYear + 1;\n if (newYear <= computedMaxYear) {\n actions.jump(newYear, viewModel.currentMonth);\n setYearInput(String(newYear));\n onMonthChange?.(newYear, viewModel.currentMonth);\n }\n };\n\n const handleMonthSelect = (month: number) => {\n actions.jump(viewModel.currentYear, month);\n setPickerOpen(false);\n onMonthChange?.(viewModel.currentYear, month);\n };\n\n const closePopup = () => {\n engine.clearSelection();\n };\n\n return (\n <ScrollView style={[calendarStyles.container, containerStyle]}>\n {title && (\n <View style={calendarStyles.titleContainer}>\n <Text style={calendarStyles.title}>{title}</Text>\n </View>\n )}\n\n <View style={[calendarStyles.contentContainer, style]}>\n <View style={calendarStyles.card}>\n {/* Navigation Header */}\n <View style={[pickerStyles.navHeader, headerStyle]}>\n <TouchableOpacity\n style={pickerStyles.navArrow}\n onPress={handlePrevious}\n >\n <Text style={pickerStyles.navArrowText}>‹</Text>\n </TouchableOpacity>\n\n <TouchableOpacity\n style={pickerStyles.pickerBtn}\n onPress={togglePicker}\n >\n <Text style={[pickerStyles.pickerBtnText, headerTextStyle]}>\n {useShortMonthNames\n ? `${MONTHS[viewModel.currentMonth]} ${viewModel.currentYear}`\n : viewModel.monthAndYearText}\n </Text>\n <Text style={pickerStyles.chevron}>▼</Text>\n </TouchableOpacity>\n\n <TouchableOpacity\n style={[\n pickerStyles.todayBtn,\n isCurrentMonth && pickerStyles.todayBtnDisabled,\n ]}\n onPress={handleGoToToday}\n disabled={isCurrentMonth}\n >\n <Text\n style={[\n pickerStyles.todayBtnText,\n isCurrentMonth && pickerStyles.todayBtnTextDisabled,\n ]}\n >\n Today\n </Text>\n </TouchableOpacity>\n\n <TouchableOpacity\n style={pickerStyles.navArrow}\n onPress={handleNext}\n >\n <Text style={pickerStyles.navArrowText}>›</Text>\n </TouchableOpacity>\n </View>\n\n {/* Month/Year Picker Modal */}\n <Modal\n visible={pickerOpen}\n transparent\n animationType=\"fade\"\n onRequestClose={() => setPickerOpen(false)}\n >\n <Pressable\n style={pickerStyles.modalOverlay}\n onPress={() => setPickerOpen(false)}\n >\n <Pressable\n style={pickerStyles.pickerDropdown}\n onPress={e => e.stopPropagation()}\n >\n {/* Year Selector */}\n <View style={pickerStyles.yearRow}>\n <TouchableOpacity\n style={pickerStyles.yearArrow}\n onPress={handleYearPrev}\n disabled={viewModel.currentYear <= computedMinYear}\n >\n <Text\n style={[\n pickerStyles.yearArrowText,\n viewModel.currentYear <= computedMinYear &&\n pickerStyles.yearArrowDisabled,\n ]}\n >\n ‹\n </Text>\n </TouchableOpacity>\n\n <TextInput\n style={[\n pickerStyles.yearInput,\n !yearInputValid && pickerStyles.yearInputInvalid,\n ]}\n value={yearInput}\n onChangeText={handleYearInputChange}\n onSubmitEditing={handleYearInputSubmit}\n onBlur={handleYearInputSubmit}\n keyboardType=\"number-pad\"\n maxLength={4}\n />\n\n <TouchableOpacity\n style={pickerStyles.yearArrow}\n onPress={handleYearNext}\n disabled={viewModel.currentYear >= computedMaxYear}\n >\n <Text\n style={[\n pickerStyles.yearArrowText,\n viewModel.currentYear >= computedMaxYear &&\n pickerStyles.yearArrowDisabled,\n ]}\n >\n ›\n </Text>\n </TouchableOpacity>\n </View>\n\n {/* Month Grid */}\n <View style={pickerStyles.monthGrid}>\n {(useShortMonthNames ? MONTHS : MONTHS_FULL).map(\n (month, index) => {\n const isSelected = index === viewModel.currentMonth;\n const isCurrent =\n index === todayMonth &&\n viewModel.currentYear === todayYear;\n return (\n <TouchableOpacity\n key={month}\n style={[\n pickerStyles.monthBtn,\n isSelected && pickerStyles.monthBtnSelected,\n isCurrent && pickerStyles.monthBtnCurrent,\n ]}\n onPress={() => handleMonthSelect(index)}\n >\n <Text\n style={[\n pickerStyles.monthBtnText,\n isSelected && pickerStyles.monthBtnTextSelected,\n ]}\n >\n {month}\n </Text>\n </TouchableOpacity>\n );\n }\n )}\n </View>\n </Pressable>\n </Pressable>\n </Modal>\n\n <View style={calendarStyles.table}>\n {/* Table Header */}\n <View style={calendarStyles.tableHeader}>\n {viewModel.days.map(day => (\n <View key={day} style={calendarStyles.tableHeaderCell}>\n <Text style={calendarStyles.tableHeaderText}>\n {day.slice(0, 3)}\n </Text>\n </View>\n ))}\n </View>\n\n {/* Calendar Rows */}\n {viewModel.calendarDates.map((week, weekIndex) => (\n <View key={weekIndex} style={calendarStyles.tableRow}>\n {week.map((calendarDate, dayIndex) => {\n const cellClasses = getCellClasses(calendarDate);\n const isToday = cellClasses.includes(\n 'schedule--current--exam'\n );\n const hasEvents = cellClasses.includes('has--event');\n const isOtherMonth = cellClasses.includes('other-month');\n\n return (\n <TouchableOpacity\n key={`${weekIndex}-${dayIndex}`}\n style={[\n calendarStyles.tableCell,\n cellStyle,\n isToday && calendarStyles.cellToday,\n hasEvents && calendarStyles.cellWithEvents,\n isOtherMonth && pickerStyles.cellOtherMonth,\n ]}\n onPress={() => {\n handleDatePress(calendarDate.date, dayIndex);\n }}\n >\n <Text\n style={[\n calendarStyles.tableCellText,\n cellTextStyle,\n isToday && calendarStyles.cellTodayText,\n isOtherMonth && pickerStyles.cellOtherMonthText,\n ]}\n >\n {calendarDate.date.getDate()}\n </Text>\n {hasEvents && (\n <View style={calendarStyles.eventIndicator} />\n )}\n </TouchableOpacity>\n );\n })}\n </View>\n ))}\n </View>\n </View>\n </View>\n\n <DatePopup\n visible={!!selectedDate}\n selectedDate={selectedDate}\n events={tasks}\n scheduleDay={viewModel.scheduleDay}\n onClose={closePopup}\n onEventClick={onEventClick}\n renderEvent={renderEvent}\n renderNoEvents={renderNoEvents}\n showCloseButton={showCloseButton}\n />\n </ScrollView>\n );\n};\n\n// Picker styles for React Native\nconst pickerStyles = StyleSheet.create({\n navHeader: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n paddingVertical: 12,\n paddingHorizontal: 8,\n backgroundColor: '#f8f9fa',\n borderBottomWidth: 2,\n borderBottomColor: '#dee2e6',\n gap: 8,\n },\n navArrow: {\n width: 36,\n height: 36,\n borderRadius: 6,\n borderWidth: 1,\n borderColor: '#dee2e6',\n backgroundColor: '#fff',\n alignItems: 'center',\n justifyContent: 'center',\n },\n navArrowText: {\n fontSize: 20,\n color: '#2c3e50',\n },\n pickerBtn: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 16,\n paddingVertical: 8,\n borderRadius: 6,\n borderWidth: 1,\n borderColor: '#dee2e6',\n backgroundColor: '#fff',\n gap: 8,\n },\n pickerBtnText: {\n fontSize: 16,\n fontWeight: '600',\n color: '#2c3e50',\n },\n chevron: {\n fontSize: 10,\n color: '#2c3e50',\n },\n todayBtn: {\n paddingHorizontal: 16,\n paddingVertical: 8,\n borderRadius: 6,\n borderWidth: 1,\n borderColor: '#dee2e6',\n backgroundColor: '#fff',\n },\n todayBtnDisabled: {\n opacity: 0.5,\n },\n todayBtnText: {\n fontSize: 14,\n fontWeight: '500',\n color: '#2c3e50',\n },\n todayBtnTextDisabled: {\n color: '#9ca3af',\n },\n modalOverlay: {\n flex: 1,\n backgroundColor: 'rgba(0, 0, 0, 0.3)',\n justifyContent: 'center',\n alignItems: 'center',\n },\n pickerDropdown: {\n backgroundColor: '#fff',\n borderRadius: 12,\n padding: 16,\n minWidth: 280,\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 4 },\n shadowOpacity: 0.15,\n shadowRadius: 20,\n elevation: 10,\n },\n yearRow: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 12,\n marginBottom: 16,\n paddingBottom: 12,\n borderBottomWidth: 1,\n borderBottomColor: '#dee2e6',\n },\n yearArrow: {\n width: 32,\n height: 32,\n borderRadius: 6,\n backgroundColor: '#f3f4f6',\n alignItems: 'center',\n justifyContent: 'center',\n },\n yearArrowText: {\n fontSize: 18,\n fontWeight: '600',\n color: '#2c3e50',\n },\n yearArrowDisabled: {\n opacity: 0.3,\n },\n yearInput: {\n width: 80,\n paddingVertical: 6,\n paddingHorizontal: 8,\n borderRadius: 6,\n borderWidth: 1,\n borderColor: '#dee2e6',\n textAlign: 'center',\n fontSize: 18,\n fontWeight: '600',\n color: '#2c3e50',\n },\n yearInputInvalid: {\n borderColor: '#ef4444',\n backgroundColor: '#fef2f2',\n },\n monthGrid: {\n flexDirection: 'row',\n flexWrap: 'wrap',\n gap: 8,\n },\n monthBtn: {\n width: '30%',\n paddingVertical: 10,\n borderRadius: 6,\n backgroundColor: '#f9fafb',\n alignItems: 'center',\n },\n monthBtnSelected: {\n backgroundColor: '#fc8917',\n },\n monthBtnCurrent: {\n borderWidth: 1,\n borderColor: '#fc8917',\n },\n monthBtnText: {\n fontSize: 14,\n fontWeight: '500',\n color: '#2c3e50',\n },\n monthBtnTextSelected: {\n color: '#fff',\n fontWeight: '600',\n },\n cellOtherMonth: {\n backgroundColor: '#f9fafb',\n },\n cellOtherMonthText: {\n color: '#9ca3af',\n },\n});\n","import { 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":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,mBAAiE;AACjE,IAAAA,uBAUO;;;ACTA,IAAM,SAAS;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,cAAc;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,cAAc,MAAkB;AAC9C,SAAO,IAAI,KAAK,KAAK,YAAY,GAAG,KAAK,SAAS,GAAG,KAAK,QAAQ,GAAG,GAAG,GAAG,CAAC;AAC9E;AAEO,SAAS,UAAU,OAAa,OAAsB;AAC3D,SAAO,cAAc,KAAK,EAAE,QAAQ,MAAM,cAAc,KAAK,EAAE,QAAQ;AACzE;AAEO,SAAS,QAAQ,MAAqB;AAC3C,SAAO,UAAU,MAAM,oBAAI,KAAK,CAAC;AACnC;AAEO,SAAS,cAAc,SAAkB,SAA4B;AAC1E,QAAM,eAAc,oBAAI,KAAK,GAAE,YAAY;AAC3C,QAAM,MAAM,WAAW,cAAc;AACrC,QAAM,MAAM,WAAW,cAAc;AAErC,SAAO,MAAM,KAAK,EAAE,QAAQ,MAAM,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,MAAM,CAAC;AAChE;AAEO,SAAS,iBACd,QACA,MACiB;AACjB,QAAM,uBAAuB,cAAc,IAAI;AAE/C,SAAO,OAAO,OAAO,WAAS;AAC5B,UAAM,YAAY,cAAc,IAAI,KAAK,MAAM,IAAI,CAAC;AACpD,WAAO,UAAU,QAAQ,MAAM,qBAAqB,QAAQ;AAAA,EAC9D,CAAC;AACH;AAEO,SAAS,UAAU,QAAyB,MAAqB;AACtE,SAAO,iBAAiB,QAAQ,IAAI,EAAE,SAAS;AACjD;AAEO,SAAS,sBACd,MACA,OACA,SAA0B,CAAC,GAC3B,eAAsB,GACJ;AAClB,QAAM,WAAW,IAAI,KAAK,MAAM,OAAO,CAAC;AACxC,QAAM,UAAU,IAAI,KAAK,MAAM,QAAQ,GAAG,CAAC;AAC3C,QAAM,cAAc,QAAQ,QAAQ;AACpC,QAAM,mBAAmB,IAAI,KAAK,MAAM,OAAO,CAAC,EAAE,QAAQ;AAE1D,MAAI,iBAAiB,SAAS,OAAO;AACrC,MAAI,iBAAiB,GAAG;AACtB,qBAAiB,mBAAmB,IAAI,IAAI,iBAAiB;AAAA,EAC/D;AAEA,QAAM,QAA0B,CAAC;AACjC,MAAI,MAAM;AACV,MAAI,eAAe;AAEnB,WAAS,OAAO,GAAG,OAAO,GAAG,QAAQ;AACnC,UAAM,YAA4B,CAAC;AAEnC,aAAS,YAAY,GAAG,YAAY,GAAG,aAAa;AAClD,UAAI,SAAS,KAAK,YAAY,gBAAgB;AAE5C,cAAM,UAAU,mBAAmB,iBAAiB,YAAY;AAChE,cAAM,WAAW,IAAI,KAAK,MAAM,QAAQ,GAAG,OAAO;AAClD,cAAM,aAAa,iBAAiB,QAAQ,QAAQ;AACpD,kBAAU,KAAK;AAAA,UACb,MAAM;AAAA,UACN,gBAAgB;AAAA,UAChB,SAAS,QAAQ,QAAQ;AAAA,UACzB,WAAW,WAAW,SAAS;AAAA,UAC/B,QAAQ;AAAA,QACV,CAAC;AAAA,MACH,WAAW,MAAM,aAAa;AAE5B,cAAM,WAAW,IAAI,KAAK,MAAM,QAAQ,GAAG,YAAY;AACvD,cAAM,aAAa,iBAAiB,QAAQ,QAAQ;AACpD,kBAAU,KAAK;AAAA,UACb,MAAM;AAAA,UACN,gBAAgB;AAAA,UAChB,SAAS,QAAQ,QAAQ;AAAA,UACzB,WAAW,WAAW,SAAS;AAAA,UAC/B,QAAQ;AAAA,QACV,CAAC;AACD;AAAA,MACF,OAAO;AAEL,cAAM,cAAc,IAAI,KAAK,MAAM,OAAO,GAAG;AAC7C,cAAM,aAAa,iBAAiB,QAAQ,WAAW;AACvD,kBAAU,KAAK;AAAA,UACb,MAAM;AAAA,UACN,gBAAgB;AAAA,UAChB,SAAS,QAAQ,WAAW;AAAA,UAC5B,WAAW,WAAW,SAAS;AAAA,UAC/B,QAAQ;AAAA,QACV,CAAC;AACD;AAAA,MACF;AAAA,IACF;AAEA,UAAM,KAAK,SAAS;AAAA,EACtB;AAEA,SAAO;AACT;AAEO,SAAS,sBAAsB,kBAAyC;AAC7E,MAAI,qBAAqB,KAAM,QAAO;AAEtC,MAAI,mBAAmB,GAAG;AACxB,WAAO;AAAA,EACT,WAAW,mBAAmB,GAAG;AAC/B,WAAO;AAAA,EACT,OAAO;AACL,WAAO;AAAA,EACT;AACF;AAEO,SAAS,eAAe,cAAsC;AACnE,QAAM,UAAoB,CAAC;AAE3B,MAAI,CAAC,aAAa,gBAAgB;AAChC,YAAQ,KAAK,aAAa;AAAA,EAC5B;AAEA,MAAI,aAAa,SAAS;AACxB,YAAQ,KAAK,yBAAyB;AAAA,EACxC;AAEA,MAAI,aAAa,WAAW;AAC1B,YAAQ,KAAK,YAAY;AAAA,EAC3B;AAEA,SAAO;AACT;AAEO,SAAS,qBAAqB,MAAoB;AACvD,SAAO,GAAG,KAAK,KAAK,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;AACjD;AAEO,SAAS,iBAAiB,MAAc,OAAuB;AACpE,SAAO,GAAG,YAAY,KAAK,CAAC,IAAI,IAAI;AACtC;AAEO,SAAS,gBAAgB,OAA8B;AAC5D,MAAI,MAAM,UAAW,CAAC,MAAM,aAAa,CAAC,MAAM,SAAU;AACxD,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,aAAa,MAAM,SAAS;AACpC,WAAO,GAAG,MAAM,SAAS,MAAM,MAAM,OAAO;AAAA,EAC9C;AAEA,MAAI,MAAM,WAAW;AACnB,WAAO,GAAG,MAAM,SAAS;AAAA,EAC3B;AAEA,SAAO;AACT;AAEO,SAAS,gBAAgB,WAA8B;AAC5D,MAAI,CAAC,aAAa,UAAU,WAAW,EAAG,QAAO;AAEjD,MAAI,UAAU,WAAW,EAAG,QAAO,UAAU,CAAC;AAC9C,MAAI,UAAU,WAAW,EAAG,QAAO,UAAU,KAAK,OAAO;AAEzD,SAAO,GAAG,UAAU,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI,CAAC,SAAS,UAAU,UAAU,SAAS,CAAC,CAAC;AACrF;AAEO,SAAS,iBAAiB,QAA0C;AACzE,SAAO,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM;AAChC,UAAM,UAAU,EAAE,UAAW,CAAC,EAAE,aAAa,CAAC,EAAE;AAChD,UAAM,UAAU,EAAE,UAAW,CAAC,EAAE,aAAa,CAAC,EAAE;AAEhD,QAAI,WAAW,CAAC,QAAS,QAAO;AAChC,QAAI,CAAC,WAAW,QAAS,QAAO;AAEhC,QAAI,CAAC,EAAE,aAAa,CAAC,EAAE,UAAW,QAAO;AACzC,WAAO,EAAE,UAAU,cAAc,EAAE,SAAS;AAAA,EAC9C,CAAC;AACH;AAEO,IAAM,0BAA4C;AAAA,EACvD,MAAM;AAAA,EACN,UAAU;AAAA,EACV,SAAS;AAAA,EACT,UAAU;AAAA,EACV,aAAa;AAAA,EACb,OAAO;AACT;AAGO,SAAS,qBACd,UACA,cACQ;AACR,QAAM,WAAW,gBAAgB;AAEjC,MAAI,YAAY,SAAS,QAAQ,GAAG;AAClC,WAAO,SAAS,QAAQ;AAAA,EAC1B;AAGA,SAAO;AACT;AAGO,SAAS,oBACd,cACkB;AAClB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACF;AAGO,SAAS,gBAAgB,OAAwB;AACtD,SAAO,yBAAyB,KAAK,KAAK;AAC5C;AAGO,SAAS,iBACd,UACA,cACQ;AACR,QAAM,WAAW,oBAAoB,YAAY;AACjD,QAAM,QAAQ,SAAS,QAAQ,KAAK,SAAS,SAAS;AAEtD,SAAO,gBAAgB,KAAK,IAAI,QAAQ;AAC1C;;;AC1PO,IAAM,iBAAN,MAAqB;AAAA,EAM1B,YAAY,QAAwB;AAHpC,SAAQ,YAA6B,oBAAI,IAAI;AAI3C,SAAK,SAAS;AACd,SAAK,iBAAiB,oBAAoB,OAAO,cAAc;AAE/D,UAAM,cAAc,OAAO,eAAe,oBAAI,KAAK;AACnD,SAAK,QAAQ;AAAA,MACX,aAAa,YAAY,YAAY;AAAA,MACrC,cAAc,YAAY,SAAS;AAAA,MACnC,aAAa,YAAY,QAAQ;AAAA,MACjC,cAAc;AAAA,MACd,kBAAkB;AAAA,MAClB,OAAO,CAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,UAAkC;AAC1C,SAAK,UAAU,IAAI,QAAQ;AAC3B,WAAO,MAAM,KAAK,UAAU,OAAO,QAAQ;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAe;AACrB,SAAK,UAAU,QAAQ,cAAY,SAAS,CAAC;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,WAA0B;AACxB,WAAO,EAAE,GAAG,KAAK,MAAM;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,eAAkC;AAChC,UAAM,gBAAgB;AAAA,MACpB,KAAK,MAAM;AAAA,MACX,KAAK,MAAM;AAAA,MACX,KAAK,OAAO;AAAA,MACZ,KAAK,OAAO;AAAA,IACd;AAEA,WAAO;AAAA,MACL,GAAG,KAAK;AAAA,MACR,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,OAAO,cAAc,KAAK,OAAO,SAAS,KAAK,OAAO,OAAO;AAAA,MAC7D,kBAAkB;AAAA,QAChB,KAAK,MAAM;AAAA,QACX,KAAK,MAAM;AAAA,MACb;AAAA,MACA,aAAa,KAAK,MAAM,eACpB,qBAAqB,KAAK,MAAM,YAAY,IAC5C;AAAA,MACJ;AAAA,MACA,oBAAoB,sBAAsB,KAAK,MAAM,gBAAgB;AAAA,IACvE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAA8B;AAC5B,WAAO;AAAA,MACL,MAAM,KAAK,KAAK,KAAK,IAAI;AAAA,MACzB,UAAU,KAAK,SAAS,KAAK,IAAI;AAAA,MACjC,MAAM,KAAK,KAAK,KAAK,IAAI;AAAA,MACzB,WAAW,KAAK,UAAU,KAAK,IAAI;AAAA,MACnC,gBAAgB,KAAK,eAAe,KAAK,IAAI;AAAA,MAC7C,YAAY,KAAK,WAAW,KAAK,IAAI;AAAA,MACrC,aAAa,KAAK,YAAY,KAAK,IAAI;AAAA,IACzC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,OAAa;AACnB,QAAI,KAAK,MAAM,iBAAiB,IAAI;AAClC,WAAK,MAAM,eAAe;AAC1B,WAAK,MAAM;AAAA,IACb,OAAO;AACL,WAAK,MAAM;AAAA,IACb;AAEA,SAAK,MAAM,eAAe;AAC1B,SAAK,MAAM,mBAAmB;AAC9B,SAAK,YAAY;AACjB,SAAK,OAAO;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAiB;AACvB,QAAI,KAAK,MAAM,iBAAiB,GAAG;AACjC,WAAK,MAAM,eAAe;AAC1B,WAAK,MAAM;AAAA,IACb,OAAO;AACL,WAAK,MAAM;AAAA,IACb;AAEA,SAAK,MAAM,eAAe;AAC1B,SAAK,MAAM,mBAAmB;AAC9B,SAAK,YAAY;AACjB,SAAK,OAAO;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKQ,KAAK,MAAc,OAAqB;AAC9C,SAAK,MAAM,cAAc;AACzB,SAAK,MAAM,eAAe;AAC1B,SAAK,MAAM,eAAe;AAC1B,SAAK,MAAM,mBAAmB;AAC9B,SAAK,YAAY;AACjB,SAAK,OAAO;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAkB;AACxB,UAAM,QAAQ,oBAAI,KAAK;AACvB,SAAK,MAAM,cAAc,MAAM,YAAY;AAC3C,SAAK,MAAM,eAAe,MAAM,SAAS;AACzC,SAAK,MAAM,eAAe;AAC1B,SAAK,MAAM,mBAAmB;AAC9B,SAAK,YAAY;AACjB,SAAK,OAAO;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAA0B;AAChC,UAAM,QAAQ,oBAAI,KAAK;AACvB,WACE,KAAK,MAAM,gBAAgB,MAAM,YAAY,KAC7C,KAAK,MAAM,iBAAiB,MAAM,SAAS;AAAA,EAE/C;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAW,MAAY,UAAyB;AACtD,SAAK,MAAM,eAAe;AAC1B,SAAK,MAAM,mBAAmB,YAAY;AAC1C,SAAK,MAAM,cAAc,KAAK,QAAQ;AACtC,SAAK,MAAM,eAAe,KAAK,SAAS;AACxC,SAAK,MAAM,cAAc,KAAK,YAAY;AAC1C,SAAK,YAAY;AACjB,SAAK,OAAO;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAoB;AAC1B,QAAI,CAAC,KAAK,MAAM,cAAc;AAC5B,WAAK,MAAM,QAAQ,CAAC;AACpB;AAAA,IACF;AAEA,SAAK,MAAM,QAAQ;AAAA,MACjB,KAAK,OAAO;AAAA,MACZ,KAAK,MAAM;AAAA,IACb;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,QAA+B;AAC1C,SAAK,OAAO,SAAS;AACrB,SAAK,YAAY;AACjB,SAAK,OAAO;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,MAAY,UAAyB;AACnD,SAAK,WAAW,MAAM,QAAQ;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,MAAqB;AACpC,WAAO,iBAAiB,KAAK,OAAO,QAAQ,IAAI,EAAE,SAAS;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,MAA6B;AAC5C,WAAO,iBAAiB,KAAK,OAAO,QAAQ,IAAI;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAuB;AACrB,SAAK,MAAM,eAAe;AAC1B,SAAK,MAAM,mBAAmB;AAC9B,SAAK,MAAM,QAAQ,CAAC;AACpB,SAAK,OAAO;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,UAA2B;AAC1C,QAAI,CAAC,SAAU,QAAO;AACtB,WAAO,iBAAiB,UAAU,KAAK,cAAc;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAqB,QAAgC;AACnD,SAAK,iBAAiB,oBAAoB,MAAM;AAChD,SAAK,OAAO;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAsC;AACpC,WAAO,EAAE,GAAG,KAAK,eAAe;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,MAAc,OAAqB;AAClD,SAAK,eAAe,IAAI,IAAI;AAC5B,SAAK,OAAO;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACd,SAAK,UAAU,MAAM;AAAA,EACvB;AACF;;;ACzRA,IAAAC,uBAUO;;;ACXP,0BAA2B;AAEpB,IAAM,gBAAgB;AAAA,EAC3B,SAAS;AAAA,EACT,WAAW;AAAA,EACX,UAAU;AAAA,EACV,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,gBAAgB;AAClB;AAIO,IAAM,sBAAsB,CACjC,OACA,QACA,iBACG;AACH,QAAM,SAAS,EAAE,GAAG,eAAe,GAAG,aAAa;AAEnD,QAAM,WAAW,SAAS;AAC1B,QAAM,eAAe,QAAQ;AAC7B,QAAM,UAAU,QAAQ;AAGxB,QAAM,YAAY,QAAQ,MAAM;AAGhC,QAAM,aAAa,WAAW,MAAM,UAAU,QAAQ,OAAO,QAAQ;AACrE,QAAM,gBAAgB,WAAW,MAAM,UAAU,QAAQ;AACzD,QAAM,iBAAiB,WAAW,SAAS,MAAM,SAAS;AAG1D,QAAM,iBAAiB,WAAW,KAAK,eAAe,KAAK;AAC3D,QAAM,iBAAiB,WAAW,KAAK,eAAe,KAAK;AAC3D,QAAM,kBAAkB,WAAW,KAAK,eAAe,KAAK;AAC5D,QAAM,gBAAgB,WAAW,KAAK,eAAe,IAAI;AAGzD,QAAM,mBAAmB,WAAW,KAAK,eAAe,KAAK;AAC7D,QAAM,mBAAmB,WAAW,KAAK,eAAe,KAAK;AAE7D,SAAO,+BAAW,OAAO;AAAA,IACvB,WAAW;AAAA,MACT,MAAM;AAAA,MACN,iBAAiB,OAAO;AAAA,IAC1B;AAAA,IAEA,gBAAgB;AAAA,MACd,iBAAiB;AAAA,MACjB,YAAY;AAAA,IACd;AAAA,IAEA,OAAO;AAAA,MACL,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,OAAO,OAAO;AAAA,IAChB;AAAA,IAEA,kBAAkB;AAAA,MAChB,kBAAkB;AAAA,MAClB,WAAW;AAAA,IACb;AAAA,IAEA,MAAM;AAAA,MACJ,iBAAiB,OAAO;AAAA,MACxB,cAAc;AAAA,MACd,aAAa;AAAA,MACb,cAAc;AAAA,QACZ,OAAO;AAAA,QACP,QAAQ;AAAA,MACV;AAAA,MACA,eAAe;AAAA,MACf,cAAc;AAAA,MACd,WAAW;AAAA,MACX,UAAU;AAAA,IACZ;AAAA,IAEA,YAAY;AAAA,MACV,iBAAiB,OAAO;AAAA,MACxB,iBAAiB;AAAA,MACjB,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,mBAAmB,OAAO;AAAA,IAC5B;AAAA,IAEA,gBAAgB;AAAA,MACd,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,OAAO,OAAO;AAAA,MACd,WAAW;AAAA,IACb;AAAA,IAEA,OAAO;AAAA,MACL,iBAAiB,OAAO;AAAA,IAC1B;AAAA,IAEA,aAAa;AAAA,MACX,eAAe;AAAA,MACf,iBAAiB;AAAA,MACjB,mBAAmB;AAAA,MACnB,mBAAmB,OAAO;AAAA,IAC5B;AAAA,IAEA,iBAAiB;AAAA,MACf,MAAM;AAAA,MACN,iBAAiB;AAAA,MACjB,kBAAkB;AAAA,MAClB,kBAAkB,OAAO;AAAA,MACzB,YAAY;AAAA,MACZ,gBAAgB;AAAA,IAClB;AAAA,IAEA,iBAAiB;AAAA,MACf,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,OAAO,OAAO;AAAA,IAChB;AAAA,IAEA,UAAU;AAAA,MACR,eAAe;AAAA,MACf,mBAAmB;AAAA,MACnB,mBAAmB,OAAO;AAAA,IAC5B;AAAA,IAEA,WAAW;AAAA,MACT,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,kBAAkB;AAAA,MAClB,kBAAkB,OAAO;AAAA,MACzB,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,UAAU;AAAA,IACZ;AAAA,IAEA,eAAe;AAAA,MACb,UAAU;AAAA,MACV,OAAO,OAAO;AAAA,IAChB;AAAA,IAEA,WAAW;AAAA,MACT,aAAa;AAAA,MACb,aAAa,OAAO;AAAA,IACtB;AAAA,IAEA,eAAe;AAAA,MACb,YAAY;AAAA,IACd;AAAA,IAEA,gBAAgB;AAAA,MACd,iBAAiB;AAAA,IACnB;AAAA,IAEA,gBAAgB;AAAA,MACd,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,iBAAiB,OAAO;AAAA,MACxB,cAAc;AAAA,IAChB;AAAA,IAEA,qBAAqB;AAAA,MACnB,eAAe;AAAA,MACf,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,iBAAiB;AAAA,MACjB,KAAK;AAAA,IACP;AAAA,IAEA,kBAAkB;AAAA,MAChB,MAAM;AAAA,MACN,iBAAiB;AAAA,MACjB,aAAa;AAAA,MACb,aAAa,OAAO;AAAA,MACpB,cAAc;AAAA,MACd,iBAAiB;AAAA,MACjB,mBAAmB;AAAA,MACnB,YAAY;AAAA,MACZ,gBAAgB;AAAA,IAClB;AAAA,IAEA,sBAAsB;AAAA,MACpB,OAAO,OAAO;AAAA,MACd,UAAU;AAAA,MACV,YAAY;AAAA,IACd;AAAA,IAEA,yBAAyB;AAAA,MACvB,iBAAiB,OAAO;AAAA,IAC1B;AAAA,IAEA,6BAA6B;AAAA,MAC3B,OAAO,OAAO;AAAA,IAChB;AAAA,IAEA,UAAU;AAAA,MACR,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,eAAe;AAAA,MACf,KAAK;AAAA,IACP;AAAA,IAEA,WAAW;AAAA,MACT,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,OAAO,OAAO;AAAA,IAChB;AAAA,IAEA,YAAY;AAAA,MACV,aAAa;AAAA,MACb,aAAa,OAAO;AAAA,MACpB,cAAc;AAAA,MACd,mBAAmB;AAAA,MACnB,iBAAiB;AAAA,MACjB,iBAAiB,OAAO;AAAA,MACxB,UAAU;AAAA,IACZ;AAAA,IAEA,gBAAgB;AAAA,MACd,UAAU;AAAA,MACV,OAAO,OAAO;AAAA,MACd,WAAW;AAAA,IACb;AAAA;AAAA,IAGA,cAAc;AAAA,MACZ,UAAU;AAAA,MACV,KAAK;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,iBAAiB;AAAA,MACjB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,QAAQ;AAAA,IACV;AAAA,IAEA,OAAO;AAAA,MACL,iBAAiB,OAAO;AAAA,MACxB,cAAc;AAAA,MACd,OAAO;AAAA,MACP,UAAU;AAAA,MACV,WAAW;AAAA,MACX,aAAa;AAAA,MACb,cAAc;AAAA,QACZ,OAAO;AAAA,QACP,QAAQ;AAAA,MACV;AAAA,MACA,eAAe;AAAA,MACf,cAAc;AAAA,MACd,WAAW;AAAA,MACX,UAAU;AAAA,IACZ;AAAA,IAEA,aAAa;AAAA,MACX,iBAAiB,OAAO;AAAA,MACxB,iBAAiB,WAAW,KAAK;AAAA,MACjC,mBAAmB,WAAW,KAAK;AAAA,MACnC,eAAe;AAAA,MACf,gBAAgB;AAAA,MAChB,YAAY;AAAA,IACd;AAAA,IAEA,iBAAiB;AAAA,MACf,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,OAAO,OAAO;AAAA,MACd,MAAM;AAAA,IACR;AAAA,IAEA,kBAAkB;AAAA,MAChB,OAAO,WAAW,KAAK,eAAe,KAAK;AAAA,MAC3C,QAAQ,WAAW,KAAK,eAAe,KAAK;AAAA,MAC5C,iBAAiB;AAAA,MACjB,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,gBAAgB;AAAA,IAClB;AAAA,IAEA,gBAAgB;AAAA,MACd,OAAO,OAAO;AAAA,MACd,UAAU,WAAW,KAAK,eAAe,KAAK;AAAA,MAC9C,YAAY;AAAA,IACd;AAAA,IAEA,YAAY;AAAA,MACV,iBAAiB,OAAO;AAAA,MACxB,iBAAiB,WAAW,KAAK;AAAA,MACjC,mBAAmB;AAAA,MACnB,YAAY;AAAA,IACd;AAAA,IAEA,gBAAgB;AAAA,MACd,OAAO,OAAO;AAAA,MACd,UAAU,WAAW,KAAK,eAAe,KAAK;AAAA,MAC9C,YAAY;AAAA,IACd;AAAA,IAEA,iBAAiB;AAAA,MACf,WAAW,iBAAiB;AAAA,IAC9B;AAAA,IAEA,YAAY;AAAA,MACV,SAAS;AAAA,MACT,KAAK,WAAW,KAAK;AAAA,IACvB;AAAA,IAEA,WAAW;AAAA,MACT,iBAAiB,OAAO;AAAA,MACxB,cAAc;AAAA,MACd,SAAS;AAAA,MACT,iBAAiB;AAAA,MACjB,iBAAiB,OAAO;AAAA,MACxB,aAAa;AAAA,MACb,aAAa;AAAA,MACb,aAAa;AAAA,MACb,cAAc;AAAA,QACZ,OAAO;AAAA,QACP,QAAQ;AAAA,MACV;AAAA,MACA,eAAe;AAAA,MACf,cAAc;AAAA,MACd,WAAW;AAAA,IACb;AAAA,IAEA,aAAa;AAAA,MACX,cAAc;AAAA,IAChB;AAAA,IAEA,YAAY;AAAA,MACV,UAAU;AAAA,MACV,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,cAAc;AAAA,IAChB;AAAA,IAEA,aAAa;AAAA,MACX,eAAe;AAAA,MACf,KAAK;AAAA,MACL,UAAU;AAAA,IACZ;AAAA,IAEA,OAAO;AAAA,MACL,mBAAmB,WAAW,IAAI;AAAA,MAClC,iBAAiB,WAAW,IAAI;AAAA,MAChC,cAAc;AAAA,IAChB;AAAA,IAEA,WAAW;AAAA,MACT,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,eAAe;AAAA,IACjB;AAAA,IAEA,mBAAmB;AAAA,MACjB,iBAAiB;AAAA,IACnB;AAAA,IAEA,qBAAqB;AAAA,MACnB,iBAAiB;AAAA,IACnB;AAAA,IAEA,kBAAkB;AAAA,MAChB,iBAAiB;AAAA,IACnB;AAAA,IAEA,sBAAsB;AAAA,MACpB,iBAAiB;AAAA,IACnB;AAAA,IAEA,sBAAsB;AAAA,MACpB,iBAAiB;AAAA,IACnB;AAAA,IAEA,sBAAsB;AAAA,MACpB,iBAAiB;AAAA,IACnB;AAAA,IAEA,mBAAmB;AAAA,MACjB,iBAAiB;AAAA,IACnB;AAAA,IAEA,uBAAuB;AAAA,MACrB,iBAAiB;AAAA,IACnB;AAAA,IAEA,sBAAsB;AAAA,MACpB,iBAAiB;AAAA,IACnB;AAAA,IAEA,uBAAuB;AAAA,MACrB,iBAAiB;AAAA,IACnB;AAAA,IAEA,0BAA0B;AAAA,MACxB,iBAAiB;AAAA,IACnB;AAAA,IAEA,oBAAoB;AAAA,MAClB,iBAAiB;AAAA,IACnB;AAAA,IAEA,WAAW;AAAA,MACT,eAAe,eAAe,WAAW;AAAA,MACzC,KAAK,eAAe,IAAI;AAAA,MACxB,cAAc;AAAA,IAChB;AAAA,IAEA,gBAAgB;AAAA,MACd,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,UAAU,eAAe,SAAY,WAAW,KAAK;AAAA,MACrD,WAAW;AAAA,IACb;AAAA,IAEA,gBAAgB;AAAA,MACd,UAAU;AAAA,MACV,OAAO;AAAA,MACP,MAAM;AAAA,IACR;AAAA,IAEA,kBAAkB;AAAA,MAChB,OAAO;AAAA,MACP,UAAU;AAAA,MACV,YAAY,WAAW,KAAK;AAAA,MAC5B,WAAW;AAAA,MACX,cAAc;AAAA,MACd,iBAAiB;AAAA,MACjB,mBAAmB;AAAA,MACnB,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,MACjB,cAAc;AAAA,MACd,WAAW;AAAA,IACb;AAAA,IAEA,mBAAmB;AAAA,MACjB,WAAW;AAAA,IACb;AAAA,IAEA,WAAW;AAAA,MACT,OAAO;AAAA,MACP,UAAU;AAAA,MACV,YAAY;AAAA,IACd;AAAA,IAEA,WAAW;AAAA,MACT,eAAe;AAAA,MACf,UAAU;AAAA,MACV,KAAK;AAAA,MACL,WAAW;AAAA,IACb;AAAA,IAEA,UAAU;AAAA,MACR,mBAAmB,WAAW,KAAK;AAAA,MACnC,iBAAiB,WAAW,IAAI;AAAA,MAChC,iBAAiB;AAAA,MACjB,cAAc;AAAA,IAChB;AAAA,IAEA,cAAc;AAAA,MACZ,UAAU,WAAW,KAAK;AAAA,MAC1B,OAAO;AAAA,MACP,YAAY;AAAA,IACd;AAAA,IAEA,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,iBAAiB,WAAW,KAAK;AAAA,MACjC,YAAY;AAAA,IACd;AAAA,IAEA,cAAc;AAAA,MACZ,UAAU,WAAW,KAAK;AAAA,MAC1B,OAAO;AAAA,MACP,WAAW;AAAA,IACb;AAAA,EACF,CAAC;AACH;AAGO,IAAM,iBAAiB,oBAAoB,KAAK,GAAG;;;ADzbpD;AAjBN,IAAM,gBAAsE,CAAC;AAAA,EAC3E;AAAA,EACA;AACF,MAAM;AACJ,MAAI,CAAC,SAAU,QAAO;AAEtB,QAAM,iBAAsE;AAAA,IAC1E,MAAM,EAAE,OAAO,QAAQ,OAAO,OAAO,kBAAkB;AAAA,IACvD,QAAQ,EAAE,OAAO,UAAU,OAAO,OAAO,oBAAoB;AAAA,IAC7D,KAAK,EAAE,OAAO,OAAO,OAAO,OAAO,iBAAiB;AAAA,EACtD;AAEA,QAAM,SAAS,eAAe,QAAQ;AACtC,MAAI,CAAC,OAAQ,QAAO;AAEpB,SACE,4CAAC,6BAAK,OAAO,CAAC,OAAO,OAAO,OAAO,KAAK,GACtC,sDAAC,6BAAK,OAAO,OAAO,WAAY,iBAAO,OAAM,GAC/C;AAEJ;AAEA,IAAM,cAAkE,CAAC;AAAA,EACvE;AAAA,EACA;AACF,MAAM;AACJ,MAAI,CAAC,UAAU,WAAW,YAAa,QAAO;AAE9C,QAAM,eAAoE;AAAA,IACxE,WAAW,EAAE,OAAO,aAAa,OAAO,OAAO,qBAAqB;AAAA,IACpE,WAAW,EAAE,OAAO,aAAa,OAAO,OAAO,qBAAqB;AAAA,IACpE,WAAW,EAAE,OAAO,aAAa,OAAO,OAAO,qBAAqB;AAAA,EACtE;AAEA,QAAM,SAAS,aAAa,MAAM;AAClC,MAAI,CAAC,OAAQ,QAAO;AAEpB,SACE,4CAAC,6BAAK,OAAO,CAAC,OAAO,OAAO,OAAO,KAAK,GACtC,sDAAC,6BAAK,OAAO,OAAO,WAAY,iBAAO,OAAM,GAC/C;AAEJ;AAEA,IAAM,gBAAsE,CAAC;AAAA,EAC3E;AAAA,EACA;AACF,MAAM;AACJ,MAAI,CAAC,SAAU,QAAO;AAEtB,QAAM,iBAAsE;AAAA,IAC1E,MAAM,EAAE,OAAO,QAAQ,OAAO,OAAO,kBAAkB;AAAA,IACvD,UAAU,EAAE,OAAO,YAAY,OAAO,OAAO,sBAAsB;AAAA,IACnE,SAAS,EAAE,OAAO,WAAW,OAAO,OAAO,qBAAqB;AAAA,IAChE,UAAU,EAAE,OAAO,YAAY,OAAO,OAAO,sBAAsB;AAAA,IACnE,aAAa;AAAA,MACX,OAAO;AAAA,MACP,OAAO,OAAO;AAAA,IAChB;AAAA,IACA,OAAO,EAAE,OAAO,SAAS,OAAO,OAAO,mBAAmB;AAAA,EAC5D;AAEA,QAAM,SAAS,eAAe,QAAQ;AACtC,MAAI,CAAC,OAAQ,QAAO;AAEpB,SACE,4CAAC,6BAAK,OAAO,CAAC,OAAO,OAAO,OAAO,KAAK,GACtC,sDAAC,6BAAK,OAAO,OAAO,WAAY,iBAAO,OAAM,GAC/C;AAEJ;AAEO,IAAM,YAAsC,CAAC;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,kBAAkB;AACpB,MAAM;AACJ,QAAM,EAAE,OAAO,OAAO,QAAI,0CAAoB;AAC9C,QAAMC,kBAAiB,oBAAoB,OAAO,MAAM;AAExD,MAAI,CAAC,aAAc,QAAO;AAE1B,QAAM,iBAAiB,OAAO,SAAS;AAEvC,QAAM,mBAAmB,CAAC,UAA4C;AACpE,mBAAe,KAAK;AAAA,EACtB;AAEA,QAAM,qBAAqB,CAAC,UAA4C;AACtE,UAAM,YAAY,gBAAgB,KAAK;AACvC,UAAM,gBAAgB,gBAAgB,MAAM,SAAS;AAErD,UAAM,iBAAiB,MAAM;AAC3B,UAAI,MAAM,KAAK;AACb,qCAAQ,QAAQ,MAAM,GAAG,EAAE;AAAA,UAAM,SAC/B,QAAQ,MAAM,uBAAuB,GAAG;AAAA,QAC1C;AAAA,MACF;AAAA,IACF;AAEA,UAAM,eACJ,4EACE;AAAA,mDAAC,6BAAK,OAAOA,gBAAe,aAC1B;AAAA,oDAAC,6BAAK,OAAOA,gBAAe,YAAa,gBAAM,MAAK;AAAA,QACpD,6CAAC,6BAAK,OAAOA,gBAAe,aAC1B;AAAA,sDAAC,iBAAc,UAAU,MAAM,UAAU,QAAQA,iBAAgB;AAAA,UACjE,4CAAC,iBAAc,UAAU,MAAM,UAAU,QAAQA,iBAAgB;AAAA,UACjE,4CAAC,eAAY,QAAQ,MAAM,QAAQ,QAAQA,iBAAgB;AAAA,WAC7D;AAAA,SACF;AAAA,MAEC,aACC,6CAAC,6BAAK,OAAOA,gBAAe,WAC1B;AAAA,oDAAC,6BAAK,OAAOA,gBAAe,gBAAgB,mBAAK;AAAA,QACjD,4CAAC,6BAAK,OAAOA,gBAAe,gBAAiB,qBAAU;AAAA,SACzD;AAAA,MAGD,MAAM,eACL,4CAAC,6BAAK,OAAOA,gBAAe,kBACzB,gBAAM,aACT;AAAA,MAGD,MAAM,YACL,6CAAC,6BAAK,OAAOA,gBAAe,WAC1B;AAAA,oDAAC,6BAAK,OAAOA,gBAAe,gBAAgB,uBAAS;AAAA,QACrD,4CAAC,6BAAK,OAAOA,gBAAe,gBAAiB,gBAAM,UAAS;AAAA,SAC9D;AAAA,MAGD,iBACC,6CAAC,6BAAK,OAAOA,gBAAe,WAC1B;AAAA,oDAAC,6BAAK,OAAOA,gBAAe,gBAAgB,wBAAU;AAAA,QACtD,4CAAC,6BAAK,OAAOA,gBAAe,gBAAiB,yBAAc;AAAA,SAC7D;AAAA,MAGD,MAAM,aACL,6CAAC,6BAAK,OAAOA,gBAAe,WAC1B;AAAA,oDAAC,6BAAK,OAAOA,gBAAe,gBAAgB,wBAAU;AAAA,QACtD,4CAAC,6BAAK,OAAOA,gBAAe,gBAAiB,gBAAM,WAAU;AAAA,SAC/D;AAAA,MAGD,MAAM,SACL,6CAAC,6BAAK,OAAOA,gBAAe,WAC1B;AAAA,oDAAC,6BAAK,OAAOA,gBAAe,gBAAgB,oBAAM;AAAA,QAClD,4CAAC,6BAAK,OAAOA,gBAAe,gBAAiB,gBAAM,OAAM;AAAA,SAC3D;AAAA,MAGD,MAAM,OACL;AAAA,QAAC;AAAA;AAAA,UACC,SAAS;AAAA,UACT,OAAOA,gBAAe;AAAA,UAEtB,sDAAC,6BAAK,OAAOA,gBAAe,WAAW,iCAAc;AAAA;AAAA,MACvD;AAAA,MAGD,MAAM,QAAQ,MAAM,KAAK,SAAS,KACjC,4CAAC,6BAAK,OAAOA,gBAAe,WACzB,gBAAM,KAAK,IAAI,CAAC,KAAa,QAC5B,4CAAC,6BAAe,OAAOA,gBAAe,UACpC,sDAAC,6BAAK,OAAOA,gBAAe,cAAe,eAAI,KADtC,GAEX,CACD,GACH;AAAA,OAEJ;AAGF,QAAI,cAAc;AAChB,aACE;AAAA,QAAC;AAAA;AAAA,UAEC,OAAO;AAAA,YACLA,gBAAe;AAAA,YACf,MAAM,SAAS,EAAE,iBAAiB,MAAM,MAAM;AAAA,UAChD;AAAA,UACA,SAAS,MAAM,iBAAiB,KAAK;AAAA,UACrC,eAAe;AAAA,UAEd;AAAA;AAAA,QARI,MAAM,MAAM,MAAM;AAAA,MASzB;AAAA,IAEJ;AAEA,WACE;AAAA,MAAC;AAAA;AAAA,QAEC,OAAO;AAAA,UACLA,gBAAe;AAAA,UACf,MAAM,SAAS,EAAE,iBAAiB,MAAM,MAAM;AAAA,QAChD;AAAA,QAEC;AAAA;AAAA,MANI,MAAM,MAAM,MAAM;AAAA,IAOzB;AAAA,EAEJ;AAEA,QAAM,wBAAwB,MAC5B,4CAAC,6BAAK,OAAOA,gBAAe,iBAC1B,sDAAC,6BAAK,OAAOA,gBAAe,cAAc,+CAE1C,GACF;AAGF,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,aAAW;AAAA,MACX,eAAc;AAAA,MACd,gBAAgB;AAAA,MAEhB;AAAA,QAAC;AAAA;AAAA,UACC,OAAOA,gBAAe;AAAA,UACtB,eAAe;AAAA,UACf,SAAS;AAAA,UAET;AAAA,YAAC;AAAA;AAAA,cACC,OAAOA,gBAAe;AAAA,cACtB,eAAe;AAAA,cACf,SAAS,OAAK,EAAE,gBAAgB;AAAA,cAEhC;AAAA,6DAAC,6BAAK,OAAOA,gBAAe,aAC1B;AAAA,8DAAC,6BAAK,OAAOA,gBAAe,iBAAkB,uBAAY;AAAA,kBACzD,mBACC;AAAA,oBAAC;AAAA;AAAA,sBACC,OAAOA,gBAAe;AAAA,sBACtB,SAAS;AAAA,sBACT,oBAAmB;AAAA,sBAEnB,sDAAC,6BAAK,OAAOA,gBAAe,gBAAgB,oBAAC;AAAA;AAAA,kBAC/C;AAAA,mBAEJ;AAAA,gBAEC,kBACC,4CAAC,6BAAK,OAAOA,gBAAe,YAC1B,sDAAC,6BAAK,OAAOA,gBAAe,gBAAgB,qDAE5C,GACF;AAAA,gBAGF;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAOA,gBAAe;AAAA,oBACtB,8BAA8B;AAAA,oBAE7B,iBAAO,SAAS,IACf,4CAAC,6BAAK,OAAOA,gBAAe,YACzB,iBAAO;AAAA,sBAAI,WACV,cAAc,YAAY,KAAK,IAAI,mBAAmB,KAAK;AAAA,oBAC7D,GACF,IACE,iBACF,eAAe,IAEf,sBAAsB;AAAA;AAAA,gBAE1B;AAAA;AAAA;AAAA,UACF;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;;;AH3GU,IAAAC,sBAAA;AA/KH,IAAM,WAA6C,CAAC;AAAA,EACzD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf,qBAAqB;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,kBAAkB;AAAA,EAClB;AACF,MAAM;AACJ,QAAM,aAAS;AAAA,IACb,MACE,IAAI,eAAe;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,IACH,CAAC,QAAQ,aAAa,SAAS,SAAS,YAAY;AAAA,EACtD;AAGA,QAAM,kBAAc,sBAA6C,MAAM;AACrE,QAAI,CAAC,MAAO,QAAO;AACnB,WAAO;AAAA,MACL,SAAS,MAAM;AAAA,MACf,WAAW,MAAM;AAAA,MACjB,UAAU,MAAM;AAAA,MAChB,MAAM,MAAM;AAAA,MACZ,QAAQ,MAAM;AAAA,MACd,cAAc,MAAM;AAAA,MACpB,gBAAgB,MAAM;AAAA,MACtB,YAAY,MAAM;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,KAAK,CAAC;AAGV,QAAMC,sBAAiB,sBAAQ,MAAM;AACnC,UAAM,EAAE,OAAO,OAAO,IAAI,gCAAW,IAAI,QAAQ;AACjD,WAAO,oBAAoB,OAAO,QAAQ,WAAW;AAAA,EACvD,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,CAAC,EAAE,WAAW,QAAI,uBAAS,CAAC,CAAC;AACnC,QAAM,eAAW,0BAAY,MAAM,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC;AAGtD,QAAM,CAAC,YAAY,aAAa,QAAI,uBAAS,KAAK;AAClD,QAAM,CAAC,WAAW,YAAY,QAAI,uBAAS,EAAE;AAC7C,QAAM,CAAC,gBAAgB,iBAAiB,QAAI,uBAAS,IAAI;AAEzD,QAAM,QAAQ,oBAAI,KAAK;AACvB,QAAM,aAAa,MAAM,SAAS;AAClC,QAAM,YAAY,MAAM,YAAY;AACpC,QAAM,kBAAkB,WAAW,YAAY;AAC/C,QAAM,kBAAkB,WAAW,YAAY;AAE/C,8BAAU,MAAM;AACd,UAAM,cAAc,OAAO,UAAU,QAAQ;AAC7C,WAAO;AAAA,EACT,GAAG,CAAC,QAAQ,QAAQ,CAAC;AAErB,8BAAU,MAAM;AACd,WAAO,aAAa,MAAM;AAAA,EAC5B,GAAG,CAAC,QAAQ,MAAM,CAAC;AAEnB,8BAAU,MAAM;AACd,WAAO,MAAM;AACX,aAAO,QAAQ;AAAA,IACjB;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,YAAY,OAAO,aAAa;AACtC,QAAM,UAAU,OAAO,WAAW;AAClC,QAAM,EAAE,cAAc,MAAM,IAAI;AAEhC,QAAM,iBACJ,UAAU,gBAAgB,aAC1B,UAAU,iBAAiB;AAE7B,QAAM,kBAAkB,CAAC,MAAY,aAAqB;AACxD,WAAO,gBAAgB,MAAM,QAAQ;AACrC,mBAAe,IAAI;AAAA,EACrB;AAEA,QAAM,aAAa,MAAM;AACvB,YAAQ,KAAK;AACb,oBAAgB,UAAU,aAAa,UAAU,YAAY;AAAA,EAC/D;AAEA,QAAM,iBAAiB,MAAM;AAC3B,YAAQ,SAAS;AACjB,oBAAgB,UAAU,aAAa,UAAU,YAAY;AAAA,EAC/D;AAEA,QAAM,kBAAkB,MAAM;AAC5B,YAAQ,UAAU;AAClB,kBAAc,KAAK;AACnB,oBAAgB,WAAW,UAAU;AAAA,EACvC;AAEA,QAAM,eAAe,MAAM;AACzB,UAAM,UAAU,CAAC;AACjB,kBAAc,OAAO;AACrB,QAAI,SAAS;AACX,mBAAa,OAAO,UAAU,WAAW,CAAC;AAC1C,wBAAkB,IAAI;AAAA,IACxB;AAAA,EACF;AAEA,QAAM,wBAAwB,CAAC,UAAkB;AAC/C,QAAI,UAAU,MAAM,QAAQ,KAAK,KAAK,GAAG;AACvC,mBAAa,KAAK;AAClB,YAAM,OAAO,SAAS,OAAO,EAAE;AAC/B;AAAA,QACE,UAAU,MAAO,QAAQ,mBAAmB,QAAQ;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AAEA,QAAM,wBAAwB,MAAM;AAClC,UAAM,OAAO,SAAS,WAAW,EAAE;AACnC,QAAI,MAAM,IAAI,KAAK,OAAO,mBAAmB,OAAO,iBAAiB;AACnE,mBAAa,OAAO,UAAU,WAAW,CAAC;AAC1C,wBAAkB,IAAI;AAAA,IACxB,OAAO;AACL,cAAQ,KAAK,MAAM,UAAU,YAAY;AACzC,sBAAgB,MAAM,UAAU,YAAY;AAAA,IAC9C;AAAA,EACF;AAEA,QAAM,iBAAiB,MAAM;AAC3B,UAAM,UAAU,UAAU,cAAc;AACxC,QAAI,WAAW,iBAAiB;AAC9B,cAAQ,KAAK,SAAS,UAAU,YAAY;AAC5C,mBAAa,OAAO,OAAO,CAAC;AAC5B,sBAAgB,SAAS,UAAU,YAAY;AAAA,IACjD;AAAA,EACF;AAEA,QAAM,iBAAiB,MAAM;AAC3B,UAAM,UAAU,UAAU,cAAc;AACxC,QAAI,WAAW,iBAAiB;AAC9B,cAAQ,KAAK,SAAS,UAAU,YAAY;AAC5C,mBAAa,OAAO,OAAO,CAAC;AAC5B,sBAAgB,SAAS,UAAU,YAAY;AAAA,IACjD;AAAA,EACF;AAEA,QAAM,oBAAoB,CAAC,UAAkB;AAC3C,YAAQ,KAAK,UAAU,aAAa,KAAK;AACzC,kBAAc,KAAK;AACnB,oBAAgB,UAAU,aAAa,KAAK;AAAA,EAC9C;AAEA,QAAM,aAAa,MAAM;AACvB,WAAO,eAAe;AAAA,EACxB;AAEA,SACE,8CAAC,mCAAW,OAAO,CAACA,gBAAe,WAAW,cAAc,GACzD;AAAA,aACC,6CAAC,6BAAK,OAAOA,gBAAe,gBAC1B,uDAAC,6BAAK,OAAOA,gBAAe,OAAQ,iBAAM,GAC5C;AAAA,IAGF,6CAAC,6BAAK,OAAO,CAACA,gBAAe,kBAAkB,KAAK,GAClD,wDAAC,6BAAK,OAAOA,gBAAe,MAE1B;AAAA,oDAAC,6BAAK,OAAO,CAAC,aAAa,WAAW,WAAW,GAC/C;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,aAAa;AAAA,YACpB,SAAS;AAAA,YAET,uDAAC,6BAAK,OAAO,aAAa,cAAc,oBAAC;AAAA;AAAA,QAC3C;AAAA,QAEA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,aAAa;AAAA,YACpB,SAAS;AAAA,YAET;AAAA,2DAAC,6BAAK,OAAO,CAAC,aAAa,eAAe,eAAe,GACtD,+BACG,GAAG,OAAO,UAAU,YAAY,CAAC,IAAI,UAAU,WAAW,KAC1D,UAAU,kBAChB;AAAA,cACA,6CAAC,6BAAK,OAAO,aAAa,SAAS,oBAAC;AAAA;AAAA;AAAA,QACtC;AAAA,QAEA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,aAAa;AAAA,cACb,kBAAkB,aAAa;AAAA,YACjC;AAAA,YACA,SAAS;AAAA,YACT,UAAU;AAAA,YAEV;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,aAAa;AAAA,kBACb,kBAAkB,aAAa;AAAA,gBACjC;AAAA,gBACD;AAAA;AAAA,YAED;AAAA;AAAA,QACF;AAAA,QAEA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,aAAa;AAAA,YACpB,SAAS;AAAA,YAET,uDAAC,6BAAK,OAAO,aAAa,cAAc,oBAAC;AAAA;AAAA,QAC3C;AAAA,SACF;AAAA,MAGA;AAAA,QAAC;AAAA;AAAA,UACC,SAAS;AAAA,UACT,aAAW;AAAA,UACX,eAAc;AAAA,UACd,gBAAgB,MAAM,cAAc,KAAK;AAAA,UAEzC;AAAA,YAAC;AAAA;AAAA,cACC,OAAO,aAAa;AAAA,cACpB,SAAS,MAAM,cAAc,KAAK;AAAA,cAElC;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO,aAAa;AAAA,kBACpB,SAAS,OAAK,EAAE,gBAAgB;AAAA,kBAGhC;AAAA,kEAAC,6BAAK,OAAO,aAAa,SACxB;AAAA;AAAA,wBAAC;AAAA;AAAA,0BACC,OAAO,aAAa;AAAA,0BACpB,SAAS;AAAA,0BACT,UAAU,UAAU,eAAe;AAAA,0BAEnC;AAAA,4BAAC;AAAA;AAAA,8BACC,OAAO;AAAA,gCACL,aAAa;AAAA,gCACb,UAAU,eAAe,mBACvB,aAAa;AAAA,8BACjB;AAAA,8BACD;AAAA;AAAA,0BAED;AAAA;AAAA,sBACF;AAAA,sBAEA;AAAA,wBAAC;AAAA;AAAA,0BACC,OAAO;AAAA,4BACL,aAAa;AAAA,4BACb,CAAC,kBAAkB,aAAa;AAAA,0BAClC;AAAA,0BACA,OAAO;AAAA,0BACP,cAAc;AAAA,0BACd,iBAAiB;AAAA,0BACjB,QAAQ;AAAA,0BACR,cAAa;AAAA,0BACb,WAAW;AAAA;AAAA,sBACb;AAAA,sBAEA;AAAA,wBAAC;AAAA;AAAA,0BACC,OAAO,aAAa;AAAA,0BACpB,SAAS;AAAA,0BACT,UAAU,UAAU,eAAe;AAAA,0BAEnC;AAAA,4BAAC;AAAA;AAAA,8BACC,OAAO;AAAA,gCACL,aAAa;AAAA,gCACb,UAAU,eAAe,mBACvB,aAAa;AAAA,8BACjB;AAAA,8BACD;AAAA;AAAA,0BAED;AAAA;AAAA,sBACF;AAAA,uBACF;AAAA,oBAGA,6CAAC,6BAAK,OAAO,aAAa,WACtB,gCAAqB,SAAS,aAAa;AAAA,sBAC3C,CAAC,OAAO,UAAU;AAChB,8BAAM,aAAa,UAAU,UAAU;AACvC,8BAAM,YACJ,UAAU,cACV,UAAU,gBAAgB;AAC5B,+BACE;AAAA,0BAAC;AAAA;AAAA,4BAEC,OAAO;AAAA,8BACL,aAAa;AAAA,8BACb,cAAc,aAAa;AAAA,8BAC3B,aAAa,aAAa;AAAA,4BAC5B;AAAA,4BACA,SAAS,MAAM,kBAAkB,KAAK;AAAA,4BAEtC;AAAA,8BAAC;AAAA;AAAA,gCACC,OAAO;AAAA,kCACL,aAAa;AAAA,kCACb,cAAc,aAAa;AAAA,gCAC7B;AAAA,gCAEC;AAAA;AAAA,4BACH;AAAA;AAAA,0BAfK;AAAA,wBAgBP;AAAA,sBAEJ;AAAA,oBACF,GACF;AAAA;AAAA;AAAA,cACF;AAAA;AAAA,UACF;AAAA;AAAA,MACF;AAAA,MAEA,8CAAC,6BAAK,OAAOA,gBAAe,OAE1B;AAAA,qDAAC,6BAAK,OAAOA,gBAAe,aACzB,oBAAU,KAAK,IAAI,SAClB,6CAAC,6BAAe,OAAOA,gBAAe,iBACpC,uDAAC,6BAAK,OAAOA,gBAAe,iBACzB,cAAI,MAAM,GAAG,CAAC,GACjB,KAHS,GAIX,CACD,GACH;AAAA,QAGC,UAAU,cAAc,IAAI,CAAC,MAAM,cAClC,6CAAC,6BAAqB,OAAOA,gBAAe,UACzC,eAAK,IAAI,CAAC,cAAc,aAAa;AACpC,gBAAM,cAAc,eAAe,YAAY;AAC/C,gBAAMC,WAAU,YAAY;AAAA,YAC1B;AAAA,UACF;AACA,gBAAMC,aAAY,YAAY,SAAS,YAAY;AACnD,gBAAM,eAAe,YAAY,SAAS,aAAa;AAEvD,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,OAAO;AAAA,gBACLF,gBAAe;AAAA,gBACf;AAAA,gBACAC,YAAWD,gBAAe;AAAA,gBAC1BE,cAAaF,gBAAe;AAAA,gBAC5B,gBAAgB,aAAa;AAAA,cAC/B;AAAA,cACA,SAAS,MAAM;AACb,gCAAgB,aAAa,MAAM,QAAQ;AAAA,cAC7C;AAAA,cAEA;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,sBACLA,gBAAe;AAAA,sBACf;AAAA,sBACAC,YAAWD,gBAAe;AAAA,sBAC1B,gBAAgB,aAAa;AAAA,oBAC/B;AAAA,oBAEC,uBAAa,KAAK,QAAQ;AAAA;AAAA,gBAC7B;AAAA,gBACCE,cACC,6CAAC,6BAAK,OAAOF,gBAAe,gBAAgB;AAAA;AAAA;AAAA,YAvBzC,GAAG,SAAS,IAAI,QAAQ;AAAA,UAyB/B;AAAA,QAEJ,CAAC,KAtCQ,SAuCX,CACD;AAAA,SACH;AAAA,OACF,GACF;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,CAAC,CAAC;AAAA,QACX;AAAA,QACA,QAAQ;AAAA,QACR,aAAa,UAAU;AAAA,QACvB,SAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;AAGA,IAAM,eAAe,gCAAW,OAAO;AAAA,EACrC,WAAW;AAAA,IACT,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,IACjB,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,IACnB,KAAK;AAAA,EACP;AAAA,EACA,UAAU;AAAA,IACR,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,aAAa;AAAA,IACb,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,YAAY;AAAA,IACZ,gBAAgB;AAAA,EAClB;AAAA,EACA,cAAc;AAAA,IACZ,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AAAA,EACA,WAAW;AAAA,IACT,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,aAAa;AAAA,IACb,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,KAAK;AAAA,EACP;AAAA,EACA,eAAe;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAO;AAAA,EACT;AAAA,EACA,SAAS;AAAA,IACP,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AAAA,EACA,UAAU;AAAA,IACR,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,aAAa;AAAA,IACb,aAAa;AAAA,IACb,iBAAiB;AAAA,EACnB;AAAA,EACA,kBAAkB;AAAA,IAChB,SAAS;AAAA,EACX;AAAA,EACA,cAAc;AAAA,IACZ,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAO;AAAA,EACT;AAAA,EACA,sBAAsB;AAAA,IACpB,OAAO;AAAA,EACT;AAAA,EACA,cAAc;AAAA,IACZ,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB,YAAY;AAAA,EACd;AAAA,EACA,gBAAgB;AAAA,IACd,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,SAAS;AAAA,IACT,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc,EAAE,OAAO,GAAG,QAAQ,EAAE;AAAA,IACpC,eAAe;AAAA,IACf,cAAc;AAAA,IACd,WAAW;AAAA,EACb;AAAA,EACA,SAAS;AAAA,IACP,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,KAAK;AAAA,IACL,cAAc;AAAA,IACd,eAAe;AAAA,IACf,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,EACrB;AAAA,EACA,WAAW;AAAA,IACT,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,iBAAiB;AAAA,IACjB,YAAY;AAAA,IACZ,gBAAgB;AAAA,EAClB;AAAA,EACA,eAAe;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAO;AAAA,EACT;AAAA,EACA,mBAAmB;AAAA,IACjB,SAAS;AAAA,EACX;AAAA,EACA,WAAW;AAAA,IACT,OAAO;AAAA,IACP,iBAAiB;AAAA,IACjB,mBAAmB;AAAA,IACnB,cAAc;AAAA,IACd,aAAa;AAAA,IACb,aAAa;AAAA,IACb,WAAW;AAAA,IACX,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAO;AAAA,EACT;AAAA,EACA,kBAAkB;AAAA,IAChB,aAAa;AAAA,IACb,iBAAiB;AAAA,EACnB;AAAA,EACA,WAAW;AAAA,IACT,eAAe;AAAA,IACf,UAAU;AAAA,IACV,KAAK;AAAA,EACP;AAAA,EACA,UAAU;AAAA,IACR,OAAO;AAAA,IACP,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,iBAAiB;AAAA,IACjB,YAAY;AAAA,EACd;AAAA,EACA,kBAAkB;AAAA,IAChB,iBAAiB;AAAA,EACnB;AAAA,EACA,iBAAiB;AAAA,IACf,aAAa;AAAA,IACb,aAAa;AAAA,EACf;AAAA,EACA,cAAc;AAAA,IACZ,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAO;AAAA,EACT;AAAA,EACA,sBAAsB;AAAA,IACpB,OAAO;AAAA,IACP,YAAY;AAAA,EACd;AAAA,EACA,gBAAgB;AAAA,IACd,iBAAiB;AAAA,EACnB;AAAA,EACA,oBAAoB;AAAA,IAClB,OAAO;AAAA,EACT;AACF,CAAC;","names":["import_react_native","import_react_native","calendarStyles","import_jsx_runtime","calendarStyles","isToday","hasEvents"]}
|