@innosolutions/inno-calendar 1.0.65 → 1.0.66

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 (49) hide show
  1. package/dist/{agenda-widget-COxgmpv4.cjs → agenda-widget-BNnhQds1.cjs} +2 -2
  2. package/dist/{agenda-widget-COxgmpv4.cjs.map → agenda-widget-BNnhQds1.cjs.map} +1 -1
  3. package/dist/{agenda-widget-CD_UoYWC.js → agenda-widget-qwbBw3IK.js} +245 -245
  4. package/dist/agenda-widget-qwbBw3IK.js.map +1 -0
  5. package/dist/components/index.cjs +1 -1
  6. package/dist/components/index.mjs +2 -2
  7. package/dist/core/context/inno-calendar-provider.d.ts.map +1 -1
  8. package/dist/core/index.cjs +1 -1
  9. package/dist/core/index.mjs +147 -145
  10. package/dist/core/utils/view-storage.d.ts +21 -0
  11. package/dist/core/utils/view-storage.d.ts.map +1 -1
  12. package/dist/index.cjs +1 -1
  13. package/dist/index.mjs +201 -199
  14. package/dist/{position-utils-DpaKqYhO.js → position-utils-BzmOPdvQ.js} +294 -276
  15. package/dist/position-utils-BzmOPdvQ.js.map +1 -0
  16. package/dist/position-utils-EQTCC4tZ.cjs +2 -0
  17. package/dist/position-utils-EQTCC4tZ.cjs.map +1 -0
  18. package/dist/presets/index.cjs +1 -1
  19. package/dist/presets/index.mjs +1 -1
  20. package/dist/{slot-selection-context-D3MW4WJ7.js → slot-selection-context-CjS_VIPj.js} +72 -73
  21. package/dist/slot-selection-context-CjS_VIPj.js.map +1 -0
  22. package/dist/slot-selection-context-CmE-aWgt.cjs +2 -0
  23. package/dist/slot-selection-context-CmE-aWgt.cjs.map +1 -0
  24. package/dist/{tailwind-calendar-CzbuXRmn.js → tailwind-calendar-B6qsueM3.js} +15 -15
  25. package/dist/{tailwind-calendar-CzbuXRmn.js.map → tailwind-calendar-B6qsueM3.js.map} +1 -1
  26. package/dist/{tailwind-calendar-smlkVdSq.cjs → tailwind-calendar-KJ1XJ4gr.cjs} +2 -2
  27. package/dist/{tailwind-calendar-smlkVdSq.cjs.map → tailwind-calendar-KJ1XJ4gr.cjs.map} +1 -1
  28. package/dist/{use-calendar-mU1joTwp.js → use-calendar--JnbGA3L.js} +23 -23
  29. package/dist/{use-calendar-mU1joTwp.js.map → use-calendar--JnbGA3L.js.map} +1 -1
  30. package/dist/{use-calendar-Bd-d8oGj.cjs → use-calendar-BwqE_WNA.cjs} +2 -2
  31. package/dist/{use-calendar-Bd-d8oGj.cjs.map → use-calendar-BwqE_WNA.cjs.map} +1 -1
  32. package/dist/{use-slot-selection-CauKdLYv.js → use-slot-selection-BLCDzQzo.js} +8 -8
  33. package/dist/{use-slot-selection-CauKdLYv.js.map → use-slot-selection-BLCDzQzo.js.map} +1 -1
  34. package/dist/{use-slot-selection-CCOSsRSh.cjs → use-slot-selection-C1tk-o0j.cjs} +2 -2
  35. package/dist/{use-slot-selection-CCOSsRSh.cjs.map → use-slot-selection-C1tk-o0j.cjs.map} +1 -1
  36. package/dist/utils.cjs +1 -1
  37. package/dist/utils.mjs +52 -50
  38. package/dist/{week-view-BQXIaSUZ.js → week-view-B1KsZsC3.js} +3 -3
  39. package/dist/{week-view-BQXIaSUZ.js.map → week-view-B1KsZsC3.js.map} +1 -1
  40. package/dist/{week-view-xrKlAJos.cjs → week-view-Dv-Uz0eT.cjs} +2 -2
  41. package/dist/{week-view-xrKlAJos.cjs.map → week-view-Dv-Uz0eT.cjs.map} +1 -1
  42. package/package.json +1 -1
  43. package/dist/agenda-widget-CD_UoYWC.js.map +0 -1
  44. package/dist/position-utils-Do2ciBXl.cjs +0 -2
  45. package/dist/position-utils-Do2ciBXl.cjs.map +0 -1
  46. package/dist/position-utils-DpaKqYhO.js.map +0 -1
  47. package/dist/slot-selection-context-BlrL9b5P.cjs +0 -2
  48. package/dist/slot-selection-context-BlrL9b5P.cjs.map +0 -1
  49. package/dist/slot-selection-context-D3MW4WJ7.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"tailwind-calendar-smlkVdSq.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-KJ1XJ4gr.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,7 +1,7 @@
1
1
  import { jsx as J } from "react/jsx-runtime";
2
- import { createContext as Q, useContext as V, useState as D, useMemo as p, useCallback as s } from "react";
3
- import { d as X, aj as Y, ak as Z, S as $, U as ee, T as te, V as ne, W as se, a_ as re, aK as ae, aL as oe, aM as ce } from "./position-utils-DpaKqYhO.js";
4
- const x = Q(void 0);
2
+ import { createContext as K, useContext as V, useState as D, useMemo as p, useCallback as s } from "react";
3
+ import { d as Q, ak as Y, al as Z, T as $, V as ee, U as te, W as ne, X as se, b1 as re, aL as ae, aM as oe, aN as ce } from "./position-utils-BzmOPdvQ.js";
4
+ const x = K(void 0);
5
5
  function de({ children: t, value: n }) {
6
6
  return /* @__PURE__ */ J(x.Provider, { value: n, children: t });
7
7
  }
