@innosolutions/inno-calendar 1.0.59 → 1.0.61

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 (72) hide show
  1. package/AGENT.md +1783 -1721
  2. package/README.md +279 -235
  3. package/dist/agenda-widget-D6E-NQK-.cjs +2 -0
  4. package/dist/agenda-widget-D6E-NQK-.cjs.map +1 -0
  5. package/dist/{agenda-widget-wrZfO67A.js → agenda-widget-DVj4CEZE.js} +1297 -1279
  6. package/dist/agenda-widget-DVj4CEZE.js.map +1 -0
  7. package/dist/components/event/event-card.d.ts.map +1 -1
  8. package/dist/components/index.cjs +1 -1
  9. package/dist/components/index.mjs +2 -2
  10. package/dist/components/primitives/scroll-navigator.d.ts +3 -1
  11. package/dist/components/primitives/scroll-navigator.d.ts.map +1 -1
  12. package/dist/components/views/timeline-view.d.ts +1 -1
  13. package/dist/components/views/timeline-view.d.ts.map +1 -1
  14. package/dist/core/context/inno-calendar-provider.d.ts.map +1 -1
  15. package/dist/core/context/slot-selection-context.d.ts +2 -0
  16. package/dist/core/context/slot-selection-context.d.ts.map +1 -1
  17. package/dist/core/index.cjs +1 -1
  18. package/dist/core/index.mjs +115 -114
  19. package/dist/core/types.d.ts +6 -18
  20. package/dist/core/types.d.ts.map +1 -1
  21. package/dist/core/utils/event-utils.d.ts.map +1 -1
  22. package/dist/core/utils/index.d.ts +1 -0
  23. package/dist/core/utils/index.d.ts.map +1 -1
  24. package/dist/core/utils/react-node-utils.d.ts +14 -0
  25. package/dist/core/utils/react-node-utils.d.ts.map +1 -0
  26. package/dist/index.cjs +1 -1
  27. package/dist/index.mjs +207 -206
  28. package/dist/position-utils-BQpbtF6N.cjs +2 -0
  29. package/dist/position-utils-BQpbtF6N.cjs.map +1 -0
  30. package/dist/position-utils-DMVQFywD.js +936 -0
  31. package/dist/position-utils-DMVQFywD.js.map +1 -0
  32. package/dist/presets/index.cjs +1 -1
  33. package/dist/presets/index.mjs +1 -1
  34. package/dist/slot-selection-context-CRstOosL.js +604 -0
  35. package/dist/slot-selection-context-CRstOosL.js.map +1 -0
  36. package/dist/slot-selection-context-DBCZI2Dn.cjs +2 -0
  37. package/dist/slot-selection-context-DBCZI2Dn.cjs.map +1 -0
  38. package/dist/styles/index.css +1 -1
  39. package/dist/{tailwind-calendar-CVuxWXLY.js → tailwind-calendar-CNhXkxzW.js} +80 -80
  40. package/dist/{tailwind-calendar-CVuxWXLY.js.map → tailwind-calendar-CNhXkxzW.js.map} +1 -1
  41. package/dist/tailwind-calendar-VRvPJQwa.cjs +2 -0
  42. package/dist/{tailwind-calendar-DoG6s3PJ.cjs.map → tailwind-calendar-VRvPJQwa.cjs.map} +1 -1
  43. package/dist/{use-calendar-Clo9DFK4.js → use-calendar-D8XaVe44.js} +69 -69
  44. package/dist/{use-calendar-Clo9DFK4.js.map → use-calendar-D8XaVe44.js.map} +1 -1
  45. package/dist/use-calendar-DkT1_V3j.cjs +2 -0
  46. package/dist/{use-calendar-BEuelmSu.cjs.map → use-calendar-DkT1_V3j.cjs.map} +1 -1
  47. package/dist/{use-slot-selection-BCZKnZSM.js → use-slot-selection-CWRk_17s.js} +32 -32
  48. package/dist/{use-slot-selection-BCZKnZSM.js.map → use-slot-selection-CWRk_17s.js.map} +1 -1
  49. package/dist/use-slot-selection-Dj_tWg1O.cjs +2 -0
  50. package/dist/{use-slot-selection-Bwqwjiaq.cjs.map → use-slot-selection-Dj_tWg1O.cjs.map} +1 -1
  51. package/dist/utils.cjs +1 -1
  52. package/dist/utils.cjs.map +1 -1
  53. package/dist/utils.mjs +117 -920
  54. package/dist/utils.mjs.map +1 -1
  55. package/dist/week-view-C1Vu2ErD.cjs +11 -0
  56. package/dist/week-view-C1Vu2ErD.cjs.map +1 -0
  57. package/dist/{week-view-C1FxF_nk.js → week-view-DY167Wok.js} +1084 -1043
  58. package/dist/week-view-DY167Wok.js.map +1 -0
  59. package/package.json +138 -138
  60. package/dist/agenda-widget-BxZU4eGL.cjs +0 -2
  61. package/dist/agenda-widget-BxZU4eGL.cjs.map +0 -1
  62. package/dist/agenda-widget-wrZfO67A.js.map +0 -1
  63. package/dist/slot-selection-context-BwghpxKA.js +0 -597
  64. package/dist/slot-selection-context-BwghpxKA.js.map +0 -1
  65. package/dist/slot-selection-context-CHSaOPWP.cjs +0 -2
  66. package/dist/slot-selection-context-CHSaOPWP.cjs.map +0 -1
  67. package/dist/tailwind-calendar-DoG6s3PJ.cjs +0 -2
  68. package/dist/use-calendar-BEuelmSu.cjs +0 -2
  69. package/dist/use-slot-selection-Bwqwjiaq.cjs +0 -2
  70. package/dist/week-view-Bzpbti1B.cjs +0 -11
  71. package/dist/week-view-Bzpbti1B.cjs.map +0 -1
  72. package/dist/week-view-C1FxF_nk.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"use-calendar-BEuelmSu.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-DkT1_V3j.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,8 +1,8 @@
