@innosolutions/inno-calendar 1.0.21 → 1.0.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{agenda-dropdown-D8rfvI3Q.js → agenda-dropdown-CXEm80us.js} +665 -661
- package/dist/agenda-dropdown-CXEm80us.js.map +1 -0
- package/dist/agenda-dropdown-DscR56sP.cjs +2 -0
- package/dist/agenda-dropdown-DscR56sP.cjs.map +1 -0
- package/dist/agenda-view-CVYk83hH.cjs +11 -0
- package/dist/{agenda-view-BotvTTEB.cjs.map → agenda-view-CVYk83hH.cjs.map} +1 -1
- package/dist/{agenda-view-CRI1J_KB.js → agenda-view-DM01Fpvr.js} +795 -733
- package/dist/{agenda-view-CRI1J_KB.js.map → agenda-view-DM01Fpvr.js.map} +1 -1
- package/dist/components/index.cjs +1 -1
- package/dist/components/index.mjs +2 -2
- package/dist/components/inno-calendar.d.ts +7 -1
- package/dist/components/inno-calendar.d.ts.map +1 -1
- package/dist/components/views/month-view.d.ts +7 -1
- package/dist/components/views/month-view.d.ts.map +1 -1
- package/dist/components/views/timeline-view.d.ts +1 -1
- package/dist/components/views/timeline-view.d.ts.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.mjs +3 -3
- package/dist/presets/index.cjs +1 -1
- package/dist/presets/index.mjs +1 -1
- package/dist/{tailwind-calendar-CQBD-ljO.cjs → tailwind-calendar-BvdxZ56F.cjs} +2 -2
- package/dist/{tailwind-calendar-CQBD-ljO.cjs.map → tailwind-calendar-BvdxZ56F.cjs.map} +1 -1
- package/dist/{tailwind-calendar-Y9dn5uKm.js → tailwind-calendar-DtZENWzv.js} +2 -2
- package/dist/{tailwind-calendar-Y9dn5uKm.js.map → tailwind-calendar-DtZENWzv.js.map} +1 -1
- package/package.json +1 -1
- package/dist/agenda-dropdown-D8rfvI3Q.js.map +0 -1
- package/dist/agenda-dropdown-oY4qocpp.cjs +0 -2
- package/dist/agenda-dropdown-oY4qocpp.cjs.map +0 -1
- package/dist/agenda-view-BotvTTEB.cjs +0 -11
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agenda-dropdown-CXEm80us.js","sources":["../src/components/calendar.tsx","../src/components/views/year-view.tsx","../src/components/views/timeline-view.tsx","../src/components/inno-calendar.tsx","../src/components/ui/select.tsx","../src/components/event/event-popover.tsx","../src/components/settings/slot-duration-setting.tsx","../src/components/settings/visible-hours-setting.tsx","../src/components/settings/badge-variant-setting.tsx","../src/components/settings/working-hours-setting.tsx","../src/components/filters/user-filter.tsx","../src/components/filters/schedule-type-filter.tsx","../src/components/filters/calendar-filter-sidebar.tsx","../src/components/widget/agenda-widget.tsx","../src/components/widget/agenda-dropdown.tsx"],"sourcesContent":["/**\r\n * Calendar - Main Calendar Component\r\n *\r\n * A flexible calendar component that can be used standalone or with custom components.\r\n * Supports all calendar views and integrates with the useCalendar hook.\r\n */\r\n\r\nimport type { ReactNode } from 'react';\r\nimport type {\r\n\tCalendarEvent,\r\n\tTCalendarView,\r\n\tICalendarPreferences,\r\n\tICalendarFilters,\r\n\tIResource,\r\n\tIScheduleType,\r\n\tICalendarSlots,\r\n\tISelectionResult,\r\n} from '../core/types';\r\nimport { useCalendar } from '../core/hooks';\r\nimport { CalendarProvider, useOptionalCalendarContext } from '../core/context';\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface CalendarProps<\r\n\tTEventData = Record<string, unknown>,\r\n\tTScheduleTypeData = Record<string, unknown>,\r\n\tTResourceData = Record<string, unknown>,\r\n> {\r\n\t/** Events to display */\r\n\tevents: CalendarEvent<TEventData>[];\r\n\r\n\t/** Available resources (for resource views) */\r\n\tresources?: IResource<TResourceData>[];\r\n\r\n\t/** Available schedule types */\r\n\tscheduleTypes?: IScheduleType<TScheduleTypeData>[];\r\n\r\n\t/** Initial view */\r\n\tinitialView?: TCalendarView;\r\n\r\n\t/** Initial date */\r\n\tinitialDate?: Date;\r\n\r\n\t/** Initial filters */\r\n\tinitialFilters?: ICalendarFilters;\r\n\r\n\t/** User preferences */\r\n\tpreferences?: Partial<ICalendarPreferences>;\r\n\r\n\t/** Locale for formatting */\r\n\tlocale?: string;\r\n\r\n\t/** Custom component slots */\r\n\tslots?: ICalendarSlots<TEventData, TScheduleTypeData, TResourceData>;\r\n\r\n\t/** Render function for events */\r\n\trenderEvent?: (props: { event: CalendarEvent<TEventData>; view: TCalendarView }) => ReactNode;\r\n\r\n\t/** Callback when view changes */\r\n\tonViewChange?: (view: TCalendarView) => void;\r\n\r\n\t/** Callback when date changes */\r\n\tonDateChange?: (date: Date) => void;\r\n\r\n\t/** Callback when event is clicked */\r\n\tonEventClick?: (event: CalendarEvent<TEventData>) => void;\r\n\r\n\t/** Callback when slot is selected */\r\n\tonSlotSelect?: (selection: ISelectionResult) => void;\r\n\r\n\t/** Callback when filters change */\r\n\tonFiltersChange?: (filters: ICalendarFilters) => void;\r\n\r\n\t/** Additional CSS class */\r\n\tclassName?: string;\r\n\r\n\t/** Children (for custom layouts) */\r\n\tchildren?: ReactNode;\r\n}\r\n\r\n// ============================================================================\r\n// PLACEHOLDER VIEWS\r\n// ============================================================================\r\n\r\ninterface PlaceholderViewProps {\r\n\tview: TCalendarView;\r\n\tclassName?: string | undefined;\r\n}\r\n\r\nfunction PlaceholderView({ view, className = '' }: PlaceholderViewProps) {\r\n\treturn (\r\n\t\t<div\r\n\t\t\tclassName={className}\r\n\t\t\tstyle={{\r\n\t\t\t\tdisplay: 'flex',\r\n\t\t\t\talignItems: 'center',\r\n\t\t\t\tjustifyContent: 'center',\r\n\t\t\t\tminHeight: '400px',\r\n\t\t\t\tbackgroundColor: '#f9fafb',\r\n\t\t\t\tborderRadius: '0.5rem',\r\n\t\t\t\tborder: '1px dashed #d1d5db',\r\n\t\t\t}}\r\n\t\t>\r\n\t\t\t<div style={{ textAlign: 'center', color: '#6b7280' }}>\r\n\t\t\t\t<p style={{ fontSize: '1.125rem', fontWeight: 500 }}>\r\n\t\t\t\t\t{view.charAt(0).toUpperCase() + view.slice(1)} View\r\n\t\t\t\t</p>\r\n\t\t\t\t<p style={{ fontSize: '0.875rem' }}>Implementation pending</p>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t);\r\n}\r\n\r\n// ============================================================================\r\n// CALENDAR CONTENT\r\n// ============================================================================\r\n\r\ninterface CalendarContentProps {\r\n\tview: TCalendarView;\r\n\tclassName?: string | undefined;\r\n}\r\n\r\nfunction CalendarContent({ view, className }: CalendarContentProps) {\r\n\t// For now, render placeholder for all views\r\n\t// These will be replaced with actual view implementations\r\n\treturn <PlaceholderView view={view} className={className} />;\r\n}\r\n\r\n// ============================================================================\r\n// MAIN COMPONENT\r\n// ============================================================================\r\n\r\nexport function Calendar<\r\n\tTEventData = Record<string, unknown>,\r\n\tTScheduleTypeData = Record<string, unknown>,\r\n\tTResourceData = Record<string, unknown>,\r\n>(props: CalendarProps<TEventData, TScheduleTypeData, TResourceData>) {\r\n\tconst {\r\n\t\tevents,\r\n\t\tresources,\r\n\t\tscheduleTypes,\r\n\t\tinitialView = 'week',\r\n\t\tinitialDate,\r\n\t\tinitialFilters,\r\n\t\tpreferences,\r\n\t\tlocale,\r\n\t\tslots: _slots,\r\n\t\trenderEvent: _renderEvent,\r\n\t\tonViewChange,\r\n\t\tonDateChange,\r\n\t\tonEventClick,\r\n\t\tonSlotSelect,\r\n\t\tonFiltersChange,\r\n\t\tclassName,\r\n\t\tchildren,\r\n\t} = props;\r\n\r\n\t// Check if we're already inside a CalendarProvider\r\n\tconst existingContext = useOptionalCalendarContext<TEventData, TScheduleTypeData, TResourceData>();\r\n\r\n\t// If we have an existing context, just render the content\r\n\tif (existingContext) {\r\n\t\treturn (\r\n\t\t\t<div className={className} style={{ position: 'relative' }}>\r\n\t\t\t\t{children ?? <CalendarContent view={existingContext.view} className={className} />}\r\n\t\t\t</div>\r\n\t\t);\r\n\t}\r\n\r\n\t// Create our own calendar state\r\n\tconst calendar = useCalendar<TEventData, TScheduleTypeData, TResourceData>({\r\n\t\tevents,\r\n\t\tresources,\r\n\t\tscheduleTypes,\r\n\t\tinitialView,\r\n\t\tinitialDate,\r\n\t\tinitialFilters,\r\n\t\tpreferences,\r\n\t\tlocale,\r\n\t\tonViewChange,\r\n\t\tonDateChange,\r\n\t\tonEventClick,\r\n\t\tonSlotSelect,\r\n\t\tonFiltersChange,\r\n\t});\r\n\r\n\treturn (\r\n\t\t<CalendarProvider value={calendar}>\r\n\t\t\t<div className={className} style={{ position: 'relative' }}>\r\n\t\t\t\t{children ?? <CalendarContent view={calendar.view} className={className} />}\r\n\t\t\t</div>\r\n\t\t</CalendarProvider>\r\n\t);\r\n}\r\n","/**\r\n * Year View Component\r\n *\r\n * 12-month overview with mini calendars.\r\n * Features:\r\n * - All 12 months displayed\r\n * - Colored event dots on days\r\n * - Click month to navigate to month view\r\n * - Click day to navigate to day view\r\n *\r\n * Ported from agenda-v2 to maintain exact styling parity.\r\n */\r\n\r\nimport { cn } from '../../lib/utils';\r\nimport { useMemo } from 'react';\r\nimport type { CalendarEvent } from '../../core/types';\r\nimport { generateMonthGrid, getYearMonths, isToday } from '../../core/utils/date-utils';\r\nimport { getEventsForDay } from '../../core/utils/event-utils';\r\n\r\n// ============================================================================\r\n// CONSTANTS\r\n// ============================================================================\r\n\r\nconst WEEKDAY_LABELS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\r\nconst MONTH_NAMES = [\r\n 'January',\r\n 'February',\r\n 'March',\r\n 'April',\r\n 'May',\r\n 'June',\r\n 'July',\r\n 'August',\r\n 'September',\r\n 'October',\r\n 'November',\r\n 'December',\r\n];\r\n\r\n// ============================================================================\r\n// COLOR HELPERS\r\n// ============================================================================\r\n\r\n/**\r\n * Get background color style from event's hexColor (schedule type color)\r\n * Falls back to primary if not available\r\n */\r\nfunction getEventDotStyle(event: CalendarEvent): React.CSSProperties {\r\n const hexColor = (event as { hexColor?: string }).hexColor;\r\n if (hexColor) {\r\n return { backgroundColor: hexColor };\r\n }\r\n return {};\r\n}\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface YearViewProps<TData = Record<string, unknown>> {\r\n /** Events to display */\r\n events: CalendarEvent<TData>[];\r\n /** The year to display */\r\n year: number;\r\n /** Month click handler */\r\n onMonthClick?: (date: Date) => void;\r\n /** Day click handler */\r\n onDayClick?: (date: Date) => void;\r\n /** Additional CSS classes */\r\n className?: string;\r\n}\r\n\r\n// ============================================================================\r\n// DAY CELL COMPONENT\r\n// ============================================================================\r\n\r\ninterface DayCellProps {\r\n day: number;\r\n date: Date;\r\n events: CalendarEvent[];\r\n isCurrentMonth: boolean;\r\n onDayClick?: ((date: Date) => void) | undefined;\r\n}\r\n\r\nfunction DayCell({\r\n day,\r\n date,\r\n events,\r\n isCurrentMonth,\r\n onDayClick,\r\n}: DayCellProps) {\r\n const today = isToday(date);\r\n const maxIndicators = 3;\r\n const eventCount = events.length;\r\n\r\n return (\r\n <button\r\n type=\"button\"\r\n onClick={() => onDayClick?.(date)}\r\n className={cn(\r\n 'flex h-9 sm:h-11 flex-1 flex-col items-center justify-start gap-0.5 rounded-md pt-0.5 sm:pt-1',\r\n 'hover:bg-accent focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\r\n 'transition-colors',\r\n !isCurrentMonth && 'opacity-40',\r\n )}\r\n >\r\n <div\r\n className={cn(\r\n 'flex size-5 sm:size-6 items-center justify-center rounded-full text-[10px] sm:text-xs font-medium',\r\n today && 'bg-primary font-semibold text-primary-foreground',\r\n )}\r\n >\r\n {day}\r\n </div>\r\n\r\n {eventCount > 0 && (\r\n <div className=\"mt-0.5 flex items-center gap-0.5\">\r\n {eventCount <= maxIndicators ? (\r\n events.map((event) => (\r\n <div\r\n key={event.id}\r\n className=\"size-1 sm:size-1.5 rounded-full bg-primary\"\r\n style={getEventDotStyle(event)}\r\n />\r\n ))\r\n ) : (\r\n <>\r\n {/* Show first 3 dots for 4+ events */}\r\n {events.slice(0, maxIndicators).map((event) => (\r\n <div\r\n key={event.id}\r\n className=\"size-1 sm:size-1.5 rounded-full bg-primary\"\r\n style={getEventDotStyle(event)}\r\n />\r\n ))}\r\n <span className=\"text-[6px] sm:text-[7px] font-medium text-muted-foreground\">\r\n +{eventCount - maxIndicators}\r\n </span>\r\n </>\r\n )}\r\n </div>\r\n )}\r\n </button>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// MINI MONTH COMPONENT\r\n// ============================================================================\r\n\r\ninterface MiniMonthProps<TData = Record<string, unknown>> {\r\n date: Date;\r\n events: CalendarEvent<TData>[];\r\n onMonthClick?: ((date: Date) => void) | undefined;\r\n onDayClick?: ((date: Date) => void) | undefined;\r\n}\r\n\r\nfunction MiniMonth<TData = Record<string, unknown>>({\r\n date,\r\n events,\r\n onMonthClick,\r\n onDayClick,\r\n}: MiniMonthProps<TData>) {\r\n // Use Sunday start for year view (matches Google Calendar)\r\n const cells = useMemo(() => generateMonthGrid(date, 0), [date]);\r\n\r\n return (\r\n <div className=\"flex flex-col\">\r\n {/* Month header */}\r\n <button\r\n type=\"button\"\r\n onClick={() => onMonthClick?.(date)}\r\n className={cn(\r\n 'w-full rounded-t-lg border px-2 sm:px-3 py-1.5 sm:py-2 text-xs sm:text-sm font-semibold',\r\n 'hover:bg-accent focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\r\n 'transition-colors',\r\n )}\r\n >\r\n {MONTH_NAMES[date.getMonth()]}\r\n </button>\r\n\r\n {/* Month body */}\r\n <div className=\"flex-1 space-y-1.5 sm:space-y-2 rounded-b-lg border border-t-0 p-2 sm:p-3\">\r\n {/* Weekday headers */}\r\n <div className=\"grid grid-cols-7 gap-x-0.5 text-center\">\r\n {WEEKDAY_LABELS.map((label, i) => (\r\n <div\r\n key={i}\r\n className=\"text-[9px] sm:text-xs font-medium text-muted-foreground\"\r\n >\r\n <span className=\"sm:hidden\">{label[0]}</span>\r\n <span className=\"hidden sm:inline\">{label}</span>\r\n </div>\r\n ))}\r\n </div>\r\n\r\n {/* Days grid */}\r\n <div className=\"grid grid-cols-7 gap-x-0.5 gap-y-1\">\r\n {cells.map((cell, index) => {\r\n const dayEvents = getEventsForDay(events, cell.date);\r\n\r\n return (\r\n <DayCell\r\n key={`${index + 1}-${cell.date.toISOString()}`}\r\n day={cell.date.getDate()}\r\n date={cell.date}\r\n events={dayEvents as CalendarEvent[]}\r\n isCurrentMonth={cell.isCurrentMonth}\r\n onDayClick={onDayClick}\r\n />\r\n );\r\n })}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// YEAR VIEW COMPONENT\r\n// ============================================================================\r\n\r\nexport function YearView<TData = Record<string, unknown>>({\r\n events,\r\n year,\r\n onMonthClick,\r\n onDayClick,\r\n className,\r\n}: YearViewProps<TData>) {\r\n // All months in the year\r\n const months = useMemo(() => getYearMonths(year), [year]);\r\n\r\n return (\r\n <div className={cn('flex flex-col h-full', className)}>\r\n {/* Year header */}\r\n <div className=\"flex items-center justify-center border-b px-4 py-3\">\r\n <h2 className=\"text-lg font-semibold\">{year}</h2>\r\n </div>\r\n\r\n {/* Months grid */}\r\n <div className=\"flex-1 overflow-auto p-4\">\r\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4\">\r\n {months.map((monthDate) => (\r\n <MiniMonth\r\n key={monthDate.getMonth()}\r\n date={monthDate}\r\n events={events}\r\n onMonthClick={onMonthClick}\r\n onDayClick={onDayClick}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default YearView;\r\n","/**\r\n * Timeline View Component\r\n *\r\n * Horizontal timeline showing users/resources on Y-axis and time on X-axis.\r\n * Events display as colored bars with proper stacking for overlapping events.\r\n *\r\n * Features:\r\n * - User avatars and names on left column\r\n * - For 1-day: Hour columns across top (8am-6pm etc)\r\n * - For 3-day: Day headers with hour columns below each day\r\n * - For 7-day (week): Date columns across top\r\n * - Colored event bars with schedule type colors\r\n * - Proper event stacking when multiple events overlap\r\n * - Dynamic row heights to accommodate stacked events\r\n * - Click to view event details\r\n *\r\n * @template TData - Custom event data type\r\n */\r\n\r\nimport React, { useMemo, useRef } from 'react';\r\nimport { cn } from '../../lib/utils';\r\nimport { startOfDay, endOfDay, isToday, isWeekend } from '../../core/utils';\r\nimport type { CalendarEvent, ICalendarUser } from '../../core/types';\r\nimport { EventCard } from '../event/event-card';\r\n\r\n// ============================================================================\r\n// CONSTANTS\r\n// ============================================================================\r\n\r\nconst EVENT_HEIGHT = 44; // Height of each event bar\r\nconst EVENT_GAP = 4; // Gap between stacked events\r\nconst MIN_ROW_HEIGHT = 56; // Minimum height per user row\r\nconst ROW_PADDING = 8; // Vertical padding in rows\r\n\r\n// Column widths for different modes\r\nconst MIN_HOUR_COLUMN_WIDTH = 80; // Minimum width of each hour column\r\nconst MIN_DATE_COLUMN_WIDTH = 100; // Minimum width of each date column (week view)\r\nconst USER_COLUMN_WIDTH = 140; // Width of user info column\r\n\r\n// Dynamic width constants\r\nconst MIN_EVENT_CARD_WIDTH = 100; // Minimum width for single-column events to be readable\r\nconst MAX_SINGLE_COL_EVENTS_BEFORE_EXPAND = 2; // If more than this many single-column events in a column, expand it\r\n\r\n// Default hours to show\r\nconst DEFAULT_START_HOUR = 8;\r\nconst DEFAULT_END_HOUR = 18;\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\ninterface TimelineUser {\r\n id: string;\r\n name: string;\r\n avatar?: string | undefined;\r\n email?: string | undefined;\r\n}\r\n\r\ninterface PositionedEvent<TData> {\r\n event: CalendarEvent<TData>;\r\n startCol: number;\r\n spanCols: number;\r\n stackIndex: number; // Vertical position in stack\r\n}\r\n\r\ninterface UserRow<TData> {\r\n user: TimelineUser;\r\n events: PositionedEvent<TData>[];\r\n maxStack: number; // Maximum number of stacked events\r\n}\r\n\r\ninterface HourColumn {\r\n hour: number;\r\n dayIndex: number; // Which day (0, 1, 2 for 3-day)\r\n date: Date;\r\n}\r\n\r\n// ============================================================================\r\n// PROPS\r\n// ============================================================================\r\n\r\nexport interface TimelineViewProps<TData = Record<string, unknown>> {\r\n /** Number of days to display - 1 for day, 3 for 3-day, 7 for week */\r\n daysToShow?: 1 | 3 | 7;\r\n\r\n /** Events to display */\r\n events: CalendarEvent<TData>[];\r\n\r\n /** Users/resources to display as rows */\r\n users?: ICalendarUser[];\r\n\r\n /** Currently selected/focused date */\r\n selectedDate?: Date;\r\n\r\n /** Callback when selected date changes */\r\n onDateChange?: (date: Date) => void;\r\n\r\n /** Callback when an event is clicked */\r\n onEventClick?: (event: CalendarEvent<TData>) => void;\r\n\r\n /** Visible hours range */\r\n visibleHours?: { from: number; to: number };\r\n\r\n /** Additional CSS class */\r\n className?: string;\r\n\r\n /** Function to get user ID from event (defaults to checking event.data.userId) */\r\n getEventUserId?: (event: CalendarEvent<TData>) => string | undefined;\r\n\r\n /** Custom popover content for events */\r\n renderPopover?: ((props: { event: CalendarEvent<TData>; onClose: () => void }) => React.ReactNode) | undefined;\r\n}\r\n\r\n// ============================================================================\r\n// HELPER FUNCTIONS\r\n// ============================================================================\r\n\r\n/**\r\n * Get initials from name\r\n */\r\nfunction getInitials(name: string): string {\r\n return name\r\n .split(' ')\r\n .map((n) => n[0])\r\n .join('')\r\n .toUpperCase()\r\n .slice(0, 2);\r\n}\r\n\r\n/**\r\n * Generate array of dates for timeline columns (week view)\r\n */\r\nfunction generateDateColumns(startDate: Date, numDays: number): Date[] {\r\n const dates: Date[] = [];\r\n for (let i = 0; i < numDays; i++) {\r\n const date = new Date(startDate);\r\n date.setDate(date.getDate() + i);\r\n dates.push(date);\r\n }\r\n return dates;\r\n}\r\n\r\n/**\r\n * Generate hour columns for day/3-day views\r\n */\r\nfunction generateHourColumns(\r\n dates: Date[],\r\n startHour: number,\r\n endHour: number,\r\n): HourColumn[] {\r\n const columns: HourColumn[] = [];\r\n dates.forEach((date, dayIndex) => {\r\n for (let hour = startHour; hour < endHour; hour++) {\r\n columns.push({ hour, dayIndex, date });\r\n }\r\n });\r\n return columns;\r\n}\r\n\r\n/**\r\n * Format hour for display in 24h format (e.g., \"09:00\", \"14:00\")\r\n */\r\nfunction formatHour(hour: number): string {\r\n return `${hour.toString().padStart(2, '0')}:00`;\r\n}\r\n\r\n/**\r\n * Format date for column header (e.g., \"Mon 05\")\r\n */\r\nfunction formatColumnDate(date: Date): { day: string; date: string } {\r\n const dayName = date.toLocaleDateString('en-US', { weekday: 'short' });\r\n const dateNum = String(date.getDate()).padStart(2, '0');\r\n return { day: dayName, date: dateNum };\r\n}\r\n\r\n/**\r\n * Format full date for day header\r\n */\r\nfunction formatDayHeader(date: Date): string {\r\n return date.toLocaleDateString('en-US', {\r\n weekday: 'short',\r\n month: 'short',\r\n day: 'numeric',\r\n });\r\n}\r\n\r\n// formatDateRange removed - not currently used but kept for future reference\r\n// function formatDateRange(startDate: Date, endDate: Date): string { ... }\r\n\r\n/**\r\n * Calculate stack positions for overlapping events\r\n * Returns events with their stack index (vertical position)\r\n */\r\nfunction calculateEventStacks<TData>(\r\n events: Array<{ event: CalendarEvent<TData>; startCol: number; spanCols: number }>,\r\n): PositionedEvent<TData>[] {\r\n // Sort by start column, then by span (longer events first)\r\n const sorted = [...events].sort((a, b) => {\r\n if (a.startCol !== b.startCol) return a.startCol - b.startCol;\r\n return b.spanCols - a.spanCols;\r\n });\r\n\r\n const result: PositionedEvent<TData>[] = [];\r\n const stacks: Array<number> = []; // End column of each stack level\r\n\r\n for (const item of sorted) {\r\n // Find first available stack level\r\n let stackIndex = 0;\r\n while (\r\n stacks[stackIndex] !== undefined &&\r\n (stacks[stackIndex] as number) > item.startCol\r\n ) {\r\n stackIndex++;\r\n }\r\n\r\n // Assign to this stack level\r\n stacks[stackIndex] = item.startCol + item.spanCols;\r\n result.push({\r\n ...item,\r\n stackIndex,\r\n });\r\n }\r\n\r\n return result;\r\n}\r\n\r\n// ============================================================================\r\n// AVATAR COMPONENT (inline for zero dependencies)\r\n// ============================================================================\r\n\r\ninterface AvatarProps {\r\n src?: string | undefined;\r\n alt?: string | undefined;\r\n fallback: string;\r\n className?: string | undefined;\r\n}\r\n\r\nfunction Avatar({ src, alt, fallback, className }: AvatarProps) {\r\n return (\r\n <div\r\n className={cn(\r\n 'relative flex shrink-0 overflow-hidden rounded-sm border bg-muted',\r\n className,\r\n )}\r\n >\r\n {src ? (\r\n <img\r\n src={src}\r\n alt={alt}\r\n className=\"aspect-square h-full w-full object-cover\"\r\n />\r\n ) : (\r\n <div className=\"flex h-full w-full items-center justify-center bg-muted text-muted-foreground\">\r\n {fallback}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// COMPONENT\r\n// ============================================================================\r\n\r\nconst DEFAULT_DAYS_TO_SHOW = 7;\r\n\r\nexport function TimelineView<TData = Record<string, unknown>>({\r\n daysToShow = DEFAULT_DAYS_TO_SHOW,\r\n events,\r\n users = [],\r\n selectedDate: selectedDateProp,\r\n onDateChange: _onDateChange,\r\n onEventClick,\r\n visibleHours,\r\n className,\r\n getEventUserId,\r\n renderPopover,\r\n}: TimelineViewProps<TData>) {\r\n const scrollRef = useRef<HTMLDivElement>(null);\r\n\r\n // Use provided selectedDate or default to today\r\n const selectedDate = selectedDateProp ?? new Date();\r\n\r\n // Determine if we're in hour mode - all timeline views now show hours\r\n const isHourMode = true; // Always show hours in timeline views\r\n const startHour = visibleHours?.from ?? DEFAULT_START_HOUR;\r\n const endHour = visibleHours?.to ?? DEFAULT_END_HOUR;\r\n const hoursPerDay = endHour - startHour;\r\n\r\n // Calculate start date based on view type\r\n const viewStartDate = useMemo(() => {\r\n const date = new Date(selectedDate);\r\n // For 1-day or 3-day, just use the selected date\r\n if (daysToShow === 1 || daysToShow === 3) {\r\n date.setHours(0, 0, 0, 0);\r\n return date;\r\n }\r\n // For week view, start from beginning of week (Monday)\r\n const dayOfWeek = date.getDay();\r\n const diff = dayOfWeek === 0 ? -6 : 1 - dayOfWeek; // Monday start\r\n date.setDate(date.getDate() + diff);\r\n date.setHours(0, 0, 0, 0);\r\n return date;\r\n }, [selectedDate, daysToShow]);\r\n\r\n // Generate date columns\r\n const dateColumns = useMemo(\r\n () => generateDateColumns(viewStartDate, daysToShow),\r\n [viewStartDate, daysToShow],\r\n );\r\n\r\n // Generate hour columns for hour mode\r\n const hourColumns = useMemo(\r\n () =>\r\n isHourMode\r\n ? generateHourColumns(dateColumns, startHour, endHour)\r\n : [],\r\n [isHourMode, dateColumns, startHour, endHour],\r\n );\r\n\r\n // Default function to get user ID from event\r\n const defaultGetEventUserId = (event: CalendarEvent<TData>): string | undefined => {\r\n // Check event.user first (matches agenda-v2 pattern)\r\n if (event.user?.id) return event.user.id;\r\n // Check common patterns for user ID in custom data\r\n const data = event.data as Record<string, unknown> | undefined;\r\n if (data?.userId) return String(data.userId);\r\n if (data?.user && typeof data.user === 'object' && (data.user as { id?: string }).id) {\r\n return String((data.user as { id: string }).id);\r\n }\r\n // Check participants\r\n if (event.participants?.[0]?.id) return event.participants[0].id;\r\n return undefined;\r\n };\r\n\r\n const getUserIdFromEvent = getEventUserId ?? defaultGetEventUserId;\r\n\r\n // Build user list from both provided users and event participants\r\n const effectiveUsers = useMemo(() => {\r\n const userMap = new Map<string, TimelineUser>();\r\n\r\n // Add users from props\r\n for (const user of users) {\r\n userMap.set(user.id, {\r\n id: user.id,\r\n name: user.name,\r\n avatar: user.avatar ?? undefined,\r\n email: user.email,\r\n });\r\n }\r\n\r\n // Also extract unique users from events\r\n for (const event of events) {\r\n // Check event.user first (matches agenda-v2 pattern)\r\n if (event.user?.id && !userMap.has(event.user.id)) {\r\n userMap.set(event.user.id, {\r\n id: event.user.id,\r\n name: event.user.name,\r\n avatar: event.user.avatar ?? undefined,\r\n email: event.user.email,\r\n });\r\n }\r\n // Also check participants\r\n for (const participant of event.participants || []) {\r\n if (participant.id && !userMap.has(participant.id)) {\r\n userMap.set(participant.id, {\r\n id: participant.id,\r\n name: participant.name,\r\n avatar: participant.avatar ?? undefined,\r\n email: participant.email,\r\n });\r\n }\r\n }\r\n }\r\n\r\n return Array.from(userMap.values());\r\n }, [users, events]);\r\n\r\n // Build user rows with positioned events\r\n const userRows = useMemo(() => {\r\n const rows: UserRow<TData>[] = [];\r\n\r\n // Group events by user\r\n const eventsByUser = new Map<string, CalendarEvent<TData>[]>();\r\n for (const user of effectiveUsers) {\r\n eventsByUser.set(user.id, []);\r\n }\r\n eventsByUser.set('unassigned', []);\r\n\r\n for (const event of events) {\r\n const userId = getUserIdFromEvent(event) ?? 'unassigned';\r\n const list = eventsByUser.get(userId) ?? eventsByUser.get('unassigned')!;\r\n list.push(event);\r\n }\r\n\r\n // Helper to position events\r\n const positionEventsForUser = (userEvents: CalendarEvent<TData>[]) => {\r\n const rawPositioned: Array<{\r\n event: CalendarEvent<TData>;\r\n startCol: number;\r\n spanCols: number;\r\n }> = [];\r\n\r\n for (const event of userEvents) {\r\n if (isHourMode) {\r\n // Hour-based positioning for 1-day and 3-day views\r\n const eventStartHour =\r\n event.startDate.getHours() + event.startDate.getMinutes() / 60;\r\n const eventEndHour =\r\n event.endDate.getHours() + event.endDate.getMinutes() / 60;\r\n\r\n // Find which day(s) this event spans\r\n for (let dayIdx = 0; dayIdx < dateColumns.length; dayIdx++) {\r\n const dayDate = dateColumns[dayIdx]!;\r\n const dayStart = startOfDay(dayDate);\r\n const dayEnd = endOfDay(dayDate);\r\n\r\n // Check if event overlaps this day\r\n if (event.startDate <= dayEnd && event.endDate >= dayStart) {\r\n // Calculate hour positions within this day\r\n let startHourInDay = startHour;\r\n let endHourInDay = endHour;\r\n\r\n if (event.startDate >= dayStart) {\r\n startHourInDay = Math.max(startHour, eventStartHour);\r\n }\r\n if (event.endDate <= dayEnd) {\r\n endHourInDay = Math.min(endHour, eventEndHour);\r\n }\r\n\r\n // Clamp to visible hours\r\n startHourInDay = Math.max(startHour, Math.min(endHour, startHourInDay));\r\n endHourInDay = Math.max(startHour, Math.min(endHour, endHourInDay));\r\n\r\n if (endHourInDay > startHourInDay) {\r\n // Calculate column index: dayIdx * hoursPerDay + (hour - startHour)\r\n const startCol =\r\n dayIdx * hoursPerDay +\r\n Math.floor(startHourInDay - startHour);\r\n const endCol =\r\n dayIdx * hoursPerDay +\r\n Math.ceil(endHourInDay - startHour);\r\n\r\n rawPositioned.push({\r\n event,\r\n startCol,\r\n spanCols: Math.max(1, endCol - startCol),\r\n });\r\n }\r\n }\r\n }\r\n } else {\r\n // Date-based positioning for week view\r\n const eventStart = startOfDay(event.startDate);\r\n const eventEnd = endOfDay(event.endDate);\r\n\r\n let startCol = -1;\r\n let endCol = -1;\r\n\r\n for (let i = 0; i < dateColumns.length; i++) {\r\n const colDate = dateColumns[i]!;\r\n const colStart = startOfDay(colDate);\r\n const colEnd = endOfDay(colDate);\r\n\r\n if (eventStart <= colEnd && eventEnd >= colStart) {\r\n if (startCol === -1) startCol = i;\r\n endCol = i;\r\n }\r\n }\r\n\r\n if (startCol !== -1) {\r\n rawPositioned.push({\r\n event,\r\n startCol,\r\n spanCols: endCol - startCol + 1,\r\n });\r\n }\r\n }\r\n }\r\n\r\n return rawPositioned;\r\n };\r\n\r\n // Process each user\r\n for (const user of effectiveUsers) {\r\n const userEvents = eventsByUser.get(user.id) ?? [];\r\n const rawPositioned = positionEventsForUser(userEvents);\r\n const positionedEvents = calculateEventStacks(rawPositioned);\r\n const maxStack = positionedEvents.reduce(\r\n (max, e) => Math.max(max, e.stackIndex + 1),\r\n 0,\r\n );\r\n\r\n rows.push({\r\n user,\r\n events: positionedEvents,\r\n maxStack: Math.max(maxStack, 1),\r\n });\r\n }\r\n\r\n // Add unassigned row if needed\r\n const unassignedEvents = eventsByUser.get('unassigned') ?? [];\r\n if (unassignedEvents.length > 0) {\r\n const rawPositioned = positionEventsForUser(unassignedEvents);\r\n const positionedEvents = calculateEventStacks(rawPositioned);\r\n const maxStack = positionedEvents.reduce(\r\n (max, e) => Math.max(max, e.stackIndex + 1),\r\n 0,\r\n );\r\n\r\n rows.push({\r\n user: {\r\n id: 'unassigned',\r\n name: 'Unassigned',\r\n avatar: undefined,\r\n email: undefined,\r\n },\r\n events: positionedEvents,\r\n maxStack: Math.max(maxStack, 1),\r\n });\r\n }\r\n\r\n // Filter out users with no events (only show users that have events)\r\n return rows.filter(row => row.events.length > 0);\r\n }, [effectiveUsers, events, dateColumns, isHourMode, hoursPerDay, startHour, endHour, getUserIdFromEvent]);\r\n\r\n // Calculate how many single-column events exist per column (for dynamic width)\r\n // Similar to week-view's maxOverlapping logic but for horizontal timeline\r\n const singleColEventCounts = useMemo(() => {\r\n const counts = new Map<number, number>();\r\n\r\n for (const row of userRows) {\r\n for (const pe of row.events) {\r\n // Only count single-column events (events that span exactly 1 column)\r\n // These are the ones that need the column to be MIN_EVENT_CARD_WIDTH\r\n if (pe.spanCols === 1) {\r\n const currentCount = counts.get(pe.startCol) ?? 0;\r\n counts.set(pe.startCol, currentCount + 1);\r\n }\r\n }\r\n }\r\n\r\n return counts;\r\n }, [userRows]);\r\n\r\n // Calculate dynamic column widths - only expand columns that have single-column events\r\n // Columns without single-column events stay at minimum width\r\n const columnWidths = useMemo(() => {\r\n const totalColumns = isHourMode ? hourColumns.length : dateColumns.length;\r\n const baseMinWidth = isHourMode ? MIN_HOUR_COLUMN_WIDTH : MIN_DATE_COLUMN_WIDTH;\r\n const widths: number[] = [];\r\n\r\n for (let col = 0; col < totalColumns; col++) {\r\n const singleColCount = singleColEventCounts.get(col) ?? 0;\r\n\r\n // If this column has single-column events, it needs at least MIN_EVENT_CARD_WIDTH\r\n // If many single-column events stack in same column, expand further\r\n if (singleColCount > MAX_SINGLE_COL_EVENTS_BEFORE_EXPAND) {\r\n // Expand for heavy stacking (similar to week-view logic)\r\n widths.push(MIN_EVENT_CARD_WIDTH + (singleColCount - MAX_SINGLE_COL_EVENTS_BEFORE_EXPAND) * 20);\r\n } else if (singleColCount > 0) {\r\n // Has single-column events, use MIN_EVENT_CARD_WIDTH\r\n widths.push(Math.max(baseMinWidth, MIN_EVENT_CARD_WIDTH));\r\n } else {\r\n // No single-column events, use base minimum (events spanning multiple columns\r\n // will still fit because their total width = sum of columns they span)\r\n widths.push(baseMinWidth);\r\n }\r\n }\r\n\r\n return widths;\r\n }, [isHourMode, hourColumns.length, dateColumns.length, singleColEventCounts]);\r\n\r\n // Calculate row height based on max stacked events\r\n const getRowHeight = (maxStack: number) => {\r\n return Math.max(\r\n MIN_ROW_HEIGHT,\r\n maxStack * (EVENT_HEIGHT + EVENT_GAP) + ROW_PADDING * 2,\r\n );\r\n };\r\n // Calculate total width based on dynamic column widths\r\n const totalWidth = USER_COLUMN_WIDTH + columnWidths.reduce((sum, w) => sum + w, 0);\r\n\r\n // Get cumulative positions for columns (for event positioning)\r\n const columnPositions = useMemo(() => {\r\n const positions: number[] = [0];\r\n for (let i = 0; i < columnWidths.length; i++) {\r\n positions.push(positions[i]! + columnWidths[i]!);\r\n }\r\n return positions;\r\n }, [columnWidths]);\r\n\r\n return (\r\n <div className={cn('flex h-full flex-col', className)}>\r\n {/* Navigation header */}\r\n {/* Timeline grid */}\r\n <div className='ic-timeline-scroll-container flex-1' ref={scrollRef}>\r\n <div className='relative' style={{ minWidth: totalWidth }}>\r\n {/* Header row(s) */}\r\n {isHourMode ? (\r\n // Hour mode: Day headers + Hour sub-headers - sticky wrapper with flex child (sticky + flex breaks sticky)\r\n <div className='ic-timeline-header sticky top-0 z-20 border-b bg-background'>\r\n <div className='flex flex-col'>\r\n {/* Day headers row (for 3-day view) */}\r\n {daysToShow > 1 && (\r\n <div className='flex border-b'>\r\n {/* User column header - spans both rows */}\r\n <div\r\n className='flex shrink-0 items-center border-r bg-background px-2 py-1'\r\n style={{ width: USER_COLUMN_WIDTH }}\r\n >\r\n <span className='text-[10px] font-medium uppercase text-muted-foreground'>\r\n Resources\r\n </span>\r\n </div>\r\n {/* Day headers */}\r\n {dateColumns.map((date, dayIdx) => {\r\n const today = isToday(date);\r\n // Calculate day width from sum of hour column widths for this day\r\n const dayStartCol = dayIdx * hoursPerDay;\r\n const dayWidth = columnWidths\r\n .slice(dayStartCol, dayStartCol + hoursPerDay)\r\n .reduce((sum, w) => sum + w, 0);\r\n return (\r\n <div\r\n key={`day-${date.toISOString()}`}\r\n className={cn(\r\n 'flex shrink-0 items-center justify-center border-r py-1.5 font-medium',\r\n today ? 'bg-primary/10 text-primary' : 'bg-muted/30',\r\n )}\r\n style={{ width: dayWidth }}\r\n >\r\n <span className='text-xs'>\r\n {formatDayHeader(date)}\r\n </span>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n {/* Hour headers row */}\r\n <div className='flex'>\r\n {/* User column header (if single day, this is the only header) */}\r\n {daysToShow === 1 && (\r\n <div\r\n className='flex shrink-0 items-center border-r bg-background px-2 py-2'\r\n style={{ width: USER_COLUMN_WIDTH }}\r\n >\r\n <span className='text-[10px] font-medium uppercase text-muted-foreground'>\r\n Resources\r\n </span>\r\n </div>\r\n )}\r\n {daysToShow > 1 && (\r\n <div\r\n className='sticky left-0 z-10 border-r bg-background'\r\n style={{ width: USER_COLUMN_WIDTH }}\r\n />\r\n )}\r\n {/* Hour columns */}\r\n {hourColumns.map((col, idx) => {\r\n const isFirstOfDay = col.hour === startHour;\r\n const today = isToday(col.date);\r\n const colWidth = columnWidths[idx] ?? MIN_HOUR_COLUMN_WIDTH;\r\n return (\r\n <div\r\n key={`hour-${col.dayIndex}-${col.hour}`}\r\n className={cn(\r\n 'flex shrink-0 items-center justify-center py-1.5 text-[10px] text-muted-foreground',\r\n isFirstOfDay && idx > 0 ? 'border-l-2 border-l-border' : 'border-r border-r-border/50',\r\n today && 'bg-primary/5',\r\n )}\r\n style={{ width: colWidth }}\r\n >\r\n {formatHour(col.hour)}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n </div>\r\n ) : (\r\n // Date mode (week view): Date headers - sticky wrapper with flex child\r\n <div className='ic-timeline-header sticky top-0 z-20 border-b bg-background'>\r\n <div className='flex'>\r\n {/* User column header - sticky wrapper */}\r\n <div\r\n className='sticky left-0 z-10'\r\n style={{ width: USER_COLUMN_WIDTH }}\r\n >\r\n <div className='flex h-full items-center border-r bg-background px-2 sm:px-4 py-2'>\r\n <span className='text-[10px] sm:text-xs font-medium uppercase text-muted-foreground'>\r\n Resources\r\n </span>\r\n </div>\r\n </div>\r\n\r\n {/* Date headers - Google Calendar style */}\r\n {dateColumns.map((date, idx) => {\r\n const formatted = formatColumnDate(date);\r\n const today = isToday(date);\r\n const weekend = isWeekend(date);\r\n const colWidth = columnWidths[idx] ?? MIN_DATE_COLUMN_WIDTH;\r\n\r\n return (\r\n <div\r\n key={date.toISOString()}\r\n className={cn(\r\n 'flex shrink-0 flex-col items-center justify-center border-r py-2',\r\n weekend && 'bg-muted/30',\r\n )}\r\n style={{ width: colWidth }}\r\n >\r\n {/* Day name - small uppercase */}\r\n <span\r\n className={cn(\r\n 'text-[11px] font-medium uppercase tracking-wide',\r\n today ? 'text-primary' : 'text-muted-foreground',\r\n )}\r\n >\r\n {formatted.day}\r\n </span>\r\n {/* Date number - circled if today */}\r\n <span\r\n className={cn(\r\n 'flex items-center justify-center rounded-full mt-0.5 transition-colors',\r\n 'size-8 text-lg font-normal',\r\n today\r\n ? 'bg-primary text-primary-foreground'\r\n : 'text-foreground',\r\n )}\r\n >\r\n {formatted.date}\r\n </span>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* User rows */}\r\n {userRows.map((row) => {\r\n const rowHeight = getRowHeight(row.maxStack);\r\n\r\n return (\r\n <div\r\n key={row.user.id}\r\n className='relative flex border-b'\r\n style={{ height: rowHeight }}\r\n >\r\n {/* User info cell - sticky wrapper with flex child (sticky + flex breaks sticky) */}\r\n <div\r\n className='sticky left-0 z-10'\r\n style={{ width: USER_COLUMN_WIDTH }}\r\n >\r\n <div className='flex h-full items-center gap-2 sm:gap-3 border-r bg-background px-2 sm:px-4'>\r\n <Avatar\r\n className='size-7'\r\n src={row.user.avatar}\r\n alt={row.user.name}\r\n fallback={getInitials(row.user.name)}\r\n />\r\n <span className='truncate text-xs sm:text-sm font-medium'>\r\n {row.user.name}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n {/* Date/Hour cells background - no flex-1, use explicit widths */}\r\n <div className='relative flex'>\r\n {isHourMode\r\n ? // Hour mode cells\r\n hourColumns.map((col, idx) => {\r\n const isFirstOfDay = col.hour === startHour && idx > 0;\r\n const colWidth = columnWidths[idx] ?? MIN_HOUR_COLUMN_WIDTH;\r\n return (\r\n <div\r\n key={`cell-${col.dayIndex}-${col.hour}`}\r\n className={cn(\r\n 'shrink-0',\r\n isFirstOfDay\r\n ? 'border-l-2 border-l-border'\r\n : 'border-r border-r-border/50',\r\n isToday(col.date) && 'bg-primary/5',\r\n )}\r\n style={{ width: colWidth }}\r\n />\r\n );\r\n })\r\n : // Date mode cells\r\n dateColumns.map((date, idx) => {\r\n const colWidth = columnWidths[idx] ?? MIN_DATE_COLUMN_WIDTH;\r\n return (\r\n <div\r\n key={date.toISOString()}\r\n className={cn(\r\n 'shrink-0 border-r',\r\n isWeekend(date) && 'bg-muted/30',\r\n isToday(date) && 'bg-primary/5',\r\n )}\r\n style={{ width: colWidth }}\r\n />\r\n );\r\n })}\r\n\r\n {/* Event bars using EventCard compact variant */}\r\n {row.events.map((pe) => {\r\n // Use cumulative positions for accurate left placement with dynamic widths\r\n const left = (columnPositions[pe.startCol] ?? 0) + 2;\r\n // Calculate width from cumulative positions\r\n const endPos = columnPositions[pe.startCol + pe.spanCols] ?? columnPositions[columnPositions.length - 1] ?? 0;\r\n const startPos = columnPositions[pe.startCol] ?? 0;\r\n const width = endPos - startPos - 4; // 4px for margins\r\n const top =\r\n ROW_PADDING + pe.stackIndex * (EVENT_HEIGHT + EVENT_GAP);\r\n\r\n return (\r\n <div\r\n key={pe.event.id}\r\n className='absolute'\r\n style={{\r\n left,\r\n width: Math.max(width, 0), // No forced minimum - columns are guaranteed wide enough\r\n top,\r\n height: EVENT_HEIGHT,\r\n }}\r\n >\r\n <EventCard\r\n event={pe.event}\r\n variant='compact'\r\n onClick={onEventClick}\r\n renderPopover={renderPopover}\r\n className='h-full w-full'\r\n />\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n\r\n {/* Empty state */}\r\n {userRows.length === 0 && (\r\n <div className='flex items-center justify-center py-20 text-muted-foreground'>\r\n No users or events to display\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default TimelineView;\r\n","/**\r\n * InnoCalendar Component\r\n *\r\n * A ready-to-use calendar that matches agenda-v2's Calendar component exactly.\r\n * Wraps InnoCalendarProvider and provides all the functionality.\r\n *\r\n * Features:\r\n * - Multiple view modes (day, week, month, year, agenda, timeline)\r\n * - Drag-to-select time/date ranges for event creation\r\n * - Event click handling\r\n * - Header with navigation controls\r\n */\r\n\r\nimport { cn } from '../lib/utils';\r\nimport { useCallback, useMemo, type ReactNode } from 'react';\r\nimport type {\r\n CalendarEvent,\r\n ICalendarUser,\r\n IScheduleType,\r\n TCalendarView,\r\n TSelectionMode,\r\n ISelectionResult,\r\n} from '../core/types';\r\nimport type { IPreferencesConfig } from '../core/preferences';\r\nimport {\r\n InnoCalendarProvider,\r\n useInnoCalendar,\r\n} from '../core/context/inno-calendar-provider';\r\nimport {\r\n DragDropProvider,\r\n type IDropResult,\r\n} from '../core/context/drag-drop-context';\r\nimport { SlotSelectionProvider } from '../core/context/slot-selection-context';\r\nimport { CalendarHeader } from './header/calendar-header';\r\nimport { AgendaView, DayView, MonthView, TimelineView, WeekView, YearView } from './views';\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface InnoCalendarProps<\r\n TEventData extends Record<string, unknown> = Record<string, unknown>,\r\n> {\r\n // Data\r\n events: CalendarEvent<TEventData>[];\r\n users?: ICalendarUser[];\r\n scheduleTypes?: IScheduleType[];\r\n\r\n // Initial state\r\n initialView?: TCalendarView;\r\n initialDate?: Date;\r\n initialSelectedUserId?: string | 'all';\r\n initialScheduleTypeIds?: number[];\r\n initialParticipantIds?: string[];\r\n initialWorkingHoursView?: 'default' | 'enabled' | 'disabled';\r\n initialSearchQuery?: string;\r\n\r\n // Preferences\r\n preferencesConfig?: IPreferencesConfig;\r\n\r\n // Callbacks\r\n onEventClick?: (event: CalendarEvent<TEventData>) => void;\r\n onSlotClick?: (date: Date, hour?: number) => void;\r\n onSlotSelect?: (selection: ISelectionResult) => void;\r\n onAddEvent?: () => void;\r\n onEventDrop?: (result: IDropResult<TEventData>) => void;\r\n onDateChange?: (date: Date, view: TCalendarView) => void;\r\n onViewChange?: (view: TCalendarView) => void;\r\n\r\n // UI options\r\n className?: string;\r\n showHeader?: boolean;\r\n minSelectionMinutes?: number;\r\n /**\r\n * Show remaining events in a popover instead of redirecting to day view\r\n * When enabled, clicking \"+N more\" in month view opens a popover with all day events\r\n * @default false\r\n */\r\n showMoreEventsInPopover?: boolean;\r\n\r\n // Custom rendering\r\n /** Custom popover content for events - if provided, events use built-in popover with this content */\r\n renderPopover?: (props: {\r\n event: CalendarEvent<TEventData>;\r\n onClose: () => void;\r\n }) => ReactNode;\r\n\r\n // Slots for custom content\r\n settingsContent?: ReactNode;\r\n filterContent?: ReactNode;\r\n}\r\n\r\n// ============================================================================\r\n// HELPER: Determine selection mode based on view\r\n// ============================================================================\r\n\r\nfunction getSelectionMode(view: TCalendarView): TSelectionMode {\r\n switch (view) {\r\n case 'day':\r\n case 'week':\r\n return 'time';\r\n case 'month':\r\n case 'year':\r\n case 'agenda':\r\n case 'timeline-day':\r\n case 'timeline-3day':\r\n case 'timeline-week':\r\n default:\r\n return 'day';\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// INNER CALENDAR (uses context)\r\n// ============================================================================\r\n\r\ninterface InnerCalendarProps<\r\n TEventData extends Record<string, unknown> = Record<string, unknown>,\r\n> {\r\n onEventClick?: (event: CalendarEvent<TEventData>) => void;\r\n onSlotClick?: (date: Date, hour?: number) => void;\r\n onSlotSelect?: (selection: ISelectionResult) => void;\r\n onAddEvent?: () => void;\r\n className?: string | undefined;\r\n showHeader?: boolean;\r\n minSelectionMinutes?: number;\r\n showMoreEventsInPopover?: boolean;\r\n settingsContent?: ReactNode;\r\n filterContent?: ReactNode;\r\n renderPopover?: (props: {\r\n event: CalendarEvent<TEventData>;\r\n onClose: () => void;\r\n }) => ReactNode;\r\n}\r\n\r\nfunction InnerCalendar<\r\n TEventData extends Record<string, unknown> = Record<string, unknown>,\r\n>({\r\n onEventClick,\r\n onSlotClick,\r\n onSlotSelect,\r\n onAddEvent,\r\n className,\r\n showHeader = true,\r\n minSelectionMinutes = 30,\r\n showMoreEventsInPopover = false,\r\n settingsContent,\r\n filterContent,\r\n renderPopover,\r\n}: InnerCalendarProps<TEventData>) {\r\n const {\r\n view,\r\n setView,\r\n selectedDate,\r\n setSelectedDate,\r\n slotDuration,\r\n filteredEvents,\r\n users,\r\n visibleHours: contextVisibleHours,\r\n workingHours,\r\n badgeVariant,\r\n } = useInnoCalendar<TEventData>();\r\n\r\n // Convert visibleHours from context format (start/end) to view format (startHour/endHour)\r\n const visibleHours = useMemo(\r\n () => ({\r\n startHour: contextVisibleHours.start,\r\n endHour: contextVisibleHours.end,\r\n }),\r\n [contextVisibleHours],\r\n );\r\n\r\n // Determine selection mode based on current view\r\n const selectionMode = useMemo(() => getSelectionMode(view), [view]);\r\n\r\n // Handle selection complete - bridges to both onSlotSelect and onSlotClick\r\n const handleSlotSelect = useCallback(\r\n (selection: ISelectionResult) => {\r\n if (onSlotSelect) {\r\n onSlotSelect(selection);\r\n return;\r\n }\r\n if (onSlotClick) {\r\n const hour = selection.startDate.getHours();\r\n onSlotClick(selection.startDate, hour);\r\n }\r\n },\r\n [onSlotSelect, onSlotClick],\r\n );\r\n\r\n // Handle day click from month/year views -> navigate to day view\r\n const handleDayClick = useCallback(\r\n (date: Date) => {\r\n setView('day');\r\n setSelectedDate(date, 'day');\r\n },\r\n [setSelectedDate, setView],\r\n );\r\n\r\n // Handle month click from year view -> navigate to month view\r\n const handleMonthClick = useCallback(\r\n (date: Date) => {\r\n setView('month');\r\n setSelectedDate(date, 'month');\r\n },\r\n [setSelectedDate, setView],\r\n );\r\n\r\n // Type-safe event click handler\r\n const handleEventClick = useCallback(\r\n (event: CalendarEvent<TEventData>) => {\r\n onEventClick?.(event);\r\n },\r\n [onEventClick],\r\n );\r\n\r\n // Render current view with required props from context\r\n const renderView = () => {\r\n // Cast events to base type for view components\r\n // biome-ignore lint/suspicious/noExplicitAny: Generic type needs to be cast for view components\r\n const viewEvents = filteredEvents as any;\r\n // biome-ignore lint/suspicious/noExplicitAny: Generic type needs to be cast for view components\r\n const viewEventClick = handleEventClick as any;\r\n // biome-ignore lint/suspicious/noExplicitAny: Generic type needs to be cast for view components\r\n const viewRenderPopover = renderPopover as any;\r\n\r\n switch (view) {\r\n case 'day':\r\n return (\r\n <DayView\r\n events={viewEvents}\r\n date={selectedDate}\r\n visibleHours={visibleHours}\r\n workingHours={workingHours}\r\n slotDuration={slotDuration}\r\n badgeVariant={badgeVariant}\r\n onEventClick={viewEventClick}\r\n renderPopover={viewRenderPopover}\r\n />\r\n );\r\n case 'week':\r\n return (\r\n <WeekView\r\n events={viewEvents}\r\n date={selectedDate}\r\n visibleHours={visibleHours}\r\n workingHours={workingHours}\r\n slotDuration={slotDuration}\r\n badgeVariant={badgeVariant}\r\n onEventClick={viewEventClick}\r\n renderPopover={viewRenderPopover}\r\n />\r\n );\r\n case 'month':\r\n return (\r\n <MonthView\r\n events={viewEvents}\r\n date={selectedDate}\r\n badgeVariant={badgeVariant}\r\n onEventClick={viewEventClick}\r\n onDayClick={handleDayClick}\r\n renderPopover={viewRenderPopover}\r\n showMoreEventsInPopover={showMoreEventsInPopover}\r\n />\r\n );\r\n case 'year':\r\n return (\r\n <YearView\r\n events={viewEvents}\r\n year={selectedDate.getFullYear()}\r\n onMonthClick={handleMonthClick}\r\n onDayClick={handleDayClick}\r\n />\r\n );\r\n case 'agenda':\r\n return (\r\n <AgendaView\r\n events={viewEvents}\r\n date={selectedDate}\r\n onEventClick={viewEventClick}\r\n renderPopover={viewRenderPopover}\r\n />\r\n );\r\n // Timeline views\r\n case 'timeline-day':\r\n return (\r\n <TimelineView\r\n daysToShow={1}\r\n events={viewEvents}\r\n users={users}\r\n selectedDate={selectedDate}\r\n visibleHours={{\r\n from: contextVisibleHours.start,\r\n to: contextVisibleHours.end,\r\n }}\r\n onEventClick={viewEventClick}\r\n renderPopover={viewRenderPopover}\r\n />\r\n );\r\n case 'timeline-3day':\r\n return (\r\n <TimelineView\r\n daysToShow={3}\r\n events={viewEvents}\r\n users={users}\r\n selectedDate={selectedDate}\r\n visibleHours={{\r\n from: contextVisibleHours.start,\r\n to: contextVisibleHours.end,\r\n }}\r\n onEventClick={viewEventClick}\r\n renderPopover={viewRenderPopover}\r\n />\r\n );\r\n case 'timeline-week':\r\n return (\r\n <TimelineView\r\n daysToShow={7}\r\n events={viewEvents}\r\n users={users}\r\n selectedDate={selectedDate}\r\n visibleHours={{\r\n from: contextVisibleHours.start,\r\n to: contextVisibleHours.end,\r\n }}\r\n onEventClick={viewEventClick}\r\n renderPopover={viewRenderPopover}\r\n />\r\n );\r\n default:\r\n return (\r\n <MonthView\r\n events={viewEvents}\r\n date={selectedDate}\r\n badgeVariant={badgeVariant}\r\n onEventClick={viewEventClick}\r\n onDayClick={handleDayClick}\r\n />\r\n );\r\n }\r\n };\r\n\r\n return (\r\n <SlotSelectionProvider\r\n mode={selectionMode}\r\n onSelect={handleSlotSelect}\r\n minDurationMinutes={minSelectionMinutes}\r\n slotDurationMinutes={slotDuration}\r\n enabled={Boolean(onSlotSelect || onSlotClick)}\r\n >\r\n <div className={cn('flex flex-col h-full p-4', className)}>\r\n {showHeader && (\r\n <CalendarHeader\r\n currentDate={selectedDate}\r\n view={view}\r\n events={filteredEvents}\r\n onViewChange={setView}\r\n onNavigateToday={() => setSelectedDate(new Date(), view)}\r\n onNavigatePrev={() => {\r\n const prev = new Date(selectedDate);\r\n if (view === 'day' || view === 'timeline-day') prev.setDate(prev.getDate() - 1);\r\n else if (view === 'timeline-3day') prev.setDate(prev.getDate() - 3);\r\n else if (view === 'week' || view === 'timeline-week') prev.setDate(prev.getDate() - 7);\r\n else if (view === 'month') prev.setMonth(prev.getMonth() - 1);\r\n else if (view === 'year') prev.setFullYear(prev.getFullYear() - 1);\r\n else prev.setDate(prev.getDate() - 7);\r\n setSelectedDate(prev, view);\r\n }}\r\n onNavigateNext={() => {\r\n const next = new Date(selectedDate);\r\n if (view === 'day' || view === 'timeline-day') next.setDate(next.getDate() + 1);\r\n else if (view === 'timeline-3day') next.setDate(next.getDate() + 3);\r\n else if (view === 'week' || view === 'timeline-week') next.setDate(next.getDate() + 7);\r\n else if (view === 'month') next.setMonth(next.getMonth() + 1);\r\n else if (view === 'year') next.setFullYear(next.getFullYear() + 1);\r\n else next.setDate(next.getDate() + 7);\r\n setSelectedDate(next, view);\r\n }}\r\n availableViews={['day', 'week', 'month',\r\n // 'year', NOTE: Intentionally blocked cause it would severe performance issues when there are many events\r\n 'agenda']}\r\n showTimelineViews\r\n showSettings={!!settingsContent}\r\n {...(onAddEvent && { onAddEvent })}\r\n settingsContent={settingsContent}\r\n filterContent={filterContent}\r\n />\r\n )}\r\n <div className=\"flex-1 border rounded-lg bg-white overflow-x-auto\">\r\n {renderView()}\r\n </div>\r\n </div>\r\n </SlotSelectionProvider>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// INTEGRATED CALENDAR (wraps provider)\r\n// ============================================================================\r\n\r\nexport function InnoCalendar<\r\n TEventData extends Record<string, unknown> = Record<string, unknown>,\r\n>({\r\n events,\r\n users = [],\r\n scheduleTypes = [],\r\n initialView = 'week',\r\n initialDate,\r\n initialSelectedUserId,\r\n initialScheduleTypeIds,\r\n initialParticipantIds,\r\n initialWorkingHoursView,\r\n initialSearchQuery,\r\n preferencesConfig,\r\n onEventClick,\r\n onSlotClick,\r\n onSlotSelect,\r\n onAddEvent,\r\n onEventDrop,\r\n onDateChange,\r\n onViewChange,\r\n className,\r\n showHeader = true,\r\n minSelectionMinutes = 30,\r\n showMoreEventsInPopover = false,\r\n renderPopover,\r\n settingsContent,\r\n filterContent,\r\n}: InnoCalendarProps<TEventData>) {\r\n return (\r\n <DragDropProvider<TEventData> {...(onEventDrop && { onEventDrop })}>\r\n <InnoCalendarProvider<TEventData>\r\n initialEvents={events}\r\n initialUsers={users}\r\n initialScheduleTypes={scheduleTypes}\r\n initialView={initialView}\r\n {...(initialDate && { initialDate })}\r\n {...(initialSelectedUserId && { initialSelectedUserId })}\r\n {...(initialScheduleTypeIds && { initialScheduleTypeIds })}\r\n {...(initialParticipantIds && { initialParticipantIds })}\r\n {...(initialWorkingHoursView && { initialWorkingHoursView })}\r\n {...(initialSearchQuery && { initialSearchQuery })}\r\n {...(preferencesConfig && { preferencesConfig })}\r\n {...(onDateChange && { onDateChange })}\r\n {...(onViewChange && { onViewChange })}\r\n >\r\n <InnerCalendar<TEventData>\r\n {...(onEventClick && { onEventClick })}\r\n {...(onSlotClick && { onSlotClick })}\r\n {...(onSlotSelect && { onSlotSelect })}\r\n {...(onAddEvent && { onAddEvent })}\r\n {...(renderPopover && { renderPopover })}\r\n className={className}\r\n showHeader={showHeader}\r\n minSelectionMinutes={minSelectionMinutes}\r\n showMoreEventsInPopover={showMoreEventsInPopover}\r\n settingsContent={settingsContent}\r\n filterContent={filterContent}\r\n />\r\n </InnoCalendarProvider>\r\n </DragDropProvider>\r\n );\r\n}\r\n\r\nexport default InnoCalendar;\r\n","/**\r\n * Select Component\r\n *\r\n * A native select dropdown with styling.\r\n * Uses native <select> for maximum compatibility.\r\n */\r\n\r\nimport { forwardRef, type SelectHTMLAttributes } from 'react';\r\nimport { cn } from '../../lib/utils';\r\n\r\n// ============================================================================\r\n// SELECT\r\n// ============================================================================\r\n\r\nexport interface SelectProps extends SelectHTMLAttributes<HTMLSelectElement> {\r\n /** Additional CSS classes */\r\n className?: string;\r\n}\r\n\r\nexport const Select = forwardRef<HTMLSelectElement, SelectProps>(\r\n ({ className, children, ...props }, ref) => {\r\n return (\r\n <select\r\n ref={ref}\r\n className={cn(\r\n 'flex h-9 w-full rounded-md border border-input bg-background px-3 py-1 text-sm shadow-sm',\r\n 'ring-offset-background',\r\n 'focus:outline-none focus:ring-1 focus:ring-ring',\r\n 'disabled:cursor-not-allowed disabled:opacity-50',\r\n '[&>option]:bg-background',\r\n className,\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n </select>\r\n );\r\n },\r\n);\r\nSelect.displayName = 'Select';\r\n\r\n// ============================================================================\r\n// LABEL\r\n// ============================================================================\r\n\r\nexport interface LabelProps extends React.LabelHTMLAttributes<HTMLLabelElement> {\r\n /** Additional CSS classes */\r\n className?: string;\r\n}\r\n\r\nexport const Label = forwardRef<HTMLLabelElement, LabelProps>(\r\n ({ className, ...props }, ref) => {\r\n return (\r\n <label\r\n ref={ref}\r\n className={cn(\r\n 'text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n );\r\n },\r\n);\r\nLabel.displayName = 'Label';\r\n","/**\r\n * Event Popover Component\r\n *\r\n * Google Calendar-style event preview popover.\r\n * - Desktop: Shows as popover positioned near the event\r\n * - Mobile: Falls back to dialog/modal\r\n * - Fully headless with callback props for actions\r\n * - Slot-based customization for all UI elements\r\n *\r\n * @template TData - Custom event data type\r\n */\r\n\r\nimport {\r\n forwardRef,\r\n useCallback,\r\n useEffect,\r\n useState,\r\n type HTMLAttributes,\r\n type ReactNode,\r\n} from 'react';\r\nimport { cn } from '../../lib/utils';\r\nimport type { CalendarEvent, ICalendarUser } from '../../core/types';\r\nimport {\r\n Popover,\r\n PopoverContent,\r\n PopoverTrigger,\r\n} from '../ui/popover';\r\nimport {\r\n Tooltip,\r\n TooltipContent,\r\n TooltipProvider,\r\n TooltipTrigger,\r\n} from '../ui/tooltip';\r\nimport { Button } from '../ui/button';\r\nimport {\r\n DropdownMenu,\r\n DropdownMenuContent,\r\n DropdownMenuItem,\r\n DropdownMenuTrigger,\r\n} from '../ui/dropdown-menu';\r\n\r\n// ============================================================================\r\n// INLINE SVG ICONS\r\n// ============================================================================\r\n\r\nfunction PencilIcon({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={className}\r\n >\r\n <path d=\"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z\" />\r\n <path d=\"m15 5 4 4\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction TrashIcon({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={className}\r\n >\r\n <path d=\"M3 6h18\" />\r\n <path d=\"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\" />\r\n <path d=\"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\" />\r\n <line x1=\"10\" x2=\"10\" y1=\"11\" y2=\"17\" />\r\n <line x1=\"14\" x2=\"14\" y1=\"11\" y2=\"17\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction XIcon({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={className}\r\n >\r\n <path d=\"M18 6 6 18\" />\r\n <path d=\"m6 6 12 12\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction BanIcon({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={className}\r\n >\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\r\n <path d=\"m4.9 4.9 14.2 14.2\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction CheckIcon({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={className}\r\n >\r\n <path d=\"M20 6 9 17l-5-5\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction CheckCircleIcon({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={className}\r\n >\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\r\n <path d=\"m9 12 2 2 4-4\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction ChevronDownIcon({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={className}\r\n >\r\n <path d=\"m6 9 6 6 6-6\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction UsersIcon({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={className}\r\n >\r\n <path d=\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\" />\r\n <circle cx=\"9\" cy=\"7\" r=\"4\" />\r\n <path d=\"M22 21v-2a4 4 0 0 0-3-3.87\" />\r\n <path d=\"M16 3.13a4 4 0 0 1 0 7.75\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction MapPinIcon({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={className}\r\n >\r\n <path d=\"M20 10c0 4.993-5.539 10.193-7.399 11.799a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 16 0\" />\r\n <circle cx=\"12\" cy=\"10\" r=\"3\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction CalendarIcon({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={className}\r\n >\r\n <path d=\"M8 2v4\" />\r\n <path d=\"M16 2v4\" />\r\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"4\" rx=\"2\" />\r\n <path d=\"M3 10h18\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction FileTextIcon({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={className}\r\n >\r\n <path d=\"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\" />\r\n <path d=\"M14 2v4a2 2 0 0 0 2 2h4\" />\r\n <path d=\"M10 9H8\" />\r\n <path d=\"M16 13H8\" />\r\n <path d=\"M16 17H8\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction LoaderIcon({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={cn('animate-spin', className)}\r\n >\r\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\r\n </svg>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\n/**\r\n * Extended participant type with confirmation/organizer info\r\n */\r\nexport interface IEventParticipant extends ICalendarUser {\r\n /** Whether this participant is the event organizer */\r\n isOrganizer?: boolean;\r\n /** Confirmation status: null/undefined = pending, true = accepted, false = declined */\r\n isConfirmed?: boolean | null | undefined;\r\n /** Whether this participant is a client (external) */\r\n isClient?: boolean;\r\n /** Profile picture URL */\r\n profilePicture?: string;\r\n}\r\n\r\n/**\r\n * Extended event type for popover display\r\n * Adds participant details and cancellation info\r\n */\r\nexport interface IPopoverEvent<TData = Record<string, unknown>>\r\n extends CalendarEvent<TData> {\r\n /** Detailed participant list */\r\n participantDetails?: IEventParticipant[];\r\n /** Simple participant names (fallback) */\r\n participantsNames?: string[];\r\n /** Location/address */\r\n address?: string;\r\n /** Schedule type color (hex) */\r\n scheduleTypeColor?: string;\r\n /** Recurrence summary text */\r\n recurrenceSummary?: string;\r\n /** Cancellation reason code */\r\n cancelReasonCode?: number | null;\r\n /** Cancellation date */\r\n canceledDate?: Date | null;\r\n}\r\n\r\n/**\r\n * Labels for i18n support\r\n */\r\nexport interface IEventPopoverLabels {\r\n edit?: string;\r\n delete?: string;\r\n cancel?: string;\r\n close?: string;\r\n going?: string;\r\n notGoing?: string;\r\n confirmMeeting?: string;\r\n completed?: string;\r\n canceled?: string;\r\n participants?: string;\r\n guest?: string;\r\n guests?: string;\r\n confirmed?: string;\r\n organizer?: string;\r\n client?: string;\r\n more?: string;\r\n noDateProvided?: string;\r\n eventNotFound?: string;\r\n cancellationNote?: string;\r\n canceledOn?: string;\r\n acceptThisEvent?: string;\r\n acceptAllEvents?: string;\r\n deleteConfirmTitle?: string;\r\n deleteConfirmDescription?: string;\r\n}\r\n\r\n/**\r\n * Default labels\r\n */\r\nconst DEFAULT_LABELS: Required<IEventPopoverLabels> = {\r\n edit: 'Edit',\r\n delete: 'Delete',\r\n cancel: 'Cancel Event',\r\n close: 'Close',\r\n going: 'Going',\r\n notGoing: 'Not Going',\r\n confirmMeeting: 'Confirm meeting took place',\r\n completed: 'Completed',\r\n canceled: 'Canceled',\r\n participants: 'Participants',\r\n guest: 'guest',\r\n guests: 'guests',\r\n confirmed: 'confirmed',\r\n organizer: 'Organizer',\r\n client: 'Client',\r\n more: 'more',\r\n noDateProvided: 'No date provided',\r\n eventNotFound: 'Event not found',\r\n cancellationNote: 'Cancellation Note',\r\n canceledOn: 'Canceled on',\r\n acceptThisEvent: 'Accept this event only',\r\n acceptAllEvents: 'Accept all events',\r\n deleteConfirmTitle: 'Delete Event',\r\n deleteConfirmDescription:\r\n 'Are you sure you want to delete this event? This action cannot be undone.',\r\n};\r\n\r\n/**\r\n * EventPopover props\r\n */\r\nexport interface EventPopoverProps<TData = Record<string, unknown>> {\r\n /** The event to display */\r\n event: IPopoverEvent<TData>;\r\n /** Trigger element */\r\n children: ReactNode;\r\n /** Controlled open state */\r\n open?: boolean;\r\n /** Callback when open state changes */\r\n onOpenChange?: (open: boolean) => void;\r\n /** Whether popover is loading data */\r\n isLoading?: boolean;\r\n /** i18n labels */\r\n labels?: Partial<IEventPopoverLabels>;\r\n\r\n // ============================================================================\r\n // ACTION CALLBACKS\r\n // ============================================================================\r\n\r\n /** Called when edit button is clicked */\r\n onEdit?: (event: IPopoverEvent<TData>) => void;\r\n /** Called when delete button is clicked */\r\n onDelete?: (event: IPopoverEvent<TData>) => void;\r\n /** Called when cancel event button is clicked */\r\n onCancel?: (event: IPopoverEvent<TData>) => void;\r\n /** Called when accept/going button is clicked */\r\n onAccept?: (event: IPopoverEvent<TData>) => void;\r\n /** Called when decline/not going button is clicked */\r\n onDecline?: (event: IPopoverEvent<TData>) => void;\r\n /** Called when confirm meeting button is clicked */\r\n onConfirmMeeting?: (event: IPopoverEvent<TData>) => void;\r\n\r\n // ============================================================================\r\n // PERMISSION FLAGS\r\n // ============================================================================\r\n\r\n /** Whether user can edit this event */\r\n canEdit?: boolean;\r\n /** Whether user can delete this event (admin only) */\r\n canDelete?: boolean;\r\n /** Whether user can cancel this event */\r\n canCancel?: boolean;\r\n\r\n // ============================================================================\r\n // CURRENT USER STATE\r\n // ============================================================================\r\n\r\n // Note: currentUserId can be derived from currentUserAcceptStatus if needed\r\n /** Whether current user is a participant */\r\n isCurrentUserParticipant?: boolean;\r\n /** Whether current user is a client (clients don't see RSVP) */\r\n isCurrentUserClient?: boolean;\r\n /** Current user's acceptance status: null = pending, true = accepted, false = declined */\r\n currentUserAcceptStatus?: boolean | null;\r\n\r\n // ============================================================================\r\n // LOADING STATES\r\n // ============================================================================\r\n\r\n /** Whether accept mutation is loading */\r\n isAcceptLoading?: boolean;\r\n /** Whether decline mutation is loading */\r\n isDeclineLoading?: boolean;\r\n /** Whether confirm meeting mutation is loading */\r\n isConfirmLoading?: boolean;\r\n /** Whether delete mutation is loading */\r\n isDeleteLoading?: boolean;\r\n\r\n // ============================================================================\r\n // SLOTS\r\n // ============================================================================\r\n\r\n /** Custom render for participant row */\r\n renderParticipant?: (participant: IEventParticipant, index: number) => ReactNode;\r\n /** Custom render for the header actions */\r\n renderHeaderActions?: (props: { onClose: () => void }) => ReactNode;\r\n /** Custom render for cancel reason */\r\n renderCancelReason?: (event: IPopoverEvent<TData>) => ReactNode;\r\n /** Custom render for delete confirmation dialog */\r\n renderDeleteConfirmation?: (props: {\r\n onConfirm: () => void;\r\n onCancel: () => void;\r\n isLoading?: boolean;\r\n }) => ReactNode;\r\n\r\n // ============================================================================\r\n // FORMATTING\r\n // ============================================================================\r\n\r\n /** Format date for display */\r\n formatDate?: (date: Date, format?: string) => string;\r\n /** Format time range */\r\n formatTimeRange?: (start: Date, end: Date) => string;\r\n\r\n // ============================================================================\r\n // STYLING\r\n // ============================================================================\r\n\r\n /** Additional class for popover content */\r\n className?: string;\r\n /** Popover width */\r\n width?: number;\r\n}\r\n\r\n// ============================================================================\r\n// HELPER COMPONENTS\r\n// ============================================================================\r\n\r\ninterface IconButtonProps extends HTMLAttributes<HTMLButtonElement> {\r\n label: string;\r\n variant?: 'ghost' | 'destructive';\r\n}\r\n\r\nconst IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(\r\n ({ onClick, label, children, className, variant = 'ghost', ...props }, ref) => {\r\n return (\r\n <Tooltip>\r\n <TooltipTrigger asChild>\r\n <button\r\n type=\"button\"\r\n ref={ref}\r\n onClick={onClick}\r\n className={cn(\r\n 'h-8 w-8 rounded-full flex items-center justify-center transition-colors',\r\n variant === 'ghost' &&\r\n 'hover:bg-zinc-100 dark:hover:bg-zinc-800 text-zinc-600 dark:text-zinc-400',\r\n variant === 'destructive' &&\r\n 'hover:bg-red-50 dark:hover:bg-red-950/30 text-zinc-600 dark:text-zinc-400 hover:text-red-600',\r\n className,\r\n )}\r\n aria-label={label}\r\n {...props}\r\n >\r\n {children}\r\n </button>\r\n </TooltipTrigger>\r\n <TooltipContent side=\"bottom\" className=\"text-xs\">\r\n {label}\r\n </TooltipContent>\r\n </Tooltip>\r\n );\r\n },\r\n);\r\nIconButton.displayName = 'IconButton';\r\n\r\n// ============================================================================\r\n// AVATAR COMPONENT\r\n// ============================================================================\r\n\r\ninterface AvatarProps {\r\n src?: string | null | undefined;\r\n alt: string;\r\n initials: string;\r\n className?: string;\r\n isClient?: boolean;\r\n}\r\n\r\nfunction Avatar({ src, alt, initials, className, isClient }: AvatarProps) {\r\n const [imgError, setImgError] = useState(false);\r\n\r\n return (\r\n <div\r\n className={cn(\r\n 'relative h-7 w-7 rounded-full overflow-hidden shrink-0',\r\n className,\r\n )}\r\n >\r\n {src && !imgError ? (\r\n <img\r\n src={src}\r\n alt={alt}\r\n className=\"h-full w-full object-cover\"\r\n onError={() => setImgError(true)}\r\n />\r\n ) : (\r\n <div\r\n className={cn(\r\n 'h-full w-full flex items-center justify-center text-[10px] font-medium',\r\n isClient\r\n ? 'bg-amber-100 dark:bg-amber-900/30 text-amber-700 dark:text-amber-300'\r\n : 'bg-zinc-200 dark:bg-zinc-700 text-zinc-700 dark:text-zinc-300',\r\n )}\r\n >\r\n {initials}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// PARTICIPANT ROW\r\n// ============================================================================\r\n\r\ninterface ParticipantRowProps {\r\n participant: IEventParticipant;\r\n isEventCanceled?: boolean | undefined;\r\n labels: Required<IEventPopoverLabels>;\r\n}\r\n\r\nfunction ParticipantRow({\r\n participant,\r\n isEventCanceled = false,\r\n labels,\r\n}: ParticipantRowProps) {\r\n const name = participant.name || 'Unknown';\r\n const initials = name\r\n .split(' ')\r\n .map((n) => n[0])\r\n .join('')\r\n .toUpperCase()\r\n .slice(0, 2);\r\n\r\n const isOrganizer = participant.isOrganizer ?? false;\r\n const confirmStatus = participant.isConfirmed;\r\n const isConfirmed = confirmStatus === true;\r\n const isDeclined = confirmStatus === false;\r\n const isClient = participant.isClient ?? false;\r\n const avatar = participant.profilePicture || participant.avatar;\r\n\r\n const showCanceled = isEventCanceled;\r\n\r\n return (\r\n <div\r\n className={cn(\r\n 'flex items-center gap-3 py-0',\r\n showCanceled && 'opacity-60',\r\n )}\r\n >\r\n <div className=\"relative\">\r\n <Avatar\r\n src={avatar}\r\n alt={name}\r\n initials={initials}\r\n isClient={isClient}\r\n className={cn(showCanceled && 'grayscale')}\r\n />\r\n {showCanceled || isDeclined ? (\r\n <div className=\"absolute -bottom-0.5 -right-0.5 h-3.5 w-3.5 rounded-full bg-white dark:bg-zinc-900 flex items-center justify-center\">\r\n <div className=\"h-3 w-3 rounded-full bg-red-100 dark:bg-red-900/50 flex items-center justify-center\">\r\n <XIcon className=\"h-2 w-2 text-red-600 dark:text-red-400 stroke-[3]\" />\r\n </div>\r\n </div>\r\n ) : isConfirmed ? (\r\n <div className=\"absolute -bottom-0.5 -right-0.5 h-3.5 w-3.5 rounded-full bg-white dark:bg-zinc-900 flex items-center justify-center\">\r\n <div className=\"h-3 w-3 rounded-full bg-green-100 dark:bg-green-900/50 flex items-center justify-center\">\r\n <CheckIcon className=\"h-2 w-2 text-green-600 dark:text-green-400 stroke-[3]\" />\r\n </div>\r\n </div>\r\n ) : null}\r\n </div>\r\n <div className=\"!h-fit min-w-0 gap-0\">\r\n <div className=\"gap-0\">\r\n <span\r\n className={cn(\r\n 'text-sm text-zinc-900 dark:text-zinc-100 truncate',\r\n showCanceled && 'line-through text-zinc-500 dark:text-zinc-500',\r\n )}\r\n >\r\n {name}\r\n </span>\r\n </div>\r\n {isClient && (\r\n <div className=\"text-[10px] px-1.5 w-fit py-0.5 rounded bg-amber-100 dark:bg-amber-900/30 text-amber-700 dark:text-amber-300 font-medium\">\r\n {labels.client}\r\n </div>\r\n )}\r\n {isOrganizer && !showCanceled && (\r\n <div className=\"text-xs text-zinc-500\">{labels.organizer}</div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// SIMPLE DIALOG (for mobile)\r\n// ============================================================================\r\n\r\ninterface SimpleDialogProps {\r\n open: boolean;\r\n onOpenChange: (open: boolean) => void;\r\n title?: string;\r\n children: ReactNode;\r\n}\r\n\r\nfunction SimpleDialog({ open, onOpenChange, title, children }: SimpleDialogProps) {\r\n // Close on escape\r\n useEffect(() => {\r\n if (!open) return;\r\n\r\n const handleKeyDown = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape') {\r\n onOpenChange(false);\r\n }\r\n };\r\n\r\n document.addEventListener('keydown', handleKeyDown);\r\n return () => document.removeEventListener('keydown', handleKeyDown);\r\n }, [open, onOpenChange]);\r\n\r\n // Prevent body scroll when open\r\n useEffect(() => {\r\n if (open) {\r\n document.body.style.overflow = 'hidden';\r\n } else {\r\n document.body.style.overflow = '';\r\n }\r\n return () => {\r\n document.body.style.overflow = '';\r\n };\r\n }, [open]);\r\n\r\n if (!open) return null;\r\n\r\n return (\r\n <div className=\"fixed inset-0 z-50\">\r\n {/* Backdrop */}\r\n <div\r\n className=\"fixed inset-0 bg-black/50 backdrop-blur-sm\"\r\n onClick={() => onOpenChange(false)}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n onOpenChange(false);\r\n }\r\n }}\r\n />\r\n {/* Content */}\r\n <div className=\"fixed inset-x-4 top-[50%] translate-y-[-50%] max-w-md mx-auto\">\r\n <div className=\"bg-white dark:bg-zinc-900 rounded-2xl shadow-xl overflow-hidden\">\r\n {title && <div className=\"sr-only\">{title}</div>}\r\n {children}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// ALERT DIALOG (for delete confirmation)\r\n// ============================================================================\r\n\r\ninterface AlertDialogProps {\r\n open: boolean;\r\n onOpenChange: (open: boolean) => void;\r\n title: string;\r\n description: string;\r\n cancelLabel: string;\r\n confirmLabel: string;\r\n onConfirm: () => void;\r\n isLoading?: boolean;\r\n}\r\n\r\nfunction AlertDialog({\r\n open,\r\n onOpenChange,\r\n title,\r\n description,\r\n cancelLabel,\r\n confirmLabel,\r\n onConfirm,\r\n isLoading,\r\n}: AlertDialogProps) {\r\n if (!open) return null;\r\n\r\n return (\r\n <div className=\"fixed inset-0 z-[60]\">\r\n {/* Backdrop */}\r\n <div\r\n className=\"fixed inset-0 bg-black/50 backdrop-blur-sm\"\r\n onClick={() => onOpenChange(false)}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n onOpenChange(false);\r\n }\r\n }}\r\n />\r\n {/* Content */}\r\n <div className=\"fixed inset-x-4 top-[50%] translate-y-[-50%] max-w-md mx-auto\">\r\n <div className=\"bg-white dark:bg-zinc-900 rounded-lg shadow-xl p-6\">\r\n <h2 className=\"text-lg font-semibold text-zinc-900 dark:text-zinc-100\">\r\n {title}\r\n </h2>\r\n <p className=\"mt-2 text-sm text-zinc-600 dark:text-zinc-400\">\r\n {description}\r\n </p>\r\n <div className=\"mt-4 flex justify-end gap-3\">\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={() => onOpenChange(false)}\r\n >\r\n {cancelLabel}\r\n </Button>\r\n <Button\r\n variant=\"destructive\"\r\n size=\"sm\"\r\n onClick={onConfirm}\r\n disabled={isLoading}\r\n >\r\n {isLoading && <LoaderIcon className=\"h-4 w-4 mr-2\" />}\r\n <TrashIcon className=\"h-4 w-4 mr-2\" />\r\n {confirmLabel}\r\n </Button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// DATE/TIME FORMATTING HELPERS\r\n// ============================================================================\r\n\r\nfunction defaultFormatDate(date: Date, _format?: string): string {\r\n return date.toLocaleDateString(undefined, {\r\n weekday: 'long',\r\n month: 'long',\r\n day: 'numeric',\r\n });\r\n}\r\n\r\nfunction defaultFormatTimeRange(start: Date, end: Date): string {\r\n const timeOptions: Intl.DateTimeFormatOptions = {\r\n hour: '2-digit',\r\n minute: '2-digit',\r\n hour12: false,\r\n };\r\n return `${start.toLocaleTimeString(undefined, timeOptions)} – ${end.toLocaleTimeString(undefined, timeOptions)}`;\r\n}\r\n\r\nfunction formatCanceledDate(date: Date): string {\r\n return date.toLocaleDateString(undefined, {\r\n day: '2-digit',\r\n month: 'short',\r\n year: 'numeric',\r\n hour: '2-digit',\r\n minute: '2-digit',\r\n });\r\n}\r\n\r\n// ============================================================================\r\n// MEDIA QUERY HOOK\r\n// ============================================================================\r\n\r\nfunction useMediaQuery(query: string): boolean {\r\n const [matches, setMatches] = useState(() => {\r\n if (typeof window !== 'undefined') {\r\n return window.matchMedia(query).matches;\r\n }\r\n return false;\r\n });\r\n\r\n useEffect(() => {\r\n if (typeof window === 'undefined') return;\r\n\r\n const mediaQuery = window.matchMedia(query);\r\n const handler = (e: MediaQueryListEvent) => setMatches(e.matches);\r\n\r\n mediaQuery.addEventListener('change', handler);\r\n return () => mediaQuery.removeEventListener('change', handler);\r\n }, [query]);\r\n\r\n return matches;\r\n}\r\n\r\n// ============================================================================\r\n// POPOVER CONTENT\r\n// ============================================================================\r\n\r\ninterface EventPopoverContentProps<TData = Record<string, unknown>> {\r\n event: IPopoverEvent<TData>;\r\n labels: Required<IEventPopoverLabels>;\r\n isLoading?: boolean | undefined;\r\n onClose: () => void;\r\n onEdit?: ((event: IPopoverEvent<TData>) => void) | undefined;\r\n onDelete?: ((event: IPopoverEvent<TData>) => void) | undefined;\r\n onCancel?: ((event: IPopoverEvent<TData>) => void) | undefined;\r\n onAccept?: ((event: IPopoverEvent<TData>) => void) | undefined;\r\n onDecline?: ((event: IPopoverEvent<TData>) => void) | undefined;\r\n onConfirmMeeting?: ((event: IPopoverEvent<TData>) => void) | undefined;\r\n\r\n // ============================================================================\r\n // PERMISSION FLAGS\r\n // ============================================================================\r\n\r\n canEdit?: boolean | undefined;\r\n canDelete?: boolean | undefined;\r\n canCancel?: boolean | undefined;\r\n isCurrentUserParticipant?: boolean | undefined;\r\n isCurrentUserClient?: boolean | undefined;\r\n currentUserAcceptStatus?: boolean | null | undefined;\r\n isAcceptLoading?: boolean | undefined;\r\n isDeclineLoading?: boolean | undefined;\r\n isConfirmLoading?: boolean | undefined;\r\n isDeleteLoading?: boolean | undefined;\r\n renderParticipant?: ((participant: IEventParticipant, index: number) => ReactNode) | undefined;\r\n renderHeaderActions?: ((props: { onClose: () => void }) => ReactNode) | undefined;\r\n renderCancelReason?: ((event: IPopoverEvent<TData>) => ReactNode) | undefined;\r\n renderDeleteConfirmation?: ((props: {\r\n onConfirm: () => void;\r\n onCancel: () => void;\r\n isLoading?: boolean;\r\n }) => ReactNode) | undefined;\r\n formatDate?: ((date: Date, format?: string) => string) | undefined;\r\n formatTimeRange?: ((start: Date, end: Date) => string) | undefined;\r\n}\r\n\r\nfunction EventPopoverContentInner<TData = Record<string, unknown>>({\r\n event,\r\n labels,\r\n isLoading,\r\n onClose,\r\n onEdit,\r\n onDelete,\r\n onCancel,\r\n onAccept,\r\n onDecline,\r\n onConfirmMeeting,\r\n canEdit = true,\r\n canDelete = false,\r\n canCancel = true,\r\n isCurrentUserParticipant = false,\r\n isCurrentUserClient = false,\r\n currentUserAcceptStatus,\r\n isAcceptLoading = false,\r\n isDeclineLoading = false,\r\n isConfirmLoading = false,\r\n isDeleteLoading = false,\r\n renderParticipant,\r\n renderHeaderActions,\r\n renderCancelReason,\r\n renderDeleteConfirmation,\r\n formatDate = defaultFormatDate,\r\n formatTimeRange = defaultFormatTimeRange,\r\n}: EventPopoverContentProps<TData>) {\r\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);\r\n\r\n // Derived state\r\n const isEditable = !(event.isCanceled || event.meetingTookPlace);\r\n const isRecurring = event.isRecurring ?? false;\r\n\r\n const participantDetails = event.participantDetails;\r\n const participantNames = event.participantsNames || [];\r\n const hasParticipantDetails =\r\n participantDetails && participantDetails.length > 0;\r\n\r\n const hasCurrentUserAccepted = currentUserAcceptStatus === true;\r\n const hasCurrentUserDeclined = currentUserAcceptStatus === false;\r\n const showRsvpButtons =\r\n isCurrentUserParticipant && !isCurrentUserClient && isEditable;\r\n\r\n const confirmedCount = hasParticipantDetails\r\n ? participantDetails.filter((p) => p.isConfirmed).length\r\n : event.isAccepted\r\n ? participantNames.length\r\n : 0;\r\n\r\n const totalParticipants = hasParticipantDetails\r\n ? participantDetails.length\r\n : participantNames.length;\r\n\r\n const eventColor = event.scheduleTypeColor || event.hexColor || '#039BE5';\r\n\r\n // Format date/time\r\n const formatDateRange = useCallback(() => {\r\n if (!event.startDate) return labels.noDateProvided;\r\n return formatDate(event.startDate);\r\n }, [event.startDate, formatDate, labels.noDateProvided]);\r\n\r\n const getTimeRange = useCallback(() => {\r\n if (!(event.startDate && event.endDate)) return null;\r\n return formatTimeRange(event.startDate, event.endDate);\r\n }, [event.startDate, event.endDate, formatTimeRange]);\r\n\r\n // Handlers\r\n const handleEdit = () => {\r\n onClose();\r\n onEdit?.(event);\r\n };\r\n\r\n const handleCancel = () => {\r\n onClose();\r\n onCancel?.(event);\r\n };\r\n\r\n const handleDelete = () => {\r\n setShowDeleteConfirm(true);\r\n };\r\n\r\n const confirmDelete = () => {\r\n onDelete?.(event);\r\n setShowDeleteConfirm(false);\r\n };\r\n\r\n // Loading state\r\n if (isLoading) {\r\n return (\r\n <div className=\"flex h-48 items-center justify-center\">\r\n <LoaderIcon className=\"h-6 w-6 text-zinc-400\" />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <TooltipProvider delayDuration={300}>\r\n <div className=\"flex flex-col gap-0.5 p-3\">\r\n {/* Header with action buttons */}\r\n <div className=\"flex items-start justify-end gap-0.5\">\r\n {renderHeaderActions ? (\r\n renderHeaderActions({ onClose })\r\n ) : (\r\n <>\r\n {isEditable && canEdit && onEdit && (\r\n <IconButton onClick={handleEdit} label={labels.edit}>\r\n <PencilIcon className=\"h-[18px] w-[18px]\" />\r\n </IconButton>\r\n )}\r\n {isEditable && canCancel && onCancel && (\r\n <IconButton onClick={handleCancel} label={labels.cancel}>\r\n <BanIcon className=\"h-[18px] w-[18px]\" />\r\n </IconButton>\r\n )}\r\n {canDelete && onDelete && (\r\n <IconButton\r\n onClick={handleDelete}\r\n label={labels.delete}\r\n variant=\"destructive\"\r\n >\r\n <TrashIcon className=\"h-[18px] w-[18px]\" />\r\n </IconButton>\r\n )}\r\n <IconButton onClick={onClose} label={labels.close}>\r\n <XIcon className=\"h-[18px] w-[18px]\" />\r\n </IconButton>\r\n </>\r\n )}\r\n </div>\r\n\r\n {/* Event Title & Time */}\r\n <div>\r\n <div className=\"flex items-start gap-2\">\r\n {/* Color indicator */}\r\n <div\r\n className=\"w-4 h-4 rounded mt-1 shrink-0\"\r\n style={{ backgroundColor: eventColor }}\r\n />\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-center gap-2 flex-wrap\">\r\n <h2\r\n className={cn(\r\n 'text-[22px] font-normal text-zinc-900 dark:text-zinc-100 leading-tight',\r\n event.isCanceled && 'line-through opacity-60',\r\n )}\r\n >\r\n {event.title}\r\n </h2>\r\n {/* Inline status badges */}\r\n {event.meetingTookPlace && (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-full bg-green-100 dark:bg-green-900/30 text-green-700 dark:text-green-400 text-xs font-medium\">\r\n <CheckCircleIcon className=\"h-3 w-3\" />\r\n {labels.completed}\r\n </span>\r\n )}\r\n {event.isCanceled && (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-full bg-red-100 dark:bg-red-900/30 text-red-700 dark:text-red-400 text-xs font-medium\">\r\n <XIcon className=\"h-3 w-3\" />\r\n {labels.canceled}\r\n </span>\r\n )}\r\n </div>\r\n <div className=\"mt-1 text-sm text-zinc-600 dark:text-zinc-400\">\r\n <span>{formatDateRange()}</span>\r\n {getTimeRange() && (\r\n <>\r\n <span className=\"mx-1.5\">·</span>\r\n <span>{getTimeRange()}</span>\r\n </>\r\n )}\r\n </div>\r\n {isRecurring && event.recurrenceSummary && (\r\n <div className=\"text-sm text-zinc-500 dark:text-zinc-500\">\r\n {event.recurrenceSummary}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Cancellation Note Section */}\r\n {event.isCanceled && (\r\n <div className=\"mx-4 p-3 rounded-lg bg-red-50 dark:bg-red-950/30\">\r\n {renderCancelReason ? (\r\n renderCancelReason(event)\r\n ) : (\r\n <div className=\"flex items-start gap-0\">\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"text-sm font-medium text-red-700 dark:text-red-400\">\r\n {labels.cancellationNote}\r\n </div>\r\n {event.cancelReason && (\r\n <div className=\"mt-1 text-sm text-red-600/80 dark:text-red-400/80 italic\">\r\n "{event.cancelReason}"\r\n </div>\r\n )}\r\n {event.canceledDate && (\r\n <div className=\"mt-1.5 text-xs text-red-500/70 dark:text-red-400/60\">\r\n {labels.canceledOn} {formatCanceledDate(event.canceledDate)}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Content sections */}\r\n <div className=\"space-y-0.5\">\r\n {/* Location */}\r\n {event.address && (\r\n <div className=\"flex items-start gap-2\">\r\n <MapPinIcon className=\"h-5 w-5 text-zinc-400 mt-0.5 shrink-0\" />\r\n <span className=\"text-sm text-zinc-700 dark:text-zinc-300\">\r\n {event.address}\r\n </span>\r\n </div>\r\n )}\r\n\r\n {/* Participants */}\r\n {(hasParticipantDetails || participantNames.length > 0) && (\r\n <div className=\"flex items-start gap-2 py-0\">\r\n <UsersIcon className=\"h-5 w-5 text-zinc-400 mt-0.5 shrink-0\" />\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center gap-0\">\r\n <span className=\"text-sm text-zinc-900 dark:text-zinc-100 font-medium\">\r\n {totalParticipants}{' '}\r\n {totalParticipants !== 1 ? labels.guests : labels.guest}\r\n </span>\r\n {totalParticipants > 0 && (\r\n <span className=\"text-xs text-zinc-500\">\r\n ({confirmedCount} {labels.confirmed})\r\n </span>\r\n )}\r\n </div>\r\n <div className=\"mt-2 space-y-2\">\r\n {hasParticipantDetails\r\n ? participantDetails.slice(0, 6).map((p, idx) =>\r\n renderParticipant ? (\r\n renderParticipant(p, idx)\r\n ) : (\r\n <ParticipantRow\r\n key={p.id}\r\n participant={p}\r\n isEventCanceled={event.isCanceled}\r\n labels={labels}\r\n />\r\n ),\r\n )\r\n : participantNames.slice(0, 6).map((name, idx) => {\r\n const fallbackParticipant: IEventParticipant = {\r\n id: String(idx),\r\n name,\r\n email: '',\r\n isConfirmed: event.isAccepted,\r\n isOrganizer: idx === 0,\r\n isClient: false,\r\n };\r\n return renderParticipant ? (\r\n renderParticipant(fallbackParticipant, idx)\r\n ) : (\r\n <ParticipantRow\r\n key={name}\r\n participant={fallbackParticipant}\r\n isEventCanceled={event.isCanceled}\r\n labels={labels}\r\n />\r\n );\r\n })}\r\n {totalParticipants > 6 && (\r\n <div className=\"text-xs text-zinc-500 py-1.5 pl-10\">\r\n +{totalParticipants - 6} {labels.more}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Description */}\r\n {event.description && (\r\n <div className=\"flex items-start gap-2\">\r\n <FileTextIcon className=\"h-5 w-5 text-zinc-400 mt-0.5 shrink-0\" />\r\n <p className=\"text-sm text-zinc-700 dark:text-zinc-300 whitespace-pre-wrap\">\r\n {event.description}\r\n </p>\r\n </div>\r\n )}\r\n\r\n {/* Calendar/Organizer */}\r\n <div className=\"flex items-start gap-2\">\r\n <CalendarIcon className=\"h-5 w-5 text-zinc-400 mt-0.5 shrink-0\" />\r\n <div className=\"text-sm text-zinc-700 dark:text-zinc-300\">\r\n {(hasParticipantDetails &&\r\n participantDetails.find((p) => p.isOrganizer)?.name) ||\r\n participantNames[0] ||\r\n 'Calendar'}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* RSVP Section */}\r\n {showRsvpButtons && onAccept && onDecline && (\r\n <div className=\"border-t border-zinc-100 dark:border-zinc-800 mt-3 py-3\">\r\n <div className=\"flex items-center gap-2\">\r\n {/* Going button with recurring dropdown */}\r\n {isRecurring ? (\r\n <DropdownMenu>\r\n <DropdownMenuTrigger asChild>\r\n <div className=\"flex\">\r\n <Button\r\n size=\"sm\"\r\n variant=\"outline\"\r\n className={cn(\r\n 'rounded-r-none gap-1.5 h-8 !border-none !bg-green-100 text-green-800 hover:!bg-green-200',\r\n hasCurrentUserAccepted &&\r\n '!bg-green-700 !text-white hover:!bg-green-700',\r\n )}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n if (!hasCurrentUserAccepted) {\r\n onAccept(event);\r\n }\r\n }}\r\n disabled={isAcceptLoading}\r\n >\r\n {isAcceptLoading ? (\r\n <LoaderIcon className=\"h-3.5 w-3.5\" />\r\n ) : (\r\n <>\r\n {hasCurrentUserAccepted && (\r\n <CheckIcon className=\"h-3.5 w-3.5\" />\r\n )}\r\n {labels.going}\r\n </>\r\n )}\r\n </Button>\r\n <Button\r\n size=\"sm\"\r\n variant=\"outline\"\r\n className={cn(\r\n 'rounded-l-none px-1.5 h-8 !border-none !bg-green-100 text-green-800 hover:!bg-green-200',\r\n hasCurrentUserAccepted &&\r\n '!bg-green-700 !text-white hover:!bg-green-700',\r\n )}\r\n >\r\n <ChevronDownIcon className=\"h-3.5 w-3.5\" />\r\n </Button>\r\n </div>\r\n </DropdownMenuTrigger>\r\n <DropdownMenuContent align=\"start\">\r\n <DropdownMenuItem\r\n className={cn(\r\n 'gap-1.5 h-8 !border-none !bg-green-50 text-green-800 hover:!bg-green-100',\r\n hasCurrentUserAccepted &&\r\n '!bg-green-700 !text-white hover:!bg-green-700',\r\n )}\r\n onClick={() => onAccept(event)}\r\n >\r\n <CheckIcon className=\"h-3.5 w-3.5 mr-2 text-green-600\" />\r\n {labels.acceptThisEvent}\r\n </DropdownMenuItem>\r\n <DropdownMenuItem onClick={() => onAccept(event)}>\r\n <CheckIcon className=\"h-3.5 w-3.5 mr-2 text-green-600\" />\r\n {labels.acceptAllEvents}\r\n </DropdownMenuItem>\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n ) : (\r\n <Button\r\n size=\"sm\"\r\n variant=\"outline\"\r\n className={cn(\r\n 'gap-1.5 h-8 !border-none !bg-green-100 text-green-800 hover:!bg-green-200',\r\n hasCurrentUserAccepted &&\r\n '!bg-green-700 !text-white hover:!bg-green-700',\r\n )}\r\n onClick={() => {\r\n if (!hasCurrentUserAccepted) {\r\n onAccept(event);\r\n }\r\n }}\r\n disabled={isAcceptLoading}\r\n >\r\n {isAcceptLoading ? (\r\n <LoaderIcon className=\"h-3.5 w-3.5\" />\r\n ) : (\r\n <>\r\n {hasCurrentUserAccepted && (\r\n <CheckIcon className=\"h-3.5 w-3.5\" />\r\n )}\r\n {labels.going}\r\n </>\r\n )}\r\n </Button>\r\n )}\r\n\r\n {/* Not Going button */}\r\n <Button\r\n size=\"sm\"\r\n variant=\"outline\"\r\n className={cn(\r\n 'gap-1.5 h-8 !border-none !bg-rose-100 text-rose-800 hover:!bg-rose-200',\r\n hasCurrentUserDeclined &&\r\n '!bg-rose-700 !text-white hover:!bg-rose-700',\r\n )}\r\n onClick={() => {\r\n if (!hasCurrentUserDeclined) {\r\n onDecline(event);\r\n }\r\n }}\r\n disabled={isDeclineLoading}\r\n >\r\n {isDeclineLoading ? (\r\n <LoaderIcon className=\"h-3.5 w-3.5\" />\r\n ) : (\r\n <>\r\n {hasCurrentUserDeclined && <XIcon className=\"h-3.5 w-3.5\" />}\r\n {labels.notGoing}\r\n </>\r\n )}\r\n </Button>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Confirm meeting took place */}\r\n {isCurrentUserParticipant &&\r\n hasCurrentUserAccepted &&\r\n !event.meetingTookPlace &&\r\n !event.isCanceled &&\r\n onConfirmMeeting && (\r\n <div className=\"border-t border-zinc-100 dark:border-zinc-800 py-3\">\r\n <Button\r\n size=\"sm\"\r\n variant=\"outline\"\r\n className=\"w-full h-9 hover:!bg-green-100 hover:text-green-700 text-green-700 !bg-green-100 !border-none dark:text-green-400 dark:hover:bg-green-950/30\"\r\n onClick={() => onConfirmMeeting(event)}\r\n disabled={isConfirmLoading}\r\n >\r\n {isConfirmLoading && <LoaderIcon className=\"h-4 w-4 mr-2\" />}\r\n {labels.confirmMeeting}\r\n </Button>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Delete Confirmation Dialog */}\r\n {renderDeleteConfirmation ? (\r\n showDeleteConfirm &&\r\n renderDeleteConfirmation({\r\n onConfirm: confirmDelete,\r\n onCancel: () => setShowDeleteConfirm(false),\r\n isLoading: isDeleteLoading,\r\n })\r\n ) : (\r\n <AlertDialog\r\n open={showDeleteConfirm}\r\n onOpenChange={setShowDeleteConfirm}\r\n title={labels.deleteConfirmTitle}\r\n description={labels.deleteConfirmDescription}\r\n cancelLabel={labels.cancel}\r\n confirmLabel={labels.delete}\r\n onConfirm={confirmDelete}\r\n isLoading={isDeleteLoading}\r\n />\r\n )}\r\n </TooltipProvider>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// MAIN COMPONENT\r\n// ============================================================================\r\n\r\nexport function EventPopover<TData = Record<string, unknown>>({\r\n event,\r\n children,\r\n open,\r\n onOpenChange,\r\n isLoading,\r\n labels: customLabels,\r\n onEdit,\r\n onDelete,\r\n onCancel,\r\n onAccept,\r\n onDecline,\r\n onConfirmMeeting,\r\n canEdit = true,\r\n canDelete = false,\r\n canCancel = true,\r\n isCurrentUserParticipant,\r\n isCurrentUserClient,\r\n currentUserAcceptStatus,\r\n isAcceptLoading,\r\n isDeclineLoading,\r\n isConfirmLoading,\r\n isDeleteLoading,\r\n renderParticipant,\r\n renderHeaderActions,\r\n renderCancelReason,\r\n renderDeleteConfirmation,\r\n formatDate,\r\n formatTimeRange,\r\n className,\r\n width = 360,\r\n}: EventPopoverProps<TData>): React.JSX.Element {\r\n const isDesktop = useMediaQuery('(min-width: 768px)');\r\n const labels = { ...DEFAULT_LABELS, ...customLabels };\r\n\r\n const handleClose = useCallback(() => {\r\n onOpenChange?.(false);\r\n }, [onOpenChange]);\r\n\r\n const contentProps: EventPopoverContentProps<TData> = {\r\n event,\r\n labels,\r\n isLoading,\r\n onClose: handleClose,\r\n onEdit,\r\n onDelete,\r\n onCancel,\r\n onAccept,\r\n onDecline,\r\n onConfirmMeeting,\r\n canEdit,\r\n canDelete,\r\n canCancel,\r\n isCurrentUserParticipant,\r\n isCurrentUserClient,\r\n currentUserAcceptStatus,\r\n isAcceptLoading,\r\n isDeclineLoading,\r\n isConfirmLoading,\r\n isDeleteLoading,\r\n renderParticipant,\r\n renderHeaderActions,\r\n renderCancelReason,\r\n renderDeleteConfirmation,\r\n formatDate,\r\n formatTimeRange,\r\n };\r\n\r\n // Desktop: Use Popover with smart positioning\r\n if (isDesktop) {\r\n return (\r\n <Popover open={open ?? false} onOpenChange={onOpenChange ?? (() => { })}>\r\n <PopoverTrigger asChild>{children}</PopoverTrigger>\r\n <PopoverContent\r\n className={cn(\r\n 'p-0 shadow-lg !rounded-2xl bg-white dark:bg-zinc-900 overflow-hidden border z-50',\r\n className,\r\n )}\r\n style={{ width }}\r\n align=\"center\"\r\n side=\"bottom\"\r\n sideOffset={4}\r\n >\r\n <EventPopoverContentInner {...contentProps} />\r\n </PopoverContent>\r\n </Popover>\r\n );\r\n }\r\n\r\n // Mobile: Use Dialog\r\n return (\r\n <>\r\n {children}\r\n <SimpleDialog open={open ?? false} onOpenChange={onOpenChange ?? (() => { })} title={event.title}>\r\n <EventPopoverContentInner {...contentProps} />\r\n </SimpleDialog>\r\n </>\r\n );\r\n}\r\n\r\nexport default EventPopover;\r\n","/**\r\n * SlotDurationSetting - Select for time slot duration\r\n *\r\n * Allows changing the time slot duration for day/week views.\r\n */\r\n\r\nimport { cn } from '../../lib/utils';\r\nimport { Select, Label } from '../ui/select';\r\nimport {\r\n Tooltip,\r\n TooltipContent,\r\n TooltipProvider,\r\n TooltipTrigger,\r\n} from '../ui/tooltip';\r\n\r\n// ============================================================================\r\n// ICONS\r\n// ============================================================================\r\n\r\nfunction InfoIcon({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\r\n <path d=\"M12 16v-4\" />\r\n <path d=\"M12 8h.01\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction LockIcon({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <rect width=\"18\" height=\"11\" x=\"3\" y=\"11\" rx=\"2\" ry=\"2\" />\r\n <path d=\"M7 11V7a5 5 0 0 1 10 0v4\" />\r\n </svg>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nimport type { TSlotDuration } from '../../core/context/inno-calendar-provider';\r\n\r\nconst SLOT_OPTIONS: { value: TSlotDuration; label: string }[] = [\r\n { value: 15, label: '15 minutes' },\r\n { value: 30, label: '30 minutes' },\r\n { value: 60, label: '1 hour' },\r\n];\r\n\r\nexport interface SlotDurationSettingProps {\r\n /** Current slot duration */\r\n value: TSlotDuration;\r\n /** Change handler */\r\n onChange: (value: TSlotDuration) => void;\r\n /** Whether this setting is locked */\r\n isLocked?: boolean;\r\n /** Additional CSS classes */\r\n className?: string;\r\n /** Labels for i18n */\r\n labels?: {\r\n title?: string;\r\n lockedMessage?: string;\r\n infoMessage?: string;\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// COMPONENT\r\n// ============================================================================\r\n\r\nexport function SlotDurationSetting({\r\n value,\r\n onChange,\r\n isLocked = false,\r\n className,\r\n labels = {},\r\n}: SlotDurationSettingProps) {\r\n const mergedLabels = {\r\n title: 'Slot duration',\r\n lockedMessage: 'This setting is locked by the administrator',\r\n infoMessage: 'Set the time slot duration for day and week calendar views.',\r\n ...labels,\r\n };\r\n\r\n const handleChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\r\n if (isLocked) return;\r\n onChange(Number(e.target.value) as TSlotDuration);\r\n };\r\n\r\n return (\r\n <div className={cn('flex flex-col gap-3', className)}>\r\n <div className=\"flex items-center gap-2\">\r\n <Label className=\"text-sm font-semibold\">{mergedLabels.title}</Label>\r\n {isLocked ? (\r\n <TooltipProvider delayDuration={100}>\r\n <Tooltip>\r\n <TooltipTrigger>\r\n <LockIcon className=\"size-3 text-muted-foreground\" />\r\n </TooltipTrigger>\r\n <TooltipContent>\r\n <p>{mergedLabels.lockedMessage}</p>\r\n </TooltipContent>\r\n </Tooltip>\r\n </TooltipProvider>\r\n ) : (\r\n <TooltipProvider delayDuration={100}>\r\n <Tooltip>\r\n <TooltipTrigger>\r\n <InfoIcon className=\"size-3 text-muted-foreground\" />\r\n </TooltipTrigger>\r\n <TooltipContent className=\"max-w-64 text-center\">\r\n <p>{mergedLabels.infoMessage}</p>\r\n </TooltipContent>\r\n </Tooltip>\r\n </TooltipProvider>\r\n )}\r\n </div>\r\n\r\n <Select\r\n value={value.toString()}\r\n onChange={handleChange}\r\n disabled={isLocked}\r\n className=\"h-9 w-[128px] text-sm\"\r\n >\r\n {SLOT_OPTIONS.map((opt) => (\r\n <option key={opt.value} value={opt.value.toString()}>\r\n {opt.label}\r\n </option>\r\n ))}\r\n </Select>\r\n </div>\r\n );\r\n}\r\n\r\nexport default SlotDurationSetting;\r\n","/**\r\n * VisibleHoursSetting - Select range of visible hours in day/week views\r\n *\r\n * Allows users to set the start and end hours for the calendar grid.\r\n */\r\n\r\nimport { cn } from '../../lib/utils';\r\nimport { Select, Label } from '../ui/select';\r\nimport {\r\n Tooltip,\r\n TooltipContent,\r\n TooltipProvider,\r\n TooltipTrigger,\r\n} from '../ui/tooltip';\r\nimport type { IVisibleHours } from '../../core/types';\r\n\r\n// Re-export from core for convenience\r\nexport type { IVisibleHours } from '../../core/types';\r\n\r\n// ============================================================================\r\n// ICONS\r\n// ============================================================================\r\n\r\nfunction InfoIcon({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\r\n <path d=\"M12 16v-4\" />\r\n <path d=\"M12 8h.01\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction LockIcon({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <rect width=\"18\" height=\"11\" x=\"3\" y=\"11\" rx=\"2\" ry=\"2\" />\r\n <path d=\"M7 11V7a5 5 0 0 1 10 0v4\" />\r\n </svg>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface VisibleHoursSettingProps {\r\n /** Current visible hours range */\r\n value: IVisibleHours;\r\n /** Change handler */\r\n onChange: (value: IVisibleHours) => void;\r\n /** Whether this setting is locked */\r\n isLocked?: boolean;\r\n /** Additional CSS classes */\r\n className?: string;\r\n /** Labels for i18n */\r\n labels?: {\r\n title?: string;\r\n from?: string;\r\n to?: string;\r\n lockedMessage?: string;\r\n infoMessage?: string;\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// HELPERS\r\n// ============================================================================\r\n\r\nfunction generateHourOptions(): { value: number; label: string }[] {\r\n return Array.from({ length: 25 }, (_, i) => ({\r\n value: i,\r\n label: `${String(i).padStart(2, '0')}:00`,\r\n }));\r\n}\r\n\r\n// ============================================================================\r\n// COMPONENT\r\n// ============================================================================\r\n\r\nexport function VisibleHoursSetting({\r\n value,\r\n onChange,\r\n isLocked = false,\r\n className,\r\n labels = {},\r\n}: VisibleHoursSettingProps) {\r\n const mergedLabels = {\r\n title: 'Visible hours',\r\n from: 'From',\r\n to: 'To',\r\n lockedMessage: 'This setting is locked by the administrator',\r\n infoMessage:\r\n 'Set the visible hour range for day and week views. Hours outside this range will be hidden.',\r\n ...labels,\r\n };\r\n\r\n const hourOptions = generateHourOptions();\r\n\r\n const handleFromChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\r\n if (isLocked) return;\r\n const newStartHour = Number(e.target.value);\r\n // Ensure startHour is always less than endHour\r\n if (newStartHour < value.endHour) {\r\n onChange({ ...value, startHour: newStartHour });\r\n }\r\n };\r\n\r\n const handleToChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\r\n if (isLocked) return;\r\n const newEndHour = Number(e.target.value);\r\n // Ensure endHour is always greater than startHour\r\n if (newEndHour > value.startHour) {\r\n onChange({ ...value, endHour: newEndHour });\r\n }\r\n };\r\n\r\n return (\r\n <div className={cn('flex flex-col gap-3', className)}>\r\n <div className=\"flex items-center gap-2\">\r\n <Label className=\"text-sm font-semibold\">{mergedLabels.title}</Label>\r\n {isLocked ? (\r\n <TooltipProvider delayDuration={100}>\r\n <Tooltip>\r\n <TooltipTrigger>\r\n <LockIcon className=\"size-3 text-muted-foreground\" />\r\n </TooltipTrigger>\r\n <TooltipContent>\r\n <p>{mergedLabels.lockedMessage}</p>\r\n </TooltipContent>\r\n </Tooltip>\r\n </TooltipProvider>\r\n ) : (\r\n <TooltipProvider delayDuration={100}>\r\n <Tooltip>\r\n <TooltipTrigger>\r\n <InfoIcon className=\"size-3 text-muted-foreground\" />\r\n </TooltipTrigger>\r\n <TooltipContent className=\"max-w-64 text-center\">\r\n <p>{mergedLabels.infoMessage}</p>\r\n </TooltipContent>\r\n </Tooltip>\r\n </TooltipProvider>\r\n )}\r\n </div>\r\n\r\n <div className=\"flex items-center gap-2\">\r\n <div className=\"flex flex-col gap-1\">\r\n <Label className=\"text-xs text-muted-foreground\">\r\n {mergedLabels.from}\r\n </Label>\r\n <Select\r\n value={value.startHour.toString()}\r\n onChange={handleFromChange}\r\n disabled={isLocked}\r\n className=\"h-9 w-[88px] text-sm\"\r\n >\r\n {hourOptions.map((opt) => (\r\n <option\r\n key={opt.value}\r\n value={opt.value.toString()}\r\n disabled={opt.value >= value.endHour}\r\n >\r\n {opt.label}\r\n </option>\r\n ))}\r\n </Select>\r\n </div>\r\n\r\n <span className=\"mt-5 text-muted-foreground\">—</span>\r\n\r\n <div className=\"flex flex-col gap-1\">\r\n <Label className=\"text-xs text-muted-foreground\">\r\n {mergedLabels.to}\r\n </Label>\r\n <Select\r\n value={value.endHour.toString()}\r\n onChange={handleToChange}\r\n disabled={isLocked}\r\n className=\"h-9 w-[88px] text-sm\"\r\n >\r\n {hourOptions.map((opt) => (\r\n <option\r\n key={opt.value}\r\n value={opt.value.toString()}\r\n disabled={opt.value <= value.startHour}\r\n >\r\n {opt.label}\r\n </option>\r\n ))}\r\n </Select>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default VisibleHoursSetting;\r\n","/**\r\n * BadgeVariantSetting - Select event display style\r\n *\r\n * Allows choosing between dot, colored, or mixed event display.\r\n */\r\n\r\nimport { cn } from '../../lib/utils';\r\nimport { Select, Label } from '../ui/select';\r\nimport {\r\n Tooltip,\r\n TooltipContent,\r\n TooltipProvider,\r\n TooltipTrigger,\r\n} from '../ui/tooltip';\r\nimport type { TBadgeVariant } from '../../core/types';\r\n\r\n// ============================================================================\r\n// ICONS\r\n// ============================================================================\r\n\r\nfunction InfoIcon({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\r\n <path d=\"M12 16v-4\" />\r\n <path d=\"M12 8h.01\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction LockIcon({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <rect width=\"18\" height=\"11\" x=\"3\" y=\"11\" rx=\"2\" ry=\"2\" />\r\n <path d=\"M7 11V7a5 5 0 0 1 10 0v4\" />\r\n </svg>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nconst BADGE_OPTIONS: { value: TBadgeVariant; label: string }[] = [\r\n { value: 'dot', label: 'Dot indicator' },\r\n { value: 'colored', label: 'Full color' },\r\n { value: 'mixed', label: 'Mixed' },\r\n];\r\n\r\nexport interface BadgeVariantSettingProps {\r\n /** Current badge variant */\r\n value: TBadgeVariant;\r\n /** Change handler */\r\n onChange: (value: TBadgeVariant) => void;\r\n /** Whether this setting is locked */\r\n isLocked?: boolean;\r\n /** Additional CSS classes */\r\n className?: string;\r\n /** Labels for i18n */\r\n labels?: {\r\n title?: string;\r\n lockedMessage?: string;\r\n infoMessage?: string;\r\n options?: {\r\n dot?: string;\r\n colored?: string;\r\n mixed?: string;\r\n };\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// COMPONENT\r\n// ============================================================================\r\n\r\nexport function BadgeVariantSetting({\r\n value,\r\n onChange,\r\n isLocked = false,\r\n className,\r\n labels = {},\r\n}: BadgeVariantSettingProps) {\r\n const mergedLabels = {\r\n title: 'Event display',\r\n lockedMessage: 'This setting is locked by the administrator',\r\n infoMessage:\r\n 'Choose how events are displayed. Dot shows a small indicator, colored fills the entire event, mixed uses both.',\r\n options: {\r\n dot: 'Dot indicator',\r\n colored: 'Full color',\r\n mixed: 'Mixed',\r\n },\r\n ...labels,\r\n };\r\n\r\n const getOptionLabel = (variant: TBadgeVariant): string => {\r\n return mergedLabels.options?.[variant] ?? variant;\r\n };\r\n\r\n const handleChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\r\n if (isLocked) return;\r\n onChange(e.target.value as TBadgeVariant);\r\n };\r\n\r\n return (\r\n <div className={cn('flex flex-col gap-3', className)}>\r\n <div className=\"flex items-center gap-2\">\r\n <Label className=\"text-sm font-semibold\">{mergedLabels.title}</Label>\r\n {isLocked ? (\r\n <TooltipProvider delayDuration={100}>\r\n <Tooltip>\r\n <TooltipTrigger>\r\n <LockIcon className=\"size-3 text-muted-foreground\" />\r\n </TooltipTrigger>\r\n <TooltipContent>\r\n <p>{mergedLabels.lockedMessage}</p>\r\n </TooltipContent>\r\n </Tooltip>\r\n </TooltipProvider>\r\n ) : (\r\n <TooltipProvider delayDuration={100}>\r\n <Tooltip>\r\n <TooltipTrigger>\r\n <InfoIcon className=\"size-3 text-muted-foreground\" />\r\n </TooltipTrigger>\r\n <TooltipContent className=\"max-w-64 text-center\">\r\n <p>{mergedLabels.infoMessage}</p>\r\n </TooltipContent>\r\n </Tooltip>\r\n </TooltipProvider>\r\n )}\r\n </div>\r\n\r\n <Select\r\n value={value}\r\n onChange={handleChange}\r\n disabled={isLocked}\r\n className=\"h-9 w-[128px] text-sm\"\r\n >\r\n {BADGE_OPTIONS.map((opt) => (\r\n <option key={opt.value} value={opt.value}>\r\n {getOptionLabel(opt.value)}\r\n </option>\r\n ))}\r\n </Select>\r\n </div>\r\n );\r\n}\r\n\r\nexport default BadgeVariantSetting;\r\n","/**\r\n * WorkingHoursSetting - Configure working hours per day of week\r\n *\r\n * Allows users to set the start/end working hours and enable/disable days.\r\n */\r\n\r\nimport { cn } from '../../lib/utils';\r\nimport { Select, Label } from '../ui/select';\r\nimport {\r\n Tooltip,\r\n TooltipContent,\r\n TooltipProvider,\r\n TooltipTrigger,\r\n} from '../ui/tooltip';\r\n\r\n// ============================================================================\r\n// ICONS\r\n// ============================================================================\r\n\r\nfunction InfoIcon({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\r\n <path d=\"M12 16v-4\" />\r\n <path d=\"M12 8h.01\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction LockIcon({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <rect width=\"18\" height=\"11\" x=\"3\" y=\"11\" rx=\"2\" ry=\"2\" />\r\n <path d=\"M7 11V7a5 5 0 0 1 10 0v4\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction CheckIcon({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <path d=\"M20 6 9 17l-5-5\" />\r\n </svg>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface IDayWorkingHours {\r\n enabled: boolean;\r\n from: number;\r\n to: number;\r\n}\r\n\r\nexport interface IWeekWorkingHours {\r\n sunday: IDayWorkingHours;\r\n monday: IDayWorkingHours;\r\n tuesday: IDayWorkingHours;\r\n wednesday: IDayWorkingHours;\r\n thursday: IDayWorkingHours;\r\n friday: IDayWorkingHours;\r\n saturday: IDayWorkingHours;\r\n}\r\n\r\nexport type TDayOfWeek = keyof IWeekWorkingHours;\r\n\r\nconst DAYS_ORDER: TDayOfWeek[] = [\r\n 'monday',\r\n 'tuesday',\r\n 'wednesday',\r\n 'thursday',\r\n 'friday',\r\n 'saturday',\r\n 'sunday',\r\n];\r\n\r\nexport interface WorkingHoursSettingProps {\r\n /** Current working hours configuration */\r\n value: IWeekWorkingHours;\r\n /** Change handler */\r\n onChange: (value: IWeekWorkingHours) => void;\r\n /** Whether this setting is locked */\r\n isLocked?: boolean;\r\n /** Additional CSS classes */\r\n className?: string;\r\n /** Labels for i18n */\r\n labels?: {\r\n title?: string;\r\n lockedMessage?: string;\r\n infoMessage?: string;\r\n days?: Record<TDayOfWeek, string>;\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// HELPERS\r\n// ============================================================================\r\n\r\nfunction generateHourOptions(): { value: number; label: string }[] {\r\n return Array.from({ length: 25 }, (_, i) => ({\r\n value: i,\r\n label: `${String(i).padStart(2, '0')}:00`,\r\n }));\r\n}\r\n\r\nconst DEFAULT_DAY_LABELS: Record<TDayOfWeek, string> = {\r\n sunday: 'Sun',\r\n monday: 'Mon',\r\n tuesday: 'Tue',\r\n wednesday: 'Wed',\r\n thursday: 'Thu',\r\n friday: 'Fri',\r\n saturday: 'Sat',\r\n};\r\n\r\n// ============================================================================\r\n// SUBCOMPONENTS\r\n// ============================================================================\r\n\r\ninterface DayRowProps {\r\n dayLabel: string;\r\n config: IDayWorkingHours;\r\n onChange: (config: IDayWorkingHours) => void;\r\n disabled?: boolean;\r\n hourOptions: { value: number; label: string }[];\r\n}\r\n\r\nfunction DayRow({\r\n dayLabel,\r\n config,\r\n onChange,\r\n disabled,\r\n hourOptions,\r\n}: DayRowProps) {\r\n const handleToggle = () => {\r\n if (disabled) return;\r\n onChange({ ...config, enabled: !config.enabled });\r\n };\r\n\r\n const handleFromChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\r\n if (disabled) return;\r\n const newFrom = Number(e.target.value);\r\n if (newFrom < config.to) {\r\n onChange({ ...config, from: newFrom });\r\n }\r\n };\r\n\r\n const handleToChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\r\n if (disabled) return;\r\n const newTo = Number(e.target.value);\r\n if (newTo > config.from) {\r\n onChange({ ...config, to: newTo });\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"flex items-center gap-2\">\r\n {/* Day toggle checkbox */}\r\n <button\r\n type=\"button\"\r\n role=\"checkbox\"\r\n aria-checked={config.enabled}\r\n aria-label={`Enable ${dayLabel}`}\r\n onClick={handleToggle}\r\n disabled={disabled}\r\n className={cn(\r\n 'flex size-5 shrink-0 items-center justify-center rounded border transition-colors',\r\n config.enabled\r\n ? 'border-primary bg-primary text-primary-foreground'\r\n : 'border-input bg-background',\r\n disabled && 'cursor-not-allowed opacity-50',\r\n )}\r\n >\r\n {config.enabled && <CheckIcon className=\"size-3\" />}\r\n </button>\r\n\r\n {/* Day label */}\r\n <span\r\n className={cn(\r\n 'w-10 text-sm',\r\n !config.enabled && 'text-muted-foreground',\r\n )}\r\n >\r\n {dayLabel}\r\n </span>\r\n\r\n {/* Hour selects */}\r\n <Select\r\n value={config.from.toString()}\r\n onChange={handleFromChange}\r\n disabled={disabled || !config.enabled}\r\n className=\"h-8 w-[76px] text-xs\"\r\n >\r\n {hourOptions.map((opt) => (\r\n <option\r\n key={opt.value}\r\n value={opt.value.toString()}\r\n disabled={opt.value >= config.to}\r\n >\r\n {opt.label}\r\n </option>\r\n ))}\r\n </Select>\r\n\r\n <span className=\"text-xs text-muted-foreground\">—</span>\r\n\r\n <Select\r\n value={config.to.toString()}\r\n onChange={handleToChange}\r\n disabled={disabled || !config.enabled}\r\n className=\"h-8 w-[76px] text-xs\"\r\n >\r\n {hourOptions.map((opt) => (\r\n <option\r\n key={opt.value}\r\n value={opt.value.toString()}\r\n disabled={opt.value <= config.from}\r\n >\r\n {opt.label}\r\n </option>\r\n ))}\r\n </Select>\r\n </div>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// COMPONENT\r\n// ============================================================================\r\n\r\nexport function WorkingHoursSetting({\r\n value,\r\n onChange,\r\n isLocked = false,\r\n className,\r\n labels = {},\r\n}: WorkingHoursSettingProps) {\r\n const mergedLabels = {\r\n title: 'Working hours',\r\n lockedMessage: 'This setting is locked by the administrator',\r\n infoMessage:\r\n 'Configure working hours for each day of the week. Non-working hours will be grayed out in day and week views.',\r\n days: DEFAULT_DAY_LABELS,\r\n ...labels,\r\n };\r\n\r\n const hourOptions = generateHourOptions();\r\n\r\n const handleDayChange = (day: TDayOfWeek, config: IDayWorkingHours) => {\r\n if (isLocked) return;\r\n onChange({ ...value, [day]: config });\r\n };\r\n\r\n return (\r\n <div className={cn('flex flex-col gap-3', className)}>\r\n <div className=\"flex items-center gap-2\">\r\n <Label className=\"text-sm font-semibold\">{mergedLabels.title}</Label>\r\n {isLocked ? (\r\n <TooltipProvider delayDuration={100}>\r\n <Tooltip>\r\n <TooltipTrigger>\r\n <LockIcon className=\"size-3 text-muted-foreground\" />\r\n </TooltipTrigger>\r\n <TooltipContent>\r\n <p>{mergedLabels.lockedMessage}</p>\r\n </TooltipContent>\r\n </Tooltip>\r\n </TooltipProvider>\r\n ) : (\r\n <TooltipProvider delayDuration={100}>\r\n <Tooltip>\r\n <TooltipTrigger>\r\n <InfoIcon className=\"size-3 text-muted-foreground\" />\r\n </TooltipTrigger>\r\n <TooltipContent className=\"max-w-64 text-center\">\r\n <p>{mergedLabels.infoMessage}</p>\r\n </TooltipContent>\r\n </Tooltip>\r\n </TooltipProvider>\r\n )}\r\n </div>\r\n\r\n <div className=\"flex flex-col gap-2\">\r\n {DAYS_ORDER.map((day) => (\r\n <DayRow\r\n key={day}\r\n dayLabel={mergedLabels.days?.[day] ?? DEFAULT_DAY_LABELS[day]}\r\n config={value[day]}\r\n onChange={(config) => handleDayChange(day, config)}\r\n disabled={isLocked}\r\n hourOptions={hourOptions}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default WorkingHoursSetting;\r\n\r\n// ============================================================================\r\n// DEFAULTS\r\n// ============================================================================\r\n\r\nexport const DEFAULT_WEEK_WORKING_HOURS: IWeekWorkingHours = {\r\n sunday: { enabled: false, from: 8, to: 18 },\r\n monday: { enabled: true, from: 8, to: 18 },\r\n tuesday: { enabled: true, from: 8, to: 18 },\r\n wednesday: { enabled: true, from: 8, to: 18 },\r\n thursday: { enabled: true, from: 8, to: 18 },\r\n friday: { enabled: true, from: 8, to: 18 },\r\n saturday: { enabled: false, from: 8, to: 18 },\r\n};\r\n","/**\r\n * UserFilter - Generic user filter dropdown\r\n *\r\n * Allows filtering by participant/user. Receives data via props\r\n * for maximum flexibility.\r\n */\r\n\r\nimport { cn } from '../../lib/utils';\r\nimport { Select, Label } from '../ui/select';\r\n\r\n// ============================================================================\r\n// ICONS\r\n// ============================================================================\r\n\r\nfunction UsersIcon({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <path d=\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\" />\r\n <circle cx=\"9\" cy=\"7\" r=\"4\" />\r\n <path d=\"M22 21v-2a4 4 0 0 0-3-3.87\" />\r\n <path d=\"M16 3.13a4 4 0 0 1 0 7.75\" />\r\n </svg>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface IUserOption {\r\n /** Unique identifier */\r\n id: string;\r\n /** Display name */\r\n name: string;\r\n /** Optional avatar URL */\r\n avatarUrl?: string;\r\n}\r\n\r\nexport interface UserFilterProps {\r\n /** Available user options */\r\n users: IUserOption[];\r\n /** Currently selected user ID (or 'all' for all users) */\r\n value: string;\r\n /** Change handler */\r\n onChange: (value: string) => void;\r\n /** \"All users\" option label */\r\n allLabel?: string;\r\n /** Additional CSS classes */\r\n className?: string;\r\n /** Optional label */\r\n label?: string;\r\n}\r\n\r\n// ============================================================================\r\n// COMPONENT\r\n// ============================================================================\r\n\r\nexport function UserFilter({\r\n users,\r\n value,\r\n onChange,\r\n allLabel = 'All users',\r\n className,\r\n label,\r\n}: UserFilterProps) {\r\n const handleChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\r\n onChange(e.target.value);\r\n };\r\n\r\n return (\r\n <div className={cn('flex flex-col gap-1', className)}>\r\n {label && (\r\n <Label className=\"text-xs text-muted-foreground\">{label}</Label>\r\n )}\r\n <div className=\"relative\">\r\n <UsersIcon className=\"pointer-events-none absolute left-2.5 top-1/2 size-4 -translate-y-1/2 text-muted-foreground\" />\r\n <Select\r\n value={value}\r\n onChange={handleChange}\r\n className=\"h-9 w-full min-w-[120px] pl-8 pr-8 text-sm\"\r\n >\r\n <option value=\"all\">{allLabel}</option>\r\n {users.map((user) => (\r\n <option key={user.id} value={user.id}>\r\n {user.name}\r\n </option>\r\n ))}\r\n </Select>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default UserFilter;\r\n","/**\r\n * ScheduleTypeFilter - Generic event type filter dropdown\r\n *\r\n * Allows filtering events by schedule/event type.\r\n * Shows colored indicators for each type.\r\n */\r\n\r\nimport { cn } from '../../lib/utils';\r\nimport { Select, Label } from '../ui/select';\r\n\r\n// ============================================================================\r\n// ICONS\r\n// ============================================================================\r\n\r\nfunction TagIcon({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <path d=\"M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z\" />\r\n <circle cx=\"7.5\" cy=\"7.5\" r=\".5\" fill=\"currentColor\" />\r\n </svg>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface IScheduleTypeOption {\r\n /** Unique identifier */\r\n id: number | string;\r\n /** Display label */\r\n label: string;\r\n /** Color hex for the indicator */\r\n color: string;\r\n}\r\n\r\nexport interface ScheduleTypeFilterProps {\r\n /** Available schedule type options */\r\n scheduleTypes: IScheduleTypeOption[];\r\n /** Currently selected schedule type ID (or 'all' for all types) */\r\n value: string;\r\n /** Change handler */\r\n onChange: (value: string) => void;\r\n /** \"All types\" option label */\r\n allLabel?: string;\r\n /** Additional CSS classes */\r\n className?: string;\r\n /** Optional label */\r\n label?: string;\r\n}\r\n\r\n// ============================================================================\r\n// COMPONENT\r\n// ============================================================================\r\n\r\nexport function ScheduleTypeFilter({\r\n scheduleTypes,\r\n value,\r\n onChange,\r\n allLabel = 'All types',\r\n className,\r\n label,\r\n}: ScheduleTypeFilterProps) {\r\n const handleChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\r\n onChange(e.target.value);\r\n };\r\n\r\n // Find selected type for color indicator\r\n const selectedType = scheduleTypes.find(\r\n (st) => String(st.id) === value,\r\n );\r\n\r\n return (\r\n <div className={cn('flex flex-col gap-1', className)}>\r\n {label && (\r\n <Label className=\"text-xs text-muted-foreground\">{label}</Label>\r\n )}\r\n <div className=\"relative\">\r\n {selectedType ? (\r\n <span\r\n className=\"pointer-events-none absolute left-2.5 top-1/2 size-3 -translate-y-1/2 rounded-full\"\r\n style={{ backgroundColor: selectedType.color }}\r\n />\r\n ) : (\r\n <TagIcon className=\"pointer-events-none absolute left-2.5 top-1/2 size-4 -translate-y-1/2 text-muted-foreground\" />\r\n )}\r\n <Select\r\n value={value}\r\n onChange={handleChange}\r\n className=\"h-9 w-full min-w-[140px] pl-8 pr-8 text-sm\"\r\n >\r\n <option value=\"all\">{allLabel}</option>\r\n {scheduleTypes.map((type) => (\r\n <option key={type.id} value={String(type.id)}>\r\n {type.label}\r\n </option>\r\n ))}\r\n </Select>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default ScheduleTypeFilter;\r\n","/**\r\n * CalendarFilterSidebar\r\n *\r\n * A sidebar component for filtering calendar events by schedule type and participants.\r\n * Features:\r\n * - Schedule type filters with colors\r\n * - Participant filters with avatars\r\n * - Search functionality within each section\r\n * - Select all / Unselect all toggle\r\n *\r\n * This is a headless-friendly component - all data is passed via props.\r\n */\r\n\r\nimport { useMemo, useState } from 'react';\r\nimport type { IScheduleType, ICalendarUser } from '../../core/types';\r\nimport { cn } from '../../lib/utils';\r\n\r\n// ============================================================================\r\n// INLINE SVG ICONS\r\n// ============================================================================\r\n\r\nfunction CheckIcon({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"3\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <polyline points=\"20 6 9 17 4 12\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction SearchIcon({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\r\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction XIcon({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\r\n </svg>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// INLINE CHECKBOX COMPONENT\r\n// ============================================================================\r\n\r\ninterface CheckboxProps {\r\n checked: boolean;\r\n onCheckedChange: (checked: boolean) => void;\r\n className?: string;\r\n children?: React.ReactNode;\r\n}\r\n\r\nfunction Checkbox({ checked, onCheckedChange, className, children }: CheckboxProps) {\r\n return (\r\n <button\r\n type=\"button\"\r\n role=\"checkbox\"\r\n aria-checked={checked}\r\n onClick={() => onCheckedChange(!checked)}\r\n className={className}\r\n >\r\n {children}\r\n </button>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// INLINE AVATAR COMPONENT\r\n// ============================================================================\r\n\r\ninterface AvatarProps {\r\n src?: string | null;\r\n alt?: string;\r\n fallback?: string;\r\n className?: string;\r\n}\r\n\r\nfunction Avatar({ src, alt, fallback, className }: AvatarProps) {\r\n const [hasError, setHasError] = useState(false);\r\n\r\n if (!src || hasError) {\r\n return (\r\n <div\r\n className={cn(\r\n 'flex items-center justify-center bg-zinc-200 text-zinc-600 font-medium text-sm',\r\n className,\r\n )}\r\n >\r\n {fallback || '?'}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <img\r\n src={src}\r\n alt={alt || ''}\r\n className={cn('object-cover', className)}\r\n onError={() => setHasError(true)}\r\n />\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// INLINE INPUT COMPONENT\r\n// ============================================================================\r\n\r\ninterface SearchInputProps {\r\n value: string;\r\n onChange: (value: string) => void;\r\n placeholder?: string;\r\n className?: string;\r\n}\r\n\r\nfunction SearchInput({ value, onChange, placeholder, className }: SearchInputProps) {\r\n return (\r\n <div className={cn('relative', className)}>\r\n <SearchIcon className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\r\n <input\r\n type=\"text\"\r\n value={value}\r\n onChange={(e) => onChange(e.target.value)}\r\n placeholder={placeholder}\r\n className=\"h-9 w-full rounded-lg border border-border bg-white pl-9 pr-3 text-sm placeholder:text-muted-foreground focus:border-primary focus:outline-none focus:ring-1 focus:ring-primary\"\r\n />\r\n </div>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// FUZZY SEARCH UTILITY\r\n// ============================================================================\r\n\r\nfunction fuzzySearch<T>(\r\n items: T[],\r\n query: string,\r\n getSearchableStrings: (item: T) => string[],\r\n _threshold = 0.3,\r\n): T[] {\r\n if (!query.trim()) return items;\r\n\r\n const lowerQuery = query.toLowerCase();\r\n\r\n return items.filter((item) => {\r\n const searchableStrings = getSearchableStrings(item);\r\n return searchableStrings.some((str) => {\r\n if (!str) return false;\r\n const lowerStr = str.toLowerCase();\r\n // Simple includes check for fuzzy-like behavior\r\n return lowerStr.includes(lowerQuery);\r\n });\r\n });\r\n}\r\n\r\n// ============================================================================\r\n// LABELS TYPE\r\n// ============================================================================\r\n\r\nexport interface CalendarFilterSidebarLabels {\r\n /** Sidebar title */\r\n title?: string;\r\n /** Sidebar subtitle */\r\n subtitle?: string;\r\n /** Schedule types section title */\r\n scheduleTypes?: string;\r\n /** Participants section title */\r\n participants?: string;\r\n /** Clear all button */\r\n clearAll?: string;\r\n /** Select all button */\r\n selectAll?: string;\r\n /** Unselect all button */\r\n unselectAll?: string;\r\n /** Search schedule types placeholder */\r\n searchScheduleTypes?: string;\r\n /** Search participants placeholder */\r\n searchParticipants?: string;\r\n /** No schedule types message */\r\n noScheduleTypes?: string;\r\n /** No participants message */\r\n noParticipants?: string;\r\n}\r\n\r\nconst defaultLabels: Required<CalendarFilterSidebarLabels> = {\r\n title: 'Filters',\r\n subtitle: 'Filter calendar events',\r\n scheduleTypes: 'Event Types',\r\n participants: 'Participants',\r\n clearAll: 'Clear all',\r\n selectAll: 'Select all',\r\n unselectAll: 'Unselect all',\r\n searchScheduleTypes: 'Search event types...',\r\n searchParticipants: 'Search participants...',\r\n noScheduleTypes: 'No event types found',\r\n noParticipants: 'No participants found',\r\n};\r\n\r\n// ============================================================================\r\n// PROPS\r\n// ============================================================================\r\n\r\nexport interface CalendarFilterSidebarProps<\r\n TScheduleTypeData = Record<string, unknown>,\r\n TUserData = Record<string, unknown>,\r\n> {\r\n /** Schedule types to display */\r\n scheduleTypes: IScheduleType<TScheduleTypeData>[];\r\n /** Users/participants to display */\r\n users: ICalendarUser<TUserData>[];\r\n\r\n /** Currently selected schedule type IDs */\r\n selectedScheduleTypeIds: number[];\r\n /** Callback when schedule type selection changes */\r\n onScheduleTypeChange: (ids: number[]) => void;\r\n\r\n /** Currently selected user IDs */\r\n selectedUserIds: string[];\r\n /** Callback when user selection changes */\r\n onUserChange: (ids: string[]) => void;\r\n\r\n /** Callback when clear all is clicked */\r\n onClearAll?: () => void;\r\n\r\n /** Additional CSS classes */\r\n className?: string;\r\n\r\n /** Whether schedule types are loading */\r\n scheduleTypesLoading?: boolean;\r\n\r\n /** Whether users are loading */\r\n usersLoading?: boolean;\r\n\r\n /** Custom labels for i18n */\r\n labels?: CalendarFilterSidebarLabels;\r\n\r\n /** Function to get schedule type display name */\r\n getScheduleTypeName?: (scheduleType: IScheduleType<TScheduleTypeData>) => string;\r\n}\r\n\r\n// ============================================================================\r\n// COMPONENT\r\n// ============================================================================\r\n\r\nexport function CalendarFilterSidebar<\r\n TScheduleTypeData = Record<string, unknown>,\r\n TUserData = Record<string, unknown>,\r\n>({\r\n scheduleTypes,\r\n users,\r\n selectedScheduleTypeIds,\r\n onScheduleTypeChange,\r\n selectedUserIds,\r\n onUserChange,\r\n onClearAll,\r\n className,\r\n scheduleTypesLoading = false,\r\n usersLoading = false,\r\n labels: customLabels,\r\n getScheduleTypeName,\r\n}: CalendarFilterSidebarProps<TScheduleTypeData, TUserData>) {\r\n // Merge custom labels with defaults\r\n const labels = { ...defaultLabels, ...customLabels };\r\n\r\n // Search states\r\n const [scheduleTypeSearch, setScheduleTypeSearch] = useState('');\r\n const [participantSearch, setParticipantSearch] = useState('');\r\n\r\n // Filter schedule types by search\r\n const filteredScheduleTypes = useMemo(() => {\r\n if (!scheduleTypeSearch.trim()) return scheduleTypes;\r\n return fuzzySearch(scheduleTypes, scheduleTypeSearch, (type) => [\r\n type.name,\r\n getScheduleTypeName?.(type) || type.name,\r\n ]);\r\n }, [scheduleTypes, scheduleTypeSearch, getScheduleTypeName]);\r\n\r\n // Filter participants by search\r\n const filteredParticipants = useMemo(() => {\r\n if (!participantSearch.trim()) return users;\r\n return fuzzySearch(users, participantSearch, (user) => [\r\n user.name,\r\n user.email || '',\r\n ]);\r\n }, [users, participantSearch]);\r\n\r\n // Selection helpers\r\n const allScheduleTypesSelected =\r\n filteredScheduleTypes.length > 0 &&\r\n filteredScheduleTypes.every((type) => selectedScheduleTypeIds.includes(type.id));\r\n\r\n const allParticipantsSelected =\r\n filteredParticipants.length > 0 &&\r\n filteredParticipants.every((p) => selectedUserIds.includes(p.id));\r\n\r\n const activeFiltersCount = selectedScheduleTypeIds.length + selectedUserIds.length;\r\n\r\n // Toggle handlers\r\n const handleToggleScheduleType = (id: number, checked: boolean) => {\r\n const updated = checked\r\n ? [...selectedScheduleTypeIds, id]\r\n : selectedScheduleTypeIds.filter((sid) => sid !== id);\r\n onScheduleTypeChange(updated);\r\n };\r\n\r\n const handleToggleAllScheduleTypes = () => {\r\n if (allScheduleTypesSelected) {\r\n const visibleIds = new Set(filteredScheduleTypes.map((t) => t.id));\r\n onScheduleTypeChange(selectedScheduleTypeIds.filter((id) => !visibleIds.has(id)));\r\n } else {\r\n const newIds = new Set([\r\n ...selectedScheduleTypeIds,\r\n ...filteredScheduleTypes.map((t) => t.id),\r\n ]);\r\n onScheduleTypeChange(Array.from(newIds));\r\n }\r\n };\r\n\r\n const handleToggleParticipant = (id: string, checked: boolean) => {\r\n const updated = checked\r\n ? [...selectedUserIds, id]\r\n : selectedUserIds.filter((pid) => pid !== id);\r\n onUserChange(updated);\r\n };\r\n\r\n const handleToggleAllParticipants = () => {\r\n if (allParticipantsSelected) {\r\n const visibleIds = new Set(filteredParticipants.map((p) => p.id));\r\n onUserChange(selectedUserIds.filter((id) => !visibleIds.has(id)));\r\n } else {\r\n const newIds = new Set([\r\n ...selectedUserIds,\r\n ...filteredParticipants.map((p) => p.id),\r\n ]);\r\n onUserChange(Array.from(newIds));\r\n }\r\n };\r\n\r\n const handleClearAll = () => {\r\n onScheduleTypeChange([]);\r\n onUserChange([]);\r\n onClearAll?.();\r\n };\r\n\r\n // Get display name for schedule type\r\n const getDisplayName = (type: IScheduleType<TScheduleTypeData>) => {\r\n if (getScheduleTypeName) {\r\n return getScheduleTypeName(type);\r\n }\r\n return type.name;\r\n };\r\n\r\n // Get color for schedule type\r\n const getColor = (type: IScheduleType<TScheduleTypeData>) => {\r\n return type.colorHex || type.color || '#069AD7';\r\n };\r\n\r\n return (\r\n <div\r\n className={cn(\r\n 'flex min-w-72 max-w-72 flex-col rounded-lg border bg-white shadow-sm',\r\n className,\r\n )}\r\n >\r\n {/* Header */}\r\n <header className=\"flex items-start justify-between gap-2 px-4 pb-2 pt-4\">\r\n <div className=\"flex flex-col\">\r\n <h3 className=\"text-base font-semibold text-foreground\">{labels.title}</h3>\r\n <p className=\"text-xs text-muted-foreground\">{labels.subtitle}</p>\r\n </div>\r\n {activeFiltersCount > 0 && (\r\n <button\r\n type=\"button\"\r\n onClick={handleClearAll}\r\n className=\"flex h-auto items-center gap-1 rounded-md px-2 py-1 text-xs font-medium text-destructive transition-colors hover:bg-destructive/10\"\r\n >\r\n <XIcon className=\"h-3.5 w-3.5\" />\r\n {labels.clearAll}\r\n </button>\r\n )}\r\n </header>\r\n\r\n <div className=\"h-px w-full bg-border/60\" />\r\n\r\n {/* Schedule Types Section */}\r\n <section className=\"flex flex-col\">\r\n <div className=\"flex items-center justify-between px-4 py-3\">\r\n <h4 className=\"text-sm font-medium text-foreground\">{labels.scheduleTypes}</h4>\r\n <button\r\n type=\"button\"\r\n onClick={handleToggleAllScheduleTypes}\r\n className=\"text-xs font-medium text-primary transition-colors hover:text-primary/80\"\r\n >\r\n {allScheduleTypesSelected ? labels.unselectAll : labels.selectAll}\r\n </button>\r\n </div>\r\n\r\n {scheduleTypes.length > 6 && (\r\n <div className=\"px-4 pb-3\">\r\n <SearchInput\r\n value={scheduleTypeSearch}\r\n onChange={setScheduleTypeSearch}\r\n placeholder={labels.searchScheduleTypes}\r\n />\r\n </div>\r\n )}\r\n\r\n <div className=\"flex max-h-[220px] flex-col gap-2 overflow-y-auto px-4 pb-2 scrollbar-thin\">\r\n {scheduleTypesLoading\r\n ? // Loading skeletons\r\n Array.from({ length: 4 }).map((_, i) => (\r\n <div\r\n key={`skeleton-${i}`}\r\n className=\"flex animate-pulse items-center gap-2 rounded-md border border-border/60 bg-muted/40 p-2\"\r\n >\r\n <div className=\"h-5 w-5 rounded bg-muted-foreground/20\" />\r\n <div className=\"h-3 w-24 rounded bg-muted-foreground/20\" />\r\n </div>\r\n ))\r\n : filteredScheduleTypes.map((type) => {\r\n const isChecked = selectedScheduleTypeIds.includes(type.id);\r\n const color = getColor(type);\r\n\r\n return (\r\n <Checkbox\r\n key={type.id}\r\n checked={isChecked}\r\n onCheckedChange={(checked) =>\r\n handleToggleScheduleType(type.id, checked)\r\n }\r\n className={cn(\r\n 'relative flex w-full cursor-pointer items-center justify-between gap-3 rounded-md border border-border bg-white px-3 py-2 transition-colors hover:border-primary/50',\r\n isChecked && 'border-primary bg-primary/5',\r\n )}\r\n >\r\n <div className=\"flex items-center gap-2\">\r\n <span\r\n className={cn(\r\n 'flex h-4 w-4 items-center justify-center rounded border border-border text-xs transition-colors',\r\n isChecked &&\r\n 'border-primary bg-primary text-primary-foreground',\r\n )}\r\n >\r\n {isChecked && <CheckIcon className=\"h-3 w-3\" />}\r\n </span>\r\n <span className=\"text-sm font-medium text-foreground\">\r\n {getDisplayName(type)}\r\n </span>\r\n </div>\r\n <div\r\n className=\"h-4 w-4 rounded-full border\"\r\n style={{\r\n backgroundColor: color,\r\n borderColor: color,\r\n }}\r\n />\r\n </Checkbox>\r\n );\r\n })}\r\n\r\n {!scheduleTypesLoading && filteredScheduleTypes.length === 0 && (\r\n <p className=\"px-2 py-1 text-xs text-muted-foreground\">\r\n {labels.noScheduleTypes}\r\n </p>\r\n )}\r\n </div>\r\n </section>\r\n\r\n <div className=\"h-px w-full bg-border/60\" />\r\n\r\n {/* Participants Section */}\r\n <section className=\"flex flex-col\">\r\n <div className=\"flex items-center justify-between px-4 py-3\">\r\n <h4 className=\"text-sm font-medium text-foreground\">{labels.participants}</h4>\r\n <Checkbox\r\n checked={allParticipantsSelected}\r\n onCheckedChange={() => handleToggleAllParticipants()}\r\n className={cn(\r\n 'flex h-5 w-5 items-center justify-center rounded border border-border bg-white transition-colors hover:border-primary/50',\r\n allParticipantsSelected &&\r\n 'border-primary bg-primary text-primary-foreground',\r\n )}\r\n >\r\n {allParticipantsSelected && <CheckIcon className=\"h-3.5 w-3.5\" />}\r\n </Checkbox>\r\n </div>\r\n\r\n <div className=\"px-4 pb-3\">\r\n <SearchInput\r\n value={participantSearch}\r\n onChange={setParticipantSearch}\r\n placeholder={labels.searchParticipants}\r\n />\r\n </div>\r\n\r\n <div className=\"flex max-h-[400px] flex-col gap-2 overflow-y-auto px-4 pb-4 scrollbar-thin\">\r\n {usersLoading\r\n ? // Loading skeletons\r\n Array.from({ length: 4 }).map((_, i) => (\r\n <div\r\n key={`p-skeleton-${i}`}\r\n className=\"flex animate-pulse items-center gap-3 rounded-md border border-border/60 bg-muted/40 p-3\"\r\n >\r\n <div className=\"h-5 w-5 rounded bg-muted-foreground/20\" />\r\n <div className=\"h-10 w-10 rounded-full bg-muted-foreground/20\" />\r\n <div className=\"space-y-2\">\r\n <div className=\"h-3 w-24 rounded bg-muted-foreground/20\" />\r\n <div className=\"h-2 w-32 rounded bg-muted-foreground/10\" />\r\n </div>\r\n </div>\r\n ))\r\n : filteredParticipants.map((participant) => {\r\n const isChecked = selectedUserIds.includes(participant.id);\r\n\r\n return (\r\n <Checkbox\r\n key={participant.id}\r\n checked={isChecked}\r\n onCheckedChange={(checked) =>\r\n handleToggleParticipant(participant.id, checked)\r\n }\r\n className={cn(\r\n 'relative flex w-full cursor-pointer items-start gap-2 rounded-lg border border-border bg-white p-2 transition-colors hover:border-primary/50',\r\n isChecked && 'border-primary bg-zinc-50',\r\n )}\r\n >\r\n <span\r\n className={cn(\r\n 'flex h-4 w-4 flex-shrink-0 items-center justify-center rounded border border-border transition-colors',\r\n isChecked &&\r\n 'border-primary bg-primary text-primary-foreground',\r\n )}\r\n >\r\n {isChecked && <CheckIcon className=\"h-2.5 w-2.5\" />}\r\n </span>\r\n <div className=\"flex flex-1 items-start gap-2\">\r\n <Avatar\r\n src={participant.avatar ?? null}\r\n alt={participant.name}\r\n fallback={participant.name?.[0]?.toUpperCase() ?? '?'}\r\n className=\"h-10 w-10 rounded-lg\"\r\n />\r\n <div className=\"flex max-w-[140px] flex-col gap-0.5 overflow-hidden\">\r\n <span className=\"line-clamp-1 text-sm font-medium text-foreground\">\r\n {participant.name}\r\n </span>\r\n <span\r\n className=\"truncate text-[11px] text-muted-foreground\"\r\n title={participant.email}\r\n >\r\n {participant.email}\r\n </span>\r\n </div>\r\n </div>\r\n </Checkbox>\r\n );\r\n })}\r\n\r\n {!usersLoading && filteredParticipants.length === 0 && (\r\n <p className=\"px-4 text-xs text-muted-foreground\">{labels.noParticipants}</p>\r\n )}\r\n </div>\r\n </section>\r\n </div>\r\n );\r\n}\r\n\r\nexport default CalendarFilterSidebar;\r\n","/**\r\n * AgendaWidget - Compact Agenda List Component\r\n *\r\n * A mobile-first, compact agenda list component that can be embedded anywhere.\r\n * Unlike the full AgendaView, this widget:\r\n * - Doesn't require a CalendarProvider (can receive events directly)\r\n * - Has a more compact layout optimized for sidebars/dashboards\r\n * - Supports both standalone and context-aware modes\r\n * - Mobile-first design with responsive enhancements\r\n *\r\n * @example\r\n * ```tsx\r\n * // Standalone mode - provide events directly\r\n * <AgendaWidget events={myEvents} daysAhead={7} />\r\n *\r\n * // Context mode - uses CalendarProvider events\r\n * <CalendarProvider ...>\r\n * <AgendaWidget />\r\n * </CalendarProvider>\r\n * ```\r\n */\r\n\r\nimport { useMemo, type ReactNode } from 'react';\r\nimport { useOptionalCalendarContext } from '../../core/context/calendar-context';\r\nimport type { CalendarEvent } from '../../core/types';\r\nimport { formatDateISO, isToday, startOfDay } from '../../core/utils/date-utils';\r\nimport { cn } from '../../lib/utils';\r\n\r\n// ============================================================================\r\n// ICONS (inline SVGs to avoid lucide-react dependency)\r\n// ============================================================================\r\n\r\nfunction CalendarClockIcon({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={className}\r\n >\r\n <path d=\"M21 7.5V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h3.5\" />\r\n <path d=\"M16 2v4\" />\r\n <path d=\"M8 2v4\" />\r\n <path d=\"M3 10h5\" />\r\n <path d=\"M17.5 17.5 16 16.25V14\" />\r\n <circle cx=\"16\" cy=\"16\" r=\"6\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction ChevronRightIcon({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={className}\r\n >\r\n <path d=\"m9 18 6-6-6-6\" />\r\n </svg>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface AgendaWidgetProps<TData = Record<string, unknown>> {\r\n /** Events to display (optional - uses context if available) */\r\n events?: CalendarEvent<TData>[];\r\n /** Number of days ahead to show (default: 7) */\r\n daysAhead?: number;\r\n /** Maximum events per day to show (default: 3, set 0 for unlimited) */\r\n maxEventsPerDay?: number;\r\n /** Called when an event is clicked */\r\n onEventClick?: (event: CalendarEvent<TData>) => void;\r\n /** Called when \"View all\" or day header is clicked */\r\n onViewAll?: (date?: Date) => void;\r\n /** Additional CSS classes */\r\n className?: string;\r\n /** Custom empty state content */\r\n emptyState?: ReactNode;\r\n /** Widget title (default: \"Upcoming\") */\r\n title?: string;\r\n /** Show widget header (default: true) */\r\n showHeader?: boolean;\r\n /** Compact mode - even smaller for tight spaces */\r\n compact?: boolean;\r\n}\r\n\r\ninterface EventsByDate<TData = Record<string, unknown>> {\r\n date: Date;\r\n dateKey: string;\r\n events: CalendarEvent<TData>[];\r\n hasMore: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// HELPERS\r\n// ============================================================================\r\n\r\n/**\r\n * Check if date is tomorrow\r\n */\r\nfunction isTomorrow(date: Date): boolean {\r\n const tomorrow = new Date();\r\n tomorrow.setDate(tomorrow.getDate() + 1);\r\n return (\r\n date.getFullYear() === tomorrow.getFullYear() &&\r\n date.getMonth() === tomorrow.getMonth() &&\r\n date.getDate() === tomorrow.getDate()\r\n );\r\n}\r\n\r\n/**\r\n * Format time as \"h:mm a\" (e.g., \"9:30 AM\")\r\n */\r\nfunction formatTime12h(date: Date): string {\r\n const hours = date.getHours();\r\n const minutes = date.getMinutes();\r\n const period = hours >= 12 ? 'PM' : 'AM';\r\n const hour12 = hours % 12 || 12;\r\n return `${hour12}:${minutes.toString().padStart(2, '0')} ${period}`;\r\n}\r\n\r\n/**\r\n * Format date header as \"EEEE, MMM d\" (e.g., \"Monday, Jan 15\")\r\n */\r\nfunction formatDateHeader(date: Date): string {\r\n const formatter = new Intl.DateTimeFormat('en-US', {\r\n weekday: 'long',\r\n month: 'short',\r\n day: 'numeric',\r\n });\r\n return formatter.format(date);\r\n}\r\n\r\nfunction formatEventTime<TData>(event: CalendarEvent<TData>): string {\r\n const startTime = formatTime12h(event.startDate);\r\n const endTime = formatTime12h(event.endDate);\r\n return `${startTime} - ${endTime}`;\r\n}\r\n\r\nfunction formatDateHeaderLabel(date: Date): string {\r\n if (isToday(date)) return 'Today';\r\n if (isTomorrow(date)) return 'Tomorrow';\r\n return formatDateHeader(date);\r\n}\r\n\r\nfunction groupAndLimitEvents<TData>(\r\n events: CalendarEvent<TData>[],\r\n maxPerDay: number,\r\n): EventsByDate<TData>[] {\r\n // Group events by date\r\n const grouped = new Map<string, CalendarEvent<TData>[]>();\r\n\r\n for (const event of events) {\r\n const dateKey = formatDateISO(event.startDate);\r\n const existing = grouped.get(dateKey) ?? [];\r\n existing.push(event);\r\n grouped.set(dateKey, existing);\r\n }\r\n\r\n // Convert to array and limit per day\r\n return Array.from(grouped.entries())\r\n .map(([dateKey, dayEvents]) => {\r\n // Sort events by start time\r\n const sortedEvents = [...dayEvents].sort(\r\n (a, b) => a.startDate.getTime() - b.startDate.getTime(),\r\n );\r\n\r\n const limited = maxPerDay > 0 ? sortedEvents.slice(0, maxPerDay) : sortedEvents;\r\n\r\n return {\r\n date: new Date(dateKey),\r\n dateKey,\r\n events: limited,\r\n hasMore: maxPerDay > 0 && sortedEvents.length > maxPerDay,\r\n };\r\n })\r\n .sort((a, b) => a.date.getTime() - b.date.getTime());\r\n}\r\n\r\n// ============================================================================\r\n// WIDGET EVENT ITEM\r\n// ============================================================================\r\n\r\ninterface WidgetEventItemProps<TData = Record<string, unknown>> {\r\n event: CalendarEvent<TData>;\r\n onClick?: ((event: CalendarEvent<TData>) => void) | undefined;\r\n compact?: boolean | undefined;\r\n}\r\n\r\nfunction WidgetEventItem<TData>({ event, onClick, compact }: WidgetEventItemProps<TData>) {\r\n return (\r\n <button\r\n type=\"button\"\r\n onClick={() => onClick?.(event)}\r\n className={cn(\r\n 'w-full text-left rounded-lg transition-colors',\r\n 'hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\r\n 'flex items-start gap-3',\r\n compact ? 'p-2' : 'p-3',\r\n )}\r\n >\r\n {/* Color indicator */}\r\n <div\r\n className={cn('shrink-0 rounded-full mt-1', compact ? 'size-2' : 'size-2.5')}\r\n style={{ backgroundColor: event.color ?? '#3b82f6' }}\r\n />\r\n\r\n {/* Event content */}\r\n <div className=\"min-w-0 flex-1\">\r\n <p className={cn('font-medium truncate', compact ? 'text-xs' : 'text-sm')}>\r\n {event.title}\r\n </p>\r\n <p\r\n className={cn(\r\n 'text-muted-foreground truncate',\r\n compact ? 'text-[10px]' : 'text-xs',\r\n )}\r\n >\r\n {formatEventTime(event)}\r\n </p>\r\n </div>\r\n\r\n {/* Chevron for click affordance */}\r\n {onClick && (\r\n <ChevronRightIcon\r\n className={cn(\r\n 'shrink-0 text-muted-foreground/50',\r\n compact ? 'size-3' : 'size-4',\r\n )}\r\n />\r\n )}\r\n </button>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// WIDGET DATE GROUP\r\n// ============================================================================\r\n\r\ninterface WidgetDateGroupProps<TData = Record<string, unknown>> {\r\n group: EventsByDate<TData>;\r\n onEventClick?: ((event: CalendarEvent<TData>) => void) | undefined;\r\n onViewMore?: ((date: Date) => void) | undefined;\r\n compact?: boolean | undefined;\r\n}\r\n\r\nfunction WidgetDateGroup<TData>({\r\n group,\r\n onEventClick,\r\n onViewMore,\r\n compact,\r\n}: WidgetDateGroupProps<TData>) {\r\n return (\r\n <div className=\"space-y-1\">\r\n {/* Date header */}\r\n <div\r\n className={cn(\r\n 'flex items-center justify-between px-2',\r\n compact ? 'py-1' : 'py-1.5',\r\n )}\r\n >\r\n <h3\r\n className={cn(\r\n 'font-semibold',\r\n compact ? 'text-xs' : 'text-sm',\r\n isToday(group.date) && 'text-primary',\r\n )}\r\n >\r\n {formatDateHeaderLabel(group.date)}\r\n </h3>\r\n\r\n {group.hasMore && onViewMore && (\r\n <button\r\n type=\"button\"\r\n onClick={() => onViewMore(group.date)}\r\n className={cn(\r\n 'text-primary hover:underline',\r\n compact ? 'text-[10px]' : 'text-xs',\r\n )}\r\n >\r\n +more\r\n </button>\r\n )}\r\n </div>\r\n\r\n {/* Events */}\r\n <div className=\"space-y-0.5\">\r\n {group.events.map((event) => (\r\n <WidgetEventItem\r\n key={event.id}\r\n event={event}\r\n onClick={onEventClick}\r\n compact={compact}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// MAIN COMPONENT\r\n// ============================================================================\r\n\r\nexport function AgendaWidget<TData = Record<string, unknown>>({\r\n events: externalEvents,\r\n daysAhead = 7,\r\n maxEventsPerDay = 3,\r\n onEventClick,\r\n onViewAll,\r\n className,\r\n emptyState,\r\n title = 'Upcoming',\r\n showHeader = true,\r\n compact = false,\r\n}: AgendaWidgetProps<TData>) {\r\n // Try to get events from context if not provided\r\n const calendarContext = useOptionalCalendarContext<TData>();\r\n const contextEvents = calendarContext?.filteredEvents;\r\n const selectedDate = calendarContext?.currentDate ?? new Date();\r\n\r\n const allEvents = externalEvents ?? contextEvents ?? [];\r\n\r\n // Filter events for the upcoming period\r\n const upcomingEvents = useMemo(() => {\r\n const baseDate = startOfDay(selectedDate);\r\n const endDate = new Date(baseDate);\r\n endDate.setDate(endDate.getDate() + daysAhead);\r\n\r\n return allEvents.filter((event) => {\r\n return event.endDate >= baseDate && event.startDate < endDate;\r\n });\r\n }, [allEvents, daysAhead, selectedDate]);\r\n\r\n // Group and limit events\r\n const groupedEvents = useMemo(\r\n () => groupAndLimitEvents(upcomingEvents, maxEventsPerDay),\r\n [upcomingEvents, maxEventsPerDay],\r\n );\r\n\r\n const totalEvents = upcomingEvents.length;\r\n\r\n // Empty state\r\n if (groupedEvents.length === 0) {\r\n return (\r\n <div className={cn('rounded-lg border bg-card', className)}>\r\n {showHeader && (\r\n <div\r\n className={cn(\r\n 'border-b px-4 flex items-center justify-between',\r\n compact ? 'py-2' : 'py-3',\r\n )}\r\n >\r\n <h2 className={cn('font-semibold', compact ? 'text-sm' : 'text-base')}>\r\n {title}\r\n </h2>\r\n </div>\r\n )}\r\n <div\r\n className={cn(\r\n 'flex flex-col items-center justify-center text-center',\r\n compact ? 'py-6 px-4' : 'py-10 px-6',\r\n )}\r\n >\r\n {emptyState ?? (\r\n <>\r\n <CalendarClockIcon\r\n className={cn(\r\n 'text-muted-foreground/50 mb-2',\r\n compact ? 'size-8' : 'size-10',\r\n )}\r\n />\r\n <p\r\n className={cn(\r\n 'text-muted-foreground',\r\n compact ? 'text-xs' : 'text-sm',\r\n )}\r\n >\r\n No upcoming events\r\n </p>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className={cn('rounded-lg border bg-card overflow-hidden', className)}>\r\n {/* Header */}\r\n {showHeader && (\r\n <div\r\n className={cn(\r\n 'border-b px-4 flex items-center justify-between',\r\n compact ? 'py-2' : 'py-3',\r\n )}\r\n >\r\n <div className=\"flex items-center gap-2\">\r\n <h2 className={cn('font-semibold', compact ? 'text-sm' : 'text-base')}>\r\n {title}\r\n </h2>\r\n <span\r\n className={cn(\r\n 'text-muted-foreground bg-muted rounded-full px-2',\r\n compact ? 'text-[10px] py-0' : 'text-xs py-0.5',\r\n )}\r\n >\r\n {totalEvents}\r\n </span>\r\n </div>\r\n\r\n {onViewAll && (\r\n <button\r\n type=\"button\"\r\n onClick={() => onViewAll()}\r\n className={cn(\r\n 'text-primary hover:underline flex items-center gap-0.5',\r\n compact ? 'text-xs' : 'text-sm',\r\n )}\r\n >\r\n View all\r\n <ChevronRightIcon className=\"size-3\" />\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Event groups */}\r\n <div\r\n className={cn(\r\n 'divide-y overflow-auto',\r\n compact ? 'p-2 max-h-[280px]' : 'p-3 max-h-[400px]',\r\n )}\r\n >\r\n {groupedEvents.map((group) => (\r\n <WidgetDateGroup\r\n key={group.dateKey}\r\n group={group}\r\n onEventClick={onEventClick}\r\n onViewMore={onViewAll ? (date) => onViewAll(date) : undefined}\r\n compact={compact}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default AgendaWidget;\r\n","/**\r\n * Agenda Dropdown Component\r\n *\r\n * A notification bell-style dropdown for quick agenda access.\r\n * Shows today's event count and upcoming events in a popover.\r\n * Works standalone without CalendarProvider.\r\n *\r\n * Usage:\r\n * ```tsx\r\n * <AgendaDropdown\r\n * events={events}\r\n * onEventClick={(event) => console.log(event)}\r\n * onNavigateToAgenda={() => router.push('/agenda')}\r\n * />\r\n * ```\r\n */\r\n\r\nimport { useMemo, useState } from 'react';\r\nimport { cn } from '../../lib/utils';\r\nimport { addDays, endOfDay, isToday, startOfDay } from '../../core/utils/date-utils';\r\nimport type { CalendarEvent } from '../../core/types';\r\nimport { Badge } from '../ui/badge';\r\nimport { Popover, PopoverContent, PopoverTrigger } from '../ui/popover';\r\n\r\n// ============================================================================\r\n// ICONS (Inline SVGs to avoid external dependencies)\r\n// ============================================================================\r\n\r\nfunction CalendarDaysIcon({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={1.8}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={className}\r\n >\r\n <path d=\"M8 2v4\" />\r\n <path d=\"M16 2v4\" />\r\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"4\" rx=\"2\" />\r\n <path d=\"M3 10h18\" />\r\n <path d=\"M8 14h.01\" />\r\n <path d=\"M12 14h.01\" />\r\n <path d=\"M16 14h.01\" />\r\n <path d=\"M8 18h.01\" />\r\n <path d=\"M12 18h.01\" />\r\n <path d=\"M16 18h.01\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction CalendarClockIcon({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={2}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={className}\r\n >\r\n <path d=\"M21 7.5V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h3.5\" />\r\n <path d=\"M16 2v4\" />\r\n <path d=\"M8 2v4\" />\r\n <path d=\"M3 10h5\" />\r\n <path d=\"M17.5 17.5 16 16.3V14\" />\r\n <circle cx=\"16\" cy=\"16\" r=\"6\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction ChevronRightIcon({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={2}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={className}\r\n >\r\n <path d=\"m9 18 6-6-6-6\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction ExternalLinkIcon({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={2}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={className}\r\n >\r\n <path d=\"M15 3h6v6\" />\r\n <path d=\"M10 14 21 3\" />\r\n <path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" />\r\n </svg>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface AgendaDropdownProps<TData = Record<string, unknown>> {\r\n /** Events to display */\r\n events: CalendarEvent<TData>[];\r\n /** Loading state */\r\n isLoading?: boolean;\r\n /** Additional CSS classes */\r\n className?: string;\r\n /** Number of days ahead to show (default: 7) */\r\n daysAhead?: number;\r\n /** Maximum events per day (default: 3) */\r\n maxEventsPerDay?: number;\r\n /** Callback when an event is clicked */\r\n onEventClick?: (event: CalendarEvent<TData>) => void;\r\n /** Callback to navigate to full agenda view */\r\n onNavigateToAgenda?: () => void;\r\n}\r\n\r\ninterface EventsByDate<TData = Record<string, unknown>> {\r\n date: Date;\r\n dateKey: string;\r\n events: CalendarEvent<TData>[];\r\n hasMore: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// HELPERS\r\n// ============================================================================\r\n\r\n/**\r\n * Format a date to YYYY-MM-DD string\r\n */\r\nfunction formatDateKey(date: Date): string {\r\n const year = date.getFullYear();\r\n const month = String(date.getMonth() + 1).padStart(2, '0');\r\n const day = String(date.getDate()).padStart(2, '0');\r\n return `${year}-${month}-${day}`;\r\n}\r\n\r\n/**\r\n * Format time to 12-hour format (e.g., \"9:30 AM\")\r\n */\r\nfunction formatTime(date: Date): string {\r\n const hours = date.getHours();\r\n const minutes = date.getMinutes();\r\n const ampm = hours >= 12 ? 'PM' : 'AM';\r\n const hour12 = hours % 12 || 12;\r\n const minuteStr = String(minutes).padStart(2, '0');\r\n return `${hour12}:${minuteStr} ${ampm}`;\r\n}\r\n\r\n/**\r\n * Format event time range\r\n */\r\nfunction formatEventTime<TData>(event: CalendarEvent<TData>): string {\r\n const startTime = formatTime(event.startDate);\r\n const endTime = formatTime(event.endDate);\r\n return `${startTime} - ${endTime}`;\r\n}\r\n\r\n/**\r\n * Check if a date is tomorrow\r\n */\r\nfunction isTomorrow(date: Date): boolean {\r\n const tomorrow = addDays(new Date(), 1);\r\n return (\r\n date.getFullYear() === tomorrow.getFullYear() &&\r\n date.getMonth() === tomorrow.getMonth() &&\r\n date.getDate() === tomorrow.getDate()\r\n );\r\n}\r\n\r\n/**\r\n * Format date header (Today, Tomorrow, or weekday + date)\r\n */\r\nfunction formatDateHeader(date: Date): string {\r\n if (isToday(date)) return 'Today';\r\n if (isTomorrow(date)) return 'Tomorrow';\r\n\r\n const weekdays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\r\n const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\r\n\r\n const weekday = weekdays[date.getDay()];\r\n const month = months[date.getMonth()];\r\n const day = date.getDate();\r\n\r\n return `${weekday}, ${month} ${day}`;\r\n}\r\n\r\n/**\r\n * Group events by date and limit per day\r\n */\r\nfunction groupAndLimitEvents<TData>(\r\n events: CalendarEvent<TData>[],\r\n maxPerDay: number,\r\n): EventsByDate<TData>[] {\r\n const grouped = new Map<string, CalendarEvent<TData>[]>();\r\n\r\n for (const event of events) {\r\n const dateKey = formatDateKey(event.startDate);\r\n const existing = grouped.get(dateKey) ?? [];\r\n existing.push(event);\r\n grouped.set(dateKey, existing);\r\n }\r\n\r\n return Array.from(grouped.entries())\r\n .map(([dateKey, dayEvents]) => {\r\n const sortedEvents = [...dayEvents].sort(\r\n (a, b) => a.startDate.getTime() - b.startDate.getTime(),\r\n );\r\n\r\n const limited = maxPerDay > 0 ? sortedEvents.slice(0, maxPerDay) : sortedEvents;\r\n\r\n return {\r\n date: new Date(dateKey),\r\n dateKey,\r\n events: limited,\r\n hasMore: maxPerDay > 0 && sortedEvents.length > maxPerDay,\r\n };\r\n })\r\n .sort((a, b) => a.date.getTime() - b.date.getTime());\r\n}\r\n\r\n/**\r\n * Count events happening today\r\n */\r\nfunction countTodayEvents<TData>(events: CalendarEvent<TData>[]): number {\r\n const todayStart = startOfDay(new Date());\r\n const todayEnd = endOfDay(new Date());\r\n\r\n return events.filter(\r\n (event) => event.startDate >= todayStart && event.startDate <= todayEnd,\r\n ).length;\r\n}\r\n\r\n// ============================================================================\r\n// SKELETON COMPONENT\r\n// ============================================================================\r\n\r\nfunction Skeleton({ className }: { className?: string }) {\r\n return <div className={cn('animate-pulse rounded-md bg-muted', className)} />;\r\n}\r\n\r\n// ============================================================================\r\n// EVENT ITEM\r\n// ============================================================================\r\n\r\ninterface DropdownEventItemProps<TData = Record<string, unknown>> {\r\n event: CalendarEvent<TData>;\r\n onClick?: ((event: CalendarEvent<TData>) => void) | undefined;\r\n}\r\n\r\nfunction DropdownEventItem<TData>({ event, onClick }: DropdownEventItemProps<TData>) {\r\n return (\r\n <button\r\n type=\"button\"\r\n onClick={() => onClick?.(event)}\r\n className={cn(\r\n 'w-full text-left rounded-lg transition-colors',\r\n 'hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\r\n 'flex items-start gap-3 p-2',\r\n )}\r\n >\r\n {/* Color indicator */}\r\n <div\r\n className=\"shrink-0 rounded-full mt-1.5 size-2\"\r\n style={{ backgroundColor: event.color ?? '#3b82f6' }}\r\n />\r\n\r\n {/* Event content */}\r\n <div className=\"min-w-0 flex-1\">\r\n <p className=\"text-sm font-medium truncate\">{event.title}</p>\r\n <p className=\"text-xs text-muted-foreground truncate\">{formatEventTime(event)}</p>\r\n </div>\r\n\r\n {/* Chevron */}\r\n {onClick && (\r\n <ChevronRightIcon className=\"shrink-0 size-4 text-muted-foreground/50 mt-1\" />\r\n )}\r\n </button>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// DATE GROUP\r\n// ============================================================================\r\n\r\ninterface DropdownDateGroupProps<TData = Record<string, unknown>> {\r\n group: EventsByDate<TData>;\r\n onEventClick?: (event: CalendarEvent<TData>) => void;\r\n}\r\n\r\nfunction DropdownDateGroup<TData>({ group, onEventClick }: DropdownDateGroupProps<TData>) {\r\n return (\r\n <div className=\"space-y-1\">\r\n {/* Date header */}\r\n <div className=\"flex items-center justify-between px-2 py-1.5\">\r\n <h3\r\n className={cn(\r\n 'text-xs font-semibold',\r\n isToday(group.date) && 'text-primary',\r\n )}\r\n >\r\n {formatDateHeader(group.date)}\r\n </h3>\r\n\r\n {group.hasMore && (\r\n <span className=\"text-[10px] text-muted-foreground\">\r\n +{group.events.length} more\r\n </span>\r\n )}\r\n </div>\r\n\r\n {/* Events */}\r\n <div className=\"space-y-0.5\">\r\n {group.events.map((event) => (\r\n <DropdownEventItem key={event.id} event={event} onClick={onEventClick} />\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// MAIN COMPONENT\r\n// ============================================================================\r\n\r\nexport function AgendaDropdown<TData = Record<string, unknown>>({\r\n events,\r\n isLoading = false,\r\n className,\r\n daysAhead = 7,\r\n maxEventsPerDay = 3,\r\n onEventClick,\r\n onNavigateToAgenda,\r\n}: AgendaDropdownProps<TData>) {\r\n const [isOpen, setIsOpen] = useState(false);\r\n\r\n // Filter events for the upcoming period\r\n const upcomingEvents = useMemo(() => {\r\n const baseDate = startOfDay(new Date());\r\n const endDate = addDays(baseDate, daysAhead);\r\n\r\n return events.filter((event) => {\r\n return event.endDate >= baseDate && event.startDate < endDate;\r\n });\r\n }, [events, daysAhead]);\r\n\r\n // Group events\r\n const groupedEvents = useMemo(\r\n () => groupAndLimitEvents(upcomingEvents, maxEventsPerDay),\r\n [upcomingEvents, maxEventsPerDay],\r\n );\r\n\r\n // Count today's events for badge\r\n const todayCount = useMemo(() => countTodayEvents(events), [events]);\r\n\r\n const handleEventClick = (event: CalendarEvent<TData>) => {\r\n setIsOpen(false);\r\n onEventClick?.(event);\r\n };\r\n\r\n const handleNavigateClick = () => {\r\n setIsOpen(false);\r\n onNavigateToAgenda?.();\r\n };\r\n\r\n return (\r\n <Popover open={isOpen} onOpenChange={setIsOpen}>\r\n <PopoverTrigger\r\n className={cn(\r\n 'relative rounded-xl hover:text-zinc-700 hover:!bg-zinc-300 !bg-zinc-200 text-zinc-600 shadow-none !px-2.5 p-2 max-h-10',\r\n className,\r\n )}\r\n >\r\n <CalendarDaysIcon className=\"h-4 w-4\" />\r\n {todayCount > 0 && (\r\n <Badge\r\n variant=\"destructive\"\r\n className=\"absolute -right-4 -top-4 m-3 flex h-5 w-5 items-center justify-center rounded-full bg-primary p-0 text-[10px] font-medium hover:bg-primary\"\r\n >\r\n {todayCount > 99 ? '99+' : todayCount}\r\n </Badge>\r\n )}\r\n </PopoverTrigger>\r\n\r\n <PopoverContent className=\"w-80 rounded-xl p-0\" align=\"end\" side=\"bottom\" sideOffset={8}>\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between border-b p-4\">\r\n <div>\r\n <h3 className=\"text-sm font-semibold\">Upcoming</h3>\r\n <p className=\"text-xs text-muted-foreground\">\r\n {todayCount > 0\r\n ? `${todayCount} event${todayCount > 1 ? 's' : ''} today`\r\n : 'No events today'}\r\n </p>\r\n </div>\r\n {onNavigateToAgenda && (\r\n <button\r\n type=\"button\"\r\n onClick={handleNavigateClick}\r\n className=\"text-xs text-primary hover:underline flex items-center gap-1\"\r\n >\r\n View all\r\n <ExternalLinkIcon className=\"size-3\" />\r\n </button>\r\n )}\r\n </div>\r\n\r\n {/* Content */}\r\n <div className=\"max-h-80 overflow-y-auto p-2\">\r\n {isLoading ? (\r\n <div className=\"space-y-2 p-2\">\r\n {Array.from({ length: 3 }).map((_, i) => (\r\n <div key={i} className=\"flex space-x-3\">\r\n <Skeleton className=\"h-2 w-2 rounded-full mt-2\" />\r\n <div className=\"flex-1 space-y-2\">\r\n <Skeleton className=\"h-4 w-full\" />\r\n <Skeleton className=\"h-3 w-3/4\" />\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n ) : groupedEvents.length === 0 ? (\r\n <div className=\"flex flex-col items-center justify-center py-8 text-center\">\r\n <CalendarClockIcon className=\"mb-2 h-8 w-8 text-muted-foreground/50\" />\r\n <p className=\"text-sm text-muted-foreground\">No upcoming events</p>\r\n <p className=\"text-xs text-muted-foreground/70\">\r\n Your schedule is clear for the next {daysAhead} days\r\n </p>\r\n </div>\r\n ) : (\r\n <div className=\"space-y-3 divide-y\">\r\n {groupedEvents.map((group) => (\r\n <DropdownDateGroup\r\n key={group.dateKey}\r\n group={group}\r\n onEventClick={handleEventClick}\r\n />\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n </PopoverContent>\r\n </Popover>\r\n );\r\n}\r\n\r\nexport default AgendaDropdown;\r\n"],"names":["PlaceholderView","view","className","jsx","jsxs","CalendarContent","Calendar","props","events","resources","scheduleTypes","initialView","initialDate","initialFilters","preferences","locale","_slots","_renderEvent","onViewChange","onDateChange","onEventClick","onSlotSelect","onFiltersChange","children","existingContext","useOptionalCalendarContext","calendar","useCalendar","CalendarProvider","WEEKDAY_LABELS","MONTH_NAMES","getEventDotStyle","event","hexColor","DayCell","day","date","isCurrentMonth","onDayClick","today","isToday","maxIndicators","eventCount","cn","Fragment","MiniMonth","onMonthClick","cells","useMemo","generateMonthGrid","label","i","cell","index","dayEvents","getEventsForDay","YearView","year","months","getYearMonths","monthDate","EVENT_HEIGHT","EVENT_GAP","MIN_ROW_HEIGHT","ROW_PADDING","MIN_HOUR_COLUMN_WIDTH","USER_COLUMN_WIDTH","MIN_EVENT_CARD_WIDTH","MAX_SINGLE_COL_EVENTS_BEFORE_EXPAND","DEFAULT_START_HOUR","DEFAULT_END_HOUR","getInitials","name","n","generateDateColumns","startDate","numDays","dates","generateHourColumns","startHour","endHour","columns","dayIndex","hour","formatHour","formatDayHeader","calculateEventStacks","sorted","a","b","result","stacks","item","stackIndex","Avatar","src","alt","fallback","DEFAULT_DAYS_TO_SHOW","TimelineView","daysToShow","users","selectedDateProp","_onDateChange","visibleHours","getEventUserId","renderPopover","scrollRef","useRef","selectedDate","isHourMode","hoursPerDay","viewStartDate","dayOfWeek","diff","dateColumns","hourColumns","getUserIdFromEvent","data","effectiveUsers","userMap","user","participant","userRows","rows","eventsByUser","userId","positionEventsForUser","userEvents","rawPositioned","eventStartHour","eventEndHour","dayIdx","dayDate","dayStart","startOfDay","dayEnd","endOfDay","startHourInDay","endHourInDay","startCol","endCol","positionedEvents","maxStack","max","e","unassignedEvents","row","singleColEventCounts","counts","pe","currentCount","columnWidths","totalColumns","baseMinWidth","widths","col","singleColCount","getRowHeight","totalWidth","sum","w","columnPositions","positions","dayStartCol","dayWidth","idx","isFirstOfDay","colWidth","rowHeight","left","endPos","startPos","width","top","EventCard","getSelectionMode","InnerCalendar","onSlotClick","onAddEvent","showHeader","minSelectionMinutes","showMoreEventsInPopover","settingsContent","filterContent","setView","setSelectedDate","slotDuration","filteredEvents","contextVisibleHours","workingHours","badgeVariant","useInnoCalendar","selectionMode","handleSlotSelect","useCallback","selection","handleDayClick","handleMonthClick","handleEventClick","renderView","viewEvents","viewEventClick","viewRenderPopover","DayView","WeekView","MonthView","AgendaView","SlotSelectionProvider","CalendarHeader","prev","next","InnoCalendar","initialSelectedUserId","initialScheduleTypeIds","initialParticipantIds","initialWorkingHoursView","initialSearchQuery","preferencesConfig","onEventDrop","DragDropProvider","InnoCalendarProvider","Select","forwardRef","ref","Label","PencilIcon","TrashIcon","XIcon","BanIcon","CheckIcon","CheckCircleIcon","ChevronDownIcon","UsersIcon","MapPinIcon","CalendarIcon","FileTextIcon","LoaderIcon","DEFAULT_LABELS","IconButton","onClick","variant","Tooltip","TooltipTrigger","TooltipContent","initials","isClient","imgError","setImgError","useState","ParticipantRow","isEventCanceled","labels","isOrganizer","confirmStatus","isConfirmed","isDeclined","avatar","showCanceled","SimpleDialog","open","onOpenChange","title","useEffect","handleKeyDown","AlertDialog","description","cancelLabel","confirmLabel","onConfirm","isLoading","Button","defaultFormatDate","_format","defaultFormatTimeRange","start","end","timeOptions","formatCanceledDate","useMediaQuery","query","matches","setMatches","mediaQuery","handler","EventPopoverContentInner","onClose","onEdit","onDelete","onCancel","onAccept","onDecline","onConfirmMeeting","canEdit","canDelete","canCancel","isCurrentUserParticipant","isCurrentUserClient","currentUserAcceptStatus","isAcceptLoading","isDeclineLoading","isConfirmLoading","isDeleteLoading","renderParticipant","renderHeaderActions","renderCancelReason","renderDeleteConfirmation","formatDate","formatTimeRange","showDeleteConfirm","setShowDeleteConfirm","isEditable","isRecurring","participantDetails","participantNames","hasParticipantDetails","hasCurrentUserAccepted","hasCurrentUserDeclined","showRsvpButtons","confirmedCount","p","totalParticipants","eventColor","formatDateRange","getTimeRange","handleEdit","handleCancel","handleDelete","confirmDelete","TooltipProvider","fallbackParticipant","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuItem","EventPopover","customLabels","isDesktop","handleClose","contentProps","Popover","PopoverTrigger","PopoverContent","InfoIcon","LockIcon","SLOT_OPTIONS","SlotDurationSetting","value","onChange","isLocked","mergedLabels","handleChange","opt","generateHourOptions","_","VisibleHoursSetting","hourOptions","handleFromChange","newStartHour","handleToChange","newEndHour","BADGE_OPTIONS","BadgeVariantSetting","getOptionLabel","DAYS_ORDER","DEFAULT_DAY_LABELS","DayRow","dayLabel","config","disabled","handleToggle","newFrom","newTo","WorkingHoursSetting","handleDayChange","DEFAULT_WEEK_WORKING_HOURS","UserFilter","allLabel","TagIcon","ScheduleTypeFilter","selectedType","st","type","SearchIcon","Checkbox","checked","onCheckedChange","hasError","setHasError","SearchInput","placeholder","fuzzySearch","items","getSearchableStrings","_threshold","lowerQuery","str","defaultLabels","CalendarFilterSidebar","selectedScheduleTypeIds","onScheduleTypeChange","selectedUserIds","onUserChange","onClearAll","scheduleTypesLoading","usersLoading","getScheduleTypeName","scheduleTypeSearch","setScheduleTypeSearch","participantSearch","setParticipantSearch","filteredScheduleTypes","filteredParticipants","allScheduleTypesSelected","allParticipantsSelected","activeFiltersCount","handleToggleScheduleType","id","updated","sid","handleToggleAllScheduleTypes","visibleIds","t","newIds","handleToggleParticipant","pid","handleToggleAllParticipants","handleClearAll","getDisplayName","getColor","isChecked","color","CalendarClockIcon","ChevronRightIcon","isTomorrow","tomorrow","formatTime12h","hours","minutes","period","formatDateHeader","formatEventTime","startTime","endTime","formatDateHeaderLabel","groupAndLimitEvents","maxPerDay","grouped","dateKey","formatDateISO","existing","sortedEvents","limited","WidgetEventItem","compact","WidgetDateGroup","group","onViewMore","AgendaWidget","externalEvents","daysAhead","maxEventsPerDay","onViewAll","emptyState","calendarContext","contextEvents","allEvents","upcomingEvents","baseDate","endDate","groupedEvents","totalEvents","CalendarDaysIcon","ExternalLinkIcon","formatDateKey","month","formatTime","ampm","hour12","minuteStr","addDays","weekdays","weekday","countTodayEvents","todayStart","todayEnd","Skeleton","DropdownEventItem","DropdownDateGroup","AgendaDropdown","onNavigateToAgenda","isOpen","setIsOpen","todayCount","handleNavigateClick","Badge"],"mappings":"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"}
|