@innosolutions/inno-calendar 1.0.39 → 1.0.41
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-widget-KlPk6TpL.cjs → agenda-widget-B5Sgvvry.cjs} +2 -2
- package/dist/{agenda-widget-KlPk6TpL.cjs.map → agenda-widget-B5Sgvvry.cjs.map} +1 -1
- package/dist/{agenda-widget-Yj5oCSdd.js → agenda-widget-C5uR9Raa.js} +2 -2
- package/dist/{agenda-widget-Yj5oCSdd.js.map → agenda-widget-C5uR9Raa.js.map} +1 -1
- package/dist/components/index.cjs +1 -1
- package/dist/components/index.mjs +2 -2
- package/dist/components/primitives/index.d.ts +1 -0
- package/dist/components/primitives/index.d.ts.map +1 -1
- package/dist/components/primitives/multi-day-banner.d.ts +17 -3
- package/dist/components/primitives/multi-day-banner.d.ts.map +1 -1
- package/dist/components/primitives/week-all-day-row.d.ts +40 -0
- package/dist/components/primitives/week-all-day-row.d.ts.map +1 -0
- package/dist/components/views/day-view.d.ts.map +1 -1
- package/dist/components/views/week-view.d.ts.map +1 -1
- package/dist/core/utils/date-utils.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-BqhSHRk0.cjs → tailwind-calendar-B2vvMCsL.cjs} +2 -2
- package/dist/{tailwind-calendar-BqhSHRk0.cjs.map → tailwind-calendar-B2vvMCsL.cjs.map} +1 -1
- package/dist/{tailwind-calendar-BvWm9ry9.js → tailwind-calendar-C1_6GoL0.js} +2 -2
- package/dist/{tailwind-calendar-BvWm9ry9.js.map → tailwind-calendar-C1_6GoL0.js.map} +1 -1
- package/dist/utils.cjs +1 -1
- package/dist/utils.cjs.map +1 -1
- package/dist/utils.mjs +12 -11
- package/dist/utils.mjs.map +1 -1
- package/dist/week-view-DBsCYSce.cjs +11 -0
- package/dist/week-view-DBsCYSce.cjs.map +1 -0
- package/dist/{week-view-BGthazCB.js → week-view-Dh-gHd0m.js} +1486 -1189
- package/dist/week-view-Dh-gHd0m.js.map +1 -0
- package/package.json +1 -1
- package/dist/week-view-BGthazCB.js.map +0 -1
- package/dist/week-view-DOvr2VIq.cjs +0 -11
- package/dist/week-view-DOvr2VIq.cjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"week-view-Dh-gHd0m.js","sources":["../src/components/ui/popover.tsx","../src/components/ui/tooltip.tsx","../src/components/event/event-card.tsx","../node_modules/class-variance-authority/dist/index.mjs","../src/components/ui/button.tsx","../node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.js","../node_modules/lucide-react/dist/esm/shared/src/utils/toKebabCase.js","../node_modules/lucide-react/dist/esm/shared/src/utils/toCamelCase.js","../node_modules/lucide-react/dist/esm/shared/src/utils/toPascalCase.js","../node_modules/lucide-react/dist/esm/defaultAttributes.js","../node_modules/lucide-react/dist/esm/shared/src/utils/hasA11yProp.js","../node_modules/lucide-react/dist/esm/Icon.js","../node_modules/lucide-react/dist/esm/createLucideIcon.js","../node_modules/lucide-react/dist/esm/icons/check.js","../node_modules/lucide-react/dist/esm/icons/chevron-right.js","../node_modules/lucide-react/dist/esm/icons/circle.js","../src/components/ui/dropdown-menu.tsx","../src/components/ui/badge.tsx","../src/components/header/components/date-navigator.tsx","../src/components/header/components/today-button.tsx","../src/components/header/calendar-header.tsx","../src/components/views/agenda-view.tsx","../src/components/views/day-events-expansion.tsx","../src/components/primitives/multi-day-banner.tsx","../src/components/primitives/selectable-slot.tsx","../src/components/views/day-view.tsx","../src/components/views/month-view.tsx","../src/components/primitives/week-all-day-row.tsx","../src/components/views/week-view.tsx"],"sourcesContent":["import * as PopoverPrimitive from '@radix-ui/react-popover';\nimport * as React from 'react';\n\nimport { cn } from '../../lib/utils';\n\nconst Popover = PopoverPrimitive.Root;\n\nconst PopoverTrigger = PopoverPrimitive.Trigger;\n\nconst PopoverAnchor = PopoverPrimitive.Anchor;\n\nconst PopoverContent = React.forwardRef<\n\tReact.ElementRef<typeof PopoverPrimitive.Content>,\n\tReact.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\n>(({ className, align = 'center', sideOffset = 4, ...props }, ref) => (\n\t<PopoverPrimitive.Portal>\n\t\t<PopoverPrimitive.Content\n\t\t\tref={ref}\n\t\t\talign={align}\n\t\t\tsideOffset={sideOffset}\n\t\t\tclassName={cn(\n\t\t\t\t'z-50 w-72 rounded-xl border bg-white text-popover-foreground outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t</PopoverPrimitive.Portal>\n));\nPopoverContent.displayName = PopoverPrimitive.Content.displayName;\n\nexport { Popover, PopoverAnchor, PopoverContent, PopoverTrigger };\n","import * as TooltipPrimitive from '@radix-ui/react-tooltip';\nimport * as React from 'react';\n\nimport { cn } from '../../lib/utils';\n\nconst TooltipProvider = TooltipPrimitive.Provider;\n\nconst Tooltip = TooltipPrimitive.Root;\n\nconst TooltipTrigger = TooltipPrimitive.Trigger;\n\nconst TooltipContent = React.forwardRef<\n\tReact.ElementRef<typeof TooltipPrimitive.Content>,\n\tReact.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n\t<TooltipPrimitive.Content\n\t\tref={ref}\n\t\tsideOffset={sideOffset}\n\t\tclassName={cn(\n\t\t\t'z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n\t\t\tclassName\n\t\t)}\n\t\t{...props}\n\t/>\n));\nTooltipContent.displayName = TooltipPrimitive.Content.displayName;\n\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };\n","/**\n * Event Card Component\n *\n * A versatile event display component with multiple variants:\n * - full: Full card with all details (for day/week views)\n * - compact: Compact single-line (for month view cells)\n * - dot: Dot indicator only (for mini calendars)\n *\n * Supports badge variants:\n * - colored: Full colored background\n * - dot: Neutral background with colored dot\n * - mixed: Colored background with dot\n *\n * Styling matches agenda-v2 production design:\n * - Soft backgrounds with dark mode support\n * - Colored borders and text for better readability\n * - SVG dots with fill classes\n * - Canceled/past event states\n * - Drag & drop support for event repositioning\n *\n * @template TData - Custom event data type\n */\n\nimport {\n type CSSProperties,\n type ReactNode,\n useCallback,\n useRef,\n useState,\n} from \"react\";\nimport { useOptionalDragDrop } from \"../../core/context\";\nimport type {\n CalendarEvent,\n TBadgeVariant,\n TEventColor,\n} from \"../../core/types\";\nimport { formatEventTimeDisplay } from \"../../core/utils/event-utils\";\nimport { cn } from \"../../lib/utils\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../ui/popover\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../ui/tooltip\";\n\n// ============================================================================\n// COLOR UTILITIES (matches agenda-v2 transformers.ts)\n// ============================================================================\n\n/**\n * Get color classes for an event - matches agenda-v2 styling\n * Uses soft backgrounds with darker text for better readability\n */\nexport function getEventColorClasses(color?: TEventColor): {\n bg: string;\n text: string;\n dot: string;\n dotFill: string;\n border: string;\n accentBorder: string;\n} {\n const colorMap: Record<\n TEventColor,\n {\n bg: string;\n text: string;\n dot: string;\n dotFill: string;\n border: string;\n accentBorder: string;\n }\n > = {\n blue: {\n bg: \"bg-blue-50 dark:bg-blue-950/30\",\n text: \"text-blue-700 dark:text-blue-300\",\n dot: \"bg-blue-500\",\n dotFill: \"fill-blue-600 dark:fill-blue-500\",\n border: \"border-blue-400 dark:border-blue-600\",\n accentBorder: \"border-l-blue-500 dark:border-l-blue-400\",\n },\n green: {\n bg: \"bg-green-50 dark:bg-green-950/30\",\n text: \"text-green-700 dark:text-green-300\",\n dot: \"bg-green-500\",\n dotFill: \"fill-green-600 dark:fill-green-500\",\n border: \"border-green-400 dark:border-green-600\",\n accentBorder: \"border-l-green-500 dark:border-l-green-400\",\n },\n red: {\n bg: \"bg-red-50 dark:bg-red-950/30\",\n text: \"text-red-700 dark:text-red-300\",\n dot: \"bg-red-500\",\n dotFill: \"fill-red-600 dark:fill-red-500\",\n border: \"border-red-400 dark:border-red-600\",\n accentBorder: \"border-l-red-500 dark:border-l-red-400\",\n },\n yellow: {\n bg: \"bg-yellow-50 dark:bg-yellow-950/30\",\n text: \"text-yellow-700 dark:text-yellow-300\",\n dot: \"bg-yellow-500\",\n dotFill: \"fill-yellow-600 dark:fill-yellow-500\",\n border: \"border-yellow-400 dark:border-yellow-600\",\n accentBorder: \"border-l-yellow-500 dark:border-l-yellow-400\",\n },\n purple: {\n bg: \"bg-purple-50 dark:bg-purple-950/30\",\n text: \"text-purple-700 dark:text-purple-300\",\n dot: \"bg-purple-500\",\n dotFill: \"fill-purple-600 dark:fill-purple-500\",\n border: \"border-purple-400 dark:border-purple-600\",\n accentBorder: \"border-l-purple-500 dark:border-l-purple-400\",\n },\n orange: {\n bg: \"bg-orange-50 dark:bg-orange-950/30\",\n text: \"text-orange-700 dark:text-orange-300\",\n dot: \"bg-orange-500\",\n dotFill: \"fill-orange-600 dark:fill-orange-500\",\n border: \"border-orange-400 dark:border-orange-600\",\n accentBorder: \"border-l-orange-500 dark:border-l-orange-400\",\n },\n pink: {\n bg: \"bg-pink-50 dark:bg-pink-950/30\",\n text: \"text-pink-700 dark:text-pink-300\",\n dot: \"bg-pink-500\",\n dotFill: \"fill-pink-600 dark:fill-pink-500\",\n border: \"border-pink-400 dark:border-pink-600\",\n accentBorder: \"border-l-pink-500 dark:border-l-pink-400\",\n },\n teal: {\n bg: \"bg-teal-50 dark:bg-teal-950/30\",\n text: \"text-teal-700 dark:text-teal-300\",\n dot: \"bg-teal-500\",\n dotFill: \"fill-teal-600 dark:fill-teal-500\",\n border: \"border-teal-400 dark:border-teal-600\",\n accentBorder: \"border-l-teal-500 dark:border-l-teal-400\",\n },\n gray: {\n bg: \"bg-gray-50 dark:bg-gray-950/30\",\n text: \"text-gray-700 dark:text-gray-300\",\n dot: \"bg-gray-500\",\n dotFill: \"fill-gray-600 dark:fill-gray-500\",\n border: \"border-gray-400 dark:border-gray-600\",\n accentBorder: \"border-l-gray-500 dark:border-l-gray-400\",\n },\n indigo: {\n bg: \"bg-indigo-50 dark:bg-indigo-950/30\",\n text: \"text-indigo-700 dark:text-indigo-300\",\n dot: \"bg-indigo-500\",\n dotFill: \"fill-indigo-600 dark:fill-indigo-500\",\n border: \"border-indigo-400 dark:border-indigo-600\",\n accentBorder: \"border-l-indigo-500 dark:border-l-indigo-400\",\n },\n };\n\n return colorMap[color ?? \"blue\"];\n}\n\n// ============================================================================\n// TIME FORMATTING\n// ============================================================================\n\n\n/**\n * Check if a date is at the start of today (past detection)\n */\nfunction startOfDay(date: Date): Date {\n const d = new Date(date);\n d.setHours(0, 0, 0, 0);\n return d;\n}\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * Props for the {@link EventCard} component.\n *\n * @template TData - Consumer's custom data type on the event\n *\n * @example\n * ```tsx\n * <EventCard\n * event={myEvent}\n * variant=\"full\"\n * badgeVariant=\"colored\"\n * renderPopover={({ event, onClose }) => <MyPopover event={event} onClose={onClose} />}\n * />\n * ```\n */\nexport interface EventCardProps<TData = Record<string, unknown>> {\n /** The calendar event to render */\n event: CalendarEvent<TData>;\n /**\n * Visual variant controlling the card's layout:\n * - `'full'` — Bordered card with title, time, type, location (day/week views)\n * - `'compact'` — Single-line with marquee title and time pill (month view)\n * - `'dot'` — Colored circle indicator (mini calendars)\n *\n * @default 'full'\n */\n variant?: \"full\" | \"compact\" | \"dot\";\n /**\n * Badge coloring mode:\n * - `'colored'` — Full colored background matching event color\n * - `'dot'` — Neutral background with a small colored dot\n * - `'mixed'` — Colored background **and** dot indicator\n *\n * @default 'colored'\n */\n badgeVariant?: TBadgeVariant;\n /** Called when the event is clicked (only fires when `disablePopover` is `true`) */\n onClick?: ((event: CalendarEvent<TData>) => void) | undefined;\n /** Additional CSS classes merged onto the root element */\n className?: string;\n /** Whether to display the time range. @default true */\n showTime?: boolean;\n /** Whether to display the event description. @default false */\n showDescription?: boolean;\n /** Whether to display participant count. @default false */\n showParticipants?: boolean;\n /** Inline styles forwarded to the root element (used for grid positioning) */\n style?: CSSProperties;\n /**\n * When `true`, clicking opens no built-in popover — instead `onClick` fires.\n * Use this when you handle event details externally (e.g. a dialog/drawer).\n *\n * @default false\n */\n disablePopover?: boolean;\n /**\n * Custom popover content rendered inside the built-in Radix popover shell.\n * Receives the event and an `onClose` callback. When omitted the package's\n * default {@link EventPopoverContent} is shown.\n *\n * @example\n * ```tsx\n * renderPopover={({ event, onClose }) => (\n * <MyCustomPopover event={event} onClose={onClose} />\n * )}\n * ```\n */\n renderPopover?:\n | ((props: {\n event: CalendarEvent<TData>;\n onClose: () => void;\n }) => ReactNode)\n | undefined;\n /**\n * Enable native HTML5 drag on this card for event repositioning.\n * Requires the calendar to be wrapped in a {@link DragDropProvider}.\n *\n * @default false\n */\n enableDrag?: boolean;\n /**\n * Enable page transition effect when clicking the event.\n * Creates an expanding overlay that fills the screen with the event's color.\n *\n * @default false\n */\n enablePageTransition?: boolean;\n /**\n * Duration of the page transition in milliseconds.\n * Only used when `enablePageTransition` is `true`.\n *\n * @default 400\n */\n pageTransitionDuration?: number;\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport function EventCard<TData = Record<string, unknown>>({\n event,\n variant = \"full\",\n badgeVariant = \"colored\",\n onClick,\n className,\n showTime = true,\n showDescription = false,\n showParticipants = false,\n style,\n disablePopover = false,\n renderPopover,\n enableDrag = false,\n enablePageTransition = false,\n pageTransitionDuration: _pageTransitionDuration = 400,\n}: EventCardProps<TData>) {\n const colors = getEventColorClasses(event.color);\n const [popoverOpen, setPopoverOpen] = useState(false);\n const [isDragging, setIsDragging] = useState(false);\n const [_transitionActive, setTransitionActive] = useState(false);\n const [_transitionRect, setTransitionRect] = useState<DOMRect | null>(null);\n const cardRef = useRef<HTMLButtonElement>(null);\n\n // Get drag-drop context\n const dragDrop = useOptionalDragDrop();\n\n // Check if event is in the past (ended before start of today)\n const isPast = event.endDate < startOfDay(new Date());\n\n // Check if event is canceled\n const isCanceled = event.isCanceled ?? false;\n\n // Don't allow dragging for cancelled or past events\n const canDrag = enableDrag && dragDrop && !isCanceled && !isPast;\n\n // Extract rich data from event.data for display\n // Reads from event.data first (recommended), then falls back to\n // deprecated top-level fields for backward compatibility.\n const eventCardData = event.data as Record<string, unknown> | undefined;\n const cardMeetingTookPlace =\n (eventCardData?.meetingTookPlace as boolean | undefined) ??\n event.meetingTookPlace ??\n false;\n\n // Status icons (matches agenda-v2)\n const statusIcon = isCanceled ? (\n <XIcon className=\"h-3 w-3 text-zinc-800 dark:text-zinc-200\" />\n ) : cardMeetingTookPlace ? (\n <CheckIcon className={cn(\"h-3 w-3\", colors.text)} />\n ) : null;\n\n const cardScheduleTypeName =\n event.scheduleTypeName ||\n (eventCardData?.scheduleTypeName as string | undefined) ||\n (eventCardData?.typeName as string | undefined);\n const cardProductName = eventCardData?.productName as string | undefined;\n const cardNrParticipant = eventCardData?.nrParticipant as number | undefined;\n const cardSiteName = eventCardData?.siteName as string | undefined;\n const cardSiteCity = eventCardData?.siteCity as string | undefined;\n const cardLocationStr = [cardSiteName, cardSiteCity]\n .filter(Boolean)\n .join(\", \");\n\n // Handle click\n const handleClick = useCallback(() => {\n if (isDragging) return; // Don't open popover during drag\n if (disablePopover && onClick) {\n onClick(event);\n return;\n }\n\n if (enablePageTransition && cardRef.current) {\n // Start page transition\n const rect = cardRef.current.getBoundingClientRect();\n setTransitionRect(rect);\n setTransitionActive(true);\n } else if (!disablePopover) {\n setPopoverOpen(true);\n }\n }, [isDragging, disablePopover, onClick, event, enablePageTransition]);\n\n // Handle transition complete - open popover after animation\n // @ts-expect-error -- transition scaffolding for future page-transition feature\n const _handleTransitionComplete = useCallback(() => {\n setTransitionActive(false);\n setTransitionRect(null);\n if (!disablePopover) {\n setPopoverOpen(true);\n }\n }, [disablePopover]);\n\n // Handle popover close\n const handleClose = useCallback(() => {\n setPopoverOpen(false);\n }, []);\n\n // Drag handlers (matches agenda-v2)\n const handleDragStart = useCallback(\n (e: React.DragEvent) => {\n if (!canDrag) return;\n e.dataTransfer.effectAllowed = \"move\";\n e.dataTransfer.setData(\"text/plain\", event.id);\n setIsDragging(true);\n dragDrop?.startDrag?.(event);\n },\n [canDrag, event, dragDrop],\n );\n\n const handleDragEnd = useCallback(() => {\n setIsDragging(false);\n if (dragDrop?.isDragging) {\n dragDrop.endDrag?.();\n }\n }, [dragDrop]);\n\n // ========================================================================\n // DOT VARIANT\n // ========================================================================\n\n if (variant === \"dot\") {\n const dotButton = (\n <button\n type=\"button\"\n onClick={handleClick}\n className={cn(\n \"size-2 rounded-full cursor-pointer transition-opacity\",\n isPast ? \"bg-gray-400\" : colors.dot,\n event.isCanceled && \"opacity-50\",\n className,\n )}\n style={style}\n aria-label={event.title}\n />\n );\n\n if (disablePopover) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>{dotButton}</TooltipTrigger>\n <TooltipContent>\n <div className=\"flex flex-col gap-0.5\">\n <div className=\"font-medium\">{event.title}</div>\n <div className=\"text-xs opacity-80\">\n {formatEventTimeDisplay(event)}\n </div>\n </div>\n </TooltipContent>\n </Tooltip>\n );\n }\n\n return (\n <Popover open={popoverOpen} onOpenChange={setPopoverOpen}>\n <PopoverTrigger asChild>\n <Tooltip>\n <TooltipTrigger asChild>{dotButton}</TooltipTrigger>\n <TooltipContent>\n <div className=\"font-medium\">{event.title}</div>\n </TooltipContent>\n </Tooltip>\n </PopoverTrigger>\n <PopoverContent className=\"w-80\">\n {renderPopover ? (\n renderPopover({ event, onClose: handleClose })\n ) : (\n <DefaultPopoverContent event={event} onClose={handleClose} />\n )}\n </PopoverContent>\n </Popover>\n );\n }\n\n // ========================================================================\n // COMPACT VARIANT (matches agenda-v2 - marquee title, time pill, drag support)\n // ========================================================================\n\n if (variant === \"compact\") {\n const compactContent = (\n <div\n role=\"button\"\n tabIndex={0}\n draggable={!!canDrag}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n onClick={disablePopover ? handleClick : undefined}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleClick();\n }\n }}\n className={cn(\n \"group flex w-full relative items-center shadow-[0_0_1px_rgba(0,0,0,0.3)] gap-0 rounded px-1.5 py-1 text-left text-xs transition-colors hover:opacity-80\",\n canDrag ? \"cursor-grab active:cursor-grabbing\" : \"cursor-pointer\",\n isDragging && \"opacity-50\",\n // Cancelled events get gray background with strikethrough\n isCanceled\n ? \"bg-zinc-100 dark:bg-zinc-800 text-zinc-500 dark:text-zinc-400 line-through\"\n : // Past events get neutral zinc styling\n isPast\n ? \"bg-zinc-100 dark:bg-zinc-800 text-zinc-500 dark:text-zinc-400 line-through\"\n : [\n badgeVariant === \"colored\" && [colors.bg, colors.text],\n badgeVariant === \"mixed\" && [colors.bg, colors.text],\n badgeVariant === \"dot\" && \"bg-muted/50\",\n ],\n className,\n )}\n style={style}\n >\n {/* Colored dot for dot/mixed variants (matches agenda-v2 - no isCanceled check) */}\n {[\"dot\", \"mixed\"].includes(badgeVariant) && !isPast && (\n <svg\n width=\"8\"\n height=\"8\"\n viewBox=\"0 0 8 8\"\n className=\"event-dot absolute -top-1 -left-1 shrink-0\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <circle cx=\"4\" cy=\"4\" r=\"4\" className={colors.dotFill} />\n </svg>\n )}\n\n {/* Title with marquee effect */}\n <span className=\"flex-1 min-w-0 overflow-hidden\">\n <span className=\"\">\n <span\n className=\"relative block overflow-hidden whitespace-nowrap text-xs leading-tight\"\n style={{\n maskImage:\n \"linear-gradient(to right, transparent 0, black 8px, black calc(100% - 8px), transparent 100%)\",\n WebkitMaskImage:\n \"linear-gradient(to right, transparent 0, black 8px, black calc(100% - 8px), transparent 100%)\",\n }}\n >\n <span className=\"inline-flex event-marquee\">\n <span className=\"shrink-0 px-1\">{event.title}</span>\n <span className=\"shrink-0 px-1\">•</span>\n <span aria-hidden=\"true\" className=\"shrink-0 px-1\">\n {event.title}\n </span>\n <span aria-hidden=\"true\" className=\"shrink-0 px-1\">\n •\n </span>\n </span>\n </span>\n\n {/* Time pill with dashed border - shows \"All day\" for all-day events */}\n <div\n className={cn(\n \"w-fit mt-0.5 text-[10px] px-1 py-0.5 border border-dashed rounded-full font-medium\",\n isPast ? \"border-zinc-400 dark:border-zinc-600\" : colors.border,\n )}\n >\n {formatEventTimeDisplay(event)}\n </div>\n </span>\n </span>\n {/* Status icon on right (matches agenda-v2) */}\n <div className=\"flex gap-0.5\">{statusIcon}</div>\n </div>\n );\n\n if (disablePopover) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>{compactContent}</TooltipTrigger>\n <TooltipContent>\n <div className=\"flex flex-col gap-0.5\">\n <div className=\"font-medium\">{event.title}</div>\n <div className=\"text-xs text-muted-foreground tabular-nums\">\n {formatEventTimeDisplay(event)}\n </div>\n </div>\n </TooltipContent>\n </Tooltip>\n );\n }\n\n return (\n <Popover open={popoverOpen} onOpenChange={setPopoverOpen}>\n <PopoverTrigger asChild>{compactContent}</PopoverTrigger>\n <PopoverContent className=\"w-80\">\n {renderPopover ? (\n renderPopover({ event, onClose: handleClose })\n ) : (\n <DefaultPopoverContent event={event} onClose={handleClose} />\n )}\n </PopoverContent>\n </Popover>\n );\n }\n\n // ========================================================================\n // FULL VARIANT (matches agenda-v2 - border, hover shadow, colored text)\n // ========================================================================\n\n const fullContent = (\n <button\n type=\"button\"\n onClick={handleClick}\n className={cn(\n \"group relative flex w-full flex-col gap-1 rounded-md border-l-[3px] px-2 py-1.5 text-left transition-all\",\n \"shadow-[0_1px_3px_rgba(0,0,0,0.08)] hover:shadow-[0_2px_6px_rgba(0,0,0,0.12)]\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n // Cancelled events get gray background with strikethrough\n isCanceled\n ? \"bg-zinc-100 dark:bg-zinc-800 border-l-zinc-400 dark:border-l-zinc-600 text-zinc-500 dark:text-zinc-400 line-through\"\n : // Past events get neutral zinc styling with strikethrough\n isPast\n ? \"bg-zinc-100 dark:bg-zinc-800 border-l-zinc-400 dark:border-l-zinc-600 text-zinc-500 dark:text-zinc-400 line-through\"\n : [\n badgeVariant === \"colored\" && [\n colors.bg,\n colors.accentBorder,\n colors.text,\n ],\n badgeVariant === \"mixed\" && [\n colors.bg,\n colors.accentBorder,\n colors.text,\n ],\n badgeVariant === \"dot\" &&\n \"bg-muted/50 border-l-neutral-400 dark:border-l-neutral-600\",\n ],\n className,\n )}\n style={style}\n >\n {/* Header row */}\n <div className=\"flex items-start justify-between gap-1\">\n <div className=\"flex items-center gap-1.5 min-w-0\">\n {/* Colored dot for dot/mixed variants */}\n {[\"dot\", \"mixed\"].includes(badgeVariant) &&\n !isPast &&\n !isCanceled && (\n <svg\n width=\"8\"\n height=\"8\"\n viewBox=\"0 0 8 8\"\n className=\"event-dot shrink-0\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <circle cx=\"4\" cy=\"4\" r=\"4\" className={colors.dotFill} />\n </svg>\n )}\n <span\n className={cn(\n \"text-sm font-medium truncate\",\n !isPast && !isCanceled && badgeVariant !== \"dot\" && colors.text,\n isCanceled && \"line-through\",\n )}\n >\n {event.title}\n {cardScheduleTypeName && (\n <span className=\"font-normal opacity-75\">\n {\" \"}\n - {cardScheduleTypeName}\n </span>\n )}\n </span>\n </div>\n {/* Status icon (matches agenda-v2) */}\n {statusIcon}\n </div>\n\n {/* Product / activity name */}\n {cardProductName && (\n <p className=\"text-xs text-muted-foreground truncate\">\n {cardProductName}\n </p>\n )}\n\n {/* Participant count */}\n {cardNrParticipant != null && (\n <div className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <UsersIcon className=\"h-3 w-3 shrink-0\" />\n <span>\n {cardNrParticipant} participant{cardNrParticipant !== 1 ? \"s\" : \"\"}\n </span>\n </div>\n )}\n\n {/* Time display — hidden for all-day events where times are meaningless */}\n {showTime && (\n <div className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <ClockIcon className=\"h-3 w-3 shrink-0\" />\n <span>{formatEventTimeDisplay(event)}</span>\n </div>\n )}\n\n {/* Location: site name + city */}\n {cardLocationStr && (\n <div className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <MapPinIcon className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">{cardLocationStr}</span>\n </div>\n )}\n\n {/* Description */}\n {showDescription && event.description && (\n <p className=\"text-xs text-muted-foreground line-clamp-2\">\n {event.description}\n </p>\n )}\n\n {/* Named participants list (matches agenda-v2) */}\n {showParticipants &&\n event.participants &&\n event.participants.length > 0 && (\n <div className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <UsersIcon className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">\n {event.participants.map((p) => p.name).join(\", \")}\n </span>\n </div>\n )}\n </button>\n );\n\n if (disablePopover) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>{fullContent}</TooltipTrigger>\n <TooltipContent>\n <div className=\"flex flex-col gap-0.5\">\n <div className=\"font-medium\">{event.title}</div>\n <div className=\"text-xs text-muted-foreground tabular-nums\">\n {formatEventTimeDisplay(event)}\n </div>\n </div>\n </TooltipContent>\n </Tooltip>\n );\n }\n\n return (\n <Popover open={popoverOpen} onOpenChange={setPopoverOpen}>\n <PopoverTrigger asChild>{fullContent}</PopoverTrigger>\n <PopoverContent className=\"w-80\">\n {renderPopover ? (\n renderPopover({ event, onClose: handleClose })\n ) : (\n <DefaultPopoverContent event={event} onClose={handleClose} />\n )}\n </PopoverContent>\n </Popover>\n );\n}\n\n// ============================================================================\n// CLOCK ICON (inline SVG to avoid lucide-react dependency)\n// ============================================================================\n\nfunction ClockIcon({ className }: { className?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <polyline points=\"12 6 12 12 16 14\" />\n </svg>\n );\n}\n\n/**\n * Check Icon (inline SVG to avoid lucide-react dependency)\n */\nfunction CheckIcon({ className }: { className?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n );\n}\n\n/**\n * X Icon (inline SVG to avoid lucide-react dependency)\n */\nfunction XIcon({ className }: { className?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n );\n}\n\n/**\n * Users Icon (inline SVG to avoid lucide-react dependency)\n */\nfunction UsersIcon({ className }: { className?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <path d=\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\" />\n <circle cx=\"9\" cy=\"7\" r=\"4\" />\n <path d=\"M22 21v-2a4 4 0 0 0-3-3.87\" />\n <path d=\"M16 3.13a4 4 0 0 1 0 7.75\" />\n </svg>\n );\n}\n\n/**\n * MapPin Icon (inline SVG to avoid lucide-react dependency)\n */\nfunction MapPinIcon({ className }: { className?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\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\" />\n <circle cx=\"12\" cy=\"10\" r=\"3\" />\n </svg>\n );\n}\n\n// ============================================================================\n// DEFAULT POPOVER CONTENT (matches agenda-v2 Google Calendar style)\n// ============================================================================\n\ninterface DefaultPopoverContentProps<TData> {\n event: CalendarEvent<TData>;\n onClose: () => void;\n}\n\nfunction DefaultPopoverContent<TData>({\n event,\n onClose,\n}: DefaultPopoverContentProps<TData>) {\n const colors = getEventColorClasses(event.color);\n const isCanceled = event.isCanceled ?? false;\n\n return (\n <div className=\"space-y-3\">\n {/* Header with color indicator */}\n <div className=\"flex items-start gap-3\">\n <div className={cn(\"size-4 rounded shrink-0 mt-0.5\", colors.dot)} />\n <div className=\"flex-1 min-w-0\">\n <h3\n className={cn(\n \"font-semibold text-lg\",\n isCanceled && \"line-through opacity-50\",\n )}\n >\n {event.title}\n </h3>\n <div className=\"flex items-center gap-1 text-sm text-muted-foreground mt-1\">\n <ClockIcon className=\"h-4 w-4 shrink-0\" />\n <span className=\"tabular-nums\">\n {formatEventTimeDisplay(event)}\n </span>\n </div>\n </div>\n </div>\n\n {/* Description */}\n {event.description && (\n <p className=\"text-sm text-muted-foreground\">{event.description}</p>\n )}\n\n {/* Status badges */}\n <div className=\"flex flex-wrap gap-1.5\">\n {event.isAllDay && (\n <span className=\"text-xs bg-muted px-2 py-0.5 rounded-full font-medium\">\n All day\n </span>\n )}\n {event.isRecurring && (\n <span className=\"text-xs bg-muted px-2 py-0.5 rounded-full font-medium\">\n Recurring\n </span>\n )}\n {isCanceled && (\n <span className=\"text-xs bg-red-100 dark:bg-red-950/30 text-red-700 dark:text-red-300 px-2 py-0.5 rounded-full font-medium\">\n Canceled\n </span>\n )}\n </div>\n\n {/* Close button */}\n <div className=\"flex justify-end pt-2 border-t\">\n <button\n type=\"button\"\n onClick={onClose}\n className=\"text-xs text-muted-foreground hover:text-foreground px-3 py-1.5 rounded-md hover:bg-muted transition-colors\"\n >\n Close\n </button>\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// EVENT BLOCK (positioned in time grid - matches agenda-v2)\n// ============================================================================\n\nexport interface EventBlockProps<TData = Record<string, unknown>> {\n /** The event to display */\n event: CalendarEvent<TData>;\n /** Position in the grid */\n position: {\n top: number;\n left: number;\n width: number;\n minWidth?: number;\n };\n /** Pixels per hour (default: 96 to match agenda-v2) */\n hourHeight?: number;\n /** Badge variant for coloring style */\n badgeVariant?: TBadgeVariant;\n /** Click handler */\n onClick?: ((event: CalendarEvent<TData>) => void) | undefined;\n /** Additional CSS classes */\n className?: string;\n /** Disable popover and use onClick instead */\n disablePopover?: boolean;\n /** Custom popover content */\n renderPopover?:\n | ((props: {\n event: CalendarEvent<TData>;\n onClose: () => void;\n }) => ReactNode)\n | undefined;\n /** Enable drag support for repositioning */\n enableDrag?: boolean;\n}\n\n/**\n * EventBlock - Positioned event in day/week time grid\n * Matches agenda-v2 styling:\n * - Height calculated from event duration\n * - Shows time when duration > 25 minutes\n * - Uses colored/dot/mixed badge variants\n * - Drag & drop support for event repositioning\n */\nexport function EventBlock<TData = Record<string, unknown>>({\n event,\n position,\n hourHeight = 96,\n badgeVariant = \"colored\",\n onClick,\n className,\n disablePopover = false,\n renderPopover,\n enableDrag = true,\n}: EventBlockProps<TData>) {\n const colors = getEventColorClasses(event.color);\n const [popoverOpen, setPopoverOpen] = useState(false);\n const [isDragging, setIsDragging] = useState(false);\n\n // Get drag-drop context\n const dragDrop = useOptionalDragDrop();\n\n // Calculate duration and height\n const durationInMinutes =\n (event.endDate.getTime() - event.startDate.getTime()) / (1000 * 60);\n const heightInPixels = (durationInMinutes / 60) * hourHeight - 8;\n\n // Check if event is in the past\n const isPast = event.endDate < startOfDay(new Date());\n const isCanceled = event.isCanceled ?? false;\n\n // Don't allow dragging for cancelled or past events\n const canDrag = enableDrag && dragDrop && !isCanceled && !isPast;\n\n // Short events get centered content\n const isShortEvent = durationInMinutes < 35;\n const showTime = durationInMinutes > 25;\n // Show additional details when the card has enough vertical space\n const showDetails = durationInMinutes >= 45;\n\n // Extract rich data from event.data for display\n const eventData = event.data as Record<string, unknown> | undefined;\n const scheduleTypeName =\n event.scheduleTypeName ||\n (eventData?.scheduleTypeName as string | undefined) ||\n (eventData?.typeName as string | undefined);\n const productName = eventData?.productName as string | undefined;\n const nrParticipant = eventData?.nrParticipant as number | undefined;\n const siteName = eventData?.siteName as string | undefined;\n const siteCity = eventData?.siteCity as string | undefined;\n // Build location string: \"SiteName, City\"\n const locationStr = [siteName, siteCity].filter(Boolean).join(\", \");\n\n // Determine color variant\n const isDotVariant = badgeVariant === \"dot\";\n\n // Handle click\n const handleClick = useCallback(() => {\n if (isDragging) return; // Don't open popover during drag\n if (disablePopover && onClick) {\n onClick(event);\n } else if (!disablePopover) {\n setPopoverOpen(true);\n }\n }, [isDragging, disablePopover, onClick, event]);\n\n // Handle popover close\n const handleClose = useCallback(() => {\n setPopoverOpen(false);\n }, []);\n\n // Drag handlers (matches agenda-v2)\n const handleDragStart = useCallback(\n (e: React.DragEvent) => {\n if (!canDrag) return;\n e.dataTransfer.effectAllowed = \"move\";\n e.dataTransfer.setData(\"text/plain\", event.id);\n // Set custom drag image with some offset\n const target = e.currentTarget as HTMLElement;\n const rect = target.getBoundingClientRect();\n e.dataTransfer.setDragImage(\n target,\n e.clientX - rect.left,\n e.clientY - rect.top,\n );\n setIsDragging(true);\n dragDrop?.startDrag?.(event);\n },\n [canDrag, event, dragDrop],\n );\n\n const handleDragEnd = useCallback(() => {\n setIsDragging(false);\n if (dragDrop?.isDragging) {\n dragDrop.endDrag?.();\n }\n }, [dragDrop]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleClick();\n }\n },\n [handleClick],\n );\n\n const blockButton = (\n <div\n role=\"button\"\n tabIndex={0}\n draggable={!!canDrag}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n onKeyDown={handleKeyDown}\n onClick={isDragging ? undefined : handleClick}\n className={cn(\n \"group flex w-full select-none flex-col gap-0.5 overflow-hidden rounded-md border-l-[3px] px-2 py-1.5 text-xs text-left\",\n \"shadow-[0_1px_3px_rgba(0,0,0,0.08)] hover:shadow-[0_2px_6px_rgba(0,0,0,0.12)]\",\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\",\n \"transition-all\",\n canDrag ? \"cursor-grab active:cursor-grabbing\" : \"cursor-pointer\",\n isDragging && \"opacity-50\",\n // Cancelled events get gray background with strikethrough\n isCanceled\n ? \"bg-zinc-100 dark:bg-zinc-800 border-l-zinc-400 dark:border-l-zinc-600 text-zinc-500 dark:text-zinc-400 line-through\"\n : // Past events get neutral zinc styling with strikethrough\n isPast\n ? \"bg-zinc-100 dark:bg-zinc-800 border-l-zinc-400 dark:border-l-zinc-600 text-zinc-500 dark:text-zinc-400 line-through\"\n : [\n // Colored/mixed variants\n !isDotVariant && [\n colors.bg,\n colors.accentBorder,\n colors.text,\n ],\n // Dot variant - neutral background\n isDotVariant &&\n \"bg-neutral-50 dark:bg-neutral-900 border-l-neutral-400 dark:border-l-neutral-600\",\n ],\n // Short events center content\n isShortEvent && \"py-0 justify-center\",\n className,\n )}\n style={{ height: `${Math.max(heightInPixels, 20)}px` }}\n >\n <div className=\"flex items-start gap-1.5 min-w-0\">\n {/* Colored dot for dot/mixed variants */}\n {[\"mixed\", \"dot\"].includes(badgeVariant) && !isPast && !isCanceled && (\n <svg\n width=\"8\"\n height=\"8\"\n viewBox=\"0 0 8 8\"\n className=\"event-dot shrink-0\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <circle cx=\"4\" cy=\"4\" r=\"4\" className={colors.dotFill} />\n </svg>\n )}\n <div className=\"flex-1 min-w-0 overflow-hidden\">\n {/* Title + schedule type name */}\n <p\n className={cn(\n \"font-semibold truncate leading-tight\",\n !isPast && !isCanceled && isDotVariant && \"text-foreground\",\n )}\n >\n {event.title}\n {scheduleTypeName && (\n <span className=\"font-normal opacity-75\">\n {\" \"}\n - {scheduleTypeName}\n </span>\n )}\n </p>\n </div>\n </div>\n\n {/* Product / activity name */}\n {showDetails && productName && (\n <p\n className={cn(\n \"text-[11px] truncate leading-tight\",\n isDotVariant ? \"text-muted-foreground\" : \"opacity-80\",\n )}\n >\n {productName}\n </p>\n )}\n\n {/* Participant count */}\n {showDetails && nrParticipant != null && (\n <div\n className={cn(\n \"flex items-center gap-1 text-[11px] leading-tight\",\n isDotVariant ? \"text-muted-foreground\" : \"opacity-80\",\n )}\n >\n <UsersIcon className=\"h-3 w-3 shrink-0\" />\n <span>\n {nrParticipant} participant{nrParticipant !== 1 ? \"s\" : \"\"}\n </span>\n </div>\n )}\n\n {/* Time display — hidden for all-day events */}\n {showTime && (\n <div\n className={cn(\n \"flex items-center gap-1 text-[11px] tabular-nums leading-tight\",\n isDotVariant ? \"text-muted-foreground\" : \"opacity-90\",\n )}\n >\n <ClockIcon className=\"h-3 w-3 shrink-0\" />\n <span>\n {formatEventTimeDisplay(event)}\n </span>\n </div>\n )}\n\n {/* Location: site name + city */}\n {showDetails && locationStr && (\n <div\n className={cn(\n \"flex items-center gap-1 text-[11px] truncate leading-tight\",\n isDotVariant ? \"text-muted-foreground\" : \"opacity-80\",\n )}\n >\n <MapPinIcon className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">{locationStr}</span>\n </div>\n )}\n </div>\n );\n\n const tooltipContent = (\n <TooltipContent>\n <div className=\"flex flex-col gap-0.5\">\n <div className=\"font-medium\">\n {event.title}\n {scheduleTypeName && (\n <span className=\"font-normal opacity-75\">\n {\" \"}\n - {scheduleTypeName}\n </span>\n )}\n </div>\n {productName && (\n <div className=\"text-xs text-muted-foreground\">{productName}</div>\n )}\n {nrParticipant != null && (\n <div className=\"text-xs text-muted-foreground\">\n {nrParticipant} participant{nrParticipant !== 1 ? \"s\" : \"\"}\n </div>\n )}\n <div className=\"text-xs text-muted-foreground tabular-nums\">\n {formatEventTimeDisplay(event)}\n </div>\n {locationStr && (\n <div className=\"text-xs text-muted-foreground\">{locationStr}</div>\n )}\n </div>\n </TooltipContent>\n );\n\n if (disablePopover) {\n return (\n <div\n className=\"absolute p-0.5\"\n style={{\n top: `${position.top}px`,\n left: `${position.left}%`,\n width: position.minWidth\n ? `max(${position.minWidth}px, ${position.width}%)`\n : `${position.width}%`,\n minWidth: position.minWidth ? `${position.minWidth}px` : undefined,\n }}\n >\n <Tooltip>\n <TooltipTrigger asChild>{blockButton}</TooltipTrigger>\n {tooltipContent}\n </Tooltip>\n </div>\n );\n }\n\n return (\n <div\n className=\"absolute p-0.5\"\n style={{\n top: `${position.top}px`,\n left: `${position.left}%`,\n width: position.minWidth\n ? `max(${position.minWidth}px, ${position.width}%)`\n : `${position.width}%`,\n minWidth: position.minWidth ? `${position.minWidth}px` : undefined,\n }}\n >\n <Popover open={popoverOpen} onOpenChange={setPopoverOpen}>\n <PopoverTrigger asChild>{blockButton}</PopoverTrigger>\n <PopoverContent className=\"w-80\">\n {renderPopover ? (\n renderPopover({ event, onClose: handleClose })\n ) : (\n <DefaultPopoverContent event={event} onClose={handleClose} />\n )}\n </PopoverContent>\n </Popover>\n </div>\n );\n}\n\n// ============================================================================\n// MULTI-DAY EVENT BAR (for week/month views - matches agenda-v2)\n// ============================================================================\n\nexport interface MultiDayEventBarProps<TData = Record<string, unknown>> {\n /** The event to display */\n event: CalendarEvent<TData>;\n /** Number of days the event spans */\n spanDays: number;\n /** Whether this is the start of the event span */\n isStart: boolean;\n /** Whether this is the end of the event span */\n isEnd: boolean;\n /** Click handler */\n onClick?: (event: CalendarEvent<TData>) => void;\n /** Additional CSS classes */\n className?: string;\n /** Disable popover and use onClick instead */\n disablePopover?: boolean;\n /** Custom popover content */\n renderPopover?: (props: {\n event: CalendarEvent<TData>;\n onClose: () => void;\n }) => ReactNode;\n}\n\n/**\n * MultiDayEventBar - Horizontal bar for multi-day events in week/month views\n */\nexport function MultiDayEventBar<TData = Record<string, unknown>>({\n event,\n spanDays,\n isStart,\n isEnd,\n onClick,\n className,\n disablePopover = false,\n renderPopover,\n}: MultiDayEventBarProps<TData>) {\n const colors = getEventColorClasses(event.color);\n const [popoverOpen, setPopoverOpen] = useState(false);\n\n // Check if event is in the past\n const isPast = event.endDate < startOfDay(new Date());\n const isCanceled = event.isCanceled ?? false;\n\n // Handle click\n const handleClick = useCallback(() => {\n if (disablePopover && onClick) {\n onClick(event);\n } else if (!disablePopover) {\n setPopoverOpen(true);\n }\n }, [disablePopover, onClick, event]);\n\n // Handle popover close\n const handleClose = useCallback(() => {\n setPopoverOpen(false);\n }, []);\n\n const barButton = (\n <button\n type=\"button\"\n onClick={handleClick}\n className={cn(\n \"flex h-5 items-center px-1.5 text-xs font-medium transition-opacity hover:opacity-80\",\n // Cancelled events get gray background with strikethrough\n isCanceled\n ? \"bg-zinc-200 dark:bg-zinc-700 text-zinc-500 dark:text-zinc-400 line-through\"\n : // Past events get neutral zinc styling with strikethrough\n isPast\n ? \"bg-zinc-200 dark:bg-zinc-700 text-zinc-500 dark:text-zinc-400 line-through\"\n : [colors.dot, \"text-white\"],\n isStart && \"rounded-l\",\n isEnd && \"rounded-r\",\n !isStart && \"border-l-0\",\n !isEnd && \"border-r-0\",\n className,\n )}\n style={{ width: `${spanDays * 100}%` }}\n >\n {isStart && <span className=\"truncate\">{event.title}</span>}\n </button>\n );\n\n const tooltipContent = (\n <TooltipContent>\n <div className=\"flex flex-col gap-0.5\">\n <div className=\"font-medium\">{event.title}</div>\n <div className=\"text-xs text-muted-foreground tabular-nums\">\n {formatEventTimeDisplay(event)}\n </div>\n </div>\n </TooltipContent>\n );\n\n if (disablePopover) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>{barButton}</TooltipTrigger>\n {tooltipContent}\n </Tooltip>\n );\n }\n\n return (\n <Popover open={popoverOpen} onOpenChange={setPopoverOpen}>\n <PopoverTrigger asChild>{barButton}</PopoverTrigger>\n <PopoverContent className=\"w-80\">\n {renderPopover ? (\n renderPopover({ event, onClose: handleClose })\n ) : (\n <DefaultPopoverContent event={event} onClose={handleClose} />\n )}\n </PopoverContent>\n </Popover>\n );\n}\n\n// ============================================================================\n// MARQUEE ANIMATION CSS INJECTION\n// ============================================================================\n\n// Inject marquee animation CSS into document head (runs once)\nif (\n typeof window !== \"undefined\" &&\n !document.getElementById(\"inno-calendar-event-marquee-style\")\n) {\n const style = document.createElement(\"style\");\n style.id = \"inno-calendar-event-marquee-style\";\n style.innerHTML = `\n@keyframes event-marquee {\n 0% { transform: translateX(0); }\n 100% { transform: translateX(-50%); }\n}\n.event-marquee {\n animation: event-marquee 28s linear infinite;\n will-change: transform;\n}\n`;\n document.head.appendChild(style);\n}\n\nexport default EventCard;\n","/**\n * Copyright 2022 Joe Bell. All rights reserved.\n *\n * This file is licensed to you under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR REPRESENTATIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */ import { clsx } from \"clsx\";\nconst falsyToString = (value)=>typeof value === \"boolean\" ? `${value}` : value === 0 ? \"0\" : value;\nexport const cx = clsx;\nexport const cva = (base, config)=>(props)=>{\n var _config_compoundVariants;\n if ((config === null || config === void 0 ? void 0 : config.variants) == null) return cx(base, props === null || props === void 0 ? void 0 : props.class, props === null || props === void 0 ? void 0 : props.className);\n const { variants, defaultVariants } = config;\n const getVariantClassNames = Object.keys(variants).map((variant)=>{\n const variantProp = props === null || props === void 0 ? void 0 : props[variant];\n const defaultVariantProp = defaultVariants === null || defaultVariants === void 0 ? void 0 : defaultVariants[variant];\n if (variantProp === null) return null;\n const variantKey = falsyToString(variantProp) || falsyToString(defaultVariantProp);\n return variants[variant][variantKey];\n });\n const propsWithoutUndefined = props && Object.entries(props).reduce((acc, param)=>{\n let [key, value] = param;\n if (value === undefined) {\n return acc;\n }\n acc[key] = value;\n return acc;\n }, {});\n const getCompoundVariantClassNames = config === null || config === void 0 ? void 0 : (_config_compoundVariants = config.compoundVariants) === null || _config_compoundVariants === void 0 ? void 0 : _config_compoundVariants.reduce((acc, param)=>{\n let { class: cvClass, className: cvClassName, ...compoundVariantOptions } = param;\n return Object.entries(compoundVariantOptions).every((param)=>{\n let [key, value] = param;\n return Array.isArray(value) ? value.includes({\n ...defaultVariants,\n ...propsWithoutUndefined\n }[key]) : ({\n ...defaultVariants,\n ...propsWithoutUndefined\n })[key] === value;\n }) ? [\n ...acc,\n cvClass,\n cvClassName\n ] : acc;\n }, []);\n return cx(base, getVariantClassNames, getCompoundVariantClassNames, props === null || props === void 0 ? void 0 : props.class, props === null || props === void 0 ? void 0 : props.className);\n };\n\n","/**\n * Button Component\n *\n * A versatile button component with multiple variants and sizes.\n * Built with class-variance-authority for type-safe variants.\n */\n\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { type ButtonHTMLAttributes, forwardRef } from 'react';\nimport { cn } from '../../lib/utils';\n\n// ============================================================================\n// VARIANTS\n// ============================================================================\n\nconst buttonVariants = cva(\n\t'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0',\n\t{\n\t\tvariants: {\n\t\t\tvariant: {\n\t\t\t\tdefault: 'bg-primary text-primary-foreground shadow hover:bg-primary/90',\n\t\t\t\tdestructive: 'bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90',\n\t\t\t\toutline:\n\t\t\t\t\t'border border-input active:!bg-zinc-100 hover:!bg-zinc-50 active:bg-white !bg-white hover:bg-accent hover:text-accent-foreground',\n\t\t\t\tsecondary: 'bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80',\n\t\t\t\tghost: 'hover:bg-accent hover:text-accent-foreground',\n\t\t\t\tlink: 'text-primary underline-offset-4 hover:underline',\n\t\t\t},\n\t\t\tsize: {\n\t\t\t\tdefault: 'h-9 px-4 py-2',\n\t\t\t\tsm: 'h-8 rounded-md px-3 text-xs',\n\t\t\t\tlg: 'h-10 rounded-md px-8',\n\t\t\t\ticon: 'h-9 w-9',\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tvariant: 'default',\n\t\t\tsize: 'default',\n\t\t},\n\t}\n);\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface ButtonProps\n\textends ButtonHTMLAttributes<HTMLButtonElement>,\n\t\tVariantProps<typeof buttonVariants> {\n\t/** Loading state - disables button and shows spinner */\n\tloading?: boolean;\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nconst Button = forwardRef<HTMLButtonElement, ButtonProps>(\n\t({ className, variant, size, loading, disabled, children, ...props }, ref) => {\n\t\treturn (\n\t\t\t<button\n\t\t\t\tclassName={cn(buttonVariants({ variant, size, className }))}\n\t\t\t\tref={ref}\n\t\t\t\tdisabled={disabled || loading}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{loading && (\n\t\t\t\t\t<svg\n\t\t\t\t\t\tclassName=\"animate-spin -ml-1 mr-2 size-4\"\n\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<circle\n\t\t\t\t\t\t\tclassName=\"opacity-25\"\n\t\t\t\t\t\t\tcx=\"12\"\n\t\t\t\t\t\t\tcy=\"12\"\n\t\t\t\t\t\t\tr=\"10\"\n\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\tstrokeWidth=\"4\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<path\n\t\t\t\t\t\t\tclassName=\"opacity-75\"\n\t\t\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\t\t\td=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</svg>\n\t\t\t\t)}\n\t\t\t\t{children}\n\t\t\t</button>\n\t\t);\n\t}\n);\n\nButton.displayName = 'Button';\n\nexport { Button, buttonVariants };\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\n\nexport { mergeClasses };\n//# sourceMappingURL=mergeClasses.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\n\nexport { toKebabCase };\n//# sourceMappingURL=toKebabCase.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toCamelCase = (string) => string.replace(\n /^([A-Z])|[\\s-_]+(\\w)/g,\n (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()\n);\n\nexport { toCamelCase };\n//# sourceMappingURL=toCamelCase.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { toCamelCase } from './toCamelCase.js';\n\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\n\nexport { toPascalCase };\n//# sourceMappingURL=toPascalCase.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst hasA11yProp = (props) => {\n for (const prop in props) {\n if (prop.startsWith(\"aria-\") || prop === \"role\" || prop === \"title\") {\n return true;\n }\n }\n return false;\n};\n\nexport { hasA11yProp };\n//# sourceMappingURL=hasA11yProp.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.js';\nimport { hasA11yProp } from './shared/src/utils/hasA11yProp.js';\nimport { mergeClasses } from './shared/src/utils/mergeClasses.js';\n\nconst Icon = forwardRef(\n ({\n color = \"currentColor\",\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = \"\",\n children,\n iconNode,\n ...rest\n }, ref) => createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,\n className: mergeClasses(\"lucide\", className),\n ...!children && !hasA11yProp(rest) && { \"aria-hidden\": \"true\" },\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n )\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses } from './shared/src/utils/mergeClasses.js';\nimport { toKebabCase } from './shared/src/utils/toKebabCase.js';\nimport { toPascalCase } from './shared/src/utils/toPascalCase.js';\nimport Icon from './Icon.js';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className\n ),\n ...props\n })\n );\n Component.displayName = toPascalCase(iconName);\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"M20 6 9 17l-5-5\", key: \"1gmf2c\" }]];\nconst Check = createLucideIcon(\"check\", __iconNode);\n\nexport { __iconNode, Check as default };\n//# sourceMappingURL=check.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"m9 18 6-6-6-6\", key: \"mthhwq\" }]];\nconst ChevronRight = createLucideIcon(\"chevron-right\", __iconNode);\n\nexport { __iconNode, ChevronRight as default };\n//# sourceMappingURL=chevron-right.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }]];\nconst Circle = createLucideIcon(\"circle\", __iconNode);\n\nexport { __iconNode, Circle as default };\n//# sourceMappingURL=circle.js.map\n","/**\n * DropdownMenu Component\n *\n * A dropdown menu for displaying a list of actions or options.\n * Uses Radix UI dropdown primitives.\n */\n\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';\nimport { Check, ChevronRight, Circle } from 'lucide-react';\nimport * as React from 'react';\nimport { cn } from '../../lib/utils';\n\n// ============================================================================\n// ROOT\n// ============================================================================\n\nconst DropdownMenu = DropdownMenuPrimitive.Root;\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group;\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal;\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub;\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;\n\n// ============================================================================\n// SUB TRIGGER\n// ============================================================================\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n\tReact.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\n\tReact.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\n\t\tinset?: boolean;\n\t}\n>(({ className, inset, children, ...props }, ref) => (\n\t<DropdownMenuPrimitive.SubTrigger\n\t\tref={ref}\n\t\tclassName={cn(\n\t\t\t'flex cursor-default select-none items-center rounded-lg px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent',\n\t\t\tinset && 'pl-8',\n\t\t\tclassName\n\t\t)}\n\t\t{...props}\n\t>\n\t\t{children}\n\t\t<ChevronRight className=\"ml-auto h-4 w-4\" />\n\t</DropdownMenuPrimitive.SubTrigger>\n));\nDropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName;\n\n// ============================================================================\n// SUB CONTENT\n// ============================================================================\n\nconst DropdownMenuSubContent = React.forwardRef<\n\tReact.ElementRef<typeof DropdownMenuPrimitive.SubContent>,\n\tReact.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n\t<DropdownMenuPrimitive.SubContent\n\t\tref={ref}\n\t\tclassName={cn(\n\t\t\t'z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n\t\t\tclassName\n\t\t)}\n\t\t{...props}\n\t/>\n));\nDropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName;\n\n// ============================================================================\n// CONTENT\n// ============================================================================\n\nconst DropdownMenuContent = React.forwardRef<\n\tReact.ElementRef<typeof DropdownMenuPrimitive.Content>,\n\tReact.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n\t<DropdownMenuPrimitive.Portal>\n\t\t<DropdownMenuPrimitive.Content\n\t\t\tref={ref}\n\t\t\tsideOffset={sideOffset}\n\t\t\tclassName={cn(\n\t\t\t\t'z-50 rounded-xl border bg-popover p-1 text-popover-foreground shadow-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t</DropdownMenuPrimitive.Portal>\n));\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;\n\n// ============================================================================\n// ITEM\n// ============================================================================\n\nconst DropdownMenuItem = React.forwardRef<\n\tReact.ElementRef<typeof DropdownMenuPrimitive.Item>,\n\tReact.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\n\t\tinset?: boolean;\n\t}\n>(({ className, inset, ...props }, ref) => (\n\t<DropdownMenuPrimitive.Item\n\t\tref={ref}\n\t\tclassName={cn(\n\t\t\t'relative flex cursor-pointer select-none items-center rounded-lg px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n\t\t\tinset && 'pl-8',\n\t\t\tclassName\n\t\t)}\n\t\t{...props}\n\t/>\n));\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;\n\n// ============================================================================\n// CHECKBOX ITEM\n// ============================================================================\n\nconst DropdownMenuCheckboxItem = React.forwardRef<\n\tReact.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n\tReact.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, checked = false, ...props }, ref) => (\n\t<DropdownMenuPrimitive.CheckboxItem\n\t\tref={ref}\n\t\tclassName={cn(\n\t\t\t'relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n\t\t\tclassName\n\t\t)}\n\t\tchecked={checked}\n\t\t{...props}\n\t>\n\t\t<span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n\t\t\t<DropdownMenuPrimitive.ItemIndicator>\n\t\t\t\t<Check className=\"h-4 w-4\" />\n\t\t\t</DropdownMenuPrimitive.ItemIndicator>\n\t\t</span>\n\t\t{children}\n\t</DropdownMenuPrimitive.CheckboxItem>\n));\nDropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName;\n\n// ============================================================================\n// RADIO ITEM\n// ============================================================================\n\nconst DropdownMenuRadioItem = React.forwardRef<\n\tReact.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,\n\tReact.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n\t<DropdownMenuPrimitive.RadioItem\n\t\tref={ref}\n\t\tclassName={cn(\n\t\t\t'relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n\t\t\tclassName\n\t\t)}\n\t\t{...props}\n\t>\n\t\t<span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n\t\t\t<DropdownMenuPrimitive.ItemIndicator>\n\t\t\t\t<Circle className=\"h-2 w-2 fill-current\" />\n\t\t\t</DropdownMenuPrimitive.ItemIndicator>\n\t\t</span>\n\t\t{children}\n\t</DropdownMenuPrimitive.RadioItem>\n));\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;\n\n// ============================================================================\n// LABEL\n// ============================================================================\n\nconst DropdownMenuLabel = React.forwardRef<\n\tReact.ElementRef<typeof DropdownMenuPrimitive.Label>,\n\tReact.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\n\t\tinset?: boolean;\n\t}\n>(({ className, inset, ...props }, ref) => (\n\t<DropdownMenuPrimitive.Label\n\t\tref={ref}\n\t\tclassName={cn('px-2 py-1.5 text-sm font-semibold', inset && 'pl-8', className)}\n\t\t{...props}\n\t/>\n));\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;\n\n// ============================================================================\n// SEPARATOR\n// ============================================================================\n\nconst DropdownMenuSeparator = React.forwardRef<\n\tReact.ElementRef<typeof DropdownMenuPrimitive.Separator>,\n\tReact.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n\t<DropdownMenuPrimitive.Separator\n\t\tref={ref}\n\t\tclassName={cn('-mx-1 my-1 h-px bg-muted', className)}\n\t\t{...props}\n\t/>\n));\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName;\n\n// ============================================================================\n// SHORTCUT\n// ============================================================================\n\nconst DropdownMenuShortcut = ({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) => (\n\t<span className={cn('ml-auto text-xs tracking-widest opacity-60', className)} {...props} />\n);\nDropdownMenuShortcut.displayName = 'DropdownMenuShortcut';\n\nexport {\n\tDropdownMenu,\n\tDropdownMenuCheckboxItem,\n\tDropdownMenuContent,\n\tDropdownMenuGroup,\n\tDropdownMenuItem,\n\tDropdownMenuLabel,\n\tDropdownMenuPortal,\n\tDropdownMenuRadioGroup,\n\tDropdownMenuRadioItem,\n\tDropdownMenuSeparator,\n\tDropdownMenuShortcut,\n\tDropdownMenuSub,\n\tDropdownMenuSubContent,\n\tDropdownMenuSubTrigger,\n\tDropdownMenuTrigger,\n};\n","/**\n * Badge Component\n *\n * Displays a small badge with optional variants.\n */\n\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport type * as React from 'react';\nimport { cn } from '../../lib/utils';\n\n// ============================================================================\n// VARIANTS\n// ============================================================================\n\nconst badgeVariants = cva(\n\t'inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2',\n\t{\n\t\tvariants: {\n\t\t\tvariant: {\n\t\t\t\tdefault: 'border-transparent bg-primary text-primary-foreground hover:bg-primary/80',\n\t\t\t\tsecondary:\n\t\t\t\t\t'border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80',\n\t\t\t\tdestructive:\n\t\t\t\t\t'border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80',\n\t\t\t\toutline: 'text-foreground',\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: { variant: 'default' },\n\t}\n);\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface BadgeProps\n\textends React.HTMLAttributes<HTMLDivElement>,\n\t\tVariantProps<typeof badgeVariants> {}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nfunction Badge({ className, variant, ...props }: BadgeProps) {\n\treturn <div className={cn(badgeVariants({ variant }), className)} {...props} />;\n}\n\nexport { Badge, badgeVariants };\n","/**\n * DateNavigator - Navigation Controls with Date Range\n *\n * Shows month/year title, event count badge, and prev/next navigation.\n * Matches the production agenda-v2 implementation.\n */\n\nimport type { CalendarEvent, TCalendarView } from '../../../core/types';\nimport { getEventsCountInView, getRangeText } from '../../../core/utils/grid-utils';\nimport { cn } from '../../../lib/utils';\nimport { Badge } from '../../ui/badge';\nimport { Button } from '../../ui/button';\n\n// ============================================================================\n// ICONS (Inline SVGs for zero dependencies)\n// ============================================================================\n\nfunction ChevronLeft({ className }: { className?: string }) {\n\treturn (\n\t\t<svg\n\t\t\tclassName={className}\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\twidth=\"24\"\n\t\t\theight=\"24\"\n\t\t\tviewBox=\"0 0 24 24\"\n\t\t\tfill=\"none\"\n\t\t\tstroke=\"currentColor\"\n\t\t\tstrokeWidth=\"2\"\n\t\t\tstrokeLinecap=\"round\"\n\t\t\tstrokeLinejoin=\"round\"\n\t\t>\n\t\t\t<path d=\"m15 18-6-6 6-6\" />\n\t\t</svg>\n\t);\n}\n\nfunction ChevronRight({ className }: { className?: string }) {\n\treturn (\n\t\t<svg\n\t\t\tclassName={className}\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\twidth=\"24\"\n\t\t\theight=\"24\"\n\t\t\tviewBox=\"0 0 24 24\"\n\t\t\tfill=\"none\"\n\t\t\tstroke=\"currentColor\"\n\t\t\tstrokeWidth=\"2\"\n\t\t\tstrokeLinecap=\"round\"\n\t\t\tstrokeLinejoin=\"round\"\n\t\t>\n\t\t\t<path d=\"m9 18 6-6-6-6\" />\n\t\t</svg>\n\t);\n}\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\nconst MONTH_NAMES = [\n\t'January',\n\t'February',\n\t'March',\n\t'April',\n\t'May',\n\t'June',\n\t'July',\n\t'August',\n\t'September',\n\t'October',\n\t'November',\n\t'December',\n];\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface DateNavigatorProps<TData = Record<string, unknown>> {\n\t/** Current date */\n\tdate: Date;\n\t/** Current view */\n\tview: TCalendarView;\n\t/** Events to count */\n\tevents?: CalendarEvent<TData>[];\n\t/** Navigate to previous period */\n\tonNavigatePrev?: () => void;\n\t/** Navigate to next period */\n\tonNavigateNext?: () => void;\n\t/** Week starts on (0 = Sunday, 1 = Monday) */\n\tweekStartsOn?: 0 | 1;\n\t/** Show event count badge */\n\tshowEventCount?: boolean;\n\t/** Additional CSS classes */\n\tclassName?: string;\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport function DateNavigator<TData = Record<string, unknown>>({\n\tdate,\n\tview,\n\tevents = [],\n\tonNavigatePrev,\n\tonNavigateNext,\n\tweekStartsOn = 1,\n\tshowEventCount = true,\n\tclassName,\n}: DateNavigatorProps<TData>) {\n\tconst month = MONTH_NAMES[date.getMonth()];\n\tconst year = date.getFullYear();\n\tconst eventCount = showEventCount ? getEventsCountInView(events, date, view, weekStartsOn) : 0;\n\tconst rangeText = getRangeText(date, view);\n\n\treturn (\n\t\t<div className={cn('min-w-0 flex-1', className)}>\n\t\t\t{/* Title row with month/year and event count */}\n\t\t\t<div className=\"flex items-center gap-1.5 sm:gap-2 flex-wrap\">\n\t\t\t\t<span className=\"text-base sm:text-lg font-semibold truncate\">\n\t\t\t\t\t{month} {year}\n\t\t\t\t</span>\n\t\t\t\t{showEventCount && (\n\t\t\t\t\t<Badge variant=\"outline\" className=\"px-1 sm:px-1.5 text-[10px] sm:text-xs shrink-0\">\n\t\t\t\t\t\t{eventCount}\n\t\t\t\t\t</Badge>\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t{/* Navigation row */}\n\t\t\t<div className=\"flex items-center gap-1.5 sm:gap-2\">\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\tclassName=\"size-5 sm:size-6 [&_svg]:size-3 sm:[&_svg]:size-4\"\n\t\t\t\t\tonClick={onNavigatePrev}\n\t\t\t\t>\n\t\t\t\t\t<ChevronLeft />\n\t\t\t\t</Button>\n\n\t\t\t\t<p className=\"text-xs sm:text-sm text-muted-foreground truncate\">{rangeText}</p>\n\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\tclassName=\"size-5 sm:size-6 [&_svg]:size-3 sm:[&_svg]:size-4\"\n\t\t\t\t\tonClick={onNavigateNext}\n\t\t\t\t>\n\t\t\t\t\t<ChevronRight />\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\nexport default DateNavigator;\n","/**\n * TodayButton - Styled Calendar Icon Button\n *\n * A visual button showing today's date that navigates to today.\n * Matches the production agenda-v2 implementation.\n */\n\nimport { cn } from '../../../lib/utils';\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\nconst MONTH_NAMES = [\n\t'JAN',\n\t'FEB',\n\t'MAR',\n\t'APR',\n\t'MAY',\n\t'JUN',\n\t'JUL',\n\t'AUG',\n\t'SEP',\n\t'OCT',\n\t'NOV',\n\t'DEC',\n];\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface TodayButtonProps {\n\t/** Click handler - should navigate to today */\n\tonClick?: () => void;\n\t/** Additional CSS classes */\n\tclassName?: string;\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport function TodayButton({ onClick, className }: TodayButtonProps) {\n\tconst today = new Date();\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tclassName={cn(\n\t\t\t\t'flex size-11 sm:size-14 flex-col items-start overflow-hidden rounded-lg border shrink-0',\n\t\t\t\t'focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\n\t\t\t\t'hover:bg-accent/50 transition-colors',\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\tonClick={onClick}\n\t\t>\n\t\t\t<p className=\"flex h-4 sm:h-6 w-full items-center justify-center bg-primary text-center text-[10px] sm:text-xs font-semibold text-primary-foreground\">\n\t\t\t\t{MONTH_NAMES[today.getMonth()]}\n\t\t\t</p>\n\t\t\t<p className=\"flex w-full flex-1 items-center justify-center text-sm sm:text-lg font-bold\">\n\t\t\t\t{today.getDate()}\n\t\t\t</p>\n\t\t</button>\n\t);\n}\n\nexport default TodayButton;\n","/**\n * Calendar Header Component\n *\n * Navigation and view controls for the calendar.\n * Matches the production agenda-v2 implementation.\n *\n * Features:\n * - Styled TodayButton with calendar icon\n * - DateNavigator with event count and range text\n * - Calendar View dropdown (Day, Week, Month, Year)\n * - Timeline View dropdown (Resource views)\n * - Settings popover slot (via settingsContent prop)\n * - Filter row slot (via filterContent prop)\n * - Add event button\n */\n\nimport { type ReactNode, useMemo } from \"react\";\nimport type { CalendarEvent, TCalendarView } from \"../../core/types\";\nimport { cn } from \"../../lib/utils\";\nimport { Button } from \"../ui/button\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"../ui/dropdown-menu\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../ui/popover\";\nimport { DateNavigator } from \"./components/date-navigator\";\nimport { TodayButton } from \"./components/today-button\";\n\n// ============================================================================\n// ICONS (Inline SVGs for zero dependencies)\n// ============================================================================\n\nfunction CalendarDays({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M8 2v4\" />\n <path d=\"M16 2v4\" />\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"4\" rx=\"2\" />\n <path d=\"M3 10h18\" />\n <path d=\"M8 14h.01\" />\n <path d=\"M12 14h.01\" />\n <path d=\"M16 14h.01\" />\n <path d=\"M8 18h.01\" />\n <path d=\"M12 18h.01\" />\n <path d=\"M16 18h.01\" />\n </svg>\n );\n}\n\nfunction GanttChartSquare({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M9 8h7\" />\n <path d=\"M8 12h6\" />\n <path d=\"M11 16h5\" />\n </svg>\n );\n}\n\nfunction ChevronDown({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n );\n}\n\nfunction Settings({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n );\n}\n\nfunction Plus({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M5 12h14\" />\n <path d=\"M12 5v14\" />\n </svg>\n );\n}\n\nfunction LayoutList({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect width=\"7\" height=\"7\" x=\"3\" y=\"3\" rx=\"1\" />\n <rect width=\"7\" height=\"7\" x=\"3\" y=\"14\" rx=\"1\" />\n <path d=\"M14 4h7\" />\n <path d=\"M14 9h7\" />\n <path d=\"M14 15h7\" />\n <path d=\"M14 20h7\" />\n </svg>\n );\n}\n\nfunction Columns({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M12 3v18\" />\n </svg>\n );\n}\n\nfunction Grid2X2({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M3 12h18\" />\n <path d=\"M12 3v18\" />\n </svg>\n );\n}\n\nfunction Grid3X3({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M3 9h18\" />\n <path d=\"M3 15h18\" />\n <path d=\"M9 3v18\" />\n <path d=\"M15 3v18\" />\n </svg>\n );\n}\n\n// function ListIcon({ className }: { className?: string }) {\n// return (\n// <svg\n// className={className}\n// xmlns=\"http://www.w3.org/2000/svg\"\n// width=\"24\"\n// height=\"24\"\n// viewBox=\"0 0 24 24\"\n// fill=\"none\"\n// stroke=\"currentColor\"\n// strokeWidth=\"2\"\n// strokeLinecap=\"round\"\n// strokeLinejoin=\"round\"\n// >\n// <line x1=\"8\" x2=\"21\" y1=\"6\" y2=\"6\" />\n// <line x1=\"8\" x2=\"21\" y1=\"12\" y2=\"12\" />\n// <line x1=\"8\" x2=\"21\" y1=\"18\" y2=\"18\" />\n// <line x1=\"3\" x2=\"3.01\" y1=\"6\" y2=\"6\" />\n// <line x1=\"3\" x2=\"3.01\" y1=\"12\" y2=\"12\" />\n// <line x1=\"3\" x2=\"3.01\" y1=\"18\" y2=\"18\" />\n// </svg>\n// );\n// }\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ninterface ViewOption {\n value: TCalendarView;\n label: string;\n icon: React.ComponentType<{ className?: string }>;\n}\n\nexport interface CalendarHeaderProps<TData = Record<string, unknown>> {\n /** Current date */\n currentDate: Date;\n /** Current view */\n view: TCalendarView;\n /** Events for count display */\n events?: CalendarEvent<TData>[];\n /** Navigate to today */\n onNavigateToday?: () => void;\n /** Navigate prev */\n onNavigatePrev?: () => void;\n /** Navigate next */\n onNavigateNext?: () => void;\n /** Navigate callback (legacy) */\n onNavigate?: (direction: \"prev\" | \"next\" | \"today\") => void;\n /** View change callback */\n onViewChange?: (view: TCalendarView) => void;\n /** Add event callback */\n onAddEvent?: () => void;\n /** Available calendar views to show */\n availableViews?: TCalendarView[];\n /** Show timeline views dropdown */\n showTimelineViews?: boolean;\n /** Available timeline views */\n timelineViews?: TCalendarView[];\n /** Settings content (rendered in popover) */\n settingsContent?: ReactNode;\n /** Show settings button */\n showSettings?: boolean;\n /** Filter row content */\n filterContent?: ReactNode;\n /** Additional actions to render */\n actions?: ReactNode;\n /** Additional CSS classes */\n className?: string;\n /** Week starts on (0 = Sunday, 1 = Monday) */\n weekStartsOn?: 0 | 1;\n /** Labels for i18n */\n labels?: {\n today?: string;\n day?: string;\n week?: string;\n month?: string;\n year?: string;\n agenda?: string;\n addEvent?: string;\n calendarView?: string;\n resourceView?: string;\n };\n}\n\n// ============================================================================\n// VIEW CONFIGURATION\n// ============================================================================\n\n/** Calendar grid views */\nconst CALENDAR_VIEWS: ViewOption[] = [\n { value: \"day\", label: \"Day\", icon: LayoutList },\n { value: \"week\", label: \"Week\", icon: Columns },\n { value: \"month\", label: \"Month\", icon: Grid2X2 },\n { value: \"year\", label: \"Year\", icon: Grid3X3 },\n // { value: 'agenda', label: 'Agenda', icon: ListIcon }, NOTE: Not needed currently\n];\n\n/** Timeline/Resource views */\nconst TIMELINE_VIEWS: ViewOption[] = [\n { value: \"timeline-day\", label: \"1 Day\", icon: GanttChartSquare },\n { value: \"timeline-3day\", label: \"3 Days\", icon: GanttChartSquare },\n { value: \"timeline-week\", label: \"7 Days\", icon: GanttChartSquare },\n];\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport function CalendarHeader<TData = Record<string, unknown>>({\n currentDate,\n view,\n events = [],\n onNavigateToday,\n onNavigatePrev,\n onNavigateNext,\n onNavigate,\n onViewChange,\n onAddEvent,\n availableViews = [\"day\", \"week\", \"month\", \"agenda\"],\n showTimelineViews = false,\n timelineViews: _timelineViews,\n settingsContent,\n showSettings = false,\n filterContent,\n actions,\n className,\n weekStartsOn = 1,\n labels = {},\n}: CalendarHeaderProps<TData>) {\n // Merge labels\n const mergedLabels = useMemo(\n () => ({\n today: \"Today\",\n addEvent: \"Add Event\",\n calendarView: \"Calendar View\",\n resourceView: \"Resource View\",\n ...labels,\n }),\n [labels],\n );\n\n // Handle navigation (support both new and legacy callbacks)\n const handleToday = () => {\n onNavigateToday?.();\n onNavigate?.(\"today\");\n };\n const handlePrev = () => {\n onNavigatePrev?.();\n onNavigate?.(\"prev\");\n };\n const handleNext = () => {\n onNavigateNext?.();\n onNavigate?.(\"next\");\n };\n\n // Determine current view category\n const isCalendarView = [\"day\", \"week\", \"month\", \"year\", \"agenda\"].includes(\n view,\n );\n const isTimelineView =\n view.startsWith(\"timeline-\") || view.startsWith(\"resource-\");\n\n // Filter available views\n const calendarViewOptions = CALENDAR_VIEWS.filter((v) =>\n availableViews.includes(v.value),\n );\n\n // Get current calendar view label\n const currentCalendarView = isCalendarView\n ? calendarViewOptions.find((v) => v.value === view)\n : null;\n\n // Get current timeline view label\n const currentTimelineView = isTimelineView\n ? TIMELINE_VIEWS.find((v) => v.value === view)\n : null;\n\n return (\n <div className={cn(\"flex flex-col w-full gap-3 mb-2\", className)}>\n {/* Main header row: Today + Date + View selectors + Settings + Add */}\n <div className=\"flex lg:flex-row flex-col w-full justify-between gap-3\">\n {/* Left: Today + Date + Add button (mobile) */}\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex items-center gap-2 sm:gap-3 min-w-0\">\n <TodayButton onClick={handleToday} />\n <DateNavigator\n date={currentDate}\n view={view}\n events={events}\n onNavigatePrev={handlePrev}\n onNavigateNext={handleNext}\n weekStartsOn={weekStartsOn}\n />\n </div>\n\n {/* Add button - visible on mobile */}\n {onAddEvent && (\n <Button\n size=\"icon\"\n className=\"shrink-0 lg:hidden\"\n onClick={onAddEvent}\n >\n <Plus className=\"size-4\" />\n </Button>\n )}\n </div>\n\n {/* Right: View selectors and controls */}\n <div className=\"flex items-center gap-1.5 sm:gap-2 overflow-x-auto pb-1 -mb-1 scrollbar-none\">\n {/* Calendar View Dropdown */}\n {onViewChange && calendarViewOptions.length > 0 && (\n <DropdownMenu>\n <DropdownMenuTrigger\n className={cn(\n \"inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors\",\n \"h-10 px-2 sm:px-3 gap-1 sm:gap-1.5 shrink-0\",\n isCalendarView\n ? \"bg-primary text-primary-foreground hover:bg-primary/90\"\n : \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n )}\n >\n <CalendarDays className=\"size-4\" />\n <span className=\"text-xs sm:text-sm font-medium\">\n {currentCalendarView?.label ?? mergedLabels.calendarView}\n </span>\n <ChevronDown className=\"size-3 opacity-60\" />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"min-w-[120px]\">\n {calendarViewOptions.map((viewOption) => {\n const Icon = viewOption.icon;\n return (\n <DropdownMenuItem\n key={viewOption.value}\n onClick={() => onViewChange(viewOption.value)}\n className={cn(\n \"gap-2\",\n view === viewOption.value && \"bg-accent\",\n )}\n >\n <Icon className=\"size-4\" />\n <span>{viewOption.label}</span>\n </DropdownMenuItem>\n );\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n\n {/* Timeline View Dropdown */}\n {showTimelineViews && onViewChange && (\n <DropdownMenu>\n <DropdownMenuTrigger\n className={cn(\n \"inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors\",\n \"h-10 px-2 sm:px-3 gap-1 sm:gap-1.5 shrink-0\",\n isTimelineView\n ? \"bg-primary text-primary-foreground hover:bg-primary/90\"\n : \"border border-input bg-white hover:bg-zinc-50 hover:text-accent-foreground\",\n )}\n >\n <GanttChartSquare className=\"size-4\" />\n <span className=\"text-xs sm:text-sm font-medium\">\n {currentTimelineView?.label ?? mergedLabels.resourceView}\n </span>\n <ChevronDown className=\"size-3 opacity-60\" />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"min-w-[120px]\">\n {TIMELINE_VIEWS.map((viewOption) => {\n const Icon = viewOption.icon;\n return (\n <DropdownMenuItem\n key={viewOption.value}\n onClick={() => onViewChange(viewOption.value)}\n className={cn(\n \"gap-2\",\n view === viewOption.value && \"bg-accent\",\n )}\n >\n <Icon className=\"size-4\" />\n <span>{viewOption.label}</span>\n </DropdownMenuItem>\n );\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n\n {/* Settings popover */}\n {showSettings && settingsContent && (\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"min-w-10 min-h-10 shrink-0 mx-0\"\n >\n <Settings className=\"size-4 sm:size-5\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-auto min-w-80 p-0\"\n align=\"end\"\n sideOffset={8}\n >\n <div className=\"max-h-[70vh] overflow-y-auto p-4 space-y-6\">\n {settingsContent}\n </div>\n </PopoverContent>\n </Popover>\n )}\n\n {/* Custom actions */}\n {actions}\n\n {/* Add Event button - desktop only */}\n {onAddEvent && (\n <Button\n className=\"hidden lg:flex shrink-0 max-h-10\"\n onClick={onAddEvent}\n >\n <Plus className=\"size-4\" />\n {mergedLabels.addEvent}\n </Button>\n )}\n </div>\n </div>\n\n {/* Filter row */}\n {filterContent && (\n <div className=\"flex items-center gap-2 pb-1 -mb-1 scrollbar-none\">\n {filterContent}\n </div>\n )}\n </div>\n );\n}\n\nexport default CalendarHeader;\n","/**\n * Agenda View Component\n *\n * List view of events grouped by date.\n * Features:\n * - Chronological event list\n * - Date grouping headers\n * - Full event details\n *\n * Ported from agenda-v2 to maintain exact styling parity.\n */\n\nimport { useMemo } from 'react';\nimport type {\n CalendarEvent,\n ICalendarClassNames,\n ICalendarSlots,\n TBadgeVariant,\n TOnEventClick,\n} from '../../core/types';\nimport { isToday } from '../../core/utils/date-utils';\nimport { groupEventsByDate } from '../../core/utils/event-utils';\nimport { cn } from '../../lib/utils';\nimport { EventCard } from '../event/event-card';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface AgendaViewProps<TData = Record<string, unknown>> {\n /** Events to display */\n events: CalendarEvent<TData>[];\n /** The selected date (agenda starts from this date) */\n date: Date;\n /** Number of days to show (default: 60) */\n daysAhead?: number;\n /** Badge variant for events */\n badgeVariant?: TBadgeVariant;\n /** Event click handler */\n onEventClick?: TOnEventClick<TData>;\n /** Additional CSS classes */\n className?: string;\n /** Custom event renderer */\n renderEvent?: (props: { event: CalendarEvent<TData>; variant: 'full' }) => React.ReactNode;\n /** Custom popover content renderer */\n renderPopover?: (props: { event: CalendarEvent<TData>; onClose: () => void }) => React.ReactNode;\n /** Component slots for customization */\n slots?: ICalendarSlots<TData>;\n /** CSS class overrides for granular styling */\n classNames?: ICalendarClassNames;\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport function AgendaView<TData = Record<string, unknown>>({\n events,\n date,\n daysAhead = 60,\n badgeVariant = 'colored',\n onEventClick,\n className,\n renderEvent,\n renderPopover,\n slots: _slots,\n classNames,\n}: AgendaViewProps<TData>) {\n // Filter events starting from selected date for the next N days\n const upcomingEvents = useMemo(() => {\n // Use selected date as base if provided, otherwise today\n const baseDate = new Date(date);\n baseDate.setHours(0, 0, 0, 0);\n const endDate = new Date(baseDate);\n endDate.setDate(endDate.getDate() + daysAhead);\n\n return events.filter((event) => {\n // Include events that end after base date and start before the end date\n return event.endDate >= baseDate && event.startDate <= endDate;\n });\n }, [events, daysAhead, date]);\n\n // Group by date\n const groupedEvents = useMemo(() => {\n const map = groupEventsByDate(upcomingEvents);\n const result: { date: Date; dateKey: string; events: CalendarEvent<TData>[] }[] = [];\n for (const [dateKey, eventList] of map) {\n result.push({\n date: new Date(dateKey),\n dateKey,\n events: eventList as CalendarEvent<TData>[],\n });\n }\n // Sort by date\n result.sort((a, b) => a.date.getTime() - b.date.getTime());\n return result;\n }, [upcomingEvents]);\n\n // Empty state\n if (groupedEvents.length === 0) {\n return (\n <div className={cn('flex flex-col items-center justify-center h-full py-12', className)}>\n <div className=\"text-center\">\n <p className=\"text-muted-foreground\">No events found</p>\n <p className=\"text-sm text-muted-foreground/70\">No events scheduled for this period</p>\n </div>\n </div>\n );\n }\n\n return (\n <div className={cn('flex flex-col h-full overflow-auto', classNames?.agendaList, className)}>\n {/* Header - Clean schedule header */}\n <div className=\"sticky top-0 z-10 bg-background border-b px-4 py-3\">\n <div className=\"flex items-center justify-between\">\n <h2 className=\"text-lg font-medium\">Schedule</h2>\n <span className=\"text-sm text-muted-foreground\">\n {upcomingEvents.length} event\n {upcomingEvents.length !== 1 ? 's' : ''}\n </span>\n </div>\n </div>\n\n {/* Event groups */}\n <div className=\"flex-1\">\n {groupedEvents.map(({ date: groupDate, dateKey, events: groupEvents }) => {\n const today = isToday(groupDate);\n const dayName = groupDate.toLocaleDateString([], { weekday: 'short' });\n const dayNumber = groupDate.getDate();\n const monthName = groupDate.toLocaleDateString([], { month: 'short' });\n\n return (\n <div key={dateKey} className={cn('', classNames?.agendaDayGroup)}>\n {/* Date header - Google Calendar style */}\n <div\n className={cn(\n 'sticky top-[52px] z-10 bg-background px-4 py-3 border-b',\n classNames?.agendaDayHeader\n )}\n >\n <div className=\"flex items-center gap-3\">\n {/* Day column with stacked name + circled date */}\n <div className=\"flex flex-col items-center min-w-[40px]\">\n <span\n className={cn(\n 'text-[11px] font-medium uppercase tracking-wide',\n today ? 'text-primary' : 'text-muted-foreground'\n )}\n >\n {dayName}\n </span>\n <span\n className={cn(\n 'flex items-center justify-center rounded-full mt-0.5',\n 'size-10 text-xl font-normal',\n today ? 'bg-primary text-primary-foreground' : 'text-foreground'\n )}\n >\n {dayNumber}\n </span>\n </div>\n {/* Month indicator for first day or month change */}\n <span className=\"text-sm text-muted-foreground\">\n {monthName} {groupDate.getFullYear()}\n </span>\n </div>\n </div>\n\n {/* Events for this date */}\n <div className=\"px-4 py-3 space-y-2 border-b last:border-b-0\">\n {groupEvents.map((event) =>\n renderEvent ? (\n <div key={event.id}>{renderEvent({ event, variant: 'full' })}</div>\n ) : (\n <EventCard\n key={event.id}\n event={event}\n variant=\"full\"\n badgeVariant={badgeVariant}\n onClick={onEventClick}\n disablePopover={!!onEventClick && !renderPopover}\n renderPopover={renderPopover}\n showTime\n showDescription\n showParticipants\n {...(classNames?.eventCard && { className: classNames.eventCard })}\n />\n )\n )}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\nexport default AgendaView;\n","/**\r\n * Day Events Expansion Overlay\r\n *\r\n * A morphing overlay that expands from a month-view day cell to reveal\r\n * all events for that day. Provides a smooth, professional alternative\r\n * to the simple popover when clicking \"+N more\" in month view.\r\n *\r\n * ## How it works\r\n *\r\n * 1. User clicks \"+N more\" in a month cell\r\n * 2. The cell's bounding rect is captured\r\n * 3. A fixed overlay appears at the cell's exact position/size\r\n * 4. CSS transitions smoothly expand it to a larger dialog-like panel\r\n * 5. All day events are shown inside with full detail\r\n * 6. On close, the overlay morphs back to the cell and fades out\r\n *\r\n * ## Usage\r\n *\r\n * ```tsx\r\n * <DayEventsExpansion\r\n * isOpen={isOpen}\r\n * onClose={() => setIsOpen(false)}\r\n * date={selectedDate}\r\n * events={dayEvents}\r\n * anchorRect={cellRect}\r\n * />\r\n * ```\r\n *\r\n * @module\r\n */\r\n\r\nimport {\r\n type ReactNode,\r\n useCallback,\r\n useEffect,\r\n useLayoutEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n} from 'react';\r\nimport type { CalendarEvent, TBadgeVariant, TOnEventClick } from '../../core/types';\r\nimport { cn } from '../../lib/utils';\r\nimport { EventCard } from '../event/event-card';\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\n/**\r\n * Props for the {@link DayEventsExpansion} overlay component.\r\n *\r\n * @template TData - Custom event data type\r\n *\r\n * @example\r\n * ```tsx\r\n * <DayEventsExpansion\r\n * isOpen={expandedDay !== null}\r\n * onClose={() => setExpandedDay(null)}\r\n * date={expandedDate}\r\n * events={dayEvents}\r\n * anchorRect={cellRect}\r\n * badgeVariant=\"colored\"\r\n * onEventClick={(e) => openDetail(e)}\r\n * />\r\n * ```\r\n */\r\nexport interface DayEventsExpansionProps<TData = Record<string, unknown>> {\r\n /** Whether the expansion overlay is visible */\r\n isOpen: boolean;\r\n /** Called when the overlay should close (Escape, backdrop click, close button) */\r\n onClose: () => void;\r\n /** The date whose events are being shown */\r\n date: Date;\r\n /** All events for this day */\r\n events: CalendarEvent<TData>[];\r\n /** Bounding rect of the source day cell (used as animation origin) */\r\n anchorRect: DOMRect | null;\r\n /** Badge variant for event cards. @default 'colored' */\r\n badgeVariant?: TBadgeVariant;\r\n /** Event click handler */\r\n onEventClick?: TOnEventClick<TData> | undefined;\r\n /** Custom event renderer */\r\n renderEvent?: ((props: { event: CalendarEvent<TData>; variant: 'compact' }) => ReactNode) | undefined;\r\n /** Custom popover content renderer */\r\n renderPopover?: ((props: { event: CalendarEvent<TData>; onClose: () => void }) => ReactNode) | undefined;\r\n /** Additional CSS classes for the overlay panel */\r\n className?: string;\r\n}\r\n\r\n// ============================================================================\r\n// CONSTANTS\r\n// ============================================================================\r\n\r\n/** Width of the expanded panel */\r\nconst PANEL_WIDTH = 360;\r\n/** Maximum height of the expanded panel */\r\nconst PANEL_MAX_HEIGHT = 480;\r\n/** Duration of the morph animation in ms */\r\nconst ANIMATION_DURATION = 280;\r\n\r\n// ============================================================================\r\n// COMPONENT\r\n// ============================================================================\r\n\r\nexport function DayEventsExpansion<TData = Record<string, unknown>>({\r\n isOpen,\r\n onClose,\r\n date,\r\n events,\r\n anchorRect,\r\n badgeVariant = 'colored',\r\n onEventClick,\r\n renderEvent,\r\n renderPopover,\r\n className,\r\n}: DayEventsExpansionProps<TData>) {\r\n const overlayRef = useRef<HTMLDivElement>(null);\r\n const panelRef = useRef<HTMLDivElement>(null);\r\n const [phase, setPhase] = useState<'closed' | 'entering' | 'open' | 'exiting'>('closed');\r\n\r\n // Sort events by start time\r\n const sortedEvents = useMemo(\r\n () => [...events].sort((a, b) => a.startDate.getTime() - b.startDate.getTime()),\r\n [events],\r\n );\r\n\r\n // Calculate the expanded panel position (centered around the anchor, clamped to viewport)\r\n const expandedPosition = useMemo(() => {\r\n if (!anchorRect) return { top: 0, left: 0, width: PANEL_WIDTH, maxHeight: PANEL_MAX_HEIGHT };\r\n\r\n const viewportWidth = typeof window !== 'undefined' ? window.innerWidth : 1200;\r\n const viewportHeight = typeof window !== 'undefined' ? window.innerHeight : 800;\r\n\r\n // Center horizontally relative to anchor\r\n let left = anchorRect.left + anchorRect.width / 2 - PANEL_WIDTH / 2;\r\n // Clamp to viewport with 16px padding\r\n left = Math.max(16, Math.min(left, viewportWidth - PANEL_WIDTH - 16));\r\n\r\n // Position vertically: try to center on anchor, but prefer below if space allows\r\n const naturalHeight = Math.min(events.length * 68 + 80, PANEL_MAX_HEIGHT);\r\n let top = anchorRect.top + anchorRect.height / 2 - naturalHeight / 2;\r\n // Clamp to viewport with 16px padding\r\n top = Math.max(16, Math.min(top, viewportHeight - naturalHeight - 16));\r\n\r\n return { top, left, width: PANEL_WIDTH, maxHeight: PANEL_MAX_HEIGHT };\r\n }, [anchorRect, events.length]);\r\n\r\n // Handle open/close transitions\r\n useLayoutEffect(() => {\r\n if (isOpen && anchorRect) {\r\n setPhase('entering');\r\n // Trigger expansion on next frame for CSS transition\r\n requestAnimationFrame(() => {\r\n requestAnimationFrame(() => {\r\n setPhase('open');\r\n });\r\n });\r\n } else if (!isOpen && phase === 'open') {\r\n setPhase('exiting');\r\n const timer = setTimeout(() => {\r\n setPhase('closed');\r\n }, ANIMATION_DURATION);\r\n return () => clearTimeout(timer);\r\n }\r\n }, [isOpen, anchorRect]);\r\n\r\n // Keyboard: Escape to close\r\n useEffect(() => {\r\n if (phase === 'closed') return;\r\n const handleKeyDown = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape') {\r\n e.stopPropagation();\r\n onClose();\r\n }\r\n };\r\n document.addEventListener('keydown', handleKeyDown);\r\n return () => document.removeEventListener('keydown', handleKeyDown);\r\n }, [phase, onClose]);\r\n\r\n // Focus trap: focus the panel when open\r\n useEffect(() => {\r\n if (phase === 'open' && panelRef.current) {\r\n panelRef.current.focus();\r\n }\r\n }, [phase]);\r\n\r\n // Handle backdrop click\r\n const handleBackdropClick = useCallback(\r\n (e: React.MouseEvent) => {\r\n if (e.target === overlayRef.current) {\r\n onClose();\r\n }\r\n },\r\n [onClose],\r\n );\r\n\r\n // Don't render anything when fully closed\r\n if (phase === 'closed') return null;\r\n\r\n // Compute styles for the morph effect\r\n const isCollapsed = phase === 'entering' || phase === 'exiting';\r\n\r\n const panelStyle: React.CSSProperties = isCollapsed && anchorRect\r\n ? {\r\n // Collapsed state: match the day cell exactly\r\n position: 'fixed',\r\n top: anchorRect.top,\r\n left: anchorRect.left,\r\n width: anchorRect.width,\r\n height: anchorRect.height,\r\n maxHeight: anchorRect.height,\r\n opacity: phase === 'entering' ? 0.7 : 0,\r\n transform: 'scale(1)',\r\n borderRadius: '8px',\r\n }\r\n : {\r\n // Expanded state: full panel\r\n position: 'fixed',\r\n top: expandedPosition.top,\r\n left: expandedPosition.left,\r\n width: expandedPosition.width,\r\n maxHeight: expandedPosition.maxHeight,\r\n opacity: 1,\r\n transform: 'scale(1)',\r\n borderRadius: '12px',\r\n };\r\n\r\n const backdropOpacity = isCollapsed ? 0 : 1;\r\n\r\n // Format the date for the header\r\n const dateStr = date.toLocaleDateString(undefined, {\r\n weekday: 'long',\r\n month: 'long',\r\n day: 'numeric',\r\n });\r\n\r\n return (\r\n <>\r\n {/* Backdrop */}\r\n <div\r\n ref={overlayRef}\r\n role=\"presentation\"\r\n onClick={handleBackdropClick}\r\n className=\"ic-expansion-backdrop\"\r\n style={{\r\n position: 'fixed',\r\n inset: 0,\r\n zIndex: 50,\r\n backgroundColor: 'rgba(0, 0, 0, 0.2)',\r\n opacity: backdropOpacity,\r\n transition: `opacity ${ANIMATION_DURATION}ms cubic-bezier(0.32, 0.72, 0, 1)`,\r\n }}\r\n />\r\n\r\n {/* Expansion panel */}\r\n <div\r\n ref={panelRef}\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n aria-label={`Events for ${dateStr}`}\r\n tabIndex={-1}\r\n className={cn(\r\n 'ic-expansion-panel',\r\n 'bg-background border border-border shadow-2xl overflow-hidden',\r\n 'focus:outline-none',\r\n className,\r\n )}\r\n style={{\r\n ...panelStyle,\r\n zIndex: 51,\r\n transition: `all ${ANIMATION_DURATION}ms cubic-bezier(0.32, 0.72, 0, 1)`,\r\n willChange: 'top, left, width, height, max-height, opacity, border-radius',\r\n }}\r\n >\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between px-4 py-3 border-b bg-muted/30\">\r\n <div className=\"flex flex-col\">\r\n <span className=\"text-sm font-semibold text-foreground\">{dateStr}</span>\r\n <span className=\"text-xs text-muted-foreground\">\r\n {events.length} event{events.length !== 1 ? 's' : ''}\r\n </span>\r\n </div>\r\n <button\r\n type=\"button\"\r\n onClick={onClose}\r\n className=\"flex items-center justify-center size-7 rounded-full hover:bg-muted transition-colors text-muted-foreground hover:text-foreground\"\r\n aria-label=\"Close\"\r\n >\r\n <svg\r\n width=\"14\"\r\n height=\"14\"\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=\"M18 6 6 18\" />\r\n <path d=\"m6 6 12 12\" />\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n {/* Events list */}\r\n <div\r\n className=\"overflow-y-auto px-3 py-2 space-y-1.5\"\r\n style={{ maxHeight: `${PANEL_MAX_HEIGHT - 64}px` }}\r\n >\r\n {sortedEvents.map((event) => (\r\n <div\r\n key={event.id}\r\n onPointerDown={(e) => e.stopPropagation()}\r\n >\r\n {renderEvent ? (\r\n renderEvent({ event, variant: 'compact' })\r\n ) : (\r\n <EventCard\r\n event={event}\r\n variant=\"compact\"\r\n badgeVariant={badgeVariant}\r\n onClick={(e) => {\r\n onClose();\r\n onEventClick?.(e);\r\n }}\r\n disablePopover={!!onEventClick && !renderPopover}\r\n renderPopover={renderPopover}\r\n showTime\r\n />\r\n )}\r\n </div>\r\n ))}\r\n\r\n {events.length === 0 && (\r\n <div className=\"py-6 text-center text-sm text-muted-foreground\">\r\n No events\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </>\r\n );\r\n}\r\n\r\nexport default DayEventsExpansion;\r\n","/**\n * Multi-Day Event Banner\n *\n * Displays multi-day and all-day events in a banner above the time grid.\n * Used in Day view (week view uses {@link WeekAllDayRow} for column-aligned layout).\n *\n * Each event pill supports Radix UI `Popover` (or `Tooltip` when popover\n * is disabled), matching the interaction model of `EventBlock`.\n *\n * All-day events are shown with an \"All day\" badge instead of confusing\n * time indicators. Multi-day events show directional arrows (→) to\n * indicate continuation.\n */\n\nimport { type ReactNode, useCallback, useState } from 'react';\nimport type { CalendarEvent, TOnEventClick } from '../../core/types';\nimport { detectAllDayEvent, isSameDay } from '../../core/utils/date-utils';\nimport { formatEventTimeDisplay } from '../../core/utils/event-utils';\nimport { cn } from '../../lib/utils';\nimport { getEventColorClasses } from '../event/event-card';\nimport { Popover, PopoverContent, PopoverTrigger } from '../ui/popover';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '../ui/tooltip';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface MultiDayBannerProps<TData = Record<string, unknown>> {\n\t/** Multi-day events to display */\n\tevents: CalendarEvent<TData>[];\n\t/** Reference date (for determining start/end indicators) */\n\tdate: Date;\n\t/** Click handler (fires only when popover is disabled) */\n\tonEventClick?: TOnEventClick<TData> | undefined;\n\t/**\n\t * When `true`, clicking opens no built-in popover — instead `onEventClick`\n\t * fires directly. @default false\n\t */\n\tdisablePopover?: boolean;\n\t/**\n\t * Custom popover content rendered inside the built-in Radix popover.\n\t * When omitted a lightweight default popover is shown.\n\t */\n\trenderPopover?: ((props: {\n\t\tevent: CalendarEvent<TData>;\n\t\tonClose: () => void;\n\t}) => ReactNode) | undefined;\n\t/** Additional CSS classes */\n\tclassName?: string;\n}\n\n// ============================================================================\n// BANNER EVENT PILL (with Popover / Tooltip support)\n// ============================================================================\n\ninterface BannerEventPillProps<TData> {\n\tevent: CalendarEvent<TData>;\n\tdate: Date;\n\tonEventClick: TOnEventClick<TData> | undefined;\n\tdisablePopover: boolean;\n\trenderPopover: ((props: {\n\t\tevent: CalendarEvent<TData>;\n\t\tonClose: () => void;\n\t}) => ReactNode) | undefined;\n}\n\nfunction BannerEventPill<TData>({\n\tevent,\n\tdate,\n\tonEventClick,\n\tdisablePopover,\n\trenderPopover,\n}: BannerEventPillProps<TData>) {\n\tconst [popoverOpen, setPopoverOpen] = useState(false);\n\tconst colors = getEventColorClasses(event.color);\n\tconst isAllDay = detectAllDayEvent(event);\n\tconst isStart = isSameDay(event.startDate, date);\n\tconst isEnd = isSameDay(event.endDate, date);\n\tconst isSingleDayAllDay = isAllDay && isSameDay(event.startDate, event.endDate);\n\n\tconst handleClick = useCallback(() => {\n\t\tif (disablePopover && onEventClick) {\n\t\t\tonEventClick(event);\n\t\t} else if (!disablePopover) {\n\t\t\tsetPopoverOpen(true);\n\t\t}\n\t}, [disablePopover, onEventClick, event]);\n\n\tconst handleClose = useCallback(() => {\n\t\tsetPopoverOpen(false);\n\t}, []);\n\n\tconst pillButton = (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonClick={handleClick}\n\t\t\ttitle={formatEventTimeDisplay(event)}\n\t\t\tclassName={cn(\n\t\t\t\t'inline-flex items-center gap-1 rounded px-1.5 py-0.5 text-[10px] font-medium transition-opacity hover:opacity-80',\n\t\t\t\t'sm:px-2 sm:py-1 sm:text-xs',\n\t\t\t\tcolors.bg,\n\t\t\t\tcolors.text,\n\t\t\t\tevent.isCanceled && 'opacity-60 line-through',\n\t\t\t)}\n\t\t>\n\t\t\t{!isSingleDayAllDay && isStart && !isEnd && '→ '}\n\t\t\t{!isSingleDayAllDay && !isStart && isEnd && ' ←'}\n\t\t\t{!isSingleDayAllDay && !isStart && !isEnd && '↔ '}\n\t\t\t<span className=\"truncate max-w-24 sm:max-w-32\">{event.title}</span>\n\t\t\t{isSingleDayAllDay && (\n\t\t\t\t<span className=\"text-[9px] opacity-70 sm:text-[10px]\">All day</span>\n\t\t\t)}\n\t\t</button>\n\t);\n\n\tconst tooltipContent = (\n\t\t<TooltipContent>\n\t\t\t<div className=\"flex flex-col gap-0.5\">\n\t\t\t\t<div className=\"font-medium\">{event.title}</div>\n\t\t\t\t<div className=\"text-xs text-muted-foreground tabular-nums\">\n\t\t\t\t\t{formatEventTimeDisplay(event)}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</TooltipContent>\n\t);\n\n\tif (disablePopover) {\n\t\treturn (\n\t\t\t<Tooltip>\n\t\t\t\t<TooltipTrigger asChild>{pillButton}</TooltipTrigger>\n\t\t\t\t{tooltipContent}\n\t\t\t</Tooltip>\n\t\t);\n\t}\n\n\treturn (\n\t\t<Popover open={popoverOpen} onOpenChange={setPopoverOpen}>\n\t\t\t<PopoverTrigger asChild>{pillButton}</PopoverTrigger>\n\t\t\t<PopoverContent className=\"w-80\">\n\t\t\t\t{renderPopover ? (\n\t\t\t\t\trenderPopover({ event, onClose: handleClose })\n\t\t\t\t) : (\n\t\t\t\t\t<BannerDefaultPopoverContent event={event} onClose={handleClose} />\n\t\t\t\t)}\n\t\t\t</PopoverContent>\n\t\t</Popover>\n\t);\n}\n\n// ============================================================================\n// DEFAULT POPOVER CONTENT (lightweight fallback)\n// ============================================================================\n\nfunction BannerDefaultPopoverContent<TData>({\n\tevent,\n\tonClose,\n}: {\n\tevent: CalendarEvent<TData>;\n\tonClose: () => void;\n}) {\n\tconst colors = getEventColorClasses(event.color);\n\tconst isCanceled = event.isCanceled ?? false;\n\n\treturn (\n\t\t<div className=\"space-y-3\">\n\t\t\t<div className=\"flex items-start gap-3\">\n\t\t\t\t<div className={cn('size-4 rounded shrink-0 mt-0.5', colors.dot)} />\n\t\t\t\t<div className=\"flex-1 min-w-0\">\n\t\t\t\t\t<h3 className={cn('font-semibold text-lg', isCanceled && 'line-through opacity-50')}>\n\t\t\t\t\t\t{event.title}\n\t\t\t\t\t</h3>\n\t\t\t\t\t<div className=\"flex items-center gap-1 text-sm text-muted-foreground mt-1 tabular-nums\">\n\t\t\t\t\t\t{formatEventTimeDisplay(event)}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{event.description && (\n\t\t\t\t<p className=\"text-sm text-muted-foreground\">{event.description}</p>\n\t\t\t)}\n\n\t\t\t<div className=\"flex flex-wrap gap-1.5\">\n\t\t\t\t{event.isAllDay && (\n\t\t\t\t\t<span className=\"text-xs bg-muted px-2 py-0.5 rounded-full font-medium\">All day</span>\n\t\t\t\t)}\n\t\t\t\t{isCanceled && (\n\t\t\t\t\t<span className=\"text-xs bg-red-100 dark:bg-red-950/30 text-red-700 dark:text-red-300 px-2 py-0.5 rounded-full font-medium\">\n\t\t\t\t\t\tCanceled\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t<div className=\"flex justify-end pt-2 border-t\">\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={onClose}\n\t\t\t\t\tclassName=\"text-xs text-muted-foreground hover:text-foreground px-3 py-1.5 rounded-md hover:bg-muted transition-colors\"\n\t\t\t\t>\n\t\t\t\t\tClose\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport function MultiDayBanner<TData = Record<string, unknown>>({\n\tevents,\n\tdate,\n\tonEventClick,\n\tdisablePopover = false,\n\trenderPopover,\n\tclassName,\n}: MultiDayBannerProps<TData>) {\n\tif (events.length === 0) return null;\n\n\t// Separate all-day from multi-day events for distinct labeling\n\tconst hasAllDay = events.some((e) => detectAllDayEvent(e) && isSameDay(e.startDate, e.endDate));\n\tconst hasMultiDay = events.some(\n\t\t(e) => !isSameDay(e.startDate, e.endDate) || (detectAllDayEvent(e) && !isSameDay(e.startDate, e.endDate)),\n\t);\n\n\tconst label = hasAllDay && hasMultiDay\n\t\t? 'All day / Multi-day'\n\t\t: hasAllDay\n\t\t\t? 'All day'\n\t\t\t: 'Multi-day';\n\n\treturn (\n\t\t<div className={cn('border-b bg-muted/20 px-2 py-1.5 space-y-1', 'sm:px-4 sm:py-2', className)}>\n\t\t\t{/* Label */}\n\t\t\t<span className=\"text-[10px] font-medium text-muted-foreground sm:text-xs\">\n\t\t\t\t{label}\n\t\t\t</span>\n\n\t\t\t{/* Events */}\n\t\t\t<div className=\"flex flex-wrap gap-1\">\n\t\t\t\t{events.map((event) => (\n\t\t\t\t\t<BannerEventPill\n\t\t\t\t\t\tkey={event.id}\n\t\t\t\t\t\tevent={event}\n\t\t\t\t\t\tdate={date}\n\t\t\t\t\t\tonEventClick={onEventClick}\n\t\t\t\t\t\tdisablePopover={disablePopover}\n\t\t\t\t\t\trenderPopover={renderPopover}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\nexport default MultiDayBanner;\n","/**\n * Selectable Slot Component\n *\n * A unified component for handling slot interactions in calendar views.\n * Supports:\n * - Single click (quick event creation)\n * - Click and drag (range selection)\n * - Touch support for mobile\n * - Visual feedback during selection\n * - Drag & drop receiving for event repositioning\n *\n * This component consolidates the interaction logic that was previously\n * scattered across different view components.\n */\n\nimport { type ReactNode, useCallback, useEffect, useRef, useState } from 'react';\nimport { useOptionalDragDrop } from '../../core/context';\nimport type { ITimeSlot } from '../../core/types';\nimport { cn } from '../../lib/utils';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface SelectableSlotProps {\n\t/** The time slot this component represents */\n\tslot: ITimeSlot;\n\t/** Called when selection starts on this slot */\n\tonSelectionStart?: (slot: ITimeSlot) => void;\n\t/** Called when pointer moves over this slot during selection */\n\tonSelectionMove?: (slot: ITimeSlot) => void;\n\t/** Called when selection ends on this slot */\n\tonSelectionEnd?: () => void;\n\t/** Whether this slot is currently in the selection range */\n\tisSelected?: boolean;\n\t/** Whether a selection is in progress (for hover effects) */\n\tisSelecting?: boolean;\n\t/** Whether this slot is disabled (non-working hours) */\n\tdisabled?: boolean;\n\t/** Accessibility label */\n\tariaLabel?: string;\n\t/** Child content */\n\tchildren?: ReactNode;\n\t/** Additional classes */\n\tclassName?: string;\n\t/** Height of the slot (for time grid positioning) */\n\theight?: string | number;\n\t/** Inline style for positioning */\n\tstyle?: React.CSSProperties;\n\t/** Custom data attributes */\n\tdataAttributes?: Record<string, string>;\n}\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\n/** Minimum drag distance to differentiate from click (in pixels) */\nconst DRAG_THRESHOLD = 5;\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport function SelectableSlot({\n\tslot,\n\tonSelectionStart,\n\tonSelectionMove,\n\tonSelectionEnd,\n\tisSelected = false,\n\tisSelecting = false,\n\tdisabled = false,\n\tariaLabel,\n\tchildren,\n\tclassName,\n\theight,\n\tstyle,\n\tdataAttributes,\n}: SelectableSlotProps) {\n\t// Track if this is a drag or click\n\tconst startPositionRef = useRef<{ x: number; y: number } | null>(null);\n\tconst isDraggingRef = useRef(false);\n\tconst isMouseDownRef = useRef(false);\n\tconst buttonRef = useRef<HTMLButtonElement>(null);\n\tconst [isDragOver, setIsDragOver] = useState(false);\n\n\t// Get drag-drop context for receiving dropped events\n\tconst dragDrop = useOptionalDragDrop();\n\n\t// Handle pointer down (mouse or touch)\n\tconst handlePointerDown = useCallback(\n\t\t(e: React.PointerEvent) => {\n\t\t\tif (disabled) return;\n\n\t\t\t// Only handle primary button (left click) or touch\n\t\t\tif (e.button !== 0 && e.pointerType === 'mouse') return;\n\n\t\t\t// Prevent text selection during drag\n\t\t\te.preventDefault();\n\n\t\t\t// Store start position for drag detection\n\t\t\tstartPositionRef.current = { x: e.clientX, y: e.clientY };\n\t\t\tisDraggingRef.current = false;\n\t\t\tisMouseDownRef.current = true;\n\n\t\t\t// Start selection\n\t\t\tonSelectionStart?.(slot);\n\t\t},\n\t\t[disabled, slot, onSelectionStart]\n\t);\n\n\t// Handle pointer move - check for drag threshold\n\tconst handlePointerMove = useCallback(\n\t\t(e: React.PointerEvent) => {\n\t\t\tif (!(startPositionRef.current && isMouseDownRef.current && !disabled)) return;\n\n\t\t\t// Check if we've moved enough to be a drag\n\t\t\tconst dx = e.clientX - startPositionRef.current.x;\n\t\t\tconst dy = e.clientY - startPositionRef.current.y;\n\t\t\tconst distance = Math.sqrt(dx * dx + dy * dy);\n\n\t\t\tif (distance >= DRAG_THRESHOLD) {\n\t\t\t\tisDraggingRef.current = true;\n\t\t\t}\n\t\t},\n\t\t[disabled]\n\t);\n\n\t// Handle pointer enter - key for multi-cell selection\n\tconst handlePointerEnter = useCallback(\n\t\t(e: React.PointerEvent) => {\n\t\t\tif (disabled) return;\n\n\t\t\t// Check if any pointer button is pressed (works for both mouse and touch)\n\t\t\t// e.buttons is a bitmask: 1 = primary button (left), 2 = secondary, etc.\n\t\t\tif (e.buttons > 0 || isSelecting) {\n\t\t\t\tonSelectionMove?.(slot);\n\t\t\t}\n\t\t},\n\t\t[disabled, isSelecting, slot, onSelectionMove]\n\t);\n\n\t// Handle pointer up\n\tconst handlePointerUp = useCallback(() => {\n\t\tif (disabled) return;\n\n\t\t// End selection\n\t\tonSelectionEnd?.();\n\n\t\t// Reset tracking\n\t\tstartPositionRef.current = null;\n\t\tisDraggingRef.current = false;\n\t\tisMouseDownRef.current = false;\n\t}, [disabled, onSelectionEnd]);\n\n\t// Drag & drop handlers for receiving events\n\tconst handleDragOver = useCallback(\n\t\t(e: React.DragEvent) => {\n\t\t\tif (!dragDrop?.isDragging || disabled) return;\n\t\t\te.preventDefault();\n\t\t\te.dataTransfer.dropEffect = 'move';\n\t\t\tsetIsDragOver(true);\n\t\t\t// Update preview position in drag context\n\t\t\t// For month view (no hour/minute), use current time\n\t\t\tconst now = new Date();\n\t\t\tconst hour = slot.hour ?? now.getHours();\n\t\t\tconst minute = slot.minute ?? (now.getMinutes() >= 30 ? 30 : 0);\n\t\t\tdragDrop.updateDragPreview?.(slot.date, hour, minute);\n\t\t},\n\t\t[dragDrop, disabled, slot]\n\t);\n\n\tconst handleDragLeave = useCallback(() => {\n\t\tsetIsDragOver(false);\n\t}, []);\n\n\tconst handleDrop = useCallback(\n\t\t(e: React.DragEvent) => {\n\t\t\te.preventDefault();\n\t\t\tsetIsDragOver(false);\n\t\t\tif (!dragDrop?.isDragging || disabled) return;\n\t\t\t// End drag and trigger the drop callback in DragDropProvider\n\t\t\tdragDrop.endDrag?.();\n\t\t},\n\t\t[dragDrop, disabled]\n\t);\n\n\t// Add global pointer up listener to handle cases where mouse is released outside\n\tuseEffect(() => {\n\t\tconst handleGlobalPointerUp = () => {\n\t\t\tif (isMouseDownRef.current) {\n\t\t\t\tisMouseDownRef.current = false;\n\t\t\t\tstartPositionRef.current = null;\n\t\t\t\tisDraggingRef.current = false;\n\t\t\t}\n\t\t};\n\n\t\twindow.addEventListener('pointerup', handleGlobalPointerUp);\n\t\twindow.addEventListener('pointercancel', handleGlobalPointerUp);\n\n\t\treturn () => {\n\t\t\twindow.removeEventListener('pointerup', handleGlobalPointerUp);\n\t\t\twindow.removeEventListener('pointercancel', handleGlobalPointerUp);\n\t\t};\n\t}, []);\n\n\t// Handle keyboard for accessibility\n\tconst handleKeyDown = useCallback(\n\t\t(e: React.KeyboardEvent) => {\n\t\t\tif (disabled) return;\n\n\t\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\t\te.preventDefault();\n\t\t\t\tonSelectionStart?.(slot);\n\t\t\t\tonSelectionEnd?.();\n\t\t\t}\n\t\t},\n\t\t[disabled, slot, onSelectionStart, onSelectionEnd]\n\t);\n\n\treturn (\n\t\t<button\n\t\t\tref={buttonRef}\n\t\t\ttype=\"button\"\n\t\t\taria-label={ariaLabel}\n\t\t\taria-disabled={disabled}\n\t\t\taria-pressed={isSelected}\n\t\t\tdisabled={disabled}\n\t\t\tonPointerDown={handlePointerDown}\n\t\t\tonPointerMove={handlePointerMove}\n\t\t\tonPointerUp={handlePointerUp}\n\t\t\tonPointerEnter={handlePointerEnter}\n\t\t\tonKeyDown={handleKeyDown}\n\t\t\tonDragOver={handleDragOver}\n\t\t\tonDragLeave={handleDragLeave}\n\t\t\tonDrop={handleDrop}\n\t\t\tclassName={cn(\n\t\t\t\t'select-none touch-none cursor-pointer transition-colors',\n\t\t\t\t'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset',\n\t\t\t\t// Hover state (only when not in selection)\n\t\t\t\t!(isSelecting || disabled) && 'hover:bg-blue-50/60',\n\t\t\t\t// Selection state — blue tint matching the primary color\n\t\t\t\tisSelected && 'bg-blue-100/70',\n\t\t\t\t// Drag over state - visual feedback when event is dragged over\n\t\t\t\tisDragOver && 'bg-primary/20 ring-2 ring-primary ring-inset',\n\t\t\t\t// Disabled state\n\t\t\t\tdisabled && 'cursor-not-allowed opacity-50',\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\tstyle={{ height, ...style }}\n\t\t\t{...dataAttributes}\n\t\t>\n\t\t\t{children}\n\t\t</button>\n\t);\n}\n\n// ============================================================================\n// SPECIALIZED SLOT COMPONENTS\n// ============================================================================\n\n/**\n * TimeSlot - For day/week views with configurable time granularity\n * Supports 15, 30, or 60 minute slot durations\n * Accepts either a `slot` prop OR individual `date/hour/minute` props\n */\ninterface TimeSlotProps extends Omit<SelectableSlotProps, 'slot'> {\n\t/** Direct slot object (preferred) */\n\tslot?: ITimeSlot;\n\t/** Date for the slot (alternative to slot prop) */\n\tdate?: Date;\n\t/** Hour for the slot (alternative to slot prop) */\n\thour?: number;\n\t/** Minute for the slot (alternative to slot prop) */\n\tminute?: number;\n}\n\nexport function TimeSlot({\n\tslot: slotProp,\n\tdate,\n\thour,\n\tminute,\n\tariaLabel,\n\t...props\n}: TimeSlotProps) {\n\t// Use provided slot or construct from individual props\n\tconst slot: ITimeSlot = slotProp ?? { date: date!, hour: hour ?? 0, minute: minute ?? 0 };\n\tconst label =\n\t\tariaLabel ??\n\t\t`Add event at ${(slot.hour ?? 0).toString().padStart(2, '0')}:${(slot.minute ?? 0).toString().padStart(2, '0')} on ${slot.date.toLocaleDateString()}`;\n\n\treturn <SelectableSlot slot={slot} ariaLabel={label} {...props} />;\n}\n\n/**\n * DaySlot - For month/year views with day granularity\n * Renders as a day cell\n * Accepts either a `slot` prop OR a `date` prop\n */\ninterface DaySlotProps extends Omit<SelectableSlotProps, 'slot'> {\n\t/** Direct slot object (preferred) */\n\tslot?: ITimeSlot;\n\t/** Date for the slot (alternative to slot prop) */\n\tdate?: Date;\n}\n\nexport function DaySlot({ slot: slotProp, date, ariaLabel, ...props }: DaySlotProps) {\n\t// Use provided slot or construct from date\n\tconst slot: ITimeSlot = slotProp ?? { date: date! };\n\tconst label = ariaLabel ?? `Select ${slot.date.toLocaleDateString()}`;\n\n\treturn <SelectableSlot slot={slot} ariaLabel={label} {...props} />;\n}\n\nexport type { TimeSlotProps, DaySlotProps };\nexport default SelectableSlot;\n","/**\n * Day View Component\n *\n * Full day time grid showing events hour by hour.\n * Features:\n * - Hourly time slots with event positioning\n * - Current time indicator\n * - Working hours highlighting\n * - Click to add event\n * - Drag to select time range\n *\n * Ported from agenda-v2 to maintain exact styling parity.\n */\n\nimport { useCallback, useLayoutEffect, useMemo, useRef } from 'react';\nimport { useOptionalSlotSelection } from '../../core/context/slot-selection-context';\nimport type {\n CalendarEvent,\n ICalendarClassNames,\n ICalendarSlots,\n ITimeSlot,\n IVisibleHours,\n TBadgeVariant,\n TOnEventClick,\n TOnSlotSelect,\n} from '../../core/types';\nimport {\n formatHourLabel,\n getVisibleHoursArray,\n isToday,\n isWorkingHour,\n separateEventsByDuration,\n type TWorkingHours,\n} from '../../core/utils/date-utils';\nimport { getEventsForDay } from '../../core/utils/event-utils';\nimport { calculateOverlappingPositions } from '../../core/utils/position-utils';\nimport { cn } from '../../lib/utils';\nimport { EventBlock } from '../event/event-card';\nimport { MultiDayBanner } from '../primitives/multi-day-banner';\nimport { TimeSlot } from '../primitives/selectable-slot';\n\n// ============================================================================\n// CONSTANTS (matches agenda-v2)\n// ============================================================================\n\nconst HOUR_HEIGHT = 96; // pixels per hour (same as demo-scheduler)\nconst HOUR_COLUMN_WIDTH = 72; // width of hour labels column\nconst MIN_EVENT_CARD_WIDTH = 80; // minimum width in pixels for event cards\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface DayViewProps<TData = Record<string, unknown>> {\n /** Events to display */\n events: CalendarEvent<TData>[];\n /** The date to display */\n date: Date;\n /** Visible hours range */\n visibleHours?: IVisibleHours;\n /** Working hours per day */\n workingHours?: TWorkingHours;\n /** Slot duration in minutes */\n slotDuration?: number;\n /** Badge variant for events */\n badgeVariant?: TBadgeVariant;\n /** Event click handler */\n onEventClick?: TOnEventClick<TData>;\n /** Slot select handler */\n onSlotSelect?: TOnSlotSelect;\n /** Additional CSS classes */\n className?: string;\n /** Custom event renderer */\n renderEvent?: (props: {\n event: CalendarEvent<TData>;\n position: { top: number; height: number; left: number; width: number };\n }) => React.ReactNode;\n /** Custom popover content renderer */\n renderPopover?: (props: { event: CalendarEvent<TData>; onClose: () => void }) => React.ReactNode;\n /** Component slots for customization */\n slots?: ICalendarSlots<TData>;\n /** CSS class overrides for granular styling */\n classNames?: ICalendarClassNames;\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport function DayView<TData = Record<string, unknown>>({\n events,\n date,\n visibleHours = { startHour: 0, endHour: 24 },\n workingHours,\n slotDuration = 30,\n badgeVariant = 'colored',\n onEventClick,\n onSlotSelect: _onSlotSelect,\n className,\n renderEvent,\n renderPopover,\n slots: _slots,\n classNames,\n}: DayViewProps<TData>) {\n // Calculate slot configuration based on slotDuration\n const slotsPerHour = 60 / slotDuration;\n const slotHeightPercent = 100 / slotsPerHour;\n\n // Generate slot minutes for each hour (e.g., [0, 30] for 30min, [0, 15, 30, 45] for 15min)\n const slotMinutes = useMemo(() => {\n const minutes: number[] = [];\n for (let i = 0; i < slotsPerHour; i++) {\n minutes.push(i * slotDuration);\n }\n return minutes;\n }, [slotsPerHour, slotDuration]);\n\n // Get events for this day\n const dayEvents = useMemo(() => getEventsForDay(events, date), [events, date]);\n\n // Separate single-day and multi-day events\n const { singleDay, multiDay } = useMemo(() => separateEventsByDuration(dayEvents), [dayEvents]);\n\n // Calculate positions for overlapping events\n const eventPositions = useMemo(() => {\n const positions = calculateOverlappingPositions(singleDay, date, visibleHours, HOUR_HEIGHT);\n // Convert array to Map for fast lookup\n const map = new Map<string, { top: number; height: number; left: number; width: number }>();\n for (const positioned of positions) {\n map.set(positioned.event.id, positioned.position);\n }\n return map;\n }, [singleDay, date, visibleHours]);\n\n // Hours to display\n const hours = useMemo(() => getVisibleHoursArray(visibleHours), [visibleHours]);\n\n // Current time indicator position\n const now = new Date();\n const showCurrentTime = isToday(date);\n const currentTimeTop = useMemo(() => {\n if (!showCurrentTime) return 0;\n const currentHour = now.getHours() + now.getMinutes() / 60;\n if (currentHour < visibleHours.startHour || currentHour > visibleHours.endHour) {\n return -1; // Out of visible range\n }\n return (currentHour - visibleHours.startHour) * HOUR_HEIGHT;\n }, [showCurrentTime, visibleHours, now]);\n\n // Ref for scrollable container - used to auto-scroll to working hours\n const scrollContainerRef = useRef<HTMLDivElement>(null);\n\n // Auto-scroll to current time (if today) or working hours on mount\n useLayoutEffect(() => {\n const container = scrollContainerRef.current;\n if (!container) return;\n\n // Use requestAnimationFrame to ensure DOM is fully rendered\n const performScroll = () => {\n let scrollToHour: number;\n\n // Priority 1: If viewing today, scroll to current time\n if (showCurrentTime) {\n const currentHour = new Date().getHours();\n // Scroll to 1 hour before current time for context\n scrollToHour = Math.max(currentHour - 1, visibleHours.startHour);\n } else {\n // Priority 2: Scroll to working hours\n const dayOfWeek = date.getDay();\n const todayWorkingHours = workingHours?.[dayOfWeek];\n\n // Check if day has enabled working hours\n if (todayWorkingHours?.enabled && todayWorkingHours.from > 0) {\n // Scroll to 1 hour before working hours, but not before visible range\n scrollToHour = Math.max(todayWorkingHours.from - 1, visibleHours.startHour);\n } else {\n // Default to 7 AM if no working hours defined, disabled, or starts at midnight\n scrollToHour = Math.max(7, visibleHours.startHour);\n }\n }\n\n // Calculate pixel position\n const scrollTop = (scrollToHour - visibleHours.startHour) * HOUR_HEIGHT;\n\n // Scroll to position (instant on initial load for better UX)\n container.scrollTo({\n top: scrollTop,\n behavior: 'instant',\n });\n };\n\n // Use double requestAnimationFrame to ensure layout is complete\n requestAnimationFrame(() => {\n requestAnimationFrame(performScroll);\n });\n }, [date, workingHours, visibleHours, showCurrentTime]);\n\n // Get slot selection context (optional - works without provider)\n const slotSelection = useOptionalSlotSelection();\n\n // Create selection handlers for time slots\n const handleSelectionStart = useCallback(\n (slot: ITimeSlot) => {\n slotSelection?.startSelection(slot);\n },\n [slotSelection]\n );\n\n const handleSelectionMove = useCallback(\n (slot: ITimeSlot) => {\n slotSelection?.updateSelection(slot);\n },\n [slotSelection]\n );\n\n const handleSelectionEnd = useCallback(() => {\n slotSelection?.endSelection();\n }, [slotSelection]);\n\n // Handle multi-day event click\n const handleMultiDayEventClick = useCallback(\n (event: CalendarEvent<TData>) => {\n onEventClick?.(event);\n },\n [onEventClick]\n );\n\n // Format header date like Google Calendar\n const headerDay = date.toLocaleDateString([], { weekday: 'short' });\n const headerDate = date.getDate();\n const today = isToday(date);\n\n return (\n <div className={cn('flex flex-col h-full', className)}>\n {/* Header - Google Calendar style */}\n <div\n className={cn(\n 'flex items-center gap-3 border-b px-4 py-3',\n classNames?.columnHeader,\n today && classNames?.columnHeaderToday\n )}\n >\n {/* Day column with name + circled date */}\n <div className=\"flex flex-col items-center\">\n <span\n className={cn(\n 'text-[11px] font-medium uppercase tracking-wide',\n today ? 'text-primary' : 'text-muted-foreground'\n )}\n >\n {headerDay}\n </span>\n <span\n className={cn(\n 'flex items-center justify-center rounded-full mt-0.5',\n 'size-12 text-3xl font-normal',\n today ? 'bg-primary text-primary-foreground' : 'text-foreground'\n )}\n >\n {headerDate}\n </span>\n </div>\n </div>\n\n {/* Multi-day events banner */}\n {multiDay.length > 0 && (\n <MultiDayBanner\n events={multiDay}\n date={date}\n onEventClick={handleMultiDayEventClick}\n disablePopover={!!onEventClick && !renderPopover}\n renderPopover={renderPopover}\n {...(classNames?.multiDayBanner && { className: classNames.multiDayBanner })}\n />\n )}\n\n {/* Time grid */}\n <div\n ref={scrollContainerRef}\n className={cn('flex-1 overflow-auto', classNames?.scrollContainer)}\n >\n <div className=\"relative min-h-full\">\n {/* Hour rows */}\n {hours.map((hour, index) => {\n const isWorking = isWorkingHour(date, hour, workingHours);\n const isDisabled = !isWorking;\n\n return (\n <div\n key={hour}\n className={cn(\n 'relative flex',\n isDisabled && 'bg-calendar-disabled-hour',\n classNames?.timeSlot,\n isDisabled ? classNames?.timeSlotNonWorking : classNames?.timeSlotWorking\n )}\n style={{ height: HOUR_HEIGHT }}\n >\n {/* Hour label */}\n <div\n className={cn(\n 'relative flex-shrink-0 border-r border-border/50 bg-zinc-50 dark:bg-zinc-900',\n classNames?.timeGutter\n )}\n style={{ width: HOUR_COLUMN_WIDTH }}\n >\n <div className=\"absolute -top-2.5 right-1 sm:right-2 flex h-5 items-center\">\n {index !== 0 && (\n <span\n className={cn(\n 'text-[10px] sm:text-xs text-muted-foreground',\n classNames?.timeGutterLabel\n )}\n >\n {formatHourLabel(hour)}\n </span>\n )}\n </div>\n </div>\n\n {/* Time slot area */}\n <div className=\"relative flex-1\">\n {/* Today highlight */}\n {showCurrentTime && !isDisabled && (\n <div className=\"absolute inset-0 bg-primary/5\" />\n )}\n\n {/* Top border (except first row) */}\n {index !== 0 && (\n <div className=\"pointer-events-none absolute inset-x-0 top-0 border-b border-border/50\" />\n )}\n\n {/* Dashed lines for sub-hour divisions */}\n {slotMinutes.slice(1).map((minute) => (\n <div\n key={minute}\n className=\"pointer-events-none absolute inset-x-0 border-b border-dashed border-border/30\"\n style={{ top: `${(minute / 60) * 100}%` }}\n />\n ))}\n\n {/* Dynamic time slots based on slotDuration */}\n {slotMinutes.map((minute, slotIndex) => {\n const slot: ITimeSlot = { date, hour, minute };\n\n return (\n <TimeSlot\n key={minute}\n slot={slot}\n onSelectionStart={handleSelectionStart}\n onSelectionMove={handleSelectionMove}\n onSelectionEnd={handleSelectionEnd}\n isSelected={slotSelection?.isSlotSelected(slot) ?? false}\n isSelecting={slotSelection?.isSelecting ?? false}\n disabled={isDisabled}\n className=\"absolute inset-x-0\"\n style={{\n top: `${slotIndex * slotHeightPercent}%`,\n height: `${slotHeightPercent}%`,\n }}\n ariaLabel={`Add event at ${formatHourLabel(hour)}:${String(minute).padStart(2, '0')}`}\n />\n );\n })}\n </div>\n </div>\n );\n })}\n\n {/* Events layer - positioned within the content area */}\n <div\n className=\"absolute top-0 bottom-0 right-0 pointer-events-none\"\n style={{ left: HOUR_COLUMN_WIDTH }}\n >\n {singleDay.map((event) => {\n const position = eventPositions.get(event.id);\n if (!position) return null;\n\n // Calculate minimum width - ensure events are readable\n const calculatedWidth = `calc(${position.width}% - 2px)`;\n const minWidthStyle = `max(${MIN_EVENT_CARD_WIDTH}px, ${calculatedWidth})`;\n\n if (renderEvent) {\n return (\n <div\n key={event.id}\n className=\"absolute pointer-events-auto p-0.5\"\n style={{\n top: `${position.top}px`,\n left: `${position.left}%`,\n width: minWidthStyle,\n minWidth: `${MIN_EVENT_CARD_WIDTH}px`,\n }}\n >\n {renderEvent({ event: event as CalendarEvent<TData>, position })}\n </div>\n );\n }\n\n return (\n <EventBlock\n key={event.id}\n event={event as CalendarEvent<TData>}\n position={{\n top: position.top,\n left: position.left,\n width: position.width,\n minWidth: MIN_EVENT_CARD_WIDTH,\n }}\n hourHeight={HOUR_HEIGHT}\n badgeVariant={badgeVariant}\n onClick={onEventClick}\n disablePopover={!!onEventClick && !renderPopover}\n renderPopover={renderPopover}\n className={cn('pointer-events-auto', classNames?.eventCard)}\n />\n );\n })}\n </div>\n\n {/* Current time indicator */}\n {showCurrentTime && currentTimeTop >= 0 && (\n <div\n className={cn(\n 'absolute left-0 right-0 z-20 flex items-center pointer-events-none',\n classNames?.currentTimeIndicator\n )}\n style={{\n top: currentTimeTop,\n left: HOUR_COLUMN_WIDTH,\n }}\n >\n <div className=\"h-2.5 w-2.5 -ml-1 rounded-full bg-red-500\" />\n <div className=\"flex-1 h-0.5 bg-red-500\" />\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n\nexport default DayView;\n","/**\n * Month View Component\n *\n * Traditional calendar month grid with event indicators.\n * Features:\n * - 6-week grid with days from adjacent months\n * - Event dots/compact cards\n * - Today highlighting\n * - Click to view day / add event\n * - Drag to select date range\n * - Show-more expansion: morphing overlay reveals all day events\n * - Optional popover for \"+N more\" events (instead of redirecting to day view)\n *\n * Ported from agenda-v2 to maintain exact styling parity.\n */\n\nimport { useCallback, useMemo, useState } from 'react';\nimport { useOptionalSlotSelection } from '../../core/context/slot-selection-context';\nimport type {\n CalendarEvent,\n ICalendarClassNames,\n ICalendarSlots,\n ITimeSlot,\n TBadgeVariant,\n TOnEventClick,\n TOnSlotSelect,\n} from '../../core/types';\nimport { generateMonthGrid, isToday } from '../../core/utils/date-utils';\nimport { getEventsForDay } from '../../core/utils/event-utils';\nimport { cn } from '../../lib/utils';\nimport { EventCard } from '../event/event-card';\nimport { DaySlot } from '../primitives/selectable-slot';\nimport { Popover, PopoverContent, PopoverTrigger } from '../ui/popover';\nimport { DayEventsExpansion } from './day-events-expansion';\n\n// ============================================================================\n// CONSTANTS (matches agenda-v2)\n// ============================================================================\n\nconst WEEKDAY_LABELS_MONDAY_START = [\n { full: 'Monday', short: 'Mon', tiny: 'M' },\n { full: 'Tuesday', short: 'Tue', tiny: 'T' },\n { full: 'Wednesday', short: 'Wed', tiny: 'W' },\n { full: 'Thursday', short: 'Thu', tiny: 'T' },\n { full: 'Friday', short: 'Fri', tiny: 'F' },\n { full: 'Saturday', short: 'Sat', tiny: 'S' },\n { full: 'Sunday', short: 'Sun', tiny: 'S' },\n];\nconst WEEKDAY_LABELS_SUNDAY_START = [\n { full: 'Sunday', short: 'Sun', tiny: 'S' },\n { full: 'Monday', short: 'Mon', tiny: 'M' },\n { full: 'Tuesday', short: 'Tue', tiny: 'T' },\n { full: 'Wednesday', short: 'Wed', tiny: 'W' },\n { full: 'Thursday', short: 'Thu', tiny: 'T' },\n { full: 'Friday', short: 'Fri', tiny: 'F' },\n { full: 'Saturday', short: 'Sat', tiny: 'S' },\n];\nconst MAX_EVENTS_SHOWN = 3;\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface MonthViewProps<TData = Record<string, unknown>> {\n /** Events to display */\n events: CalendarEvent<TData>[];\n /** The date (any day in the month to show) */\n date: Date;\n /** First day of week (0 = Sunday, 1 = Monday) */\n weekStartsOn?: 0 | 1;\n /** Badge variant for events */\n badgeVariant?: TBadgeVariant;\n /** Event click handler */\n onEventClick?: TOnEventClick<TData>;\n /** Slot select handler */\n onSlotSelect?: TOnSlotSelect;\n /** Day click handler */\n onDayClick?: (date: Date) => void;\n /** Additional CSS classes */\n className?: string;\n /** Custom event renderer */\n renderEvent?: (props: { event: CalendarEvent<TData>; variant: 'compact' }) => React.ReactNode;\n /** Custom popover content renderer */\n renderPopover?: (props: { event: CalendarEvent<TData>; onClose: () => void }) => React.ReactNode;\n /**\n * How to handle overflow events when a day has more than 3.\n *\n * - `'dayView'` — Clicking \"+N more\" redirects to day view (via `onDayClick`)\n * - `'popover'` — Opens a small popover listing all day events\n * - `'expand'` — **Recommended.** The cell morphs into a smooth expansion\n * overlay that reveals all events in a dialog-like panel with transitions.\n *\n * @default 'expand'\n */\n showMoreMode?: 'dayView' | 'popover' | 'expand';\n /**\n * Show remaining events in a popover instead of redirecting to day view.\n * @deprecated Use `showMoreMode=\"popover\"` instead. Will be removed in next major version.\n * @default false\n */\n showMoreEventsInPopover?: boolean;\n /** Component slots for customization */\n slots?: ICalendarSlots<TData>;\n /** CSS class overrides for granular styling */\n classNames?: ICalendarClassNames;\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport function MonthView<TData = Record<string, unknown>>({\n events,\n date,\n weekStartsOn = 1,\n badgeVariant = 'colored',\n onEventClick,\n onSlotSelect: _onSlotSelect,\n onDayClick,\n className,\n renderEvent,\n renderPopover,\n showMoreMode: _showMoreMode,\n showMoreEventsInPopover = false,\n slots,\n classNames,\n}: MonthViewProps<TData>) {\n // Resolve showMoreMode: new prop takes precedence over deprecated boolean\n const showMoreMode = _showMoreMode ?? (showMoreEventsInPopover ? 'popover' : 'expand');\n\n // Destructure slots for injection points\n const DayCellHeaderSlot = slots?.dayCellHeader;\n const DayCellFooterSlot = slots?.dayCellFooter;\n\n // Track which day's popover is open (by date string key) — for 'popover' mode\n const [openPopoverDay, setOpenPopoverDay] = useState<string | null>(null);\n\n // Track expansion overlay state — for 'expand' mode\n const [expandedDay, setExpandedDay] = useState<{\n date: Date;\n events: CalendarEvent<TData>[];\n rect: DOMRect;\n } | null>(null);\n\n\n\n // Generate month grid cells\n const cells = useMemo(() => generateMonthGrid(date, weekStartsOn), [date, weekStartsOn]);\n\n // Events by date for quick lookup\n const eventsByDate = useMemo(() => {\n const map = new Map<string, CalendarEvent<TData>[]>();\n for (const cell of cells) {\n const dayKey = cell.date.toDateString();\n const dayEvents = getEventsForDay(events, cell.date) as CalendarEvent<TData>[];\n // Sort by start time\n dayEvents.sort((a, b) => a.startDate.getTime() - b.startDate.getTime());\n map.set(dayKey, dayEvents);\n }\n return map;\n }, [cells, events]);\n\n // Get slot selection context (optional - works without provider)\n const slotSelection = useOptionalSlotSelection();\n\n // Create selection handlers for day slots\n const handleSelectionStart = useCallback(\n (slot: ITimeSlot) => {\n slotSelection?.startSelection(slot);\n },\n [slotSelection]\n );\n\n const handleSelectionMove = useCallback(\n (slot: ITimeSlot) => {\n slotSelection?.updateSelection(slot);\n },\n [slotSelection]\n );\n\n const handleSelectionEnd = useCallback(() => {\n slotSelection?.endSelection();\n }, [slotSelection]);\n\n // Handle day click (navigate to day view)\n const handleDayClick = useCallback(\n (cellDate: Date) => {\n onDayClick?.(cellDate);\n },\n [onDayClick]\n );\n\n // Get weekday labels based on weekStartsOn\n const weekdayLabels =\n weekStartsOn === 0 ? WEEKDAY_LABELS_SUNDAY_START : WEEKDAY_LABELS_MONDAY_START;\n\n return (\n <div className={cn('flex flex-col h-full overflow-hidden', className)}>\n {/* Scrollable container - horizontal on mobile, vertical overflow when needed */}\n <div className=\"flex flex-col flex-1 overflow-auto\">\n <div className=\"flex flex-col flex-1 min-w-[560px] sm:min-w-0\">\n {/* Weekday headers - Google Calendar style */}\n <div\n className={cn(\n 'grid grid-cols-7 border-b !sticky !top-0 bg-background z-10',\n classNames?.weekdayHeader\n )}\n >\n {weekdayLabels.map((label, index) => (\n <div\n key={label.full}\n className={cn(\n 'py-2 sm:py-2.5 text-center text-[11px] uppercase font-medium tracking-wide text-muted-foreground',\n index >= 5 && 'text-muted-foreground/70', // Weekend\n classNames?.weekdayLabel\n )}\n >\n {/* Show short on mobile, full on desktop */}\n <span className=\"sm:hidden\">{label.short}</span>\n <span className=\"hidden sm:inline\">{label.short}</span>\n </div>\n ))}\n </div>\n\n {/* Calendar grid - each row sizes independently based on content */}\n <div className={cn('grid grid-cols-7 auto-rows-min', classNames?.monthGrid)}>\n {cells.map((cell) => {\n const dayKey = cell.date.toDateString();\n const dayEvents = eventsByDate.get(dayKey) || [];\n const today = isToday(cell.date);\n const isWeekend = cell.date.getDay() === 0 || cell.date.getDay() === 6;\n const hasMoreEvents = dayEvents.length > MAX_EVENTS_SHOWN;\n\n return (\n <DaySlot\n key={dayKey}\n date={cell.date}\n dataAttributes={{ 'data-day-key': dayKey }}\n onSelectionStart={handleSelectionStart}\n onSelectionMove={handleSelectionMove}\n onSelectionEnd={handleSelectionEnd}\n isSelected={slotSelection?.isSlotSelected({ date: cell.date }) ?? false}\n isSelecting={slotSelection?.isSelecting ?? false}\n className={cn(\n 'relative flex flex-col border-r border-b text-left min-h-[80px] sm:min-h-[100px] overflow-hidden',\n '[&:nth-child(7n)]:border-r-0',\n !cell.isCurrentMonth && 'bg-muted/20',\n isWeekend && cell.isCurrentMonth && 'bg-muted/10',\n classNames?.dayCell,\n today && classNames?.dayCellToday,\n !cell.isCurrentMonth && classNames?.dayCellOutside,\n isWeekend && classNames?.dayCellWeekend\n )}\n ariaLabel={`${cell.date.toLocaleDateString()} - ${dayEvents.length} events. Click to create event, double-click to view day.`}\n >\n {/* Day number header - Google Calendar style */}\n <div\n className={cn(\n 'flex items-center justify-center p-1',\n !cell.isCurrentMonth && 'text-muted-foreground/40',\n classNames?.dayCellNumber\n )}\n >\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n handleDayClick(cell.date);\n }}\n className={cn(\n 'flex items-center justify-center rounded-full transition-colors',\n 'size-7 text-sm font-normal',\n today ? 'bg-primary text-primary-foreground' : 'hover:bg-muted'\n )}\n >\n {cell.date.getDate()}\n </button>\n </div>\n\n {/* Day cell header adornment slot */}\n {DayCellHeaderSlot && (\n <DayCellHeaderSlot\n date={cell.date}\n events={dayEvents}\n isToday={today}\n isCurrentMonth={cell.isCurrentMonth}\n isWeekend={isWeekend}\n view=\"month\"\n />\n )}\n\n {/* Events list */}\n <div\n className={cn(\n 'flex-1 overflow-hidden px-2 pt-1 pb-1 space-y-1',\n classNames?.dayCellContent\n )}\n >\n {dayEvents.slice(0, MAX_EVENTS_SHOWN).map((event) => (\n <div\n key={event.id}\n onPointerDown={(e) => {\n // Stop propagation to prevent slot selection when clicking event\n e.stopPropagation();\n }}\n >\n {renderEvent ? (\n renderEvent({ event, variant: 'compact' })\n ) : (\n <EventCard\n event={event}\n variant=\"compact\"\n badgeVariant={badgeVariant}\n onClick={onEventClick}\n disablePopover={!!onEventClick && !renderPopover}\n renderPopover={renderPopover}\n showTime={false}\n enableDrag\n {...(classNames?.eventCardCompact && {\n className: classNames.eventCardCompact,\n })}\n />\n )}\n </div>\n ))}\n\n {/* More events indicator — three modes: expand, popover, dayView */}\n {hasMoreEvents && showMoreMode === 'expand' && (\n <button\n type=\"button\"\n onPointerDown={(e) => e.stopPropagation()}\n onClick={(e) => {\n e.stopPropagation();\n // Capture the cell rect for the morph animation origin\n const cellEl = document.querySelector(`[data-day-key=\"${dayKey}\"]`) as HTMLElement | null;\n setExpandedDay({\n date: cell.date,\n events: dayEvents,\n rect: cellEl?.getBoundingClientRect() ?? new DOMRect(window.innerWidth / 2 - 180, window.innerHeight / 2 - 240, 0, 0),\n });\n }}\n className={cn(\n 'w-full text-left text-xs text-muted-foreground hover:text-foreground hover:underline px-1.5 cursor-pointer',\n classNames?.moreEventsIndicator\n )}\n >\n +{dayEvents.length - MAX_EVENTS_SHOWN} more\n </button>\n )}\n\n {hasMoreEvents && showMoreMode === 'popover' && (\n <Popover\n open={openPopoverDay === dayKey}\n onOpenChange={(open) => setOpenPopoverDay(open ? dayKey : null)}\n >\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n onPointerDown={(e) => e.stopPropagation()}\n onClick={(e) => {\n e.stopPropagation();\n setOpenPopoverDay(dayKey);\n }}\n className={cn(\n 'w-full text-left text-xs text-muted-foreground hover:text-foreground hover:underline px-1.5 cursor-pointer',\n classNames?.moreEventsIndicator\n )}\n >\n +{dayEvents.length - MAX_EVENTS_SHOWN} more\n </button>\n </PopoverTrigger>\n <PopoverContent\n align=\"start\"\n side=\"right\"\n sideOffset={8}\n className=\"w-72 max-h-80 overflow-y-auto p-2\"\n onPointerDown={(e) => e.stopPropagation()}\n >\n {/* Day header */}\n <div className=\"flex items-center justify-between mb-2 pb-2 border-b\">\n <span className=\"text-sm font-medium\">\n {cell.date.toLocaleDateString(undefined, {\n weekday: 'short',\n month: 'short',\n day: 'numeric',\n })}\n </span>\n <span className=\"text-xs text-muted-foreground\">\n {dayEvents.length} events\n </span>\n </div>\n {/* All events for the day */}\n <div className=\"space-y-1.5\">\n {dayEvents.map((event) => (\n <div key={event.id}>\n {renderEvent ? (\n renderEvent({ event, variant: 'compact' })\n ) : (\n <EventCard\n event={event}\n variant=\"compact\"\n badgeVariant={badgeVariant}\n onClick={(e) => {\n setOpenPopoverDay(null);\n onEventClick?.(e);\n }}\n disablePopover={!!onEventClick && !renderPopover}\n renderPopover={renderPopover}\n showTime\n />\n )}\n </div>\n ))}\n </div>\n </PopoverContent>\n </Popover>\n )}\n\n {hasMoreEvents && showMoreMode === 'dayView' && (\n <div\n onPointerDown={(e) => {\n e.stopPropagation();\n handleDayClick(cell.date);\n }}\n className={cn(\n 'w-full text-left text-xs text-muted-foreground hover:text-foreground hover:underline px-1.5 cursor-pointer',\n classNames?.moreEventsIndicator\n )}\n >\n +{dayEvents.length - MAX_EVENTS_SHOWN} more\n </div>\n )}\n </div>\n\n {/* Day cell footer adornment slot */}\n {DayCellFooterSlot && (\n <DayCellFooterSlot\n date={cell.date}\n events={dayEvents}\n isToday={today}\n isCurrentMonth={cell.isCurrentMonth}\n isWeekend={isWeekend}\n view=\"month\"\n />\n )}\n </DaySlot>\n );\n })}\n </div>\n </div>\n </div>\n\n {/* Day events expansion overlay — rendered outside grid to avoid clipping */}\n <DayEventsExpansion<TData>\n isOpen={expandedDay !== null}\n onClose={() => setExpandedDay(null)}\n date={expandedDay?.date ?? new Date()}\n events={expandedDay?.events ?? []}\n anchorRect={expandedDay?.rect ?? null}\n badgeVariant={badgeVariant}\n onEventClick={onEventClick}\n renderEvent={renderEvent}\n renderPopover={renderPopover}\n />\n </div>\n );\n}\n\nexport default MonthView;\n","/**\r\n * Week All-Day Row\r\n *\r\n * Renders all-day and multi-day events in a column-aligned grid that\r\n * matches the week view's day columns. Unlike the flat `MultiDayBanner`,\r\n * each event occupies exactly the columns corresponding to the days it\r\n * spans within the visible week.\r\n *\r\n * Each event pill supports Radix UI `Popover` (or `Tooltip` when popover\r\n * is disabled), matching the interaction model of `EventBlock` and\r\n * `MultiDayEventBar`. When a consumer provides `renderPopover`, clicking\r\n * a pill opens the custom popover. Otherwise a built-in default is shown.\r\n *\r\n * Layout:\r\n * [gutter] [Mon] [Tue] [Wed] [Thu] [Fri] [Sat] [Sun]\r\n * [ ] [===== Event A (Mon–Wed) =====] [ ] [ ]\r\n * [ ] [ ] [======= Event B (Tue–Fri) =======] [ ]\r\n *\r\n * Uses CSS Grid for precise column spanning and a row-packing algorithm\r\n * to stack overlapping events vertically.\r\n *\r\n * @example\r\n * ```tsx\r\n * <WeekAllDayRow\r\n * events={weekMultiDayEvents}\r\n * weekDays={weekDays}\r\n * hourColumnWidth={56}\r\n * minDayColumnWidth={120}\r\n * dayColumnWidths={dayColumnWidths}\r\n * onEventClick={handleClick}\r\n * renderPopover={({ event, onClose }) => <MyPopover event={event} onClose={onClose} />}\r\n * />\r\n * ```\r\n */\r\n\r\nimport { type ReactNode, useCallback, useMemo, useState } from 'react';\r\nimport type { CalendarEvent, TOnEventClick } from '../../core/types';\r\nimport { detectAllDayEvent, isSameDay, startOfDay } from '../../core/utils/date-utils';\r\nimport { formatEventTimeDisplay } from '../../core/utils/event-utils';\r\nimport { cn } from '../../lib/utils';\r\nimport { getEventColorClasses } from '../event/event-card';\r\nimport { Popover, PopoverContent, PopoverTrigger } from '../ui/popover';\r\nimport { Tooltip, TooltipContent, TooltipTrigger } from '../ui/tooltip';\r\n\r\n// ============================================================================\r\n// CONSTANTS\r\n// ============================================================================\r\n\r\n/** Height of each packed event row in pixels */\r\nconst EVENT_ROW_HEIGHT = 26;\r\n/** Vertical gap between packed event rows */\r\nconst EVENT_ROW_GAP = 2;\r\n/** Maximum visible rows before showing \"+N more\" */\r\nconst MAX_VISIBLE_ROWS = 4;\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface WeekAllDayRowProps<TData = Record<string, unknown>> {\r\n /** All-day and multi-day events to display */\r\n events: CalendarEvent<TData>[];\r\n /** Array of 7 Date objects representing the visible week days (in order) */\r\n weekDays: Date[];\r\n /** Width of the hour/gutter column in pixels (must match week grid) */\r\n hourColumnWidth: number;\r\n /** Minimum width of each day column in pixels */\r\n minDayColumnWidth: number;\r\n /** Dynamic widths per day column (length 7, matching weekDays) */\r\n dayColumnWidths: number[];\r\n /** Event click handler (fires only when popover is disabled) */\r\n onEventClick?: TOnEventClick<TData> | undefined;\r\n /**\r\n * When `true`, clicking opens no built-in popover — instead `onEventClick`\r\n * fires directly. Use when the consumer handles navigation themselves.\r\n * @default false\r\n */\r\n disablePopover?: boolean;\r\n /**\r\n * Custom popover content rendered inside the built-in Radix popover.\r\n * When omitted a lightweight default popover is shown.\r\n *\r\n * @example\r\n * renderPopover={({ event, onClose }) => (\r\n * <MyCustomPopover event={event} onClose={onClose} />\r\n * )}\r\n */\r\n renderPopover?: ((props: {\r\n event: CalendarEvent<TData>;\r\n onClose: () => void;\r\n }) => ReactNode) | undefined;\r\n /** Additional CSS classes for the container */\r\n className?: string;\r\n}\r\n\r\n// ============================================================================\r\n// INTERNAL TYPES\r\n// ============================================================================\r\n\r\ninterface PackedEvent<TData> {\r\n event: CalendarEvent<TData>;\r\n /** 0-based start column index within the week */\r\n startCol: number;\r\n /** 0-based end column index within the week (inclusive) */\r\n endCol: number;\r\n /** 0-based packed row index */\r\n row: number;\r\n /** Whether the event continues before the visible week */\r\n continuesBefore: boolean;\r\n /** Whether the event continues after the visible week */\r\n continuesAfter: boolean;\r\n /** Whether this is a single-day all-day event */\r\n isSingleDayAllDay: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// HELPERS\r\n// ============================================================================\r\n\r\n/**\r\n * Find the column index (0-6) for a given date within the weekDays array.\r\n * Returns -1 if the date is before the week, 7 if after.\r\n */\r\nfunction findDayColumn(date: Date, weekDays: Date[]): number {\r\n const dayStart = startOfDay(date);\r\n\r\n for (let i = 0; i < weekDays.length; i++) {\r\n const weekDay = weekDays[i];\r\n if (weekDay && isSameDay(dayStart, weekDay)) return i;\r\n }\r\n\r\n // Date is outside the week — check if before or after\r\n const firstDay = weekDays[0];\r\n if (firstDay && dayStart < startOfDay(firstDay)) return -1;\r\n return 7;\r\n}\r\n\r\n/**\r\n * Row-packing algorithm: assigns the lowest available row to each event\r\n * so that no two events overlap in the same row and column range.\r\n *\r\n * Events are sorted by span width (widest first) then by start column\r\n * for a visually clean layout.\r\n */\r\nfunction packEventsIntoRows<TData>(\r\n events: Array<{\r\n event: CalendarEvent<TData>;\r\n startCol: number;\r\n endCol: number;\r\n continuesBefore: boolean;\r\n continuesAfter: boolean;\r\n isSingleDayAllDay: boolean;\r\n }>,\r\n): PackedEvent<TData>[] {\r\n // Sort: wider spans first, then by start column for visual consistency\r\n const sorted = [...events].sort((a, b) => {\r\n const spanA = a.endCol - a.startCol;\r\n const spanB = b.endCol - b.startCol;\r\n if (spanB !== spanA) return spanB - spanA; // wider first\r\n return a.startCol - b.startCol; // then by start col\r\n });\r\n\r\n // rows[r][c] = true if column c is occupied in row r\r\n const rows: boolean[][] = [];\r\n\r\n return sorted.map((entry) => {\r\n // Find the first row where all columns startCol..endCol are free\r\n let assignedRow = -1;\r\n\r\n for (let r = 0; r < rows.length; r++) {\r\n const row = rows[r];\r\n if (!row) continue;\r\n let free = true;\r\n for (let c = entry.startCol; c <= entry.endCol; c++) {\r\n if (row[c]) {\r\n free = false;\r\n break;\r\n }\r\n }\r\n if (free) {\r\n assignedRow = r;\r\n break;\r\n }\r\n }\r\n\r\n // No free row found — create a new one\r\n if (assignedRow === -1) {\r\n assignedRow = rows.length;\r\n rows.push(new Array<boolean>(7).fill(false));\r\n }\r\n\r\n // Occupy columns in the assigned row\r\n const assignedRowArr = rows[assignedRow];\r\n if (assignedRowArr) {\r\n for (let c = entry.startCol; c <= entry.endCol; c++) {\r\n assignedRowArr[c] = true;\r\n }\r\n }\r\n\r\n return { ...entry, row: assignedRow };\r\n });\r\n}\r\n\r\n// ============================================================================\r\n// ALL-DAY EVENT PILL (with Popover / Tooltip support)\r\n// ============================================================================\r\n\r\ninterface AllDayEventPillProps<TData> {\r\n pe: PackedEvent<TData>;\r\n onEventClick: TOnEventClick<TData> | undefined;\r\n disablePopover: boolean;\r\n renderPopover: ((props: {\r\n event: CalendarEvent<TData>;\r\n onClose: () => void;\r\n }) => ReactNode) | undefined;\r\n}\r\n\r\n/**\r\n * Single event pill inside the all-day row.\r\n *\r\n * - With popover enabled: wraps in Radix `<Popover>` (custom or default content).\r\n * - With popover disabled + onClick: fires `onEventClick`, shows a `<Tooltip>`.\r\n * - Matches the same interaction model as `EventBlock` and `MultiDayEventBar`.\r\n */\r\nfunction AllDayEventPill<TData>({\r\n pe,\r\n onEventClick,\r\n disablePopover,\r\n renderPopover,\r\n}: AllDayEventPillProps<TData>) {\r\n const [popoverOpen, setPopoverOpen] = useState(false);\r\n const colors = getEventColorClasses(pe.event.color);\r\n\r\n const handleClick = useCallback(() => {\r\n if (disablePopover && onEventClick) {\r\n onEventClick(pe.event);\r\n } else if (!disablePopover) {\r\n setPopoverOpen(true);\r\n }\r\n }, [disablePopover, onEventClick, pe.event]);\r\n\r\n const handleClose = useCallback(() => {\r\n setPopoverOpen(false);\r\n }, []);\r\n\r\n // Shared button content\r\n const pillButton = (\r\n <button\r\n type=\"button\"\r\n onClick={handleClick}\r\n className={cn(\r\n 'inline-flex items-center gap-1 rounded text-[10px] font-medium transition-opacity hover:opacity-80 mx-0.5 overflow-hidden w-full',\r\n 'sm:text-xs',\r\n colors.bg,\r\n colors.text,\r\n pe.event.isCanceled && 'opacity-60 line-through',\r\n pe.continuesBefore && 'rounded-l-none -ml-0.5 pl-1',\r\n pe.continuesAfter && 'rounded-r-none -mr-0.5 pr-1',\r\n )}\r\n style={{\r\n height: EVENT_ROW_HEIGHT,\r\n lineHeight: `${EVENT_ROW_HEIGHT}px`,\r\n paddingLeft: pe.continuesBefore ? 4 : 6,\r\n paddingRight: pe.continuesAfter ? 4 : 6,\r\n }}\r\n >\r\n {pe.continuesBefore && (\r\n <span className=\"text-[9px] opacity-60 flex-shrink-0\">◂</span>\r\n )}\r\n <span className=\"truncate\">{pe.event.title}</span>\r\n {pe.isSingleDayAllDay && (\r\n <span className=\"text-[9px] opacity-70 flex-shrink-0 hidden sm:inline\">\r\n All day\r\n </span>\r\n )}\r\n {pe.continuesAfter && (\r\n <span className=\"text-[9px] opacity-60 flex-shrink-0\">▸</span>\r\n )}\r\n </button>\r\n );\r\n\r\n // Tooltip content (shown on hover when popover is disabled)\r\n const tooltipContent = (\r\n <TooltipContent>\r\n <div className=\"flex flex-col gap-0.5\">\r\n <div className=\"font-medium\">{pe.event.title}</div>\r\n <div className=\"text-xs text-muted-foreground tabular-nums\">\r\n {formatEventTimeDisplay(pe.event)}\r\n </div>\r\n </div>\r\n </TooltipContent>\r\n );\r\n\r\n // Grid placement style — applied to the wrapper div, not the button\r\n const gridStyle: React.CSSProperties = {\r\n gridColumn: `${pe.startCol + 2} / ${pe.endCol + 3}`,\r\n gridRow: pe.row + 1,\r\n };\r\n\r\n // Popover disabled → only tooltip + direct onClick\r\n if (disablePopover) {\r\n return (\r\n <div style={gridStyle}>\r\n <Tooltip>\r\n <TooltipTrigger asChild>{pillButton}</TooltipTrigger>\r\n {tooltipContent}\r\n </Tooltip>\r\n </div>\r\n );\r\n }\r\n\r\n // Popover enabled → Radix Popover with consumer or default content\r\n return (\r\n <div style={gridStyle}>\r\n <Popover open={popoverOpen} onOpenChange={setPopoverOpen}>\r\n <PopoverTrigger asChild>{pillButton}</PopoverTrigger>\r\n <PopoverContent className=\"w-80\">\r\n {renderPopover ? (\r\n renderPopover({ event: pe.event, onClose: handleClose })\r\n ) : (\r\n <DefaultAllDayPopoverContent event={pe.event} onClose={handleClose} />\r\n )}\r\n </PopoverContent>\r\n </Popover>\r\n </div>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// DEFAULT POPOVER CONTENT (lightweight fallback)\r\n// ============================================================================\r\n\r\nfunction DefaultAllDayPopoverContent<TData>({\r\n event,\r\n onClose,\r\n}: {\r\n event: CalendarEvent<TData>;\r\n onClose: () => void;\r\n}) {\r\n const colors = getEventColorClasses(event.color);\r\n const isCanceled = event.isCanceled ?? false;\r\n\r\n return (\r\n <div className=\"space-y-3\">\r\n <div className=\"flex items-start gap-3\">\r\n <div className={cn('size-4 rounded shrink-0 mt-0.5', colors.dot)} />\r\n <div className=\"flex-1 min-w-0\">\r\n <h3\r\n className={cn(\r\n 'font-semibold text-lg',\r\n isCanceled && 'line-through opacity-50',\r\n )}\r\n >\r\n {event.title}\r\n </h3>\r\n <div className=\"flex items-center gap-1 text-sm text-muted-foreground mt-1 tabular-nums\">\r\n {formatEventTimeDisplay(event)}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {event.description && (\r\n <p className=\"text-sm text-muted-foreground\">{event.description}</p>\r\n )}\r\n\r\n <div className=\"flex flex-wrap gap-1.5\">\r\n {event.isAllDay && (\r\n <span className=\"text-xs bg-muted px-2 py-0.5 rounded-full font-medium\">\r\n All day\r\n </span>\r\n )}\r\n {isCanceled && (\r\n <span className=\"text-xs bg-red-100 dark:bg-red-950/30 text-red-700 dark:text-red-300 px-2 py-0.5 rounded-full font-medium\">\r\n Canceled\r\n </span>\r\n )}\r\n </div>\r\n\r\n <div className=\"flex justify-end pt-2 border-t\">\r\n <button\r\n type=\"button\"\r\n onClick={onClose}\r\n className=\"text-xs text-muted-foreground hover:text-foreground px-3 py-1.5 rounded-md hover:bg-muted transition-colors\"\r\n >\r\n Close\r\n </button>\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 WeekAllDayRow<TData = Record<string, unknown>>({\r\n events,\r\n weekDays,\r\n hourColumnWidth,\r\n minDayColumnWidth,\r\n dayColumnWidths,\r\n onEventClick,\r\n disablePopover = false,\r\n renderPopover,\r\n className,\r\n}: WeekAllDayRowProps<TData>) {\r\n const packedEvents = useMemo(() => {\r\n if (events.length === 0) return [];\r\n\r\n // Map each event to its column range within the visible week\r\n const mapped = events\r\n .map((event) => {\r\n const rawStart = findDayColumn(event.startDate, weekDays);\r\n const rawEnd = findDayColumn(event.endDate, weekDays);\r\n\r\n // Clamp to visible week range [0, 6]\r\n const startCol = Math.max(0, rawStart);\r\n const endCol = Math.min(6, rawEnd);\r\n\r\n // Skip events entirely outside the visible week\r\n if (startCol > 6 || endCol < 0) return null;\r\n\r\n const continuesBefore = rawStart < 0;\r\n const continuesAfter = rawEnd > 6;\r\n const isAllDay = detectAllDayEvent(event);\r\n const isSingleDayAllDay = isAllDay && isSameDay(event.startDate, event.endDate);\r\n\r\n return {\r\n event,\r\n startCol,\r\n endCol,\r\n continuesBefore,\r\n continuesAfter,\r\n isSingleDayAllDay,\r\n };\r\n })\r\n .filter(Boolean) as Array<{\r\n event: CalendarEvent<TData>;\r\n startCol: number;\r\n endCol: number;\r\n continuesBefore: boolean;\r\n continuesAfter: boolean;\r\n isSingleDayAllDay: boolean;\r\n }>;\r\n\r\n return packEventsIntoRows(mapped);\r\n }, [events, weekDays]);\r\n\r\n if (packedEvents.length === 0) return null;\r\n\r\n // Compute number of visible rows and whether we need a \"+N more\" overflow\r\n const totalRows = Math.max(...packedEvents.map((e) => e.row)) + 1;\r\n const visibleRows = Math.min(totalRows, MAX_VISIBLE_ROWS);\r\n const hasOverflow = totalRows > MAX_VISIBLE_ROWS;\r\n const hiddenCount = hasOverflow\r\n ? packedEvents.filter((e) => e.row >= MAX_VISIBLE_ROWS).length\r\n : 0;\r\n\r\n // Build CSS grid column template to match the week grid exactly\r\n const gridTemplateColumns = [\r\n `${hourColumnWidth}px`,\r\n ...dayColumnWidths.map((w) => {\r\n const needsExpansion = w > minDayColumnWidth;\r\n return needsExpansion ? `${w}px` : `minmax(${minDayColumnWidth}px, 1fr)`;\r\n }),\r\n ].join(' ');\r\n\r\n // Container height: rows + gaps + padding\r\n const containerHeight =\r\n visibleRows * EVENT_ROW_HEIGHT +\r\n (visibleRows - 1) * EVENT_ROW_GAP +\r\n 8; // 4px top + 4px bottom padding\r\n\r\n return (\r\n <div\r\n className={cn(\r\n 'ic-all-day-row border-b bg-muted/20 relative',\r\n className,\r\n )}\r\n style={{\r\n display: 'grid',\r\n gridTemplateColumns,\r\n gridTemplateRows: `repeat(${visibleRows}, ${EVENT_ROW_HEIGHT}px)`,\r\n gap: `${EVENT_ROW_GAP}px 0`,\r\n paddingTop: 4,\r\n paddingBottom: 4,\r\n minHeight: containerHeight,\r\n }}\r\n >\r\n {/* Gutter label */}\r\n <div\r\n className=\"flex items-start justify-center pt-1 text-[10px] font-medium text-muted-foreground\"\r\n style={{\r\n gridColumn: 1,\r\n gridRow: `1 / span ${visibleRows}`,\r\n }}\r\n >\r\n <span className=\"hidden sm:inline\">All day</span>\r\n </div>\r\n\r\n {/* Column separator lines (visual alignment with week header) */}\r\n {weekDays.map((day, i) => (\r\n <div\r\n key={day.toDateString()}\r\n className=\"pointer-events-none border-r last:border-r-0\"\r\n style={{\r\n gridColumn: i + 2,\r\n gridRow: `1 / span ${visibleRows}`,\r\n }}\r\n />\r\n ))}\r\n\r\n {/* Packed events */}\r\n {packedEvents\r\n .filter((pe) => pe.row < MAX_VISIBLE_ROWS)\r\n .map((pe) => (\r\n <AllDayEventPill\r\n key={pe.event.id}\r\n pe={pe}\r\n onEventClick={onEventClick}\r\n disablePopover={disablePopover}\r\n renderPopover={renderPopover}\r\n />\r\n ))}\r\n\r\n {/* Overflow indicator */}\r\n {hasOverflow && (\r\n <div\r\n className=\"text-[10px] text-muted-foreground font-medium px-2 flex items-center\"\r\n style={{\r\n gridColumn: `2 / ${weekDays.length + 2}`,\r\n gridRow: visibleRows,\r\n }}\r\n >\r\n +{hiddenCount} more\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default WeekAllDayRow;\r\n","/**\n * Week View Component\n *\n * 7-day grid showing a full week with time slots.\n * Features:\n * - Day columns with hour rows\n * - Multi-day event spanning\n * - Current time indicator\n * - Working hours highlighting\n * - Drag to select time range\n *\n * Ported from agenda-v2 to maintain exact styling parity.\n */\n\nimport { useCallback, useLayoutEffect, useMemo, useRef } from \"react\";\nimport { useOptionalSlotSelection } from \"../../core/context/slot-selection-context\";\nimport type {\n CalendarEvent,\n ICalendarClassNames,\n ICalendarSlots,\n ITimeSlot,\n IVisibleHours,\n TBadgeVariant,\n TOnEventClick,\n TOnSlotSelect,\n} from \"../../core/types\";\nimport {\n formatHourLabel,\n getVisibleHoursArray,\n getWeekDays,\n isToday,\n isWorkingHour,\n separateEventsByDuration,\n type TWorkingHours,\n} from \"../../core/utils/date-utils\";\nimport { getEventsForDay } from \"../../core/utils/event-utils\";\nimport { calculateOverlappingPositions } from \"../../core/utils/position-utils\";\nimport { cn } from \"../../lib/utils\";\nimport { EventBlock } from \"../event/event-card\";\nimport { WeekAllDayRow } from \"../primitives/week-all-day-row\";\nimport { TimeSlot } from \"../primitives/selectable-slot\";\n\n// ============================================================================\n// CONSTANTS (matches agenda-v2)\n// ============================================================================\n\nconst HOUR_HEIGHT = 96; // pixels per hour (same as demo-scheduler)\nconst HOUR_COLUMN_WIDTH = 56; // narrower for Google Calendar style\nconst DAY_HEADER_HEIGHT = 72; // taller for stacked day/date layout\nconst MIN_DAY_COLUMN_WIDTH = 120; // minimum width per day column\nconst MIN_EVENT_CARD_WIDTH = 100; // minimum width in pixels for event cards to be readable\nconst MAX_EVENTS_BEFORE_EXPAND = 3; // max overlapping events before column expands\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface WeekViewProps<TData = Record<string, unknown>> {\n /** Events to display */\n events: CalendarEvent<TData>[];\n /** The date (any day in the week to show) */\n date: Date;\n /** First day of week (0 = Sunday, 1 = Monday) */\n weekStartsOn?: 0 | 1;\n /** Visible hours range */\n visibleHours?: IVisibleHours;\n /** Working hours per day */\n workingHours?: TWorkingHours;\n /** Slot duration in minutes */\n slotDuration?: number;\n /** Badge variant for events */\n badgeVariant?: TBadgeVariant;\n /** Event click handler */\n onEventClick?: TOnEventClick<TData>;\n /** Slot select handler */\n onSlotSelect?: TOnSlotSelect;\n /** Day click handler */\n onDayClick?: (date: Date) => void;\n /** Additional CSS classes */\n className?: string;\n /** Custom event renderer */\n renderEvent?: (props: {\n event: CalendarEvent<TData>;\n position: { top: number; height: number; left: number; width: number };\n }) => React.ReactNode;\n /** Custom popover content renderer */\n renderPopover?: (props: {\n event: CalendarEvent<TData>;\n onClose: () => void;\n }) => React.ReactNode;\n /** Component slots for customization */\n slots?: ICalendarSlots<TData>;\n /** CSS class overrides for granular styling */\n classNames?: ICalendarClassNames;\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport function WeekView<TData = Record<string, unknown>>({\n events,\n date,\n weekStartsOn = 1,\n visibleHours = { startHour: 0, endHour: 24 },\n workingHours,\n slotDuration = 30,\n badgeVariant = \"colored\",\n onEventClick,\n onSlotSelect: _onSlotSelect,\n onDayClick,\n className,\n renderEvent,\n renderPopover,\n slots: _slots,\n classNames,\n}: WeekViewProps<TData>) {\n // Calculate slot configuration based on slotDuration\n const slotsPerHour = 60 / slotDuration;\n const slotHeightPercent = 100 / slotsPerHour;\n\n // Generate slot minutes for each hour\n const slotMinutes = useMemo(() => {\n const minutes: number[] = [];\n for (let i = 0; i < slotsPerHour; i++) {\n minutes.push(i * slotDuration);\n }\n return minutes;\n }, [slotsPerHour, slotDuration]);\n\n // Week days\n const weekDays = useMemo(\n () => getWeekDays(date, weekStartsOn),\n [date, weekStartsOn],\n );\n\n // Hours array\n const hours = useMemo(\n () => getVisibleHoursArray(visibleHours),\n [visibleHours],\n );\n\n // Events per day\n const eventsPerDay = useMemo(() => {\n const map = new Map<\n string,\n {\n singleDay: CalendarEvent<TData>[];\n multiDay: CalendarEvent<TData>[];\n positions: Map<\n string,\n { top: number; height: number; left: number; width: number }\n >;\n maxOverlapping: number; // Track max overlapping events for dynamic width\n }\n >();\n\n for (const day of weekDays) {\n const dayKey = day.toDateString();\n const dayEvents = getEventsForDay(events, day);\n const { singleDay, multiDay } = separateEventsByDuration(dayEvents);\n const positionsArray = calculateOverlappingPositions(\n singleDay,\n day,\n visibleHours,\n HOUR_HEIGHT,\n );\n\n // Convert array to Map for fast lookup and find max overlapping\n const positions = new Map<\n string,\n { top: number; height: number; left: number; width: number }\n >();\n let maxOverlapping = 1;\n\n for (const positioned of positionsArray) {\n positions.set(positioned.event.id, positioned.position);\n // Calculate number of overlapping events based on width percentage\n // width of 100% = 1 event, 50% = 2 events, 33% = 3 events, etc.\n if (positioned.position.width > 0) {\n const overlapping = Math.round(100 / positioned.position.width);\n maxOverlapping = Math.max(maxOverlapping, overlapping);\n }\n }\n\n map.set(dayKey, {\n singleDay: singleDay as CalendarEvent<TData>[],\n multiDay: multiDay as CalendarEvent<TData>[],\n positions,\n maxOverlapping,\n });\n }\n\n return map;\n }, [weekDays, events, visibleHours]);\n\n // All multi-day events for the week (shown in banner)\n const weekMultiDayEvents = useMemo(() => {\n const unique = new Map<string, CalendarEvent<TData>>();\n for (const { multiDay } of eventsPerDay.values()) {\n for (const event of multiDay) {\n unique.set(event.id, event);\n }\n }\n return Array.from(unique.values());\n }, [eventsPerDay]);\n\n // Current time position\n const now = new Date();\n const todayIndex = weekDays.findIndex((d) => isToday(d));\n const currentTimeTop = useMemo(() => {\n if (todayIndex < 0) return -1;\n const currentHour = now.getHours() + now.getMinutes() / 60;\n if (\n currentHour < visibleHours.startHour ||\n currentHour > visibleHours.endHour\n ) {\n return -1;\n }\n return (currentHour - visibleHours.startHour) * HOUR_HEIGHT;\n }, [todayIndex, visibleHours, now]);\n\n // Ref for scrollable container - used to auto-scroll to working hours\n const scrollContainerRef = useRef<HTMLDivElement>(null);\n\n // Auto-scroll to current time (if today is visible) or working hours on mount/week change\n useLayoutEffect(() => {\n const container = scrollContainerRef.current;\n if (!container) return;\n\n // Use requestAnimationFrame to ensure DOM is fully rendered\n const performScroll = () => {\n let scrollToHour: number;\n\n // Priority 1: If today is in the current week, scroll to current time\n if (todayIndex !== -1) {\n const currentHour = new Date().getHours();\n // Scroll to 1 hour before current time for context\n scrollToHour = Math.max(currentHour - 1, visibleHours.startHour);\n } else {\n // Priority 2: Use working hours\n // Try to get working hours for the first day of the week or Monday\n const today = new Date();\n const dayOfWeek = today.getDay();\n\n // Try to get working hours for today (must be enabled), fallback to Monday (1)\n let targetWorkingHours = workingHours?.[dayOfWeek];\n if (!targetWorkingHours?.enabled || targetWorkingHours.from === 0) {\n // Fallback to Monday's working hours if enabled\n const mondayHours = workingHours?.[1];\n if (mondayHours?.enabled) {\n targetWorkingHours = mondayHours;\n }\n }\n\n // Check if we have enabled working hours\n if (targetWorkingHours?.enabled && targetWorkingHours.from > 0) {\n scrollToHour = Math.max(\n targetWorkingHours.from - 1,\n visibleHours.startHour,\n );\n } else {\n // Default to 7 AM if no working hours defined or disabled\n scrollToHour = Math.max(7, visibleHours.startHour);\n }\n }\n\n // Calculate pixel position\n const scrollTop = (scrollToHour - visibleHours.startHour) * HOUR_HEIGHT;\n\n // Scroll to position (instant on initial load for better UX)\n container.scrollTo({\n top: scrollTop,\n behavior: \"instant\",\n });\n };\n\n // Use double requestAnimationFrame to ensure layout is complete\n requestAnimationFrame(() => {\n requestAnimationFrame(performScroll);\n });\n }, [date, workingHours, visibleHours, todayIndex]);\n\n // Get slot selection context (optional - works without provider)\n const slotSelection = useOptionalSlotSelection();\n\n // Create selection handlers for time slots (matches agenda-v2)\n const handleSelectionStart = useCallback(\n (slot: ITimeSlot) => {\n slotSelection?.startSelection(slot);\n },\n [slotSelection],\n );\n\n const handleSelectionMove = useCallback(\n (slot: ITimeSlot) => {\n slotSelection?.updateSelection(slot);\n },\n [slotSelection],\n );\n\n const handleSelectionEnd = useCallback(() => {\n slotSelection?.endSelection();\n }, [slotSelection]);\n\n // Handle multi-day event click\n const handleMultiDayEventClick = useCallback(\n (event: CalendarEvent<TData>) => {\n onEventClick?.(event);\n },\n [onEventClick],\n );\n\n // Calculate min width for the grid to allow horizontal scrolling\n const gridMinWidth = HOUR_COLUMN_WIDTH + 7 * MIN_DAY_COLUMN_WIDTH;\n\n // Calculate dynamic column widths based on max overlapping events per day\n const dayColumnWidths = useMemo(() => {\n const widths: number[] = [];\n for (const day of weekDays) {\n const dayKey = day.toDateString();\n const dayData = eventsPerDay.get(dayKey);\n const maxOverlapping = dayData?.maxOverlapping ?? 1;\n\n // If more than MAX_EVENTS_BEFORE_EXPAND events overlap, expand the column\n // Each event needs at least MIN_EVENT_CARD_WIDTH pixels\n if (maxOverlapping > MAX_EVENTS_BEFORE_EXPAND) {\n widths.push(\n Math.max(MIN_DAY_COLUMN_WIDTH, maxOverlapping * MIN_EVENT_CARD_WIDTH),\n );\n } else {\n widths.push(MIN_DAY_COLUMN_WIDTH);\n }\n }\n return widths;\n }, [weekDays, eventsPerDay]);\n\n // Calculate actual grid width based on dynamic column widths\n const actualGridWidth =\n HOUR_COLUMN_WIDTH + dayColumnWidths.reduce((sum, w) => sum + w, 0);\n\n return (\n <div className={cn(\"ic-week-view flex flex-col h-full\", className)}>\n {/* Column-aligned all-day / multi-day events row */}\n {weekMultiDayEvents.length > 0 && (\n <WeekAllDayRow\n events={weekMultiDayEvents}\n weekDays={weekDays}\n hourColumnWidth={HOUR_COLUMN_WIDTH}\n minDayColumnWidth={MIN_DAY_COLUMN_WIDTH}\n dayColumnWidths={dayColumnWidths}\n onEventClick={handleMultiDayEventClick}\n disablePopover={!!onEventClick && !renderPopover}\n renderPopover={renderPopover}\n {...(classNames?.multiDayBanner && {\n className: classNames.multiDayBanner,\n })}\n />\n )}\n\n {/* Scrollable container for header + grid - overflow-auto is REQUIRED for scroll-to-working-hours */}\n <div\n ref={scrollContainerRef}\n className={cn(\n \"ic-week-scroll-container flex-1\",\n classNames?.scrollContainer,\n )}\n >\n {/* Single container for both header and grid - ensures columns align */}\n <div style={{ minWidth: Math.max(gridMinWidth, actualGridWidth) }}>\n {/* Week header - sticky at top, uses flex to match grid columns */}\n <div className=\"ic-week-header sticky top-0 z-20 border-b bg-background\">\n <div className=\"flex\">\n {/* Empty corner for hour column with timezone - matches hour column width */}\n <div\n className=\"flex-shrink-0 flex items-end justify-center pb-2 text-[10px] text-muted-foreground/70\"\n style={{ width: HOUR_COLUMN_WIDTH, height: DAY_HEADER_HEIGHT }}\n >\n <span className=\"hidden sm:inline\">\n GMT\n {(() => {\n const offset = new Date().getTimezoneOffset();\n const hrs = Math.abs(Math.floor(offset / 60));\n const sign = offset <= 0 ? \"+\" : \"-\";\n return hrs > 0\n ? `${sign}${String(hrs).padStart(2, \"0\")}`\n : \"\";\n })()}\n </span>\n </div>\n\n {/* Day headers - must match grid column widths exactly */}\n {weekDays.map((day, dayIndex) => {\n const today = isToday(day);\n const columnWidth =\n dayColumnWidths[dayIndex] ?? MIN_DAY_COLUMN_WIDTH;\n // Only use fixed width if column needs expansion for many events\n const needsExpansion = columnWidth > MIN_DAY_COLUMN_WIDTH;\n\n return (\n <div\n key={day.toDateString()}\n className={cn(\n \"flex-1 flex flex-col items-center justify-center border-r last:border-r-0 py-2\",\n classNames?.columnHeader,\n today && classNames?.columnHeaderToday,\n )}\n style={{\n height: DAY_HEADER_HEIGHT,\n minWidth: needsExpansion\n ? columnWidth\n : MIN_DAY_COLUMN_WIDTH,\n }}\n >\n {/* Day name - small uppercase */}\n <span\n className={cn(\n \"text-[11px] font-medium uppercase tracking-wide\",\n today ? \"text-primary\" : \"text-muted-foreground\",\n )}\n >\n {day.toLocaleDateString([], { weekday: \"short\" })}\n </span>\n {/* Date number - large, circled if today */}\n <button\n type=\"button\"\n onClick={() => onDayClick?.(day)}\n className={cn(\n \"flex items-center justify-center rounded-full transition-colors mt-0.5\",\n \"size-10 text-2xl font-normal\",\n today\n ? \"bg-primary text-primary-foreground\"\n : \"text-foreground hover:bg-muted\",\n )}\n >\n {day.getDate()}\n </button>\n </div>\n );\n })}\n </div>\n </div>\n\n {/* Time grid - within same width container as header */}\n <div className=\"relative flex\">\n {/* Hour labels column - sticky left to stay visible when scrolling horizontally */}\n <div\n className={cn(\n \"ic-hour-column sticky left-0 z-10 bg-zinc-50 border-r\",\n classNames?.timeGutter,\n )}\n style={{ width: HOUR_COLUMN_WIDTH }}\n >\n {hours.map((hour, index) => (\n <div\n key={hour}\n className=\"relative\"\n style={{ height: HOUR_HEIGHT }}\n >\n <div className=\"absolute -top-2.5 right-1 sm:right-2 flex h-5 items-center\">\n {index !== 0 && (\n <span\n className={cn(\n \"text-[10px] sm:text-xs text-muted-foreground\",\n classNames?.timeGutterLabel,\n )}\n >\n {formatHourLabel(hour)}\n </span>\n )}\n </div>\n </div>\n ))}\n </div>\n\n {/* Week grid - day columns */}\n <div className=\"ic-week-grid relative flex-1\">\n <div className=\"flex divide-x\">\n {weekDays.map((day, dayIndex) => {\n const dayKey = day.toDateString();\n const dayData = eventsPerDay.get(dayKey);\n const columnWidth =\n dayColumnWidths[dayIndex] ?? MIN_DAY_COLUMN_WIDTH;\n // Only use fixed width if column needs expansion for many events\n const needsExpansion = columnWidth > MIN_DAY_COLUMN_WIDTH;\n\n return (\n <div\n key={day.toDateString()}\n className=\"ic-day-column relative flex-1\"\n style={{\n minWidth: needsExpansion\n ? columnWidth\n : MIN_DAY_COLUMN_WIDTH,\n }}\n >\n {/* Hour slots */}\n {hours.map((hour, index) => {\n const isWorking = isWorkingHour(\n day,\n hour,\n workingHours,\n );\n const isDisabled = !isWorking;\n\n return (\n <div\n key={hour}\n className={cn(\n \"relative\",\n isDisabled && \"bg-calendar-disabled-hour\",\n isToday(day) && !isDisabled && \"bg-primary/5\",\n classNames?.timeSlot,\n isDisabled\n ? classNames?.timeSlotNonWorking\n : classNames?.timeSlotWorking,\n )}\n style={{ height: HOUR_HEIGHT }}\n >\n {/* Top border (except first row) */}\n {index !== 0 && (\n <div className=\"pointer-events-none absolute inset-x-0 top-0 border-b border-border/50\" />\n )}\n\n {/* Dashed lines for sub-hour divisions */}\n {slotMinutes.slice(1).map((minute) => (\n <div\n key={minute}\n className=\"pointer-events-none absolute inset-x-0 border-b border-dashed border-border/30\"\n style={{ top: `${(minute / 60) * 100}%` }}\n />\n ))}\n\n {/* Dynamic time slots based on slotDuration */}\n {slotMinutes.map((minute, slotIndex) => {\n const slot: ITimeSlot = {\n date: day,\n hour,\n minute,\n };\n\n return (\n <TimeSlot\n key={minute}\n slot={slot}\n onSelectionStart={handleSelectionStart}\n onSelectionMove={handleSelectionMove}\n onSelectionEnd={handleSelectionEnd}\n isSelected={\n slotSelection?.isSlotSelected(slot) ?? false\n }\n isSelecting={\n slotSelection?.isSelecting ?? false\n }\n disabled={isDisabled}\n className=\"absolute inset-x-0\"\n style={{\n top: `${slotIndex * slotHeightPercent}%`,\n height: `${slotHeightPercent}%`,\n }}\n ariaLabel={`Add event on ${day.toLocaleDateString()} at ${formatHourLabel(hour)}:${String(minute).padStart(2, \"0\")}`}\n />\n );\n })}\n </div>\n );\n })}\n\n {/* Events for this day - positioned within the day column */}\n {dayData?.singleDay.map((event) => {\n const position = dayData.positions.get(event.id);\n if (!position) return null;\n\n // Calculate minimum width - ensure events are readable\n const calculatedWidth = `calc(${position.width}% - 2px)`;\n const minWidthStyle = `max(${MIN_EVENT_CARD_WIDTH}px, ${calculatedWidth})`;\n\n if (renderEvent) {\n return (\n <div\n key={event.id}\n className=\"absolute pointer-events-auto p-0.5\"\n style={{\n top: `${position.top}px`,\n left: `${position.left}%`,\n width: minWidthStyle,\n minWidth: `${MIN_EVENT_CARD_WIDTH}px`,\n }}\n >\n {renderEvent({ event, position })}\n </div>\n );\n }\n\n return (\n <EventBlock\n key={event.id}\n event={event}\n position={{\n top: position.top,\n left: position.left,\n width: position.width,\n minWidth: MIN_EVENT_CARD_WIDTH,\n }}\n hourHeight={HOUR_HEIGHT}\n badgeVariant={badgeVariant}\n onClick={onEventClick}\n disablePopover={!!onEventClick && !renderPopover}\n renderPopover={renderPopover}\n className={cn(\n \"pointer-events-auto\",\n classNames?.eventCard,\n )}\n />\n );\n })}\n\n {/* Current time indicator for this day */}\n {dayIndex === todayIndex && currentTimeTop >= 0 && (\n <div\n className={cn(\n \"absolute left-0 right-0 z-20 flex items-center pointer-events-none\",\n classNames?.currentTimeIndicator,\n )}\n style={{ top: currentTimeTop }}\n >\n <div className=\"h-2 w-2 -ml-1 rounded-full bg-red-500\" />\n <div className=\"flex-1 h-0.5 bg-red-500\" />\n </div>\n )}\n </div>\n );\n })}\n </div>\n </div>\n </div>\n {/* End of width container that wraps header + grid */}\n </div>\n </div>\n </div>\n );\n}\n\nexport default WeekView;\n"],"names":["Popover","PopoverPrimitive","PopoverTrigger","PopoverAnchor","PopoverContent","React","className","align","sideOffset","props","ref","jsx","cn","TooltipProvider","TooltipPrimitive","Tooltip","TooltipTrigger","TooltipContent","getEventColorClasses","color","startOfDay","date","d","EventCard","event","variant","badgeVariant","onClick","showTime","showDescription","showParticipants","style","disablePopover","renderPopover","enableDrag","enablePageTransition","_pageTransitionDuration","colors","popoverOpen","setPopoverOpen","useState","isDragging","setIsDragging","_transitionActive","setTransitionActive","_transitionRect","setTransitionRect","cardRef","useRef","dragDrop","useOptionalDragDrop","isPast","isCanceled","canDrag","eventCardData","cardMeetingTookPlace","statusIcon","XIcon","CheckIcon","cardScheduleTypeName","cardProductName","cardNrParticipant","cardSiteName","cardSiteCity","cardLocationStr","handleClick","useCallback","rect","handleClose","handleDragStart","e","handleDragEnd","dotButton","jsxs","formatEventTimeDisplay","DefaultPopoverContent","compactContent","fullContent","UsersIcon","ClockIcon","MapPinIcon","p","onClose","EventBlock","position","hourHeight","durationInMinutes","heightInPixels","isShortEvent","showDetails","eventData","scheduleTypeName","productName","nrParticipant","siteName","siteCity","locationStr","isDotVariant","target","handleKeyDown","blockButton","tooltipContent","MultiDayEventBar","spanDays","isStart","isEnd","barButton","falsyToString","value","cx","clsx","cva","base","config","_config_compoundVariants","variants","defaultVariants","getVariantClassNames","variantProp","defaultVariantProp","variantKey","propsWithoutUndefined","acc","param","key","getCompoundVariantClassNames","cvClass","cvClassName","compoundVariantOptions","buttonVariants","Button","forwardRef","size","loading","disabled","children","mergeClasses","classes","index","array","toKebabCase","string","toCamelCase","match","p1","p2","toPascalCase","camelCase","defaultAttributes","hasA11yProp","prop","Icon","strokeWidth","absoluteStrokeWidth","iconNode","rest","createElement","tag","attrs","createLucideIcon","iconName","Component","__iconNode","Check","ChevronRight","Circle","DropdownMenu","DropdownMenuPrimitive","DropdownMenuTrigger","DropdownMenuSubTrigger","inset","DropdownMenuSubContent","DropdownMenuContent","DropdownMenuItem","DropdownMenuCheckboxItem","checked","DropdownMenuRadioItem","DropdownMenuLabel","DropdownMenuSeparator","badgeVariants","Badge","ChevronLeft","MONTH_NAMES","DateNavigator","view","events","onNavigatePrev","onNavigateNext","weekStartsOn","showEventCount","month","year","eventCount","getEventsCountInView","rangeText","getRangeText","TodayButton","today","CalendarDays","GanttChartSquare","ChevronDown","Settings","Plus","LayoutList","Columns","Grid2X2","Grid3X3","CALENDAR_VIEWS","TIMELINE_VIEWS","CalendarHeader","currentDate","onNavigateToday","onNavigate","onViewChange","onAddEvent","availableViews","showTimelineViews","_timelineViews","settingsContent","showSettings","filterContent","actions","labels","mergedLabels","useMemo","handleToday","handlePrev","handleNext","isCalendarView","isTimelineView","calendarViewOptions","v","currentCalendarView","currentTimelineView","viewOption","AgendaView","daysAhead","onEventClick","renderEvent","_slots","classNames","upcomingEvents","baseDate","endDate","groupedEvents","map","groupEventsByDate","result","dateKey","eventList","a","b","groupDate","groupEvents","isToday","dayName","dayNumber","monthName","PANEL_WIDTH","PANEL_MAX_HEIGHT","ANIMATION_DURATION","DayEventsExpansion","isOpen","anchorRect","overlayRef","panelRef","phase","setPhase","sortedEvents","expandedPosition","viewportWidth","viewportHeight","left","naturalHeight","top","useLayoutEffect","timer","useEffect","handleBackdropClick","isCollapsed","panelStyle","backdropOpacity","dateStr","Fragment","BannerEventPill","isAllDay","detectAllDayEvent","isSameDay","isSingleDayAllDay","pillButton","BannerDefaultPopoverContent","MultiDayBanner","hasAllDay","hasMultiDay","label","DRAG_THRESHOLD","SelectableSlot","slot","onSelectionStart","onSelectionMove","onSelectionEnd","isSelected","isSelecting","ariaLabel","height","dataAttributes","startPositionRef","isDraggingRef","isMouseDownRef","buttonRef","isDragOver","setIsDragOver","handlePointerDown","handlePointerMove","dx","dy","handlePointerEnter","handlePointerUp","handleDragOver","now","hour","minute","handleDragLeave","handleDrop","handleGlobalPointerUp","TimeSlot","slotProp","DaySlot","HOUR_HEIGHT","HOUR_COLUMN_WIDTH","MIN_EVENT_CARD_WIDTH","DayView","visibleHours","workingHours","slotDuration","_onSlotSelect","slotsPerHour","slotHeightPercent","slotMinutes","minutes","i","dayEvents","getEventsForDay","singleDay","multiDay","separateEventsByDuration","eventPositions","positions","calculateOverlappingPositions","positioned","hours","getVisibleHoursArray","showCurrentTime","currentTimeTop","currentHour","scrollContainerRef","container","performScroll","scrollToHour","dayOfWeek","todayWorkingHours","scrollTop","slotSelection","useOptionalSlotSelection","handleSelectionStart","handleSelectionMove","handleSelectionEnd","handleMultiDayEventClick","headerDay","headerDate","isDisabled","isWorkingHour","slotIndex","formatHourLabel","calculatedWidth","minWidthStyle","WEEKDAY_LABELS_MONDAY_START","WEEKDAY_LABELS_SUNDAY_START","MAX_EVENTS_SHOWN","MonthView","onDayClick","_showMoreMode","showMoreEventsInPopover","slots","showMoreMode","DayCellHeaderSlot","DayCellFooterSlot","openPopoverDay","setOpenPopoverDay","expandedDay","setExpandedDay","cells","generateMonthGrid","eventsByDate","cell","dayKey","handleDayClick","cellDate","weekdayLabels","isWeekend","hasMoreEvents","cellEl","open","EVENT_ROW_HEIGHT","EVENT_ROW_GAP","MAX_VISIBLE_ROWS","findDayColumn","weekDays","dayStart","weekDay","firstDay","packEventsIntoRows","sorted","spanA","spanB","rows","entry","assignedRow","r","row","free","c","assignedRowArr","AllDayEventPill","pe","gridStyle","DefaultAllDayPopoverContent","WeekAllDayRow","hourColumnWidth","minDayColumnWidth","dayColumnWidths","packedEvents","mapped","rawStart","rawEnd","startCol","endCol","continuesBefore","continuesAfter","totalRows","visibleRows","hasOverflow","hiddenCount","gridTemplateColumns","w","containerHeight","day","DAY_HEADER_HEIGHT","MIN_DAY_COLUMN_WIDTH","MAX_EVENTS_BEFORE_EXPAND","WeekView","getWeekDays","eventsPerDay","positionsArray","maxOverlapping","overlapping","weekMultiDayEvents","unique","todayIndex","targetWorkingHours","mondayHours","gridMinWidth","widths","actualGridWidth","sum","offset","hrs","sign","dayIndex","columnWidth","needsExpansion","dayData"],"mappings":"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","x_google_ignoreList":[3,5,6,7,8,9,10,11,12,13,14,15]}
|