1
- import { useMemo as p, useCallback as i, useState as E, useEffect as M, useRef as O } from "react";
2
- import { a as x } from "./use-calendar-Clo9DFK4.js";
3
- import { DEFAULT_PREFERENCES as Y, DEFAULT_HOUR_HEIGHT as k, yToTime as w, addMinutes as I } from "./utils.mjs";
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-D8XaVe44.js";
3
+ import { c as Y, b as k, aZ as w, p as I } from "./position-utils-DMVQFywD.js";
4
4
  function L() {
5
- const { preferences: e, setPreferences: n } = x(), s = p(
5
+ const { preferences: e, setPreferences: n } = x(), o = p(
6
6
  () => ({
7
7
  from: e.startHour,
8
8
  to: e.endHour
@@ -18,7 +18,7 @@ function L() {
18
18
  5: { from: e.startHour, to: e.endHour }
19
19
  }),
20
20
  [e.startHour, e.endHour]
21
- ), o = i(
21
+ ), s = i(
22
22
  (t) => {
23
23
  n({
24
24
  startHour: t.from,
@@ -44,8 +44,8 @@ function L() {
44
44
  console.warn("showWorkingHoursOnly is not yet supported in core preferences");
45
45
  }, []);
46
46
  return {
47
- visibleHours: s,
48
- setVisibleHours: o,
47
+ visibleHours: o,
48
+ setVisibleHours: s,
49
49
  workingHours: a,
50
50
  setWorkingHours: f,
51
51
  slotDuration: e.slotDuration,
@@ -56,10 +56,10 @@ function L() {
56
56
  };
57
57
  }
58
58
  function U(e = {}) {
59
- const { initial: n = {}, storageKey: s, onChange: a } = e, [o, f] = E(() => {
60
- if (s && typeof window < "u")
59
+ const { initial: n = {}, storageKey: o, onChange: a } = e, [s, f] = b(() => {
60
+ if (o && typeof window < "u")
61
61
  try {
62
- const r = localStorage.getItem(s);
62
+ const r = localStorage.getItem(o);
63
63
  if (r) {
64
64
  const g = JSON.parse(r);
65
65
  return { ...Y, ...g, ...n };
@@ -69,12 +69,12 @@ function U(e = {}) {
69
69
  return { ...Y, ...n };
70
70
  });
71
71
  M(() => {
72
- if (s && typeof window < "u")
72
+ if (o && typeof window < "u")
73
73
  try {
74
- localStorage.setItem(s, JSON.stringify(o));
74
+ localStorage.setItem(o, JSON.stringify(s));
75
75
  } catch {
76
76
  }
77
- }, [o, s]);
77
+ }, [s, o]);
78
78
  const d = i(
79
79
  (r) => {
80
80
  f((g) => {
@@ -87,11 +87,11 @@ function U(e = {}) {
87
87
  const r = { ...Y, ...n };
88
88
  f(r), a?.(r);
89
89
  }, [n, a]), t = i(
90
- (r) => o[r],
91
- [o]
90
+ (r) => s[r],
91
+ [s]
92
92
  );
93
93
  return {
94
- preferences: o,
94
+ preferences: s,
95
95
  setPreferences: d,
96
96
  resetPreferences: H,
97
97
  getPreference: t
@@ -108,45 +108,45 @@ const S = {
108
108
  function W(e) {
109
109
  const {
110
110
  dayStart: n,
111
- visibleHours: s,
111
+ visibleHours: o,
112
112
  hourHeight: a = k,
113
- slotDuration: o = 30,
113
+ slotDuration: s = 30,
114
114
  resourceId: f,
115
115
  enabled: d = !0,
116
116
  onSelect: H
117
- } = e, [t, r] = E(S), g = O(0), h = i(
117
+ } = e, [t, r] = b(S), g = O(0), h = i(
118
118
  (l, u) => {
119
119
  if (!d) return;
120
120
  const c = l.clientY - u.top;
121
121
  g.current = u.height;
122
- const D = w(c, n, s, a, o);
122
+ const D = w(c, n, o, a, s);
123
123
  r({
124
124
  isSelecting: !0,
125
125
  startDate: D,
126
- endDate: I(D, o),
126
+ endDate: I(D, s),
127
127
  startY: c,
128
128
  currentY: c,
129
129
  resourceId: f
130
130
  });
131
131
  },
132
- [d, n, s, a, o, f]
133
- ), P = i(
132
+ [d, n, o, a, s, f]
133
+ ), E = i(
134
134
  (l, u) => {
135
135
  if (!t.isSelecting || !t.startY) return;
136
- const c = Math.max(0, Math.min(l.clientY - u.top, u.height)), D = w(c, n, s, a, o);
136
+ const c = Math.max(0, Math.min(l.clientY - u.top, u.height)), D = w(c, n, o, a, s);
137
137
  r((m) => {
138
138
  if (!m.startDate) return m;
139
139
  const y = c >= (m.startY ?? 0);
140
140
  return {
141
141
  ...m,
142
142
  currentY: c,
143
- endDate: y ? I(D, o) : D,
143
+ endDate: y ? I(D, s) : D,
144
144
  startDate: y ? m.startDate : D
145
145
  };
146
146
  });
147
147
  },
148
- [t.isSelecting, t.startY, n, s, a, o]
149
- ), T = i(() => {
148
+ [t.isSelecting, t.startY, n, o, a, s]
149
+ ), P = i(() => {
150
150
  if (!t.isSelecting || !t.startDate || !t.endDate) {
151
151
  r(S);
152
152
  return;
@@ -157,7 +157,7 @@ function W(e) {
157
157
  resourceId: t.resourceId
158
158
  };
159
159
  H?.(c), r(S);
160
- }, [t, H]), b = i(() => {
160
+ }, [t, H]), T = i(() => {
161
161
  r(S);
162
162
  }, []), C = (() => {
163
163
  if (!t.isSelecting || t.startY === null || t.currentY === null)
@@ -174,9 +174,9 @@ function W(e) {
174
174
  selection: t,
175
175
  overlay: C,
176
176
  handlePointerDown: h,
177
- handlePointerMove: P,
178
- handlePointerUp: T,
179
- cancel: b,
177
+ handlePointerMove: E,
178
+ handlePointerUp: P,
179
+ cancel: T,
180
180
  isSelecting: t.isSelecting
181
181
  };
182
182
  }
@@ -185,4 +185,4 @@ export {
185
185
  W as b,
186
186
  L as u
187
187
  };
188
- //# sourceMappingURL=use-slot-selection-BCZKnZSM.js.map
188
+ //# sourceMappingURL=use-slot-selection-CWRk_17s.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-slot-selection-BCZKnZSM.js","sources":["../src/core/hooks/use-calendar-time-config.ts","../src/core/hooks/use-preferences.ts","../src/core/hooks/use-slot-selection.ts"],"sourcesContent":["/**\n * useCalendarTimeConfig - Time Configuration Hook\n *\n * Convenience hook that provides access to time-related preferences\n * from the calendar context. Matches agenda-v2 naming conventions.\n *\n * @example\n * ```tsx\n * function TimeSettings() {\n * const {\n * visibleHours,\n * setVisibleHours,\n * workingHours,\n * setWorkingHours,\n * slotDuration,\n * setSlotDuration,\n * showWorkingHoursOnly,\n * setShowWorkingHoursOnly,\n * } = useCalendarTimeConfig();\n *\n * return (\n * <div>\n * <p>Visible: {visibleHours.from}:00 - {visibleHours.to}:00</p>\n * <p>Slot duration: {slotDuration} minutes</p>\n * </div>\n * );\n * }\n * ```\n */\n\nimport { useCallback, useMemo } from 'react';\nimport { useCalendarContext } from '../context/calendar-context';\nimport type { IVisibleHoursConfig, TWorkingHoursConfig } from '../preferences/types';\nimport type { TSlotDuration } from '../types';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface UseCalendarTimeConfigReturn {\n\t/** Current visible hours range */\n\tvisibleHours: IVisibleHoursConfig;\n\t/** Update visible hours */\n\tsetVisibleHours: (hours: IVisibleHoursConfig) => void;\n\t/** Current working hours configuration */\n\tworkingHours: TWorkingHoursConfig;\n\t/** Update working hours */\n\tsetWorkingHours: (hours: TWorkingHoursConfig) => void;\n\t/** Current slot duration in minutes */\n\tslotDuration: TSlotDuration;\n\t/** Update slot duration */\n\tsetSlotDuration: (duration: TSlotDuration) => void;\n\t/** Whether to show only working hours */\n\tshowWorkingHoursOnly: boolean;\n\t/** Toggle show working hours only */\n\tsetShowWorkingHoursOnly: (show: boolean) => void;\n}\n\n// ============================================================================\n// HOOK\n// ============================================================================\n\n/**\n * Get time configuration from calendar context\n *\n * Provides a focused subset of calendar preferences related to time display.\n * All setters will update the underlying preferences in the calendar context.\n *\n * Note: This hook maps the core preferences (startHour/endHour) to the\n * agenda-v2 naming convention (visibleHours.from/to, workingHours).\n */\nexport function useCalendarTimeConfig(): UseCalendarTimeConfigReturn {\n\tconst { preferences, setPreferences } = useCalendarContext();\n\n\t// Map core preferences to visible hours format\n\tconst visibleHours = useMemo<IVisibleHoursConfig>(\n\t\t() => ({\n\t\t\tfrom: preferences.startHour,\n\t\t\tto: preferences.endHour,\n\t\t}),\n\t\t[preferences.startHour, preferences.endHour]\n\t);\n\n\t// Default working hours based on visible hours (can be extended later)\n\tconst workingHours = useMemo<TWorkingHoursConfig>(\n\t\t() => ({\n\t\t\t// Default: Mon-Fri same hours\n\t\t\t1: { from: preferences.startHour, to: preferences.endHour },\n\t\t\t2: { from: preferences.startHour, to: preferences.endHour },\n\t\t\t3: { from: preferences.startHour, to: preferences.endHour },\n\t\t\t4: { from: preferences.startHour, to: preferences.endHour },\n\t\t\t5: { from: preferences.startHour, to: preferences.endHour },\n\t\t}),\n\t\t[preferences.startHour, preferences.endHour]\n\t);\n\n\tconst setVisibleHours = useCallback(\n\t\t(hours: IVisibleHoursConfig) => {\n\t\t\tsetPreferences({\n\t\t\t\tstartHour: hours.from,\n\t\t\t\tendHour: hours.to,\n\t\t\t});\n\t\t},\n\t\t[setPreferences]\n\t);\n\n\tconst setWorkingHours = useCallback(\n\t\t(_hours: TWorkingHoursConfig) => {\n\t\t\t// Working hours per-day config would need to be added to core preferences\n\t\t\t// For now, we use the first available day's hours to set visible hours\n\t\t\tconst firstDay = Object.values(_hours)[0];\n\t\t\tif (firstDay) {\n\t\t\t\tsetPreferences({\n\t\t\t\t\tstartHour: firstDay.from,\n\t\t\t\t\tendHour: firstDay.to,\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\t[setPreferences]\n\t);\n\n\tconst setSlotDuration = useCallback(\n\t\t(duration: TSlotDuration) => {\n\t\t\tsetPreferences({ slotDuration: duration });\n\t\t},\n\t\t[setPreferences]\n\t);\n\n\tconst setShowWorkingHoursOnly = useCallback((_show: boolean) => {\n\t\t// This would need to be added to ICalendarPreferences\n\t\t// For now, this is a no-op but provides the API surface\n\t\tconsole.warn('showWorkingHoursOnly is not yet supported in core preferences');\n\t}, []);\n\n\treturn {\n\t\tvisibleHours,\n\t\tsetVisibleHours,\n\t\tworkingHours,\n\t\tsetWorkingHours,\n\t\tslotDuration: preferences.slotDuration as TSlotDuration,\n\t\tsetSlotDuration,\n\t\tshowWorkingHoursOnly: false, // Default until added to core preferences\n\t\tsetShowWorkingHoursOnly,\n\t};\n}\n","/**\n * usePreferences - Calendar Preferences Hook\n *\n * Manages user preferences with optional localStorage persistence.\n */\n\nimport { useCallback, useEffect, useState } from 'react';\nimport { DEFAULT_PREFERENCES } from '../constants';\nimport type { ICalendarPreferences } from '../types';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface UsePreferencesOptions {\n\t/** Initial preferences (overrides defaults) */\n\tinitial?: Partial<ICalendarPreferences>;\n\t/** Storage key for persistence (if provided, uses localStorage) */\n\tstorageKey?: string;\n\t/** Callback when preferences change */\n\tonChange?: (preferences: ICalendarPreferences) => void;\n}\n\nexport interface UsePreferencesReturn {\n\t/** Current preferences */\n\tpreferences: ICalendarPreferences;\n\t/** Update preferences */\n\tsetPreferences: (updates: Partial<ICalendarPreferences>) => void;\n\t/** Reset to defaults */\n\tresetPreferences: () => void;\n\t/** Get a specific preference */\n\tgetPreference: <K extends keyof ICalendarPreferences>(key: K) => ICalendarPreferences[K];\n}\n\n// ============================================================================\n// HOOK\n// ============================================================================\n\nexport function usePreferences(options: UsePreferencesOptions = {}): UsePreferencesReturn {\n\tconst { initial = {}, storageKey, onChange } = options;\n\n\t// Load from storage or use defaults\n\tconst [preferences, setPreferencesState] = useState<ICalendarPreferences>(() => {\n\t\tif (storageKey && typeof window !== 'undefined') {\n\t\t\ttry {\n\t\t\t\tconst stored = localStorage.getItem(storageKey);\n\t\t\t\tif (stored) {\n\t\t\t\t\tconst parsed = JSON.parse(stored) as Partial<ICalendarPreferences>;\n\t\t\t\t\treturn { ...DEFAULT_PREFERENCES, ...parsed, ...initial };\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Ignore parsing errors\n\t\t\t}\n\t\t}\n\t\treturn { ...DEFAULT_PREFERENCES, ...initial };\n\t});\n\n\t// Persist to storage when preferences change\n\tuseEffect(() => {\n\t\tif (storageKey && typeof window !== 'undefined') {\n\t\t\ttry {\n\t\t\t\tlocalStorage.setItem(storageKey, JSON.stringify(preferences));\n\t\t\t} catch {\n\t\t\t\t// Ignore storage errors\n\t\t\t}\n\t\t}\n\t}, [preferences, storageKey]);\n\n\tconst setPreferences = useCallback(\n\t\t(updates: Partial<ICalendarPreferences>) => {\n\t\t\tsetPreferencesState((prev) => {\n\t\t\t\tconst next = { ...prev, ...updates };\n\t\t\t\tonChange?.(next);\n\t\t\t\treturn next;\n\t\t\t});\n\t\t},\n\t\t[onChange]\n\t);\n\n\tconst resetPreferences = useCallback(() => {\n\t\tconst defaults = { ...DEFAULT_PREFERENCES, ...initial };\n\t\tsetPreferencesState(defaults);\n\t\tonChange?.(defaults);\n\t}, [initial, onChange]);\n\n\tconst getPreference = useCallback(\n\t\t<K extends keyof ICalendarPreferences>(key: K): ICalendarPreferences[K] => {\n\t\t\treturn preferences[key];\n\t\t},\n\t\t[preferences]\n\t);\n\n\treturn {\n\t\tpreferences,\n\t\tsetPreferences,\n\t\tresetPreferences,\n\t\tgetPreference,\n\t};\n}\n","/**\n * useSlotSelection - Drag-to-Select Hook\n *\n * Handles mouse/touch interactions for creating events by\n * selecting time slots in the calendar grid.\n */\n\nimport { useCallback, useRef, useState } from 'react';\nimport { DEFAULT_HOUR_HEIGHT } from '../constants';\nimport type { ISelectionResult, ISlotSelection, IVisibleHours } from '../types';\nimport { addMinutes } from '../utils/date-utils';\nimport { yToTime } from '../utils/position-utils';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface UseSlotSelectionOptions {\n\t/** Current day being selected on */\n\tdayStart: Date;\n\t/** Visible hours configuration */\n\tvisibleHours: IVisibleHours;\n\t/** Height of one hour in pixels */\n\thourHeight?: number;\n\t/** Slot duration in minutes for snapping */\n\tslotDuration?: number;\n\t/** Resource ID (for resource views) */\n\tresourceId?: string;\n\t/** Whether selection is enabled */\n\tenabled?: boolean;\n\t/** Callback when selection completes */\n\tonSelect?: (selection: ISelectionResult) => void;\n}\n\nexport interface UseSlotSelectionReturn {\n\t/** Current selection state */\n\tselection: ISlotSelection;\n\t/** Selection overlay for rendering */\n\toverlay: { top: number; height: number; visible: boolean };\n\t/** Handler for mouse/touch down */\n\thandlePointerDown: (e: React.PointerEvent, containerRect: DOMRect) => void;\n\t/** Handler for mouse/touch move */\n\thandlePointerMove: (e: React.PointerEvent, containerRect: DOMRect) => void;\n\t/** Handler for mouse/touch up */\n\thandlePointerUp: () => void;\n\t/** Cancel current selection */\n\tcancel: () => void;\n\t/** Whether currently selecting */\n\tisSelecting: boolean;\n}\n\n// ============================================================================\n// INITIAL STATE\n// ============================================================================\n\nconst INITIAL_SELECTION: ISlotSelection = {\n\tisSelecting: false,\n\tstartDate: null,\n\tendDate: null,\n\tstartY: null,\n\tcurrentY: null,\n\tresourceId: undefined,\n};\n\n// ============================================================================\n// HOOK\n// ============================================================================\n\nexport function useSlotSelection(options: UseSlotSelectionOptions): UseSlotSelectionReturn {\n\tconst {\n\t\tdayStart,\n\t\tvisibleHours,\n\t\thourHeight = DEFAULT_HOUR_HEIGHT,\n\t\tslotDuration = 30,\n\t\tresourceId,\n\t\tenabled = true,\n\t\tonSelect,\n\t} = options;\n\n\tconst [selection, setSelection] = useState<ISlotSelection>(INITIAL_SELECTION);\n\tconst containerHeightRef = useRef<number>(0);\n\n\t// ========================================================================\n\t// HANDLERS\n\t// ========================================================================\n\n\tconst handlePointerDown = useCallback(\n\t\t(e: React.PointerEvent, containerRect: DOMRect) => {\n\t\t\tif (!enabled) return;\n\n\t\t\tconst y = e.clientY - containerRect.top;\n\t\t\tcontainerHeightRef.current = containerRect.height;\n\n\t\t\tconst startTime = yToTime(y, dayStart, visibleHours, hourHeight, slotDuration);\n\n\t\t\tsetSelection({\n\t\t\t\tisSelecting: true,\n\t\t\t\tstartDate: startTime,\n\t\t\t\tendDate: addMinutes(startTime, slotDuration),\n\t\t\t\tstartY: y,\n\t\t\t\tcurrentY: y,\n\t\t\t\tresourceId,\n\t\t\t});\n\t\t},\n\t\t[enabled, dayStart, visibleHours, hourHeight, slotDuration, resourceId]\n\t);\n\n\tconst handlePointerMove = useCallback(\n\t\t(e: React.PointerEvent, containerRect: DOMRect) => {\n\t\t\tif (!selection.isSelecting || !selection.startY) return;\n\n\t\t\tconst y = Math.max(0, Math.min(e.clientY - containerRect.top, containerRect.height));\n\t\t\tconst currentTime = yToTime(y, dayStart, visibleHours, hourHeight, slotDuration);\n\n\t\t\tsetSelection((prev) => {\n\t\t\t\tif (!prev.startDate) return prev;\n\n\t\t\t\t// Determine if dragging up or down\n\t\t\t\tconst isDraggingDown = y >= (prev.startY ?? 0);\n\n\t\t\t\treturn {\n\t\t\t\t\t...prev,\n\t\t\t\t\tcurrentY: y,\n\t\t\t\t\tendDate: isDraggingDown ? addMinutes(currentTime, slotDuration) : currentTime,\n\t\t\t\t\tstartDate: isDraggingDown ? prev.startDate : currentTime,\n\t\t\t\t};\n\t\t\t});\n\t\t},\n\t\t[selection.isSelecting, selection.startY, dayStart, visibleHours, hourHeight, slotDuration]\n\t);\n\n\tconst handlePointerUp = useCallback(() => {\n\t\tif (!selection.isSelecting || !selection.startDate || !selection.endDate) {\n\t\t\tsetSelection(INITIAL_SELECTION);\n\t\t\treturn;\n\t\t}\n\n\t\t// Ensure start is before end\n\t\tconst start = selection.startDate < selection.endDate ? selection.startDate : selection.endDate;\n\t\tconst end = selection.startDate < selection.endDate ? selection.endDate : selection.startDate;\n\n\t\tconst result: ISelectionResult = {\n\t\t\tstartDate: start,\n\t\t\tendDate: end,\n\t\t\tresourceId: selection.resourceId,\n\t\t};\n\n\t\tonSelect?.(result);\n\t\tsetSelection(INITIAL_SELECTION);\n\t}, [selection, onSelect]);\n\n\tconst cancel = useCallback(() => {\n\t\tsetSelection(INITIAL_SELECTION);\n\t}, []);\n\n\t// ========================================================================\n\t// OVERLAY CALCULATION\n\t// ========================================================================\n\n\tconst overlay = (() => {\n\t\tif (!selection.isSelecting || selection.startY === null || selection.currentY === null) {\n\t\t\treturn { top: 0, height: 0, visible: false };\n\t\t}\n\n\t\tconst minY = Math.min(selection.startY, selection.currentY);\n\t\tconst maxY = Math.max(selection.startY, selection.currentY);\n\n\t\treturn {\n\t\t\ttop: minY,\n\t\t\theight: Math.max(maxY - minY, 20), // Minimum height\n\t\t\tvisible: true,\n\t\t};\n\t})();\n\n\t// ========================================================================\n\t// RETURN\n\t// ========================================================================\n\n\treturn {\n\t\tselection,\n\t\toverlay,\n\t\thandlePointerDown,\n\t\thandlePointerMove,\n\t\thandlePointerUp,\n\t\tcancel,\n\t\tisSelecting: selection.isSelecting,\n\t};\n}\n"],"names":["useCalendarTimeConfig","preferences","setPreferences","useCalendarContext","visibleHours","useMemo","workingHours","setVisibleHours","useCallback","hours","setWorkingHours","_hours","firstDay","setSlotDuration","duration","setShowWorkingHoursOnly","_show","usePreferences","options","initial","storageKey","onChange","setPreferencesState","useState","stored","parsed","DEFAULT_PREFERENCES","useEffect","updates","prev","next","resetPreferences","defaults","getPreference","key","INITIAL_SELECTION","useSlotSelection","dayStart","hourHeight","DEFAULT_HOUR_HEIGHT","slotDuration","resourceId","enabled","onSelect","selection","setSelection","containerHeightRef","useRef","handlePointerDown","e","containerRect","y","startTime","yToTime","addMinutes","handlePointerMove","currentTime","isDraggingDown","handlePointerUp","start","end","result","cancel","overlay","minY","maxY"],"mappings":"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"}
1
+ {"version":3,"file":"use-slot-selection-CWRk_17s.js","sources":["../src/core/hooks/use-calendar-time-config.ts","../src/core/hooks/use-preferences.ts","../src/core/hooks/use-slot-selection.ts"],"sourcesContent":["/**\n * useCalendarTimeConfig - Time Configuration Hook\n *\n * Convenience hook that provides access to time-related preferences\n * from the calendar context. Matches agenda-v2 naming conventions.\n *\n * @example\n * ```tsx\n * function TimeSettings() {\n * const {\n * visibleHours,\n * setVisibleHours,\n * workingHours,\n * setWorkingHours,\n * slotDuration,\n * setSlotDuration,\n * showWorkingHoursOnly,\n * setShowWorkingHoursOnly,\n * } = useCalendarTimeConfig();\n *\n * return (\n * <div>\n * <p>Visible: {visibleHours.from}:00 - {visibleHours.to}:00</p>\n * <p>Slot duration: {slotDuration} minutes</p>\n * </div>\n * );\n * }\n * ```\n */\n\nimport { useCallback, useMemo } from 'react';\nimport { useCalendarContext } from '../context/calendar-context';\nimport type { IVisibleHoursConfig, TWorkingHoursConfig } from '../preferences/types';\nimport type { TSlotDuration } from '../types';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface UseCalendarTimeConfigReturn {\n\t/** Current visible hours range */\n\tvisibleHours: IVisibleHoursConfig;\n\t/** Update visible hours */\n\tsetVisibleHours: (hours: IVisibleHoursConfig) => void;\n\t/** Current working hours configuration */\n\tworkingHours: TWorkingHoursConfig;\n\t/** Update working hours */\n\tsetWorkingHours: (hours: TWorkingHoursConfig) => void;\n\t/** Current slot duration in minutes */\n\tslotDuration: TSlotDuration;\n\t/** Update slot duration */\n\tsetSlotDuration: (duration: TSlotDuration) => void;\n\t/** Whether to show only working hours */\n\tshowWorkingHoursOnly: boolean;\n\t/** Toggle show working hours only */\n\tsetShowWorkingHoursOnly: (show: boolean) => void;\n}\n\n// ============================================================================\n// HOOK\n// ============================================================================\n\n/**\n * Get time configuration from calendar context\n *\n * Provides a focused subset of calendar preferences related to time display.\n * All setters will update the underlying preferences in the calendar context.\n *\n * Note: This hook maps the core preferences (startHour/endHour) to the\n * agenda-v2 naming convention (visibleHours.from/to, workingHours).\n */\nexport function useCalendarTimeConfig(): UseCalendarTimeConfigReturn {\n\tconst { preferences, setPreferences } = useCalendarContext();\n\n\t// Map core preferences to visible hours format\n\tconst visibleHours = useMemo<IVisibleHoursConfig>(\n\t\t() => ({\n\t\t\tfrom: preferences.startHour,\n\t\t\tto: preferences.endHour,\n\t\t}),\n\t\t[preferences.startHour, preferences.endHour]\n\t);\n\n\t// Default working hours based on visible hours (can be extended later)\n\tconst workingHours = useMemo<TWorkingHoursConfig>(\n\t\t() => ({\n\t\t\t// Default: Mon-Fri same hours\n\t\t\t1: { from: preferences.startHour, to: preferences.endHour },\n\t\t\t2: { from: preferences.startHour, to: preferences.endHour },\n\t\t\t3: { from: preferences.startHour, to: preferences.endHour },\n\t\t\t4: { from: preferences.startHour, to: preferences.endHour },\n\t\t\t5: { from: preferences.startHour, to: preferences.endHour },\n\t\t}),\n\t\t[preferences.startHour, preferences.endHour]\n\t);\n\n\tconst setVisibleHours = useCallback(\n\t\t(hours: IVisibleHoursConfig) => {\n\t\t\tsetPreferences({\n\t\t\t\tstartHour: hours.from,\n\t\t\t\tendHour: hours.to,\n\t\t\t});\n\t\t},\n\t\t[setPreferences]\n\t);\n\n\tconst setWorkingHours = useCallback(\n\t\t(_hours: TWorkingHoursConfig) => {\n\t\t\t// Working hours per-day config would need to be added to core preferences\n\t\t\t// For now, we use the first available day's hours to set visible hours\n\t\t\tconst firstDay = Object.values(_hours)[0];\n\t\t\tif (firstDay) {\n\t\t\t\tsetPreferences({\n\t\t\t\t\tstartHour: firstDay.from,\n\t\t\t\t\tendHour: firstDay.to,\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\t[setPreferences]\n\t);\n\n\tconst setSlotDuration = useCallback(\n\t\t(duration: TSlotDuration) => {\n\t\t\tsetPreferences({ slotDuration: duration });\n\t\t},\n\t\t[setPreferences]\n\t);\n\n\tconst setShowWorkingHoursOnly = useCallback((_show: boolean) => {\n\t\t// This would need to be added to ICalendarPreferences\n\t\t// For now, this is a no-op but provides the API surface\n\t\tconsole.warn('showWorkingHoursOnly is not yet supported in core preferences');\n\t}, []);\n\n\treturn {\n\t\tvisibleHours,\n\t\tsetVisibleHours,\n\t\tworkingHours,\n\t\tsetWorkingHours,\n\t\tslotDuration: preferences.slotDuration as TSlotDuration,\n\t\tsetSlotDuration,\n\t\tshowWorkingHoursOnly: false, // Default until added to core preferences\n\t\tsetShowWorkingHoursOnly,\n\t};\n}\n","/**\n * usePreferences - Calendar Preferences Hook\n *\n * Manages user preferences with optional localStorage persistence.\n */\n\nimport { useCallback, useEffect, useState } from 'react';\nimport { DEFAULT_PREFERENCES } from '../constants';\nimport type { ICalendarPreferences } from '../types';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface UsePreferencesOptions {\n\t/** Initial preferences (overrides defaults) */\n\tinitial?: Partial<ICalendarPreferences>;\n\t/** Storage key for persistence (if provided, uses localStorage) */\n\tstorageKey?: string;\n\t/** Callback when preferences change */\n\tonChange?: (preferences: ICalendarPreferences) => void;\n}\n\nexport interface UsePreferencesReturn {\n\t/** Current preferences */\n\tpreferences: ICalendarPreferences;\n\t/** Update preferences */\n\tsetPreferences: (updates: Partial<ICalendarPreferences>) => void;\n\t/** Reset to defaults */\n\tresetPreferences: () => void;\n\t/** Get a specific preference */\n\tgetPreference: <K extends keyof ICalendarPreferences>(key: K) => ICalendarPreferences[K];\n}\n\n// ============================================================================\n// HOOK\n// ============================================================================\n\nexport function usePreferences(options: UsePreferencesOptions = {}): UsePreferencesReturn {\n\tconst { initial = {}, storageKey, onChange } = options;\n\n\t// Load from storage or use defaults\n\tconst [preferences, setPreferencesState] = useState<ICalendarPreferences>(() => {\n\t\tif (storageKey && typeof window !== 'undefined') {\n\t\t\ttry {\n\t\t\t\tconst stored = localStorage.getItem(storageKey);\n\t\t\t\tif (stored) {\n\t\t\t\t\tconst parsed = JSON.parse(stored) as Partial<ICalendarPreferences>;\n\t\t\t\t\treturn { ...DEFAULT_PREFERENCES, ...parsed, ...initial };\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Ignore parsing errors\n\t\t\t}\n\t\t}\n\t\treturn { ...DEFAULT_PREFERENCES, ...initial };\n\t});\n\n\t// Persist to storage when preferences change\n\tuseEffect(() => {\n\t\tif (storageKey && typeof window !== 'undefined') {\n\t\t\ttry {\n\t\t\t\tlocalStorage.setItem(storageKey, JSON.stringify(preferences));\n\t\t\t} catch {\n\t\t\t\t// Ignore storage errors\n\t\t\t}\n\t\t}\n\t}, [preferences, storageKey]);\n\n\tconst setPreferences = useCallback(\n\t\t(updates: Partial<ICalendarPreferences>) => {\n\t\t\tsetPreferencesState((prev) => {\n\t\t\t\tconst next = { ...prev, ...updates };\n\t\t\t\tonChange?.(next);\n\t\t\t\treturn next;\n\t\t\t});\n\t\t},\n\t\t[onChange]\n\t);\n\n\tconst resetPreferences = useCallback(() => {\n\t\tconst defaults = { ...DEFAULT_PREFERENCES, ...initial };\n\t\tsetPreferencesState(defaults);\n\t\tonChange?.(defaults);\n\t}, [initial, onChange]);\n\n\tconst getPreference = useCallback(\n\t\t<K extends keyof ICalendarPreferences>(key: K): ICalendarPreferences[K] => {\n\t\t\treturn preferences[key];\n\t\t},\n\t\t[preferences]\n\t);\n\n\treturn {\n\t\tpreferences,\n\t\tsetPreferences,\n\t\tresetPreferences,\n\t\tgetPreference,\n\t};\n}\n","/**\n * useSlotSelection - Drag-to-Select Hook\n *\n * Handles mouse/touch interactions for creating events by\n * selecting time slots in the calendar grid.\n */\n\nimport { useCallback, useRef, useState } from 'react';\nimport { DEFAULT_HOUR_HEIGHT } from '../constants';\nimport type { ISelectionResult, ISlotSelection, IVisibleHours } from '../types';\nimport { addMinutes } from '../utils/date-utils';\nimport { yToTime } from '../utils/position-utils';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface UseSlotSelectionOptions {\n\t/** Current day being selected on */\n\tdayStart: Date;\n\t/** Visible hours configuration */\n\tvisibleHours: IVisibleHours;\n\t/** Height of one hour in pixels */\n\thourHeight?: number;\n\t/** Slot duration in minutes for snapping */\n\tslotDuration?: number;\n\t/** Resource ID (for resource views) */\n\tresourceId?: string;\n\t/** Whether selection is enabled */\n\tenabled?: boolean;\n\t/** Callback when selection completes */\n\tonSelect?: (selection: ISelectionResult) => void;\n}\n\nexport interface UseSlotSelectionReturn {\n\t/** Current selection state */\n\tselection: ISlotSelection;\n\t/** Selection overlay for rendering */\n\toverlay: { top: number; height: number; visible: boolean };\n\t/** Handler for mouse/touch down */\n\thandlePointerDown: (e: React.PointerEvent, containerRect: DOMRect) => void;\n\t/** Handler for mouse/touch move */\n\thandlePointerMove: (e: React.PointerEvent, containerRect: DOMRect) => void;\n\t/** Handler for mouse/touch up */\n\thandlePointerUp: () => void;\n\t/** Cancel current selection */\n\tcancel: () => void;\n\t/** Whether currently selecting */\n\tisSelecting: boolean;\n}\n\n// ============================================================================\n// INITIAL STATE\n// ============================================================================\n\nconst INITIAL_SELECTION: ISlotSelection = {\n\tisSelecting: false,\n\tstartDate: null,\n\tendDate: null,\n\tstartY: null,\n\tcurrentY: null,\n\tresourceId: undefined,\n};\n\n// ============================================================================\n// HOOK\n// ============================================================================\n\nexport function useSlotSelection(options: UseSlotSelectionOptions): UseSlotSelectionReturn {\n\tconst {\n\t\tdayStart,\n\t\tvisibleHours,\n\t\thourHeight = DEFAULT_HOUR_HEIGHT,\n\t\tslotDuration = 30,\n\t\tresourceId,\n\t\tenabled = true,\n\t\tonSelect,\n\t} = options;\n\n\tconst [selection, setSelection] = useState<ISlotSelection>(INITIAL_SELECTION);\n\tconst containerHeightRef = useRef<number>(0);\n\n\t// ========================================================================\n\t// HANDLERS\n\t// ========================================================================\n\n\tconst handlePointerDown = useCallback(\n\t\t(e: React.PointerEvent, containerRect: DOMRect) => {\n\t\t\tif (!enabled) return;\n\n\t\t\tconst y = e.clientY - containerRect.top;\n\t\t\tcontainerHeightRef.current = containerRect.height;\n\n\t\t\tconst startTime = yToTime(y, dayStart, visibleHours, hourHeight, slotDuration);\n\n\t\t\tsetSelection({\n\t\t\t\tisSelecting: true,\n\t\t\t\tstartDate: startTime,\n\t\t\t\tendDate: addMinutes(startTime, slotDuration),\n\t\t\t\tstartY: y,\n\t\t\t\tcurrentY: y,\n\t\t\t\tresourceId,\n\t\t\t});\n\t\t},\n\t\t[enabled, dayStart, visibleHours, hourHeight, slotDuration, resourceId]\n\t);\n\n\tconst handlePointerMove = useCallback(\n\t\t(e: React.PointerEvent, containerRect: DOMRect) => {\n\t\t\tif (!selection.isSelecting || !selection.startY) return;\n\n\t\t\tconst y = Math.max(0, Math.min(e.clientY - containerRect.top, containerRect.height));\n\t\t\tconst currentTime = yToTime(y, dayStart, visibleHours, hourHeight, slotDuration);\n\n\t\t\tsetSelection((prev) => {\n\t\t\t\tif (!prev.startDate) return prev;\n\n\t\t\t\t// Determine if dragging up or down\n\t\t\t\tconst isDraggingDown = y >= (prev.startY ?? 0);\n\n\t\t\t\treturn {\n\t\t\t\t\t...prev,\n\t\t\t\t\tcurrentY: y,\n\t\t\t\t\tendDate: isDraggingDown ? addMinutes(currentTime, slotDuration) : currentTime,\n\t\t\t\t\tstartDate: isDraggingDown ? prev.startDate : currentTime,\n\t\t\t\t};\n\t\t\t});\n\t\t},\n\t\t[selection.isSelecting, selection.startY, dayStart, visibleHours, hourHeight, slotDuration]\n\t);\n\n\tconst handlePointerUp = useCallback(() => {\n\t\tif (!selection.isSelecting || !selection.startDate || !selection.endDate) {\n\t\t\tsetSelection(INITIAL_SELECTION);\n\t\t\treturn;\n\t\t}\n\n\t\t// Ensure start is before end\n\t\tconst start = selection.startDate < selection.endDate ? selection.startDate : selection.endDate;\n\t\tconst end = selection.startDate < selection.endDate ? selection.endDate : selection.startDate;\n\n\t\tconst result: ISelectionResult = {\n\t\t\tstartDate: start,\n\t\t\tendDate: end,\n\t\t\tresourceId: selection.resourceId,\n\t\t};\n\n\t\tonSelect?.(result);\n\t\tsetSelection(INITIAL_SELECTION);\n\t}, [selection, onSelect]);\n\n\tconst cancel = useCallback(() => {\n\t\tsetSelection(INITIAL_SELECTION);\n\t}, []);\n\n\t// ========================================================================\n\t// OVERLAY CALCULATION\n\t// ========================================================================\n\n\tconst overlay = (() => {\n\t\tif (!selection.isSelecting || selection.startY === null || selection.currentY === null) {\n\t\t\treturn { top: 0, height: 0, visible: false };\n\t\t}\n\n\t\tconst minY = Math.min(selection.startY, selection.currentY);\n\t\tconst maxY = Math.max(selection.startY, selection.currentY);\n\n\t\treturn {\n\t\t\ttop: minY,\n\t\t\theight: Math.max(maxY - minY, 20), // Minimum height\n\t\t\tvisible: true,\n\t\t};\n\t})();\n\n\t// ========================================================================\n\t// RETURN\n\t// ========================================================================\n\n\treturn {\n\t\tselection,\n\t\toverlay,\n\t\thandlePointerDown,\n\t\thandlePointerMove,\n\t\thandlePointerUp,\n\t\tcancel,\n\t\tisSelecting: selection.isSelecting,\n\t};\n}\n"],"names":["useCalendarTimeConfig","preferences","setPreferences","useCalendarContext","visibleHours","useMemo","workingHours","setVisibleHours","useCallback","hours","setWorkingHours","_hours","firstDay","setSlotDuration","duration","setShowWorkingHoursOnly","_show","usePreferences","options","initial","storageKey","onChange","setPreferencesState","useState","stored","parsed","DEFAULT_PREFERENCES","useEffect","updates","prev","next","resetPreferences","defaults","getPreference","key","INITIAL_SELECTION","useSlotSelection","dayStart","hourHeight","DEFAULT_HOUR_HEIGHT","slotDuration","resourceId","enabled","onSelect","selection","setSelection","containerHeightRef","useRef","handlePointerDown","e","containerRect","y","startTime","yToTime","addMinutes","handlePointerMove","currentTime","isDraggingDown","handlePointerUp","start","end","result","cancel","overlay","minY","maxY"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";const n=require("react"),T=require("./use-calendar-DkT1_V3j.cjs"),d=require("./position-utils-BQpbtF6N.cjs");function P(){const{preferences:t,setPreferences:s}=T.useCalendarContext(),a=n.useMemo(()=>({from:t.startHour,to:t.endHour}),[t.startHour,t.endHour]),u=n.useMemo(()=>({1:{from:t.startHour,to:t.endHour},2:{from:t.startHour,to:t.endHour},3:{from:t.startHour,to:t.endHour},4:{from:t.startHour,to:t.endHour},5:{from:t.startHour,to:t.endHour}}),[t.startHour,t.endHour]),o=n.useCallback(e=>{s({startHour:e.from,endHour:e.to})},[s]),f=n.useCallback(e=>{const r=Object.values(e)[0];r&&s({startHour:r.from,endHour:r.to})},[s]),D=n.useCallback(e=>{s({slotDuration:e})},[s]),H=n.useCallback(e=>{console.warn("showWorkingHoursOnly is not yet supported in core preferences")},[]);return{visibleHours:a,setVisibleHours:o,workingHours:u,setWorkingHours:f,slotDuration:t.slotDuration,setSlotDuration:D,showWorkingHoursOnly:!1,setShowWorkingHoursOnly:H}}function w(t={}){const{initial:s={},storageKey:a,onChange:u}=t,[o,f]=n.useState(()=>{if(a&&typeof window<"u")try{const r=localStorage.getItem(a);if(r){const S=JSON.parse(r);return{...d.DEFAULT_PREFERENCES,...S,...s}}}catch{}return{...d.DEFAULT_PREFERENCES,...s}});n.useEffect(()=>{if(a&&typeof window<"u")try{localStorage.setItem(a,JSON.stringify(o))}catch{}},[o,a]);const D=n.useCallback(r=>{f(S=>{const m={...S,...r};return u?.(m),m})},[u]),H=n.useCallback(()=>{const r={...d.DEFAULT_PREFERENCES,...s};f(r),u?.(r)},[s,u]),e=n.useCallback(r=>o[r],[o]);return{preferences:o,setPreferences:D,resetPreferences:H,getPreference:e}}const C={isSelecting:!1,startDate:null,endDate:null,startY:null,currentY:null,resourceId:void 0};function p(t){const{dayStart:s,visibleHours:a,hourHeight:u=d.DEFAULT_HOUR_HEIGHT,slotDuration:o=30,resourceId:f,enabled:D=!0,onSelect:H}=t,[e,r]=n.useState(C),S=n.useRef(0),m=n.useCallback((l,c)=>{if(!D)return;const i=l.clientY-c.top;S.current=c.height;const g=d.yToTime(i,s,a,u,o);r({isSelecting:!0,startDate:g,endDate:d.addMinutes(g,o),startY:i,currentY:i,resourceId:f})},[D,s,a,u,o,f]),b=n.useCallback((l,c)=>{if(!e.isSelecting||!e.startY)return;const i=Math.max(0,Math.min(l.clientY-c.top,c.height)),g=d.yToTime(i,s,a,u,o);r(h=>{if(!h.startDate)return h;const E=i>=(h.startY??0);return{...h,currentY:i,endDate:E?d.addMinutes(g,o):g,startDate:E?h.startDate:g}})},[e.isSelecting,e.startY,s,a,u,o]),Y=n.useCallback(()=>{if(!e.isSelecting||!e.startDate||!e.endDate){r(C);return}const l=e.startDate<e.endDate?e.startDate:e.endDate,c=e.startDate<e.endDate?e.endDate:e.startDate,i={startDate:l,endDate:c,resourceId:e.resourceId};H?.(i),r(C)},[e,H]),y=n.useCallback(()=>{r(C)},[]),k=(()=>{if(!e.isSelecting||e.startY===null||e.currentY===null)return{top:0,height:0,visible:!1};const l=Math.min(e.startY,e.currentY),c=Math.max(e.startY,e.currentY);return{top:l,height:Math.max(c-l,20),visible:!0}})();return{selection:e,overlay:k,handlePointerDown:m,handlePointerMove:b,handlePointerUp:Y,cancel:y,isSelecting:e.isSelecting}}exports.useCalendarTimeConfig=P;exports.usePreferences=w;exports.useSlotSelection=p;
2
+ //# sourceMappingURL=use-slot-selection-Dj_tWg1O.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-slot-selection-Bwqwjiaq.cjs","sources":["../src/core/hooks/use-calendar-time-config.ts","../src/core/hooks/use-preferences.ts","../src/core/hooks/use-slot-selection.ts"],"sourcesContent":["/**\n * useCalendarTimeConfig - Time Configuration Hook\n *\n * Convenience hook that provides access to time-related preferences\n * from the calendar context. Matches agenda-v2 naming conventions.\n *\n * @example\n * ```tsx\n * function TimeSettings() {\n * const {\n * visibleHours,\n * setVisibleHours,\n * workingHours,\n * setWorkingHours,\n * slotDuration,\n * setSlotDuration,\n * showWorkingHoursOnly,\n * setShowWorkingHoursOnly,\n * } = useCalendarTimeConfig();\n *\n * return (\n * <div>\n * <p>Visible: {visibleHours.from}:00 - {visibleHours.to}:00</p>\n * <p>Slot duration: {slotDuration} minutes</p>\n * </div>\n * );\n * }\n * ```\n */\n\nimport { useCallback, useMemo } from 'react';\nimport { useCalendarContext } from '../context/calendar-context';\nimport type { IVisibleHoursConfig, TWorkingHoursConfig } from '../preferences/types';\nimport type { TSlotDuration } from '../types';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface UseCalendarTimeConfigReturn {\n\t/** Current visible hours range */\n\tvisibleHours: IVisibleHoursConfig;\n\t/** Update visible hours */\n\tsetVisibleHours: (hours: IVisibleHoursConfig) => void;\n\t/** Current working hours configuration */\n\tworkingHours: TWorkingHoursConfig;\n\t/** Update working hours */\n\tsetWorkingHours: (hours: TWorkingHoursConfig) => void;\n\t/** Current slot duration in minutes */\n\tslotDuration: TSlotDuration;\n\t/** Update slot duration */\n\tsetSlotDuration: (duration: TSlotDuration) => void;\n\t/** Whether to show only working hours */\n\tshowWorkingHoursOnly: boolean;\n\t/** Toggle show working hours only */\n\tsetShowWorkingHoursOnly: (show: boolean) => void;\n}\n\n// ============================================================================\n// HOOK\n// ============================================================================\n\n/**\n * Get time configuration from calendar context\n *\n * Provides a focused subset of calendar preferences related to time display.\n * All setters will update the underlying preferences in the calendar context.\n *\n * Note: This hook maps the core preferences (startHour/endHour) to the\n * agenda-v2 naming convention (visibleHours.from/to, workingHours).\n */\nexport function useCalendarTimeConfig(): UseCalendarTimeConfigReturn {\n\tconst { preferences, setPreferences } = useCalendarContext();\n\n\t// Map core preferences to visible hours format\n\tconst visibleHours = useMemo<IVisibleHoursConfig>(\n\t\t() => ({\n\t\t\tfrom: preferences.startHour,\n\t\t\tto: preferences.endHour,\n\t\t}),\n\t\t[preferences.startHour, preferences.endHour]\n\t);\n\n\t// Default working hours based on visible hours (can be extended later)\n\tconst workingHours = useMemo<TWorkingHoursConfig>(\n\t\t() => ({\n\t\t\t// Default: Mon-Fri same hours\n\t\t\t1: { from: preferences.startHour, to: preferences.endHour },\n\t\t\t2: { from: preferences.startHour, to: preferences.endHour },\n\t\t\t3: { from: preferences.startHour, to: preferences.endHour },\n\t\t\t4: { from: preferences.startHour, to: preferences.endHour },\n\t\t\t5: { from: preferences.startHour, to: preferences.endHour },\n\t\t}),\n\t\t[preferences.startHour, preferences.endHour]\n\t);\n\n\tconst setVisibleHours = useCallback(\n\t\t(hours: IVisibleHoursConfig) => {\n\t\t\tsetPreferences({\n\t\t\t\tstartHour: hours.from,\n\t\t\t\tendHour: hours.to,\n\t\t\t});\n\t\t},\n\t\t[setPreferences]\n\t);\n\n\tconst setWorkingHours = useCallback(\n\t\t(_hours: TWorkingHoursConfig) => {\n\t\t\t// Working hours per-day config would need to be added to core preferences\n\t\t\t// For now, we use the first available day's hours to set visible hours\n\t\t\tconst firstDay = Object.values(_hours)[0];\n\t\t\tif (firstDay) {\n\t\t\t\tsetPreferences({\n\t\t\t\t\tstartHour: firstDay.from,\n\t\t\t\t\tendHour: firstDay.to,\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\t[setPreferences]\n\t);\n\n\tconst setSlotDuration = useCallback(\n\t\t(duration: TSlotDuration) => {\n\t\t\tsetPreferences({ slotDuration: duration });\n\t\t},\n\t\t[setPreferences]\n\t);\n\n\tconst setShowWorkingHoursOnly = useCallback((_show: boolean) => {\n\t\t// This would need to be added to ICalendarPreferences\n\t\t// For now, this is a no-op but provides the API surface\n\t\tconsole.warn('showWorkingHoursOnly is not yet supported in core preferences');\n\t}, []);\n\n\treturn {\n\t\tvisibleHours,\n\t\tsetVisibleHours,\n\t\tworkingHours,\n\t\tsetWorkingHours,\n\t\tslotDuration: preferences.slotDuration as TSlotDuration,\n\t\tsetSlotDuration,\n\t\tshowWorkingHoursOnly: false, // Default until added to core preferences\n\t\tsetShowWorkingHoursOnly,\n\t};\n}\n","/**\n * usePreferences - Calendar Preferences Hook\n *\n * Manages user preferences with optional localStorage persistence.\n */\n\nimport { useCallback, useEffect, useState } from 'react';\nimport { DEFAULT_PREFERENCES } from '../constants';\nimport type { ICalendarPreferences } from '../types';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface UsePreferencesOptions {\n\t/** Initial preferences (overrides defaults) */\n\tinitial?: Partial<ICalendarPreferences>;\n\t/** Storage key for persistence (if provided, uses localStorage) */\n\tstorageKey?: string;\n\t/** Callback when preferences change */\n\tonChange?: (preferences: ICalendarPreferences) => void;\n}\n\nexport interface UsePreferencesReturn {\n\t/** Current preferences */\n\tpreferences: ICalendarPreferences;\n\t/** Update preferences */\n\tsetPreferences: (updates: Partial<ICalendarPreferences>) => void;\n\t/** Reset to defaults */\n\tresetPreferences: () => void;\n\t/** Get a specific preference */\n\tgetPreference: <K extends keyof ICalendarPreferences>(key: K) => ICalendarPreferences[K];\n}\n\n// ============================================================================\n// HOOK\n// ============================================================================\n\nexport function usePreferences(options: UsePreferencesOptions = {}): UsePreferencesReturn {\n\tconst { initial = {}, storageKey, onChange } = options;\n\n\t// Load from storage or use defaults\n\tconst [preferences, setPreferencesState] = useState<ICalendarPreferences>(() => {\n\t\tif (storageKey && typeof window !== 'undefined') {\n\t\t\ttry {\n\t\t\t\tconst stored = localStorage.getItem(storageKey);\n\t\t\t\tif (stored) {\n\t\t\t\t\tconst parsed = JSON.parse(stored) as Partial<ICalendarPreferences>;\n\t\t\t\t\treturn { ...DEFAULT_PREFERENCES, ...parsed, ...initial };\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Ignore parsing errors\n\t\t\t}\n\t\t}\n\t\treturn { ...DEFAULT_PREFERENCES, ...initial };\n\t});\n\n\t// Persist to storage when preferences change\n\tuseEffect(() => {\n\t\tif (storageKey && typeof window !== 'undefined') {\n\t\t\ttry {\n\t\t\t\tlocalStorage.setItem(storageKey, JSON.stringify(preferences));\n\t\t\t} catch {\n\t\t\t\t// Ignore storage errors\n\t\t\t}\n\t\t}\n\t}, [preferences, storageKey]);\n\n\tconst setPreferences = useCallback(\n\t\t(updates: Partial<ICalendarPreferences>) => {\n\t\t\tsetPreferencesState((prev) => {\n\t\t\t\tconst next = { ...prev, ...updates };\n\t\t\t\tonChange?.(next);\n\t\t\t\treturn next;\n\t\t\t});\n\t\t},\n\t\t[onChange]\n\t);\n\n\tconst resetPreferences = useCallback(() => {\n\t\tconst defaults = { ...DEFAULT_PREFERENCES, ...initial };\n\t\tsetPreferencesState(defaults);\n\t\tonChange?.(defaults);\n\t}, [initial, onChange]);\n\n\tconst getPreference = useCallback(\n\t\t<K extends keyof ICalendarPreferences>(key: K): ICalendarPreferences[K] => {\n\t\t\treturn preferences[key];\n\t\t},\n\t\t[preferences]\n\t);\n\n\treturn {\n\t\tpreferences,\n\t\tsetPreferences,\n\t\tresetPreferences,\n\t\tgetPreference,\n\t};\n}\n","/**\n * useSlotSelection - Drag-to-Select Hook\n *\n * Handles mouse/touch interactions for creating events by\n * selecting time slots in the calendar grid.\n */\n\nimport { useCallback, useRef, useState } from 'react';\nimport { DEFAULT_HOUR_HEIGHT } from '../constants';\nimport type { ISelectionResult, ISlotSelection, IVisibleHours } from '../types';\nimport { addMinutes } from '../utils/date-utils';\nimport { yToTime } from '../utils/position-utils';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface UseSlotSelectionOptions {\n\t/** Current day being selected on */\n\tdayStart: Date;\n\t/** Visible hours configuration */\n\tvisibleHours: IVisibleHours;\n\t/** Height of one hour in pixels */\n\thourHeight?: number;\n\t/** Slot duration in minutes for snapping */\n\tslotDuration?: number;\n\t/** Resource ID (for resource views) */\n\tresourceId?: string;\n\t/** Whether selection is enabled */\n\tenabled?: boolean;\n\t/** Callback when selection completes */\n\tonSelect?: (selection: ISelectionResult) => void;\n}\n\nexport interface UseSlotSelectionReturn {\n\t/** Current selection state */\n\tselection: ISlotSelection;\n\t/** Selection overlay for rendering */\n\toverlay: { top: number; height: number; visible: boolean };\n\t/** Handler for mouse/touch down */\n\thandlePointerDown: (e: React.PointerEvent, containerRect: DOMRect) => void;\n\t/** Handler for mouse/touch move */\n\thandlePointerMove: (e: React.PointerEvent, containerRect: DOMRect) => void;\n\t/** Handler for mouse/touch up */\n\thandlePointerUp: () => void;\n\t/** Cancel current selection */\n\tcancel: () => void;\n\t/** Whether currently selecting */\n\tisSelecting: boolean;\n}\n\n// ============================================================================\n// INITIAL STATE\n// ============================================================================\n\nconst INITIAL_SELECTION: ISlotSelection = {\n\tisSelecting: false,\n\tstartDate: null,\n\tendDate: null,\n\tstartY: null,\n\tcurrentY: null,\n\tresourceId: undefined,\n};\n\n// ============================================================================\n// HOOK\n// ============================================================================\n\nexport function useSlotSelection(options: UseSlotSelectionOptions): UseSlotSelectionReturn {\n\tconst {\n\t\tdayStart,\n\t\tvisibleHours,\n\t\thourHeight = DEFAULT_HOUR_HEIGHT,\n\t\tslotDuration = 30,\n\t\tresourceId,\n\t\tenabled = true,\n\t\tonSelect,\n\t} = options;\n\n\tconst [selection, setSelection] = useState<ISlotSelection>(INITIAL_SELECTION);\n\tconst containerHeightRef = useRef<number>(0);\n\n\t// ========================================================================\n\t// HANDLERS\n\t// ========================================================================\n\n\tconst handlePointerDown = useCallback(\n\t\t(e: React.PointerEvent, containerRect: DOMRect) => {\n\t\t\tif (!enabled) return;\n\n\t\t\tconst y = e.clientY - containerRect.top;\n\t\t\tcontainerHeightRef.current = containerRect.height;\n\n\t\t\tconst startTime = yToTime(y, dayStart, visibleHours, hourHeight, slotDuration);\n\n\t\t\tsetSelection({\n\t\t\t\tisSelecting: true,\n\t\t\t\tstartDate: startTime,\n\t\t\t\tendDate: addMinutes(startTime, slotDuration),\n\t\t\t\tstartY: y,\n\t\t\t\tcurrentY: y,\n\t\t\t\tresourceId,\n\t\t\t});\n\t\t},\n\t\t[enabled, dayStart, visibleHours, hourHeight, slotDuration, resourceId]\n\t);\n\n\tconst handlePointerMove = useCallback(\n\t\t(e: React.PointerEvent, containerRect: DOMRect) => {\n\t\t\tif (!selection.isSelecting || !selection.startY) return;\n\n\t\t\tconst y = Math.max(0, Math.min(e.clientY - containerRect.top, containerRect.height));\n\t\t\tconst currentTime = yToTime(y, dayStart, visibleHours, hourHeight, slotDuration);\n\n\t\t\tsetSelection((prev) => {\n\t\t\t\tif (!prev.startDate) return prev;\n\n\t\t\t\t// Determine if dragging up or down\n\t\t\t\tconst isDraggingDown = y >= (prev.startY ?? 0);\n\n\t\t\t\treturn {\n\t\t\t\t\t...prev,\n\t\t\t\t\tcurrentY: y,\n\t\t\t\t\tendDate: isDraggingDown ? addMinutes(currentTime, slotDuration) : currentTime,\n\t\t\t\t\tstartDate: isDraggingDown ? prev.startDate : currentTime,\n\t\t\t\t};\n\t\t\t});\n\t\t},\n\t\t[selection.isSelecting, selection.startY, dayStart, visibleHours, hourHeight, slotDuration]\n\t);\n\n\tconst handlePointerUp = useCallback(() => {\n\t\tif (!selection.isSelecting || !selection.startDate || !selection.endDate) {\n\t\t\tsetSelection(INITIAL_SELECTION);\n\t\t\treturn;\n\t\t}\n\n\t\t// Ensure start is before end\n\t\tconst start = selection.startDate < selection.endDate ? selection.startDate : selection.endDate;\n\t\tconst end = selection.startDate < selection.endDate ? selection.endDate : selection.startDate;\n\n\t\tconst result: ISelectionResult = {\n\t\t\tstartDate: start,\n\t\t\tendDate: end,\n\t\t\tresourceId: selection.resourceId,\n\t\t};\n\n\t\tonSelect?.(result);\n\t\tsetSelection(INITIAL_SELECTION);\n\t}, [selection, onSelect]);\n\n\tconst cancel = useCallback(() => {\n\t\tsetSelection(INITIAL_SELECTION);\n\t}, []);\n\n\t// ========================================================================\n\t// OVERLAY CALCULATION\n\t// ========================================================================\n\n\tconst overlay = (() => {\n\t\tif (!selection.isSelecting || selection.startY === null || selection.currentY === null) {\n\t\t\treturn { top: 0, height: 0, visible: false };\n\t\t}\n\n\t\tconst minY = Math.min(selection.startY, selection.currentY);\n\t\tconst maxY = Math.max(selection.startY, selection.currentY);\n\n\t\treturn {\n\t\t\ttop: minY,\n\t\t\theight: Math.max(maxY - minY, 20), // Minimum height\n\t\t\tvisible: true,\n\t\t};\n\t})();\n\n\t// ========================================================================\n\t// RETURN\n\t// ========================================================================\n\n\treturn {\n\t\tselection,\n\t\toverlay,\n\t\thandlePointerDown,\n\t\thandlePointerMove,\n\t\thandlePointerUp,\n\t\tcancel,\n\t\tisSelecting: selection.isSelecting,\n\t};\n}\n"],"names":["useCalendarTimeConfig","preferences","setPreferences","useCalendarContext","visibleHours","useMemo","workingHours","setVisibleHours","useCallback","hours","setWorkingHours","_hours","firstDay","setSlotDuration","duration","setShowWorkingHoursOnly","_show","usePreferences","options","initial","storageKey","onChange","setPreferencesState","useState","stored","parsed","DEFAULT_PREFERENCES","useEffect","updates","prev","next","resetPreferences","defaults","getPreference","key","INITIAL_SELECTION","useSlotSelection","dayStart","hourHeight","DEFAULT_HOUR_HEIGHT","slotDuration","resourceId","enabled","onSelect","selection","setSelection","containerHeightRef","useRef","handlePointerDown","e","containerRect","y","startTime","yToTime","addMinutes","handlePointerMove","currentTime","isDraggingDown","handlePointerUp","start","end","result","cancel","overlay","minY","maxY"],"mappings":"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"}
1
+ {"version":3,"file":"use-slot-selection-Dj_tWg1O.cjs","sources":["../src/core/hooks/use-calendar-time-config.ts","../src/core/hooks/use-preferences.ts","../src/core/hooks/use-slot-selection.ts"],"sourcesContent":["/**\n * useCalendarTimeConfig - Time Configuration Hook\n *\n * Convenience hook that provides access to time-related preferences\n * from the calendar context. Matches agenda-v2 naming conventions.\n *\n * @example\n * ```tsx\n * function TimeSettings() {\n * const {\n * visibleHours,\n * setVisibleHours,\n * workingHours,\n * setWorkingHours,\n * slotDuration,\n * setSlotDuration,\n * showWorkingHoursOnly,\n * setShowWorkingHoursOnly,\n * } = useCalendarTimeConfig();\n *\n * return (\n * <div>\n * <p>Visible: {visibleHours.from}:00 - {visibleHours.to}:00</p>\n * <p>Slot duration: {slotDuration} minutes</p>\n * </div>\n * );\n * }\n * ```\n */\n\nimport { useCallback, useMemo } from 'react';\nimport { useCalendarContext } from '../context/calendar-context';\nimport type { IVisibleHoursConfig, TWorkingHoursConfig } from '../preferences/types';\nimport type { TSlotDuration } from '../types';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface UseCalendarTimeConfigReturn {\n\t/** Current visible hours range */\n\tvisibleHours: IVisibleHoursConfig;\n\t/** Update visible hours */\n\tsetVisibleHours: (hours: IVisibleHoursConfig) => void;\n\t/** Current working hours configuration */\n\tworkingHours: TWorkingHoursConfig;\n\t/** Update working hours */\n\tsetWorkingHours: (hours: TWorkingHoursConfig) => void;\n\t/** Current slot duration in minutes */\n\tslotDuration: TSlotDuration;\n\t/** Update slot duration */\n\tsetSlotDuration: (duration: TSlotDuration) => void;\n\t/** Whether to show only working hours */\n\tshowWorkingHoursOnly: boolean;\n\t/** Toggle show working hours only */\n\tsetShowWorkingHoursOnly: (show: boolean) => void;\n}\n\n// ============================================================================\n// HOOK\n// ============================================================================\n\n/**\n * Get time configuration from calendar context\n *\n * Provides a focused subset of calendar preferences related to time display.\n * All setters will update the underlying preferences in the calendar context.\n *\n * Note: This hook maps the core preferences (startHour/endHour) to the\n * agenda-v2 naming convention (visibleHours.from/to, workingHours).\n */\nexport function useCalendarTimeConfig(): UseCalendarTimeConfigReturn {\n\tconst { preferences, setPreferences } = useCalendarContext();\n\n\t// Map core preferences to visible hours format\n\tconst visibleHours = useMemo<IVisibleHoursConfig>(\n\t\t() => ({\n\t\t\tfrom: preferences.startHour,\n\t\t\tto: preferences.endHour,\n\t\t}),\n\t\t[preferences.startHour, preferences.endHour]\n\t);\n\n\t// Default working hours based on visible hours (can be extended later)\n\tconst workingHours = useMemo<TWorkingHoursConfig>(\n\t\t() => ({\n\t\t\t// Default: Mon-Fri same hours\n\t\t\t1: { from: preferences.startHour, to: preferences.endHour },\n\t\t\t2: { from: preferences.startHour, to: preferences.endHour },\n\t\t\t3: { from: preferences.startHour, to: preferences.endHour },\n\t\t\t4: { from: preferences.startHour, to: preferences.endHour },\n\t\t\t5: { from: preferences.startHour, to: preferences.endHour },\n\t\t}),\n\t\t[preferences.startHour, preferences.endHour]\n\t);\n\n\tconst setVisibleHours = useCallback(\n\t\t(hours: IVisibleHoursConfig) => {\n\t\t\tsetPreferences({\n\t\t\t\tstartHour: hours.from,\n\t\t\t\tendHour: hours.to,\n\t\t\t});\n\t\t},\n\t\t[setPreferences]\n\t);\n\n\tconst setWorkingHours = useCallback(\n\t\t(_hours: TWorkingHoursConfig) => {\n\t\t\t// Working hours per-day config would need to be added to core preferences\n\t\t\t// For now, we use the first available day's hours to set visible hours\n\t\t\tconst firstDay = Object.values(_hours)[0];\n\t\t\tif (firstDay) {\n\t\t\t\tsetPreferences({\n\t\t\t\t\tstartHour: firstDay.from,\n\t\t\t\t\tendHour: firstDay.to,\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\t[setPreferences]\n\t);\n\n\tconst setSlotDuration = useCallback(\n\t\t(duration: TSlotDuration) => {\n\t\t\tsetPreferences({ slotDuration: duration });\n\t\t},\n\t\t[setPreferences]\n\t);\n\n\tconst setShowWorkingHoursOnly = useCallback((_show: boolean) => {\n\t\t// This would need to be added to ICalendarPreferences\n\t\t// For now, this is a no-op but provides the API surface\n\t\tconsole.warn('showWorkingHoursOnly is not yet supported in core preferences');\n\t}, []);\n\n\treturn {\n\t\tvisibleHours,\n\t\tsetVisibleHours,\n\t\tworkingHours,\n\t\tsetWorkingHours,\n\t\tslotDuration: preferences.slotDuration as TSlotDuration,\n\t\tsetSlotDuration,\n\t\tshowWorkingHoursOnly: false, // Default until added to core preferences\n\t\tsetShowWorkingHoursOnly,\n\t};\n}\n","/**\n * usePreferences - Calendar Preferences Hook\n *\n * Manages user preferences with optional localStorage persistence.\n */\n\nimport { useCallback, useEffect, useState } from 'react';\nimport { DEFAULT_PREFERENCES } from '../constants';\nimport type { ICalendarPreferences } from '../types';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface UsePreferencesOptions {\n\t/** Initial preferences (overrides defaults) */\n\tinitial?: Partial<ICalendarPreferences>;\n\t/** Storage key for persistence (if provided, uses localStorage) */\n\tstorageKey?: string;\n\t/** Callback when preferences change */\n\tonChange?: (preferences: ICalendarPreferences) => void;\n}\n\nexport interface UsePreferencesReturn {\n\t/** Current preferences */\n\tpreferences: ICalendarPreferences;\n\t/** Update preferences */\n\tsetPreferences: (updates: Partial<ICalendarPreferences>) => void;\n\t/** Reset to defaults */\n\tresetPreferences: () => void;\n\t/** Get a specific preference */\n\tgetPreference: <K extends keyof ICalendarPreferences>(key: K) => ICalendarPreferences[K];\n}\n\n// ============================================================================\n// HOOK\n// ============================================================================\n\nexport function usePreferences(options: UsePreferencesOptions = {}): UsePreferencesReturn {\n\tconst { initial = {}, storageKey, onChange } = options;\n\n\t// Load from storage or use defaults\n\tconst [preferences, setPreferencesState] = useState<ICalendarPreferences>(() => {\n\t\tif (storageKey && typeof window !== 'undefined') {\n\t\t\ttry {\n\t\t\t\tconst stored = localStorage.getItem(storageKey);\n\t\t\t\tif (stored) {\n\t\t\t\t\tconst parsed = JSON.parse(stored) as Partial<ICalendarPreferences>;\n\t\t\t\t\treturn { ...DEFAULT_PREFERENCES, ...parsed, ...initial };\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Ignore parsing errors\n\t\t\t}\n\t\t}\n\t\treturn { ...DEFAULT_PREFERENCES, ...initial };\n\t});\n\n\t// Persist to storage when preferences change\n\tuseEffect(() => {\n\t\tif (storageKey && typeof window !== 'undefined') {\n\t\t\ttry {\n\t\t\t\tlocalStorage.setItem(storageKey, JSON.stringify(preferences));\n\t\t\t} catch {\n\t\t\t\t// Ignore storage errors\n\t\t\t}\n\t\t}\n\t}, [preferences, storageKey]);\n\n\tconst setPreferences = useCallback(\n\t\t(updates: Partial<ICalendarPreferences>) => {\n\t\t\tsetPreferencesState((prev) => {\n\t\t\t\tconst next = { ...prev, ...updates };\n\t\t\t\tonChange?.(next);\n\t\t\t\treturn next;\n\t\t\t});\n\t\t},\n\t\t[onChange]\n\t);\n\n\tconst resetPreferences = useCallback(() => {\n\t\tconst defaults = { ...DEFAULT_PREFERENCES, ...initial };\n\t\tsetPreferencesState(defaults);\n\t\tonChange?.(defaults);\n\t}, [initial, onChange]);\n\n\tconst getPreference = useCallback(\n\t\t<K extends keyof ICalendarPreferences>(key: K): ICalendarPreferences[K] => {\n\t\t\treturn preferences[key];\n\t\t},\n\t\t[preferences]\n\t);\n\n\treturn {\n\t\tpreferences,\n\t\tsetPreferences,\n\t\tresetPreferences,\n\t\tgetPreference,\n\t};\n}\n","/**\n * useSlotSelection - Drag-to-Select Hook\n *\n * Handles mouse/touch interactions for creating events by\n * selecting time slots in the calendar grid.\n */\n\nimport { useCallback, useRef, useState } from 'react';\nimport { DEFAULT_HOUR_HEIGHT } from '../constants';\nimport type { ISelectionResult, ISlotSelection, IVisibleHours } from '../types';\nimport { addMinutes } from '../utils/date-utils';\nimport { yToTime } from '../utils/position-utils';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface UseSlotSelectionOptions {\n\t/** Current day being selected on */\n\tdayStart: Date;\n\t/** Visible hours configuration */\n\tvisibleHours: IVisibleHours;\n\t/** Height of one hour in pixels */\n\thourHeight?: number;\n\t/** Slot duration in minutes for snapping */\n\tslotDuration?: number;\n\t/** Resource ID (for resource views) */\n\tresourceId?: string;\n\t/** Whether selection is enabled */\n\tenabled?: boolean;\n\t/** Callback when selection completes */\n\tonSelect?: (selection: ISelectionResult) => void;\n}\n\nexport interface UseSlotSelectionReturn {\n\t/** Current selection state */\n\tselection: ISlotSelection;\n\t/** Selection overlay for rendering */\n\toverlay: { top: number; height: number; visible: boolean };\n\t/** Handler for mouse/touch down */\n\thandlePointerDown: (e: React.PointerEvent, containerRect: DOMRect) => void;\n\t/** Handler for mouse/touch move */\n\thandlePointerMove: (e: React.PointerEvent, containerRect: DOMRect) => void;\n\t/** Handler for mouse/touch up */\n\thandlePointerUp: () => void;\n\t/** Cancel current selection */\n\tcancel: () => void;\n\t/** Whether currently selecting */\n\tisSelecting: boolean;\n}\n\n// ============================================================================\n// INITIAL STATE\n// ============================================================================\n\nconst INITIAL_SELECTION: ISlotSelection = {\n\tisSelecting: false,\n\tstartDate: null,\n\tendDate: null,\n\tstartY: null,\n\tcurrentY: null,\n\tresourceId: undefined,\n};\n\n// ============================================================================\n// HOOK\n// ============================================================================\n\nexport function useSlotSelection(options: UseSlotSelectionOptions): UseSlotSelectionReturn {\n\tconst {\n\t\tdayStart,\n\t\tvisibleHours,\n\t\thourHeight = DEFAULT_HOUR_HEIGHT,\n\t\tslotDuration = 30,\n\t\tresourceId,\n\t\tenabled = true,\n\t\tonSelect,\n\t} = options;\n\n\tconst [selection, setSelection] = useState<ISlotSelection>(INITIAL_SELECTION);\n\tconst containerHeightRef = useRef<number>(0);\n\n\t// ========================================================================\n\t// HANDLERS\n\t// ========================================================================\n\n\tconst handlePointerDown = useCallback(\n\t\t(e: React.PointerEvent, containerRect: DOMRect) => {\n\t\t\tif (!enabled) return;\n\n\t\t\tconst y = e.clientY - containerRect.top;\n\t\t\tcontainerHeightRef.current = containerRect.height;\n\n\t\t\tconst startTime = yToTime(y, dayStart, visibleHours, hourHeight, slotDuration);\n\n\t\t\tsetSelection({\n\t\t\t\tisSelecting: true,\n\t\t\t\tstartDate: startTime,\n\t\t\t\tendDate: addMinutes(startTime, slotDuration),\n\t\t\t\tstartY: y,\n\t\t\t\tcurrentY: y,\n\t\t\t\tresourceId,\n\t\t\t});\n\t\t},\n\t\t[enabled, dayStart, visibleHours, hourHeight, slotDuration, resourceId]\n\t);\n\n\tconst handlePointerMove = useCallback(\n\t\t(e: React.PointerEvent, containerRect: DOMRect) => {\n\t\t\tif (!selection.isSelecting || !selection.startY) return;\n\n\t\t\tconst y = Math.max(0, Math.min(e.clientY - containerRect.top, containerRect.height));\n\t\t\tconst currentTime = yToTime(y, dayStart, visibleHours, hourHeight, slotDuration);\n\n\t\t\tsetSelection((prev) => {\n\t\t\t\tif (!prev.startDate) return prev;\n\n\t\t\t\t// Determine if dragging up or down\n\t\t\t\tconst isDraggingDown = y >= (prev.startY ?? 0);\n\n\t\t\t\treturn {\n\t\t\t\t\t...prev,\n\t\t\t\t\tcurrentY: y,\n\t\t\t\t\tendDate: isDraggingDown ? addMinutes(currentTime, slotDuration) : currentTime,\n\t\t\t\t\tstartDate: isDraggingDown ? prev.startDate : currentTime,\n\t\t\t\t};\n\t\t\t});\n\t\t},\n\t\t[selection.isSelecting, selection.startY, dayStart, visibleHours, hourHeight, slotDuration]\n\t);\n\n\tconst handlePointerUp = useCallback(() => {\n\t\tif (!selection.isSelecting || !selection.startDate || !selection.endDate) {\n\t\t\tsetSelection(INITIAL_SELECTION);\n\t\t\treturn;\n\t\t}\n\n\t\t// Ensure start is before end\n\t\tconst start = selection.startDate < selection.endDate ? selection.startDate : selection.endDate;\n\t\tconst end = selection.startDate < selection.endDate ? selection.endDate : selection.startDate;\n\n\t\tconst result: ISelectionResult = {\n\t\t\tstartDate: start,\n\t\t\tendDate: end,\n\t\t\tresourceId: selection.resourceId,\n\t\t};\n\n\t\tonSelect?.(result);\n\t\tsetSelection(INITIAL_SELECTION);\n\t}, [selection, onSelect]);\n\n\tconst cancel = useCallback(() => {\n\t\tsetSelection(INITIAL_SELECTION);\n\t}, []);\n\n\t// ========================================================================\n\t// OVERLAY CALCULATION\n\t// ========================================================================\n\n\tconst overlay = (() => {\n\t\tif (!selection.isSelecting || selection.startY === null || selection.currentY === null) {\n\t\t\treturn { top: 0, height: 0, visible: false };\n\t\t}\n\n\t\tconst minY = Math.min(selection.startY, selection.currentY);\n\t\tconst maxY = Math.max(selection.startY, selection.currentY);\n\n\t\treturn {\n\t\t\ttop: minY,\n\t\t\theight: Math.max(maxY - minY, 20), // Minimum height\n\t\t\tvisible: true,\n\t\t};\n\t})();\n\n\t// ========================================================================\n\t// RETURN\n\t// ========================================================================\n\n\treturn {\n\t\tselection,\n\t\toverlay,\n\t\thandlePointerDown,\n\t\thandlePointerMove,\n\t\thandlePointerUp,\n\t\tcancel,\n\t\tisSelecting: selection.isSelecting,\n\t};\n}\n"],"names":["useCalendarTimeConfig","preferences","setPreferences","useCalendarContext","visibleHours","useMemo","workingHours","setVisibleHours","useCallback","hours","setWorkingHours","_hours","firstDay","setSlotDuration","duration","setShowWorkingHoursOnly","_show","usePreferences","options","initial","storageKey","onChange","setPreferencesState","useState","stored","parsed","DEFAULT_PREFERENCES","useEffect","updates","prev","next","resetPreferences","defaults","getPreference","key","INITIAL_SELECTION","useSlotSelection","dayStart","hourHeight","DEFAULT_HOUR_HEIGHT","slotDuration","resourceId","enabled","onSelect","selection","setSelection","containerHeightRef","useRef","handlePointerDown","e","containerRect","y","startTime","yToTime","addMinutes","handlePointerMove","currentTime","isDraggingDown","handlePointerUp","start","end","result","cancel","overlay","minY","maxY"],"mappings":"0HAuEO,SAASA,GAAqD,CACpE,KAAM,CAAE,YAAAC,EAAa,eAAAC,CAAA,EAAmBC,qBAAA,EAGlCC,EAAeC,EAAAA,QACpB,KAAO,CACN,KAAMJ,EAAY,UAClB,GAAIA,EAAY,OAAA,GAEjB,CAACA,EAAY,UAAWA,EAAY,OAAO,CAAA,EAItCK,EAAeD,EAAAA,QACpB,KAAO,CAEN,EAAG,CAAE,KAAMJ,EAAY,UAAW,GAAIA,EAAY,OAAA,EAClD,EAAG,CAAE,KAAMA,EAAY,UAAW,GAAIA,EAAY,OAAA,EAClD,EAAG,CAAE,KAAMA,EAAY,UAAW,GAAIA,EAAY,OAAA,EAClD,EAAG,CAAE,KAAMA,EAAY,UAAW,GAAIA,EAAY,OAAA,EAClD,EAAG,CAAE,KAAMA,EAAY,UAAW,GAAIA,EAAY,OAAA,CAAQ,GAE3D,CAACA,EAAY,UAAWA,EAAY,OAAO,CAAA,EAGtCM,EAAkBC,EAAAA,YACtBC,GAA+B,CAC/BP,EAAe,CACd,UAAWO,EAAM,KACjB,QAASA,EAAM,EAAA,CACf,CACF,EACA,CAACP,CAAc,CAAA,EAGVQ,EAAkBF,EAAAA,YACtBG,GAAgC,CAGhC,MAAMC,EAAW,OAAO,OAAOD,CAAM,EAAE,CAAC,EACpCC,GACHV,EAAe,CACd,UAAWU,EAAS,KACpB,QAASA,EAAS,EAAA,CAClB,CAEH,EACA,CAACV,CAAc,CAAA,EAGVW,EAAkBL,EAAAA,YACtBM,GAA4B,CAC5BZ,EAAe,CAAE,aAAcY,EAAU,CAC1C,EACA,CAACZ,CAAc,CAAA,EAGVa,EAA0BP,cAAaQ,GAAmB,CAG/D,QAAQ,KAAK,+DAA+D,CAC7E,EAAG,CAAA,CAAE,EAEL,MAAO,CACN,aAAAZ,EACA,gBAAAG,EACA,aAAAD,EACA,gBAAAI,EACA,aAAcT,EAAY,aAC1B,gBAAAY,EACA,qBAAsB,GACtB,wBAAAE,CAAA,CAEF,CC1GO,SAASE,EAAeC,EAAiC,GAA0B,CACzF,KAAM,CAAE,QAAAC,EAAU,CAAA,EAAI,WAAAC,EAAY,SAAAC,GAAaH,EAGzC,CAACjB,EAAaqB,CAAmB,EAAIC,EAAAA,SAA+B,IAAM,CAC/E,GAAIH,GAAc,OAAO,OAAW,IACnC,GAAI,CACH,MAAMI,EAAS,aAAa,QAAQJ,CAAU,EAC9C,GAAII,EAAQ,CACX,MAAMC,EAAS,KAAK,MAAMD,CAAM,EAChC,MAAO,CAAE,GAAGE,EAAAA,oBAAqB,GAAGD,EAAQ,GAAGN,CAAA,CAChD,CACD,MAAQ,CAER,CAED,MAAO,CAAE,GAAGO,sBAAqB,GAAGP,CAAA,CACrC,CAAC,EAGDQ,EAAAA,UAAU,IAAM,CACf,GAAIP,GAAc,OAAO,OAAW,IACnC,GAAI,CACH,aAAa,QAAQA,EAAY,KAAK,UAAUnB,CAAW,CAAC,CAC7D,MAAQ,CAER,CAEF,EAAG,CAACA,EAAamB,CAAU,CAAC,EAE5B,MAAMlB,EAAiBM,EAAAA,YACrBoB,GAA2C,CAC3CN,EAAqBO,GAAS,CAC7B,MAAMC,EAAO,CAAE,GAAGD,EAAM,GAAGD,CAAA,EAC3B,OAAAP,IAAWS,CAAI,EACRA,CACR,CAAC,CACF,EACA,CAACT,CAAQ,CAAA,EAGJU,EAAmBvB,EAAAA,YAAY,IAAM,CAC1C,MAAMwB,EAAW,CAAE,GAAGN,EAAAA,oBAAqB,GAAGP,CAAA,EAC9CG,EAAoBU,CAAQ,EAC5BX,IAAWW,CAAQ,CACpB,EAAG,CAACb,EAASE,CAAQ,CAAC,EAEhBY,EAAgBzB,EAAAA,YACkB0B,GAC/BjC,EAAYiC,CAAG,EAEvB,CAACjC,CAAW,CAAA,EAGb,MAAO,CACN,YAAAA,EACA,eAAAC,EACA,iBAAA6B,EACA,cAAAE,CAAA,CAEF,CC3CA,MAAME,EAAoC,CACzC,YAAa,GACb,UAAW,KACX,QAAS,KACT,OAAQ,KACR,SAAU,KACV,WAAY,MACb,EAMO,SAASC,EAAiBlB,EAA0D,CAC1F,KAAM,CACL,SAAAmB,EACA,aAAAjC,EACA,WAAAkC,EAAaC,EAAAA,oBACb,aAAAC,EAAe,GACf,WAAAC,EACA,QAAAC,EAAU,GACV,SAAAC,CAAA,EACGzB,EAEE,CAAC0B,EAAWC,CAAY,EAAItB,EAAAA,SAAyBY,CAAiB,EACtEW,EAAqBC,EAAAA,OAAe,CAAC,EAMrCC,EAAoBxC,EAAAA,YACzB,CAACyC,EAAuBC,IAA2B,CAClD,GAAI,CAACR,EAAS,OAEd,MAAMS,EAAIF,EAAE,QAAUC,EAAc,IACpCJ,EAAmB,QAAUI,EAAc,OAE3C,MAAME,EAAYC,EAAAA,QAAQF,EAAGd,EAAUjC,EAAckC,EAAYE,CAAY,EAE7EK,EAAa,CACZ,YAAa,GACb,UAAWO,EACX,QAASE,EAAAA,WAAWF,EAAWZ,CAAY,EAC3C,OAAQW,EACR,SAAUA,EACV,WAAAV,CAAA,CACA,CACF,EACA,CAACC,EAASL,EAAUjC,EAAckC,EAAYE,EAAcC,CAAU,CAAA,EAGjEc,EAAoB/C,EAAAA,YACzB,CAACyC,EAAuBC,IAA2B,CAClD,GAAI,CAACN,EAAU,aAAe,CAACA,EAAU,OAAQ,OAEjD,MAAMO,EAAI,KAAK,IAAI,EAAG,KAAK,IAAIF,EAAE,QAAUC,EAAc,IAAKA,EAAc,MAAM,CAAC,EAC7EM,EAAcH,EAAAA,QAAQF,EAAGd,EAAUjC,EAAckC,EAAYE,CAAY,EAE/EK,EAAchB,GAAS,CACtB,GAAI,CAACA,EAAK,UAAW,OAAOA,EAG5B,MAAM4B,EAAiBN,IAAMtB,EAAK,QAAU,GAE5C,MAAO,CACN,GAAGA,EACH,SAAUsB,EACV,QAASM,EAAiBH,EAAAA,WAAWE,EAAahB,CAAY,EAAIgB,EAClE,UAAWC,EAAiB5B,EAAK,UAAY2B,CAAA,CAE/C,CAAC,CACF,EACA,CAACZ,EAAU,YAAaA,EAAU,OAAQP,EAAUjC,EAAckC,EAAYE,CAAY,CAAA,EAGrFkB,EAAkBlD,EAAAA,YAAY,IAAM,CACzC,GAAI,CAACoC,EAAU,aAAe,CAACA,EAAU,WAAa,CAACA,EAAU,QAAS,CACzEC,EAAaV,CAAiB,EAC9B,MACD,CAGA,MAAMwB,EAAQf,EAAU,UAAYA,EAAU,QAAUA,EAAU,UAAYA,EAAU,QAClFgB,EAAMhB,EAAU,UAAYA,EAAU,QAAUA,EAAU,QAAUA,EAAU,UAE9EiB,EAA2B,CAChC,UAAWF,EACX,QAASC,EACT,WAAYhB,EAAU,UAAA,EAGvBD,IAAWkB,CAAM,EACjBhB,EAAaV,CAAiB,CAC/B,EAAG,CAACS,EAAWD,CAAQ,CAAC,EAElBmB,EAAStD,EAAAA,YAAY,IAAM,CAChCqC,EAAaV,CAAiB,CAC/B,EAAG,CAAA,CAAE,EAMC4B,GAAW,IAAM,CACtB,GAAI,CAACnB,EAAU,aAAeA,EAAU,SAAW,MAAQA,EAAU,WAAa,KACjF,MAAO,CAAE,IAAK,EAAG,OAAQ,EAAG,QAAS,EAAA,EAGtC,MAAMoB,EAAO,KAAK,IAAIpB,EAAU,OAAQA,EAAU,QAAQ,EACpDqB,EAAO,KAAK,IAAIrB,EAAU,OAAQA,EAAU,QAAQ,EAE1D,MAAO,CACN,IAAKoB,EACL,OAAQ,KAAK,IAAIC,EAAOD,EAAM,EAAE,EAChC,QAAS,EAAA,CAEX,GAAA,EAMA,MAAO,CACN,UAAApB,EACA,QAAAmB,EACA,kBAAAf,EACA,kBAAAO,EACA,gBAAAG,EACA,OAAAI,EACA,YAAalB,EAAU,WAAA,CAEzB"}
package/dist/utils.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const te=["day","week","month","year","agenda","resource-day","resource-week","timeline-day","timeline-week"],ne={startHour:8,endHour:18,firstDayOfWeek:1,slotDuration:30,showWeekends:!0,timeFormat:"24h",badgeVariant:"colored",showCanceledEvents:!1},re={startHour:0,endHour:24},oe={startHour:8,endHour:18},ae={day:{type:"day",slotMinTime:"00:00",slotMaxTime:"24:00",slotDuration:"00:30:00",scrollTime:"08:00:00",allDaySlot:!0},week:{type:"week",slotMinTime:"00:00",slotMaxTime:"24:00",slotDuration:"00:30:00",scrollTime:"08:00:00",dayMaxEventRows:3,allDaySlot:!0},month:{type:"month",dayMaxEventRows:4,eventMaxStack:3,allDaySlot:!1},year:{type:"year",dayMaxEventRows:2,allDaySlot:!1},agenda:{type:"agenda",allDaySlot:!1},"resource-day":{type:"resource-day",slotMinTime:"00:00",slotMaxTime:"24:00",slotDuration:"00:30:00",scrollTime:"08:00:00",allDaySlot:!0},"resource-week":{type:"resource-week",slotMinTime:"00:00",slotMaxTime:"24:00",slotDuration:"00:30:00",scrollTime:"08:00:00",allDaySlot:!0},"timeline-day":{type:"timeline-day",slotDuration:"01:00:00"},"timeline-3day":{type:"timeline-3day",slotDuration:"01:00:00"},"timeline-week":{type:"timeline-week",slotDuration:"01:00:00"}},se={blue:"#3b82f6",green:"#22c55e",red:"#ef4444",yellow:"#eab308",purple:"#a855f7",orange:"#f97316",pink:"#ec4899",teal:"#14b8a6",gray:"#6b7280",indigo:"#6366f1"},ue={blue:{bg:"bg-blue-100",text:"text-blue-800",border:"border-blue-300"},green:{bg:"bg-green-100",text:"text-green-800",border:"border-green-300"},red:{bg:"bg-red-100",text:"text-red-800",border:"border-red-300"},yellow:{bg:"bg-yellow-100",text:"text-yellow-800",border:"border-yellow-300"},purple:{bg:"bg-purple-100",text:"text-purple-800",border:"border-purple-300"},orange:{bg:"bg-orange-100",text:"text-orange-800",border:"border-orange-300"},pink:{bg:"bg-pink-100",text:"text-pink-800",border:"border-pink-300"},teal:{bg:"bg-teal-100",text:"text-teal-800",border:"border-teal-300"},gray:{bg:"bg-gray-100",text:"text-gray-800",border:"border-gray-300"},indigo:{bg:"bg-indigo-100",text:"text-indigo-800",border:"border-indigo-300"}},ie={"#3b82f6":"blue","#22c55e":"green","#ef4444":"red","#eab308":"yellow","#a855f7":"purple","#f97316":"orange","#ec4899":"pink","#14b8a6":"teal","#6b7280":"gray","#6366f1":"indigo"},ce=24,le=60,L=60*1e3,Y=60*L,fe=24*Y,I=64,ge=32,de=56,De=200,B=20;function g(e){const t=new Date(e);return t.setHours(0,0,0,0),t}function T(e){const t=new Date(e);return t.setHours(23,59,59,999),t}function c(e,t){const n=new Date(e);return n.setDate(n.getDate()+t),n}function me(e,t){return c(e,-t)}function h(e,t){return e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()&&e.getDate()===t.getDate()}function C(e){return h(e,new Date)}function ye(e){return e.getDay()}function x(e){const t=e.getDay();return t===0||t===6}function D(e,t=1){const n=new Date(e),r=n.getDay(),o=(r<t?7:0)+r-t;return n.setDate(n.getDate()-o),n.setHours(0,0,0,0),n}function p(e,t=1){const n=D(e,t);return n.setDate(n.getDate()+6),n.setHours(23,59,59,999),n}function b(e,t){return c(e,t*7)}function he(e,t){return c(e,-t*7)}function Ee(e){const t=new Date(Date.UTC(e.getFullYear(),e.getMonth(),e.getDate())),n=t.getUTCDay()||7;t.setUTCDate(t.getUTCDate()+4-n);const r=new Date(Date.UTC(t.getUTCFullYear(),0,1));return Math.ceil(((t.getTime()-r.getTime())/864e5+1)/7)}function Te(e,t,n=1){const r=D(e,n),o=D(t,n);return h(r,o)}function S(e){const t=new Date(e);return t.setDate(1),t.setHours(0,0,0,0),t}function M(e){const t=new Date(e.getFullYear(),e.getMonth()+1,0);return t.setHours(23,59,59,999),t}function k(e,t){const n=new Date(e);return n.setMonth(n.getMonth()+t),n}function pe(e,t){return k(e,-t)}function Se(e){return new Date(e.getFullYear(),e.getMonth()+1,0).getDate()}function _(e,t){return e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()}function U(e){return new Date(e.getFullYear(),0,1,0,0,0,0)}function N(e){return new Date(e.getFullYear(),11,31,23,59,59,999)}function v(e,t){const n=new Date(e);return n.setFullYear(n.getFullYear()+t),n}function Me(e,t){return v(e,-t)}function we(e,t){return e.getFullYear()===t.getFullYear()}function V(e,t){const n=new Date(e);return n.setHours(n.getHours()+t),n}function He(e,t){const n=new Date(e);return n.setMinutes(n.getMinutes()+t),n}function be(e,t,n=0,r=0){const o=new Date(e);return o.setHours(t,n,r,0),o}function Ie(e){return e.getHours()+e.getMinutes()/60}function ke(e,t){return e.getTime()<t.getTime()}function Oe(e,t){return e.getTime()>t.getTime()}function _e(e,t,n){const r=e.getTime();return r>=t.getTime()&&r<=n.getTime()}function ve(e){if(e.length!==0)return e.reduce((t,n)=>n<t?n:t)}function Fe(e){if(e.length!==0)return e.reduce((t,n)=>n>t?n:t)}function F(e,t){return e.getTime()-t.getTime()}function Re(e,t){return Math.floor(F(e,t)/6e4)}function Ae(e,t){return Math.floor(F(e,t)/36e5)}function Ce(e,t){const n=g(e),r=g(t);return Math.floor(F(n,r)/864e5)}function H(e,t="24h"){const n=e.getHours(),r=e.getMinutes();if(t==="12h"){const o=n>=12?"PM":"AM";return`${n%12||12}:${r.toString().padStart(2,"0")} ${o}`}return`${n.toString().padStart(2,"0")}:${r.toString().padStart(2,"0")}`}function xe(e){const t=e.getFullYear(),n=(e.getMonth()+1).toString().padStart(2,"0"),r=e.getDate().toString().padStart(2,"0");return`${t}-${n}-${r}`}function Ue(e){return new Date(e)}function P(e,t){const n=[];let r=g(e);const o=g(t);for(;r<=o;)n.push(new Date(r)),r=c(r,1);return n}function We(e,t){const n=[];let r=new Date(e);for(;r<=t;)n.push(new Date(r)),r=V(r,1);return n}function $e(e="en-US",t="short"){const n=new Intl.DateTimeFormat(e,{weekday:t}),r=[],o=new Date(2024,0,7);for(let a=0;a<7;a++)r.push(n.format(c(o,a)));return r}function Le(e="en-US",t="long"){const n=new Intl.DateTimeFormat(e,{month:t}),r=[];for(let o=0;o<12;o++)r.push(n.format(new Date(2024,o,1)));return r}function Ye(e){const t=[];for(let n=e.startHour;n<=e.endHour;n++)t.push(n);return t}function Be(e,t="24h"){if(t==="12h"){const n=e>=12?"PM":"AM";return`${e%12||12} ${n}`}return`${String(e).padStart(2,"0")}:00`}function Ne(e,t=1){const n=D(e,t),r=[];for(let o=0;o<7;o++)r.push(c(n,o));return r}function Ve(e,t=1){const n=S(e),r=M(e),o=D(n,t),a=p(r,t),s=e.getMonth();return P(o,a).map(l=>({date:l,isCurrentMonth:l.getMonth()===s,isWeekend:l.getDay()===0||l.getDay()===6}))}function R(e){if(e.isAllDay===!0)return!0;if(e.isAllDay===!1)return!1;const t=e.startDate.getHours(),n=e.startDate.getMinutes(),r=e.endDate.getHours(),o=e.endDate.getMinutes(),a=t===0&&n===0,s=r===0&&o===0||r===23&&o>=59;return!!(a&&s)}function Pe(e){const t=[],n=[];for(const r of e)R(r)?n.push(r):h(r.startDate,r.endDate)?t.push(r):n.push(r);return{singleDay:t,multiDay:n}}function Ge(e,t,n){return e.filter(r=>r.startDate<=n&&r.endDate>=t)}function ze(e,t,n){if(!n)return!0;const r=e.getDay(),o=n[r];return!o||!(o.enabled!==!1)||o.from===o.to?!1:t>=o.from&&t<o.to}function Xe(e,t){const n=e.getDay(),r=t[n];return!r||!(r.enabled!==!1)||r.from===r.to?null:{from:r.from,to:r.to}}function je(e){const t=[];for(let n=0;n<12;n++)t.push(new Date(e,n,1));return t}function G(e,t,n){const r=g(t),o=T(n);return e.filter(a=>{const s=a.startDate,u=a.endDate;return s<=o&&u>=r})}function z(e,t){return t.length===0?e:e.filter(n=>n.scheduleTypeId!==void 0&&t.includes(n.scheduleTypeId))}function X(e,t){return t.length===0?e:e.filter(n=>n.resourceId!==void 0&&t.includes(n.resourceId))}function j(e,t){if(!t.trim())return e;const n=t.toLowerCase();return e.filter(r=>{const o=r.title.toLowerCase().includes(n),a=r.description?.toLowerCase().includes(n);return o||a})}function J(e){return e.filter(t=>!t.isCanceled)}function Je(e,t){let n=[...e];return t.dateRange&&(n=G(n,t.dateRange.startDate,t.dateRange.endDate)),t.scheduleTypeIds&&t.scheduleTypeIds.length>0&&(n=z(n,t.scheduleTypeIds)),t.resourceIds&&t.resourceIds.length>0&&(n=X(n,t.resourceIds)),t.search&&(n=j(n,t.search)),t.showCanceled||(n=J(n)),n}function Ke(e){return[...e].sort((t,n)=>t.startDate.getTime()-n.startDate.getTime())}function qe(e){return[...e].sort((t,n)=>t.endDate.getTime()-n.endDate.getTime())}function Qe(e){return[...e].sort((t,n)=>{const r=t.endDate.getTime()-t.startDate.getTime();return n.endDate.getTime()-n.startDate.getTime()-r})}function Ze(e){const t=new Map;for(const n of e){const r=g(n.startDate).toISOString(),o=t.get(r)??[];o.push(n),t.set(r,o)}return t}function et(e){const t=new Map;for(const n of e){const r=t.get(n.scheduleTypeId)??[];r.push(n),t.set(n.scheduleTypeId,r)}return t}function tt(e){const t=new Map;for(const n of e){const r=t.get(n.resourceId)??[];r.push(n),t.set(n.resourceId,r)}return t}function nt(e,t){return e.filter(n=>{const r=g(t),o=T(t);return n.startDate<=o&&n.endDate>=r})}function rt(e){return e.filter(t=>t.isAllDay)}function ot(e){return e.filter(t=>!t.isAllDay)}function at(e){return e.filter(t=>t.isMultiDay?!0:!h(t.startDate,t.endDate))}function st(e){return e.isMultiDay?!0:!h(e.startDate,e.endDate)}function ut(e){return Math.floor((e.endDate.getTime()-e.startDate.getTime())/6e4)}function it(e,t="blue"){return e.color??t}function ct(e,t,n="blue"){if(e.color)return e.color;if(e.scheduleTypeId!==void 0&&t){const r=t.get(e.scheduleTypeId);if(r)return r}return n}function lt(e){if(R(e)){if(h(e.startDate,e.endDate))return"All day";const n=e.startDate.toLocaleDateString(void 0,{month:"short",day:"numeric"}),r=e.endDate.toLocaleDateString(void 0,{month:"short",day:"numeric"});return`All day · ${n} – ${r}`}if(!h(e.startDate,e.endDate)){const n=e.startDate.toLocaleDateString(void 0,{month:"short",day:"numeric"}),r=e.endDate.toLocaleDateString(void 0,{month:"short",day:"numeric"});return`${n}, ${H(e.startDate)} – ${r}, ${H(e.endDate)}`}return`${H(e.startDate)} - ${H(e.endDate)}`}function ft(e){return!R(e)}function K(e,t,n=1){switch(t){case"day":case"resource-day":case"timeline-day":return{startDate:g(e),endDate:T(e)};case"week":case"resource-week":case"timeline-week":return{startDate:D(e,n),endDate:p(e,n)};case"month":{const r=S(e),o=M(e);return{startDate:D(r,n),endDate:p(o,n)}}case"timeline-3day":return{startDate:g(e),endDate:T(c(e,2))};case"year":return{startDate:U(e),endDate:N(e)};case"agenda":return{startDate:g(e),endDate:T(c(e,29))};default:return{startDate:g(e),endDate:T(e)}}}function gt(e,t){switch(t){case"day":case"resource-day":case"timeline-day":return c(e,1);case"timeline-3day":return c(e,3);case"week":case"resource-week":case"timeline-week":return b(e,1);case"month":return k(e,1);case"year":return v(e,1);case"agenda":return b(e,1);default:return c(e,1)}}function dt(e,t){switch(t){case"day":case"resource-day":case"timeline-day":return c(e,-1);case"timeline-3day":return c(e,-3);case"week":case"resource-week":case"timeline-week":return b(e,-1);case"month":return k(e,-1);case"year":return v(e,-1);case"agenda":return b(e,-1);default:return c(e,-1)}}function Dt(){return g(new Date)}function mt(e,t=1){const n=S(e),r=M(e),o=D(n,t),a=p(r,t),s=[];let u=o;for(;u<=a;)s.push({date:new Date(u),isToday:C(u),isCurrentMonth:_(u,e),isWeekend:x(u),dayOfWeek:u.getDay()}),u=c(u,1);return s}function yt(e,t=1){const n=D(e,t),r=[];for(let o=0;o<7;o++){const a=c(n,o);r.push({date:a,isToday:C(a),isCurrentMonth:_(a,e),isWeekend:x(a),dayOfWeek:a.getDay()})}return r}function ht(e){const t=U(e),n=[];for(let r=0;r<12;r++){const o=k(t,r);n.push({date:o,isToday:_(o,new Date),isCurrentMonth:!0,isWeekend:!1,dayOfWeek:o.getDay()})}return n}function Et(e,t,n=30){const r=[],o=60/n;for(let a=e;a<t;a++)for(let s=0;s<o;s++){const u=s*n;r.push({hour:a,minute:u,label:`${a.toString().padStart(2,"0")}:${u.toString().padStart(2,"0")}`})}return r}function Tt(e,t,n="24h"){const r=[];for(let o=e;o<=t;o++){let a;if(n==="12h"){const s=o>=12?"PM":"AM";a=`${o%12||12} ${s}`}else a=`${o.toString().padStart(2,"0")}:00`;r.push({hour:o,label:a})}return r}function pt(e,t,n="en-US"){const r=new Intl.DateTimeFormat(n,{weekday:"short",month:"short",day:"numeric"}),o=new Intl.DateTimeFormat(n,{month:"short",day:"numeric"});switch(t){case"day":case"resource-day":case"timeline-day":return r.format(e);case"timeline-3day":{const a=g(e),s=c(e,2);return`${o.format(a)} - ${o.format(s)}`}case"week":case"resource-week":case"timeline-week":{const a=D(e,1),s=p(e,1);return`${o.format(a)} - ${o.format(s)}`}case"month":{const a=S(e),s=M(e);return`${o.format(a)} - ${o.format(s)}`}case"year":return`Jan 1 - Dec 31, ${e.getFullYear()}`;case"agenda":{const a=S(e),s=M(e);return`${o.format(a)} - ${o.format(s)}`}default:return""}}function St(e,t,n,r=1){const o=K(t,n,r);return e.filter(a=>a.startDate<=o.endDate&&a.endDate>=o.startDate).length}function Mt(e,t,n="en-US"){const r=new Intl.DateTimeFormat(n,{month:"long",year:"numeric"}),o=new Intl.DateTimeFormat(n,{weekday:"long",month:"long",day:"numeric",year:"numeric"});switch(t){case"day":case"resource-day":case"timeline-day":return o.format(e);case"week":case"resource-week":case"timeline-week":{const a=D(e,1),s=p(e,1),u=new Intl.DateTimeFormat(n,{month:"short"}).format(a),l=new Intl.DateTimeFormat(n,{month:"short"}).format(s),i=a.getFullYear();return u===l?`${u} ${a.getDate()} - ${s.getDate()}, ${i}`:`${u} ${a.getDate()} - ${l} ${s.getDate()}, ${i}`}case"month":return r.format(e);case"year":return e.getFullYear().toString();case"agenda":return`Agenda - ${r.format(e)}`;default:return r.format(e)}}function wt(e=1,t="short",n="en-US"){const r=new Intl.DateTimeFormat(n,{weekday:t}),o=[],a=new Date(2024,0,7);for(let s=0;s<7;s++){const u=(e+s)%7,l=c(a,u);o.push({dayOfWeek:u,label:r.format(l)})}return o}function q(e,t,n,r=I){const{startHour:o,endHour:a}=n,s=a-o,u=s*r,l=e.startDate.getHours()+e.startDate.getMinutes()/60,i=e.endDate.getHours()+e.endDate.getMinutes()/60,d=Math.max(l,o),E=Math.min(i,a),m=(d-o)/s*u,y=(E-o)/s*u,f=Math.max(y-m,B);return{top:m,height:f,left:0,width:100,zIndex:1}}function Ht(e,t,n,r=I){if(e.length===0)return[];const o=[...e].sort((i,d)=>{const E=i.startDate.getTime()-d.startDate.getTime();if(E!==0)return E;const m=i.endDate.getTime()-i.startDate.getTime();return d.endDate.getTime()-d.startDate.getTime()-m}),a=[];let s=[],u=0;for(const i of o)s.length===0||i.startDate.getTime()<u?(s.push(i),u=Math.max(u,i.endDate.getTime())):(a.push(s),s=[i],u=i.endDate.getTime());s.length>0&&a.push(s);const l=[];for(const i of a){const d=[];for(const f of i){const Q=f.startDate.getTime(),Z=f.endDate.getTime();let w=-1;for(let O=0;O<d.length;O++){const A=d[O];if(!A)continue;const $=A[A.length-1];if($&&$.endTime<=Q){w=O;break}}w===-1&&(w=d.length,d.push([]));const W=d[w];W&&W.push({event:f,endTime:Z});const ee=q(f,t,n,r);l.push({event:f,position:ee,column:w,columnSpan:1})}const m=100/d.length,y=new Set(i.map(f=>f.id));for(const f of l)y.has(f.event.id)&&(f.position.left=f.column*m,f.position.width=m*f.columnSpan,f.position.zIndex=f.column+1)}return l}function bt(e,t,n,r=I,o=30){const{startHour:a,endHour:s}=n,u=s-a,l=u*r,i=e/l*u,E=(a+i)*60,m=Math.round(E/o)*o,y=new Date(t);return y.setHours(0,0,0,0),y.setMinutes(m),y}function It(e,t,n=I){const{startHour:r,endHour:o}=t,a=o-r,s=a*n,u=e.getHours()+e.getMinutes()/60;return(Math.max(r,Math.min(u,o))-r)/a*s}function kt(e,t){return e.startDate<t.endDate&&e.endDate>t.startDate}function Ot(e){if(e.length===0)return[];const t=[...e].sort((a,s)=>a.startDate.getTime()-s.startDate.getTime()),n=[];let r=[],o=0;for(const a of t)r.length===0||a.startDate.getTime()<o?(r.push(a),o=Math.max(o,a.endDate.getTime())):(r.length>0&&n.push(r),r=[a],o=a.endDate.getTime());return r.length>0&&n.push(r),n}function _t(e,t,n){const r=Math.max(0,Math.min(e,t)),o=Math.min(n,Math.max(e,t));return{top:r,height:o-r}}exports.CALENDAR_VIEWS=te;exports.DEFAULT_BUSINESS_HOURS=oe;exports.DEFAULT_HEADER_HEIGHT=de;exports.DEFAULT_HOUR_HEIGHT=I;exports.DEFAULT_PREFERENCES=ne;exports.DEFAULT_RESOURCE_WIDTH=De;exports.DEFAULT_SLOT_HEIGHT=ge;exports.DEFAULT_VIEW_CONFIGS=ae;exports.DEFAULT_VISIBLE_HOURS=re;exports.EVENT_COLORS=se;exports.EVENT_COLOR_CLASSES=ue;exports.HEX_TO_EVENT_COLOR=ie;exports.HOURS_IN_DAY=ce;exports.MINUTES_IN_HOUR=le;exports.MIN_EVENT_HEIGHT=B;exports.MS_PER_DAY=fe;exports.MS_PER_HOUR=Y;exports.MS_PER_MINUTE=L;exports.addDays=c;exports.addHours=V;exports.addMinutes=He;exports.addMonths=k;exports.addWeeks=b;exports.addYears=v;exports.applyEventFilters=Je;exports.calculateEventPosition=q;exports.calculateOverlappingPositions=Ht;exports.calculateSelectionOverlay=_t;exports.detectAllDayEvent=R;exports.differenceInDays=Ce;exports.differenceInHours=Ae;exports.differenceInMilliseconds=F;exports.differenceInMinutes=Re;exports.eachDayOfInterval=P;exports.eachHourOfInterval=We;exports.endOfDay=T;exports.endOfMonth=M;exports.endOfWeek=p;exports.endOfYear=N;exports.eventsOverlap=kt;exports.filterEventsByDateRange=G;exports.filterEventsByResource=X;exports.filterEventsByScheduleType=z;exports.filterEventsBySearch=j;exports.filterOutCanceled=J;exports.formatDateISO=xe;exports.formatEventTimeDisplay=lt;exports.formatHourLabel=Be;exports.formatTime=H;exports.generateHourLabels=Tt;exports.generateMonthCells=mt;exports.generateMonthGrid=Ve;exports.generateTimeSlots=Et;exports.generateWeekCells=yt;exports.generateYearCells=ht;exports.getAllDayEvents=rt;exports.getDayOfWeek=ye;exports.getDaysInMonth=Se;exports.getDecimalHours=Ie;exports.getEventColor=it;exports.getEventDurationMinutes=ut;exports.getEventsCountInView=St;exports.getEventsForDay=nt;exports.getEventsInRange=Ge;exports.getMonthNames=Le;exports.getMultiDayEvents=at;exports.getOverlappingGroups=Ot;exports.getRangeText=pt;exports.getTimedEvents=ot;exports.getViewDateRange=K;exports.getViewTitle=Mt;exports.getVisibleHoursArray=Ye;exports.getWeekDays=Ne;exports.getWeekNumber=Ee;exports.getWeekdayHeaders=wt;exports.getWeekdayNames=$e;exports.getWorkingHoursForDay=Xe;exports.getYearMonths=je;exports.groupEventsByDate=Ze;exports.groupEventsByResource=tt;exports.groupEventsByScheduleType=et;exports.isAfter=Oe;exports.isBefore=ke;exports.isBetween=_e;exports.isMultiDayEvent=st;exports.isSameDay=h;exports.isSameMonth=_;exports.isSameWeek=Te;exports.isSameYear=we;exports.isToday=C;exports.isWeekend=x;exports.isWorkingHour=ze;exports.maxDate=Fe;exports.minDate=ve;exports.navigateNext=gt;exports.navigatePrev=dt;exports.navigateToday=Dt;exports.parseISO=Ue;exports.resolveEventColor=ct;exports.separateEventsByDuration=Pe;exports.setTime=be;exports.shouldShowEventTime=ft;exports.sortEventsByDuration=Qe;exports.sortEventsByEnd=qe;exports.sortEventsByStart=Ke;exports.startOfDay=g;exports.startOfMonth=S;exports.startOfWeek=D;exports.startOfYear=U;exports.subDays=me;exports.subMonths=pe;exports.subWeeks=he;exports.subYears=Me;exports.timeToY=It;exports.yToTime=bt;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./position-utils-BQpbtF6N.cjs");exports.CALENDAR_VIEWS=e.CALENDAR_VIEWS;exports.DEFAULT_BUSINESS_HOURS=e.DEFAULT_BUSINESS_HOURS;exports.DEFAULT_HEADER_HEIGHT=e.DEFAULT_HEADER_HEIGHT;exports.DEFAULT_HOUR_HEIGHT=e.DEFAULT_HOUR_HEIGHT;exports.DEFAULT_PREFERENCES=e.DEFAULT_PREFERENCES;exports.DEFAULT_RESOURCE_WIDTH=e.DEFAULT_RESOURCE_WIDTH;exports.DEFAULT_SLOT_HEIGHT=e.DEFAULT_SLOT_HEIGHT;exports.DEFAULT_VIEW_CONFIGS=e.DEFAULT_VIEW_CONFIGS;exports.DEFAULT_VISIBLE_HOURS=e.DEFAULT_VISIBLE_HOURS;exports.EVENT_COLORS=e.EVENT_COLORS;exports.EVENT_COLOR_CLASSES=e.EVENT_COLOR_CLASSES;exports.HEX_TO_EVENT_COLOR=e.HEX_TO_EVENT_COLOR;exports.HOURS_IN_DAY=e.HOURS_IN_DAY;exports.MINUTES_IN_HOUR=e.MINUTES_IN_HOUR;exports.MIN_EVENT_HEIGHT=e.MIN_EVENT_HEIGHT;exports.MS_PER_DAY=e.MS_PER_DAY;exports.MS_PER_HOUR=e.MS_PER_HOUR;exports.MS_PER_MINUTE=e.MS_PER_MINUTE;exports.addDays=e.addDays;exports.addHours=e.addHours;exports.addMinutes=e.addMinutes;exports.addMonths=e.addMonths;exports.addWeeks=e.addWeeks;exports.addYears=e.addYears;exports.applyEventFilters=e.applyEventFilters;exports.calculateEventPosition=e.calculateEventPosition;exports.calculateOverlappingPositions=e.calculateOverlappingPositions;exports.calculateSelectionOverlay=e.calculateSelectionOverlay;exports.detectAllDayEvent=e.detectAllDayEvent;exports.differenceInDays=e.differenceInDays;exports.differenceInHours=e.differenceInHours;exports.differenceInMilliseconds=e.differenceInMilliseconds;exports.differenceInMinutes=e.differenceInMinutes;exports.eachDayOfInterval=e.eachDayOfInterval;exports.eachHourOfInterval=e.eachHourOfInterval;exports.endOfDay=e.endOfDay;exports.endOfMonth=e.endOfMonth;exports.endOfWeek=e.endOfWeek;exports.endOfYear=e.endOfYear;exports.eventsOverlap=e.eventsOverlap;exports.filterEventsByDateRange=e.filterEventsByDateRange;exports.filterEventsByResource=e.filterEventsByResource;exports.filterEventsByScheduleType=e.filterEventsByScheduleType;exports.filterEventsBySearch=e.filterEventsBySearch;exports.filterOutCanceled=e.filterOutCanceled;exports.formatDateISO=e.formatDateISO;exports.formatEventTimeDisplay=e.formatEventTimeDisplay;exports.formatHourLabel=e.formatHourLabel;exports.formatTime=e.formatTime;exports.generateHourLabels=e.generateHourLabels;exports.generateMonthCells=e.generateMonthCells;exports.generateMonthGrid=e.generateMonthGrid;exports.generateTimeSlots=e.generateTimeSlots;exports.generateWeekCells=e.generateWeekCells;exports.generateYearCells=e.generateYearCells;exports.getAllDayEvents=e.getAllDayEvents;exports.getDayOfWeek=e.getDayOfWeek;exports.getDaysInMonth=e.getDaysInMonth;exports.getDecimalHours=e.getDecimalHours;exports.getEventColor=e.getEventColor;exports.getEventDurationMinutes=e.getEventDurationMinutes;exports.getEventsCountInView=e.getEventsCountInView;exports.getEventsForDay=e.getEventsForDay;exports.getEventsInRange=e.getEventsInRange;exports.getMonthNames=e.getMonthNames;exports.getMultiDayEvents=e.getMultiDayEvents;exports.getOverlappingGroups=e.getOverlappingGroups;exports.getRangeText=e.getRangeText;exports.getTimedEvents=e.getTimedEvents;exports.getViewDateRange=e.getViewDateRange;exports.getViewTitle=e.getViewTitle;exports.getVisibleHoursArray=e.getVisibleHoursArray;exports.getWeekDays=e.getWeekDays;exports.getWeekNumber=e.getWeekNumber;exports.getWeekdayHeaders=e.getWeekdayHeaders;exports.getWeekdayNames=e.getWeekdayNames;exports.getWorkingHoursForDay=e.getWorkingHoursForDay;exports.getYearMonths=e.getYearMonths;exports.groupEventsByDate=e.groupEventsByDate;exports.groupEventsByResource=e.groupEventsByResource;exports.groupEventsByScheduleType=e.groupEventsByScheduleType;exports.isAfter=e.isAfter;exports.isBefore=e.isBefore;exports.isBetween=e.isBetween;exports.isMultiDayEvent=e.isMultiDayEvent;exports.isSameDay=e.isSameDay;exports.isSameMonth=e.isSameMonth;exports.isSameWeek=e.isSameWeek;exports.isSameYear=e.isSameYear;exports.isToday=e.isToday;exports.isWeekend=e.isWeekend;exports.isWorkingHour=e.isWorkingHour;exports.maxDate=e.maxDate;exports.minDate=e.minDate;exports.navigateNext=e.navigateNext;exports.navigatePrev=e.navigatePrev;exports.navigateToday=e.navigateToday;exports.parseISO=e.parseISO;exports.reactNodeToText=e.reactNodeToText;exports.resolveEventColor=e.resolveEventColor;exports.separateEventsByDuration=e.separateEventsByDuration;exports.setTime=e.setTime;exports.shouldShowEventTime=e.shouldShowEventTime;exports.sortEventsByDuration=e.sortEventsByDuration;exports.sortEventsByEnd=e.sortEventsByEnd;exports.sortEventsByStart=e.sortEventsByStart;exports.startOfDay=e.startOfDay;exports.startOfMonth=e.startOfMonth;exports.startOfWeek=e.startOfWeek;exports.startOfYear=e.startOfYear;exports.subDays=e.subDays;exports.subMonths=e.subMonths;exports.subWeeks=e.subWeeks;exports.subYears=e.subYears;exports.timeToY=e.timeToY;exports.yToTime=e.yToTime;
2
2
  //# sourceMappingURL=utils.cjs.map