@innosolutions/inno-calendar 1.0.34 → 1.0.37

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 (43) hide show
  1. package/dist/{agenda-widget-BwL7DItQ.js → agenda-widget-BKIaXFpN.js} +1186 -1128
  2. package/dist/agenda-widget-BKIaXFpN.js.map +1 -0
  3. package/dist/agenda-widget-BtTvMs9i.cjs +2 -0
  4. package/dist/agenda-widget-BtTvMs9i.cjs.map +1 -0
  5. package/dist/components/event/event-card.d.ts +1 -0
  6. package/dist/components/event/event-card.d.ts.map +1 -1
  7. package/dist/components/index.cjs +1 -1
  8. package/dist/components/index.mjs +2 -2
  9. package/dist/components/inno-calendar.d.ts +8 -2
  10. package/dist/components/inno-calendar.d.ts.map +1 -1
  11. package/dist/components/views/day-view.d.ts.map +1 -1
  12. package/dist/components/views/timeline-view.d.ts.map +1 -1
  13. package/dist/components/views/week-view.d.ts.map +1 -1
  14. package/dist/core/index.d.ts +1 -1
  15. package/dist/core/index.d.ts.map +1 -1
  16. package/dist/core/types.d.ts +32 -0
  17. package/dist/core/types.d.ts.map +1 -1
  18. package/dist/core/utils/grid-utils.d.ts.map +1 -1
  19. package/dist/core/utils/position-utils.d.ts +5 -1
  20. package/dist/core/utils/position-utils.d.ts.map +1 -1
  21. package/dist/index.cjs +1 -1
  22. package/dist/index.mjs +3 -3
  23. package/dist/presets/index.cjs +1 -1
  24. package/dist/presets/index.mjs +1 -1
  25. package/dist/{tailwind-calendar-CE6o8RLM.cjs → tailwind-calendar-3IAm_TdP.cjs} +2 -2
  26. package/dist/{tailwind-calendar-CE6o8RLM.cjs.map → tailwind-calendar-3IAm_TdP.cjs.map} +1 -1
  27. package/dist/{tailwind-calendar-BxW1RSkc.js → tailwind-calendar-B3HuJrjX.js} +2 -2
  28. package/dist/{tailwind-calendar-BxW1RSkc.js.map → tailwind-calendar-B3HuJrjX.js.map} +1 -1
  29. package/dist/utils.cjs +1 -1
  30. package/dist/utils.cjs.map +1 -1
  31. package/dist/utils.mjs +315 -303
  32. package/dist/utils.mjs.map +1 -1
  33. package/dist/{week-view-jpcXSE6k.js → week-view-1EUqFIRS.js} +554 -528
  34. package/dist/week-view-1EUqFIRS.js.map +1 -0
  35. package/dist/week-view-DXilsY50.cjs +11 -0
  36. package/dist/week-view-DXilsY50.cjs.map +1 -0
  37. package/package.json +1 -1
  38. package/dist/agenda-widget-B8blZmlr.cjs +0 -2
  39. package/dist/agenda-widget-B8blZmlr.cjs.map +0 -1
  40. package/dist/agenda-widget-BwL7DItQ.js.map +0 -1
  41. package/dist/week-view-DT8XnNbp.cjs +0 -11
  42. package/dist/week-view-DT8XnNbp.cjs.map +0 -1
  43. package/dist/week-view-jpcXSE6k.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"tailwind-calendar-CE6o8RLM.cjs","sources":["../src/presets/default/default-calendar.tsx","../src/presets/tailwind/tailwind-calendar.tsx"],"sourcesContent":["/**\n * DefaultCalendar - Pre-styled Calendar Preset\n *\n * A fully styled calendar using CSS custom properties for theming.\n * Designed for projects that don't use TailwindCSS but want a complete solution.\n *\n * CSS Custom Properties (override these for theming):\n * - --ic-bg: Background color\n * - --ic-bg-muted: Muted background\n * - --ic-text: Primary text color\n * - --ic-text-muted: Secondary text color\n * - --ic-border: Border color\n * - --ic-primary: Primary/accent color\n * - --ic-primary-foreground: Text on primary background\n * - --ic-radius: Border radius\n *\n * @example\n * ```tsx\n * import { DefaultCalendar } from '@inno/calendar/presets';\n *\n * function MyAgenda() {\n * return (\n * <div style={{ '--ic-primary': '#6366f1' }}>\n * <DefaultCalendar\n * events={myEvents}\n * onEventClick={(event) => console.log('Clicked:', event)}\n * />\n * </div>\n * );\n * }\n * ```\n */\n\nimport { type CSSProperties, type ReactNode, useCallback, useMemo, useState } from 'react';\nimport { CalendarHeader } from '../../components/header/calendar-header';\nimport { AgendaView } from '../../components/views/agenda-view';\nimport { DayView } from '../../components/views/day-view';\nimport { MonthView } from '../../components/views/month-view';\nimport { WeekView } from '../../components/views/week-view';\nimport { DEFAULT_PREFERENCES } from '../../core/constants';\nimport type {\n\tCalendarEvent,\n\tICalendarFilters,\n\tICalendarPreferences,\n\tIResource,\n\tIScheduleType,\n\tISelectionResult,\n\tTBadgeVariant,\n\tTCalendarView,\n} from '../../core/types';\nimport { navigateNext, navigatePrev, navigateToday } from '../../core/utils/grid-utils';\n\n// ============================================================================\n// STYLES (CSS-in-JS for zero-config usage)\n// ============================================================================\n\nconst baseStyles: CSSProperties = {\n\tdisplay: 'flex',\n\tflexDirection: 'column',\n\theight: '100%',\n\tminHeight: '400px',\n\tbackgroundColor: 'var(--ic-bg, #ffffff)',\n\tborder: '1px solid var(--ic-border, #e5e7eb)',\n\tborderRadius: 'var(--ic-radius, 0.5rem)',\n\toverflow: 'hidden',\n\tfontFamily:\n\t\t'var(--ic-font-family, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif)',\n\tfontSize: 'var(--ic-font-size, 0.875rem)',\n\tcolor: 'var(--ic-text, #111827)',\n};\n\nconst headerStyles: CSSProperties = {\n\tborderBottom: '1px solid var(--ic-border, #e5e7eb)',\n};\n\nconst contentStyles: CSSProperties = {\n\tflex: 1,\n\toverflow: 'auto',\n};\n\nconst fallbackViewStyles: CSSProperties = {\n\tdisplay: 'flex',\n\talignItems: 'center',\n\tjustifyContent: 'center',\n\theight: '16rem',\n\tcolor: 'var(--ic-text-muted, #6b7280)',\n};\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface DefaultCalendarProps<\n\tTEventData = Record<string, unknown>,\n\tTScheduleTypeData = Record<string, unknown>,\n\tTResourceData = Record<string, unknown>,\n> {\n\t/** Events to display */\n\tevents: CalendarEvent<TEventData>[];\n\t/** Available resources */\n\tresources?: IResource<TResourceData>[];\n\t/** Available schedule types */\n\tscheduleTypes?: IScheduleType<TScheduleTypeData>[];\n\t/** Initial view */\n\tinitialView?: TCalendarView;\n\t/** Initial date */\n\tinitialDate?: Date;\n\t/** Initial filters */\n\tinitialFilters?: ICalendarFilters;\n\t/** Preferences */\n\tpreferences?: Partial<ICalendarPreferences>;\n\t/** Badge variant for events (dot, colored, mixed) */\n\tbadgeVariant?: TBadgeVariant;\n\t/** Hide the header */\n\thideHeader?: boolean;\n\t/** Available views to show in view switcher */\n\tavailableViews?: TCalendarView[];\n\t/** Event click handler */\n\tonEventClick?: (event: CalendarEvent<TEventData>) => void;\n\t/** Slot selection handler */\n\tonSlotSelect?: (selection: ISelectionResult) => void;\n\t/** View change handler */\n\tonViewChange?: (view: TCalendarView) => void;\n\t/** Date change handler */\n\tonDateChange?: (date: Date) => void;\n\t/** Additional CSS class */\n\tclassName?: string;\n\t/** Custom style overrides */\n\tstyle?: CSSProperties;\n\t/** Custom header actions */\n\theaderActions?: ReactNode;\n\t/** Empty state for agenda view */\n\temptyState?: ReactNode;\n\t/** Children (for header slot) */\n\tchildren?: ReactNode;\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport function DefaultCalendar<\n\tTEventData = Record<string, unknown>,\n\tTScheduleTypeData = Record<string, unknown>,\n\tTResourceData = Record<string, unknown>,\n>({\n\tevents,\n\tresources: _resources,\n\tscheduleTypes: _scheduleTypes,\n\tinitialView = 'week',\n\tinitialDate,\n\tinitialFilters: _initialFilters,\n\tpreferences: userPreferences,\n\tbadgeVariant = 'colored',\n\thideHeader = false,\n\tavailableViews = ['day', 'week', 'month', 'agenda'],\n\tonEventClick,\n\tonSlotSelect,\n\tonViewChange,\n\tonDateChange,\n\tclassName = '',\n\tstyle,\n\theaderActions,\n\temptyState,\n\tchildren: _children,\n}: DefaultCalendarProps<TEventData, TScheduleTypeData, TResourceData>) {\n\t// ========================================================================\n\t// STATE\n\t// ========================================================================\n\n\tconst [view, setView] = useState<TCalendarView>(initialView);\n\tconst [date, setDate] = useState<Date>(initialDate ?? new Date());\n\n\t// Merge user preferences with defaults\n\tconst preferences: ICalendarPreferences = useMemo(\n\t\t() => ({\n\t\t\t...DEFAULT_PREFERENCES,\n\t\t\t...userPreferences,\n\t\t}),\n\t\t[userPreferences]\n\t);\n\n\t// ========================================================================\n\t// HANDLERS\n\t// ========================================================================\n\n\tconst handleViewChange = useCallback(\n\t\t(newView: TCalendarView) => {\n\t\t\tsetView(newView);\n\t\t\tonViewChange?.(newView);\n\t\t},\n\t\t[onViewChange]\n\t);\n\n\tconst handleDateChange = useCallback(\n\t\t(newDate: Date) => {\n\t\t\tsetDate(newDate);\n\t\t\tonDateChange?.(newDate);\n\t\t},\n\t\t[onDateChange]\n\t);\n\n\tconst handleNavigatePrev = useCallback(() => {\n\t\tconst newDate = navigatePrev(date, view);\n\t\thandleDateChange(newDate);\n\t}, [date, view, handleDateChange]);\n\n\tconst handleNavigateNext = useCallback(() => {\n\t\tconst newDate = navigateNext(date, view);\n\t\thandleDateChange(newDate);\n\t}, [date, view, handleDateChange]);\n\n\tconst handleNavigateToday = useCallback(() => {\n\t\tconst newDate = navigateToday();\n\t\thandleDateChange(newDate);\n\t}, [handleDateChange]);\n\n\tconst handleDayClick = useCallback(\n\t\t(clickedDate: Date) => {\n\t\t\t// Navigate to day view when clicking a day in month view\n\t\t\thandleDateChange(clickedDate);\n\t\t\thandleViewChange('day');\n\t\t},\n\t\t[handleDateChange, handleViewChange]\n\t);\n\n\t// ========================================================================\n\t// VIEW RENDERING\n\t// ========================================================================\n\n\t// Build visible hours from preferences\n\tconst visibleHours = useMemo(\n\t\t() => ({\n\t\t\tstartHour: preferences.startHour,\n\t\t\tendHour: preferences.endHour,\n\t\t}),\n\t\t[preferences.startHour, preferences.endHour]\n\t);\n\n\t// Week starts on (convert from 0-6 to 0 | 1)\n\tconst weekStartsOn: 0 | 1 = preferences.firstDayOfWeek === 0 ? 0 : 1;\n\n\tconst renderView = () => {\n\t\tswitch (view) {\n\t\t\tcase 'day':\n\t\t\t\treturn (\n\t\t\t\t\t<DayView<TEventData>\n\t\t\t\t\t\tevents={events}\n\t\t\t\t\t\tdate={date}\n\t\t\t\t\t\tbadgeVariant={badgeVariant}\n\t\t\t\t\t\tvisibleHours={visibleHours}\n\t\t\t\t\t\tslotDuration={preferences.slotDuration}\n\t\t\t\t\t\t{...(onEventClick && { onEventClick })}\n\t\t\t\t\t\t{...(onSlotSelect && { onSlotSelect })}\n\t\t\t\t\t/>\n\t\t\t\t);\n\n\t\t\tcase 'week':\n\t\t\t\treturn (\n\t\t\t\t\t<WeekView<TEventData>\n\t\t\t\t\t\tevents={events}\n\t\t\t\t\t\tdate={date}\n\t\t\t\t\t\tbadgeVariant={badgeVariant}\n\t\t\t\t\t\tweekStartsOn={weekStartsOn}\n\t\t\t\t\t\tvisibleHours={visibleHours}\n\t\t\t\t\t\tslotDuration={preferences.slotDuration}\n\t\t\t\t\t\tonDayClick={handleDayClick}\n\t\t\t\t\t\t{...(onEventClick && { onEventClick })}\n\t\t\t\t\t\t{...(onSlotSelect && { onSlotSelect })}\n\t\t\t\t\t/>\n\t\t\t\t);\n\n\t\t\tcase 'month':\n\t\t\t\treturn (\n\t\t\t\t\t<MonthView<TEventData>\n\t\t\t\t\t\tevents={events}\n\t\t\t\t\t\tdate={date}\n\t\t\t\t\t\tbadgeVariant={badgeVariant}\n\t\t\t\t\t\tweekStartsOn={weekStartsOn}\n\t\t\t\t\t\tonDayClick={handleDayClick}\n\t\t\t\t\t\t{...(onEventClick && { onEventClick })}\n\t\t\t\t\t\t{...(onSlotSelect && { onSlotSelect })}\n\t\t\t\t\t/>\n\t\t\t\t);\n\n\t\t\tcase 'agenda':\n\t\t\t\treturn (\n\t\t\t\t\t<AgendaView<TEventData>\n\t\t\t\t\t\tevents={events}\n\t\t\t\t\t\tdate={date}\n\t\t\t\t\t\tbadgeVariant={badgeVariant}\n\t\t\t\t\t\t{...(onEventClick && { onEventClick })}\n\t\t\t\t\t\t{...(emptyState && { emptyState })}\n\t\t\t\t\t/>\n\t\t\t\t);\n\n\t\t\tdefault:\n\t\t\t\treturn <div style={fallbackViewStyles}>View &quot;{view}&quot; is not yet implemented</div>;\n\t\t}\n\t};\n\n\t// ========================================================================\n\t// RENDER\n\t// ========================================================================\n\n\treturn (\n\t\t<div className={className} style={{ ...baseStyles, ...style }}>\n\t\t\t{/* Header */}\n\t\t\t{!hideHeader && (\n\t\t\t\t<div style={headerStyles}>\n\t\t\t\t\t<CalendarHeader\n\t\t\t\t\t\tview={view}\n\t\t\t\t\t\tcurrentDate={date}\n\t\t\t\t\t\tavailableViews={availableViews}\n\t\t\t\t\t\tonViewChange={handleViewChange}\n\t\t\t\t\t\tonNavigate={(direction) => {\n\t\t\t\t\t\t\tif (direction === 'prev') handleNavigatePrev();\n\t\t\t\t\t\t\telse if (direction === 'next') handleNavigateNext();\n\t\t\t\t\t\t\telse handleNavigateToday();\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tactions={headerActions}\n\t\t\t\t\t\tclassName=\"p-3\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* Calendar View */}\n\t\t\t<div style={contentStyles}>{renderView()}</div>\n\t\t</div>\n\t);\n}\n","/**\n * TailwindCalendar - Tailwind-Optimized Calendar Preset\n *\n * A fully featured, ready-to-use calendar component designed for TailwindCSS projects.\n * Composes all calendar components into a cohesive experience.\n *\n * Features:\n * - Full customization via render props (renderEvent, renderEventPopover, renderFilterSidebar)\n * - All visual components can be replaced while keeping state management\n * - Matches production quality when used with custom components\n *\n * @example\n * ```tsx\n * import { TailwindCalendar } from '@inno/calendar/presets';\n *\n * function MyAgenda() {\n * return (\n * <TailwindCalendar\n * events={myEvents}\n * onEventClick={(event) => console.log('Clicked:', event)}\n * onSlotSelect={(selection) => console.log('Selected:', selection)}\n * // Custom components for production quality\n * renderEvent={(event) => <MyEventCard event={event} />}\n * renderEventPopover={(event, onClose) => <MyEventPopover event={event} onClose={onClose} />}\n * renderFilterSidebar={(props) => <MyFilterSidebar {...props} />}\n * />\n * );\n * }\n * ```\n */\n\nimport { type ReactNode, useCallback, useMemo, useState } from 'react';\nimport { CalendarHeader } from '../../components/header/calendar-header';\nimport { AgendaView } from '../../components/views/agenda-view';\nimport { DayView } from '../../components/views/day-view';\nimport { MonthView } from '../../components/views/month-view';\nimport { WeekView } from '../../components/views/week-view';\nimport { DEFAULT_PREFERENCES } from '../../core/constants';\nimport type {\n\tCalendarEvent,\n\tICalendarFilters,\n\tICalendarPreferences,\n\tIEventPosition,\n\tIResource,\n\tIScheduleType,\n\tISelectionResult,\n\tTBadgeVariant,\n\tTCalendarView,\n} from '../../core/types';\nimport { navigateNext, navigatePrev, navigateToday } from '../../core/utils/grid-utils';\nimport { cn } from '../../lib/utils';\n\n// ============================================================================\n// RENDER PROP TYPES\n// ============================================================================\n\n/**\n * Props for custom event rendering\n */\nexport interface RenderEventProps<TEventData = Record<string, unknown>> {\n\tevent: CalendarEvent<TEventData>;\n\tview: TCalendarView;\n\tvariant: 'full' | 'compact' | 'dot' | 'block';\n\tposition?: IEventPosition;\n\tbadgeVariant: TBadgeVariant;\n\tonClick?: () => void;\n}\n\n/**\n * Props for custom event popover rendering\n */\nexport interface RenderEventPopoverProps<TEventData = Record<string, unknown>> {\n\tevent: CalendarEvent<TEventData>;\n\tonClose: () => void;\n}\n\n/**\n * Props for custom filter sidebar rendering\n */\nexport interface RenderFilterSidebarProps<TScheduleTypeData = Record<string, unknown>> {\n\tscheduleTypes: IScheduleType<TScheduleTypeData>[];\n\tselectedScheduleTypeIds: number[];\n\tonScheduleTypeChange: (ids: number[]) => void;\n\tselectedParticipantIds: string[];\n\tonParticipantChange: (ids: string[]) => void;\n\tonClearAll?: () => void;\n}\n\n/**\n * Props for custom header rendering\n */\nexport interface RenderHeaderProps {\n\tview: TCalendarView;\n\tcurrentDate: Date;\n\tavailableViews: TCalendarView[];\n\tonViewChange: (view: TCalendarView) => void;\n\tonNavigate: (direction: 'prev' | 'next' | 'today') => void;\n\tonNavigatePrev?: () => void;\n\tonNavigateNext?: () => void;\n\tonNavigateToday?: () => void;\n\tonAddEvent?: () => void;\n\tactions?: ReactNode;\n\tclassName?: string;\n}\n\n// ============================================================================\n// COMPONENT PROPS\n// ============================================================================\n\nexport interface TailwindCalendarProps<\n\tTEventData = Record<string, unknown>,\n\tTScheduleTypeData = Record<string, unknown>,\n\tTResourceData = Record<string, unknown>,\n> {\n\t/** Events to display */\n\tevents: CalendarEvent<TEventData>[];\n\t/** Available resources */\n\tresources?: IResource<TResourceData>[];\n\t/** Available schedule types */\n\tscheduleTypes?: IScheduleType<TScheduleTypeData>[];\n\t/** Initial view */\n\tinitialView?: TCalendarView;\n\t/** Initial date */\n\tinitialDate?: Date;\n\t/** Initial filters */\n\tinitialFilters?: ICalendarFilters;\n\t/** Preferences */\n\tpreferences?: Partial<ICalendarPreferences>;\n\t/** Badge variant for events (dot, colored, mixed) */\n\tbadgeVariant?: TBadgeVariant;\n\t/** Hide the header */\n\thideHeader?: boolean;\n\t/** Show filter sidebar */\n\tshowFilterSidebar?: boolean;\n\t/** Available views to show in view switcher */\n\tavailableViews?: TCalendarView[];\n\n\t// ========================================================================\n\t// CALLBACKS\n\t// ========================================================================\n\n\t/** Event click handler */\n\tonEventClick?: (event: CalendarEvent<TEventData>) => void;\n\t/** Slot selection handler */\n\tonSlotSelect?: (selection: ISelectionResult) => void;\n\t/** View change handler */\n\tonViewChange?: (view: TCalendarView) => void;\n\t/** Date change handler */\n\tonDateChange?: (date: Date) => void;\n\t/** Add event handler (for header button) */\n\tonAddEvent?: () => void;\n\t/** Filter change handler */\n\tonFiltersChange?: (filters: ICalendarFilters) => void;\n\n\t// ========================================================================\n\t// RENDER PROPS (for custom components)\n\t// ========================================================================\n\n\t/**\n\t * Custom event renderer\n\t * Use this to inject your own EventCard component\n\t */\n\trenderEvent?: (props: RenderEventProps<TEventData>) => ReactNode;\n\n\t/**\n\t * Custom event popover renderer\n\t * Use this to inject your own EventPopover component\n\t * If not provided, a basic popover is shown\n\t */\n\trenderEventPopover?: (props: RenderEventPopoverProps<TEventData>) => ReactNode;\n\n\t/**\n\t * Custom filter sidebar renderer\n\t * Use this to inject your own CalendarFilterSidebar component\n\t */\n\trenderFilterSidebar?: (props: RenderFilterSidebarProps<TScheduleTypeData>) => ReactNode;\n\n\t/**\n\t * Custom header renderer\n\t * Use this to inject your own CalendarHeader component\n\t */\n\trenderHeader?: (props: RenderHeaderProps) => ReactNode;\n\n\t// ========================================================================\n\t// HEADER SLOTS\n\t// ========================================================================\n\n\t/** Settings popover content (for default header) */\n\tsettingsContent?: ReactNode;\n\t/** Filter row content (for default header) */\n\tfilterContent?: ReactNode;\n\t/** Whether to show the settings button (default: true) */\n\tshowSettings?: boolean;\n\t/** Whether to show timeline view options (default: false) */\n\tshowTimelineViews?: boolean;\n\n\t// ========================================================================\n\t// STYLING\n\t// ========================================================================\n\n\t/** Additional CSS class */\n\tclassName?: string;\n\t/** Custom header actions (shown in default header) */\n\theaderActions?: ReactNode;\n\t/** Empty state for agenda view */\n\temptyState?: ReactNode;\n\t/** Children (for header slot) */\n\tchildren?: ReactNode;\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport function TailwindCalendar<\n\tTEventData = Record<string, unknown>,\n\tTScheduleTypeData = Record<string, unknown>,\n\tTResourceData = Record<string, unknown>,\n>({\n\tevents,\n\tresources: _resources,\n\tscheduleTypes = [],\n\tinitialView = 'week',\n\tinitialDate,\n\tinitialFilters: _initialFilters,\n\tpreferences: userPreferences,\n\tbadgeVariant = 'colored',\n\thideHeader = false,\n\tshowFilterSidebar = false,\n\tavailableViews = ['day', 'week', 'month', 'agenda'],\n\tonEventClick,\n\tonSlotSelect,\n\tonViewChange,\n\tonDateChange,\n\tonAddEvent,\n\tonFiltersChange,\n\trenderEvent,\n\trenderEventPopover: _renderEventPopover,\n\trenderFilterSidebar,\n\trenderHeader,\n\tsettingsContent,\n\tfilterContent,\n\tshowSettings = true,\n\tshowTimelineViews = false,\n\tclassName,\n\theaderActions,\n\temptyState,\n\tchildren: _children,\n}: TailwindCalendarProps<TEventData, TScheduleTypeData, TResourceData>) {\n\t// ========================================================================\n\t// STATE\n\t// ========================================================================\n\n\tconst [view, setView] = useState<TCalendarView>(initialView);\n\tconst [date, setDate] = useState<Date>(initialDate ?? new Date());\n\n\t// Filter state (for filter sidebar)\n\tconst [selectedScheduleTypeIds, setSelectedScheduleTypeIds] = useState<number[]>([]);\n\tconst [selectedParticipantIds, setSelectedParticipantIds] = useState<string[]>([]);\n\n\t// Merge user preferences with defaults\n\tconst preferences: ICalendarPreferences = useMemo(\n\t\t() => ({\n\t\t\t...DEFAULT_PREFERENCES,\n\t\t\t...userPreferences,\n\t\t}),\n\t\t[userPreferences]\n\t);\n\n\t// ========================================================================\n\t// HANDLERS\n\t// ========================================================================\n\n\tconst handleViewChange = useCallback(\n\t\t(newView: TCalendarView) => {\n\t\t\tsetView(newView);\n\t\t\tonViewChange?.(newView);\n\t\t},\n\t\t[onViewChange]\n\t);\n\n\tconst handleDateChange = useCallback(\n\t\t(newDate: Date) => {\n\t\t\tsetDate(newDate);\n\t\t\tonDateChange?.(newDate);\n\t\t},\n\t\t[onDateChange]\n\t);\n\n\tconst handleNavigatePrev = useCallback(() => {\n\t\tconst newDate = navigatePrev(date, view);\n\t\thandleDateChange(newDate);\n\t}, [date, view, handleDateChange]);\n\n\tconst handleNavigateNext = useCallback(() => {\n\t\tconst newDate = navigateNext(date, view);\n\t\thandleDateChange(newDate);\n\t}, [date, view, handleDateChange]);\n\n\tconst handleNavigateToday = useCallback(() => {\n\t\tconst newDate = navigateToday();\n\t\thandleDateChange(newDate);\n\t}, [handleDateChange]);\n\n\tconst handleDayClick = useCallback(\n\t\t(clickedDate: Date) => {\n\t\t\t// Navigate to day view when clicking a day in month view\n\t\t\thandleDateChange(clickedDate);\n\t\t\thandleViewChange('day');\n\t\t},\n\t\t[handleDateChange, handleViewChange]\n\t);\n\n\t// ========================================================================\n\t// VIEW RENDERING\n\t// ========================================================================\n\n\t// Visible hours - show all hours (0-24) so users can see the full day\n\t// The working hours determine which slots have striped (disabled) appearance\n\tconst visibleHours = useMemo(\n\t\t() => ({\n\t\t\tstartHour: 0,\n\t\t\tendHour: 24,\n\t\t}),\n\t\t[]\n\t);\n\n\t// Week starts on (convert from 0-6 to 0 | 1)\n\tconst weekStartsOn: 0 | 1 = preferences.firstDayOfWeek === 0 ? 0 : 1;\n\n\t// Build working hours from preferences (for time grid views)\n\t// Working hours determine which slots are clickable and don't have striped pattern\n\t// Non-working hours get diagonal stripes and are disabled\n\tconst workingHours = useMemo(() => {\n\t\tconst hours: Record<number, { enabled: boolean; from: number; to: number }> = {};\n\t\tfor (let i = 0; i <= 6; i++) {\n\t\t\tconst isWeekend = i === 0 || i === 6;\n\t\t\t// Weekdays: use preferences, Weekends: use preferences if showWeekends, otherwise disabled\n\t\t\tif (!isWeekend) {\n\t\t\t\t// Weekdays (Mon-Fri): always have working hours from preferences\n\t\t\t\thours[i] = { enabled: true, from: preferences.startHour, to: preferences.endHour };\n\t\t\t} else if (preferences.showWeekends) {\n\t\t\t\t// Weekends with showWeekends: Saturday half-day (8-12), Sunday disabled\n\t\t\t\tif (i === 6) {\n\t\t\t\t\t// Saturday - half day (matching agenda-v2)\n\t\t\t\t\thours[i] = { enabled: true, from: 8, to: 12 };\n\t\t\t\t} else {\n\t\t\t\t\t// Sunday - disabled\n\t\t\t\t\thours[i] = { enabled: false, from: 0, to: 0 };\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Weekends without showWeekends: both disabled\n\t\t\t\thours[i] = { enabled: false, from: 0, to: 0 };\n\t\t\t}\n\t\t}\n\t\treturn hours;\n\t}, [preferences.startHour, preferences.endHour, preferences.showWeekends]);\n\n\t// Handle filter changes\n\tconst handleScheduleTypeFilterChange = useCallback(\n\t\t(ids: number[]) => {\n\t\t\tsetSelectedScheduleTypeIds(ids);\n\t\t\tonFiltersChange?.({\n\t\t\t\tscheduleTypeIds: ids,\n\t\t\t\tparticipantIds: selectedParticipantIds,\n\t\t\t});\n\t\t},\n\t\t[onFiltersChange, selectedParticipantIds]\n\t);\n\n\tconst handleParticipantFilterChange = useCallback(\n\t\t(ids: string[]) => {\n\t\t\tsetSelectedParticipantIds(ids);\n\t\t\tonFiltersChange?.({\n\t\t\t\tscheduleTypeIds: selectedScheduleTypeIds,\n\t\t\t\tparticipantIds: ids,\n\t\t\t});\n\t\t},\n\t\t[onFiltersChange, selectedScheduleTypeIds]\n\t);\n\n\t// Create render event adapters for different view types\n\t// Each view has a slightly different renderEvent signature\n\n\tconst dayWeekRenderEvent = useMemo(() => {\n\t\tif (!renderEvent) return undefined;\n\t\treturn (props: {\n\t\t\tevent: CalendarEvent<TEventData>;\n\t\t\tposition: { top: number; height: number; left: number; width: number };\n\t\t}) => {\n\t\t\treturn renderEvent({\n\t\t\t\tevent: props.event,\n\t\t\t\tview,\n\t\t\t\tvariant: 'full',\n\t\t\t\tposition: { ...props.position, zIndex: 1 },\n\t\t\t\tbadgeVariant,\n\t\t\t\t...(onEventClick && { onClick: () => onEventClick(props.event) }),\n\t\t\t});\n\t\t};\n\t}, [renderEvent, view, badgeVariant, onEventClick]);\n\n\tconst monthRenderEvent = useMemo(() => {\n\t\tif (!renderEvent) return undefined;\n\t\treturn (props: { event: CalendarEvent<TEventData>; variant: 'compact' }) => {\n\t\t\treturn renderEvent({\n\t\t\t\tevent: props.event,\n\t\t\t\tview: 'month',\n\t\t\t\tvariant: props.variant,\n\t\t\t\tbadgeVariant,\n\t\t\t\t...(onEventClick && { onClick: () => onEventClick(props.event) }),\n\t\t\t});\n\t\t};\n\t}, [renderEvent, badgeVariant, onEventClick]);\n\n\tconst agendaRenderEvent = useMemo(() => {\n\t\tif (!renderEvent) return undefined;\n\t\treturn (props: { event: CalendarEvent<TEventData> }) => {\n\t\t\treturn renderEvent({\n\t\t\t\tevent: props.event,\n\t\t\t\tview: 'agenda',\n\t\t\t\tvariant: 'block',\n\t\t\t\tbadgeVariant,\n\t\t\t\t...(onEventClick && { onClick: () => onEventClick(props.event) }),\n\t\t\t});\n\t\t};\n\t}, [renderEvent, badgeVariant, onEventClick]);\n\n\tconst renderView = () => {\n\t\tswitch (view) {\n\t\t\tcase 'day':\n\t\t\t\treturn (\n\t\t\t\t\t<DayView<TEventData>\n\t\t\t\t\t\tevents={events}\n\t\t\t\t\t\tdate={date}\n\t\t\t\t\t\tbadgeVariant={badgeVariant}\n\t\t\t\t\t\tvisibleHours={visibleHours}\n\t\t\t\t\t\tworkingHours={workingHours}\n\t\t\t\t\t\tslotDuration={preferences.slotDuration}\n\t\t\t\t\t\t{...(onEventClick && { onEventClick })}\n\t\t\t\t\t\t{...(onSlotSelect && { onSlotSelect })}\n\t\t\t\t\t\t{...(dayWeekRenderEvent && { renderEvent: dayWeekRenderEvent })}\n\t\t\t\t\t/>\n\t\t\t\t);\n\n\t\t\tcase 'week':\n\t\t\t\treturn (\n\t\t\t\t\t<WeekView<TEventData>\n\t\t\t\t\t\tevents={events}\n\t\t\t\t\t\tdate={date}\n\t\t\t\t\t\tbadgeVariant={badgeVariant}\n\t\t\t\t\t\tweekStartsOn={weekStartsOn}\n\t\t\t\t\t\tvisibleHours={visibleHours}\n\t\t\t\t\t\tworkingHours={workingHours}\n\t\t\t\t\t\tslotDuration={preferences.slotDuration}\n\t\t\t\t\t\tonDayClick={handleDayClick}\n\t\t\t\t\t\t{...(onEventClick && { onEventClick })}\n\t\t\t\t\t\t{...(onSlotSelect && { onSlotSelect })}\n\t\t\t\t\t\t{...(dayWeekRenderEvent && { renderEvent: dayWeekRenderEvent })}\n\t\t\t\t\t/>\n\t\t\t\t);\n\n\t\t\tcase 'month':\n\t\t\t\treturn (\n\t\t\t\t\t<MonthView<TEventData>\n\t\t\t\t\t\tevents={events}\n\t\t\t\t\t\tdate={date}\n\t\t\t\t\t\tbadgeVariant={badgeVariant}\n\t\t\t\t\t\tweekStartsOn={weekStartsOn}\n\t\t\t\t\t\tonDayClick={handleDayClick}\n\t\t\t\t\t\t{...(onEventClick && { onEventClick })}\n\t\t\t\t\t\t{...(onSlotSelect && { onSlotSelect })}\n\t\t\t\t\t\t{...(monthRenderEvent && { renderEvent: monthRenderEvent })}\n\t\t\t\t\t/>\n\t\t\t\t);\n\n\t\t\tcase 'agenda':\n\t\t\t\treturn (\n\t\t\t\t\t<AgendaView<TEventData>\n\t\t\t\t\t\tevents={events}\n\t\t\t\t\t\tdate={date}\n\t\t\t\t\t\tbadgeVariant={badgeVariant}\n\t\t\t\t\t\t{...(onEventClick && { onEventClick })}\n\t\t\t\t\t\t{...(emptyState && { emptyState })}\n\t\t\t\t\t\t{...(agendaRenderEvent && { renderEvent: agendaRenderEvent })}\n\t\t\t\t\t/>\n\t\t\t\t);\n\n\t\t\tdefault:\n\t\t\t\treturn (\n\t\t\t\t\t<div className=\"flex items-center justify-center h-64 text-gray-500\">\n\t\t\t\t\t\tView &quot;{view}&quot; is not yet implemented\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t}\n\t};\n\n\t// ========================================================================\n\t// RENDER\n\t// ========================================================================\n\n\t// Header navigation handler\n\tconst handleNavigate = useCallback(\n\t\t(direction: 'prev' | 'next' | 'today') => {\n\t\t\tif (direction === 'prev') handleNavigatePrev();\n\t\t\telse if (direction === 'next') handleNavigateNext();\n\t\t\telse handleNavigateToday();\n\t\t},\n\t\t[handleNavigatePrev, handleNavigateNext, handleNavigateToday]\n\t);\n\n\t// Default header props (conditionally add optional props)\n\tconst headerProps: RenderHeaderProps = {\n\t\tview,\n\t\tcurrentDate: date,\n\t\tavailableViews,\n\t\tonViewChange: handleViewChange,\n\t\tonNavigate: handleNavigate,\n\t\tonNavigatePrev: handleNavigatePrev,\n\t\tonNavigateNext: handleNavigateNext,\n\t\tonNavigateToday: handleNavigateToday,\n\t\t...(onAddEvent && { onAddEvent }),\n\t\t...(headerActions && { actions: headerActions }),\n\t\tclassName: 'border-b border-gray-200 p-3',\n\t};\n\n\t// Calendar header props (includes events for count display + slots)\n\tconst calendarHeaderProps = {\n\t\t...headerProps,\n\t\tevents,\n\t\tweekStartsOn,\n\t\tsettingsContent,\n\t\tfilterContent,\n\t\tshowSettings,\n\t\tshowTimelineViews,\n\t};\n\n\t// Clear all filters handler\n\tconst handleClearAllFilters = useCallback(() => {\n\t\tsetSelectedScheduleTypeIds([]);\n\t\tsetSelectedParticipantIds([]);\n\t\tonFiltersChange?.({\n\t\t\tscheduleTypeIds: [],\n\t\t\tparticipantIds: [],\n\t\t});\n\t}, [onFiltersChange]);\n\n\treturn (\n\t\t<div className={cn('flex h-full bg-white border border-gray-200 rounded-lg', className)}>\n\t\t\t{/* Filter Sidebar */}\n\t\t\t{showFilterSidebar && (\n\t\t\t\t<div className=\"w-64 border-r border-gray-200 flex-shrink-0\">\n\t\t\t\t\t{renderFilterSidebar ? (\n\t\t\t\t\t\trenderFilterSidebar({\n\t\t\t\t\t\t\tscheduleTypes,\n\t\t\t\t\t\t\tselectedScheduleTypeIds,\n\t\t\t\t\t\t\tselectedParticipantIds,\n\t\t\t\t\t\t\tonScheduleTypeChange: handleScheduleTypeFilterChange,\n\t\t\t\t\t\t\tonParticipantChange: handleParticipantFilterChange,\n\t\t\t\t\t\t\tonClearAll: handleClearAllFilters,\n\t\t\t\t\t\t})\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<div className=\"p-4 text-sm text-gray-500\">Filter sidebar not configured</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* Main Calendar Area */}\n\t\t\t<div className=\"flex flex-col flex-1 min-w-0\">\n\t\t\t\t{/* Header */}\n\t\t\t\t{!hideHeader &&\n\t\t\t\t\t(renderHeader ? renderHeader(headerProps) : <CalendarHeader {...calendarHeaderProps} />)}\n\n\t\t\t\t{/* Calendar View */}\n\t\t\t\t<div className=\"flex-1 overflow-auto\">{renderView()}</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n"],"names":["baseStyles","headerStyles","contentStyles","fallbackViewStyles","DefaultCalendar","events","_resources","_scheduleTypes","initialView","initialDate","_initialFilters","userPreferences","badgeVariant","hideHeader","availableViews","onEventClick","onSlotSelect","onViewChange","onDateChange","className","style","headerActions","emptyState","_children","view","setView","useState","date","setDate","preferences","useMemo","DEFAULT_PREFERENCES","handleViewChange","useCallback","newView","handleDateChange","newDate","handleNavigatePrev","navigatePrev","handleNavigateNext","navigateNext","handleNavigateToday","navigateToday","handleDayClick","clickedDate","visibleHours","weekStartsOn","renderView","jsx","DayView","WeekView","MonthView","AgendaView","jsxs","CalendarHeader","direction","TailwindCalendar","scheduleTypes","showFilterSidebar","onAddEvent","onFiltersChange","renderEvent","_renderEventPopover","renderFilterSidebar","renderHeader","settingsContent","filterContent","showSettings","showTimelineViews","selectedScheduleTypeIds","setSelectedScheduleTypeIds","selectedParticipantIds","setSelectedParticipantIds","workingHours","hours","i","handleScheduleTypeFilterChange","ids","handleParticipantFilterChange","dayWeekRenderEvent","props","monthRenderEvent","agendaRenderEvent","handleNavigate","headerProps","calendarHeaderProps","handleClearAllFilters","cn"],"mappings":"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"}