@@ -50,14 +50,14 @@ function he(t) {
50
50
  onEventClick: F,
51
51
  onSlotSelect: m,
52
52
  onFiltersChange: i
53
- } = t, [r, I] = D(T), [a, N] = D(() => h ?? /* @__PURE__ */ new Date()), [f, w] = D(R), [C, O] = D(() => ({
54
- ...X,
53
+ } = t, [r, N] = D(T), [a, b] = D(() => h ?? /* @__PURE__ */ new Date()), [f, w] = D(R), [C, I] = D(() => ({
54
+ ...Q,
55
55
  ...B,
56
56
  ...E
57
57
  })), g = p(
58
58
  () => Y(a, r, C.firstDayOfWeek),
59
59
  [a, r, C.firstDayOfWeek]
60
- ), b = p(
60
+ ), O = p(
61
61
  () => Z(a, r, y),
62
62
  [a, r, y]
63
63
  ), U = p(() => {
@@ -71,33 +71,33 @@ function he(t) {
71
71
  return k && (e = ne(e, k)), C.showCanceledEvents || (e = se(e)), re(e);
72
72
  }, [n, g, f, C.showCanceledEvents]), W = s(
73
73
  (e) => {
74
- I(e), S?.(e);
74
+ N(e), S?.(e);
75
75
  },
76
76
  [S]
77
77
  ), o = s(
78
78
  (e) => {
79
- N(e), P?.(e);
79
+ b(e), P?.(e);
80
80
  },
81
81
  [P]
82
- ), j = s(() => {
82
+ ), L = s(() => {
83
83
  const e = ae(a, r);
84
84
  o(e);
85
- }, [a, r, o]), L = s(() => {
85
+ }, [a, r, o]), M = s(() => {
86
86
  const e = oe(a, r);
87
87
  o(e);
88
- }, [a, r, o]), M = s(() => {
88
+ }, [a, r, o]), j = s(() => {
89
89
  o(ce());
90
- }, [o]), _ = s(
90
+ }, [o]), A = s(
91
91
  (e) => {
92
92
  o(e);
93
93
  },
94
94
  [o]
95
- ), A = s(
95
+ ), X = s(
96
96
  (e) => {
97
97
  w(e), i?.(e);
98
98
  },
99
99
  [i]
100
- ), K = s(
100
+ ), _ = s(
101
101
  (e) => {
102
102
  w((c) => {
103
103
  const l = { ...c, ...e };
@@ -110,7 +110,7 @@ function he(t) {
110
110
  w(e), i?.(e);
111
111
  }, [i]), z = s(
112
112
  (e) => {
113
- O((c) => ({
113
+ I((c) => ({
114
114
  ...c,
115
115
  ...e,
116
116
  ...E
@@ -138,7 +138,7 @@ function he(t) {
138
138
  preferences: C,
139
139
  // Computed
140
140
  filteredEvents: U,
141
- viewTitle: b,
141
+ viewTitle: O,
142
142
  // Data
143
143
  events: n,
144
144
  resources: u,
@@ -146,13 +146,13 @@ function he(t) {
146
146
  // Actions
147
147
  setView: W,
148
148
  setCurrentDate: o,
149
- goToNext: j,
150
- goToPrev: L,
151
- goToToday: M,
152
- goToDate: _,
149
+ goToNext: L,
150
+ goToPrev: M,
151
+ goToToday: j,
152
+ goToDate: A,
153
153
  // Filters
154
- setFilters: A,
155
- updateFilters: K,
154
+ setFilters: X,
155
+ updateFilters: _,
156
156
  clearFilters: q,
157
157
  // Preferences
158
158
  setPreferences: z,
@@ -172,4 +172,4 @@ export {
172
172
  fe as g,
173
173
  he as u
174
174
  };
175
- //# sourceMappingURL=use-calendar-mU1joTwp.js.map
175
+ //# sourceMappingURL=use-calendar--JnbGA3L.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-calendar-mU1joTwp.js","sources":["../src/core/context/calendar-context.tsx","../src/core/hooks/use-calendar.ts"],"sourcesContent":["/**\n * CalendarContext - React Context for Calendar State\n *\n * Provides calendar state to deeply nested components without prop drilling.\n */\n\nimport { createContext, type ReactNode, useContext } from 'react';\nimport type { UseCalendarReturn } from '../hooks/use-calendar';\n\n// ============================================================================\n// CONTEXT\n// ============================================================================\n\n/**\n * Calendar context type - generic to support any event data type\n * We use `any` here because context consumers may not know the exact type\n * Use the typed hooks below for type-safe access\n */\n// biome-ignore lint/suspicious/noExplicitAny: Context needs to be flexible for different event types\nconst CalendarContext = createContext<UseCalendarReturn<any, any, any> | undefined>(undefined);\n\n// ============================================================================\n// PROVIDER\n// ============================================================================\n\nexport interface CalendarProviderProps<\n\tTEventData = Record<string, unknown>,\n\tTScheduleTypeData = Record<string, unknown>,\n\tTResourceData = Record<string, unknown>,\n> {\n\tchildren: ReactNode;\n\tvalue: UseCalendarReturn<TEventData, TScheduleTypeData, TResourceData>;\n}\n\nexport function CalendarProvider<\n\tTEventData = Record<string, unknown>,\n\tTScheduleTypeData = Record<string, unknown>,\n\tTResourceData = Record<string, unknown>,\n>({ children, value }: CalendarProviderProps<TEventData, TScheduleTypeData, TResourceData>) {\n\treturn <CalendarContext.Provider value={value}>{children}</CalendarContext.Provider>;\n}\n\n// ============================================================================\n// HOOKS\n// ============================================================================\n\n/**\n * Get the full calendar context (throws if not in provider)\n */\nexport function useCalendarContext<\n\tTEventData = Record<string, unknown>,\n\tTScheduleTypeData = Record<string, unknown>,\n\tTResourceData = Record<string, unknown>,\n>(): UseCalendarReturn<TEventData, TScheduleTypeData, TResourceData> {\n\tconst context = useContext(CalendarContext);\n\tif (!context) {\n\t\tthrow new Error('useCalendarContext must be used within a CalendarProvider');\n\t}\n\treturn context as UseCalendarReturn<TEventData, TScheduleTypeData, TResourceData>;\n}\n\n/**\n * Get the calendar context or undefined (safe version)\n */\nexport function useOptionalCalendarContext<\n\tTEventData = Record<string, unknown>,\n\tTScheduleTypeData = Record<string, unknown>,\n\tTResourceData = Record<string, unknown>,\n>(): UseCalendarReturn<TEventData, TScheduleTypeData, TResourceData> | undefined {\n\tconst context = useContext(CalendarContext);\n\treturn context as UseCalendarReturn<TEventData, TScheduleTypeData, TResourceData> | undefined;\n}\n\n// ============================================================================\n// CONVENIENCE HOOKS\n// ============================================================================\n\n/**\n * Get current view\n */\nexport function useCalendarView() {\n\tconst { view, setView } = useCalendarContext();\n\treturn { view, setView };\n}\n\n/**\n * Get current date and navigation\n */\nexport function useCalendarDate() {\n\tconst { currentDate, setCurrentDate, goToNext, goToPrev, goToToday, goToDate } =\n\t\tuseCalendarContext();\n\treturn { currentDate, setCurrentDate, goToNext, goToPrev, goToToday, goToDate };\n}\n\n/**\n * Get filtered events\n */\nexport function useCalendarEvents<TEventData = Record<string, unknown>>() {\n\tconst { events, filteredEvents } = useCalendarContext<TEventData>();\n\treturn { events, filteredEvents };\n}\n\n/**\n * Get filters\n */\nexport function useCalendarFilters() {\n\tconst { filters, setFilters, updateFilters, clearFilters } = useCalendarContext();\n\treturn { filters, setFilters, updateFilters, clearFilters };\n}\n\n/**\n * Get preferences\n */\nexport function useCalendarPreferences() {\n\tconst { preferences, setPreferences } = useCalendarContext();\n\treturn { preferences, setPreferences };\n}\n\n// ============================================================================\n// ALIASES (for agenda-v2 naming convention compatibility)\n// ============================================================================\n\n/**\n * Alias for useCalendarContext - matches agenda-v2 naming convention\n */\nexport { useCalendarContext as useCalendar };\n\n/**\n * Alias for useOptionalCalendarContext - matches agenda-v2 naming convention\n */\nexport { useOptionalCalendarContext as useOptionalCalendar };\n","/**\n * useCalendar - Main Calendar Hook\n *\n * This hook provides all the state and methods needed to build a calendar.\n * It is fully generic, allowing consumers to define their own event data types.\n *\n * @example\n * ```tsx\n * interface MyEventData {\n * projectId: number;\n * priority: 'low' | 'medium' | 'high';\n * }\n *\n * const calendar = useCalendar<MyEventData>({\n * events: myEvents,\n * onEventClick: (event) => {\n * console.log(event.data?.projectId);\n * },\n * });\n * ```\n */\n\nimport { useCallback, useMemo, useState } from 'react';\nimport { DEFAULT_PREFERENCES } from '../constants';\nimport type {\n\tCalendarEvent,\n\tICalendarFilters,\n\tICalendarPreferences,\n\tIDateRange,\n\tIResource,\n\tIScheduleType,\n\tISelectionResult,\n\tTCalendarView,\n} from '../types';\nimport {\n\tfilterEventsByDateRange,\n\tfilterEventsByResource,\n\tfilterEventsByScheduleType,\n\tfilterEventsBySearch,\n\tfilterOutCanceled,\n\tsortEventsByStart,\n} from '../utils/event-utils';\nimport {\n\tgetViewDateRange,\n\tgetViewTitle,\n\tnavigateNext,\n\tnavigatePrev,\n\tnavigateToday,\n} from '../utils/grid-utils';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * Options for useCalendar hook\n */\nexport interface UseCalendarOptions<\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\n\t/** Available resources (for resource views) */\n\tresources?: IResource<TResourceData>[] | undefined;\n\n\t/** Available schedule types */\n\tscheduleTypes?: IScheduleType<TScheduleTypeData>[] | undefined;\n\n\t/** Initial view */\n\tinitialView?: TCalendarView | undefined;\n\n\t/** Initial date */\n\tinitialDate?: Date | undefined;\n\n\t/** Initial filters */\n\tinitialFilters?: ICalendarFilters | undefined;\n\n\t/** User preferences */\n\tpreferences?: Partial<ICalendarPreferences> | undefined;\n\n\t/** Locked preferences (cannot be changed by user) */\n\tlockedPreferences?: Partial<ICalendarPreferences> | undefined;\n\n\t/** Locale for formatting */\n\tlocale?: string | undefined;\n\n\t/** Callback when view changes */\n\tonViewChange?: ((view: TCalendarView) => void) | undefined;\n\n\t/** Callback when date changes */\n\tonDateChange?: ((date: Date) => void) | undefined;\n\n\t/** Callback when event is clicked */\n\tonEventClick?: ((event: CalendarEvent<TEventData>) => void) | undefined;\n\n\t/** Callback when slot is selected */\n\tonSlotSelect?: ((selection: ISelectionResult) => void) | undefined;\n\n\t/** Callback when filters change */\n\tonFiltersChange?: ((filters: ICalendarFilters) => void) | undefined;\n}\n\n/**\n * Return type for useCalendar hook\n */\nexport interface UseCalendarReturn<\n\tTEventData = Record<string, unknown>,\n\tTScheduleTypeData = Record<string, unknown>,\n\tTResourceData = Record<string, unknown>,\n> {\n\t// State\n\tview: TCalendarView;\n\tcurrentDate: Date;\n\tdateRange: IDateRange;\n\tfilters: ICalendarFilters;\n\tpreferences: ICalendarPreferences;\n\n\t// Computed\n\tfilteredEvents: CalendarEvent<TEventData>[];\n\tviewTitle: string;\n\n\t// Data\n\tevents: CalendarEvent<TEventData>[];\n\tresources: IResource<TResourceData>[];\n\tscheduleTypes: IScheduleType<TScheduleTypeData>[];\n\n\t// Actions\n\tsetView: (view: TCalendarView) => void;\n\tsetCurrentDate: (date: Date) => void;\n\tgoToNext: () => void;\n\tgoToPrev: () => void;\n\tgoToToday: () => void;\n\tgoToDate: (date: Date) => void;\n\n\t// Filters\n\tsetFilters: (filters: ICalendarFilters) => void;\n\tupdateFilters: (updates: Partial<ICalendarFilters>) => void;\n\tclearFilters: () => void;\n\n\t// Preferences\n\tsetPreferences: (prefs: Partial<ICalendarPreferences>) => void;\n\n\t// Event handlers\n\thandleEventClick: (event: CalendarEvent<TEventData>) => void;\n\thandleSlotSelect: (selection: ISelectionResult) => void;\n}\n\n// ============================================================================\n// HOOK\n// ============================================================================\n\nexport function useCalendar<\n\tTEventData = Record<string, unknown>,\n\tTScheduleTypeData = Record<string, unknown>,\n\tTResourceData = Record<string, unknown>,\n>(\n\toptions: UseCalendarOptions<TEventData, TScheduleTypeData, TResourceData>\n): UseCalendarReturn<TEventData, TScheduleTypeData, TResourceData> {\n\tconst {\n\t\tevents,\n\t\tresources = [],\n\t\tscheduleTypes = [],\n\t\tinitialView = 'week',\n\t\tinitialDate,\n\t\tinitialFilters = {},\n\t\tpreferences: userPreferences = {},\n\t\tlockedPreferences = {},\n\t\tlocale = 'en-US',\n\t\tonViewChange,\n\t\tonDateChange,\n\t\tonEventClick,\n\t\tonSlotSelect,\n\t\tonFiltersChange,\n\t} = options;\n\n\t// ========================================================================\n\t// STATE\n\t// ========================================================================\n\n\tconst [view, setViewState] = useState<TCalendarView>(initialView);\n\tconst [currentDate, setCurrentDateState] = useState<Date>(() => initialDate ?? new Date());\n\tconst [filters, setFiltersState] = useState<ICalendarFilters>(initialFilters);\n\tconst [preferences, setPreferencesState] = useState<ICalendarPreferences>(() => ({\n\t\t...DEFAULT_PREFERENCES,\n\t\t...userPreferences,\n\t\t...lockedPreferences,\n\t}));\n\n\t// ========================================================================\n\t// COMPUTED\n\t// ========================================================================\n\n\tconst dateRange = useMemo(\n\t\t() => getViewDateRange(currentDate, view, preferences.firstDayOfWeek),\n\t\t[currentDate, view, preferences.firstDayOfWeek]\n\t);\n\n\tconst viewTitle = useMemo(\n\t\t() => getViewTitle(currentDate, view, locale),\n\t\t[currentDate, view, locale]\n\t);\n\n\tconst filteredEvents = useMemo(() => {\n\t\tlet result = [...events];\n\n\t\t// Filter by date range\n\t\tresult = filterEventsByDateRange(result, dateRange.startDate, dateRange.endDate);\n\n\t\t// Filter by schedule types\n\t\tconst scheduleTypeIds = filters.scheduleTypeIds;\n\t\tif (scheduleTypeIds && scheduleTypeIds.length > 0) {\n\t\t\tresult = filterEventsByScheduleType(result, scheduleTypeIds);\n\t\t}\n\n\t\t// Filter by resources\n\t\tconst resourceIds = filters.resourceIds;\n\t\tif (resourceIds && resourceIds.length > 0) {\n\t\t\tresult = filterEventsByResource(result, resourceIds);\n\t\t}\n\n\t\t// Filter by search\n\t\tconst search = filters.search;\n\t\tif (search) {\n\t\t\tresult = filterEventsBySearch(result, search);\n\t\t}\n\n\t\t// Filter canceled\n\t\tif (!preferences.showCanceledEvents) {\n\t\t\tresult = filterOutCanceled(result);\n\t\t}\n\n\t\t// Sort by start date\n\t\treturn sortEventsByStart(result);\n\t}, [events, dateRange, filters, preferences.showCanceledEvents]);\n\n\t// ========================================================================\n\t// ACTIONS\n\t// ========================================================================\n\n\tconst setView = useCallback(\n\t\t(newView: TCalendarView) => {\n\t\t\tsetViewState(newView);\n\t\t\tonViewChange?.(newView);\n\t\t},\n\t\t[onViewChange]\n\t);\n\n\tconst setCurrentDate = useCallback(\n\t\t(date: Date) => {\n\t\t\tsetCurrentDateState(date);\n\t\t\tonDateChange?.(date);\n\t\t},\n\t\t[onDateChange]\n\t);\n\n\tconst goToNext = useCallback(() => {\n\t\tconst newDate = navigateNext(currentDate, view);\n\t\tsetCurrentDate(newDate);\n\t}, [currentDate, view, setCurrentDate]);\n\n\tconst goToPrev = useCallback(() => {\n\t\tconst newDate = navigatePrev(currentDate, view);\n\t\tsetCurrentDate(newDate);\n\t}, [currentDate, view, setCurrentDate]);\n\n\tconst goToToday = useCallback(() => {\n\t\tsetCurrentDate(navigateToday());\n\t}, [setCurrentDate]);\n\n\tconst goToDate = useCallback(\n\t\t(date: Date) => {\n\t\t\tsetCurrentDate(date);\n\t\t},\n\t\t[setCurrentDate]\n\t);\n\n\t// ========================================================================\n\t// FILTERS\n\t// ========================================================================\n\n\tconst setFilters = useCallback(\n\t\t(newFilters: ICalendarFilters) => {\n\t\t\tsetFiltersState(newFilters);\n\t\t\tonFiltersChange?.(newFilters);\n\t\t},\n\t\t[onFiltersChange]\n\t);\n\n\tconst updateFilters = useCallback(\n\t\t(updates: Partial<ICalendarFilters>) => {\n\t\t\tsetFiltersState((prev) => {\n\t\t\t\tconst next = { ...prev, ...updates };\n\t\t\t\tonFiltersChange?.(next);\n\t\t\t\treturn next;\n\t\t\t});\n\t\t},\n\t\t[onFiltersChange]\n\t);\n\n\tconst clearFilters = useCallback(() => {\n\t\tconst emptyFilters: ICalendarFilters = {};\n\t\tsetFiltersState(emptyFilters);\n\t\tonFiltersChange?.(emptyFilters);\n\t}, [onFiltersChange]);\n\n\t// ========================================================================\n\t// PREFERENCES\n\t// ========================================================================\n\n\tconst setPreferences = useCallback(\n\t\t(prefs: Partial<ICalendarPreferences>) => {\n\t\t\tsetPreferencesState((prev) => ({\n\t\t\t\t...prev,\n\t\t\t\t...prefs,\n\t\t\t\t...lockedPreferences, // Locked prefs always override\n\t\t\t}));\n\t\t},\n\t\t[lockedPreferences]\n\t);\n\n\t// ========================================================================\n\t// EVENT HANDLERS\n\t// ========================================================================\n\n\tconst handleEventClick = useCallback(\n\t\t(event: CalendarEvent<TEventData>) => {\n\t\t\tonEventClick?.(event);\n\t\t},\n\t\t[onEventClick]\n\t);\n\n\tconst handleSlotSelect = useCallback(\n\t\t(selection: ISelectionResult) => {\n\t\t\tonSlotSelect?.(selection);\n\t\t},\n\t\t[onSlotSelect]\n\t);\n\n\t// ========================================================================\n\t// RETURN\n\t// ========================================================================\n\n\treturn {\n\t\t// State\n\t\tview,\n\t\tcurrentDate,\n\t\tdateRange,\n\t\tfilters,\n\t\tpreferences,\n\n\t\t// Computed\n\t\tfilteredEvents,\n\t\tviewTitle,\n\n\t\t// Data\n\t\tevents,\n\t\tresources,\n\t\tscheduleTypes,\n\n\t\t// Actions\n\t\tsetView,\n\t\tsetCurrentDate,\n\t\tgoToNext,\n\t\tgoToPrev,\n\t\tgoToToday,\n\t\tgoToDate,\n\n\t\t// Filters\n\t\tsetFilters,\n\t\tupdateFilters,\n\t\tclearFilters,\n\n\t\t// Preferences\n\t\tsetPreferences,\n\n\t\t// Event handlers\n\t\thandleEventClick,\n\t\thandleSlotSelect,\n\t};\n}\n"],"names":["CalendarContext","createContext","CalendarProvider","children","value","jsx","useCalendarContext","context","useContext","useOptionalCalendarContext","useCalendarView","view","setView","useCalendarDate","currentDate","setCurrentDate","goToNext","goToPrev","goToToday","goToDate","useCalendarEvents","events","filteredEvents","useCalendarFilters","filters","setFilters","updateFilters","clearFilters","useCalendarPreferences","preferences","setPreferences","useCalendar","options","resources","scheduleTypes","initialView","initialDate","initialFilters","userPreferences","lockedPreferences","locale","onViewChange","onDateChange","onEventClick","onSlotSelect","onFiltersChange","setViewState","useState","setCurrentDateState","setFiltersState","setPreferencesState","DEFAULT_PREFERENCES","dateRange","useMemo","getViewDateRange","viewTitle","getViewTitle","result","filterEventsByDateRange","scheduleTypeIds","filterEventsByScheduleType","resourceIds","filterEventsByResource","search","filterEventsBySearch","filterOutCanceled","sortEventsByStart","useCallback","newView","date","newDate","navigateNext","navigatePrev","navigateToday","newFilters","updates","prev","next","emptyFilters","prefs","handleEventClick","event","handleSlotSelect","selection"],"mappings":"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"}
1
+ {"version":3,"file":"use-calendar--JnbGA3L.js","sources":["../src/core/context/calendar-context.tsx","../src/core/hooks/use-calendar.ts"],"sourcesContent":["/**\n * CalendarContext - React Context for Calendar State\n *\n * Provides calendar state to deeply nested components without prop drilling.\n */\n\nimport { createContext, type ReactNode, useContext } from 'react';\nimport type { UseCalendarReturn } from '../hooks/use-calendar';\n\n// ============================================================================\n// CONTEXT\n// ============================================================================\n\n/**\n * Calendar context type - generic to support any event data type\n * We use `any` here because context consumers may not know the exact type\n * Use the typed hooks below for type-safe access\n */\n// biome-ignore lint/suspicious/noExplicitAny: Context needs to be flexible for different event types\nconst CalendarContext = createContext<UseCalendarReturn<any, any, any> | undefined>(undefined);\n\n// ============================================================================\n// PROVIDER\n// ============================================================================\n\nexport interface CalendarProviderProps<\n\tTEventData = Record<string, unknown>,\n\tTScheduleTypeData = Record<string, unknown>,\n\tTResourceData = Record<string, unknown>,\n> {\n\tchildren: ReactNode;\n\tvalue: UseCalendarReturn<TEventData, TScheduleTypeData, TResourceData>;\n}\n\nexport function CalendarProvider<\n\tTEventData = Record<string, unknown>,\n\tTScheduleTypeData = Record<string, unknown>,\n\tTResourceData = Record<string, unknown>,\n>({ children, value }: CalendarProviderProps<TEventData, TScheduleTypeData, TResourceData>) {\n\treturn <CalendarContext.Provider value={value}>{children}</CalendarContext.Provider>;\n}\n\n// ============================================================================\n// HOOKS\n// ============================================================================\n\n/**\n * Get the full calendar context (throws if not in provider)\n */\nexport function useCalendarContext<\n\tTEventData = Record<string, unknown>,\n\tTScheduleTypeData = Record<string, unknown>,\n\tTResourceData = Record<string, unknown>,\n>(): UseCalendarReturn<TEventData, TScheduleTypeData, TResourceData> {\n\tconst context = useContext(CalendarContext);\n\tif (!context) {\n\t\tthrow new Error('useCalendarContext must be used within a CalendarProvider');\n\t}\n\treturn context as UseCalendarReturn<TEventData, TScheduleTypeData, TResourceData>;\n}\n\n/**\n * Get the calendar context or undefined (safe version)\n */\nexport function useOptionalCalendarContext<\n\tTEventData = Record<string, unknown>,\n\tTScheduleTypeData = Record<string, unknown>,\n\tTResourceData = Record<string, unknown>,\n>(): UseCalendarReturn<TEventData, TScheduleTypeData, TResourceData> | undefined {\n\tconst context = useContext(CalendarContext);\n\treturn context as UseCalendarReturn<TEventData, TScheduleTypeData, TResourceData> | undefined;\n}\n\n// ============================================================================\n// CONVENIENCE HOOKS\n// ============================================================================\n\n/**\n * Get current view\n */\nexport function useCalendarView() {\n\tconst { view, setView } = useCalendarContext();\n\treturn { view, setView };\n}\n\n/**\n * Get current date and navigation\n */\nexport function useCalendarDate() {\n\tconst { currentDate, setCurrentDate, goToNext, goToPrev, goToToday, goToDate } =\n\t\tuseCalendarContext();\n\treturn { currentDate, setCurrentDate, goToNext, goToPrev, goToToday, goToDate };\n}\n\n/**\n * Get filtered events\n */\nexport function useCalendarEvents<TEventData = Record<string, unknown>>() {\n\tconst { events, filteredEvents } = useCalendarContext<TEventData>();\n\treturn { events, filteredEvents };\n}\n\n/**\n * Get filters\n */\nexport function useCalendarFilters() {\n\tconst { filters, setFilters, updateFilters, clearFilters } = useCalendarContext();\n\treturn { filters, setFilters, updateFilters, clearFilters };\n}\n\n/**\n * Get preferences\n */\nexport function useCalendarPreferences() {\n\tconst { preferences, setPreferences } = useCalendarContext();\n\treturn { preferences, setPreferences };\n}\n\n// ============================================================================\n// ALIASES (for agenda-v2 naming convention compatibility)\n// ============================================================================\n\n/**\n * Alias for useCalendarContext - matches agenda-v2 naming convention\n */\nexport { useCalendarContext as useCalendar };\n\n/**\n * Alias for useOptionalCalendarContext - matches agenda-v2 naming convention\n */\nexport { useOptionalCalendarContext as useOptionalCalendar };\n","/**\n * useCalendar - Main Calendar Hook\n *\n * This hook provides all the state and methods needed to build a calendar.\n * It is fully generic, allowing consumers to define their own event data types.\n *\n * @example\n * ```tsx\n * interface MyEventData {\n * projectId: number;\n * priority: 'low' | 'medium' | 'high';\n * }\n *\n * const calendar = useCalendar<MyEventData>({\n * events: myEvents,\n * onEventClick: (event) => {\n * console.log(event.data?.projectId);\n * },\n * });\n * ```\n */\n\nimport { useCallback, useMemo, useState } from 'react';\nimport { DEFAULT_PREFERENCES } from '../constants';\nimport type {\n\tCalendarEvent,\n\tICalendarFilters,\n\tICalendarPreferences,\n\tIDateRange,\n\tIResource,\n\tIScheduleType,\n\tISelectionResult,\n\tTCalendarView,\n} from '../types';\nimport {\n\tfilterEventsByDateRange,\n\tfilterEventsByResource,\n\tfilterEventsByScheduleType,\n\tfilterEventsBySearch,\n\tfilterOutCanceled,\n\tsortEventsByStart,\n} from '../utils/event-utils';\nimport {\n\tgetViewDateRange,\n\tgetViewTitle,\n\tnavigateNext,\n\tnavigatePrev,\n\tnavigateToday,\n} from '../utils/grid-utils';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * Options for useCalendar hook\n */\nexport interface UseCalendarOptions<\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\n\t/** Available resources (for resource views) */\n\tresources?: IResource<TResourceData>[] | undefined;\n\n\t/** Available schedule types */\n\tscheduleTypes?: IScheduleType<TScheduleTypeData>[] | undefined;\n\n\t/** Initial view */\n\tinitialView?: TCalendarView | undefined;\n\n\t/** Initial date */\n\tinitialDate?: Date | undefined;\n\n\t/** Initial filters */\n\tinitialFilters?: ICalendarFilters | undefined;\n\n\t/** User preferences */\n\tpreferences?: Partial<ICalendarPreferences> | undefined;\n\n\t/** Locked preferences (cannot be changed by user) */\n\tlockedPreferences?: Partial<ICalendarPreferences> | undefined;\n\n\t/** Locale for formatting */\n\tlocale?: string | undefined;\n\n\t/** Callback when view changes */\n\tonViewChange?: ((view: TCalendarView) => void) | undefined;\n\n\t/** Callback when date changes */\n\tonDateChange?: ((date: Date) => void) | undefined;\n\n\t/** Callback when event is clicked */\n\tonEventClick?: ((event: CalendarEvent<TEventData>) => void) | undefined;\n\n\t/** Callback when slot is selected */\n\tonSlotSelect?: ((selection: ISelectionResult) => void) | undefined;\n\n\t/** Callback when filters change */\n\tonFiltersChange?: ((filters: ICalendarFilters) => void) | undefined;\n}\n\n/**\n * Return type for useCalendar hook\n */\nexport interface UseCalendarReturn<\n\tTEventData = Record<string, unknown>,\n\tTScheduleTypeData = Record<string, unknown>,\n\tTResourceData = Record<string, unknown>,\n> {\n\t// State\n\tview: TCalendarView;\n\tcurrentDate: Date;\n\tdateRange: IDateRange;\n\tfilters: ICalendarFilters;\n\tpreferences: ICalendarPreferences;\n\n\t// Computed\n\tfilteredEvents: CalendarEvent<TEventData>[];\n\tviewTitle: string;\n\n\t// Data\n\tevents: CalendarEvent<TEventData>[];\n\tresources: IResource<TResourceData>[];\n\tscheduleTypes: IScheduleType<TScheduleTypeData>[];\n\n\t// Actions\n\tsetView: (view: TCalendarView) => void;\n\tsetCurrentDate: (date: Date) => void;\n\tgoToNext: () => void;\n\tgoToPrev: () => void;\n\tgoToToday: () => void;\n\tgoToDate: (date: Date) => void;\n\n\t// Filters\n\tsetFilters: (filters: ICalendarFilters) => void;\n\tupdateFilters: (updates: Partial<ICalendarFilters>) => void;\n\tclearFilters: () => void;\n\n\t// Preferences\n\tsetPreferences: (prefs: Partial<ICalendarPreferences>) => void;\n\n\t// Event handlers\n\thandleEventClick: (event: CalendarEvent<TEventData>) => void;\n\thandleSlotSelect: (selection: ISelectionResult) => void;\n}\n\n// ============================================================================\n// HOOK\n// ============================================================================\n\nexport function useCalendar<\n\tTEventData = Record<string, unknown>,\n\tTScheduleTypeData = Record<string, unknown>,\n\tTResourceData = Record<string, unknown>,\n>(\n\toptions: UseCalendarOptions<TEventData, TScheduleTypeData, TResourceData>\n): UseCalendarReturn<TEventData, TScheduleTypeData, TResourceData> {\n\tconst {\n\t\tevents,\n\t\tresources = [],\n\t\tscheduleTypes = [],\n\t\tinitialView = 'week',\n\t\tinitialDate,\n\t\tinitialFilters = {},\n\t\tpreferences: userPreferences = {},\n\t\tlockedPreferences = {},\n\t\tlocale = 'en-US',\n\t\tonViewChange,\n\t\tonDateChange,\n\t\tonEventClick,\n\t\tonSlotSelect,\n\t\tonFiltersChange,\n\t} = options;\n\n\t// ========================================================================\n\t// STATE\n\t// ========================================================================\n\n\tconst [view, setViewState] = useState<TCalendarView>(initialView);\n\tconst [currentDate, setCurrentDateState] = useState<Date>(() => initialDate ?? new Date());\n\tconst [filters, setFiltersState] = useState<ICalendarFilters>(initialFilters);\n\tconst [preferences, setPreferencesState] = useState<ICalendarPreferences>(() => ({\n\t\t...DEFAULT_PREFERENCES,\n\t\t...userPreferences,\n\t\t...lockedPreferences,\n\t}));\n\n\t// ========================================================================\n\t// COMPUTED\n\t// ========================================================================\n\n\tconst dateRange = useMemo(\n\t\t() => getViewDateRange(currentDate, view, preferences.firstDayOfWeek),\n\t\t[currentDate, view, preferences.firstDayOfWeek]\n\t);\n\n\tconst viewTitle = useMemo(\n\t\t() => getViewTitle(currentDate, view, locale),\n\t\t[currentDate, view, locale]\n\t);\n\n\tconst filteredEvents = useMemo(() => {\n\t\tlet result = [...events];\n\n\t\t// Filter by date range\n\t\tresult = filterEventsByDateRange(result, dateRange.startDate, dateRange.endDate);\n\n\t\t// Filter by schedule types\n\t\tconst scheduleTypeIds = filters.scheduleTypeIds;\n\t\tif (scheduleTypeIds && scheduleTypeIds.length > 0) {\n\t\t\tresult = filterEventsByScheduleType(result, scheduleTypeIds);\n\t\t}\n\n\t\t// Filter by resources\n\t\tconst resourceIds = filters.resourceIds;\n\t\tif (resourceIds && resourceIds.length > 0) {\n\t\t\tresult = filterEventsByResource(result, resourceIds);\n\t\t}\n\n\t\t// Filter by search\n\t\tconst search = filters.search;\n\t\tif (search) {\n\t\t\tresult = filterEventsBySearch(result, search);\n\t\t}\n\n\t\t// Filter canceled\n\t\tif (!preferences.showCanceledEvents) {\n\t\t\tresult = filterOutCanceled(result);\n\t\t}\n\n\t\t// Sort by start date\n\t\treturn sortEventsByStart(result);\n\t}, [events, dateRange, filters, preferences.showCanceledEvents]);\n\n\t// ========================================================================\n\t// ACTIONS\n\t// ========================================================================\n\n\tconst setView = useCallback(\n\t\t(newView: TCalendarView) => {\n\t\t\tsetViewState(newView);\n\t\t\tonViewChange?.(newView);\n\t\t},\n\t\t[onViewChange]\n\t);\n\n\tconst setCurrentDate = useCallback(\n\t\t(date: Date) => {\n\t\t\tsetCurrentDateState(date);\n\t\t\tonDateChange?.(date);\n\t\t},\n\t\t[onDateChange]\n\t);\n\n\tconst goToNext = useCallback(() => {\n\t\tconst newDate = navigateNext(currentDate, view);\n\t\tsetCurrentDate(newDate);\n\t}, [currentDate, view, setCurrentDate]);\n\n\tconst goToPrev = useCallback(() => {\n\t\tconst newDate = navigatePrev(currentDate, view);\n\t\tsetCurrentDate(newDate);\n\t}, [currentDate, view, setCurrentDate]);\n\n\tconst goToToday = useCallback(() => {\n\t\tsetCurrentDate(navigateToday());\n\t}, [setCurrentDate]);\n\n\tconst goToDate = useCallback(\n\t\t(date: Date) => {\n\t\t\tsetCurrentDate(date);\n\t\t},\n\t\t[setCurrentDate]\n\t);\n\n\t// ========================================================================\n\t// FILTERS\n\t// ========================================================================\n\n\tconst setFilters = useCallback(\n\t\t(newFilters: ICalendarFilters) => {\n\t\t\tsetFiltersState(newFilters);\n\t\t\tonFiltersChange?.(newFilters);\n\t\t},\n\t\t[onFiltersChange]\n\t);\n\n\tconst updateFilters = useCallback(\n\t\t(updates: Partial<ICalendarFilters>) => {\n\t\t\tsetFiltersState((prev) => {\n\t\t\t\tconst next = { ...prev, ...updates };\n\t\t\t\tonFiltersChange?.(next);\n\t\t\t\treturn next;\n\t\t\t});\n\t\t},\n\t\t[onFiltersChange]\n\t);\n\n\tconst clearFilters = useCallback(() => {\n\t\tconst emptyFilters: ICalendarFilters = {};\n\t\tsetFiltersState(emptyFilters);\n\t\tonFiltersChange?.(emptyFilters);\n\t}, [onFiltersChange]);\n\n\t// ========================================================================\n\t// PREFERENCES\n\t// ========================================================================\n\n\tconst setPreferences = useCallback(\n\t\t(prefs: Partial<ICalendarPreferences>) => {\n\t\t\tsetPreferencesState((prev) => ({\n\t\t\t\t...prev,\n\t\t\t\t...prefs,\n\t\t\t\t...lockedPreferences, // Locked prefs always override\n\t\t\t}));\n\t\t},\n\t\t[lockedPreferences]\n\t);\n\n\t// ========================================================================\n\t// EVENT HANDLERS\n\t// ========================================================================\n\n\tconst handleEventClick = useCallback(\n\t\t(event: CalendarEvent<TEventData>) => {\n\t\t\tonEventClick?.(event);\n\t\t},\n\t\t[onEventClick]\n\t);\n\n\tconst handleSlotSelect = useCallback(\n\t\t(selection: ISelectionResult) => {\n\t\t\tonSlotSelect?.(selection);\n\t\t},\n\t\t[onSlotSelect]\n\t);\n\n\t// ========================================================================\n\t// RETURN\n\t// ========================================================================\n\n\treturn {\n\t\t// State\n\t\tview,\n\t\tcurrentDate,\n\t\tdateRange,\n\t\tfilters,\n\t\tpreferences,\n\n\t\t// Computed\n\t\tfilteredEvents,\n\t\tviewTitle,\n\n\t\t// Data\n\t\tevents,\n\t\tresources,\n\t\tscheduleTypes,\n\n\t\t// Actions\n\t\tsetView,\n\t\tsetCurrentDate,\n\t\tgoToNext,\n\t\tgoToPrev,\n\t\tgoToToday,\n\t\tgoToDate,\n\n\t\t// Filters\n\t\tsetFilters,\n\t\tupdateFilters,\n\t\tclearFilters,\n\n\t\t// Preferences\n\t\tsetPreferences,\n\n\t\t// Event handlers\n\t\thandleEventClick,\n\t\thandleSlotSelect,\n\t};\n}\n"],"names":["CalendarContext","createContext","CalendarProvider","children","value","jsx","useCalendarContext","context","useContext","useOptionalCalendarContext","useCalendarView","view","setView","useCalendarDate","currentDate","setCurrentDate","goToNext","goToPrev","goToToday","goToDate","useCalendarEvents","events","filteredEvents","useCalendarFilters","filters","setFilters","updateFilters","clearFilters","useCalendarPreferences","preferences","setPreferences","useCalendar","options","resources","scheduleTypes","initialView","initialDate","initialFilters","userPreferences","lockedPreferences","locale","onViewChange","onDateChange","onEventClick","onSlotSelect","onFiltersChange","setViewState","useState","setCurrentDateState","setFiltersState","setPreferencesState","DEFAULT_PREFERENCES","dateRange","useMemo","getViewDateRange","viewTitle","getViewTitle","result","filterEventsByDateRange","scheduleTypeIds","filterEventsByScheduleType","resourceIds","filterEventsByResource","search","filterEventsBySearch","filterOutCanceled","sortEventsByStart","useCallback","newView","date","newDate","navigateNext","navigatePrev","navigateToday","newFilters","updates","prev","next","emptyFilters","prefs","handleEventClick","event","handleSlotSelect","selection"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";const H=require("react/jsx-runtime"),t=require("react"),r=require("./position-utils-Do2ciBXl.cjs"),x=t.createContext(void 0);function J({children:n,value:s}){return H.jsx(x.Provider,{value:s,children:n})}function C(){const n=t.useContext(x);if(!n)throw new Error("useCalendarContext must be used within a CalendarProvider");return n}function K(){return t.useContext(x)}function Q(){const{view:n,setView:s}=C();return{view:n,setView:s}}function X(){const{currentDate:n,setCurrentDate:s,goToNext:d,goToPrev:f,goToToday:E,goToDate:h}=C();return{currentDate:n,setCurrentDate:s,goToNext:d,goToPrev:f,goToToday:E,goToDate:h}}function Y(){const{events:n,filteredEvents:s}=C();return{events:n,filteredEvents:s}}function Z(){const{filters:n,setFilters:s,updateFilters:d,clearFilters:f}=C();return{filters:n,setFilters:s,updateFilters:d,clearFilters:f}}function $(){const{preferences:n,setPreferences:s}=C();return{preferences:n,setPreferences:s}}function ee(n){const{events:s,resources:d=[],scheduleTypes:f=[],initialView:E="week",initialDate:h,initialFilters:F={},preferences:R={},lockedPreferences:k={},locale:T="en-US",onViewChange:S,onDateChange:y,onEventClick:P,onSlotSelect:b,onFiltersChange:u}=n,[a,V]=t.useState(E),[o,m]=t.useState(()=>h??new Date),[v,w]=t.useState(F),[g,B]=t.useState(()=>({...r.DEFAULT_PREFERENCES,...R,...k})),D=t.useMemo(()=>r.getViewDateRange(o,a,g.firstDayOfWeek),[o,a,g.firstDayOfWeek]),O=t.useMemo(()=>r.getViewTitle(o,a,T),[o,a,T]),I=t.useMemo(()=>{let e=[...s];e=r.filterEventsByDateRange(e,D.startDate,D.endDate);const l=v.scheduleTypeIds;l&&l.length>0&&(e=r.filterEventsByScheduleType(e,l));const i=v.resourceIds;i&&i.length>0&&(e=r.filterEventsByResource(e,i));const p=v.search;return p&&(e=r.filterEventsBySearch(e,p)),g.showCanceledEvents||(e=r.filterOutCanceled(e)),r.sortEventsByStart(e)},[s,D,v,g.showCanceledEvents]),N=t.useCallback(e=>{V(e),S?.(e)},[S]),c=t.useCallback(e=>{m(e),y?.(e)},[y]),q=t.useCallback(()=>{const e=r.navigateNext(o,a);c(e)},[o,a,c]),M=t.useCallback(()=>{const e=r.navigatePrev(o,a);c(e)},[o,a,c]),U=t.useCallback(()=>{c(r.navigateToday())},[c]),j=t.useCallback(e=>{c(e)},[c]),W=t.useCallback(e=>{w(e),u?.(e)},[u]),A=t.useCallback(e=>{w(l=>{const i={...l,...e};return u?.(i),i})},[u]),L=t.useCallback(()=>{const e={};w(e),u?.(e)},[u]),_=t.useCallback(e=>{B(l=>({...l,...e,...k}))},[k]),z=t.useCallback(e=>{P?.(e)},[P]),G=t.useCallback(e=>{b?.(e)},[b]);return{view:a,currentDate:o,dateRange:D,filters:v,preferences:g,filteredEvents:I,viewTitle:O,events:s,resources:d,scheduleTypes:f,setView:N,setCurrentDate:c,goToNext:q,goToPrev:M,goToToday:U,goToDate:j,setFilters:W,updateFilters:A,clearFilters:L,setPreferences:_,handleEventClick:z,handleSlotSelect:G}}exports.CalendarProvider=J;exports.useCalendar=ee;exports.useCalendarContext=C;exports.useCalendarDate=X;exports.useCalendarEvents=Y;exports.useCalendarFilters=Z;exports.useCalendarPreferences=$;exports.useCalendarView=Q;exports.useOptionalCalendarContext=K;
2
- //# sourceMappingURL=use-calendar-Bd-d8oGj.cjs.map
1
+ "use strict";const H=require("react/jsx-runtime"),t=require("react"),r=require("./position-utils-EQTCC4tZ.cjs"),x=t.createContext(void 0);function J({children:n,value:s}){return H.jsx(x.Provider,{value:s,children:n})}function C(){const n=t.useContext(x);if(!n)throw new Error("useCalendarContext must be used within a CalendarProvider");return n}function K(){return t.useContext(x)}function Q(){const{view:n,setView:s}=C();return{view:n,setView:s}}function X(){const{currentDate:n,setCurrentDate:s,goToNext:d,goToPrev:f,goToToday:E,goToDate:h}=C();return{currentDate:n,setCurrentDate:s,goToNext:d,goToPrev:f,goToToday:E,goToDate:h}}function Y(){const{events:n,filteredEvents:s}=C();return{events:n,filteredEvents:s}}function Z(){const{filters:n,setFilters:s,updateFilters:d,clearFilters:f}=C();return{filters:n,setFilters:s,updateFilters:d,clearFilters:f}}function $(){const{preferences:n,setPreferences:s}=C();return{preferences:n,setPreferences:s}}function ee(n){const{events:s,resources:d=[],scheduleTypes:f=[],initialView:E="week",initialDate:h,initialFilters:F={},preferences:R={},lockedPreferences:k={},locale:T="en-US",onViewChange:S,onDateChange:y,onEventClick:P,onSlotSelect:b,onFiltersChange:u}=n,[a,V]=t.useState(E),[o,m]=t.useState(()=>h??new Date),[v,w]=t.useState(F),[g,B]=t.useState(()=>({...r.DEFAULT_PREFERENCES,...R,...k})),D=t.useMemo(()=>r.getViewDateRange(o,a,g.firstDayOfWeek),[o,a,g.firstDayOfWeek]),O=t.useMemo(()=>r.getViewTitle(o,a,T),[o,a,T]),I=t.useMemo(()=>{let e=[...s];e=r.filterEventsByDateRange(e,D.startDate,D.endDate);const l=v.scheduleTypeIds;l&&l.length>0&&(e=r.filterEventsByScheduleType(e,l));const i=v.resourceIds;i&&i.length>0&&(e=r.filterEventsByResource(e,i));const p=v.search;return p&&(e=r.filterEventsBySearch(e,p)),g.showCanceledEvents||(e=r.filterOutCanceled(e)),r.sortEventsByStart(e)},[s,D,v,g.showCanceledEvents]),N=t.useCallback(e=>{V(e),S?.(e)},[S]),c=t.useCallback(e=>{m(e),y?.(e)},[y]),q=t.useCallback(()=>{const e=r.navigateNext(o,a);c(e)},[o,a,c]),M=t.useCallback(()=>{const e=r.navigatePrev(o,a);c(e)},[o,a,c]),U=t.useCallback(()=>{c(r.navigateToday())},[c]),j=t.useCallback(e=>{c(e)},[c]),W=t.useCallback(e=>{w(e),u?.(e)},[u]),A=t.useCallback(e=>{w(l=>{const i={...l,...e};return u?.(i),i})},[u]),L=t.useCallback(()=>{const e={};w(e),u?.(e)},[u]),_=t.useCallback(e=>{B(l=>({...l,...e,...k}))},[k]),z=t.useCallback(e=>{P?.(e)},[P]),G=t.useCallback(e=>{b?.(e)},[b]);return{view:a,currentDate:o,dateRange:D,filters:v,preferences:g,filteredEvents:I,viewTitle:O,events:s,resources:d,scheduleTypes:f,setView:N,setCurrentDate:c,goToNext:q,goToPrev:M,goToToday:U,goToDate:j,setFilters:W,updateFilters:A,clearFilters:L,setPreferences:_,handleEventClick:z,handleSlotSelect:G}}exports.CalendarProvider=J;exports.useCalendar=ee;exports.useCalendarContext=C;exports.useCalendarDate=X;exports.useCalendarEvents=Y;exports.useCalendarFilters=Z;exports.useCalendarPreferences=$;exports.useCalendarView=Q;exports.useOptionalCalendarContext=K;
2
+ //# sourceMappingURL=use-calendar-BwqE_WNA.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-calendar-Bd-d8oGj.cjs","sources":["../src/core/context/calendar-context.tsx","../src/core/hooks/use-calendar.ts"],"sourcesContent":["/**\n * CalendarContext - React Context for Calendar State\n *\n * Provides calendar state to deeply nested components without prop drilling.\n */\n\nimport { createContext, type ReactNode, useContext } from 'react';\nimport type { UseCalendarReturn } from '../hooks/use-calendar';\n\n// ============================================================================\n// CONTEXT\n// ============================================================================\n\n/**\n * Calendar context type - generic to support any event data type\n * We use `any` here because context consumers may not know the exact type\n * Use the typed hooks below for type-safe access\n */\n// biome-ignore lint/suspicious/noExplicitAny: Context needs to be flexible for different event types\nconst CalendarContext = createContext<UseCalendarReturn<any, any, any> | undefined>(undefined);\n\n// ============================================================================\n// PROVIDER\n// ============================================================================\n\nexport interface CalendarProviderProps<\n\tTEventData = Record<string, unknown>,\n\tTScheduleTypeData = Record<string, unknown>,\n\tTResourceData = Record<string, unknown>,\n> {\n\tchildren: ReactNode;\n\tvalue: UseCalendarReturn<TEventData, TScheduleTypeData, TResourceData>;\n}\n\nexport function CalendarProvider<\n\tTEventData = Record<string, unknown>,\n\tTScheduleTypeData = Record<string, unknown>,\n\tTResourceData = Record<string, unknown>,\n>({ children, value }: CalendarProviderProps<TEventData, TScheduleTypeData, TResourceData>) {\n\treturn <CalendarContext.Provider value={value}>{children}</CalendarContext.Provider>;\n}\n\n// ============================================================================\n// HOOKS\n// ============================================================================\n\n/**\n * Get the full calendar context (throws if not in provider)\n */\nexport function useCalendarContext<\n\tTEventData = Record<string, unknown>,\n\tTScheduleTypeData = Record<string, unknown>,\n\tTResourceData = Record<string, unknown>,\n>(): UseCalendarReturn<TEventData, TScheduleTypeData, TResourceData> {\n\tconst context = useContext(CalendarContext);\n\tif (!context) {\n\t\tthrow new Error('useCalendarContext must be used within a CalendarProvider');\n\t}\n\treturn context as UseCalendarReturn<TEventData, TScheduleTypeData, TResourceData>;\n}\n\n/**\n * Get the calendar context or undefined (safe version)\n */\nexport function useOptionalCalendarContext<\n\tTEventData = Record<string, unknown>,\n\tTScheduleTypeData = Record<string, unknown>,\n\tTResourceData = Record<string, unknown>,\n>(): UseCalendarReturn<TEventData, TScheduleTypeData, TResourceData> | undefined {\n\tconst context = useContext(CalendarContext);\n\treturn context as UseCalendarReturn<TEventData, TScheduleTypeData, TResourceData> | undefined;\n}\n\n// ============================================================================\n// CONVENIENCE HOOKS\n// ============================================================================\n\n/**\n * Get current view\n */\nexport function useCalendarView() {\n\tconst { view, setView } = useCalendarContext();\n\treturn { view, setView };\n}\n\n/**\n * Get current date and navigation\n */\nexport function useCalendarDate() {\n\tconst { currentDate, setCurrentDate, goToNext, goToPrev, goToToday, goToDate } =\n\t\tuseCalendarContext();\n\treturn { currentDate, setCurrentDate, goToNext, goToPrev, goToToday, goToDate };\n}\n\n/**\n * Get filtered events\n */\nexport function useCalendarEvents<TEventData = Record<string, unknown>>() {\n\tconst { events, filteredEvents } = useCalendarContext<TEventData>();\n\treturn { events, filteredEvents };\n}\n\n/**\n * Get filters\n */\nexport function useCalendarFilters() {\n\tconst { filters, setFilters, updateFilters, clearFilters } = useCalendarContext();\n\treturn { filters, setFilters, updateFilters, clearFilters };\n}\n\n/**\n * Get preferences\n */\nexport function useCalendarPreferences() {\n\tconst { preferences, setPreferences } = useCalendarContext();\n\treturn { preferences, setPreferences };\n}\n\n// ============================================================================\n// ALIASES (for agenda-v2 naming convention compatibility)\n// ============================================================================\n\n/**\n * Alias for useCalendarContext - matches agenda-v2 naming convention\n */\nexport { useCalendarContext as useCalendar };\n\n/**\n * Alias for useOptionalCalendarContext - matches agenda-v2 naming convention\n */\nexport { useOptionalCalendarContext as useOptionalCalendar };\n","/**\n * useCalendar - Main Calendar Hook\n *\n * This hook provides all the state and methods needed to build a calendar.\n * It is fully generic, allowing consumers to define their own event data types.\n *\n * @example\n * ```tsx\n * interface MyEventData {\n * projectId: number;\n * priority: 'low' | 'medium' | 'high';\n * }\n *\n * const calendar = useCalendar<MyEventData>({\n * events: myEvents,\n * onEventClick: (event) => {\n * console.log(event.data?.projectId);\n * },\n * });\n * ```\n */\n\nimport { useCallback, useMemo, useState } from 'react';\nimport { DEFAULT_PREFERENCES } from '../constants';\nimport type {\n\tCalendarEvent,\n\tICalendarFilters,\n\tICalendarPreferences,\n\tIDateRange,\n\tIResource,\n\tIScheduleType,\n\tISelectionResult,\n\tTCalendarView,\n} from '../types';\nimport {\n\tfilterEventsByDateRange,\n\tfilterEventsByResource,\n\tfilterEventsByScheduleType,\n\tfilterEventsBySearch,\n\tfilterOutCanceled,\n\tsortEventsByStart,\n} from '../utils/event-utils';\nimport {\n\tgetViewDateRange,\n\tgetViewTitle,\n\tnavigateNext,\n\tnavigatePrev,\n\tnavigateToday,\n} from '../utils/grid-utils';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * Options for useCalendar hook\n */\nexport interface UseCalendarOptions<\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\n\t/** Available resources (for resource views) */\n\tresources?: IResource<TResourceData>[] | undefined;\n\n\t/** Available schedule types */\n\tscheduleTypes?: IScheduleType<TScheduleTypeData>[] | undefined;\n\n\t/** Initial view */\n\tinitialView?: TCalendarView | undefined;\n\n\t/** Initial date */\n\tinitialDate?: Date | undefined;\n\n\t/** Initial filters */\n\tinitialFilters?: ICalendarFilters | undefined;\n\n\t/** User preferences */\n\tpreferences?: Partial<ICalendarPreferences> | undefined;\n\n\t/** Locked preferences (cannot be changed by user) */\n\tlockedPreferences?: Partial<ICalendarPreferences> | undefined;\n\n\t/** Locale for formatting */\n\tlocale?: string | undefined;\n\n\t/** Callback when view changes */\n\tonViewChange?: ((view: TCalendarView) => void) | undefined;\n\n\t/** Callback when date changes */\n\tonDateChange?: ((date: Date) => void) | undefined;\n\n\t/** Callback when event is clicked */\n\tonEventClick?: ((event: CalendarEvent<TEventData>) => void) | undefined;\n\n\t/** Callback when slot is selected */\n\tonSlotSelect?: ((selection: ISelectionResult) => void) | undefined;\n\n\t/** Callback when filters change */\n\tonFiltersChange?: ((filters: ICalendarFilters) => void) | undefined;\n}\n\n/**\n * Return type for useCalendar hook\n */\nexport interface UseCalendarReturn<\n\tTEventData = Record<string, unknown>,\n\tTScheduleTypeData = Record<string, unknown>,\n\tTResourceData = Record<string, unknown>,\n> {\n\t// State\n\tview: TCalendarView;\n\tcurrentDate: Date;\n\tdateRange: IDateRange;\n\tfilters: ICalendarFilters;\n\tpreferences: ICalendarPreferences;\n\n\t// Computed\n\tfilteredEvents: CalendarEvent<TEventData>[];\n\tviewTitle: string;\n\n\t// Data\n\tevents: CalendarEvent<TEventData>[];\n\tresources: IResource<TResourceData>[];\n\tscheduleTypes: IScheduleType<TScheduleTypeData>[];\n\n\t// Actions\n\tsetView: (view: TCalendarView) => void;\n\tsetCurrentDate: (date: Date) => void;\n\tgoToNext: () => void;\n\tgoToPrev: () => void;\n\tgoToToday: () => void;\n\tgoToDate: (date: Date) => void;\n\n\t// Filters\n\tsetFilters: (filters: ICalendarFilters) => void;\n\tupdateFilters: (updates: Partial<ICalendarFilters>) => void;\n\tclearFilters: () => void;\n\n\t// Preferences\n\tsetPreferences: (prefs: Partial<ICalendarPreferences>) => void;\n\n\t// Event handlers\n\thandleEventClick: (event: CalendarEvent<TEventData>) => void;\n\thandleSlotSelect: (selection: ISelectionResult) => void;\n}\n\n// ============================================================================\n// HOOK\n// ============================================================================\n\nexport function useCalendar<\n\tTEventData = Record<string, unknown>,\n\tTScheduleTypeData = Record<string, unknown>,\n\tTResourceData = Record<string, unknown>,\n>(\n\toptions: UseCalendarOptions<TEventData, TScheduleTypeData, TResourceData>\n): UseCalendarReturn<TEventData, TScheduleTypeData, TResourceData> {\n\tconst {\n\t\tevents,\n\t\tresources = [],\n\t\tscheduleTypes = [],\n\t\tinitialView = 'week',\n\t\tinitialDate,\n\t\tinitialFilters = {},\n\t\tpreferences: userPreferences = {},\n\t\tlockedPreferences = {},\n\t\tlocale = 'en-US',\n\t\tonViewChange,\n\t\tonDateChange,\n\t\tonEventClick,\n\t\tonSlotSelect,\n\t\tonFiltersChange,\n\t} = options;\n\n\t// ========================================================================\n\t// STATE\n\t// ========================================================================\n\n\tconst [view, setViewState] = useState<TCalendarView>(initialView);\n\tconst [currentDate, setCurrentDateState] = useState<Date>(() => initialDate ?? new Date());\n\tconst [filters, setFiltersState] = useState<ICalendarFilters>(initialFilters);\n\tconst [preferences, setPreferencesState] = useState<ICalendarPreferences>(() => ({\n\t\t...DEFAULT_PREFERENCES,\n\t\t...userPreferences,\n\t\t...lockedPreferences,\n\t}));\n\n\t// ========================================================================\n\t// COMPUTED\n\t// ========================================================================\n\n\tconst dateRange = useMemo(\n\t\t() => getViewDateRange(currentDate, view, preferences.firstDayOfWeek),\n\t\t[currentDate, view, preferences.firstDayOfWeek]\n\t);\n\n\tconst viewTitle = useMemo(\n\t\t() => getViewTitle(currentDate, view, locale),\n\t\t[currentDate, view, locale]\n\t);\n\n\tconst filteredEvents = useMemo(() => {\n\t\tlet result = [...events];\n\n\t\t// Filter by date range\n\t\tresult = filterEventsByDateRange(result, dateRange.startDate, dateRange.endDate);\n\n\t\t// Filter by schedule types\n\t\tconst scheduleTypeIds = filters.scheduleTypeIds;\n\t\tif (scheduleTypeIds && scheduleTypeIds.length > 0) {\n\t\t\tresult = filterEventsByScheduleType(result, scheduleTypeIds);\n\t\t}\n\n\t\t// Filter by resources\n\t\tconst resourceIds = filters.resourceIds;\n\t\tif (resourceIds && resourceIds.length > 0) {\n\t\t\tresult = filterEventsByResource(result, resourceIds);\n\t\t}\n\n\t\t// Filter by search\n\t\tconst search = filters.search;\n\t\tif (search) {\n\t\t\tresult = filterEventsBySearch(result, search);\n\t\t}\n\n\t\t// Filter canceled\n\t\tif (!preferences.showCanceledEvents) {\n\t\t\tresult = filterOutCanceled(result);\n\t\t}\n\n\t\t// Sort by start date\n\t\treturn sortEventsByStart(result);\n\t}, [events, dateRange, filters, preferences.showCanceledEvents]);\n\n\t// ========================================================================\n\t// ACTIONS\n\t// ========================================================================\n\n\tconst setView = useCallback(\n\t\t(newView: TCalendarView) => {\n\t\t\tsetViewState(newView);\n\t\t\tonViewChange?.(newView);\n\t\t},\n\t\t[onViewChange]\n\t);\n\n\tconst setCurrentDate = useCallback(\n\t\t(date: Date) => {\n\t\t\tsetCurrentDateState(date);\n\t\t\tonDateChange?.(date);\n\t\t},\n\t\t[onDateChange]\n\t);\n\n\tconst goToNext = useCallback(() => {\n\t\tconst newDate = navigateNext(currentDate, view);\n\t\tsetCurrentDate(newDate);\n\t}, [currentDate, view, setCurrentDate]);\n\n\tconst goToPrev = useCallback(() => {\n\t\tconst newDate = navigatePrev(currentDate, view);\n\t\tsetCurrentDate(newDate);\n\t}, [currentDate, view, setCurrentDate]);\n\n\tconst goToToday = useCallback(() => {\n\t\tsetCurrentDate(navigateToday());\n\t}, [setCurrentDate]);\n\n\tconst goToDate = useCallback(\n\t\t(date: Date) => {\n\t\t\tsetCurrentDate(date);\n\t\t},\n\t\t[setCurrentDate]\n\t);\n\n\t// ========================================================================\n\t// FILTERS\n\t// ========================================================================\n\n\tconst setFilters = useCallback(\n\t\t(newFilters: ICalendarFilters) => {\n\t\t\tsetFiltersState(newFilters);\n\t\t\tonFiltersChange?.(newFilters);\n\t\t},\n\t\t[onFiltersChange]\n\t);\n\n\tconst updateFilters = useCallback(\n\t\t(updates: Partial<ICalendarFilters>) => {\n\t\t\tsetFiltersState((prev) => {\n\t\t\t\tconst next = { ...prev, ...updates };\n\t\t\t\tonFiltersChange?.(next);\n\t\t\t\treturn next;\n\t\t\t});\n\t\t},\n\t\t[onFiltersChange]\n\t);\n\n\tconst clearFilters = useCallback(() => {\n\t\tconst emptyFilters: ICalendarFilters = {};\n\t\tsetFiltersState(emptyFilters);\n\t\tonFiltersChange?.(emptyFilters);\n\t}, [onFiltersChange]);\n\n\t// ========================================================================\n\t// PREFERENCES\n\t// ========================================================================\n\n\tconst setPreferences = useCallback(\n\t\t(prefs: Partial<ICalendarPreferences>) => {\n\t\t\tsetPreferencesState((prev) => ({\n\t\t\t\t...prev,\n\t\t\t\t...prefs,\n\t\t\t\t...lockedPreferences, // Locked prefs always override\n\t\t\t}));\n\t\t},\n\t\t[lockedPreferences]\n\t);\n\n\t// ========================================================================\n\t// EVENT HANDLERS\n\t// ========================================================================\n\n\tconst handleEventClick = useCallback(\n\t\t(event: CalendarEvent<TEventData>) => {\n\t\t\tonEventClick?.(event);\n\t\t},\n\t\t[onEventClick]\n\t);\n\n\tconst handleSlotSelect = useCallback(\n\t\t(selection: ISelectionResult) => {\n\t\t\tonSlotSelect?.(selection);\n\t\t},\n\t\t[onSlotSelect]\n\t);\n\n\t// ========================================================================\n\t// RETURN\n\t// ========================================================================\n\n\treturn {\n\t\t// State\n\t\tview,\n\t\tcurrentDate,\n\t\tdateRange,\n\t\tfilters,\n\t\tpreferences,\n\n\t\t// Computed\n\t\tfilteredEvents,\n\t\tviewTitle,\n\n\t\t// Data\n\t\tevents,\n\t\tresources,\n\t\tscheduleTypes,\n\n\t\t// Actions\n\t\tsetView,\n\t\tsetCurrentDate,\n\t\tgoToNext,\n\t\tgoToPrev,\n\t\tgoToToday,\n\t\tgoToDate,\n\n\t\t// Filters\n\t\tsetFilters,\n\t\tupdateFilters,\n\t\tclearFilters,\n\n\t\t// Preferences\n\t\tsetPreferences,\n\n\t\t// Event handlers\n\t\thandleEventClick,\n\t\thandleSlotSelect,\n\t};\n}\n"],"names":["CalendarContext","createContext","CalendarProvider","children","value","jsx","useCalendarContext","context","useContext","useOptionalCalendarContext","useCalendarView","view","setView","useCalendarDate","currentDate","setCurrentDate","goToNext","goToPrev","goToToday","goToDate","useCalendarEvents","events","filteredEvents","useCalendarFilters","filters","setFilters","updateFilters","clearFilters","useCalendarPreferences","preferences","setPreferences","useCalendar","options","resources","scheduleTypes","initialView","initialDate","initialFilters","userPreferences","lockedPreferences","locale","onViewChange","onDateChange","onEventClick","onSlotSelect","onFiltersChange","setViewState","useState","setCurrentDateState","setFiltersState","setPreferencesState","DEFAULT_PREFERENCES","dateRange","useMemo","getViewDateRange","viewTitle","getViewTitle","result","filterEventsByDateRange","scheduleTypeIds","filterEventsByScheduleType","resourceIds","filterEventsByResource","search","filterEventsBySearch","filterOutCanceled","sortEventsByStart","useCallback","newView","date","newDate","navigateNext","navigatePrev","navigateToday","newFilters","updates","prev","next","emptyFilters","prefs","handleEventClick","event","handleSlotSelect","selection"],"mappings":"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"}
1
+ {"version":3,"file":"use-calendar-BwqE_WNA.cjs","sources":["../src/core/context/calendar-context.tsx","../src/core/hooks/use-calendar.ts"],"sourcesContent":["/**\n * CalendarContext - React Context for Calendar State\n *\n * Provides calendar state to deeply nested components without prop drilling.\n */\n\nimport { createContext, type ReactNode, useContext } from 'react';\nimport type { UseCalendarReturn } from '../hooks/use-calendar';\n\n// ============================================================================\n// CONTEXT\n// ============================================================================\n\n/**\n * Calendar context type - generic to support any event data type\n * We use `any` here because context consumers may not know the exact type\n * Use the typed hooks below for type-safe access\n */\n// biome-ignore lint/suspicious/noExplicitAny: Context needs to be flexible for different event types\nconst CalendarContext = createContext<UseCalendarReturn<any, any, any> | undefined>(undefined);\n\n// ============================================================================\n// PROVIDER\n// ============================================================================\n\nexport interface CalendarProviderProps<\n\tTEventData = Record<string, unknown>,\n\tTScheduleTypeData = Record<string, unknown>,\n\tTResourceData = Record<string, unknown>,\n> {\n\tchildren: ReactNode;\n\tvalue: UseCalendarReturn<TEventData, TScheduleTypeData, TResourceData>;\n}\n\nexport function CalendarProvider<\n\tTEventData = Record<string, unknown>,\n\tTScheduleTypeData = Record<string, unknown>,\n\tTResourceData = Record<string, unknown>,\n>({ children, value }: CalendarProviderProps<TEventData, TScheduleTypeData, TResourceData>) {\n\treturn <CalendarContext.Provider value={value}>{children}</CalendarContext.Provider>;\n}\n\n// ============================================================================\n// HOOKS\n// ============================================================================\n\n/**\n * Get the full calendar context (throws if not in provider)\n */\nexport function useCalendarContext<\n\tTEventData = Record<string, unknown>,\n\tTScheduleTypeData = Record<string, unknown>,\n\tTResourceData = Record<string, unknown>,\n>(): UseCalendarReturn<TEventData, TScheduleTypeData, TResourceData> {\n\tconst context = useContext(CalendarContext);\n\tif (!context) {\n\t\tthrow new Error('useCalendarContext must be used within a CalendarProvider');\n\t}\n\treturn context as UseCalendarReturn<TEventData, TScheduleTypeData, TResourceData>;\n}\n\n/**\n * Get the calendar context or undefined (safe version)\n */\nexport function useOptionalCalendarContext<\n\tTEventData = Record<string, unknown>,\n\tTScheduleTypeData = Record<string, unknown>,\n\tTResourceData = Record<string, unknown>,\n>(): UseCalendarReturn<TEventData, TScheduleTypeData, TResourceData> | undefined {\n\tconst context = useContext(CalendarContext);\n\treturn context as UseCalendarReturn<TEventData, TScheduleTypeData, TResourceData> | undefined;\n}\n\n// ============================================================================\n// CONVENIENCE HOOKS\n// ============================================================================\n\n/**\n * Get current view\n */\nexport function useCalendarView() {\n\tconst { view, setView } = useCalendarContext();\n\treturn { view, setView };\n}\n\n/**\n * Get current date and navigation\n */\nexport function useCalendarDate() {\n\tconst { currentDate, setCurrentDate, goToNext, goToPrev, goToToday, goToDate } =\n\t\tuseCalendarContext();\n\treturn { currentDate, setCurrentDate, goToNext, goToPrev, goToToday, goToDate };\n}\n\n/**\n * Get filtered events\n */\nexport function useCalendarEvents<TEventData = Record<string, unknown>>() {\n\tconst { events, filteredEvents } = useCalendarContext<TEventData>();\n\treturn { events, filteredEvents };\n}\n\n/**\n * Get filters\n */\nexport function useCalendarFilters() {\n\tconst { filters, setFilters, updateFilters, clearFilters } = useCalendarContext();\n\treturn { filters, setFilters, updateFilters, clearFilters };\n}\n\n/**\n * Get preferences\n */\nexport function useCalendarPreferences() {\n\tconst { preferences, setPreferences } = useCalendarContext();\n\treturn { preferences, setPreferences };\n}\n\n// ============================================================================\n// ALIASES (for agenda-v2 naming convention compatibility)\n// ============================================================================\n\n/**\n * Alias for useCalendarContext - matches agenda-v2 naming convention\n */\nexport { useCalendarContext as useCalendar };\n\n/**\n * Alias for useOptionalCalendarContext - matches agenda-v2 naming convention\n */\nexport { useOptionalCalendarContext as useOptionalCalendar };\n","/**\n * useCalendar - Main Calendar Hook\n *\n * This hook provides all the state and methods needed to build a calendar.\n * It is fully generic, allowing consumers to define their own event data types.\n *\n * @example\n * ```tsx\n * interface MyEventData {\n * projectId: number;\n * priority: 'low' | 'medium' | 'high';\n * }\n *\n * const calendar = useCalendar<MyEventData>({\n * events: myEvents,\n * onEventClick: (event) => {\n * console.log(event.data?.projectId);\n * },\n * });\n * ```\n */\n\nimport { useCallback, useMemo, useState } from 'react';\nimport { DEFAULT_PREFERENCES } from '../constants';\nimport type {\n\tCalendarEvent,\n\tICalendarFilters,\n\tICalendarPreferences,\n\tIDateRange,\n\tIResource,\n\tIScheduleType,\n\tISelectionResult,\n\tTCalendarView,\n} from '../types';\nimport {\n\tfilterEventsByDateRange,\n\tfilterEventsByResource,\n\tfilterEventsByScheduleType,\n\tfilterEventsBySearch,\n\tfilterOutCanceled,\n\tsortEventsByStart,\n} from '../utils/event-utils';\nimport {\n\tgetViewDateRange,\n\tgetViewTitle,\n\tnavigateNext,\n\tnavigatePrev,\n\tnavigateToday,\n} from '../utils/grid-utils';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * Options for useCalendar hook\n */\nexport interface UseCalendarOptions<\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\n\t/** Available resources (for resource views) */\n\tresources?: IResource<TResourceData>[] | undefined;\n\n\t/** Available schedule types */\n\tscheduleTypes?: IScheduleType<TScheduleTypeData>[] | undefined;\n\n\t/** Initial view */\n\tinitialView?: TCalendarView | undefined;\n\n\t/** Initial date */\n\tinitialDate?: Date | undefined;\n\n\t/** Initial filters */\n\tinitialFilters?: ICalendarFilters | undefined;\n\n\t/** User preferences */\n\tpreferences?: Partial<ICalendarPreferences> | undefined;\n\n\t/** Locked preferences (cannot be changed by user) */\n\tlockedPreferences?: Partial<ICalendarPreferences> | undefined;\n\n\t/** Locale for formatting */\n\tlocale?: string | undefined;\n\n\t/** Callback when view changes */\n\tonViewChange?: ((view: TCalendarView) => void) | undefined;\n\n\t/** Callback when date changes */\n\tonDateChange?: ((date: Date) => void) | undefined;\n\n\t/** Callback when event is clicked */\n\tonEventClick?: ((event: CalendarEvent<TEventData>) => void) | undefined;\n\n\t/** Callback when slot is selected */\n\tonSlotSelect?: ((selection: ISelectionResult) => void) | undefined;\n\n\t/** Callback when filters change */\n\tonFiltersChange?: ((filters: ICalendarFilters) => void) | undefined;\n}\n\n/**\n * Return type for useCalendar hook\n */\nexport interface UseCalendarReturn<\n\tTEventData = Record<string, unknown>,\n\tTScheduleTypeData = Record<string, unknown>,\n\tTResourceData = Record<string, unknown>,\n> {\n\t// State\n\tview: TCalendarView;\n\tcurrentDate: Date;\n\tdateRange: IDateRange;\n\tfilters: ICalendarFilters;\n\tpreferences: ICalendarPreferences;\n\n\t// Computed\n\tfilteredEvents: CalendarEvent<TEventData>[];\n\tviewTitle: string;\n\n\t// Data\n\tevents: CalendarEvent<TEventData>[];\n\tresources: IResource<TResourceData>[];\n\tscheduleTypes: IScheduleType<TScheduleTypeData>[];\n\n\t// Actions\n\tsetView: (view: TCalendarView) => void;\n\tsetCurrentDate: (date: Date) => void;\n\tgoToNext: () => void;\n\tgoToPrev: () => void;\n\tgoToToday: () => void;\n\tgoToDate: (date: Date) => void;\n\n\t// Filters\n\tsetFilters: (filters: ICalendarFilters) => void;\n\tupdateFilters: (updates: Partial<ICalendarFilters>) => void;\n\tclearFilters: () => void;\n\n\t// Preferences\n\tsetPreferences: (prefs: Partial<ICalendarPreferences>) => void;\n\n\t// Event handlers\n\thandleEventClick: (event: CalendarEvent<TEventData>) => void;\n\thandleSlotSelect: (selection: ISelectionResult) => void;\n}\n\n// ============================================================================\n// HOOK\n// ============================================================================\n\nexport function useCalendar<\n\tTEventData = Record<string, unknown>,\n\tTScheduleTypeData = Record<string, unknown>,\n\tTResourceData = Record<string, unknown>,\n>(\n\toptions: UseCalendarOptions<TEventData, TScheduleTypeData, TResourceData>\n): UseCalendarReturn<TEventData, TScheduleTypeData, TResourceData> {\n\tconst {\n\t\tevents,\n\t\tresources = [],\n\t\tscheduleTypes = [],\n\t\tinitialView = 'week',\n\t\tinitialDate,\n\t\tinitialFilters = {},\n\t\tpreferences: userPreferences = {},\n\t\tlockedPreferences = {},\n\t\tlocale = 'en-US',\n\t\tonViewChange,\n\t\tonDateChange,\n\t\tonEventClick,\n\t\tonSlotSelect,\n\t\tonFiltersChange,\n\t} = options;\n\n\t// ========================================================================\n\t// STATE\n\t// ========================================================================\n\n\tconst [view, setViewState] = useState<TCalendarView>(initialView);\n\tconst [currentDate, setCurrentDateState] = useState<Date>(() => initialDate ?? new Date());\n\tconst [filters, setFiltersState] = useState<ICalendarFilters>(initialFilters);\n\tconst [preferences, setPreferencesState] = useState<ICalendarPreferences>(() => ({\n\t\t...DEFAULT_PREFERENCES,\n\t\t...userPreferences,\n\t\t...lockedPreferences,\n\t}));\n\n\t// ========================================================================\n\t// COMPUTED\n\t// ========================================================================\n\n\tconst dateRange = useMemo(\n\t\t() => getViewDateRange(currentDate, view, preferences.firstDayOfWeek),\n\t\t[currentDate, view, preferences.firstDayOfWeek]\n\t);\n\n\tconst viewTitle = useMemo(\n\t\t() => getViewTitle(currentDate, view, locale),\n\t\t[currentDate, view, locale]\n\t);\n\n\tconst filteredEvents = useMemo(() => {\n\t\tlet result = [...events];\n\n\t\t// Filter by date range\n\t\tresult = filterEventsByDateRange(result, dateRange.startDate, dateRange.endDate);\n\n\t\t// Filter by schedule types\n\t\tconst scheduleTypeIds = filters.scheduleTypeIds;\n\t\tif (scheduleTypeIds && scheduleTypeIds.length > 0) {\n\t\t\tresult = filterEventsByScheduleType(result, scheduleTypeIds);\n\t\t}\n\n\t\t// Filter by resources\n\t\tconst resourceIds = filters.resourceIds;\n\t\tif (resourceIds && resourceIds.length > 0) {\n\t\t\tresult = filterEventsByResource(result, resourceIds);\n\t\t}\n\n\t\t// Filter by search\n\t\tconst search = filters.search;\n\t\tif (search) {\n\t\t\tresult = filterEventsBySearch(result, search);\n\t\t}\n\n\t\t// Filter canceled\n\t\tif (!preferences.showCanceledEvents) {\n\t\t\tresult = filterOutCanceled(result);\n\t\t}\n\n\t\t// Sort by start date\n\t\treturn sortEventsByStart(result);\n\t}, [events, dateRange, filters, preferences.showCanceledEvents]);\n\n\t// ========================================================================\n\t// ACTIONS\n\t// ========================================================================\n\n\tconst setView = useCallback(\n\t\t(newView: TCalendarView) => {\n\t\t\tsetViewState(newView);\n\t\t\tonViewChange?.(newView);\n\t\t},\n\t\t[onViewChange]\n\t);\n\n\tconst setCurrentDate = useCallback(\n\t\t(date: Date) => {\n\t\t\tsetCurrentDateState(date);\n\t\t\tonDateChange?.(date);\n\t\t},\n\t\t[onDateChange]\n\t);\n\n\tconst goToNext = useCallback(() => {\n\t\tconst newDate = navigateNext(currentDate, view);\n\t\tsetCurrentDate(newDate);\n\t}, [currentDate, view, setCurrentDate]);\n\n\tconst goToPrev = useCallback(() => {\n\t\tconst newDate = navigatePrev(currentDate, view);\n\t\tsetCurrentDate(newDate);\n\t}, [currentDate, view, setCurrentDate]);\n\n\tconst goToToday = useCallback(() => {\n\t\tsetCurrentDate(navigateToday());\n\t}, [setCurrentDate]);\n\n\tconst goToDate = useCallback(\n\t\t(date: Date) => {\n\t\t\tsetCurrentDate(date);\n\t\t},\n\t\t[setCurrentDate]\n\t);\n\n\t// ========================================================================\n\t// FILTERS\n\t// ========================================================================\n\n\tconst setFilters = useCallback(\n\t\t(newFilters: ICalendarFilters) => {\n\t\t\tsetFiltersState(newFilters);\n\t\t\tonFiltersChange?.(newFilters);\n\t\t},\n\t\t[onFiltersChange]\n\t);\n\n\tconst updateFilters = useCallback(\n\t\t(updates: Partial<ICalendarFilters>) => {\n\t\t\tsetFiltersState((prev) => {\n\t\t\t\tconst next = { ...prev, ...updates };\n\t\t\t\tonFiltersChange?.(next);\n\t\t\t\treturn next;\n\t\t\t});\n\t\t},\n\t\t[onFiltersChange]\n\t);\n\n\tconst clearFilters = useCallback(() => {\n\t\tconst emptyFilters: ICalendarFilters = {};\n\t\tsetFiltersState(emptyFilters);\n\t\tonFiltersChange?.(emptyFilters);\n\t}, [onFiltersChange]);\n\n\t// ========================================================================\n\t// PREFERENCES\n\t// ========================================================================\n\n\tconst setPreferences = useCallback(\n\t\t(prefs: Partial<ICalendarPreferences>) => {\n\t\t\tsetPreferencesState((prev) => ({\n\t\t\t\t...prev,\n\t\t\t\t...prefs,\n\t\t\t\t...lockedPreferences, // Locked prefs always override\n\t\t\t}));\n\t\t},\n\t\t[lockedPreferences]\n\t);\n\n\t// ========================================================================\n\t// EVENT HANDLERS\n\t// ========================================================================\n\n\tconst handleEventClick = useCallback(\n\t\t(event: CalendarEvent<TEventData>) => {\n\t\t\tonEventClick?.(event);\n\t\t},\n\t\t[onEventClick]\n\t);\n\n\tconst handleSlotSelect = useCallback(\n\t\t(selection: ISelectionResult) => {\n\t\t\tonSlotSelect?.(selection);\n\t\t},\n\t\t[onSlotSelect]\n\t);\n\n\t// ========================================================================\n\t// RETURN\n\t// ========================================================================\n\n\treturn {\n\t\t// State\n\t\tview,\n\t\tcurrentDate,\n\t\tdateRange,\n\t\tfilters,\n\t\tpreferences,\n\n\t\t// Computed\n\t\tfilteredEvents,\n\t\tviewTitle,\n\n\t\t// Data\n\t\tevents,\n\t\tresources,\n\t\tscheduleTypes,\n\n\t\t// Actions\n\t\tsetView,\n\t\tsetCurrentDate,\n\t\tgoToNext,\n\t\tgoToPrev,\n\t\tgoToToday,\n\t\tgoToDate,\n\n\t\t// Filters\n\t\tsetFilters,\n\t\tupdateFilters,\n\t\tclearFilters,\n\n\t\t// Preferences\n\t\tsetPreferences,\n\n\t\t// Event handlers\n\t\thandleEventClick,\n\t\thandleSlotSelect,\n\t};\n}\n"],"names":["CalendarContext","createContext","CalendarProvider","children","value","jsx","useCalendarContext","context","useContext","useOptionalCalendarContext","useCalendarView","view","setView","useCalendarDate","currentDate","setCurrentDate","goToNext","goToPrev","goToToday","goToDate","useCalendarEvents","events","filteredEvents","useCalendarFilters","filters","setFilters","updateFilters","clearFilters","useCalendarPreferences","preferences","setPreferences","useCalendar","options","resources","scheduleTypes","initialView","initialDate","initialFilters","userPreferences","lockedPreferences","locale","onViewChange","onDateChange","onEventClick","onSlotSelect","onFiltersChange","setViewState","useState","setCurrentDateState","setFiltersState","setPreferencesState","DEFAULT_PREFERENCES","dateRange","useMemo","getViewDateRange","viewTitle","getViewTitle","result","filterEventsByDateRange","scheduleTypeIds","filterEventsByScheduleType","resourceIds","filterEventsByResource","search","filterEventsBySearch","filterOutCanceled","sortEventsByStart","useCallback","newView","date","newDate","navigateNext","navigatePrev","navigateToday","newFilters","updates","prev","next","emptyFilters","prefs","handleEventClick","event","handleSlotSelect","selection"],"mappings":"gHAmBMA,EAAkBC,EAAAA,cAA4D,MAAS,EAetF,SAASC,EAId,CAAE,SAAAC,EAAU,MAAAC,GAA8E,CAC3F,OAAOC,EAAAA,IAACL,EAAgB,SAAhB,CAAyB,MAAAI,EAAe,SAAAD,CAAA,CAAS,CAC1D,CASO,SAASG,GAIqD,CACpE,MAAMC,EAAUC,EAAAA,WAAWR,CAAe,EAC1C,GAAI,CAACO,EACJ,MAAM,IAAI,MAAM,2DAA2D,EAE5E,OAAOA,CACR,CAKO,SAASE,GAIiE,CAEhF,OADgBD,EAAAA,WAAWR,CAAe,CAE3C,CASO,SAASU,GAAkB,CACjC,KAAM,CAAE,KAAAC,EAAM,QAAAC,CAAA,EAAYN,EAAA,EAC1B,MAAO,CAAE,KAAAK,EAAM,QAAAC,CAAA,CAChB,CAKO,SAASC,GAAkB,CACjC,KAAM,CAAE,YAAAC,EAAa,eAAAC,EAAgB,SAAAC,EAAU,SAAAC,EAAU,UAAAC,EAAW,SAAAC,CAAA,EACnEb,EAAA,EACD,MAAO,CAAE,YAAAQ,EAAa,eAAAC,EAAgB,SAAAC,EAAU,SAAAC,EAAU,UAAAC,EAAW,SAAAC,CAAA,CACtE,CAKO,SAASC,GAA0D,CACzE,KAAM,CAAE,OAAAC,EAAQ,eAAAC,CAAA,EAAmBhB,EAAA,EACnC,MAAO,CAAE,OAAAe,EAAQ,eAAAC,CAAA,CAClB,CAKO,SAASC,GAAqB,CACpC,KAAM,CAAE,QAAAC,EAAS,WAAAC,EAAY,cAAAC,EAAe,aAAAC,CAAA,EAAiBrB,EAAA,EAC7D,MAAO,CAAE,QAAAkB,EAAS,WAAAC,EAAY,cAAAC,EAAe,aAAAC,CAAA,CAC9C,CAKO,SAASC,GAAyB,CACxC,KAAM,CAAE,YAAAC,EAAa,eAAAC,CAAA,EAAmBxB,EAAA,EACxC,MAAO,CAAE,YAAAuB,EAAa,eAAAC,CAAA,CACvB,CCsCO,SAASC,GAKfC,EACkE,CAClE,KAAM,CACL,OAAAX,EACA,UAAAY,EAAY,CAAA,EACZ,cAAAC,EAAgB,CAAA,EAChB,YAAAC,EAAc,OACd,YAAAC,EACA,eAAAC,EAAiB,CAAA,EACjB,YAAaC,EAAkB,CAAA,EAC/B,kBAAAC,EAAoB,CAAA,EACpB,OAAAC,EAAS,QACT,aAAAC,EACA,aAAAC,EACA,aAAAC,EACA,aAAAC,EACA,gBAAAC,CAAA,EACGb,EAME,CAACrB,EAAMmC,CAAY,EAAIC,EAAAA,SAAwBZ,CAAW,EAC1D,CAACrB,EAAakC,CAAmB,EAAID,EAAAA,SAAe,IAAMX,GAAe,IAAI,IAAM,EACnF,CAACZ,EAASyB,CAAe,EAAIF,EAAAA,SAA2BV,CAAc,EACtE,CAACR,EAAaqB,CAAmB,EAAIH,EAAAA,SAA+B,KAAO,CAChF,GAAGI,EAAAA,oBACH,GAAGb,EACH,GAAGC,CAAA,EACF,EAMIa,EAAYC,EAAAA,QACjB,IAAMC,EAAAA,iBAAiBxC,EAAaH,EAAMkB,EAAY,cAAc,EACpE,CAACf,EAAaH,EAAMkB,EAAY,cAAc,CAAA,EAGzC0B,EAAYF,EAAAA,QACjB,IAAMG,eAAa1C,EAAaH,EAAM6B,CAAM,EAC5C,CAAC1B,EAAaH,EAAM6B,CAAM,CAAA,EAGrBlB,EAAiB+B,EAAAA,QAAQ,IAAM,CACpC,IAAII,EAAS,CAAC,GAAGpC,CAAM,EAGvBoC,EAASC,EAAAA,wBAAwBD,EAAQL,EAAU,UAAWA,EAAU,OAAO,EAG/E,MAAMO,EAAkBnC,EAAQ,gBAC5BmC,GAAmBA,EAAgB,OAAS,IAC/CF,EAASG,EAAAA,2BAA2BH,EAAQE,CAAe,GAI5D,MAAME,EAAcrC,EAAQ,YACxBqC,GAAeA,EAAY,OAAS,IACvCJ,EAASK,EAAAA,uBAAuBL,EAAQI,CAAW,GAIpD,MAAME,EAASvC,EAAQ,OACvB,OAAIuC,IACHN,EAASO,EAAAA,qBAAqBP,EAAQM,CAAM,GAIxClC,EAAY,qBAChB4B,EAASQ,EAAAA,kBAAkBR,CAAM,GAI3BS,EAAAA,kBAAkBT,CAAM,CAChC,EAAG,CAACpC,EAAQ+B,EAAW5B,EAASK,EAAY,kBAAkB,CAAC,EAMzDjB,EAAUuD,EAAAA,YACdC,GAA2B,CAC3BtB,EAAasB,CAAO,EACpB3B,IAAe2B,CAAO,CACvB,EACA,CAAC3B,CAAY,CAAA,EAGR1B,EAAiBoD,EAAAA,YACrBE,GAAe,CACfrB,EAAoBqB,CAAI,EACxB3B,IAAe2B,CAAI,CACpB,EACA,CAAC3B,CAAY,CAAA,EAGR1B,EAAWmD,EAAAA,YAAY,IAAM,CAClC,MAAMG,EAAUC,EAAAA,aAAazD,EAAaH,CAAI,EAC9CI,EAAeuD,CAAO,CACvB,EAAG,CAACxD,EAAaH,EAAMI,CAAc,CAAC,EAEhCE,EAAWkD,EAAAA,YAAY,IAAM,CAClC,MAAMG,EAAUE,EAAAA,aAAa1D,EAAaH,CAAI,EAC9CI,EAAeuD,CAAO,CACvB,EAAG,CAACxD,EAAaH,EAAMI,CAAc,CAAC,EAEhCG,EAAYiD,EAAAA,YAAY,IAAM,CACnCpD,EAAe0D,EAAAA,eAAe,CAC/B,EAAG,CAAC1D,CAAc,CAAC,EAEbI,EAAWgD,EAAAA,YACfE,GAAe,CACftD,EAAesD,CAAI,CACpB,EACA,CAACtD,CAAc,CAAA,EAOVU,EAAa0C,EAAAA,YACjBO,GAAiC,CACjCzB,EAAgByB,CAAU,EAC1B7B,IAAkB6B,CAAU,CAC7B,EACA,CAAC7B,CAAe,CAAA,EAGXnB,EAAgByC,EAAAA,YACpBQ,GAAuC,CACvC1B,EAAiB2B,GAAS,CACzB,MAAMC,EAAO,CAAE,GAAGD,EAAM,GAAGD,CAAA,EAC3B,OAAA9B,IAAkBgC,CAAI,EACfA,CACR,CAAC,CACF,EACA,CAAChC,CAAe,CAAA,EAGXlB,EAAewC,EAAAA,YAAY,IAAM,CACtC,MAAMW,EAAiC,CAAA,EACvC7B,EAAgB6B,CAAY,EAC5BjC,IAAkBiC,CAAY,CAC/B,EAAG,CAACjC,CAAe,CAAC,EAMdf,EAAiBqC,EAAAA,YACrBY,GAAyC,CACzC7B,EAAqB0B,IAAU,CAC9B,GAAGA,EACH,GAAGG,EACH,GAAGxC,CAAA,EACF,CACH,EACA,CAACA,CAAiB,CAAA,EAObyC,EAAmBb,EAAAA,YACvBc,GAAqC,CACrCtC,IAAesC,CAAK,CACrB,EACA,CAACtC,CAAY,CAAA,EAGRuC,EAAmBf,EAAAA,YACvBgB,GAAgC,CAChCvC,IAAeuC,CAAS,CACzB,EACA,CAACvC,CAAY,CAAA,EAOd,MAAO,CAEN,KAAAjC,EACA,YAAAG,EACA,UAAAsC,EACA,QAAA5B,EACA,YAAAK,EAGA,eAAAP,EACA,UAAAiC,EAGA,OAAAlC,EACA,UAAAY,EACA,cAAAC,EAGA,QAAAtB,EACA,eAAAG,EACA,SAAAC,EACA,SAAAC,EACA,UAAAC,EACA,SAAAC,EAGA,WAAAM,EACA,cAAAC,EACA,aAAAC,EAGA,eAAAG,EAGA,iBAAAkD,EACA,iBAAAE,CAAA,CAEF"}
@@ -1,6 +1,6 @@
1
- import { useMemo as p, useCallback as i, useState as b, useEffect as M, useRef as O } from "react";
2
- import { a as x } from "./use-calendar-mU1joTwp.js";
3
- import { d as Y, c as k, b8 as w, q as I } from "./position-utils-DpaKqYhO.js";
1
+ import { useMemo as p, useCallback as i, useState as I, useEffect as M, useRef as O } from "react";
2
+ import { a as x } from "./use-calendar--JnbGA3L.js";
3
+ import { d as Y, c as k, bb as w, q as b } from "./position-utils-BzmOPdvQ.js";
4
4
  function L() {
5
5
  const { preferences: e, setPreferences: n } = x(), o = p(
6
6
  () => ({
@@ -56,7 +56,7 @@ function L() {
56
56
  };
57
57
  }
58
58
  function U(e = {}) {
59
- const { initial: n = {}, storageKey: o, onChange: a } = e, [s, f] = b(() => {
59
+ const { initial: n = {}, storageKey: o, onChange: a } = e, [s, f] = I(() => {
60
60
  if (o && typeof window < "u")
61
61
  try {
62
62
  const r = localStorage.getItem(o);
@@ -114,7 +114,7 @@ function W(e) {
114
114
  resourceId: f,
115
115
  enabled: d = !0,
116
116
  onSelect: H
117
- } = e, [t, r] = b(S), g = O(0), h = i(
117
+ } = e, [t, r] = I(S), g = O(0), h = i(
118
118
  (l, u) => {
119
119
  if (!d) return;
120
120
  const c = l.clientY - u.top;
@@ -123,7 +123,7 @@ function W(e) {
123
123
  r({
124
124
  isSelecting: !0,
125
125
  startDate: D,
126
- endDate: I(D, s),
126
+ endDate: b(D, s),
127
127
  startY: c,
128
128
  currentY: c,
129
129
  resourceId: f
@@ -140,7 +140,7 @@ function W(e) {
140
140
  return {
141
141
  ...m,
142
142
  currentY: c,
143
- endDate: y ? I(D, s) : D,
143
+ endDate: y ? b(D, s) : D,
144
144
  startDate: y ? m.startDate : D
145
145
  };
146
146
  });
@@ -185,4 +185,4 @@ export {
185
185
  W as b,
186
186
  L as u
187
187
  };
188
- //# sourceMappingURL=use-slot-selection-CauKdLYv.js.map
188
+ //# sourceMappingURL=use-slot-selection-BLCDzQzo.js.map