1
+ {"version":3,"file":"tailwind-calendar-3IAm_TdP.cjs","sources":["../src/presets/default/default-calendar.tsx","../src/presets/tailwind/tailwind-calendar.tsx"],"sourcesContent":["/**\n * DefaultCalendar - Pre-styled Calendar Preset\n *\n * A fully styled calendar using CSS custom properties for theming.\n * Designed for projects that don't use TailwindCSS but want a complete solution.\n *\n * CSS Custom Properties (override these for theming):\n * - --ic-bg: Background color\n * - --ic-bg-muted: Muted background\n * - --ic-text: Primary text color\n * - --ic-text-muted: Secondary text color\n * - --ic-border: Border color\n * - --ic-primary: Primary/accent color\n * - --ic-primary-foreground: Text on primary background\n * - --ic-radius: Border radius\n *\n * @example\n * ```tsx\n * import { DefaultCalendar } from '@inno/calendar/presets';\n *\n * function MyAgenda() {\n * return (\n * <div style={{ '--ic-primary': '#6366f1' }}>\n * <DefaultCalendar\n * events={myEvents}\n * onEventClick={(event) => console.log('Clicked:', event)}\n * />\n * </div>\n * );\n * }\n * ```\n */\n\nimport { type CSSProperties, type ReactNode, useCallback, useMemo, useState } from 'react';\nimport { CalendarHeader } from '../../components/header/calendar-header';\nimport { AgendaView } from '../../components/views/agenda-view';\nimport { DayView } from '../../components/views/day-view';\nimport { MonthView } from '../../components/views/month-view';\nimport { WeekView } from '../../components/views/week-view';\nimport { DEFAULT_PREFERENCES } from '../../core/constants';\nimport type {\n\tCalendarEvent,\n\tICalendarFilters,\n\tICalendarPreferences,\n\tIResource,\n\tIScheduleType,\n\tISelectionResult,\n\tTBadgeVariant,\n\tTCalendarView,\n} from '../../core/types';\nimport { navigateNext, navigatePrev, navigateToday } from '../../core/utils/grid-utils';\n\n// ============================================================================\n// STYLES (CSS-in-JS for zero-config usage)\n// ============================================================================\n\nconst baseStyles: CSSProperties = {\n\tdisplay: 'flex',\n\tflexDirection: 'column',\n\theight: '100%',\n\tminHeight: '400px',\n\tbackgroundColor: 'var(--ic-bg, #ffffff)',\n\tborder: '1px solid var(--ic-border, #e5e7eb)',\n\tborderRadius: 'var(--ic-radius, 0.5rem)',\n\toverflow: 'hidden',\n\tfontFamily:\n\t\t'var(--ic-font-family, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif)',\n\tfontSize: 'var(--ic-font-size, 0.875rem)',\n\tcolor: 'var(--ic-text, #111827)',\n};\n\nconst headerStyles: CSSProperties = {\n\tborderBottom: '1px solid var(--ic-border, #e5e7eb)',\n};\n\nconst contentStyles: CSSProperties = {\n\tflex: 1,\n\toverflow: 'auto',\n};\n\nconst fallbackViewStyles: CSSProperties = {\n\tdisplay: 'flex',\n\talignItems: 'center',\n\tjustifyContent: 'center',\n\theight: '16rem',\n\tcolor: 'var(--ic-text-muted, #6b7280)',\n};\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface DefaultCalendarProps<\n\tTEventData = Record<string, unknown>,\n\tTScheduleTypeData = Record<string, unknown>,\n\tTResourceData = Record<string, unknown>,\n> {\n\t/** Events to display */\n\tevents: CalendarEvent<TEventData>[];\n\t/** Available resources */\n\tresources?: IResource<TResourceData>[];\n\t/** Available schedule types */\n\tscheduleTypes?: IScheduleType<TScheduleTypeData>[];\n\t/** Initial view */\n\tinitialView?: TCalendarView;\n\t/** Initial date */\n\tinitialDate?: Date;\n\t/** Initial filters */\n\tinitialFilters?: ICalendarFilters;\n\t/** Preferences */\n\tpreferences?: Partial<ICalendarPreferences>;\n\t/** Badge variant for events (dot, colored, mixed) */\n\tbadgeVariant?: TBadgeVariant;\n\t/** Hide the header */\n\thideHeader?: boolean;\n\t/** Available views to show in view switcher */\n\tavailableViews?: TCalendarView[];\n\t/** Event click handler */\n\tonEventClick?: (event: CalendarEvent<TEventData>) => void;\n\t/** Slot selection handler */\n\tonSlotSelect?: (selection: ISelectionResult) => void;\n\t/** View change handler */\n\tonViewChange?: (view: TCalendarView) => void;\n\t/** Date change handler */\n\tonDateChange?: (date: Date) => void;\n\t/** Additional CSS class */\n\tclassName?: string;\n\t/** Custom style overrides */\n\tstyle?: CSSProperties;\n\t/** Custom header actions */\n\theaderActions?: ReactNode;\n\t/** Empty state for agenda view */\n\temptyState?: ReactNode;\n\t/** Children (for header slot) */\n\tchildren?: ReactNode;\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport function DefaultCalendar<\n\tTEventData = Record<string, unknown>,\n\tTScheduleTypeData = Record<string, unknown>,\n\tTResourceData = Record<string, unknown>,\n>({\n\tevents,\n\tresources: _resources,\n\tscheduleTypes: _scheduleTypes,\n\tinitialView = 'week',\n\tinitialDate,\n\tinitialFilters: _initialFilters,\n\tpreferences: userPreferences,\n\tbadgeVariant = 'colored',\n\thideHeader = false,\n\tavailableViews = ['day', 'week', 'month', 'agenda'],\n\tonEventClick,\n\tonSlotSelect,\n\tonViewChange,\n\tonDateChange,\n\tclassName = '',\n\tstyle,\n\theaderActions,\n\temptyState,\n\tchildren: _children,\n}: DefaultCalendarProps<TEventData, TScheduleTypeData, TResourceData>) {\n\t// ========================================================================\n\t// STATE\n\t// ========================================================================\n\n\tconst [view, setView] = useState<TCalendarView>(initialView);\n\tconst [date, setDate] = useState<Date>(initialDate ?? new Date());\n\n\t// Merge user preferences with defaults\n\tconst preferences: ICalendarPreferences = useMemo(\n\t\t() => ({\n\t\t\t...DEFAULT_PREFERENCES,\n\t\t\t...userPreferences,\n\t\t}),\n\t\t[userPreferences]\n\t);\n\n\t// ========================================================================\n\t// HANDLERS\n\t// ========================================================================\n\n\tconst handleViewChange = useCallback(\n\t\t(newView: TCalendarView) => {\n\t\t\tsetView(newView);\n\t\t\tonViewChange?.(newView);\n\t\t},\n\t\t[onViewChange]\n\t);\n\n\tconst handleDateChange = useCallback(\n\t\t(newDate: Date) => {\n\t\t\tsetDate(newDate);\n\t\t\tonDateChange?.(newDate);\n\t\t},\n\t\t[onDateChange]\n\t);\n\n\tconst handleNavigatePrev = useCallback(() => {\n\t\tconst newDate = navigatePrev(date, view);\n\t\thandleDateChange(newDate);\n\t}, [date, view, handleDateChange]);\n\n\tconst handleNavigateNext = useCallback(() => {\n\t\tconst newDate = navigateNext(date, view);\n\t\thandleDateChange(newDate);\n\t}, [date, view, handleDateChange]);\n\n\tconst handleNavigateToday = useCallback(() => {\n\t\tconst newDate = navigateToday();\n\t\thandleDateChange(newDate);\n\t}, [handleDateChange]);\n\n\tconst handleDayClick = useCallback(\n\t\t(clickedDate: Date) => {\n\t\t\t// Navigate to day view when clicking a day in month view\n\t\t\thandleDateChange(clickedDate);\n\t\t\thandleViewChange('day');\n\t\t},\n\t\t[handleDateChange, handleViewChange]\n\t);\n\n\t// ========================================================================\n\t// VIEW RENDERING\n\t// ========================================================================\n\n\t// Build visible hours from preferences\n\tconst visibleHours = useMemo(\n\t\t() => ({\n\t\t\tstartHour: preferences.startHour,\n\t\t\tendHour: preferences.endHour,\n\t\t}),\n\t\t[preferences.startHour, preferences.endHour]\n\t);\n\n\t// Week starts on (convert from 0-6 to 0 | 1)\n\tconst weekStartsOn: 0 | 1 = preferences.firstDayOfWeek === 0 ? 0 : 1;\n\n\tconst renderView = () => {\n\t\tswitch (view) {\n\t\t\tcase 'day':\n\t\t\t\treturn (\n\t\t\t\t\t<DayView<TEventData>\n\t\t\t\t\t\tevents={events}\n\t\t\t\t\t\tdate={date}\n\t\t\t\t\t\tbadgeVariant={badgeVariant}\n\t\t\t\t\t\tvisibleHours={visibleHours}\n\t\t\t\t\t\tslotDuration={preferences.slotDuration}\n\t\t\t\t\t\t{...(onEventClick && { onEventClick })}\n\t\t\t\t\t\t{...(onSlotSelect && { onSlotSelect })}\n\t\t\t\t\t/>\n\t\t\t\t);\n\n\t\t\tcase 'week':\n\t\t\t\treturn (\n\t\t\t\t\t<WeekView<TEventData>\n\t\t\t\t\t\tevents={events}\n\t\t\t\t\t\tdate={date}\n\t\t\t\t\t\tbadgeVariant={badgeVariant}\n\t\t\t\t\t\tweekStartsOn={weekStartsOn}\n\t\t\t\t\t\tvisibleHours={visibleHours}\n\t\t\t\t\t\tslotDuration={preferences.slotDuration}\n\t\t\t\t\t\tonDayClick={handleDayClick}\n\t\t\t\t\t\t{...(onEventClick && { onEventClick })}\n\t\t\t\t\t\t{...(onSlotSelect && { onSlotSelect })}\n\t\t\t\t\t/>\n\t\t\t\t);\n\n\t\t\tcase 'month':\n\t\t\t\treturn (\n\t\t\t\t\t<MonthView<TEventData>\n\t\t\t\t\t\tevents={events}\n\t\t\t\t\t\tdate={date}\n\t\t\t\t\t\tbadgeVariant={badgeVariant}\n\t\t\t\t\t\tweekStartsOn={weekStartsOn}\n\t\t\t\t\t\tonDayClick={handleDayClick}\n\t\t\t\t\t\t{...(onEventClick && { onEventClick })}\n\t\t\t\t\t\t{...(onSlotSelect && { onSlotSelect })}\n\t\t\t\t\t/>\n\t\t\t\t);\n\n\t\t\tcase 'agenda':\n\t\t\t\treturn (\n\t\t\t\t\t<AgendaView<TEventData>\n\t\t\t\t\t\tevents={events}\n\t\t\t\t\t\tdate={date}\n\t\t\t\t\t\tbadgeVariant={badgeVariant}\n\t\t\t\t\t\t{...(onEventClick && { onEventClick })}\n\t\t\t\t\t\t{...(emptyState && { emptyState })}\n\t\t\t\t\t/>\n\t\t\t\t);\n\n\t\t\tdefault:\n\t\t\t\treturn <div style={fallbackViewStyles}>View &quot;{view}&quot; is not yet implemented</div>;\n\t\t}\n\t};\n\n\t// ========================================================================\n\t// RENDER\n\t// ========================================================================\n\n\treturn (\n\t\t<div className={className} style={{ ...baseStyles, ...style }}>\n\t\t\t{/* Header */}\n\t\t\t{!hideHeader && (\n\t\t\t\t<div style={headerStyles}>\n\t\t\t\t\t<CalendarHeader\n\t\t\t\t\t\tview={view}\n\t\t\t\t\t\tcurrentDate={date}\n\t\t\t\t\t\tavailableViews={availableViews}\n\t\t\t\t\t\tonViewChange={handleViewChange}\n\t\t\t\t\t\tonNavigate={(direction) => {\n\t\t\t\t\t\t\tif (direction === 'prev') handleNavigatePrev();\n\t\t\t\t\t\t\telse if (direction === 'next') handleNavigateNext();\n\t\t\t\t\t\t\telse handleNavigateToday();\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tactions={headerActions}\n\t\t\t\t\t\tclassName=\"p-3\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* Calendar View */}\n\t\t\t<div style={contentStyles}>{renderView()}</div>\n\t\t</div>\n\t);\n}\n","/**\n * TailwindCalendar - Tailwind-Optimized Calendar Preset\n *\n * A fully featured, ready-to-use calendar component designed for TailwindCSS projects.\n * Composes all calendar components into a cohesive experience.\n *\n * Features:\n * - Full customization via render props (renderEvent, renderEventPopover, renderFilterSidebar)\n * - All visual components can be replaced while keeping state management\n * - Matches production quality when used with custom components\n *\n * @example\n * ```tsx\n * import { TailwindCalendar } from '@inno/calendar/presets';\n *\n * function MyAgenda() {\n * return (\n * <TailwindCalendar\n * events={myEvents}\n * onEventClick={(event) => console.log('Clicked:', event)}\n * onSlotSelect={(selection) => console.log('Selected:', selection)}\n * // Custom components for production quality\n * renderEvent={(event) => <MyEventCard event={event} />}\n * renderEventPopover={(event, onClose) => <MyEventPopover event={event} onClose={onClose} />}\n * renderFilterSidebar={(props) => <MyFilterSidebar {...props} />}\n * />\n * );\n * }\n * ```\n */\n\nimport { type ReactNode, useCallback, useMemo, useState } from 'react';\nimport { CalendarHeader } from '../../components/header/calendar-header';\nimport { AgendaView } from '../../components/views/agenda-view';\nimport { DayView } from '../../components/views/day-view';\nimport { MonthView } from '../../components/views/month-view';\nimport { WeekView } from '../../components/views/week-view';\nimport { DEFAULT_PREFERENCES } from '../../core/constants';\nimport type {\n\tCalendarEvent,\n\tICalendarFilters,\n\tICalendarPreferences,\n\tIEventPosition,\n\tIResource,\n\tIScheduleType,\n\tISelectionResult,\n\tTBadgeVariant,\n\tTCalendarView,\n} from '../../core/types';\nimport { navigateNext, navigatePrev, navigateToday } from '../../core/utils/grid-utils';\nimport { cn } from '../../lib/utils';\n\n// ============================================================================\n// RENDER PROP TYPES\n// ============================================================================\n\n/**\n * Props for custom event rendering\n */\nexport interface RenderEventProps<TEventData = Record<string, unknown>> {\n\tevent: CalendarEvent<TEventData>;\n\tview: TCalendarView;\n\tvariant: 'full' | 'compact' | 'dot' | 'block';\n\tposition?: IEventPosition;\n\tbadgeVariant: TBadgeVariant;\n\tonClick?: () => void;\n}\n\n/**\n * Props for custom event popover rendering\n */\nexport interface RenderEventPopoverProps<TEventData = Record<string, unknown>> {\n\tevent: CalendarEvent<TEventData>;\n\tonClose: () => void;\n}\n\n/**\n * Props for custom filter sidebar rendering\n */\nexport interface RenderFilterSidebarProps<TScheduleTypeData = Record<string, unknown>> {\n\tscheduleTypes: IScheduleType<TScheduleTypeData>[];\n\tselectedScheduleTypeIds: number[];\n\tonScheduleTypeChange: (ids: number[]) => void;\n\tselectedParticipantIds: string[];\n\tonParticipantChange: (ids: string[]) => void;\n\tonClearAll?: () => void;\n}\n\n/**\n * Props for custom header rendering\n */\nexport interface RenderHeaderProps {\n\tview: TCalendarView;\n\tcurrentDate: Date;\n\tavailableViews: TCalendarView[];\n\tonViewChange: (view: TCalendarView) => void;\n\tonNavigate: (direction: 'prev' | 'next' | 'today') => void;\n\tonNavigatePrev?: () => void;\n\tonNavigateNext?: () => void;\n\tonNavigateToday?: () => void;\n\tonAddEvent?: () => void;\n\tactions?: ReactNode;\n\tclassName?: string;\n}\n\n// ============================================================================\n// COMPONENT PROPS\n// ============================================================================\n\nexport interface TailwindCalendarProps<\n\tTEventData = Record<string, unknown>,\n\tTScheduleTypeData = Record<string, unknown>,\n\tTResourceData = Record<string, unknown>,\n> {\n\t/** Events to display */\n\tevents: CalendarEvent<TEventData>[];\n\t/** Available resources */\n\tresources?: IResource<TResourceData>[];\n\t/** Available schedule types */\n\tscheduleTypes?: IScheduleType<TScheduleTypeData>[];\n\t/** Initial view */\n\tinitialView?: TCalendarView;\n\t/** Initial date */\n\tinitialDate?: Date;\n\t/** Initial filters */\n\tinitialFilters?: ICalendarFilters;\n\t/** Preferences */\n\tpreferences?: Partial<ICalendarPreferences>;\n\t/** Badge variant for events (dot, colored, mixed) */\n\tbadgeVariant?: TBadgeVariant;\n\t/** Hide the header */\n\thideHeader?: boolean;\n\t/** Show filter sidebar */\n\tshowFilterSidebar?: boolean;\n\t/** Available views to show in view switcher */\n\tavailableViews?: TCalendarView[];\n\n\t// ========================================================================\n\t// CALLBACKS\n\t// ========================================================================\n\n\t/** Event click handler */\n\tonEventClick?: (event: CalendarEvent<TEventData>) => void;\n\t/** Slot selection handler */\n\tonSlotSelect?: (selection: ISelectionResult) => void;\n\t/** View change handler */\n\tonViewChange?: (view: TCalendarView) => void;\n\t/** Date change handler */\n\tonDateChange?: (date: Date) => void;\n\t/** Add event handler (for header button) */\n\tonAddEvent?: () => void;\n\t/** Filter change handler */\n\tonFiltersChange?: (filters: ICalendarFilters) => void;\n\n\t// ========================================================================\n\t// RENDER PROPS (for custom components)\n\t// ========================================================================\n\n\t/**\n\t * Custom event renderer\n\t * Use this to inject your own EventCard component\n\t */\n\trenderEvent?: (props: RenderEventProps<TEventData>) => ReactNode;\n\n\t/**\n\t * Custom event popover renderer\n\t * Use this to inject your own EventPopover component\n\t * If not provided, a basic popover is shown\n\t */\n\trenderEventPopover?: (props: RenderEventPopoverProps<TEventData>) => ReactNode;\n\n\t/**\n\t * Custom filter sidebar renderer\n\t * Use this to inject your own CalendarFilterSidebar component\n\t */\n\trenderFilterSidebar?: (props: RenderFilterSidebarProps<TScheduleTypeData>) => ReactNode;\n\n\t/**\n\t * Custom header renderer\n\t * Use this to inject your own CalendarHeader component\n\t */\n\trenderHeader?: (props: RenderHeaderProps) => ReactNode;\n\n\t// ========================================================================\n\t// HEADER SLOTS\n\t// ========================================================================\n\n\t/** Settings popover content (for default header) */\n\tsettingsContent?: ReactNode;\n\t/** Filter row content (for default header) */\n\tfilterContent?: ReactNode;\n\t/** Whether to show the settings button (default: true) */\n\tshowSettings?: boolean;\n\t/** Whether to show timeline view options (default: false) */\n\tshowTimelineViews?: boolean;\n\n\t// ========================================================================\n\t// STYLING\n\t// ========================================================================\n\n\t/** Additional CSS class */\n\tclassName?: string;\n\t/** Custom header actions (shown in default header) */\n\theaderActions?: ReactNode;\n\t/** Empty state for agenda view */\n\temptyState?: ReactNode;\n\t/** Children (for header slot) */\n\tchildren?: ReactNode;\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport function TailwindCalendar<\n\tTEventData = Record<string, unknown>,\n\tTScheduleTypeData = Record<string, unknown>,\n\tTResourceData = Record<string, unknown>,\n>({\n\tevents,\n\tresources: _resources,\n\tscheduleTypes = [],\n\tinitialView = 'week',\n\tinitialDate,\n\tinitialFilters: _initialFilters,\n\tpreferences: userPreferences,\n\tbadgeVariant = 'colored',\n\thideHeader = false,\n\tshowFilterSidebar = false,\n\tavailableViews = ['day', 'week', 'month', 'agenda'],\n\tonEventClick,\n\tonSlotSelect,\n\tonViewChange,\n\tonDateChange,\n\tonAddEvent,\n\tonFiltersChange,\n\trenderEvent,\n\trenderEventPopover: _renderEventPopover,\n\trenderFilterSidebar,\n\trenderHeader,\n\tsettingsContent,\n\tfilterContent,\n\tshowSettings = true,\n\tshowTimelineViews = false,\n\tclassName,\n\theaderActions,\n\temptyState,\n\tchildren: _children,\n}: TailwindCalendarProps<TEventData, TScheduleTypeData, TResourceData>) {\n\t// ========================================================================\n\t// STATE\n\t// ========================================================================\n\n\tconst [view, setView] = useState<TCalendarView>(initialView);\n\tconst [date, setDate] = useState<Date>(initialDate ?? new Date());\n\n\t// Filter state (for filter sidebar)\n\tconst [selectedScheduleTypeIds, setSelectedScheduleTypeIds] = useState<number[]>([]);\n\tconst [selectedParticipantIds, setSelectedParticipantIds] = useState<string[]>([]);\n\n\t// Merge user preferences with defaults\n\tconst preferences: ICalendarPreferences = useMemo(\n\t\t() => ({\n\t\t\t...DEFAULT_PREFERENCES,\n\t\t\t...userPreferences,\n\t\t}),\n\t\t[userPreferences]\n\t);\n\n\t// ========================================================================\n\t// HANDLERS\n\t// ========================================================================\n\n\tconst handleViewChange = useCallback(\n\t\t(newView: TCalendarView) => {\n\t\t\tsetView(newView);\n\t\t\tonViewChange?.(newView);\n\t\t},\n\t\t[onViewChange]\n\t);\n\n\tconst handleDateChange = useCallback(\n\t\t(newDate: Date) => {\n\t\t\tsetDate(newDate);\n\t\t\tonDateChange?.(newDate);\n\t\t},\n\t\t[onDateChange]\n\t);\n\n\tconst handleNavigatePrev = useCallback(() => {\n\t\tconst newDate = navigatePrev(date, view);\n\t\thandleDateChange(newDate);\n\t}, [date, view, handleDateChange]);\n\n\tconst handleNavigateNext = useCallback(() => {\n\t\tconst newDate = navigateNext(date, view);\n\t\thandleDateChange(newDate);\n\t}, [date, view, handleDateChange]);\n\n\tconst handleNavigateToday = useCallback(() => {\n\t\tconst newDate = navigateToday();\n\t\thandleDateChange(newDate);\n\t}, [handleDateChange]);\n\n\tconst handleDayClick = useCallback(\n\t\t(clickedDate: Date) => {\n\t\t\t// Navigate to day view when clicking a day in month view\n\t\t\thandleDateChange(clickedDate);\n\t\t\thandleViewChange('day');\n\t\t},\n\t\t[handleDateChange, handleViewChange]\n\t);\n\n\t// ========================================================================\n\t// VIEW RENDERING\n\t// ========================================================================\n\n\t// Visible hours - show all hours (0-24) so users can see the full day\n\t// The working hours determine which slots have striped (disabled) appearance\n\tconst visibleHours = useMemo(\n\t\t() => ({\n\t\t\tstartHour: 0,\n\t\t\tendHour: 24,\n\t\t}),\n\t\t[]\n\t);\n\n\t// Week starts on (convert from 0-6 to 0 | 1)\n\tconst weekStartsOn: 0 | 1 = preferences.firstDayOfWeek === 0 ? 0 : 1;\n\n\t// Build working hours from preferences (for time grid views)\n\t// Working hours determine which slots are clickable and don't have striped pattern\n\t// Non-working hours get diagonal stripes and are disabled\n\tconst workingHours = useMemo(() => {\n\t\tconst hours: Record<number, { enabled: boolean; from: number; to: number }> = {};\n\t\tfor (let i = 0; i <= 6; i++) {\n\t\t\tconst isWeekend = i === 0 || i === 6;\n\t\t\t// Weekdays: use preferences, Weekends: use preferences if showWeekends, otherwise disabled\n\t\t\tif (!isWeekend) {\n\t\t\t\t// Weekdays (Mon-Fri): always have working hours from preferences\n\t\t\t\thours[i] = { enabled: true, from: preferences.startHour, to: preferences.endHour };\n\t\t\t} else if (preferences.showWeekends) {\n\t\t\t\t// Weekends with showWeekends: Saturday half-day (8-12), Sunday disabled\n\t\t\t\tif (i === 6) {\n\t\t\t\t\t// Saturday - half day (matching agenda-v2)\n\t\t\t\t\thours[i] = { enabled: true, from: 8, to: 12 };\n\t\t\t\t} else {\n\t\t\t\t\t// Sunday - disabled\n\t\t\t\t\thours[i] = { enabled: false, from: 0, to: 0 };\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Weekends without showWeekends: both disabled\n\t\t\t\thours[i] = { enabled: false, from: 0, to: 0 };\n\t\t\t}\n\t\t}\n\t\treturn hours;\n\t}, [preferences.startHour, preferences.endHour, preferences.showWeekends]);\n\n\t// Handle filter changes\n\tconst handleScheduleTypeFilterChange = useCallback(\n\t\t(ids: number[]) => {\n\t\t\tsetSelectedScheduleTypeIds(ids);\n\t\t\tonFiltersChange?.({\n\t\t\t\tscheduleTypeIds: ids,\n\t\t\t\tparticipantIds: selectedParticipantIds,\n\t\t\t});\n\t\t},\n\t\t[onFiltersChange, selectedParticipantIds]\n\t);\n\n\tconst handleParticipantFilterChange = useCallback(\n\t\t(ids: string[]) => {\n\t\t\tsetSelectedParticipantIds(ids);\n\t\t\tonFiltersChange?.({\n\t\t\t\tscheduleTypeIds: selectedScheduleTypeIds,\n\t\t\t\tparticipantIds: ids,\n\t\t\t});\n\t\t},\n\t\t[onFiltersChange, selectedScheduleTypeIds]\n\t);\n\n\t// Create render event adapters for different view types\n\t// Each view has a slightly different renderEvent signature\n\n\tconst dayWeekRenderEvent = useMemo(() => {\n\t\tif (!renderEvent) return undefined;\n\t\treturn (props: {\n\t\t\tevent: CalendarEvent<TEventData>;\n\t\t\tposition: { top: number; height: number; left: number; width: number };\n\t\t}) => {\n\t\t\treturn renderEvent({\n\t\t\t\tevent: props.event,\n\t\t\t\tview,\n\t\t\t\tvariant: 'full',\n\t\t\t\tposition: { ...props.position, zIndex: 1 },\n\t\t\t\tbadgeVariant,\n\t\t\t\t...(onEventClick && { onClick: () => onEventClick(props.event) }),\n\t\t\t});\n\t\t};\n\t}, [renderEvent, view, badgeVariant, onEventClick]);\n\n\tconst monthRenderEvent = useMemo(() => {\n\t\tif (!renderEvent) return undefined;\n\t\treturn (props: { event: CalendarEvent<TEventData>; variant: 'compact' }) => {\n\t\t\treturn renderEvent({\n\t\t\t\tevent: props.event,\n\t\t\t\tview: 'month',\n\t\t\t\tvariant: props.variant,\n\t\t\t\tbadgeVariant,\n\t\t\t\t...(onEventClick && { onClick: () => onEventClick(props.event) }),\n\t\t\t});\n\t\t};\n\t}, [renderEvent, badgeVariant, onEventClick]);\n\n\tconst agendaRenderEvent = useMemo(() => {\n\t\tif (!renderEvent) return undefined;\n\t\treturn (props: { event: CalendarEvent<TEventData> }) => {\n\t\t\treturn renderEvent({\n\t\t\t\tevent: props.event,\n\t\t\t\tview: 'agenda',\n\t\t\t\tvariant: 'block',\n\t\t\t\tbadgeVariant,\n\t\t\t\t...(onEventClick && { onClick: () => onEventClick(props.event) }),\n\t\t\t});\n\t\t};\n\t}, [renderEvent, badgeVariant, onEventClick]);\n\n\tconst renderView = () => {\n\t\tswitch (view) {\n\t\t\tcase 'day':\n\t\t\t\treturn (\n\t\t\t\t\t<DayView<TEventData>\n\t\t\t\t\t\tevents={events}\n\t\t\t\t\t\tdate={date}\n\t\t\t\t\t\tbadgeVariant={badgeVariant}\n\t\t\t\t\t\tvisibleHours={visibleHours}\n\t\t\t\t\t\tworkingHours={workingHours}\n\t\t\t\t\t\tslotDuration={preferences.slotDuration}\n\t\t\t\t\t\t{...(onEventClick && { onEventClick })}\n\t\t\t\t\t\t{...(onSlotSelect && { onSlotSelect })}\n\t\t\t\t\t\t{...(dayWeekRenderEvent && { renderEvent: dayWeekRenderEvent })}\n\t\t\t\t\t/>\n\t\t\t\t);\n\n\t\t\tcase 'week':\n\t\t\t\treturn (\n\t\t\t\t\t<WeekView<TEventData>\n\t\t\t\t\t\tevents={events}\n\t\t\t\t\t\tdate={date}\n\t\t\t\t\t\tbadgeVariant={badgeVariant}\n\t\t\t\t\t\tweekStartsOn={weekStartsOn}\n\t\t\t\t\t\tvisibleHours={visibleHours}\n\t\t\t\t\t\tworkingHours={workingHours}\n\t\t\t\t\t\tslotDuration={preferences.slotDuration}\n\t\t\t\t\t\tonDayClick={handleDayClick}\n\t\t\t\t\t\t{...(onEventClick && { onEventClick })}\n\t\t\t\t\t\t{...(onSlotSelect && { onSlotSelect })}\n\t\t\t\t\t\t{...(dayWeekRenderEvent && { renderEvent: dayWeekRenderEvent })}\n\t\t\t\t\t/>\n\t\t\t\t);\n\n\t\t\tcase 'month':\n\t\t\t\treturn (\n\t\t\t\t\t<MonthView<TEventData>\n\t\t\t\t\t\tevents={events}\n\t\t\t\t\t\tdate={date}\n\t\t\t\t\t\tbadgeVariant={badgeVariant}\n\t\t\t\t\t\tweekStartsOn={weekStartsOn}\n\t\t\t\t\t\tonDayClick={handleDayClick}\n\t\t\t\t\t\t{...(onEventClick && { onEventClick })}\n\t\t\t\t\t\t{...(onSlotSelect && { onSlotSelect })}\n\t\t\t\t\t\t{...(monthRenderEvent && { renderEvent: monthRenderEvent })}\n\t\t\t\t\t/>\n\t\t\t\t);\n\n\t\t\tcase 'agenda':\n\t\t\t\treturn (\n\t\t\t\t\t<AgendaView<TEventData>\n\t\t\t\t\t\tevents={events}\n\t\t\t\t\t\tdate={date}\n\t\t\t\t\t\tbadgeVariant={badgeVariant}\n\t\t\t\t\t\t{...(onEventClick && { onEventClick })}\n\t\t\t\t\t\t{...(emptyState && { emptyState })}\n\t\t\t\t\t\t{...(agendaRenderEvent && { renderEvent: agendaRenderEvent })}\n\t\t\t\t\t/>\n\t\t\t\t);\n\n\t\t\tdefault:\n\t\t\t\treturn (\n\t\t\t\t\t<div className=\"flex items-center justify-center h-64 text-gray-500\">\n\t\t\t\t\t\tView &quot;{view}&quot; is not yet implemented\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t}\n\t};\n\n\t// ========================================================================\n\t// RENDER\n\t// ========================================================================\n\n\t// Header navigation handler\n\tconst handleNavigate = useCallback(\n\t\t(direction: 'prev' | 'next' | 'today') => {\n\t\t\tif (direction === 'prev') handleNavigatePrev();\n\t\t\telse if (direction === 'next') handleNavigateNext();\n\t\t\telse handleNavigateToday();\n\t\t},\n\t\t[handleNavigatePrev, handleNavigateNext, handleNavigateToday]\n\t);\n\n\t// Default header props (conditionally add optional props)\n\tconst headerProps: RenderHeaderProps = {\n\t\tview,\n\t\tcurrentDate: date,\n\t\tavailableViews,\n\t\tonViewChange: handleViewChange,\n\t\tonNavigate: handleNavigate,\n\t\tonNavigatePrev: handleNavigatePrev,\n\t\tonNavigateNext: handleNavigateNext,\n\t\tonNavigateToday: handleNavigateToday,\n\t\t...(onAddEvent && { onAddEvent }),\n\t\t...(headerActions && { actions: headerActions }),\n\t\tclassName: 'border-b border-gray-200 p-3',\n\t};\n\n\t// Calendar header props (includes events for count display + slots)\n\tconst calendarHeaderProps = {\n\t\t...headerProps,\n\t\tevents,\n\t\tweekStartsOn,\n\t\tsettingsContent,\n\t\tfilterContent,\n\t\tshowSettings,\n\t\tshowTimelineViews,\n\t};\n\n\t// Clear all filters handler\n\tconst handleClearAllFilters = useCallback(() => {\n\t\tsetSelectedScheduleTypeIds([]);\n\t\tsetSelectedParticipantIds([]);\n\t\tonFiltersChange?.({\n\t\t\tscheduleTypeIds: [],\n\t\t\tparticipantIds: [],\n\t\t});\n\t}, [onFiltersChange]);\n\n\treturn (\n\t\t<div className={cn('flex h-full bg-white border border-gray-200 rounded-lg', className)}>\n\t\t\t{/* Filter Sidebar */}\n\t\t\t{showFilterSidebar && (\n\t\t\t\t<div className=\"w-64 border-r border-gray-200 flex-shrink-0\">\n\t\t\t\t\t{renderFilterSidebar ? (\n\t\t\t\t\t\trenderFilterSidebar({\n\t\t\t\t\t\t\tscheduleTypes,\n\t\t\t\t\t\t\tselectedScheduleTypeIds,\n\t\t\t\t\t\t\tselectedParticipantIds,\n\t\t\t\t\t\t\tonScheduleTypeChange: handleScheduleTypeFilterChange,\n\t\t\t\t\t\t\tonParticipantChange: handleParticipantFilterChange,\n\t\t\t\t\t\t\tonClearAll: handleClearAllFilters,\n\t\t\t\t\t\t})\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<div className=\"p-4 text-sm text-gray-500\">Filter sidebar not configured</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* Main Calendar Area */}\n\t\t\t<div className=\"flex flex-col flex-1 min-w-0\">\n\t\t\t\t{/* Header */}\n\t\t\t\t{!hideHeader &&\n\t\t\t\t\t(renderHeader ? renderHeader(headerProps) : <CalendarHeader {...calendarHeaderProps} />)}\n\n\t\t\t\t{/* Calendar View */}\n\t\t\t\t<div className=\"flex-1 overflow-auto\">{renderView()}</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n"],"names":["baseStyles","headerStyles","contentStyles","fallbackViewStyles","DefaultCalendar","events","_resources","_scheduleTypes","initialView","initialDate","_initialFilters","userPreferences","badgeVariant","hideHeader","availableViews","onEventClick","onSlotSelect","onViewChange","onDateChange","className","style","headerActions","emptyState","_children","view","setView","useState","date","setDate","preferences","useMemo","DEFAULT_PREFERENCES","handleViewChange","useCallback","newView","handleDateChange","newDate","handleNavigatePrev","navigatePrev","handleNavigateNext","navigateNext","handleNavigateToday","navigateToday","handleDayClick","clickedDate","visibleHours","weekStartsOn","renderView","jsx","DayView","WeekView","MonthView","AgendaView","jsxs","CalendarHeader","direction","TailwindCalendar","scheduleTypes","showFilterSidebar","onAddEvent","onFiltersChange","renderEvent","_renderEventPopover","renderFilterSidebar","renderHeader","settingsContent","filterContent","showSettings","showTimelineViews","selectedScheduleTypeIds","setSelectedScheduleTypeIds","selectedParticipantIds","setSelectedParticipantIds","workingHours","hours","i","handleScheduleTypeFilterChange","ids","handleParticipantFilterChange","dayWeekRenderEvent","props","monthRenderEvent","agendaRenderEvent","handleNavigate","headerProps","calendarHeaderProps","handleClearAllFilters","cn"],"mappings":"uKAwDMA,GAA4B,CACjC,QAAS,OACT,cAAe,SACf,OAAQ,OACR,UAAW,QACX,gBAAiB,wBACjB,OAAQ,sCACR,aAAc,2BACd,SAAU,SACV,WACC,8IACD,SAAU,gCACV,MAAO,yBACR,EAEMC,GAA8B,CACnC,aAAc,qCACf,EAEMC,GAA+B,CACpC,KAAM,EACN,SAAU,MACX,EAEMC,GAAoC,CACzC,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,OAAQ,QACR,MAAO,+BACR,EAuDO,SAASC,GAId,CACD,OAAAC,EACA,UAAWC,GACX,cAAeC,EACf,YAAAC,EAAc,OACd,YAAAC,EACA,eAAgBC,GAChB,YAAaC,EACb,aAAAC,EAAe,UACf,WAAAC,EAAa,GACb,eAAAC,EAAiB,CAAC,MAAO,OAAQ,QAAS,QAAQ,EAClD,aAAAC,EACA,aAAAC,EACA,aAAAC,EACA,aAAAC,EACA,UAAAC,EAAY,GACZ,MAAAC,EACA,cAAAC,EACA,WAAAC,EACA,SAAUC,EACX,EAAuE,CAKtE,KAAM,CAACC,EAAMC,CAAO,EAAIC,EAAAA,SAAwBlB,CAAW,EACrD,CAACmB,EAAMC,CAAO,EAAIF,EAAAA,SAAejB,GAAe,IAAI,IAAM,EAG1DoB,EAAoCC,EAAAA,QACzC,KAAO,CACN,GAAGC,EAAAA,oBACH,GAAGpB,CAAA,GAEJ,CAACA,CAAe,CAAA,EAOXqB,EAAmBC,EAAAA,YACvBC,GAA2B,CAC3BT,EAAQS,CAAO,EACfjB,IAAeiB,CAAO,CACvB,EACA,CAACjB,CAAY,CAAA,EAGRkB,EAAmBF,EAAAA,YACvBG,GAAkB,CAClBR,EAAQQ,CAAO,EACflB,IAAekB,CAAO,CACvB,EACA,CAAClB,CAAY,CAAA,EAGRmB,EAAqBJ,EAAAA,YAAY,IAAM,CAC5C,MAAMG,EAAUE,EAAAA,aAAaX,EAAMH,CAAI,EACvCW,EAAiBC,CAAO,CACzB,EAAG,CAACT,EAAMH,EAAMW,CAAgB,CAAC,EAE3BI,EAAqBN,EAAAA,YAAY,IAAM,CAC5C,MAAMG,EAAUI,EAAAA,aAAab,EAAMH,CAAI,EACvCW,EAAiBC,CAAO,CACzB,EAAG,CAACT,EAAMH,EAAMW,CAAgB,CAAC,EAE3BM,EAAsBR,EAAAA,YAAY,IAAM,CAC7C,MAAMG,EAAUM,EAAAA,cAAA,EAChBP,EAAiBC,CAAO,CACzB,EAAG,CAACD,CAAgB,CAAC,EAEfQ,EAAiBV,EAAAA,YACrBW,GAAsB,CAEtBT,EAAiBS,CAAW,EAC5BZ,EAAiB,KAAK,CACvB,EACA,CAACG,EAAkBH,CAAgB,CAAA,EAQ9Ba,EAAef,EAAAA,QACpB,KAAO,CACN,UAAWD,EAAY,UACvB,QAASA,EAAY,OAAA,GAEtB,CAACA,EAAY,UAAWA,EAAY,OAAO,CAAA,EAItCiB,EAAsBjB,EAAY,iBAAmB,EAAI,EAAI,EAE7DkB,EAAa,IAAM,CACxB,OAAQvB,EAAA,CACP,IAAK,MACJ,OACCwB,EAAAA,IAACC,EAAAA,QAAA,CACA,OAAA5C,EACA,KAAAsB,EACA,aAAAf,EACA,aAAAiC,EACA,aAAchB,EAAY,aACzB,GAAId,GAAgB,CAAE,aAAAA,CAAA,EACtB,GAAIC,GAAgB,CAAE,aAAAA,CAAA,CAAa,CAAA,EAIvC,IAAK,OACJ,OACCgC,EAAAA,IAACE,EAAAA,SAAA,CACA,OAAA7C,EACA,KAAAsB,EACA,aAAAf,EACA,aAAAkC,EACA,aAAAD,EACA,aAAchB,EAAY,aAC1B,WAAYc,EACX,GAAI5B,GAAgB,CAAE,aAAAA,CAAA,EACtB,GAAIC,GAAgB,CAAE,aAAAA,CAAA,CAAa,CAAA,EAIvC,IAAK,QACJ,OACCgC,EAAAA,IAACG,EAAAA,UAAA,CACA,OAAA9C,EACA,KAAAsB,EACA,aAAAf,EACA,aAAAkC,EACA,WAAYH,EACX,GAAI5B,GAAgB,CAAE,aAAAA,CAAA,EACtB,GAAIC,GAAgB,CAAE,aAAAA,CAAA,CAAa,CAAA,EAIvC,IAAK,SACJ,OACCgC,EAAAA,IAACI,EAAAA,WAAA,CACA,OAAA/C,EACA,KAAAsB,EACA,aAAAf,EACC,GAAIG,GAAgB,CAAE,aAAAA,CAAA,EACtB,GAAIO,GAAc,CAAE,WAAAA,CAAA,CAAW,CAAA,EAInC,QACC,OAAO+B,EAAAA,KAAC,MAAA,CAAI,MAAOlD,GAAoB,SAAA,CAAA,SAAYqB,EAAK,0BAAA,EAA6B,CAAA,CAExF,EAMA,OACC6B,EAAAA,KAAC,OAAI,UAAAlC,EAAsB,MAAO,CAAE,GAAGnB,GAAY,GAAGoB,CAAA,EAEpD,SAAA,CAAA,CAACP,GACDmC,EAAAA,IAAC,MAAA,CAAI,MAAO/C,GACX,SAAA+C,EAAAA,IAACM,EAAAA,eAAA,CACA,KAAA9B,EACA,YAAaG,EACb,eAAAb,EACA,aAAckB,EACd,WAAauB,GAAc,CACtBA,IAAc,OAAQlB,EAAA,EACjBkB,IAAc,OAAQhB,EAAA,EAC1BE,EAAA,CACN,EACA,QAASpB,EACT,UAAU,KAAA,CAAA,EAEZ,EAID2B,EAAAA,IAAC,MAAA,CAAI,MAAO9C,GAAgB,YAAW,CAAE,CAAA,EAC1C,CAEF,CCpHO,SAASsD,GAId,CACD,OAAAnD,EACA,UAAWC,GACX,cAAAmD,EAAgB,CAAA,EAChB,YAAAjD,EAAc,OACd,YAAAC,EACA,eAAgBC,GAChB,YAAaC,EACb,aAAAC,EAAe,UACf,WAAAC,EAAa,GACb,kBAAA6C,EAAoB,GACpB,eAAA5C,EAAiB,CAAC,MAAO,OAAQ,QAAS,QAAQ,EAClD,aAAAC,EACA,aAAAC,EACA,aAAAC,EACA,aAAAC,EACA,WAAAyC,EACA,gBAAAC,EACA,YAAAC,EACA,mBAAoBC,GACpB,oBAAAC,EACA,aAAAC,EACA,gBAAAC,EACA,cAAAC,EACA,aAAAC,EAAe,GACf,kBAAAC,EAAoB,GACpB,UAAAjD,EACA,cAAAE,EACA,WAAAC,EACA,SAAUC,CACX,EAAwE,CAKvE,KAAM,CAACC,EAAMC,CAAO,EAAIC,EAAAA,SAAwBlB,CAAW,EACrD,CAACmB,EAAMC,CAAO,EAAIF,EAAAA,SAAejB,GAAe,IAAI,IAAM,EAG1D,CAAC4D,EAAyBC,CAA0B,EAAI5C,EAAAA,SAAmB,CAAA,CAAE,EAC7E,CAAC6C,EAAwBC,CAAyB,EAAI9C,EAAAA,SAAmB,CAAA,CAAE,EAG3EG,EAAoCC,EAAAA,QACzC,KAAO,CACN,GAAGC,EAAAA,oBACH,GAAGpB,CAAA,GAEJ,CAACA,CAAe,CAAA,EAOXqB,EAAmBC,EAAAA,YACvBC,GAA2B,CAC3BT,EAAQS,CAAO,EACfjB,IAAeiB,CAAO,CACvB,EACA,CAACjB,CAAY,CAAA,EAGRkB,EAAmBF,EAAAA,YACvBG,GAAkB,CAClBR,EAAQQ,CAAO,EACflB,IAAekB,CAAO,CACvB,EACA,CAAClB,CAAY,CAAA,EAGRmB,EAAqBJ,EAAAA,YAAY,IAAM,CAC5C,MAAMG,EAAUE,EAAAA,aAAaX,EAAMH,CAAI,EACvCW,EAAiBC,CAAO,CACzB,EAAG,CAACT,EAAMH,EAAMW,CAAgB,CAAC,EAE3BI,EAAqBN,EAAAA,YAAY,IAAM,CAC5C,MAAMG,EAAUI,EAAAA,aAAab,EAAMH,CAAI,EACvCW,EAAiBC,CAAO,CACzB,EAAG,CAACT,EAAMH,EAAMW,CAAgB,CAAC,EAE3BM,EAAsBR,EAAAA,YAAY,IAAM,CAC7C,MAAMG,EAAUM,EAAAA,cAAA,EAChBP,EAAiBC,CAAO,CACzB,EAAG,CAACD,CAAgB,CAAC,EAEfQ,EAAiBV,EAAAA,YACrBW,GAAsB,CAEtBT,EAAiBS,CAAW,EAC5BZ,EAAiB,KAAK,CACvB,EACA,CAACG,EAAkBH,CAAgB,CAAA,EAS9Ba,EAAef,EAAAA,QACpB,KAAO,CACN,UAAW,EACX,QAAS,EAAA,GAEV,CAAA,CAAC,EAIIgB,EAAsBjB,EAAY,iBAAmB,EAAI,EAAI,EAK7D4C,EAAe3C,EAAAA,QAAQ,IAAM,CAClC,MAAM4C,EAAwE,CAAA,EAC9E,QAASC,EAAI,EAAGA,GAAK,EAAGA,IACLA,IAAM,GAAKA,IAAM,EAKxB9C,EAAY,aAElB8C,IAAM,EAETD,EAAMC,CAAC,EAAI,CAAE,QAAS,GAAM,KAAM,EAAG,GAAI,EAAA,EAGzCD,EAAMC,CAAC,EAAI,CAAE,QAAS,GAAO,KAAM,EAAG,GAAI,CAAA,EAI3CD,EAAMC,CAAC,EAAI,CAAE,QAAS,GAAO,KAAM,EAAG,GAAI,CAAA,EAZ1CD,EAAMC,CAAC,EAAI,CAAE,QAAS,GAAM,KAAM9C,EAAY,UAAW,GAAIA,EAAY,OAAA,EAe3E,OAAO6C,CACR,EAAG,CAAC7C,EAAY,UAAWA,EAAY,QAASA,EAAY,YAAY,CAAC,EAGnE+C,GAAiC3C,EAAAA,YACrC4C,GAAkB,CAClBP,EAA2BO,CAAG,EAC9BjB,IAAkB,CACjB,gBAAiBiB,EACjB,eAAgBN,CAAA,CAChB,CACF,EACA,CAACX,EAAiBW,CAAsB,CAAA,EAGnCO,GAAgC7C,EAAAA,YACpC4C,GAAkB,CAClBL,EAA0BK,CAAG,EAC7BjB,IAAkB,CACjB,gBAAiBS,EACjB,eAAgBQ,CAAA,CAChB,CACF,EACA,CAACjB,EAAiBS,CAAuB,CAAA,EAMpCU,EAAqBjD,EAAAA,QAAQ,IAAM,CACxC,GAAK+B,EACL,OAAQmB,GAIAnB,EAAY,CAClB,MAAOmB,EAAM,MACb,KAAAxD,EACA,QAAS,OACT,SAAU,CAAE,GAAGwD,EAAM,SAAU,OAAQ,CAAA,EACvC,aAAApE,EACA,GAAIG,GAAgB,CAAE,QAAS,IAAMA,EAAaiE,EAAM,KAAK,CAAA,CAAE,CAC/D,CAEH,EAAG,CAACnB,EAAarC,EAAMZ,EAAcG,CAAY,CAAC,EAE5CkE,EAAmBnD,EAAAA,QAAQ,IAAM,CACtC,GAAK+B,EACL,OAAQmB,GACAnB,EAAY,CAClB,MAAOmB,EAAM,MACb,KAAM,QACN,QAASA,EAAM,QACf,aAAApE,EACA,GAAIG,GAAgB,CAAE,QAAS,IAAMA,EAAaiE,EAAM,KAAK,CAAA,CAAE,CAC/D,CAEH,EAAG,CAACnB,EAAajD,EAAcG,CAAY,CAAC,EAEtCmE,EAAoBpD,EAAAA,QAAQ,IAAM,CACvC,GAAK+B,EACL,OAAQmB,GACAnB,EAAY,CAClB,MAAOmB,EAAM,MACb,KAAM,SACN,QAAS,QACT,aAAApE,EACA,GAAIG,GAAgB,CAAE,QAAS,IAAMA,EAAaiE,EAAM,KAAK,CAAA,CAAE,CAC/D,CAEH,EAAG,CAACnB,EAAajD,EAAcG,CAAY,CAAC,EAEtCgC,GAAa,IAAM,CACxB,OAAQvB,EAAA,CACP,IAAK,MACJ,OACCwB,EAAAA,IAACC,EAAAA,QAAA,CACA,OAAA5C,EACA,KAAAsB,EACA,aAAAf,EACA,aAAAiC,EACA,aAAA4B,EACA,aAAc5C,EAAY,aACzB,GAAId,GAAgB,CAAE,aAAAA,CAAA,EACtB,GAAIC,GAAgB,CAAE,aAAAA,CAAA,EACtB,GAAI+D,GAAsB,CAAE,YAAaA,CAAA,CAAmB,CAAA,EAIhE,IAAK,OACJ,OACC/B,EAAAA,IAACE,EAAAA,SAAA,CACA,OAAA7C,EACA,KAAAsB,EACA,aAAAf,EACA,aAAAkC,EACA,aAAAD,EACA,aAAA4B,EACA,aAAc5C,EAAY,aAC1B,WAAYc,EACX,GAAI5B,GAAgB,CAAE,aAAAA,CAAA,EACtB,GAAIC,GAAgB,CAAE,aAAAA,CAAA,EACtB,GAAI+D,GAAsB,CAAE,YAAaA,CAAA,CAAmB,CAAA,EAIhE,IAAK,QACJ,OACC/B,EAAAA,IAACG,EAAAA,UAAA,CACA,OAAA9C,EACA,KAAAsB,EACA,aAAAf,EACA,aAAAkC,EACA,WAAYH,EACX,GAAI5B,GAAgB,CAAE,aAAAA,CAAA,EACtB,GAAIC,GAAgB,CAAE,aAAAA,CAAA,EACtB,GAAIiE,GAAoB,CAAE,YAAaA,CAAA,CAAiB,CAAA,EAI5D,IAAK,SACJ,OACCjC,EAAAA,IAACI,EAAAA,WAAA,CACA,OAAA/C,EACA,KAAAsB,EACA,aAAAf,EACC,GAAIG,GAAgB,CAAE,aAAAA,CAAA,EACtB,GAAIO,GAAc,CAAE,WAAAA,CAAA,EACpB,GAAI4D,GAAqB,CAAE,YAAaA,CAAA,CAAkB,CAAA,EAI9D,QACC,OACC7B,EAAAA,KAAC,MAAA,CAAI,UAAU,sDAAsD,SAAA,CAAA,SACxD7B,EAAK,0BAAA,EAClB,CAAA,CAGJ,EAOM2D,GAAiBlD,EAAAA,YACrBsB,GAAyC,CACrCA,IAAc,OAAQlB,EAAA,EACjBkB,IAAc,OAAQhB,EAAA,EAC1BE,EAAA,CACN,EACA,CAACJ,EAAoBE,EAAoBE,CAAmB,CAAA,EAIvD2C,EAAiC,CACtC,KAAA5D,EACA,YAAaG,EACb,eAAAb,EACA,aAAckB,EACd,WAAYmD,GACZ,eAAgB9C,EAChB,eAAgBE,EAChB,gBAAiBE,EACjB,GAAIkB,GAAc,CAAE,WAAAA,CAAA,EACpB,GAAItC,GAAiB,CAAE,QAASA,CAAA,EAChC,UAAW,8BAAA,EAINgE,GAAsB,CAC3B,GAAGD,EACH,OAAA/E,EACA,aAAAyC,EACA,gBAAAmB,EACA,cAAAC,EACA,aAAAC,EACA,kBAAAC,CAAA,EAIKkB,GAAwBrD,EAAAA,YAAY,IAAM,CAC/CqC,EAA2B,CAAA,CAAE,EAC7BE,EAA0B,CAAA,CAAE,EAC5BZ,IAAkB,CACjB,gBAAiB,CAAA,EACjB,eAAgB,CAAA,CAAC,CACjB,CACF,EAAG,CAACA,CAAe,CAAC,EAEpB,cACE,MAAA,CAAI,UAAW2B,GAAAA,GAAG,yDAA0DpE,CAAS,EAEpF,SAAA,CAAAuC,GACAV,EAAAA,IAAC,MAAA,CAAI,UAAU,8CACb,WACAe,EAAoB,CACnB,cAAAN,EACA,wBAAAY,EACA,uBAAAE,EACA,qBAAsBK,GACtB,oBAAqBE,GACrB,WAAYQ,EAAA,CACZ,EAEDtC,EAAAA,IAAC,OAAI,UAAU,4BAA4B,yCAA6B,EAE1E,EAIDK,EAAAA,KAAC,MAAA,CAAI,UAAU,+BAEb,SAAA,CAAA,CAACxC,IACAmD,EAAeA,EAAaoB,CAAW,EAAIpC,EAAAA,IAACM,iBAAA,CAAgB,GAAG+B,EAAA,CAAqB,GAGtFrC,EAAAA,IAAC,MAAA,CAAI,UAAU,uBAAwB,aAAW,CAAE,CAAA,CAAA,CACrD,CAAA,EACD,CAEF"}
@@ -1,6 +1,6 @@
1
1
  import { jsxs as T, jsx as n } from "react/jsx-runtime";
2
2
  import { useState as g, useMemo as x, useCallback as a } from "react";
3
- import { C as te, A as re, M as ae, W as se, b as ne } from "./week-view-jpcXSE6k.js";
3
+ import { C as te, A as re, M as ae, W as se, b as ne } from "./week-view-1EUqFIRS.js";
4
4
  import { DEFAULT_PREFERENCES as oe, navigatePrev as ie, navigateNext as de, navigateToday as le } from "./utils.mjs";
5
5
  import { c as De } from "./index-DtaLkIY8.js";
6
6
  const xe = {
@@ -397,4 +397,4 @@ export {
397
397
  _e as D,
398
398
  Re as T
399
399
  };
400
- //# sourceMappingURL=tailwind-calendar-BxW1RSkc.js.map
400
+ //# sourceMappingURL=tailwind-calendar-B3HuJrjX.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tailwind-calendar-BxW1RSkc.js","sources":["../src/presets/default/default-calendar.tsx","../src/presets/tailwind/tailwind-calendar.tsx"],"sourcesContent":["/**\n * DefaultCalendar - Pre-styled Calendar Preset\n *\n * A fully styled calendar using CSS custom properties for theming.\n * Designed for projects that don't use TailwindCSS but want a complete solution.\n *\n * CSS Custom Properties (override these for theming):\n * - --ic-bg: Background color\n * - --ic-bg-muted: Muted background\n * - --ic-text: Primary text color\n * - --ic-text-muted: Secondary text color\n * - --ic-border: Border color\n * - --ic-primary: Primary/accent color\n * - --ic-primary-foreground: Text on primary background\n * - --ic-radius: Border radius\n *\n * @example\n * ```tsx\n * import { DefaultCalendar } from '@inno/calendar/presets';\n *\n * function MyAgenda() {\n * return (\n * <div style={{ '--ic-primary': '#6366f1' }}>\n * <DefaultCalendar\n * events={myEvents}\n * onEventClick={(event) => console.log('Clicked:', event)}\n * />\n * </div>\n * );\n * }\n * ```\n */\n\nimport { type CSSProperties, type ReactNode, useCallback, useMemo, useState } from 'react';\nimport { CalendarHeader } from '../../components/header/calendar-header';\nimport { AgendaView } from '../../components/views/agenda-view';\nimport { DayView } from '../../components/views/day-view';\nimport { MonthView } from '../../components/views/month-view';\nimport { WeekView } from '../../components/views/week-view';\nimport { DEFAULT_PREFERENCES } from '../../core/constants';\nimport type {\n\tCalendarEvent,\n\tICalendarFilters,\n\tICalendarPreferences,\n\tIResource,\n\tIScheduleType,\n\tISelectionResult,\n\tTBadgeVariant,\n\tTCalendarView,\n} from '../../core/types';\nimport { navigateNext, navigatePrev, navigateToday } from '../../core/utils/grid-utils';\n\n// ============================================================================\n// STYLES (CSS-in-JS for zero-config usage)\n// ============================================================================\n\nconst baseStyles: CSSProperties = {\n\tdisplay: 'flex',\n\tflexDirection: 'column',\n\theight: '100%',\n\tminHeight: '400px',\n\tbackgroundColor: 'var(--ic-bg, #ffffff)',\n\tborder: '1px solid var(--ic-border, #e5e7eb)',\n\tborderRadius: 'var(--ic-radius, 0.5rem)',\n\toverflow: 'hidden',\n\tfontFamily:\n\t\t'var(--ic-font-family, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif)',\n\tfontSize: 'var(--ic-font-size, 0.875rem)',\n\tcolor: 'var(--ic-text, #111827)',\n};\n\nconst headerStyles: CSSProperties = {\n\tborderBottom: '1px solid var(--ic-border, #e5e7eb)',\n};\n\nconst contentStyles: CSSProperties = {\n\tflex: 1,\n\toverflow: 'auto',\n};\n\nconst fallbackViewStyles: CSSProperties = {\n\tdisplay: 'flex',\n\talignItems: 'center',\n\tjustifyContent: 'center',\n\theight: '16rem',\n\tcolor: 'var(--ic-text-muted, #6b7280)',\n};\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface DefaultCalendarProps<\n\tTEventData = Record<string, unknown>,\n\tTScheduleTypeData = Record<string, unknown>,\n\tTResourceData = Record<string, unknown>,\n> {\n\t/** Events to display */\n\tevents: CalendarEvent<TEventData>[];\n\t/** Available resources */\n\tresources?: IResource<TResourceData>[];\n\t/** Available schedule types */\n\tscheduleTypes?: IScheduleType<TScheduleTypeData>[];\n\t/** Initial view */\n\tinitialView?: TCalendarView;\n\t/** Initial date */\n\tinitialDate?: Date;\n\t/** Initial filters */\n\tinitialFilters?: ICalendarFilters;\n\t/** Preferences */\n\tpreferences?: Partial<ICalendarPreferences>;\n\t/** Badge variant for events (dot, colored, mixed) */\n\tbadgeVariant?: TBadgeVariant;\n\t/** Hide the header */\n\thideHeader?: boolean;\n\t/** Available views to show in view switcher */\n\tavailableViews?: TCalendarView[];\n\t/** Event click handler */\n\tonEventClick?: (event: CalendarEvent<TEventData>) => void;\n\t/** Slot selection handler */\n\tonSlotSelect?: (selection: ISelectionResult) => void;\n\t/** View change handler */\n\tonViewChange?: (view: TCalendarView) => void;\n\t/** Date change handler */\n\tonDateChange?: (date: Date) => void;\n\t/** Additional CSS class */\n\tclassName?: string;\n\t/** Custom style overrides */\n\tstyle?: CSSProperties;\n\t/** Custom header actions */\n\theaderActions?: ReactNode;\n\t/** Empty state for agenda view */\n\temptyState?: ReactNode;\n\t/** Children (for header slot) */\n\tchildren?: ReactNode;\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport function DefaultCalendar<\n\tTEventData = Record<string, unknown>,\n\tTScheduleTypeData = Record<string, unknown>,\n\tTResourceData = Record<string, unknown>,\n>({\n\tevents,\n\tresources: _resources,\n\tscheduleTypes: _scheduleTypes,\n\tinitialView = 'week',\n\tinitialDate,\n\tinitialFilters: _initialFilters,\n\tpreferences: userPreferences,\n\tbadgeVariant = 'colored',\n\thideHeader = false,\n\tavailableViews = ['day', 'week', 'month', 'agenda'],\n\tonEventClick,\n\tonSlotSelect,\n\tonViewChange,\n\tonDateChange,\n\tclassName = '',\n\tstyle,\n\theaderActions,\n\temptyState,\n\tchildren: _children,\n}: DefaultCalendarProps<TEventData, TScheduleTypeData, TResourceData>) {\n\t// ========================================================================\n\t// STATE\n\t// ========================================================================\n\n\tconst [view, setView] = useState<TCalendarView>(initialView);\n\tconst [date, setDate] = useState<Date>(initialDate ?? new Date());\n\n\t// Merge user preferences with defaults\n\tconst preferences: ICalendarPreferences = useMemo(\n\t\t() => ({\n\t\t\t...DEFAULT_PREFERENCES,\n\t\t\t...userPreferences,\n\t\t}),\n\t\t[userPreferences]\n\t);\n\n\t// ========================================================================\n\t// HANDLERS\n\t// ========================================================================\n\n\tconst handleViewChange = useCallback(\n\t\t(newView: TCalendarView) => {\n\t\t\tsetView(newView);\n\t\t\tonViewChange?.(newView);\n\t\t},\n\t\t[onViewChange]\n\t);\n\n\tconst handleDateChange = useCallback(\n\t\t(newDate: Date) => {\n\t\t\tsetDate(newDate);\n\t\t\tonDateChange?.(newDate);\n\t\t},\n\t\t[onDateChange]\n\t);\n\n\tconst handleNavigatePrev = useCallback(() => {\n\t\tconst newDate = navigatePrev(date, view);\n\t\thandleDateChange(newDate);\n\t}, [date, view, handleDateChange]);\n\n\tconst handleNavigateNext = useCallback(() => {\n\t\tconst newDate = navigateNext(date, view);\n\t\thandleDateChange(newDate);\n\t}, [date, view, handleDateChange]);\n\n\tconst handleNavigateToday = useCallback(() => {\n\t\tconst newDate = navigateToday();\n\t\thandleDateChange(newDate);\n\t}, [handleDateChange]);\n\n\tconst handleDayClick = useCallback(\n\t\t(clickedDate: Date) => {\n\t\t\t// Navigate to day view when clicking a day in month view\n\t\t\thandleDateChange(clickedDate);\n\t\t\thandleViewChange('day');\n\t\t},\n\t\t[handleDateChange, handleViewChange]\n\t);\n\n\t// ========================================================================\n\t// VIEW RENDERING\n\t// ========================================================================\n\n\t// Build visible hours from preferences\n\tconst visibleHours = useMemo(\n\t\t() => ({\n\t\t\tstartHour: preferences.startHour,\n\t\t\tendHour: preferences.endHour,\n\t\t}),\n\t\t[preferences.startHour, preferences.endHour]\n\t);\n\n\t// Week starts on (convert from 0-6 to 0 | 1)\n\tconst weekStartsOn: 0 | 1 = preferences.firstDayOfWeek === 0 ? 0 : 1;\n\n\tconst renderView = () => {\n\t\tswitch (view) {\n\t\t\tcase 'day':\n\t\t\t\treturn (\n\t\t\t\t\t<DayView<TEventData>\n\t\t\t\t\t\tevents={events}\n\t\t\t\t\t\tdate={date}\n\t\t\t\t\t\tbadgeVariant={badgeVariant}\n\t\t\t\t\t\tvisibleHours={visibleHours}\n\t\t\t\t\t\tslotDuration={preferences.slotDuration}\n\t\t\t\t\t\t{...(onEventClick && { onEventClick })}\n\t\t\t\t\t\t{...(onSlotSelect && { onSlotSelect })}\n\t\t\t\t\t/>\n\t\t\t\t);\n\n\t\t\tcase 'week':\n\t\t\t\treturn (\n\t\t\t\t\t<WeekView<TEventData>\n\t\t\t\t\t\tevents={events}\n\t\t\t\t\t\tdate={date}\n\t\t\t\t\t\tbadgeVariant={badgeVariant}\n\t\t\t\t\t\tweekStartsOn={weekStartsOn}\n\t\t\t\t\t\tvisibleHours={visibleHours}\n\t\t\t\t\t\tslotDuration={preferences.slotDuration}\n\t\t\t\t\t\tonDayClick={handleDayClick}\n\t\t\t\t\t\t{...(onEventClick && { onEventClick })}\n\t\t\t\t\t\t{...(onSlotSelect && { onSlotSelect })}\n\t\t\t\t\t/>\n\t\t\t\t);\n\n\t\t\tcase 'month':\n\t\t\t\treturn (\n\t\t\t\t\t<MonthView<TEventData>\n\t\t\t\t\t\tevents={events}\n\t\t\t\t\t\tdate={date}\n\t\t\t\t\t\tbadgeVariant={badgeVariant}\n\t\t\t\t\t\tweekStartsOn={weekStartsOn}\n\t\t\t\t\t\tonDayClick={handleDayClick}\n\t\t\t\t\t\t{...(onEventClick && { onEventClick })}\n\t\t\t\t\t\t{...(onSlotSelect && { onSlotSelect })}\n\t\t\t\t\t/>\n\t\t\t\t);\n\n\t\t\tcase 'agenda':\n\t\t\t\treturn (\n\t\t\t\t\t<AgendaView<TEventData>\n\t\t\t\t\t\tevents={events}\n\t\t\t\t\t\tdate={date}\n\t\t\t\t\t\tbadgeVariant={badgeVariant}\n\t\t\t\t\t\t{...(onEventClick && { onEventClick })}\n\t\t\t\t\t\t{...(emptyState && { emptyState })}\n\t\t\t\t\t/>\n\t\t\t\t);\n\n\t\t\tdefault:\n\t\t\t\treturn <div style={fallbackViewStyles}>View &quot;{view}&quot; is not yet implemented</div>;\n\t\t}\n\t};\n\n\t// ========================================================================\n\t// RENDER\n\t// ========================================================================\n\n\treturn (\n\t\t<div className={className} style={{ ...baseStyles, ...style }}>\n\t\t\t{/* Header */}\n\t\t\t{!hideHeader && (\n\t\t\t\t<div style={headerStyles}>\n\t\t\t\t\t<CalendarHeader\n\t\t\t\t\t\tview={view}\n\t\t\t\t\t\tcurrentDate={date}\n\t\t\t\t\t\tavailableViews={availableViews}\n\t\t\t\t\t\tonViewChange={handleViewChange}\n\t\t\t\t\t\tonNavigate={(direction) => {\n\t\t\t\t\t\t\tif (direction === 'prev') handleNavigatePrev();\n\t\t\t\t\t\t\telse if (direction === 'next') handleNavigateNext();\n\t\t\t\t\t\t\telse handleNavigateToday();\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tactions={headerActions}\n\t\t\t\t\t\tclassName=\"p-3\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* Calendar View */}\n\t\t\t<div style={contentStyles}>{renderView()}</div>\n\t\t</div>\n\t);\n}\n","/**\n * TailwindCalendar - Tailwind-Optimized Calendar Preset\n *\n * A fully featured, ready-to-use calendar component designed for TailwindCSS projects.\n * Composes all calendar components into a cohesive experience.\n *\n * Features:\n * - Full customization via render props (renderEvent, renderEventPopover, renderFilterSidebar)\n * - All visual components can be replaced while keeping state management\n * - Matches production quality when used with custom components\n *\n * @example\n * ```tsx\n * import { TailwindCalendar } from '@inno/calendar/presets';\n *\n * function MyAgenda() {\n * return (\n * <TailwindCalendar\n * events={myEvents}\n * onEventClick={(event) => console.log('Clicked:', event)}\n * onSlotSelect={(selection) => console.log('Selected:', selection)}\n * // Custom components for production quality\n * renderEvent={(event) => <MyEventCard event={event} />}\n * renderEventPopover={(event, onClose) => <MyEventPopover event={event} onClose={onClose} />}\n * renderFilterSidebar={(props) => <MyFilterSidebar {...props} />}\n * />\n * );\n * }\n * ```\n */\n\nimport { type ReactNode, useCallback, useMemo, useState } from 'react';\nimport { CalendarHeader } from '../../components/header/calendar-header';\nimport { AgendaView } from '../../components/views/agenda-view';\nimport { DayView } from '../../components/views/day-view';\nimport { MonthView } from '../../components/views/month-view';\nimport { WeekView } from '../../components/views/week-view';\nimport { DEFAULT_PREFERENCES } from '../../core/constants';\nimport type {\n\tCalendarEvent,\n\tICalendarFilters,\n\tICalendarPreferences,\n\tIEventPosition,\n\tIResource,\n\tIScheduleType,\n\tISelectionResult,\n\tTBadgeVariant,\n\tTCalendarView,\n} from '../../core/types';\nimport { navigateNext, navigatePrev, navigateToday } from '../../core/utils/grid-utils';\nimport { cn } from '../../lib/utils';\n\n// ============================================================================\n// RENDER PROP TYPES\n// ============================================================================\n\n/**\n * Props for custom event rendering\n */\nexport interface RenderEventProps<TEventData = Record<string, unknown>> {\n\tevent: CalendarEvent<TEventData>;\n\tview: TCalendarView;\n\tvariant: 'full' | 'compact' | 'dot' | 'block';\n\tposition?: IEventPosition;\n\tbadgeVariant: TBadgeVariant;\n\tonClick?: () => void;\n}\n\n/**\n * Props for custom event popover rendering\n */\nexport interface RenderEventPopoverProps<TEventData = Record<string, unknown>> {\n\tevent: CalendarEvent<TEventData>;\n\tonClose: () => void;\n}\n\n/**\n * Props for custom filter sidebar rendering\n */\nexport interface RenderFilterSidebarProps<TScheduleTypeData = Record<string, unknown>> {\n\tscheduleTypes: IScheduleType<TScheduleTypeData>[];\n\tselectedScheduleTypeIds: number[];\n\tonScheduleTypeChange: (ids: number[]) => void;\n\tselectedParticipantIds: string[];\n\tonParticipantChange: (ids: string[]) => void;\n\tonClearAll?: () => void;\n}\n\n/**\n * Props for custom header rendering\n */\nexport interface RenderHeaderProps {\n\tview: TCalendarView;\n\tcurrentDate: Date;\n\tavailableViews: TCalendarView[];\n\tonViewChange: (view: TCalendarView) => void;\n\tonNavigate: (direction: 'prev' | 'next' | 'today') => void;\n\tonNavigatePrev?: () => void;\n\tonNavigateNext?: () => void;\n\tonNavigateToday?: () => void;\n\tonAddEvent?: () => void;\n\tactions?: ReactNode;\n\tclassName?: string;\n}\n\n// ============================================================================\n// COMPONENT PROPS\n// ============================================================================\n\nexport interface TailwindCalendarProps<\n\tTEventData = Record<string, unknown>,\n\tTScheduleTypeData = Record<string, unknown>,\n\tTResourceData = Record<string, unknown>,\n> {\n\t/** Events to display */\n\tevents: CalendarEvent<TEventData>[];\n\t/** Available resources */\n\tresources?: IResource<TResourceData>[];\n\t/** Available schedule types */\n\tscheduleTypes?: IScheduleType<TScheduleTypeData>[];\n\t/** Initial view */\n\tinitialView?: TCalendarView;\n\t/** Initial date */\n\tinitialDate?: Date;\n\t/** Initial filters */\n\tinitialFilters?: ICalendarFilters;\n\t/** Preferences */\n\tpreferences?: Partial<ICalendarPreferences>;\n\t/** Badge variant for events (dot, colored, mixed) */\n\tbadgeVariant?: TBadgeVariant;\n\t/** Hide the header */\n\thideHeader?: boolean;\n\t/** Show filter sidebar */\n\tshowFilterSidebar?: boolean;\n\t/** Available views to show in view switcher */\n\tavailableViews?: TCalendarView[];\n\n\t// ========================================================================\n\t// CALLBACKS\n\t// ========================================================================\n\n\t/** Event click handler */\n\tonEventClick?: (event: CalendarEvent<TEventData>) => void;\n\t/** Slot selection handler */\n\tonSlotSelect?: (selection: ISelectionResult) => void;\n\t/** View change handler */\n\tonViewChange?: (view: TCalendarView) => void;\n\t/** Date change handler */\n\tonDateChange?: (date: Date) => void;\n\t/** Add event handler (for header button) */\n\tonAddEvent?: () => void;\n\t/** Filter change handler */\n\tonFiltersChange?: (filters: ICalendarFilters) => void;\n\n\t// ========================================================================\n\t// RENDER PROPS (for custom components)\n\t// ========================================================================\n\n\t/**\n\t * Custom event renderer\n\t * Use this to inject your own EventCard component\n\t */\n\trenderEvent?: (props: RenderEventProps<TEventData>) => ReactNode;\n\n\t/**\n\t * Custom event popover renderer\n\t * Use this to inject your own EventPopover component\n\t * If not provided, a basic popover is shown\n\t */\n\trenderEventPopover?: (props: RenderEventPopoverProps<TEventData>) => ReactNode;\n\n\t/**\n\t * Custom filter sidebar renderer\n\t * Use this to inject your own CalendarFilterSidebar component\n\t */\n\trenderFilterSidebar?: (props: RenderFilterSidebarProps<TScheduleTypeData>) => ReactNode;\n\n\t/**\n\t * Custom header renderer\n\t * Use this to inject your own CalendarHeader component\n\t */\n\trenderHeader?: (props: RenderHeaderProps) => ReactNode;\n\n\t// ========================================================================\n\t// HEADER SLOTS\n\t// ========================================================================\n\n\t/** Settings popover content (for default header) */\n\tsettingsContent?: ReactNode;\n\t/** Filter row content (for default header) */\n\tfilterContent?: ReactNode;\n\t/** Whether to show the settings button (default: true) */\n\tshowSettings?: boolean;\n\t/** Whether to show timeline view options (default: false) */\n\tshowTimelineViews?: boolean;\n\n\t// ========================================================================\n\t// STYLING\n\t// ========================================================================\n\n\t/** Additional CSS class */\n\tclassName?: string;\n\t/** Custom header actions (shown in default header) */\n\theaderActions?: ReactNode;\n\t/** Empty state for agenda view */\n\temptyState?: ReactNode;\n\t/** Children (for header slot) */\n\tchildren?: ReactNode;\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport function TailwindCalendar<\n\tTEventData = Record<string, unknown>,\n\tTScheduleTypeData = Record<string, unknown>,\n\tTResourceData = Record<string, unknown>,\n>({\n\tevents,\n\tresources: _resources,\n\tscheduleTypes = [],\n\tinitialView = 'week',\n\tinitialDate,\n\tinitialFilters: _initialFilters,\n\tpreferences: userPreferences,\n\tbadgeVariant = 'colored',\n\thideHeader = false,\n\tshowFilterSidebar = false,\n\tavailableViews = ['day', 'week', 'month', 'agenda'],\n\tonEventClick,\n\tonSlotSelect,\n\tonViewChange,\n\tonDateChange,\n\tonAddEvent,\n\tonFiltersChange,\n\trenderEvent,\n\trenderEventPopover: _renderEventPopover,\n\trenderFilterSidebar,\n\trenderHeader,\n\tsettingsContent,\n\tfilterContent,\n\tshowSettings = true,\n\tshowTimelineViews = false,\n\tclassName,\n\theaderActions,\n\temptyState,\n\tchildren: _children,\n}: TailwindCalendarProps<TEventData, TScheduleTypeData, TResourceData>) {\n\t// ========================================================================\n\t// STATE\n\t// ========================================================================\n\n\tconst [view, setView] = useState<TCalendarView>(initialView);\n\tconst [date, setDate] = useState<Date>(initialDate ?? new Date());\n\n\t// Filter state (for filter sidebar)\n\tconst [selectedScheduleTypeIds, setSelectedScheduleTypeIds] = useState<number[]>([]);\n\tconst [selectedParticipantIds, setSelectedParticipantIds] = useState<string[]>([]);\n\n\t// Merge user preferences with defaults\n\tconst preferences: ICalendarPreferences = useMemo(\n\t\t() => ({\n\t\t\t...DEFAULT_PREFERENCES,\n\t\t\t...userPreferences,\n\t\t}),\n\t\t[userPreferences]\n\t);\n\n\t// ========================================================================\n\t// HANDLERS\n\t// ========================================================================\n\n\tconst handleViewChange = useCallback(\n\t\t(newView: TCalendarView) => {\n\t\t\tsetView(newView);\n\t\t\tonViewChange?.(newView);\n\t\t},\n\t\t[onViewChange]\n\t);\n\n\tconst handleDateChange = useCallback(\n\t\t(newDate: Date) => {\n\t\t\tsetDate(newDate);\n\t\t\tonDateChange?.(newDate);\n\t\t},\n\t\t[onDateChange]\n\t);\n\n\tconst handleNavigatePrev = useCallback(() => {\n\t\tconst newDate = navigatePrev(date, view);\n\t\thandleDateChange(newDate);\n\t}, [date, view, handleDateChange]);\n\n\tconst handleNavigateNext = useCallback(() => {\n\t\tconst newDate = navigateNext(date, view);\n\t\thandleDateChange(newDate);\n\t}, [date, view, handleDateChange]);\n\n\tconst handleNavigateToday = useCallback(() => {\n\t\tconst newDate = navigateToday();\n\t\thandleDateChange(newDate);\n\t}, [handleDateChange]);\n\n\tconst handleDayClick = useCallback(\n\t\t(clickedDate: Date) => {\n\t\t\t// Navigate to day view when clicking a day in month view\n\t\t\thandleDateChange(clickedDate);\n\t\t\thandleViewChange('day');\n\t\t},\n\t\t[handleDateChange, handleViewChange]\n\t);\n\n\t// ========================================================================\n\t// VIEW RENDERING\n\t// ========================================================================\n\n\t// Visible hours - show all hours (0-24) so users can see the full day\n\t// The working hours determine which slots have striped (disabled) appearance\n\tconst visibleHours = useMemo(\n\t\t() => ({\n\t\t\tstartHour: 0,\n\t\t\tendHour: 24,\n\t\t}),\n\t\t[]\n\t);\n\n\t// Week starts on (convert from 0-6 to 0 | 1)\n\tconst weekStartsOn: 0 | 1 = preferences.firstDayOfWeek === 0 ? 0 : 1;\n\n\t// Build working hours from preferences (for time grid views)\n\t// Working hours determine which slots are clickable and don't have striped pattern\n\t// Non-working hours get diagonal stripes and are disabled\n\tconst workingHours = useMemo(() => {\n\t\tconst hours: Record<number, { enabled: boolean; from: number; to: number }> = {};\n\t\tfor (let i = 0; i <= 6; i++) {\n\t\t\tconst isWeekend = i === 0 || i === 6;\n\t\t\t// Weekdays: use preferences, Weekends: use preferences if showWeekends, otherwise disabled\n\t\t\tif (!isWeekend) {\n\t\t\t\t// Weekdays (Mon-Fri): always have working hours from preferences\n\t\t\t\thours[i] = { enabled: true, from: preferences.startHour, to: preferences.endHour };\n\t\t\t} else if (preferences.showWeekends) {\n\t\t\t\t// Weekends with showWeekends: Saturday half-day (8-12), Sunday disabled\n\t\t\t\tif (i === 6) {\n\t\t\t\t\t// Saturday - half day (matching agenda-v2)\n\t\t\t\t\thours[i] = { enabled: true, from: 8, to: 12 };\n\t\t\t\t} else {\n\t\t\t\t\t// Sunday - disabled\n\t\t\t\t\thours[i] = { enabled: false, from: 0, to: 0 };\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Weekends without showWeekends: both disabled\n\t\t\t\thours[i] = { enabled: false, from: 0, to: 0 };\n\t\t\t}\n\t\t}\n\t\treturn hours;\n\t}, [preferences.startHour, preferences.endHour, preferences.showWeekends]);\n\n\t// Handle filter changes\n\tconst handleScheduleTypeFilterChange = useCallback(\n\t\t(ids: number[]) => {\n\t\t\tsetSelectedScheduleTypeIds(ids);\n\t\t\tonFiltersChange?.({\n\t\t\t\tscheduleTypeIds: ids,\n\t\t\t\tparticipantIds: selectedParticipantIds,\n\t\t\t});\n\t\t},\n\t\t[onFiltersChange, selectedParticipantIds]\n\t);\n\n\tconst handleParticipantFilterChange = useCallback(\n\t\t(ids: string[]) => {\n\t\t\tsetSelectedParticipantIds(ids);\n\t\t\tonFiltersChange?.({\n\t\t\t\tscheduleTypeIds: selectedScheduleTypeIds,\n\t\t\t\tparticipantIds: ids,\n\t\t\t});\n\t\t},\n\t\t[onFiltersChange, selectedScheduleTypeIds]\n\t);\n\n\t// Create render event adapters for different view types\n\t// Each view has a slightly different renderEvent signature\n\n\tconst dayWeekRenderEvent = useMemo(() => {\n\t\tif (!renderEvent) return undefined;\n\t\treturn (props: {\n\t\t\tevent: CalendarEvent<TEventData>;\n\t\t\tposition: { top: number; height: number; left: number; width: number };\n\t\t}) => {\n\t\t\treturn renderEvent({\n\t\t\t\tevent: props.event,\n\t\t\t\tview,\n\t\t\t\tvariant: 'full',\n\t\t\t\tposition: { ...props.position, zIndex: 1 },\n\t\t\t\tbadgeVariant,\n\t\t\t\t...(onEventClick && { onClick: () => onEventClick(props.event) }),\n\t\t\t});\n\t\t};\n\t}, [renderEvent, view, badgeVariant, onEventClick]);\n\n\tconst monthRenderEvent = useMemo(() => {\n\t\tif (!renderEvent) return undefined;\n\t\treturn (props: { event: CalendarEvent<TEventData>; variant: 'compact' }) => {\n\t\t\treturn renderEvent({\n\t\t\t\tevent: props.event,\n\t\t\t\tview: 'month',\n\t\t\t\tvariant: props.variant,\n\t\t\t\tbadgeVariant,\n\t\t\t\t...(onEventClick && { onClick: () => onEventClick(props.event) }),\n\t\t\t});\n\t\t};\n\t}, [renderEvent, badgeVariant, onEventClick]);\n\n\tconst agendaRenderEvent = useMemo(() => {\n\t\tif (!renderEvent) return undefined;\n\t\treturn (props: { event: CalendarEvent<TEventData> }) => {\n\t\t\treturn renderEvent({\n\t\t\t\tevent: props.event,\n\t\t\t\tview: 'agenda',\n\t\t\t\tvariant: 'block',\n\t\t\t\tbadgeVariant,\n\t\t\t\t...(onEventClick && { onClick: () => onEventClick(props.event) }),\n\t\t\t});\n\t\t};\n\t}, [renderEvent, badgeVariant, onEventClick]);\n\n\tconst renderView = () => {\n\t\tswitch (view) {\n\t\t\tcase 'day':\n\t\t\t\treturn (\n\t\t\t\t\t<DayView<TEventData>\n\t\t\t\t\t\tevents={events}\n\t\t\t\t\t\tdate={date}\n\t\t\t\t\t\tbadgeVariant={badgeVariant}\n\t\t\t\t\t\tvisibleHours={visibleHours}\n\t\t\t\t\t\tworkingHours={workingHours}\n\t\t\t\t\t\tslotDuration={preferences.slotDuration}\n\t\t\t\t\t\t{...(onEventClick && { onEventClick })}\n\t\t\t\t\t\t{...(onSlotSelect && { onSlotSelect })}\n\t\t\t\t\t\t{...(dayWeekRenderEvent && { renderEvent: dayWeekRenderEvent })}\n\t\t\t\t\t/>\n\t\t\t\t);\n\n\t\t\tcase 'week':\n\t\t\t\treturn (\n\t\t\t\t\t<WeekView<TEventData>\n\t\t\t\t\t\tevents={events}\n\t\t\t\t\t\tdate={date}\n\t\t\t\t\t\tbadgeVariant={badgeVariant}\n\t\t\t\t\t\tweekStartsOn={weekStartsOn}\n\t\t\t\t\t\tvisibleHours={visibleHours}\n\t\t\t\t\t\tworkingHours={workingHours}\n\t\t\t\t\t\tslotDuration={preferences.slotDuration}\n\t\t\t\t\t\tonDayClick={handleDayClick}\n\t\t\t\t\t\t{...(onEventClick && { onEventClick })}\n\t\t\t\t\t\t{...(onSlotSelect && { onSlotSelect })}\n\t\t\t\t\t\t{...(dayWeekRenderEvent && { renderEvent: dayWeekRenderEvent })}\n\t\t\t\t\t/>\n\t\t\t\t);\n\n\t\t\tcase 'month':\n\t\t\t\treturn (\n\t\t\t\t\t<MonthView<TEventData>\n\t\t\t\t\t\tevents={events}\n\t\t\t\t\t\tdate={date}\n\t\t\t\t\t\tbadgeVariant={badgeVariant}\n\t\t\t\t\t\tweekStartsOn={weekStartsOn}\n\t\t\t\t\t\tonDayClick={handleDayClick}\n\t\t\t\t\t\t{...(onEventClick && { onEventClick })}\n\t\t\t\t\t\t{...(onSlotSelect && { onSlotSelect })}\n\t\t\t\t\t\t{...(monthRenderEvent && { renderEvent: monthRenderEvent })}\n\t\t\t\t\t/>\n\t\t\t\t);\n\n\t\t\tcase 'agenda':\n\t\t\t\treturn (\n\t\t\t\t\t<AgendaView<TEventData>\n\t\t\t\t\t\tevents={events}\n\t\t\t\t\t\tdate={date}\n\t\t\t\t\t\tbadgeVariant={badgeVariant}\n\t\t\t\t\t\t{...(onEventClick && { onEventClick })}\n\t\t\t\t\t\t{...(emptyState && { emptyState })}\n\t\t\t\t\t\t{...(agendaRenderEvent && { renderEvent: agendaRenderEvent })}\n\t\t\t\t\t/>\n\t\t\t\t);\n\n\t\t\tdefault:\n\t\t\t\treturn (\n\t\t\t\t\t<div className=\"flex items-center justify-center h-64 text-gray-500\">\n\t\t\t\t\t\tView &quot;{view}&quot; is not yet implemented\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t}\n\t};\n\n\t// ========================================================================\n\t// RENDER\n\t// ========================================================================\n\n\t// Header navigation handler\n\tconst handleNavigate = useCallback(\n\t\t(direction: 'prev' | 'next' | 'today') => {\n\t\t\tif (direction === 'prev') handleNavigatePrev();\n\t\t\telse if (direction === 'next') handleNavigateNext();\n\t\t\telse handleNavigateToday();\n\t\t},\n\t\t[handleNavigatePrev, handleNavigateNext, handleNavigateToday]\n\t);\n\n\t// Default header props (conditionally add optional props)\n\tconst headerProps: RenderHeaderProps = {\n\t\tview,\n\t\tcurrentDate: date,\n\t\tavailableViews,\n\t\tonViewChange: handleViewChange,\n\t\tonNavigate: handleNavigate,\n\t\tonNavigatePrev: handleNavigatePrev,\n\t\tonNavigateNext: handleNavigateNext,\n\t\tonNavigateToday: handleNavigateToday,\n\t\t...(onAddEvent && { onAddEvent }),\n\t\t...(headerActions && { actions: headerActions }),\n\t\tclassName: 'border-b border-gray-200 p-3',\n\t};\n\n\t// Calendar header props (includes events for count display + slots)\n\tconst calendarHeaderProps = {\n\t\t...headerProps,\n\t\tevents,\n\t\tweekStartsOn,\n\t\tsettingsContent,\n\t\tfilterContent,\n\t\tshowSettings,\n\t\tshowTimelineViews,\n\t};\n\n\t// Clear all filters handler\n\tconst handleClearAllFilters = useCallback(() => {\n\t\tsetSelectedScheduleTypeIds([]);\n\t\tsetSelectedParticipantIds([]);\n\t\tonFiltersChange?.({\n\t\t\tscheduleTypeIds: [],\n\t\t\tparticipantIds: [],\n\t\t});\n\t}, [onFiltersChange]);\n\n\treturn (\n\t\t<div className={cn('flex h-full bg-white border border-gray-200 rounded-lg', className)}>\n\t\t\t{/* Filter Sidebar */}\n\t\t\t{showFilterSidebar && (\n\t\t\t\t<div className=\"w-64 border-r border-gray-200 flex-shrink-0\">\n\t\t\t\t\t{renderFilterSidebar ? (\n\t\t\t\t\t\trenderFilterSidebar({\n\t\t\t\t\t\t\tscheduleTypes,\n\t\t\t\t\t\t\tselectedScheduleTypeIds,\n\t\t\t\t\t\t\tselectedParticipantIds,\n\t\t\t\t\t\t\tonScheduleTypeChange: handleScheduleTypeFilterChange,\n\t\t\t\t\t\t\tonParticipantChange: handleParticipantFilterChange,\n\t\t\t\t\t\t\tonClearAll: handleClearAllFilters,\n\t\t\t\t\t\t})\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<div className=\"p-4 text-sm text-gray-500\">Filter sidebar not configured</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* Main Calendar Area */}\n\t\t\t<div className=\"flex flex-col flex-1 min-w-0\">\n\t\t\t\t{/* Header */}\n\t\t\t\t{!hideHeader &&\n\t\t\t\t\t(renderHeader ? renderHeader(headerProps) : <CalendarHeader {...calendarHeaderProps} />)}\n\n\t\t\t\t{/* Calendar View */}\n\t\t\t\t<div className=\"flex-1 overflow-auto\">{renderView()}</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n"],"names":["baseStyles","headerStyles","contentStyles","fallbackViewStyles","DefaultCalendar","events","_resources","_scheduleTypes","initialView","initialDate","_initialFilters","userPreferences","badgeVariant","hideHeader","availableViews","onEventClick","onSlotSelect","onViewChange","onDateChange","className","style","headerActions","emptyState","_children","view","setView","useState","date","setDate","preferences","useMemo","DEFAULT_PREFERENCES","handleViewChange","useCallback","newView","handleDateChange","newDate","handleNavigatePrev","navigatePrev","handleNavigateNext","navigateNext","handleNavigateToday","navigateToday","handleDayClick","clickedDate","visibleHours","weekStartsOn","renderView","jsx","DayView","WeekView","MonthView","AgendaView","jsxs","CalendarHeader","direction","TailwindCalendar","scheduleTypes","showFilterSidebar","onAddEvent","onFiltersChange","renderEvent","_renderEventPopover","renderFilterSidebar","renderHeader","settingsContent","filterContent","showSettings","showTimelineViews","selectedScheduleTypeIds","setSelectedScheduleTypeIds","selectedParticipantIds","setSelectedParticipantIds","workingHours","hours","i","handleScheduleTypeFilterChange","ids","handleParticipantFilterChange","dayWeekRenderEvent","props","monthRenderEvent","agendaRenderEvent","handleNavigate","headerProps","calendarHeaderProps","handleClearAllFilters","cn"],"mappings":"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"}
1
+ {"version":3,"file":"tailwind-calendar-B3HuJrjX.js","sources":["../src/presets/default/default-calendar.tsx","../src/presets/tailwind/tailwind-calendar.tsx"],"sourcesContent":["/**\n * DefaultCalendar - Pre-styled Calendar Preset\n *\n * A fully styled calendar using CSS custom properties for theming.\n * Designed for projects that don't use TailwindCSS but want a complete solution.\n *\n * CSS Custom Properties (override these for theming):\n * - --ic-bg: Background color\n * - --ic-bg-muted: Muted background\n * - --ic-text: Primary text color\n * - --ic-text-muted: Secondary text color\n * - --ic-border: Border color\n * - --ic-primary: Primary/accent color\n * - --ic-primary-foreground: Text on primary background\n * - --ic-radius: Border radius\n *\n * @example\n * ```tsx\n * import { DefaultCalendar } from '@inno/calendar/presets';\n *\n * function MyAgenda() {\n * return (\n * <div style={{ '--ic-primary': '#6366f1' }}>\n * <DefaultCalendar\n * events={myEvents}\n * onEventClick={(event) => console.log('Clicked:', event)}\n * />\n * </div>\n * );\n * }\n * ```\n */\n\nimport { type CSSProperties, type ReactNode, useCallback, useMemo, useState } from 'react';\nimport { CalendarHeader } from '../../components/header/calendar-header';\nimport { AgendaView } from '../../components/views/agenda-view';\nimport { DayView } from '../../components/views/day-view';\nimport { MonthView } from '../../components/views/month-view';\nimport { WeekView } from '../../components/views/week-view';\nimport { DEFAULT_PREFERENCES } from '../../core/constants';\nimport type {\n\tCalendarEvent,\n\tICalendarFilters,\n\tICalendarPreferences,\n\tIResource,\n\tIScheduleType,\n\tISelectionResult,\n\tTBadgeVariant,\n\tTCalendarView,\n} from '../../core/types';\nimport { navigateNext, navigatePrev, navigateToday } from '../../core/utils/grid-utils';\n\n// ============================================================================\n// STYLES (CSS-in-JS for zero-config usage)\n// ============================================================================\n\nconst baseStyles: CSSProperties = {\n\tdisplay: 'flex',\n\tflexDirection: 'column',\n\theight: '100%',\n\tminHeight: '400px',\n\tbackgroundColor: 'var(--ic-bg, #ffffff)',\n\tborder: '1px solid var(--ic-border, #e5e7eb)',\n\tborderRadius: 'var(--ic-radius, 0.5rem)',\n\toverflow: 'hidden',\n\tfontFamily:\n\t\t'var(--ic-font-family, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif)',\n\tfontSize: 'var(--ic-font-size, 0.875rem)',\n\tcolor: 'var(--ic-text, #111827)',\n};\n\nconst headerStyles: CSSProperties = {\n\tborderBottom: '1px solid var(--ic-border, #e5e7eb)',\n};\n\nconst contentStyles: CSSProperties = {\n\tflex: 1,\n\toverflow: 'auto',\n};\n\nconst fallbackViewStyles: CSSProperties = {\n\tdisplay: 'flex',\n\talignItems: 'center',\n\tjustifyContent: 'center',\n\theight: '16rem',\n\tcolor: 'var(--ic-text-muted, #6b7280)',\n};\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface DefaultCalendarProps<\n\tTEventData = Record<string, unknown>,\n\tTScheduleTypeData = Record<string, unknown>,\n\tTResourceData = Record<string, unknown>,\n> {\n\t/** Events to display */\n\tevents: CalendarEvent<TEventData>[];\n\t/** Available resources */\n\tresources?: IResource<TResourceData>[];\n\t/** Available schedule types */\n\tscheduleTypes?: IScheduleType<TScheduleTypeData>[];\n\t/** Initial view */\n\tinitialView?: TCalendarView;\n\t/** Initial date */\n\tinitialDate?: Date;\n\t/** Initial filters */\n\tinitialFilters?: ICalendarFilters;\n\t/** Preferences */\n\tpreferences?: Partial<ICalendarPreferences>;\n\t/** Badge variant for events (dot, colored, mixed) */\n\tbadgeVariant?: TBadgeVariant;\n\t/** Hide the header */\n\thideHeader?: boolean;\n\t/** Available views to show in view switcher */\n\tavailableViews?: TCalendarView[];\n\t/** Event click handler */\n\tonEventClick?: (event: CalendarEvent<TEventData>) => void;\n\t/** Slot selection handler */\n\tonSlotSelect?: (selection: ISelectionResult) => void;\n\t/** View change handler */\n\tonViewChange?: (view: TCalendarView) => void;\n\t/** Date change handler */\n\tonDateChange?: (date: Date) => void;\n\t/** Additional CSS class */\n\tclassName?: string;\n\t/** Custom style overrides */\n\tstyle?: CSSProperties;\n\t/** Custom header actions */\n\theaderActions?: ReactNode;\n\t/** Empty state for agenda view */\n\temptyState?: ReactNode;\n\t/** Children (for header slot) */\n\tchildren?: ReactNode;\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport function DefaultCalendar<\n\tTEventData = Record<string, unknown>,\n\tTScheduleTypeData = Record<string, unknown>,\n\tTResourceData = Record<string, unknown>,\n>({\n\tevents,\n\tresources: _resources,\n\tscheduleTypes: _scheduleTypes,\n\tinitialView = 'week',\n\tinitialDate,\n\tinitialFilters: _initialFilters,\n\tpreferences: userPreferences,\n\tbadgeVariant = 'colored',\n\thideHeader = false,\n\tavailableViews = ['day', 'week', 'month', 'agenda'],\n\tonEventClick,\n\tonSlotSelect,\n\tonViewChange,\n\tonDateChange,\n\tclassName = '',\n\tstyle,\n\theaderActions,\n\temptyState,\n\tchildren: _children,\n}: DefaultCalendarProps<TEventData, TScheduleTypeData, TResourceData>) {\n\t// ========================================================================\n\t// STATE\n\t// ========================================================================\n\n\tconst [view, setView] = useState<TCalendarView>(initialView);\n\tconst [date, setDate] = useState<Date>(initialDate ?? new Date());\n\n\t// Merge user preferences with defaults\n\tconst preferences: ICalendarPreferences = useMemo(\n\t\t() => ({\n\t\t\t...DEFAULT_PREFERENCES,\n\t\t\t...userPreferences,\n\t\t}),\n\t\t[userPreferences]\n\t);\n\n\t// ========================================================================\n\t// HANDLERS\n\t// ========================================================================\n\n\tconst handleViewChange = useCallback(\n\t\t(newView: TCalendarView) => {\n\t\t\tsetView(newView);\n\t\t\tonViewChange?.(newView);\n\t\t},\n\t\t[onViewChange]\n\t);\n\n\tconst handleDateChange = useCallback(\n\t\t(newDate: Date) => {\n\t\t\tsetDate(newDate);\n\t\t\tonDateChange?.(newDate);\n\t\t},\n\t\t[onDateChange]\n\t);\n\n\tconst handleNavigatePrev = useCallback(() => {\n\t\tconst newDate = navigatePrev(date, view);\n\t\thandleDateChange(newDate);\n\t}, [date, view, handleDateChange]);\n\n\tconst handleNavigateNext = useCallback(() => {\n\t\tconst newDate = navigateNext(date, view);\n\t\thandleDateChange(newDate);\n\t}, [date, view, handleDateChange]);\n\n\tconst handleNavigateToday = useCallback(() => {\n\t\tconst newDate = navigateToday();\n\t\thandleDateChange(newDate);\n\t}, [handleDateChange]);\n\n\tconst handleDayClick = useCallback(\n\t\t(clickedDate: Date) => {\n\t\t\t// Navigate to day view when clicking a day in month view\n\t\t\thandleDateChange(clickedDate);\n\t\t\thandleViewChange('day');\n\t\t},\n\t\t[handleDateChange, handleViewChange]\n\t);\n\n\t// ========================================================================\n\t// VIEW RENDERING\n\t// ========================================================================\n\n\t// Build visible hours from preferences\n\tconst visibleHours = useMemo(\n\t\t() => ({\n\t\t\tstartHour: preferences.startHour,\n\t\t\tendHour: preferences.endHour,\n\t\t}),\n\t\t[preferences.startHour, preferences.endHour]\n\t);\n\n\t// Week starts on (convert from 0-6 to 0 | 1)\n\tconst weekStartsOn: 0 | 1 = preferences.firstDayOfWeek === 0 ? 0 : 1;\n\n\tconst renderView = () => {\n\t\tswitch (view) {\n\t\t\tcase 'day':\n\t\t\t\treturn (\n\t\t\t\t\t<DayView<TEventData>\n\t\t\t\t\t\tevents={events}\n\t\t\t\t\t\tdate={date}\n\t\t\t\t\t\tbadgeVariant={badgeVariant}\n\t\t\t\t\t\tvisibleHours={visibleHours}\n\t\t\t\t\t\tslotDuration={preferences.slotDuration}\n\t\t\t\t\t\t{...(onEventClick && { onEventClick })}\n\t\t\t\t\t\t{...(onSlotSelect && { onSlotSelect })}\n\t\t\t\t\t/>\n\t\t\t\t);\n\n\t\t\tcase 'week':\n\t\t\t\treturn (\n\t\t\t\t\t<WeekView<TEventData>\n\t\t\t\t\t\tevents={events}\n\t\t\t\t\t\tdate={date}\n\t\t\t\t\t\tbadgeVariant={badgeVariant}\n\t\t\t\t\t\tweekStartsOn={weekStartsOn}\n\t\t\t\t\t\tvisibleHours={visibleHours}\n\t\t\t\t\t\tslotDuration={preferences.slotDuration}\n\t\t\t\t\t\tonDayClick={handleDayClick}\n\t\t\t\t\t\t{...(onEventClick && { onEventClick })}\n\t\t\t\t\t\t{...(onSlotSelect && { onSlotSelect })}\n\t\t\t\t\t/>\n\t\t\t\t);\n\n\t\t\tcase 'month':\n\t\t\t\treturn (\n\t\t\t\t\t<MonthView<TEventData>\n\t\t\t\t\t\tevents={events}\n\t\t\t\t\t\tdate={date}\n\t\t\t\t\t\tbadgeVariant={badgeVariant}\n\t\t\t\t\t\tweekStartsOn={weekStartsOn}\n\t\t\t\t\t\tonDayClick={handleDayClick}\n\t\t\t\t\t\t{...(onEventClick && { onEventClick })}\n\t\t\t\t\t\t{...(onSlotSelect && { onSlotSelect })}\n\t\t\t\t\t/>\n\t\t\t\t);\n\n\t\t\tcase 'agenda':\n\t\t\t\treturn (\n\t\t\t\t\t<AgendaView<TEventData>\n\t\t\t\t\t\tevents={events}\n\t\t\t\t\t\tdate={date}\n\t\t\t\t\t\tbadgeVariant={badgeVariant}\n\t\t\t\t\t\t{...(onEventClick && { onEventClick })}\n\t\t\t\t\t\t{...(emptyState && { emptyState })}\n\t\t\t\t\t/>\n\t\t\t\t);\n\n\t\t\tdefault:\n\t\t\t\treturn <div style={fallbackViewStyles}>View &quot;{view}&quot; is not yet implemented</div>;\n\t\t}\n\t};\n\n\t// ========================================================================\n\t// RENDER\n\t// ========================================================================\n\n\treturn (\n\t\t<div className={className} style={{ ...baseStyles, ...style }}>\n\t\t\t{/* Header */}\n\t\t\t{!hideHeader && (\n\t\t\t\t<div style={headerStyles}>\n\t\t\t\t\t<CalendarHeader\n\t\t\t\t\t\tview={view}\n\t\t\t\t\t\tcurrentDate={date}\n\t\t\t\t\t\tavailableViews={availableViews}\n\t\t\t\t\t\tonViewChange={handleViewChange}\n\t\t\t\t\t\tonNavigate={(direction) => {\n\t\t\t\t\t\t\tif (direction === 'prev') handleNavigatePrev();\n\t\t\t\t\t\t\telse if (direction === 'next') handleNavigateNext();\n\t\t\t\t\t\t\telse handleNavigateToday();\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tactions={headerActions}\n\t\t\t\t\t\tclassName=\"p-3\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* Calendar View */}\n\t\t\t<div style={contentStyles}>{renderView()}</div>\n\t\t</div>\n\t);\n}\n","/**\n * TailwindCalendar - Tailwind-Optimized Calendar Preset\n *\n * A fully featured, ready-to-use calendar component designed for TailwindCSS projects.\n * Composes all calendar components into a cohesive experience.\n *\n * Features:\n * - Full customization via render props (renderEvent, renderEventPopover, renderFilterSidebar)\n * - All visual components can be replaced while keeping state management\n * - Matches production quality when used with custom components\n *\n * @example\n * ```tsx\n * import { TailwindCalendar } from '@inno/calendar/presets';\n *\n * function MyAgenda() {\n * return (\n * <TailwindCalendar\n * events={myEvents}\n * onEventClick={(event) => console.log('Clicked:', event)}\n * onSlotSelect={(selection) => console.log('Selected:', selection)}\n * // Custom components for production quality\n * renderEvent={(event) => <MyEventCard event={event} />}\n * renderEventPopover={(event, onClose) => <MyEventPopover event={event} onClose={onClose} />}\n * renderFilterSidebar={(props) => <MyFilterSidebar {...props} />}\n * />\n * );\n * }\n * ```\n */\n\nimport { type ReactNode, useCallback, useMemo, useState } from 'react';\nimport { CalendarHeader } from '../../components/header/calendar-header';\nimport { AgendaView } from '../../components/views/agenda-view';\nimport { DayView } from '../../components/views/day-view';\nimport { MonthView } from '../../components/views/month-view';\nimport { WeekView } from '../../components/views/week-view';\nimport { DEFAULT_PREFERENCES } from '../../core/constants';\nimport type {\n\tCalendarEvent,\n\tICalendarFilters,\n\tICalendarPreferences,\n\tIEventPosition,\n\tIResource,\n\tIScheduleType,\n\tISelectionResult,\n\tTBadgeVariant,\n\tTCalendarView,\n} from '../../core/types';\nimport { navigateNext, navigatePrev, navigateToday } from '../../core/utils/grid-utils';\nimport { cn } from '../../lib/utils';\n\n// ============================================================================\n// RENDER PROP TYPES\n// ============================================================================\n\n/**\n * Props for custom event rendering\n */\nexport interface RenderEventProps<TEventData = Record<string, unknown>> {\n\tevent: CalendarEvent<TEventData>;\n\tview: TCalendarView;\n\tvariant: 'full' | 'compact' | 'dot' | 'block';\n\tposition?: IEventPosition;\n\tbadgeVariant: TBadgeVariant;\n\tonClick?: () => void;\n}\n\n/**\n * Props for custom event popover rendering\n */\nexport interface RenderEventPopoverProps<TEventData = Record<string, unknown>> {\n\tevent: CalendarEvent<TEventData>;\n\tonClose: () => void;\n}\n\n/**\n * Props for custom filter sidebar rendering\n */\nexport interface RenderFilterSidebarProps<TScheduleTypeData = Record<string, unknown>> {\n\tscheduleTypes: IScheduleType<TScheduleTypeData>[];\n\tselectedScheduleTypeIds: number[];\n\tonScheduleTypeChange: (ids: number[]) => void;\n\tselectedParticipantIds: string[];\n\tonParticipantChange: (ids: string[]) => void;\n\tonClearAll?: () => void;\n}\n\n/**\n * Props for custom header rendering\n */\nexport interface RenderHeaderProps {\n\tview: TCalendarView;\n\tcurrentDate: Date;\n\tavailableViews: TCalendarView[];\n\tonViewChange: (view: TCalendarView) => void;\n\tonNavigate: (direction: 'prev' | 'next' | 'today') => void;\n\tonNavigatePrev?: () => void;\n\tonNavigateNext?: () => void;\n\tonNavigateToday?: () => void;\n\tonAddEvent?: () => void;\n\tactions?: ReactNode;\n\tclassName?: string;\n}\n\n// ============================================================================\n// COMPONENT PROPS\n// ============================================================================\n\nexport interface TailwindCalendarProps<\n\tTEventData = Record<string, unknown>,\n\tTScheduleTypeData = Record<string, unknown>,\n\tTResourceData = Record<string, unknown>,\n> {\n\t/** Events to display */\n\tevents: CalendarEvent<TEventData>[];\n\t/** Available resources */\n\tresources?: IResource<TResourceData>[];\n\t/** Available schedule types */\n\tscheduleTypes?: IScheduleType<TScheduleTypeData>[];\n\t/** Initial view */\n\tinitialView?: TCalendarView;\n\t/** Initial date */\n\tinitialDate?: Date;\n\t/** Initial filters */\n\tinitialFilters?: ICalendarFilters;\n\t/** Preferences */\n\tpreferences?: Partial<ICalendarPreferences>;\n\t/** Badge variant for events (dot, colored, mixed) */\n\tbadgeVariant?: TBadgeVariant;\n\t/** Hide the header */\n\thideHeader?: boolean;\n\t/** Show filter sidebar */\n\tshowFilterSidebar?: boolean;\n\t/** Available views to show in view switcher */\n\tavailableViews?: TCalendarView[];\n\n\t// ========================================================================\n\t// CALLBACKS\n\t// ========================================================================\n\n\t/** Event click handler */\n\tonEventClick?: (event: CalendarEvent<TEventData>) => void;\n\t/** Slot selection handler */\n\tonSlotSelect?: (selection: ISelectionResult) => void;\n\t/** View change handler */\n\tonViewChange?: (view: TCalendarView) => void;\n\t/** Date change handler */\n\tonDateChange?: (date: Date) => void;\n\t/** Add event handler (for header button) */\n\tonAddEvent?: () => void;\n\t/** Filter change handler */\n\tonFiltersChange?: (filters: ICalendarFilters) => void;\n\n\t// ========================================================================\n\t// RENDER PROPS (for custom components)\n\t// ========================================================================\n\n\t/**\n\t * Custom event renderer\n\t * Use this to inject your own EventCard component\n\t */\n\trenderEvent?: (props: RenderEventProps<TEventData>) => ReactNode;\n\n\t/**\n\t * Custom event popover renderer\n\t * Use this to inject your own EventPopover component\n\t * If not provided, a basic popover is shown\n\t */\n\trenderEventPopover?: (props: RenderEventPopoverProps<TEventData>) => ReactNode;\n\n\t/**\n\t * Custom filter sidebar renderer\n\t * Use this to inject your own CalendarFilterSidebar component\n\t */\n\trenderFilterSidebar?: (props: RenderFilterSidebarProps<TScheduleTypeData>) => ReactNode;\n\n\t/**\n\t * Custom header renderer\n\t * Use this to inject your own CalendarHeader component\n\t */\n\trenderHeader?: (props: RenderHeaderProps) => ReactNode;\n\n\t// ========================================================================\n\t// HEADER SLOTS\n\t// ========================================================================\n\n\t/** Settings popover content (for default header) */\n\tsettingsContent?: ReactNode;\n\t/** Filter row content (for default header) */\n\tfilterContent?: ReactNode;\n\t/** Whether to show the settings button (default: true) */\n\tshowSettings?: boolean;\n\t/** Whether to show timeline view options (default: false) */\n\tshowTimelineViews?: boolean;\n\n\t// ========================================================================\n\t// STYLING\n\t// ========================================================================\n\n\t/** Additional CSS class */\n\tclassName?: string;\n\t/** Custom header actions (shown in default header) */\n\theaderActions?: ReactNode;\n\t/** Empty state for agenda view */\n\temptyState?: ReactNode;\n\t/** Children (for header slot) */\n\tchildren?: ReactNode;\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport function TailwindCalendar<\n\tTEventData = Record<string, unknown>,\n\tTScheduleTypeData = Record<string, unknown>,\n\tTResourceData = Record<string, unknown>,\n>({\n\tevents,\n\tresources: _resources,\n\tscheduleTypes = [],\n\tinitialView = 'week',\n\tinitialDate,\n\tinitialFilters: _initialFilters,\n\tpreferences: userPreferences,\n\tbadgeVariant = 'colored',\n\thideHeader = false,\n\tshowFilterSidebar = false,\n\tavailableViews = ['day', 'week', 'month', 'agenda'],\n\tonEventClick,\n\tonSlotSelect,\n\tonViewChange,\n\tonDateChange,\n\tonAddEvent,\n\tonFiltersChange,\n\trenderEvent,\n\trenderEventPopover: _renderEventPopover,\n\trenderFilterSidebar,\n\trenderHeader,\n\tsettingsContent,\n\tfilterContent,\n\tshowSettings = true,\n\tshowTimelineViews = false,\n\tclassName,\n\theaderActions,\n\temptyState,\n\tchildren: _children,\n}: TailwindCalendarProps<TEventData, TScheduleTypeData, TResourceData>) {\n\t// ========================================================================\n\t// STATE\n\t// ========================================================================\n\n\tconst [view, setView] = useState<TCalendarView>(initialView);\n\tconst [date, setDate] = useState<Date>(initialDate ?? new Date());\n\n\t// Filter state (for filter sidebar)\n\tconst [selectedScheduleTypeIds, setSelectedScheduleTypeIds] = useState<number[]>([]);\n\tconst [selectedParticipantIds, setSelectedParticipantIds] = useState<string[]>([]);\n\n\t// Merge user preferences with defaults\n\tconst preferences: ICalendarPreferences = useMemo(\n\t\t() => ({\n\t\t\t...DEFAULT_PREFERENCES,\n\t\t\t...userPreferences,\n\t\t}),\n\t\t[userPreferences]\n\t);\n\n\t// ========================================================================\n\t// HANDLERS\n\t// ========================================================================\n\n\tconst handleViewChange = useCallback(\n\t\t(newView: TCalendarView) => {\n\t\t\tsetView(newView);\n\t\t\tonViewChange?.(newView);\n\t\t},\n\t\t[onViewChange]\n\t);\n\n\tconst handleDateChange = useCallback(\n\t\t(newDate: Date) => {\n\t\t\tsetDate(newDate);\n\t\t\tonDateChange?.(newDate);\n\t\t},\n\t\t[onDateChange]\n\t);\n\n\tconst handleNavigatePrev = useCallback(() => {\n\t\tconst newDate = navigatePrev(date, view);\n\t\thandleDateChange(newDate);\n\t}, [date, view, handleDateChange]);\n\n\tconst handleNavigateNext = useCallback(() => {\n\t\tconst newDate = navigateNext(date, view);\n\t\thandleDateChange(newDate);\n\t}, [date, view, handleDateChange]);\n\n\tconst handleNavigateToday = useCallback(() => {\n\t\tconst newDate = navigateToday();\n\t\thandleDateChange(newDate);\n\t}, [handleDateChange]);\n\n\tconst handleDayClick = useCallback(\n\t\t(clickedDate: Date) => {\n\t\t\t// Navigate to day view when clicking a day in month view\n\t\t\thandleDateChange(clickedDate);\n\t\t\thandleViewChange('day');\n\t\t},\n\t\t[handleDateChange, handleViewChange]\n\t);\n\n\t// ========================================================================\n\t// VIEW RENDERING\n\t// ========================================================================\n\n\t// Visible hours - show all hours (0-24) so users can see the full day\n\t// The working hours determine which slots have striped (disabled) appearance\n\tconst visibleHours = useMemo(\n\t\t() => ({\n\t\t\tstartHour: 0,\n\t\t\tendHour: 24,\n\t\t}),\n\t\t[]\n\t);\n\n\t// Week starts on (convert from 0-6 to 0 | 1)\n\tconst weekStartsOn: 0 | 1 = preferences.firstDayOfWeek === 0 ? 0 : 1;\n\n\t// Build working hours from preferences (for time grid views)\n\t// Working hours determine which slots are clickable and don't have striped pattern\n\t// Non-working hours get diagonal stripes and are disabled\n\tconst workingHours = useMemo(() => {\n\t\tconst hours: Record<number, { enabled: boolean; from: number; to: number }> = {};\n\t\tfor (let i = 0; i <= 6; i++) {\n\t\t\tconst isWeekend = i === 0 || i === 6;\n\t\t\t// Weekdays: use preferences, Weekends: use preferences if showWeekends, otherwise disabled\n\t\t\tif (!isWeekend) {\n\t\t\t\t// Weekdays (Mon-Fri): always have working hours from preferences\n\t\t\t\thours[i] = { enabled: true, from: preferences.startHour, to: preferences.endHour };\n\t\t\t} else if (preferences.showWeekends) {\n\t\t\t\t// Weekends with showWeekends: Saturday half-day (8-12), Sunday disabled\n\t\t\t\tif (i === 6) {\n\t\t\t\t\t// Saturday - half day (matching agenda-v2)\n\t\t\t\t\thours[i] = { enabled: true, from: 8, to: 12 };\n\t\t\t\t} else {\n\t\t\t\t\t// Sunday - disabled\n\t\t\t\t\thours[i] = { enabled: false, from: 0, to: 0 };\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Weekends without showWeekends: both disabled\n\t\t\t\thours[i] = { enabled: false, from: 0, to: 0 };\n\t\t\t}\n\t\t}\n\t\treturn hours;\n\t}, [preferences.startHour, preferences.endHour, preferences.showWeekends]);\n\n\t// Handle filter changes\n\tconst handleScheduleTypeFilterChange = useCallback(\n\t\t(ids: number[]) => {\n\t\t\tsetSelectedScheduleTypeIds(ids);\n\t\t\tonFiltersChange?.({\n\t\t\t\tscheduleTypeIds: ids,\n\t\t\t\tparticipantIds: selectedParticipantIds,\n\t\t\t});\n\t\t},\n\t\t[onFiltersChange, selectedParticipantIds]\n\t);\n\n\tconst handleParticipantFilterChange = useCallback(\n\t\t(ids: string[]) => {\n\t\t\tsetSelectedParticipantIds(ids);\n\t\t\tonFiltersChange?.({\n\t\t\t\tscheduleTypeIds: selectedScheduleTypeIds,\n\t\t\t\tparticipantIds: ids,\n\t\t\t});\n\t\t},\n\t\t[onFiltersChange, selectedScheduleTypeIds]\n\t);\n\n\t// Create render event adapters for different view types\n\t// Each view has a slightly different renderEvent signature\n\n\tconst dayWeekRenderEvent = useMemo(() => {\n\t\tif (!renderEvent) return undefined;\n\t\treturn (props: {\n\t\t\tevent: CalendarEvent<TEventData>;\n\t\t\tposition: { top: number; height: number; left: number; width: number };\n\t\t}) => {\n\t\t\treturn renderEvent({\n\t\t\t\tevent: props.event,\n\t\t\t\tview,\n\t\t\t\tvariant: 'full',\n\t\t\t\tposition: { ...props.position, zIndex: 1 },\n\t\t\t\tbadgeVariant,\n\t\t\t\t...(onEventClick && { onClick: () => onEventClick(props.event) }),\n\t\t\t});\n\t\t};\n\t}, [renderEvent, view, badgeVariant, onEventClick]);\n\n\tconst monthRenderEvent = useMemo(() => {\n\t\tif (!renderEvent) return undefined;\n\t\treturn (props: { event: CalendarEvent<TEventData>; variant: 'compact' }) => {\n\t\t\treturn renderEvent({\n\t\t\t\tevent: props.event,\n\t\t\t\tview: 'month',\n\t\t\t\tvariant: props.variant,\n\t\t\t\tbadgeVariant,\n\t\t\t\t...(onEventClick && { onClick: () => onEventClick(props.event) }),\n\t\t\t});\n\t\t};\n\t}, [renderEvent, badgeVariant, onEventClick]);\n\n\tconst agendaRenderEvent = useMemo(() => {\n\t\tif (!renderEvent) return undefined;\n\t\treturn (props: { event: CalendarEvent<TEventData> }) => {\n\t\t\treturn renderEvent({\n\t\t\t\tevent: props.event,\n\t\t\t\tview: 'agenda',\n\t\t\t\tvariant: 'block',\n\t\t\t\tbadgeVariant,\n\t\t\t\t...(onEventClick && { onClick: () => onEventClick(props.event) }),\n\t\t\t});\n\t\t};\n\t}, [renderEvent, badgeVariant, onEventClick]);\n\n\tconst renderView = () => {\n\t\tswitch (view) {\n\t\t\tcase 'day':\n\t\t\t\treturn (\n\t\t\t\t\t<DayView<TEventData>\n\t\t\t\t\t\tevents={events}\n\t\t\t\t\t\tdate={date}\n\t\t\t\t\t\tbadgeVariant={badgeVariant}\n\t\t\t\t\t\tvisibleHours={visibleHours}\n\t\t\t\t\t\tworkingHours={workingHours}\n\t\t\t\t\t\tslotDuration={preferences.slotDuration}\n\t\t\t\t\t\t{...(onEventClick && { onEventClick })}\n\t\t\t\t\t\t{...(onSlotSelect && { onSlotSelect })}\n\t\t\t\t\t\t{...(dayWeekRenderEvent && { renderEvent: dayWeekRenderEvent })}\n\t\t\t\t\t/>\n\t\t\t\t);\n\n\t\t\tcase 'week':\n\t\t\t\treturn (\n\t\t\t\t\t<WeekView<TEventData>\n\t\t\t\t\t\tevents={events}\n\t\t\t\t\t\tdate={date}\n\t\t\t\t\t\tbadgeVariant={badgeVariant}\n\t\t\t\t\t\tweekStartsOn={weekStartsOn}\n\t\t\t\t\t\tvisibleHours={visibleHours}\n\t\t\t\t\t\tworkingHours={workingHours}\n\t\t\t\t\t\tslotDuration={preferences.slotDuration}\n\t\t\t\t\t\tonDayClick={handleDayClick}\n\t\t\t\t\t\t{...(onEventClick && { onEventClick })}\n\t\t\t\t\t\t{...(onSlotSelect && { onSlotSelect })}\n\t\t\t\t\t\t{...(dayWeekRenderEvent && { renderEvent: dayWeekRenderEvent })}\n\t\t\t\t\t/>\n\t\t\t\t);\n\n\t\t\tcase 'month':\n\t\t\t\treturn (\n\t\t\t\t\t<MonthView<TEventData>\n\t\t\t\t\t\tevents={events}\n\t\t\t\t\t\tdate={date}\n\t\t\t\t\t\tbadgeVariant={badgeVariant}\n\t\t\t\t\t\tweekStartsOn={weekStartsOn}\n\t\t\t\t\t\tonDayClick={handleDayClick}\n\t\t\t\t\t\t{...(onEventClick && { onEventClick })}\n\t\t\t\t\t\t{...(onSlotSelect && { onSlotSelect })}\n\t\t\t\t\t\t{...(monthRenderEvent && { renderEvent: monthRenderEvent })}\n\t\t\t\t\t/>\n\t\t\t\t);\n\n\t\t\tcase 'agenda':\n\t\t\t\treturn (\n\t\t\t\t\t<AgendaView<TEventData>\n\t\t\t\t\t\tevents={events}\n\t\t\t\t\t\tdate={date}\n\t\t\t\t\t\tbadgeVariant={badgeVariant}\n\t\t\t\t\t\t{...(onEventClick && { onEventClick })}\n\t\t\t\t\t\t{...(emptyState && { emptyState })}\n\t\t\t\t\t\t{...(agendaRenderEvent && { renderEvent: agendaRenderEvent })}\n\t\t\t\t\t/>\n\t\t\t\t);\n\n\t\t\tdefault:\n\t\t\t\treturn (\n\t\t\t\t\t<div className=\"flex items-center justify-center h-64 text-gray-500\">\n\t\t\t\t\t\tView &quot;{view}&quot; is not yet implemented\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t}\n\t};\n\n\t// ========================================================================\n\t// RENDER\n\t// ========================================================================\n\n\t// Header navigation handler\n\tconst handleNavigate = useCallback(\n\t\t(direction: 'prev' | 'next' | 'today') => {\n\t\t\tif (direction === 'prev') handleNavigatePrev();\n\t\t\telse if (direction === 'next') handleNavigateNext();\n\t\t\telse handleNavigateToday();\n\t\t},\n\t\t[handleNavigatePrev, handleNavigateNext, handleNavigateToday]\n\t);\n\n\t// Default header props (conditionally add optional props)\n\tconst headerProps: RenderHeaderProps = {\n\t\tview,\n\t\tcurrentDate: date,\n\t\tavailableViews,\n\t\tonViewChange: handleViewChange,\n\t\tonNavigate: handleNavigate,\n\t\tonNavigatePrev: handleNavigatePrev,\n\t\tonNavigateNext: handleNavigateNext,\n\t\tonNavigateToday: handleNavigateToday,\n\t\t...(onAddEvent && { onAddEvent }),\n\t\t...(headerActions && { actions: headerActions }),\n\t\tclassName: 'border-b border-gray-200 p-3',\n\t};\n\n\t// Calendar header props (includes events for count display + slots)\n\tconst calendarHeaderProps = {\n\t\t...headerProps,\n\t\tevents,\n\t\tweekStartsOn,\n\t\tsettingsContent,\n\t\tfilterContent,\n\t\tshowSettings,\n\t\tshowTimelineViews,\n\t};\n\n\t// Clear all filters handler\n\tconst handleClearAllFilters = useCallback(() => {\n\t\tsetSelectedScheduleTypeIds([]);\n\t\tsetSelectedParticipantIds([]);\n\t\tonFiltersChange?.({\n\t\t\tscheduleTypeIds: [],\n\t\t\tparticipantIds: [],\n\t\t});\n\t}, [onFiltersChange]);\n\n\treturn (\n\t\t<div className={cn('flex h-full bg-white border border-gray-200 rounded-lg', className)}>\n\t\t\t{/* Filter Sidebar */}\n\t\t\t{showFilterSidebar && (\n\t\t\t\t<div className=\"w-64 border-r border-gray-200 flex-shrink-0\">\n\t\t\t\t\t{renderFilterSidebar ? (\n\t\t\t\t\t\trenderFilterSidebar({\n\t\t\t\t\t\t\tscheduleTypes,\n\t\t\t\t\t\t\tselectedScheduleTypeIds,\n\t\t\t\t\t\t\tselectedParticipantIds,\n\t\t\t\t\t\t\tonScheduleTypeChange: handleScheduleTypeFilterChange,\n\t\t\t\t\t\t\tonParticipantChange: handleParticipantFilterChange,\n\t\t\t\t\t\t\tonClearAll: handleClearAllFilters,\n\t\t\t\t\t\t})\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<div className=\"p-4 text-sm text-gray-500\">Filter sidebar not configured</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* Main Calendar Area */}\n\t\t\t<div className=\"flex flex-col flex-1 min-w-0\">\n\t\t\t\t{/* Header */}\n\t\t\t\t{!hideHeader &&\n\t\t\t\t\t(renderHeader ? renderHeader(headerProps) : <CalendarHeader {...calendarHeaderProps} />)}\n\n\t\t\t\t{/* Calendar View */}\n\t\t\t\t<div className=\"flex-1 overflow-auto\">{renderView()}</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n"],"names":["baseStyles","headerStyles","contentStyles","fallbackViewStyles","DefaultCalendar","events","_resources","_scheduleTypes","initialView","initialDate","_initialFilters","userPreferences","badgeVariant","hideHeader","availableViews","onEventClick","onSlotSelect","onViewChange","onDateChange","className","style","headerActions","emptyState","_children","view","setView","useState","date","setDate","preferences","useMemo","DEFAULT_PREFERENCES","handleViewChange","useCallback","newView","handleDateChange","newDate","handleNavigatePrev","navigatePrev","handleNavigateNext","navigateNext","handleNavigateToday","navigateToday","handleDayClick","clickedDate","visibleHours","weekStartsOn","renderView","jsx","DayView","WeekView","MonthView","AgendaView","jsxs","CalendarHeader","direction","TailwindCalendar","scheduleTypes","showFilterSidebar","onAddEvent","onFiltersChange","renderEvent","_renderEventPopover","renderFilterSidebar","renderHeader","settingsContent","filterContent","showSettings","showTimelineViews","selectedScheduleTypeIds","setSelectedScheduleTypeIds","selectedParticipantIds","setSelectedParticipantIds","workingHours","hours","i","handleScheduleTypeFilterChange","ids","handleParticipantFilterChange","dayWeekRenderEvent","props","monthRenderEvent","agendaRenderEvent","handleNavigate","headerProps","calendarHeaderProps","handleClearAllFilters","cn"],"mappings":"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"}
package/dist/utils.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const j=["day","week","month","year","agenda","resource-day","resource-week","timeline-day","timeline-week"],J={startHour:8,endHour:18,firstDayOfWeek:1,slotDuration:30,showWeekends:!0,timeFormat:"24h",badgeVariant:"colored",showCanceledEvents:!1},K={startHour:0,endHour:24},q={startHour:8,endHour:18},Q={day:{type:"day",slotMinTime:"00:00",slotMaxTime:"24:00",slotDuration:"00:30:00",scrollTime:"08:00:00",allDaySlot:!0},week:{type:"week",slotMinTime:"00:00",slotMaxTime:"24:00",slotDuration:"00:30:00",scrollTime:"08:00:00",dayMaxEventRows:3,allDaySlot:!0},month:{type:"month",dayMaxEventRows:4,eventMaxStack:3,allDaySlot:!1},year:{type:"year",dayMaxEventRows:2,allDaySlot:!1},agenda:{type:"agenda",allDaySlot:!1},"resource-day":{type:"resource-day",slotMinTime:"00:00",slotMaxTime:"24:00",slotDuration:"00:30:00",scrollTime:"08:00:00",allDaySlot:!0},"resource-week":{type:"resource-week",slotMinTime:"00:00",slotMaxTime:"24:00",slotDuration:"00:30:00",scrollTime:"08:00:00",allDaySlot:!0},"timeline-day":{type:"timeline-day",slotDuration:"01:00:00"},"timeline-3day":{type:"timeline-3day",slotDuration:"01:00:00"},"timeline-week":{type:"timeline-week",slotDuration:"01:00:00"}},Z={blue:"#3b82f6",green:"#22c55e",red:"#ef4444",yellow:"#eab308",purple:"#a855f7",orange:"#f97316",pink:"#ec4899",teal:"#14b8a6",gray:"#6b7280",indigo:"#6366f1"},ee={blue:{bg:"bg-blue-100",text:"text-blue-800",border:"border-blue-300"},green:{bg:"bg-green-100",text:"text-green-800",border:"border-green-300"},red:{bg:"bg-red-100",text:"text-red-800",border:"border-red-300"},yellow:{bg:"bg-yellow-100",text:"text-yellow-800",border:"border-yellow-300"},purple:{bg:"bg-purple-100",text:"text-purple-800",border:"border-purple-300"},orange:{bg:"bg-orange-100",text:"text-orange-800",border:"border-orange-300"},pink:{bg:"bg-pink-100",text:"text-pink-800",border:"border-pink-300"},teal:{bg:"bg-teal-100",text:"text-teal-800",border:"border-teal-300"},gray:{bg:"bg-gray-100",text:"text-gray-800",border:"border-gray-300"},indigo:{bg:"bg-indigo-100",text:"text-indigo-800",border:"border-indigo-300"}},te={"#3b82f6":"blue","#22c55e":"green","#ef4444":"red","#eab308":"yellow","#a855f7":"purple","#f97316":"orange","#ec4899":"pink","#14b8a6":"teal","#6b7280":"gray","#6366f1":"indigo"},ne=24,re=60,U=60*1e3,W=60*U,oe=24*W,w=64,ae=32,se=56,ue=200,A=20;function g(e){const t=new Date(e);return t.setHours(0,0,0,0),t}function h(e){const t=new Date(e);return t.setHours(23,59,59,999),t}function c(e,t){const n=new Date(e);return n.setDate(n.getDate()+t),n}function ie(e,t){return c(e,-t)}function M(e,t){return e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()&&e.getDate()===t.getDate()}function F(e){return M(e,new Date)}function ce(e){return e.getDay()}function R(e){const t=e.getDay();return t===0||t===6}function d(e,t=1){const n=new Date(e),r=n.getDay(),o=(r<t?7:0)+r-t;return n.setDate(n.getDate()-o),n.setHours(0,0,0,0),n}function E(e,t=1){const n=d(e,t);return n.setDate(n.getDate()+6),n.setHours(23,59,59,999),n}function S(e,t){return c(e,t*7)}function le(e,t){return c(e,-t*7)}function ge(e){const t=new Date(Date.UTC(e.getFullYear(),e.getMonth(),e.getDate())),n=t.getUTCDay()||7;t.setUTCDate(t.getUTCDate()+4-n);const r=new Date(Date.UTC(t.getUTCFullYear(),0,1));return Math.ceil(((t.getTime()-r.getTime())/864e5+1)/7)}function fe(e,t,n=1){const r=d(e,n),o=d(t,n);return M(r,o)}function T(e){const t=new Date(e);return t.setDate(1),t.setHours(0,0,0,0),t}function p(e){const t=new Date(e.getFullYear(),e.getMonth()+1,0);return t.setHours(23,59,59,999),t}function H(e,t){const n=new Date(e);return n.setMonth(n.getMonth()+t),n}function de(e,t){return H(e,-t)}function De(e){return new Date(e.getFullYear(),e.getMonth()+1,0).getDate()}function I(e,t){return e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()}function C(e){return new Date(e.getFullYear(),0,1,0,0,0,0)}function L(e){return new Date(e.getFullYear(),11,31,23,59,59,999)}function k(e,t){const n=new Date(e);return n.setFullYear(n.getFullYear()+t),n}function me(e,t){return k(e,-t)}function ye(e,t){return e.getFullYear()===t.getFullYear()}function Y(e,t){const n=new Date(e);return n.setHours(n.getHours()+t),n}function he(e,t){const n=new Date(e);return n.setMinutes(n.getMinutes()+t),n}function Ee(e,t,n=0,r=0){const o=new Date(e);return o.setHours(t,n,r,0),o}function Te(e){return e.getHours()+e.getMinutes()/60}function pe(e,t){return e.getTime()<t.getTime()}function Me(e,t){return e.getTime()>t.getTime()}function Se(e,t,n){const r=e.getTime();return r>=t.getTime()&&r<=n.getTime()}function we(e){if(e.length!==0)return e.reduce((t,n)=>n<t?n:t)}function He(e){if(e.length!==0)return e.reduce((t,n)=>n>t?n:t)}function v(e,t){return e.getTime()-t.getTime()}function be(e,t){return Math.floor(v(e,t)/6e4)}function Ie(e,t){return Math.floor(v(e,t)/36e5)}function ke(e,t){const n=g(e),r=g(t);return Math.floor(v(n,r)/864e5)}function ve(e,t="24h"){const n=e.getHours(),r=e.getMinutes();if(t==="12h"){const o=n>=12?"PM":"AM";return`${n%12||12}:${r.toString().padStart(2,"0")} ${o}`}return`${n.toString().padStart(2,"0")}:${r.toString().padStart(2,"0")}`}function Oe(e){const t=e.getFullYear(),n=(e.getMonth()+1).toString().padStart(2,"0"),r=e.getDate().toString().padStart(2,"0");return`${t}-${n}-${r}`}function _e(e){return new Date(e)}function N(e,t){const n=[];let r=g(e);const o=g(t);for(;r<=o;)n.push(new Date(r)),r=c(r,1);return n}function Fe(e,t){const n=[];let r=new Date(e);for(;r<=t;)n.push(new Date(r)),r=Y(r,1);return n}function Re(e="en-US",t="short"){const n=new Intl.DateTimeFormat(e,{weekday:t}),r=[],o=new Date(2024,0,7);for(let a=0;a<7;a++)r.push(n.format(c(o,a)));return r}function Ce(e="en-US",t="long"){const n=new Intl.DateTimeFormat(e,{month:t}),r=[];for(let o=0;o<12;o++)r.push(n.format(new Date(2024,o,1)));return r}function xe(e){const t=[];for(let n=e.startHour;n<=e.endHour;n++)t.push(n);return t}function Ue(e,t="24h"){if(t==="12h"){const n=e>=12?"PM":"AM";return`${e%12||12} ${n}`}return`${String(e).padStart(2,"0")}:00`}function We(e,t=1){const n=d(e,t),r=[];for(let o=0;o<7;o++)r.push(c(n,o));return r}function Ae(e,t=1){const n=T(e),r=p(e),o=d(n,t),a=E(r,t),s=e.getMonth();return N(o,a).map(l=>({date:l,isCurrentMonth:l.getMonth()===s,isWeekend:l.getDay()===0||l.getDay()===6}))}function Le(e){const t=[],n=[];for(const r of e)M(r.startDate,r.endDate)?t.push(r):n.push(r);return{singleDay:t,multiDay:n}}function Ye(e,t,n){return e.filter(r=>r.startDate<=n&&r.endDate>=t)}function Ne(e,t,n){if(!n)return!0;const r=e.getDay(),o=n[r];return!o||!(o.enabled!==!1)||o.from===o.to?!1:t>=o.from&&t<o.to}function Be(e,t){const n=e.getDay(),r=t[n];return!r||!(r.enabled!==!1)||r.from===r.to?null:{from:r.from,to:r.to}}function $e(e){const t=[];for(let n=0;n<12;n++)t.push(new Date(e,n,1));return t}function B(e,t,n){const r=g(t),o=h(n);return e.filter(a=>{const s=a.startDate,u=a.endDate;return s<=o&&u>=r})}function $(e,t){return t.length===0?e:e.filter(n=>n.scheduleTypeId!==void 0&&t.includes(n.scheduleTypeId))}function V(e,t){return t.length===0?e:e.filter(n=>n.resourceId!==void 0&&t.includes(n.resourceId))}function P(e,t){if(!t.trim())return e;const n=t.toLowerCase();return e.filter(r=>{const o=r.title.toLowerCase().includes(n),a=r.description?.toLowerCase().includes(n);return o||a})}function G(e){return e.filter(t=>!t.isCanceled)}function Ve(e,t){let n=[...e];return t.dateRange&&(n=B(n,t.dateRange.startDate,t.dateRange.endDate)),t.scheduleTypeIds&&t.scheduleTypeIds.length>0&&(n=$(n,t.scheduleTypeIds)),t.resourceIds&&t.resourceIds.length>0&&(n=V(n,t.resourceIds)),t.search&&(n=P(n,t.search)),t.showCanceled||(n=G(n)),n}function Pe(e){return[...e].sort((t,n)=>t.startDate.getTime()-n.startDate.getTime())}function Ge(e){return[...e].sort((t,n)=>t.endDate.getTime()-n.endDate.getTime())}function ze(e){return[...e].sort((t,n)=>{const r=t.endDate.getTime()-t.startDate.getTime();return n.endDate.getTime()-n.startDate.getTime()-r})}function Xe(e){const t=new Map;for(const n of e){const r=g(n.startDate).toISOString(),o=t.get(r)??[];o.push(n),t.set(r,o)}return t}function je(e){const t=new Map;for(const n of e){const r=t.get(n.scheduleTypeId)??[];r.push(n),t.set(n.scheduleTypeId,r)}return t}function Je(e){const t=new Map;for(const n of e){const r=t.get(n.resourceId)??[];r.push(n),t.set(n.resourceId,r)}return t}function Ke(e,t){return e.filter(n=>{const r=g(t),o=h(t);return n.startDate<=o&&n.endDate>=r})}function qe(e){return e.filter(t=>t.isAllDay)}function Qe(e){return e.filter(t=>!t.isAllDay)}function Ze(e){return e.filter(t=>t.isMultiDay?!0:!M(t.startDate,t.endDate))}function et(e){return e.isMultiDay?!0:!M(e.startDate,e.endDate)}function tt(e){return Math.floor((e.endDate.getTime()-e.startDate.getTime())/6e4)}function nt(e,t="blue"){return e.color??t}function rt(e,t,n="blue"){if(e.color)return e.color;if(e.scheduleTypeId!==void 0&&t){const r=t.get(e.scheduleTypeId);if(r)return r}return n}function z(e,t,n=1){switch(t){case"day":case"resource-day":case"timeline-day":return{startDate:g(e),endDate:h(e)};case"week":case"resource-week":case"timeline-week":return{startDate:d(e,n),endDate:E(e,n)};case"month":{const r=T(e),o=p(e);return{startDate:d(r,n),endDate:E(o,n)}}case"timeline-3day":return{startDate:g(e),endDate:h(c(e,2))};case"year":return{startDate:C(e),endDate:L(e)};case"agenda":return{startDate:g(e),endDate:h(c(e,29))};default:return{startDate:g(e),endDate:h(e)}}}function ot(e,t){switch(t){case"day":case"resource-day":case"timeline-day":return c(e,1);case"timeline-3day":return c(e,3);case"week":case"resource-week":case"timeline-week":return S(e,1);case"month":return H(e,1);case"year":return k(e,1);case"agenda":return S(e,1);default:return c(e,1)}}function at(e,t){switch(t){case"day":case"resource-day":case"timeline-day":return c(e,-1);case"timeline-3day":return c(e,-3);case"week":case"resource-week":case"timeline-week":return S(e,-1);case"month":return H(e,-1);case"year":return k(e,-1);case"agenda":return S(e,-1);default:return c(e,-1)}}function st(){return g(new Date)}function ut(e,t=1){const n=T(e),r=p(e),o=d(n,t),a=E(r,t),s=[];let u=o;for(;u<=a;)s.push({date:new Date(u),isToday:F(u),isCurrentMonth:I(u,e),isWeekend:R(u),dayOfWeek:u.getDay()}),u=c(u,1);return s}function it(e,t=1){const n=d(e,t),r=[];for(let o=0;o<7;o++){const a=c(n,o);r.push({date:a,isToday:F(a),isCurrentMonth:I(a,e),isWeekend:R(a),dayOfWeek:a.getDay()})}return r}function ct(e){const t=C(e),n=[];for(let r=0;r<12;r++){const o=H(t,r);n.push({date:o,isToday:I(o,new Date),isCurrentMonth:!0,isWeekend:!1,dayOfWeek:o.getDay()})}return n}function lt(e,t,n=30){const r=[],o=60/n;for(let a=e;a<t;a++)for(let s=0;s<o;s++){const u=s*n;r.push({hour:a,minute:u,label:`${a.toString().padStart(2,"0")}:${u.toString().padStart(2,"0")}`})}return r}function gt(e,t,n="24h"){const r=[];for(let o=e;o<=t;o++){let a;if(n==="12h"){const s=o>=12?"PM":"AM";a=`${o%12||12} ${s}`}else a=`${o.toString().padStart(2,"0")}:00`;r.push({hour:o,label:a})}return r}function ft(e,t,n="en-US"){const r=new Intl.DateTimeFormat(n,{weekday:"short",month:"short",day:"numeric"}),o=new Intl.DateTimeFormat(n,{month:"short",day:"numeric"});switch(t){case"day":case"resource-day":case"timeline-day":return r.format(e);case"week":case"resource-week":case"timeline-week":{const a=d(e,1),s=E(e,1);return`${o.format(a)} - ${o.format(s)}`}case"month":{const a=T(e),s=p(e);return`${o.format(a)} - ${o.format(s)}`}case"year":return`Jan 1 - Dec 31, ${e.getFullYear()}`;case"agenda":{const a=T(e),s=p(e);return`${o.format(a)} - ${o.format(s)}`}default:return""}}function dt(e,t,n,r=1){const o=z(t,n,r);return e.filter(a=>a.startDate<=o.endDate&&a.endDate>=o.startDate).length}function Dt(e,t,n="en-US"){const r=new Intl.DateTimeFormat(n,{month:"long",year:"numeric"}),o=new Intl.DateTimeFormat(n,{weekday:"long",month:"long",day:"numeric",year:"numeric"});switch(t){case"day":case"resource-day":case"timeline-day":return o.format(e);case"week":case"resource-week":case"timeline-week":{const a=d(e,1),s=E(e,1),u=new Intl.DateTimeFormat(n,{month:"short"}).format(a),l=new Intl.DateTimeFormat(n,{month:"short"}).format(s),i=a.getFullYear();return u===l?`${u} ${a.getDate()} - ${s.getDate()}, ${i}`:`${u} ${a.getDate()} - ${l} ${s.getDate()}, ${i}`}case"month":return r.format(e);case"year":return e.getFullYear().toString();case"agenda":return`Agenda - ${r.format(e)}`;default:return r.format(e)}}function mt(e=1,t="short",n="en-US"){const r=new Intl.DateTimeFormat(n,{weekday:t}),o=[],a=new Date(2024,0,7);for(let s=0;s<7;s++){const u=(e+s)%7,l=c(a,u);o.push({dayOfWeek:u,label:r.format(l)})}return o}function X(e,t,n,r=w){const{startHour:o,endHour:a}=n,s=a-o,u=s*r,l=e.startDate.getHours()+e.startDate.getMinutes()/60,i=e.endDate.getHours()+e.endDate.getMinutes()/60,m=Math.max(l,o),y=Math.min(i,a),f=(m-o)/s*u,D=(y-o)/s*u,O=Math.max(D-f,A);return{top:f,height:O,left:0,width:100,zIndex:1}}function yt(e,t,n,r=w){if(e.length===0)return[];const o=[...e].sort((i,m)=>{const y=i.startDate.getTime()-m.startDate.getTime();if(y!==0)return y;const f=i.endDate.getTime()-i.startDate.getTime();return m.endDate.getTime()-m.startDate.getTime()-f}),a=[],s=[];for(const i of o){const m=i.startDate.getTime(),y=i.endDate.getTime();let f=-1;for(let b=0;b<a.length;b++){const _=a[b];if(!_)continue;const x=_[_.length-1];if(x&&x.endTime<=m){f=b;break}}f===-1&&(f=a.length,a.push([]));const D=a[f];D&&D.push({event:i,endTime:y});const O=X(i,t,n,r);s.push({event:i,position:O,column:f,columnSpan:1})}const l=100/a.length;for(const i of s)i.position.left=i.column*l,i.position.width=l*i.columnSpan,i.position.zIndex=i.column+1;return s}function ht(e,t,n,r=w,o=30){const{startHour:a,endHour:s}=n,u=s-a,l=u*r,i=e/l*u,y=(a+i)*60,f=Math.round(y/o)*o,D=new Date(t);return D.setHours(0,0,0,0),D.setMinutes(f),D}function Et(e,t,n=w){const{startHour:r,endHour:o}=t,a=o-r,s=a*n,u=e.getHours()+e.getMinutes()/60;return(Math.max(r,Math.min(u,o))-r)/a*s}function Tt(e,t){return e.startDate<t.endDate&&e.endDate>t.startDate}function pt(e){if(e.length===0)return[];const t=[...e].sort((a,s)=>a.startDate.getTime()-s.startDate.getTime()),n=[];let r=[],o=0;for(const a of t)r.length===0||a.startDate.getTime()<o?(r.push(a),o=Math.max(o,a.endDate.getTime())):(r.length>0&&n.push(r),r=[a],o=a.endDate.getTime());return r.length>0&&n.push(r),n}function Mt(e,t,n){const r=Math.max(0,Math.min(e,t)),o=Math.min(n,Math.max(e,t));return{top:r,height:o-r}}exports.CALENDAR_VIEWS=j;exports.DEFAULT_BUSINESS_HOURS=q;exports.DEFAULT_HEADER_HEIGHT=se;exports.DEFAULT_HOUR_HEIGHT=w;exports.DEFAULT_PREFERENCES=J;exports.DEFAULT_RESOURCE_WIDTH=ue;exports.DEFAULT_SLOT_HEIGHT=ae;exports.DEFAULT_VIEW_CONFIGS=Q;exports.DEFAULT_VISIBLE_HOURS=K;exports.EVENT_COLORS=Z;exports.EVENT_COLOR_CLASSES=ee;exports.HEX_TO_EVENT_COLOR=te;exports.HOURS_IN_DAY=ne;exports.MINUTES_IN_HOUR=re;exports.MIN_EVENT_HEIGHT=A;exports.MS_PER_DAY=oe;exports.MS_PER_HOUR=W;exports.MS_PER_MINUTE=U;exports.addDays=c;exports.addHours=Y;exports.addMinutes=he;exports.addMonths=H;exports.addWeeks=S;exports.addYears=k;exports.applyEventFilters=Ve;exports.calculateEventPosition=X;exports.calculateOverlappingPositions=yt;exports.calculateSelectionOverlay=Mt;exports.differenceInDays=ke;exports.differenceInHours=Ie;exports.differenceInMilliseconds=v;exports.differenceInMinutes=be;exports.eachDayOfInterval=N;exports.eachHourOfInterval=Fe;exports.endOfDay=h;exports.endOfMonth=p;exports.endOfWeek=E;exports.endOfYear=L;exports.eventsOverlap=Tt;exports.filterEventsByDateRange=B;exports.filterEventsByResource=V;exports.filterEventsByScheduleType=$;exports.filterEventsBySearch=P;exports.filterOutCanceled=G;exports.formatDateISO=Oe;exports.formatHourLabel=Ue;exports.formatTime=ve;exports.generateHourLabels=gt;exports.generateMonthCells=ut;exports.generateMonthGrid=Ae;exports.generateTimeSlots=lt;exports.generateWeekCells=it;exports.generateYearCells=ct;exports.getAllDayEvents=qe;exports.getDayOfWeek=ce;exports.getDaysInMonth=De;exports.getDecimalHours=Te;exports.getEventColor=nt;exports.getEventDurationMinutes=tt;exports.getEventsCountInView=dt;exports.getEventsForDay=Ke;exports.getEventsInRange=Ye;exports.getMonthNames=Ce;exports.getMultiDayEvents=Ze;exports.getOverlappingGroups=pt;exports.getRangeText=ft;exports.getTimedEvents=Qe;exports.getViewDateRange=z;exports.getViewTitle=Dt;exports.getVisibleHoursArray=xe;exports.getWeekDays=We;exports.getWeekNumber=ge;exports.getWeekdayHeaders=mt;exports.getWeekdayNames=Re;exports.getWorkingHoursForDay=Be;exports.getYearMonths=$e;exports.groupEventsByDate=Xe;exports.groupEventsByResource=Je;exports.groupEventsByScheduleType=je;exports.isAfter=Me;exports.isBefore=pe;exports.isBetween=Se;exports.isMultiDayEvent=et;exports.isSameDay=M;exports.isSameMonth=I;exports.isSameWeek=fe;exports.isSameYear=ye;exports.isToday=F;exports.isWeekend=R;exports.isWorkingHour=Ne;exports.maxDate=He;exports.minDate=we;exports.navigateNext=ot;exports.navigatePrev=at;exports.navigateToday=st;exports.parseISO=_e;exports.resolveEventColor=rt;exports.separateEventsByDuration=Le;exports.setTime=Ee;exports.sortEventsByDuration=ze;exports.sortEventsByEnd=Ge;exports.sortEventsByStart=Pe;exports.startOfDay=g;exports.startOfMonth=T;exports.startOfWeek=d;exports.startOfYear=C;exports.subDays=ie;exports.subMonths=de;exports.subWeeks=le;exports.subYears=me;exports.timeToY=Et;exports.yToTime=ht;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const Z=["day","week","month","year","agenda","resource-day","resource-week","timeline-day","timeline-week"],ee={startHour:8,endHour:18,firstDayOfWeek:1,slotDuration:30,showWeekends:!0,timeFormat:"24h",badgeVariant:"colored",showCanceledEvents:!1},te={startHour:0,endHour:24},ne={startHour:8,endHour:18},re={day:{type:"day",slotMinTime:"00:00",slotMaxTime:"24:00",slotDuration:"00:30:00",scrollTime:"08:00:00",allDaySlot:!0},week:{type:"week",slotMinTime:"00:00",slotMaxTime:"24:00",slotDuration:"00:30:00",scrollTime:"08:00:00",dayMaxEventRows:3,allDaySlot:!0},month:{type:"month",dayMaxEventRows:4,eventMaxStack:3,allDaySlot:!1},year:{type:"year",dayMaxEventRows:2,allDaySlot:!1},agenda:{type:"agenda",allDaySlot:!1},"resource-day":{type:"resource-day",slotMinTime:"00:00",slotMaxTime:"24:00",slotDuration:"00:30:00",scrollTime:"08:00:00",allDaySlot:!0},"resource-week":{type:"resource-week",slotMinTime:"00:00",slotMaxTime:"24:00",slotDuration:"00:30:00",scrollTime:"08:00:00",allDaySlot:!0},"timeline-day":{type:"timeline-day",slotDuration:"01:00:00"},"timeline-3day":{type:"timeline-3day",slotDuration:"01:00:00"},"timeline-week":{type:"timeline-week",slotDuration:"01:00:00"}},oe={blue:"#3b82f6",green:"#22c55e",red:"#ef4444",yellow:"#eab308",purple:"#a855f7",orange:"#f97316",pink:"#ec4899",teal:"#14b8a6",gray:"#6b7280",indigo:"#6366f1"},ae={blue:{bg:"bg-blue-100",text:"text-blue-800",border:"border-blue-300"},green:{bg:"bg-green-100",text:"text-green-800",border:"border-green-300"},red:{bg:"bg-red-100",text:"text-red-800",border:"border-red-300"},yellow:{bg:"bg-yellow-100",text:"text-yellow-800",border:"border-yellow-300"},purple:{bg:"bg-purple-100",text:"text-purple-800",border:"border-purple-300"},orange:{bg:"bg-orange-100",text:"text-orange-800",border:"border-orange-300"},pink:{bg:"bg-pink-100",text:"text-pink-800",border:"border-pink-300"},teal:{bg:"bg-teal-100",text:"text-teal-800",border:"border-teal-300"},gray:{bg:"bg-gray-100",text:"text-gray-800",border:"border-gray-300"},indigo:{bg:"bg-indigo-100",text:"text-indigo-800",border:"border-indigo-300"}},se={"#3b82f6":"blue","#22c55e":"green","#ef4444":"red","#eab308":"yellow","#a855f7":"purple","#f97316":"orange","#ec4899":"pink","#14b8a6":"teal","#6b7280":"gray","#6366f1":"indigo"},ue=24,ie=60,A=60*1e3,L=60*A,ce=24*L,b=64,le=32,ge=56,fe=200,Y=20;function f(e){const t=new Date(e);return t.setHours(0,0,0,0),t}function E(e){const t=new Date(e);return t.setHours(23,59,59,999),t}function c(e,t){const n=new Date(e);return n.setDate(n.getDate()+t),n}function de(e,t){return c(e,-t)}function S(e,t){return e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()&&e.getDate()===t.getDate()}function R(e){return S(e,new Date)}function De(e){return e.getDay()}function C(e){const t=e.getDay();return t===0||t===6}function D(e,t=1){const n=new Date(e),r=n.getDay(),o=(r<t?7:0)+r-t;return n.setDate(n.getDate()-o),n.setHours(0,0,0,0),n}function T(e,t=1){const n=D(e,t);return n.setDate(n.getDate()+6),n.setHours(23,59,59,999),n}function H(e,t){return c(e,t*7)}function me(e,t){return c(e,-t*7)}function ye(e){const t=new Date(Date.UTC(e.getFullYear(),e.getMonth(),e.getDate())),n=t.getUTCDay()||7;t.setUTCDate(t.getUTCDate()+4-n);const r=new Date(Date.UTC(t.getUTCFullYear(),0,1));return Math.ceil(((t.getTime()-r.getTime())/864e5+1)/7)}function he(e,t,n=1){const r=D(e,n),o=D(t,n);return S(r,o)}function p(e){const t=new Date(e);return t.setDate(1),t.setHours(0,0,0,0),t}function M(e){const t=new Date(e.getFullYear(),e.getMonth()+1,0);return t.setHours(23,59,59,999),t}function I(e,t){const n=new Date(e);return n.setMonth(n.getMonth()+t),n}function Ee(e,t){return I(e,-t)}function Te(e){return new Date(e.getFullYear(),e.getMonth()+1,0).getDate()}function v(e,t){return e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()}function x(e){return new Date(e.getFullYear(),0,1,0,0,0,0)}function N(e){return new Date(e.getFullYear(),11,31,23,59,59,999)}function O(e,t){const n=new Date(e);return n.setFullYear(n.getFullYear()+t),n}function pe(e,t){return O(e,-t)}function Me(e,t){return e.getFullYear()===t.getFullYear()}function $(e,t){const n=new Date(e);return n.setHours(n.getHours()+t),n}function Se(e,t){const n=new Date(e);return n.setMinutes(n.getMinutes()+t),n}function we(e,t,n=0,r=0){const o=new Date(e);return o.setHours(t,n,r,0),o}function He(e){return e.getHours()+e.getMinutes()/60}function be(e,t){return e.getTime()<t.getTime()}function Ie(e,t){return e.getTime()>t.getTime()}function ke(e,t,n){const r=e.getTime();return r>=t.getTime()&&r<=n.getTime()}function ve(e){if(e.length!==0)return e.reduce((t,n)=>n<t?n:t)}function Oe(e){if(e.length!==0)return e.reduce((t,n)=>n>t?n:t)}function _(e,t){return e.getTime()-t.getTime()}function _e(e,t){return Math.floor(_(e,t)/6e4)}function Fe(e,t){return Math.floor(_(e,t)/36e5)}function Re(e,t){const n=f(e),r=f(t);return Math.floor(_(n,r)/864e5)}function Ce(e,t="24h"){const n=e.getHours(),r=e.getMinutes();if(t==="12h"){const o=n>=12?"PM":"AM";return`${n%12||12}:${r.toString().padStart(2,"0")} ${o}`}return`${n.toString().padStart(2,"0")}:${r.toString().padStart(2,"0")}`}function xe(e){const t=e.getFullYear(),n=(e.getMonth()+1).toString().padStart(2,"0"),r=e.getDate().toString().padStart(2,"0");return`${t}-${n}-${r}`}function Ue(e){return new Date(e)}function B(e,t){const n=[];let r=f(e);const o=f(t);for(;r<=o;)n.push(new Date(r)),r=c(r,1);return n}function We(e,t){const n=[];let r=new Date(e);for(;r<=t;)n.push(new Date(r)),r=$(r,1);return n}function Ae(e="en-US",t="short"){const n=new Intl.DateTimeFormat(e,{weekday:t}),r=[],o=new Date(2024,0,7);for(let a=0;a<7;a++)r.push(n.format(c(o,a)));return r}function Le(e="en-US",t="long"){const n=new Intl.DateTimeFormat(e,{month:t}),r=[];for(let o=0;o<12;o++)r.push(n.format(new Date(2024,o,1)));return r}function Ye(e){const t=[];for(let n=e.startHour;n<=e.endHour;n++)t.push(n);return t}function Ne(e,t="24h"){if(t==="12h"){const n=e>=12?"PM":"AM";return`${e%12||12} ${n}`}return`${String(e).padStart(2,"0")}:00`}function $e(e,t=1){const n=D(e,t),r=[];for(let o=0;o<7;o++)r.push(c(n,o));return r}function Be(e,t=1){const n=p(e),r=M(e),o=D(n,t),a=T(r,t),s=e.getMonth();return B(o,a).map(l=>({date:l,isCurrentMonth:l.getMonth()===s,isWeekend:l.getDay()===0||l.getDay()===6}))}function Ve(e){const t=[],n=[];for(const r of e)S(r.startDate,r.endDate)?t.push(r):n.push(r);return{singleDay:t,multiDay:n}}function Pe(e,t,n){return e.filter(r=>r.startDate<=n&&r.endDate>=t)}function Ge(e,t,n){if(!n)return!0;const r=e.getDay(),o=n[r];return!o||!(o.enabled!==!1)||o.from===o.to?!1:t>=o.from&&t<o.to}function ze(e,t){const n=e.getDay(),r=t[n];return!r||!(r.enabled!==!1)||r.from===r.to?null:{from:r.from,to:r.to}}function Xe(e){const t=[];for(let n=0;n<12;n++)t.push(new Date(e,n,1));return t}function V(e,t,n){const r=f(t),o=E(n);return e.filter(a=>{const s=a.startDate,u=a.endDate;return s<=o&&u>=r})}function P(e,t){return t.length===0?e:e.filter(n=>n.scheduleTypeId!==void 0&&t.includes(n.scheduleTypeId))}function G(e,t){return t.length===0?e:e.filter(n=>n.resourceId!==void 0&&t.includes(n.resourceId))}function z(e,t){if(!t.trim())return e;const n=t.toLowerCase();return e.filter(r=>{const o=r.title.toLowerCase().includes(n),a=r.description?.toLowerCase().includes(n);return o||a})}function X(e){return e.filter(t=>!t.isCanceled)}function je(e,t){let n=[...e];return t.dateRange&&(n=V(n,t.dateRange.startDate,t.dateRange.endDate)),t.scheduleTypeIds&&t.scheduleTypeIds.length>0&&(n=P(n,t.scheduleTypeIds)),t.resourceIds&&t.resourceIds.length>0&&(n=G(n,t.resourceIds)),t.search&&(n=z(n,t.search)),t.showCanceled||(n=X(n)),n}function Je(e){return[...e].sort((t,n)=>t.startDate.getTime()-n.startDate.getTime())}function Ke(e){return[...e].sort((t,n)=>t.endDate.getTime()-n.endDate.getTime())}function qe(e){return[...e].sort((t,n)=>{const r=t.endDate.getTime()-t.startDate.getTime();return n.endDate.getTime()-n.startDate.getTime()-r})}function Qe(e){const t=new Map;for(const n of e){const r=f(n.startDate).toISOString(),o=t.get(r)??[];o.push(n),t.set(r,o)}return t}function Ze(e){const t=new Map;for(const n of e){const r=t.get(n.scheduleTypeId)??[];r.push(n),t.set(n.scheduleTypeId,r)}return t}function et(e){const t=new Map;for(const n of e){const r=t.get(n.resourceId)??[];r.push(n),t.set(n.resourceId,r)}return t}function tt(e,t){return e.filter(n=>{const r=f(t),o=E(t);return n.startDate<=o&&n.endDate>=r})}function nt(e){return e.filter(t=>t.isAllDay)}function rt(e){return e.filter(t=>!t.isAllDay)}function ot(e){return e.filter(t=>t.isMultiDay?!0:!S(t.startDate,t.endDate))}function at(e){return e.isMultiDay?!0:!S(e.startDate,e.endDate)}function st(e){return Math.floor((e.endDate.getTime()-e.startDate.getTime())/6e4)}function ut(e,t="blue"){return e.color??t}function it(e,t,n="blue"){if(e.color)return e.color;if(e.scheduleTypeId!==void 0&&t){const r=t.get(e.scheduleTypeId);if(r)return r}return n}function j(e,t,n=1){switch(t){case"day":case"resource-day":case"timeline-day":return{startDate:f(e),endDate:E(e)};case"week":case"resource-week":case"timeline-week":return{startDate:D(e,n),endDate:T(e,n)};case"month":{const r=p(e),o=M(e);return{startDate:D(r,n),endDate:T(o,n)}}case"timeline-3day":return{startDate:f(e),endDate:E(c(e,2))};case"year":return{startDate:x(e),endDate:N(e)};case"agenda":return{startDate:f(e),endDate:E(c(e,29))};default:return{startDate:f(e),endDate:E(e)}}}function ct(e,t){switch(t){case"day":case"resource-day":case"timeline-day":return c(e,1);case"timeline-3day":return c(e,3);case"week":case"resource-week":case"timeline-week":return H(e,1);case"month":return I(e,1);case"year":return O(e,1);case"agenda":return H(e,1);default:return c(e,1)}}function lt(e,t){switch(t){case"day":case"resource-day":case"timeline-day":return c(e,-1);case"timeline-3day":return c(e,-3);case"week":case"resource-week":case"timeline-week":return H(e,-1);case"month":return I(e,-1);case"year":return O(e,-1);case"agenda":return H(e,-1);default:return c(e,-1)}}function gt(){return f(new Date)}function ft(e,t=1){const n=p(e),r=M(e),o=D(n,t),a=T(r,t),s=[];let u=o;for(;u<=a;)s.push({date:new Date(u),isToday:R(u),isCurrentMonth:v(u,e),isWeekend:C(u),dayOfWeek:u.getDay()}),u=c(u,1);return s}function dt(e,t=1){const n=D(e,t),r=[];for(let o=0;o<7;o++){const a=c(n,o);r.push({date:a,isToday:R(a),isCurrentMonth:v(a,e),isWeekend:C(a),dayOfWeek:a.getDay()})}return r}function Dt(e){const t=x(e),n=[];for(let r=0;r<12;r++){const o=I(t,r);n.push({date:o,isToday:v(o,new Date),isCurrentMonth:!0,isWeekend:!1,dayOfWeek:o.getDay()})}return n}function mt(e,t,n=30){const r=[],o=60/n;for(let a=e;a<t;a++)for(let s=0;s<o;s++){const u=s*n;r.push({hour:a,minute:u,label:`${a.toString().padStart(2,"0")}:${u.toString().padStart(2,"0")}`})}return r}function yt(e,t,n="24h"){const r=[];for(let o=e;o<=t;o++){let a;if(n==="12h"){const s=o>=12?"PM":"AM";a=`${o%12||12} ${s}`}else a=`${o.toString().padStart(2,"0")}:00`;r.push({hour:o,label:a})}return r}function ht(e,t,n="en-US"){const r=new Intl.DateTimeFormat(n,{weekday:"short",month:"short",day:"numeric"}),o=new Intl.DateTimeFormat(n,{month:"short",day:"numeric"});switch(t){case"day":case"resource-day":case"timeline-day":return r.format(e);case"timeline-3day":{const a=f(e),s=c(e,2);return`${o.format(a)} - ${o.format(s)}`}case"week":case"resource-week":case"timeline-week":{const a=D(e,1),s=T(e,1);return`${o.format(a)} - ${o.format(s)}`}case"month":{const a=p(e),s=M(e);return`${o.format(a)} - ${o.format(s)}`}case"year":return`Jan 1 - Dec 31, ${e.getFullYear()}`;case"agenda":{const a=p(e),s=M(e);return`${o.format(a)} - ${o.format(s)}`}default:return""}}function Et(e,t,n,r=1){const o=j(t,n,r);return e.filter(a=>a.startDate<=o.endDate&&a.endDate>=o.startDate).length}function Tt(e,t,n="en-US"){const r=new Intl.DateTimeFormat(n,{month:"long",year:"numeric"}),o=new Intl.DateTimeFormat(n,{weekday:"long",month:"long",day:"numeric",year:"numeric"});switch(t){case"day":case"resource-day":case"timeline-day":return o.format(e);case"week":case"resource-week":case"timeline-week":{const a=D(e,1),s=T(e,1),u=new Intl.DateTimeFormat(n,{month:"short"}).format(a),l=new Intl.DateTimeFormat(n,{month:"short"}).format(s),i=a.getFullYear();return u===l?`${u} ${a.getDate()} - ${s.getDate()}, ${i}`:`${u} ${a.getDate()} - ${l} ${s.getDate()}, ${i}`}case"month":return r.format(e);case"year":return e.getFullYear().toString();case"agenda":return`Agenda - ${r.format(e)}`;default:return r.format(e)}}function pt(e=1,t="short",n="en-US"){const r=new Intl.DateTimeFormat(n,{weekday:t}),o=[],a=new Date(2024,0,7);for(let s=0;s<7;s++){const u=(e+s)%7,l=c(a,u);o.push({dayOfWeek:u,label:r.format(l)})}return o}function J(e,t,n,r=b){const{startHour:o,endHour:a}=n,s=a-o,u=s*r,l=e.startDate.getHours()+e.startDate.getMinutes()/60,i=e.endDate.getHours()+e.endDate.getMinutes()/60,d=Math.max(l,o),h=Math.min(i,a),m=(d-o)/s*u,y=(h-o)/s*u,g=Math.max(y-m,Y);return{top:m,height:g,left:0,width:100,zIndex:1}}function Mt(e,t,n,r=b){if(e.length===0)return[];const o=[...e].sort((i,d)=>{const h=i.startDate.getTime()-d.startDate.getTime();if(h!==0)return h;const m=i.endDate.getTime()-i.startDate.getTime();return d.endDate.getTime()-d.startDate.getTime()-m}),a=[];let s=[],u=0;for(const i of o)s.length===0||i.startDate.getTime()<u?(s.push(i),u=Math.max(u,i.endDate.getTime())):(a.push(s),s=[i],u=i.endDate.getTime());s.length>0&&a.push(s);const l=[];for(const i of a){const d=[];for(const g of i){const K=g.startDate.getTime(),q=g.endDate.getTime();let w=-1;for(let k=0;k<d.length;k++){const F=d[k];if(!F)continue;const W=F[F.length-1];if(W&&W.endTime<=K){w=k;break}}w===-1&&(w=d.length,d.push([]));const U=d[w];U&&U.push({event:g,endTime:q});const Q=J(g,t,n,r);l.push({event:g,position:Q,column:w,columnSpan:1})}const m=100/d.length,y=new Set(i.map(g=>g.id));for(const g of l)y.has(g.event.id)&&(g.position.left=g.column*m,g.position.width=m*g.columnSpan,g.position.zIndex=g.column+1)}return l}function St(e,t,n,r=b,o=30){const{startHour:a,endHour:s}=n,u=s-a,l=u*r,i=e/l*u,h=(a+i)*60,m=Math.round(h/o)*o,y=new Date(t);return y.setHours(0,0,0,0),y.setMinutes(m),y}function wt(e,t,n=b){const{startHour:r,endHour:o}=t,a=o-r,s=a*n,u=e.getHours()+e.getMinutes()/60;return(Math.max(r,Math.min(u,o))-r)/a*s}function Ht(e,t){return e.startDate<t.endDate&&e.endDate>t.startDate}function bt(e){if(e.length===0)return[];const t=[...e].sort((a,s)=>a.startDate.getTime()-s.startDate.getTime()),n=[];let r=[],o=0;for(const a of t)r.length===0||a.startDate.getTime()<o?(r.push(a),o=Math.max(o,a.endDate.getTime())):(r.length>0&&n.push(r),r=[a],o=a.endDate.getTime());return r.length>0&&n.push(r),n}function It(e,t,n){const r=Math.max(0,Math.min(e,t)),o=Math.min(n,Math.max(e,t));return{top:r,height:o-r}}exports.CALENDAR_VIEWS=Z;exports.DEFAULT_BUSINESS_HOURS=ne;exports.DEFAULT_HEADER_HEIGHT=ge;exports.DEFAULT_HOUR_HEIGHT=b;exports.DEFAULT_PREFERENCES=ee;exports.DEFAULT_RESOURCE_WIDTH=fe;exports.DEFAULT_SLOT_HEIGHT=le;exports.DEFAULT_VIEW_CONFIGS=re;exports.DEFAULT_VISIBLE_HOURS=te;exports.EVENT_COLORS=oe;exports.EVENT_COLOR_CLASSES=ae;exports.HEX_TO_EVENT_COLOR=se;exports.HOURS_IN_DAY=ue;exports.MINUTES_IN_HOUR=ie;exports.MIN_EVENT_HEIGHT=Y;exports.MS_PER_DAY=ce;exports.MS_PER_HOUR=L;exports.MS_PER_MINUTE=A;exports.addDays=c;exports.addHours=$;exports.addMinutes=Se;exports.addMonths=I;exports.addWeeks=H;exports.addYears=O;exports.applyEventFilters=je;exports.calculateEventPosition=J;exports.calculateOverlappingPositions=Mt;exports.calculateSelectionOverlay=It;exports.differenceInDays=Re;exports.differenceInHours=Fe;exports.differenceInMilliseconds=_;exports.differenceInMinutes=_e;exports.eachDayOfInterval=B;exports.eachHourOfInterval=We;exports.endOfDay=E;exports.endOfMonth=M;exports.endOfWeek=T;exports.endOfYear=N;exports.eventsOverlap=Ht;exports.filterEventsByDateRange=V;exports.filterEventsByResource=G;exports.filterEventsByScheduleType=P;exports.filterEventsBySearch=z;exports.filterOutCanceled=X;exports.formatDateISO=xe;exports.formatHourLabel=Ne;exports.formatTime=Ce;exports.generateHourLabels=yt;exports.generateMonthCells=ft;exports.generateMonthGrid=Be;exports.generateTimeSlots=mt;exports.generateWeekCells=dt;exports.generateYearCells=Dt;exports.getAllDayEvents=nt;exports.getDayOfWeek=De;exports.getDaysInMonth=Te;exports.getDecimalHours=He;exports.getEventColor=ut;exports.getEventDurationMinutes=st;exports.getEventsCountInView=Et;exports.getEventsForDay=tt;exports.getEventsInRange=Pe;exports.getMonthNames=Le;exports.getMultiDayEvents=ot;exports.getOverlappingGroups=bt;exports.getRangeText=ht;exports.getTimedEvents=rt;exports.getViewDateRange=j;exports.getViewTitle=Tt;exports.getVisibleHoursArray=Ye;exports.getWeekDays=$e;exports.getWeekNumber=ye;exports.getWeekdayHeaders=pt;exports.getWeekdayNames=Ae;exports.getWorkingHoursForDay=ze;exports.getYearMonths=Xe;exports.groupEventsByDate=Qe;exports.groupEventsByResource=et;exports.groupEventsByScheduleType=Ze;exports.isAfter=Ie;exports.isBefore=be;exports.isBetween=ke;exports.isMultiDayEvent=at;exports.isSameDay=S;exports.isSameMonth=v;exports.isSameWeek=he;exports.isSameYear=Me;exports.isToday=R;exports.isWeekend=C;exports.isWorkingHour=Ge;exports.maxDate=Oe;exports.minDate=ve;exports.navigateNext=ct;exports.navigatePrev=lt;exports.navigateToday=gt;exports.parseISO=Ue;exports.resolveEventColor=it;exports.separateEventsByDuration=Ve;exports.setTime=we;exports.sortEventsByDuration=qe;exports.sortEventsByEnd=Ke;exports.sortEventsByStart=Je;exports.startOfDay=f;exports.startOfMonth=p;exports.startOfWeek=D;exports.startOfYear=x;exports.subDays=de;exports.subMonths=Ee;exports.subWeeks=me;exports.subYears=pe;exports.timeToY=wt;exports.yToTime=St;
2
2
  //# sourceMappingURL=utils.cjs.map