@innosolutions/inno-calendar 1.0.21 → 1.0.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/dist/{agenda-dropdown-D8rfvI3Q.js → agenda-dropdown-CXEm80us.js} +665 -661
  2. package/dist/agenda-dropdown-CXEm80us.js.map +1 -0
  3. package/dist/agenda-dropdown-DscR56sP.cjs +2 -0
  4. package/dist/agenda-dropdown-DscR56sP.cjs.map +1 -0
  5. package/dist/agenda-view-CVYk83hH.cjs +11 -0
  6. package/dist/{agenda-view-BotvTTEB.cjs.map → agenda-view-CVYk83hH.cjs.map} +1 -1
  7. package/dist/{agenda-view-CRI1J_KB.js → agenda-view-DM01Fpvr.js} +795 -733
  8. package/dist/{agenda-view-CRI1J_KB.js.map → agenda-view-DM01Fpvr.js.map} +1 -1
  9. package/dist/components/index.cjs +1 -1
  10. package/dist/components/index.mjs +2 -2
  11. package/dist/components/inno-calendar.d.ts +7 -1
  12. package/dist/components/inno-calendar.d.ts.map +1 -1
  13. package/dist/components/views/month-view.d.ts +7 -1
  14. package/dist/components/views/month-view.d.ts.map +1 -1
  15. package/dist/components/views/timeline-view.d.ts +1 -1
  16. package/dist/components/views/timeline-view.d.ts.map +1 -1
  17. package/dist/index.cjs +1 -1
  18. package/dist/index.mjs +3 -3
  19. package/dist/presets/index.cjs +1 -1
  20. package/dist/presets/index.mjs +1 -1
  21. package/dist/{tailwind-calendar-CQBD-ljO.cjs → tailwind-calendar-BvdxZ56F.cjs} +2 -2
  22. package/dist/{tailwind-calendar-CQBD-ljO.cjs.map → tailwind-calendar-BvdxZ56F.cjs.map} +1 -1
  23. package/dist/{tailwind-calendar-Y9dn5uKm.js → tailwind-calendar-DtZENWzv.js} +2 -2
  24. package/dist/{tailwind-calendar-Y9dn5uKm.js.map → tailwind-calendar-DtZENWzv.js.map} +1 -1
  25. package/package.json +1 -1
  26. package/dist/agenda-dropdown-D8rfvI3Q.js.map +0 -1
  27. package/dist/agenda-dropdown-oY4qocpp.cjs +0 -2
  28. package/dist/agenda-dropdown-oY4qocpp.cjs.map +0 -1
  29. package/dist/agenda-view-BotvTTEB.cjs +0 -11
@@ -1 +1 @@
1
- {"version":3,"file":"agenda-view-CRI1J_KB.js","sources":["../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/popover.tsx","../src/components/header/components/today-button.tsx","../src/components/ui/badge.tsx","../src/components/header/components/date-navigator.tsx","../src/components/header/calendar-header.tsx","../src/components/ui/tooltip.tsx","../src/components/event/event-card.tsx","../src/components/primitives/multi-day-banner.tsx","../src/components/primitives/selectable-slot.tsx","../src/components/views/day-view.tsx","../src/components/views/week-view.tsx","../src/components/views/month-view.tsx","../src/components/views/agenda-view.tsx"],"sourcesContent":["/**\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","/**\r\n * Button Component\r\n *\r\n * A versatile button component with multiple variants and sizes.\r\n * Built with class-variance-authority for type-safe variants.\r\n */\r\n\r\nimport { forwardRef, type ButtonHTMLAttributes } from 'react';\r\nimport { cva, type VariantProps } from 'class-variance-authority';\r\nimport { cn } from '../../lib/utils';\r\n\r\n// ============================================================================\r\n// VARIANTS\r\n// ============================================================================\r\n\r\nconst buttonVariants = cva(\r\n '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',\r\n {\r\n variants: {\r\n variant: {\r\n default:\r\n 'bg-primary text-primary-foreground shadow hover:bg-primary/90',\r\n destructive:\r\n 'bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90',\r\n outline:\r\n 'border border-input active:!bg-zinc-100 hover:!bg-zinc-50 active:bg-white !bg-white hover:bg-accent hover:text-accent-foreground',\r\n secondary:\r\n 'bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80',\r\n ghost: 'hover:bg-accent hover:text-accent-foreground',\r\n link: 'text-primary underline-offset-4 hover:underline',\r\n },\r\n size: {\r\n default: 'h-9 px-4 py-2',\r\n sm: 'h-8 rounded-md px-3 text-xs',\r\n lg: 'h-10 rounded-md px-8',\r\n icon: 'h-9 w-9',\r\n },\r\n },\r\n defaultVariants: {\r\n variant: 'default',\r\n size: 'default',\r\n },\r\n },\r\n);\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface ButtonProps\r\n extends ButtonHTMLAttributes<HTMLButtonElement>,\r\n VariantProps<typeof buttonVariants> {\r\n /** Loading state - disables button and shows spinner */\r\n loading?: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// COMPONENT\r\n// ============================================================================\r\n\r\nconst Button = forwardRef<HTMLButtonElement, ButtonProps>(\r\n ({ className, variant, size, loading, disabled, children, ...props }, ref) => {\r\n return (\r\n <button\r\n className={cn(buttonVariants({ variant, size, className }))}\r\n ref={ref}\r\n disabled={disabled || loading}\r\n {...props}\r\n >\r\n {loading && (\r\n <svg\r\n className=\"animate-spin -ml-1 mr-2 size-4\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <circle\r\n className=\"opacity-25\"\r\n cx=\"12\"\r\n cy=\"12\"\r\n r=\"10\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"4\"\r\n />\r\n <path\r\n className=\"opacity-75\"\r\n fill=\"currentColor\"\r\n d=\"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\"\r\n />\r\n </svg>\r\n )}\r\n {children}\r\n </button>\r\n );\r\n },\r\n);\r\n\r\nButton.displayName = 'Button';\r\n\r\nexport { Button, buttonVariants };\r\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","/**\r\n * DropdownMenu Component\r\n *\r\n * A dropdown menu for displaying a list of actions or options.\r\n * Uses Radix UI dropdown primitives.\r\n */\r\n\r\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';\r\nimport { Check, ChevronRight, Circle } from 'lucide-react';\r\nimport * as React from 'react';\r\nimport { cn } from '../../lib/utils';\r\n\r\n// ============================================================================\r\n// ROOT\r\n// ============================================================================\r\n\r\nconst DropdownMenu = DropdownMenuPrimitive.Root;\r\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;\r\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group;\r\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal;\r\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub;\r\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;\r\n\r\n// ============================================================================\r\n// SUB TRIGGER\r\n// ============================================================================\r\n\r\nconst DropdownMenuSubTrigger = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\r\n inset?: boolean;\r\n }\r\n>(({ className, inset, children, ...props }, ref) => (\r\n <DropdownMenuPrimitive.SubTrigger\r\n ref={ref}\r\n className={cn(\r\n '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',\r\n inset && 'pl-8',\r\n className,\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n <ChevronRight className=\"ml-auto h-4 w-4\" />\r\n </DropdownMenuPrimitive.SubTrigger>\r\n));\r\nDropdownMenuSubTrigger.displayName =\r\n DropdownMenuPrimitive.SubTrigger.displayName;\r\n\r\n// ============================================================================\r\n// SUB CONTENT\r\n// ============================================================================\r\n\r\nconst DropdownMenuSubContent = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\r\n>(({ className, ...props }, ref) => (\r\n <DropdownMenuPrimitive.SubContent\r\n ref={ref}\r\n className={cn(\r\n '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',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n));\r\nDropdownMenuSubContent.displayName =\r\n DropdownMenuPrimitive.SubContent.displayName;\r\n\r\n// ============================================================================\r\n// CONTENT\r\n// ============================================================================\r\n\r\nconst DropdownMenuContent = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\r\n>(({ className, sideOffset = 4, ...props }, ref) => (\r\n <DropdownMenuPrimitive.Portal>\r\n <DropdownMenuPrimitive.Content\r\n ref={ref}\r\n sideOffset={sideOffset}\r\n className={cn(\r\n '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',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n </DropdownMenuPrimitive.Portal>\r\n));\r\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;\r\n\r\n// ============================================================================\r\n// ITEM\r\n// ============================================================================\r\n\r\nconst DropdownMenuItem = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.Item>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\r\n inset?: boolean;\r\n }\r\n>(({ className, inset, ...props }, ref) => (\r\n <DropdownMenuPrimitive.Item\r\n ref={ref}\r\n className={cn(\r\n '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',\r\n inset && 'pl-8',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n));\r\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;\r\n\r\n// ============================================================================\r\n// CHECKBOX ITEM\r\n// ============================================================================\r\n\r\nconst DropdownMenuCheckboxItem = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\r\n>(({ className, children, checked = false, ...props }, ref) => (\r\n <DropdownMenuPrimitive.CheckboxItem\r\n ref={ref}\r\n className={cn(\r\n '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',\r\n className,\r\n )}\r\n checked={checked}\r\n {...props}\r\n >\r\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\r\n <DropdownMenuPrimitive.ItemIndicator>\r\n <Check className=\"h-4 w-4\" />\r\n </DropdownMenuPrimitive.ItemIndicator>\r\n </span>\r\n {children}\r\n </DropdownMenuPrimitive.CheckboxItem>\r\n));\r\nDropdownMenuCheckboxItem.displayName =\r\n DropdownMenuPrimitive.CheckboxItem.displayName;\r\n\r\n// ============================================================================\r\n// RADIO ITEM\r\n// ============================================================================\r\n\r\nconst DropdownMenuRadioItem = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\r\n>(({ className, children, ...props }, ref) => (\r\n <DropdownMenuPrimitive.RadioItem\r\n ref={ref}\r\n className={cn(\r\n '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',\r\n className,\r\n )}\r\n {...props}\r\n >\r\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\r\n <DropdownMenuPrimitive.ItemIndicator>\r\n <Circle className=\"h-2 w-2 fill-current\" />\r\n </DropdownMenuPrimitive.ItemIndicator>\r\n </span>\r\n {children}\r\n </DropdownMenuPrimitive.RadioItem>\r\n));\r\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;\r\n\r\n// ============================================================================\r\n// LABEL\r\n// ============================================================================\r\n\r\nconst DropdownMenuLabel = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.Label>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\r\n inset?: boolean;\r\n }\r\n>(({ className, inset, ...props }, ref) => (\r\n <DropdownMenuPrimitive.Label\r\n ref={ref}\r\n className={cn('px-2 py-1.5 text-sm font-semibold', inset && 'pl-8', className)}\r\n {...props}\r\n />\r\n));\r\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;\r\n\r\n// ============================================================================\r\n// SEPARATOR\r\n// ============================================================================\r\n\r\nconst DropdownMenuSeparator = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.Separator>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\r\n>(({ className, ...props }, ref) => (\r\n <DropdownMenuPrimitive.Separator\r\n ref={ref}\r\n className={cn('-mx-1 my-1 h-px bg-muted', className)}\r\n {...props}\r\n />\r\n));\r\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName;\r\n\r\n// ============================================================================\r\n// SHORTCUT\r\n// ============================================================================\r\n\r\nconst DropdownMenuShortcut = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLSpanElement>) => (\r\n <span className={cn('ml-auto text-xs tracking-widest opacity-60', className)} {...props} />\r\n);\r\nDropdownMenuShortcut.displayName = 'DropdownMenuShortcut';\r\n\r\nexport {\r\n DropdownMenu,\r\n DropdownMenuCheckboxItem,\r\n DropdownMenuContent,\r\n DropdownMenuGroup,\r\n DropdownMenuItem,\r\n DropdownMenuLabel,\r\n DropdownMenuPortal,\r\n DropdownMenuRadioGroup,\r\n DropdownMenuRadioItem,\r\n DropdownMenuSeparator,\r\n DropdownMenuShortcut,\r\n DropdownMenuSub,\r\n DropdownMenuSubContent,\r\n DropdownMenuSubTrigger,\r\n DropdownMenuTrigger,\r\n};\r\n","import * as PopoverPrimitive from '@radix-ui/react-popover';\r\nimport * as React from 'react';\r\n\r\nimport { cn } from '../../lib/utils';\r\n\r\nconst Popover = PopoverPrimitive.Root;\r\n\r\nconst PopoverTrigger = PopoverPrimitive.Trigger;\r\n\r\nconst PopoverAnchor = PopoverPrimitive.Anchor;\r\n\r\nconst PopoverContent = React.forwardRef<\r\n React.ElementRef<typeof PopoverPrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\r\n>(({ className, align = 'center', sideOffset = 4, ...props }, ref) => (\r\n <PopoverPrimitive.Portal>\r\n <PopoverPrimitive.Content\r\n ref={ref}\r\n align={align}\r\n sideOffset={sideOffset}\r\n className={cn(\r\n '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',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n </PopoverPrimitive.Portal>\r\n));\r\nPopoverContent.displayName = PopoverPrimitive.Content.displayName;\r\n\r\nexport { Popover, PopoverAnchor, PopoverContent, PopoverTrigger };\r\n","/**\r\n * TodayButton - Styled Calendar Icon Button\r\n *\r\n * A visual button showing today's date that navigates to today.\r\n * Matches the production agenda-v2 implementation.\r\n */\r\n\r\nimport { cn } from '../../../lib/utils';\r\n\r\n// ============================================================================\r\n// CONSTANTS\r\n// ============================================================================\r\n\r\nconst MONTH_NAMES = [\r\n 'JAN',\r\n 'FEB',\r\n 'MAR',\r\n 'APR',\r\n 'MAY',\r\n 'JUN',\r\n 'JUL',\r\n 'AUG',\r\n 'SEP',\r\n 'OCT',\r\n 'NOV',\r\n 'DEC',\r\n];\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface TodayButtonProps {\r\n /** Click handler - should navigate to today */\r\n onClick?: () => void;\r\n /** Additional CSS classes */\r\n className?: string;\r\n}\r\n\r\n// ============================================================================\r\n// COMPONENT\r\n// ============================================================================\r\n\r\nexport function TodayButton({ onClick, className }: TodayButtonProps) {\r\n const today = new Date();\r\n\r\n return (\r\n <button\r\n type=\"button\"\r\n className={cn(\r\n 'flex size-11 sm:size-14 flex-col items-start overflow-hidden rounded-lg border shrink-0',\r\n 'focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\r\n 'hover:bg-accent/50 transition-colors',\r\n className,\r\n )}\r\n onClick={onClick}\r\n >\r\n <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\">\r\n {MONTH_NAMES[today.getMonth()]}\r\n </p>\r\n <p className=\"flex w-full flex-1 items-center justify-center text-sm sm:text-lg font-bold\">\r\n {today.getDate()}\r\n </p>\r\n </button>\r\n );\r\n}\r\n\r\nexport default TodayButton;\r\n","/**\r\n * Badge Component\r\n *\r\n * Displays a small badge with optional variants.\r\n */\r\n\r\nimport { cn } from '../../lib/utils';\r\nimport { cva, type VariantProps } from 'class-variance-authority';\r\nimport type * as React from 'react';\r\n\r\n// ============================================================================\r\n// VARIANTS\r\n// ============================================================================\r\n\r\nconst badgeVariants = cva(\r\n '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',\r\n {\r\n variants: {\r\n variant: {\r\n default:\r\n 'border-transparent bg-primary text-primary-foreground hover:bg-primary/80',\r\n secondary:\r\n 'border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80',\r\n destructive:\r\n 'border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80',\r\n outline: 'text-foreground',\r\n },\r\n },\r\n defaultVariants: { variant: 'default' },\r\n },\r\n);\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface BadgeProps\r\n extends React.HTMLAttributes<HTMLDivElement>,\r\n VariantProps<typeof badgeVariants> { }\r\n\r\n// ============================================================================\r\n// COMPONENT\r\n// ============================================================================\r\n\r\nfunction Badge({ className, variant, ...props }: BadgeProps) {\r\n return (\r\n <div className={cn(badgeVariants({ variant }), className)} {...props} />\r\n );\r\n}\r\n\r\nexport { Badge, badgeVariants };\r\n","/**\r\n * DateNavigator - Navigation Controls with Date Range\r\n *\r\n * Shows month/year title, event count badge, and prev/next navigation.\r\n * Matches the production agenda-v2 implementation.\r\n */\r\n\r\nimport { cn } from '../../../lib/utils';\r\nimport type { TCalendarView, CalendarEvent } from '../../../core/types';\r\nimport { getRangeText, getEventsCountInView } from '../../../core/utils/grid-utils';\r\nimport { Button } from '../../ui/button';\r\nimport { Badge } from '../../ui/badge';\r\n\r\n// ============================================================================\r\n// ICONS (Inline SVGs for zero dependencies)\r\n// ============================================================================\r\n\r\nfunction ChevronLeft({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <path d=\"m15 18-6-6 6-6\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction ChevronRight({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <path d=\"m9 18 6-6-6-6\" />\r\n </svg>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// CONSTANTS\r\n// ============================================================================\r\n\r\nconst MONTH_NAMES = [\r\n 'January',\r\n 'February',\r\n 'March',\r\n 'April',\r\n 'May',\r\n 'June',\r\n 'July',\r\n 'August',\r\n 'September',\r\n 'October',\r\n 'November',\r\n 'December',\r\n];\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface DateNavigatorProps<TData = Record<string, unknown>> {\r\n /** Current date */\r\n date: Date;\r\n /** Current view */\r\n view: TCalendarView;\r\n /** Events to count */\r\n events?: CalendarEvent<TData>[];\r\n /** Navigate to previous period */\r\n onNavigatePrev?: () => void;\r\n /** Navigate to next period */\r\n onNavigateNext?: () => void;\r\n /** Week starts on (0 = Sunday, 1 = Monday) */\r\n weekStartsOn?: 0 | 1;\r\n /** Show event count badge */\r\n showEventCount?: boolean;\r\n /** Additional CSS classes */\r\n className?: string;\r\n}\r\n\r\n// ============================================================================\r\n// COMPONENT\r\n// ============================================================================\r\n\r\nexport function DateNavigator<TData = Record<string, unknown>>({\r\n date,\r\n view,\r\n events = [],\r\n onNavigatePrev,\r\n onNavigateNext,\r\n weekStartsOn = 1,\r\n showEventCount = true,\r\n className,\r\n}: DateNavigatorProps<TData>) {\r\n const month = MONTH_NAMES[date.getMonth()];\r\n const year = date.getFullYear();\r\n const eventCount = showEventCount\r\n ? getEventsCountInView(events, date, view, weekStartsOn)\r\n : 0;\r\n const rangeText = getRangeText(date, view);\r\n\r\n return (\r\n <div className={cn('min-w-0 flex-1', className)}>\r\n {/* Title row with month/year and event count */}\r\n <div className=\"flex items-center gap-1.5 sm:gap-2 flex-wrap\">\r\n <span className=\"text-base sm:text-lg font-semibold truncate\">\r\n {month} {year}\r\n </span>\r\n {showEventCount && (\r\n <Badge\r\n variant=\"outline\"\r\n className=\"px-1 sm:px-1.5 text-[10px] sm:text-xs shrink-0\"\r\n >\r\n {eventCount}\r\n </Badge>\r\n )}\r\n </div>\r\n\r\n {/* Navigation row */}\r\n <div className=\"flex items-center gap-1.5 sm:gap-2\">\r\n <Button\r\n variant=\"outline\"\r\n size=\"icon\"\r\n className=\"size-5 sm:size-6 [&_svg]:size-3 sm:[&_svg]:size-4\"\r\n onClick={onNavigatePrev}\r\n >\r\n <ChevronLeft />\r\n </Button>\r\n\r\n <p className=\"text-xs sm:text-sm text-muted-foreground truncate\">\r\n {rangeText}\r\n </p>\r\n\r\n <Button\r\n variant=\"outline\"\r\n size=\"icon\"\r\n className=\"size-5 sm:size-6 [&_svg]:size-3 sm:[&_svg]:size-4\"\r\n onClick={onNavigateNext}\r\n >\r\n <ChevronRight />\r\n </Button>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default DateNavigator;\r\n","/**\r\n * Calendar Header Component\r\n *\r\n * Navigation and view controls for the calendar.\r\n * Matches the production agenda-v2 implementation.\r\n *\r\n * Features:\r\n * - Styled TodayButton with calendar icon\r\n * - DateNavigator with event count and range text\r\n * - Calendar View dropdown (Day, Week, Month, Year)\r\n * - Timeline View dropdown (Resource views)\r\n * - Settings popover slot (via settingsContent prop)\r\n * - Filter row slot (via filterContent prop)\r\n * - Add event button\r\n */\r\n\r\nimport { cn } from '../../lib/utils';\r\nimport { useMemo, type ReactNode } from 'react';\r\nimport type { TCalendarView, CalendarEvent } from '../../core/types';\r\nimport { Button } from '../ui/button';\r\nimport {\r\n DropdownMenu,\r\n DropdownMenuContent,\r\n DropdownMenuItem,\r\n DropdownMenuTrigger,\r\n} from '../ui/dropdown-menu';\r\nimport {\r\n Popover,\r\n PopoverContent,\r\n PopoverTrigger,\r\n} from '../ui/popover';\r\nimport { TodayButton } from './components/today-button';\r\nimport { DateNavigator } from './components/date-navigator';\r\n\r\n// ============================================================================\r\n// ICONS (Inline SVGs for zero dependencies)\r\n// ============================================================================\r\n\r\nfunction CalendarDays({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <path d=\"M8 2v4\" />\r\n <path d=\"M16 2v4\" />\r\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"4\" rx=\"2\" />\r\n <path d=\"M3 10h18\" />\r\n <path d=\"M8 14h.01\" />\r\n <path d=\"M12 14h.01\" />\r\n <path d=\"M16 14h.01\" />\r\n <path d=\"M8 18h.01\" />\r\n <path d=\"M12 18h.01\" />\r\n <path d=\"M16 18h.01\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction GanttChartSquare({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\r\n <path d=\"M9 8h7\" />\r\n <path d=\"M8 12h6\" />\r\n <path d=\"M11 16h5\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction ChevronDown({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <path d=\"m6 9 6 6 6-6\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction Settings({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <path d=\"M12.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\" />\r\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction Plus({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <path d=\"M5 12h14\" />\r\n <path d=\"M12 5v14\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction LayoutList({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <rect width=\"7\" height=\"7\" x=\"3\" y=\"3\" rx=\"1\" />\r\n <rect width=\"7\" height=\"7\" x=\"3\" y=\"14\" rx=\"1\" />\r\n <path d=\"M14 4h7\" />\r\n <path d=\"M14 9h7\" />\r\n <path d=\"M14 15h7\" />\r\n <path d=\"M14 20h7\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction Columns({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\r\n <path d=\"M12 3v18\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction Grid2X2({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\r\n <path d=\"M3 12h18\" />\r\n <path d=\"M12 3v18\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction Grid3X3({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\r\n <path d=\"M3 9h18\" />\r\n <path d=\"M3 15h18\" />\r\n <path d=\"M9 3v18\" />\r\n <path d=\"M15 3v18\" />\r\n </svg>\r\n );\r\n}\r\n\r\n// function ListIcon({ className }: { className?: string }) {\r\n// return (\r\n// <svg\r\n// className={className}\r\n// xmlns=\"http://www.w3.org/2000/svg\"\r\n// width=\"24\"\r\n// height=\"24\"\r\n// viewBox=\"0 0 24 24\"\r\n// fill=\"none\"\r\n// stroke=\"currentColor\"\r\n// strokeWidth=\"2\"\r\n// strokeLinecap=\"round\"\r\n// strokeLinejoin=\"round\"\r\n// >\r\n// <line x1=\"8\" x2=\"21\" y1=\"6\" y2=\"6\" />\r\n// <line x1=\"8\" x2=\"21\" y1=\"12\" y2=\"12\" />\r\n// <line x1=\"8\" x2=\"21\" y1=\"18\" y2=\"18\" />\r\n// <line x1=\"3\" x2=\"3.01\" y1=\"6\" y2=\"6\" />\r\n// <line x1=\"3\" x2=\"3.01\" y1=\"12\" y2=\"12\" />\r\n// <line x1=\"3\" x2=\"3.01\" y1=\"18\" y2=\"18\" />\r\n// </svg>\r\n// );\r\n// }\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\ninterface ViewOption {\r\n value: TCalendarView;\r\n label: string;\r\n icon: React.ComponentType<{ className?: string }>;\r\n}\r\n\r\nexport interface CalendarHeaderProps<TData = Record<string, unknown>> {\r\n /** Current date */\r\n currentDate: Date;\r\n /** Current view */\r\n view: TCalendarView;\r\n /** Events for count display */\r\n events?: CalendarEvent<TData>[];\r\n /** Navigate to today */\r\n onNavigateToday?: () => void;\r\n /** Navigate prev */\r\n onNavigatePrev?: () => void;\r\n /** Navigate next */\r\n onNavigateNext?: () => void;\r\n /** Navigate callback (legacy) */\r\n onNavigate?: (direction: 'prev' | 'next' | 'today') => void;\r\n /** View change callback */\r\n onViewChange?: (view: TCalendarView) => void;\r\n /** Add event callback */\r\n onAddEvent?: () => void;\r\n /** Available calendar views to show */\r\n availableViews?: TCalendarView[];\r\n /** Show timeline views dropdown */\r\n showTimelineViews?: boolean;\r\n /** Available timeline views */\r\n timelineViews?: TCalendarView[];\r\n /** Settings content (rendered in popover) */\r\n settingsContent?: ReactNode;\r\n /** Show settings button */\r\n showSettings?: boolean;\r\n /** Filter row content */\r\n filterContent?: ReactNode;\r\n /** Additional actions to render */\r\n actions?: ReactNode;\r\n /** Additional CSS classes */\r\n className?: string;\r\n /** Week starts on (0 = Sunday, 1 = Monday) */\r\n weekStartsOn?: 0 | 1;\r\n /** Labels for i18n */\r\n labels?: {\r\n today?: string;\r\n day?: string;\r\n week?: string;\r\n month?: string;\r\n year?: string;\r\n agenda?: string;\r\n addEvent?: string;\r\n calendarView?: string;\r\n resourceView?: string;\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// VIEW CONFIGURATION\r\n// ============================================================================\r\n\r\n/** Calendar grid views */\r\nconst CALENDAR_VIEWS: ViewOption[] = [\r\n { value: 'day', label: 'Day', icon: LayoutList },\r\n { value: 'week', label: 'Week', icon: Columns },\r\n { value: 'month', label: 'Month', icon: Grid2X2 },\r\n { value: 'year', label: 'Year', icon: Grid3X3 },\r\n // { value: 'agenda', label: 'Agenda', icon: ListIcon }, NOTE: Not needed currently\r\n];\r\n\r\n/** Timeline/Resource views */\r\nconst TIMELINE_VIEWS: ViewOption[] = [\r\n { value: 'timeline-day', label: '1 Day', icon: GanttChartSquare },\r\n { value: 'timeline-3day', label: '3 Days', icon: GanttChartSquare },\r\n { value: 'timeline-week', label: '7 Days', icon: GanttChartSquare },\r\n];\r\n\r\n// ============================================================================\r\n// COMPONENT\r\n// ============================================================================\r\n\r\nexport function CalendarHeader<TData = Record<string, unknown>>({\r\n currentDate,\r\n view,\r\n events = [],\r\n onNavigateToday,\r\n onNavigatePrev,\r\n onNavigateNext,\r\n onNavigate,\r\n onViewChange,\r\n onAddEvent,\r\n availableViews = ['day', 'week', 'month', 'agenda'],\r\n showTimelineViews = false,\r\n timelineViews: _timelineViews,\r\n settingsContent,\r\n showSettings = false,\r\n filterContent,\r\n actions,\r\n className,\r\n weekStartsOn = 1,\r\n labels = {},\r\n}: CalendarHeaderProps<TData>) {\r\n // Merge labels\r\n const mergedLabels = useMemo(\r\n () => ({\r\n today: 'Today',\r\n addEvent: 'Add Event',\r\n calendarView: 'Calendar View',\r\n resourceView: 'Resource View',\r\n ...labels,\r\n }),\r\n [labels],\r\n );\r\n\r\n // Handle navigation (support both new and legacy callbacks)\r\n const handleToday = () => {\r\n onNavigateToday?.();\r\n onNavigate?.('today');\r\n };\r\n const handlePrev = () => {\r\n onNavigatePrev?.();\r\n onNavigate?.('prev');\r\n };\r\n const handleNext = () => {\r\n onNavigateNext?.();\r\n onNavigate?.('next');\r\n };\r\n\r\n // Determine current view category\r\n const isCalendarView = ['day', 'week', 'month', 'year', 'agenda'].includes(view);\r\n const isTimelineView = view.startsWith('timeline-') || view.startsWith('resource-');\r\n\r\n // Filter available views\r\n const calendarViewOptions = CALENDAR_VIEWS.filter((v) =>\r\n availableViews.includes(v.value),\r\n );\r\n\r\n // Get current calendar view label\r\n const currentCalendarView = isCalendarView\r\n ? calendarViewOptions.find((v) => v.value === view)\r\n : null;\r\n\r\n // Get current timeline view label\r\n const currentTimelineView = isTimelineView\r\n ? TIMELINE_VIEWS.find((v) => v.value === view)\r\n : null;\r\n\r\n return (\r\n <div className={cn('flex flex-col w-full gap-3 mb-2', className)}>\r\n {/* Main header row: Today + Date + View selectors + Settings + Add */}\r\n <div className=\"flex lg:flex-row flex-col w-full justify-between gap-3\">\r\n {/* Left: Today + Date + Add button (mobile) */}\r\n <div className=\"flex items-center justify-between gap-2\">\r\n <div className=\"flex items-center gap-2 sm:gap-3 min-w-0\">\r\n <TodayButton onClick={handleToday} />\r\n <DateNavigator\r\n date={currentDate}\r\n view={view}\r\n events={events}\r\n onNavigatePrev={handlePrev}\r\n onNavigateNext={handleNext}\r\n weekStartsOn={weekStartsOn}\r\n />\r\n </div>\r\n\r\n {/* Add button - visible on mobile */}\r\n {onAddEvent && (\r\n <Button\r\n size=\"icon\"\r\n className=\"shrink-0 lg:hidden\"\r\n onClick={onAddEvent}\r\n >\r\n <Plus className=\"size-4\" />\r\n </Button>\r\n )}\r\n </div>\r\n\r\n {/* Right: View selectors and controls */}\r\n <div className=\"flex items-center gap-1.5 sm:gap-2 overflow-x-auto pb-1 -mb-1 scrollbar-none\">\r\n {/* Calendar View Dropdown */}\r\n {onViewChange && calendarViewOptions.length > 0 && (\r\n <DropdownMenu>\r\n <DropdownMenuTrigger\r\n className={cn(\r\n 'inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors',\r\n 'h-10 px-2 sm:px-3 gap-1 sm:gap-1.5 shrink-0',\r\n isCalendarView\r\n ? 'bg-primary text-primary-foreground hover:bg-primary/90'\r\n : 'border border-input bg-background hover:bg-accent hover:text-accent-foreground',\r\n )}\r\n >\r\n <CalendarDays className=\"size-4\" />\r\n <span className=\"text-xs sm:text-sm font-medium\">\r\n {currentCalendarView?.label ?? mergedLabels.calendarView}\r\n </span>\r\n <ChevronDown className=\"size-3 opacity-60\" />\r\n </DropdownMenuTrigger>\r\n <DropdownMenuContent align=\"start\" className=\"min-w-[120px]\">\r\n {calendarViewOptions.map((viewOption) => {\r\n const Icon = viewOption.icon;\r\n return (\r\n <DropdownMenuItem\r\n key={viewOption.value}\r\n onClick={() => onViewChange(viewOption.value)}\r\n className={cn(\r\n 'gap-2',\r\n view === viewOption.value && 'bg-accent',\r\n )}\r\n >\r\n <Icon className=\"size-4\" />\r\n <span>{viewOption.label}</span>\r\n </DropdownMenuItem>\r\n );\r\n })}\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n )}\r\n\r\n {/* Timeline View Dropdown */}\r\n {showTimelineViews && onViewChange && (\r\n <DropdownMenu>\r\n <DropdownMenuTrigger\r\n className={cn(\r\n 'inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors',\r\n 'h-10 px-2 sm:px-3 gap-1 sm:gap-1.5 shrink-0',\r\n isTimelineView\r\n ? 'bg-primary text-primary-foreground hover:bg-primary/90'\r\n : 'border border-input bg-white hover:bg-zinc-50 hover:text-accent-foreground',\r\n )}\r\n >\r\n <GanttChartSquare className=\"size-4\" />\r\n <span className=\"text-xs sm:text-sm font-medium\">\r\n {currentTimelineView?.label ?? mergedLabels.resourceView}\r\n </span>\r\n <ChevronDown className=\"size-3 opacity-60\" />\r\n </DropdownMenuTrigger>\r\n <DropdownMenuContent align=\"start\" className=\"min-w-[120px]\">\r\n {TIMELINE_VIEWS.map((viewOption) => {\r\n const Icon = viewOption.icon;\r\n return (\r\n <DropdownMenuItem\r\n key={viewOption.value}\r\n onClick={() => onViewChange(viewOption.value)}\r\n className={cn(\r\n 'gap-2',\r\n view === viewOption.value && 'bg-accent',\r\n )}\r\n >\r\n <Icon className=\"size-4\" />\r\n <span>{viewOption.label}</span>\r\n </DropdownMenuItem>\r\n );\r\n })}\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n )}\r\n\r\n {/* Settings popover */}\r\n {showSettings && settingsContent && (\r\n <Popover>\r\n <PopoverTrigger asChild>\r\n <Button\r\n variant=\"outline\"\r\n size=\"icon\"\r\n className=\"min-w-10 min-h-10 shrink-0 mx-0\"\r\n >\r\n <Settings className=\"size-4 sm:size-5\" />\r\n </Button>\r\n </PopoverTrigger>\r\n <PopoverContent\r\n className=\"w-auto min-w-80 p-0\"\r\n align=\"end\"\r\n sideOffset={8}\r\n >\r\n <div className=\"max-h-[70vh] overflow-y-auto p-4 space-y-6\">\r\n {settingsContent}\r\n </div>\r\n </PopoverContent>\r\n </Popover>\r\n )}\r\n\r\n {/* Custom actions */}\r\n {actions}\r\n\r\n {/* Add Event button - desktop only */}\r\n {onAddEvent && (\r\n <Button className=\"hidden lg:flex shrink-0 max-h-10\" onClick={onAddEvent}>\r\n <Plus className=\"size-4\" />\r\n {mergedLabels.addEvent}\r\n </Button>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Filter row */}\r\n {filterContent && (\r\n <div className=\"flex items-center gap-2 overflow-x-auto pb-1 -mb-1 scrollbar-none\">\r\n {filterContent}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default CalendarHeader;\r\n","import * as TooltipPrimitive from '@radix-ui/react-tooltip';\r\nimport * as React from 'react';\r\n\r\nimport { cn } from '../../lib/utils';\r\n\r\nconst TooltipProvider = TooltipPrimitive.Provider;\r\n\r\nconst Tooltip = TooltipPrimitive.Root;\r\n\r\nconst TooltipTrigger = TooltipPrimitive.Trigger;\r\n\r\nconst TooltipContent = React.forwardRef<\r\n React.ElementRef<typeof TooltipPrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\r\n>(({ className, sideOffset = 4, ...props }, ref) => (\r\n <TooltipPrimitive.Content\r\n ref={ref}\r\n sideOffset={sideOffset}\r\n className={cn(\r\n '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',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n));\r\nTooltipContent.displayName = TooltipPrimitive.Content.displayName;\r\n\r\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };\r\n","/**\r\n * Event Card Component\r\n *\r\n * A versatile event display component with multiple variants:\r\n * - full: Full card with all details (for day/week views)\r\n * - compact: Compact single-line (for month view cells)\r\n * - dot: Dot indicator only (for mini calendars)\r\n *\r\n * Supports badge variants:\r\n * - colored: Full colored background\r\n * - dot: Neutral background with colored dot\r\n * - mixed: Colored background with dot\r\n *\r\n * Styling matches agenda-v2 production design:\r\n * - Soft backgrounds with dark mode support\r\n * - Colored borders and text for better readability\r\n * - SVG dots with fill classes\r\n * - Canceled/past event states\r\n * - Drag & drop support for event repositioning\r\n *\r\n * @template TData - Custom event data type\r\n */\r\n\r\nimport { type CSSProperties, useCallback, useState, type ReactNode } from 'react';\r\nimport { cn } from '../../lib/utils';\r\nimport type { CalendarEvent, TBadgeVariant, TEventColor } from '../../core/types';\r\nimport { useOptionalDragDrop } from '../../core/context';\r\nimport { Popover, PopoverContent, PopoverTrigger } from '../ui/popover';\r\nimport { Tooltip, TooltipContent, TooltipTrigger } from '../ui/tooltip';\r\n\r\n// ============================================================================\r\n// COLOR UTILITIES (matches agenda-v2 transformers.ts)\r\n// ============================================================================\r\n\r\n/**\r\n * Get color classes for an event - matches agenda-v2 styling\r\n * Uses soft backgrounds with darker text for better readability\r\n */\r\nexport function getEventColorClasses(color?: TEventColor): {\r\n bg: string;\r\n text: string;\r\n dot: string;\r\n dotFill: string;\r\n border: string;\r\n} {\r\n const colorMap: Record<TEventColor, { bg: string; text: string; dot: string; dotFill: string; border: string }> = {\r\n blue: {\r\n bg: 'bg-blue-50 dark:bg-blue-950/30',\r\n text: 'text-blue-700 dark:text-blue-300',\r\n dot: 'bg-blue-500',\r\n dotFill: 'fill-blue-600 dark:fill-blue-500',\r\n border: 'border-blue-400 dark:border-blue-600',\r\n },\r\n green: {\r\n bg: 'bg-green-50 dark:bg-green-950/30',\r\n text: 'text-green-700 dark:text-green-300',\r\n dot: 'bg-green-500',\r\n dotFill: 'fill-green-600 dark:fill-green-500',\r\n border: 'border-green-400 dark:border-green-600',\r\n },\r\n red: {\r\n bg: 'bg-red-50 dark:bg-red-950/30',\r\n text: 'text-red-700 dark:text-red-300',\r\n dot: 'bg-red-500',\r\n dotFill: 'fill-red-600 dark:fill-red-500',\r\n border: 'border-red-400 dark:border-red-600',\r\n },\r\n yellow: {\r\n bg: 'bg-yellow-50 dark:bg-yellow-950/30',\r\n text: 'text-yellow-700 dark:text-yellow-300',\r\n dot: 'bg-yellow-500',\r\n dotFill: 'fill-yellow-600 dark:fill-yellow-500',\r\n border: 'border-yellow-400 dark:border-yellow-600',\r\n },\r\n purple: {\r\n bg: 'bg-purple-50 dark:bg-purple-950/30',\r\n text: 'text-purple-700 dark:text-purple-300',\r\n dot: 'bg-purple-500',\r\n dotFill: 'fill-purple-600 dark:fill-purple-500',\r\n border: 'border-purple-400 dark:border-purple-600',\r\n },\r\n orange: {\r\n bg: 'bg-orange-50 dark:bg-orange-950/30',\r\n text: 'text-orange-700 dark:text-orange-300',\r\n dot: 'bg-orange-500',\r\n dotFill: 'fill-orange-600 dark:fill-orange-500',\r\n border: 'border-orange-400 dark:border-orange-600',\r\n },\r\n pink: {\r\n bg: 'bg-pink-50 dark:bg-pink-950/30',\r\n text: 'text-pink-700 dark:text-pink-300',\r\n dot: 'bg-pink-500',\r\n dotFill: 'fill-pink-600 dark:fill-pink-500',\r\n border: 'border-pink-400 dark:border-pink-600',\r\n },\r\n teal: {\r\n bg: 'bg-teal-50 dark:bg-teal-950/30',\r\n text: 'text-teal-700 dark:text-teal-300',\r\n dot: 'bg-teal-500',\r\n dotFill: 'fill-teal-600 dark:fill-teal-500',\r\n border: 'border-teal-400 dark:border-teal-600',\r\n },\r\n gray: {\r\n bg: 'bg-gray-50 dark:bg-gray-950/30',\r\n text: 'text-gray-700 dark:text-gray-300',\r\n dot: 'bg-gray-500',\r\n dotFill: 'fill-gray-600 dark:fill-gray-500',\r\n border: 'border-gray-400 dark:border-gray-600',\r\n },\r\n indigo: {\r\n bg: 'bg-indigo-50 dark:bg-indigo-950/30',\r\n text: 'text-indigo-700 dark:text-indigo-300',\r\n dot: 'bg-indigo-500',\r\n dotFill: 'fill-indigo-600 dark:fill-indigo-500',\r\n border: 'border-indigo-400 dark:border-indigo-600',\r\n },\r\n };\r\n\r\n return colorMap[color ?? 'blue'];\r\n}\r\n\r\n// ============================================================================\r\n// TIME FORMATTING\r\n// ============================================================================\r\n\r\n/**\r\n * Format time for display (24h format: HH:mm)\r\n */\r\nfunction formatTime(date: Date): string {\r\n return date.toLocaleTimeString([], {\r\n hour: '2-digit',\r\n minute: '2-digit',\r\n hour12: false,\r\n });\r\n}\r\n\r\n/**\r\n * Format time range\r\n */\r\nfunction formatTimeRange(start: Date, end: Date): string {\r\n return `${formatTime(start)} - ${formatTime(end)}`;\r\n}\r\n\r\n/**\r\n * Check if a date is at the start of today (past detection)\r\n */\r\nfunction startOfDay(date: Date): Date {\r\n const d = new Date(date);\r\n d.setHours(0, 0, 0, 0);\r\n return d;\r\n}\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface EventCardProps<TData = Record<string, unknown>> {\r\n /** The event to display */\r\n event: CalendarEvent<TData>;\r\n /** Display variant */\r\n variant?: 'full' | 'compact' | 'dot';\r\n /** Badge variant for coloring style */\r\n badgeVariant?: TBadgeVariant;\r\n /** Click handler */\r\n onClick?: ((event: CalendarEvent<TData>) => void) | undefined;\r\n /** Additional CSS classes */\r\n className?: string;\r\n /** Show time */\r\n showTime?: boolean;\r\n /** Show description */\r\n showDescription?: boolean;\r\n /** Show participants */\r\n showParticipants?: boolean;\r\n /** Inline styles (for positioning) */\r\n style?: CSSProperties;\r\n /** Disable popover and use onClick instead */\r\n disablePopover?: boolean;\r\n /** Custom popover content */\r\n renderPopover?: ((props: { event: CalendarEvent<TData>; onClose: () => void }) => ReactNode) | undefined;\r\n /** Enable drag support for event repositioning */\r\n enableDrag?: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// COMPONENT\r\n// ============================================================================\r\n\r\nexport function EventCard<TData = Record<string, unknown>>({\r\n event,\r\n variant = 'full',\r\n badgeVariant = 'colored',\r\n onClick,\r\n className,\r\n showTime = true,\r\n showDescription = false,\r\n showParticipants = false,\r\n style,\r\n disablePopover = false,\r\n renderPopover,\r\n enableDrag = false,\r\n}: EventCardProps<TData>) {\r\n const colors = getEventColorClasses(event.color);\r\n const [popoverOpen, setPopoverOpen] = useState(false);\r\n const [isDragging, setIsDragging] = useState(false);\r\n\r\n // Get drag-drop context\r\n const dragDrop = useOptionalDragDrop();\r\n\r\n // Check if event is in the past (ended before start of today)\r\n const isPast = event.endDate < startOfDay(new Date());\r\n\r\n // Check if event is canceled\r\n const isCanceled = event.isCanceled ?? false;\r\n\r\n // Don't allow dragging for cancelled or past events\r\n const canDrag = enableDrag && dragDrop && !isCanceled && !isPast;\r\n\r\n // Status icons (matches agenda-v2)\r\n const statusIcon = isCanceled ? (\r\n <XIcon className=\"h-3 w-3 text-zinc-800 dark:text-zinc-200\" />\r\n ) : event.meetingTookPlace ? (\r\n <CheckIcon className={cn('h-3 w-3', colors.text)} />\r\n ) : null;\r\n\r\n // Handle click\r\n const handleClick = useCallback(() => {\r\n if (isDragging) return; // Don't open popover during drag\r\n if (disablePopover && onClick) {\r\n onClick(event);\r\n } else if (!disablePopover) {\r\n setPopoverOpen(true);\r\n }\r\n }, [isDragging, disablePopover, onClick, event]);\r\n\r\n // Handle popover close\r\n const handleClose = useCallback(() => {\r\n setPopoverOpen(false);\r\n }, []);\r\n\r\n // Drag handlers (matches agenda-v2)\r\n const handleDragStart = useCallback(\r\n (e: React.DragEvent) => {\r\n if (!canDrag) return;\r\n e.dataTransfer.effectAllowed = 'move';\r\n e.dataTransfer.setData('text/plain', event.id);\r\n setIsDragging(true);\r\n dragDrop?.startDrag?.(event);\r\n },\r\n [canDrag, event, dragDrop],\r\n );\r\n\r\n const handleDragEnd = useCallback(() => {\r\n setIsDragging(false);\r\n if (dragDrop?.isDragging) {\r\n dragDrop.endDrag?.();\r\n }\r\n }, [dragDrop]);\r\n\r\n // ========================================================================\r\n // DOT VARIANT\r\n // ========================================================================\r\n\r\n if (variant === 'dot') {\r\n const dotButton = (\r\n <button\r\n type=\"button\"\r\n onClick={handleClick}\r\n className={cn(\r\n 'size-2 rounded-full cursor-pointer transition-opacity',\r\n isPast ? 'bg-gray-400' : colors.dot,\r\n event.isCanceled && 'opacity-50',\r\n className,\r\n )}\r\n style={style}\r\n aria-label={event.title}\r\n />\r\n );\r\n\r\n if (disablePopover) {\r\n return (\r\n <Tooltip>\r\n <TooltipTrigger asChild>{dotButton}</TooltipTrigger>\r\n <TooltipContent>\r\n <div className=\"flex flex-col gap-0.5\">\r\n <div className=\"font-medium\">{event.title}</div>\r\n <div className=\"text-xs opacity-80\">\r\n {formatTimeRange(event.startDate, event.endDate)}\r\n </div>\r\n </div>\r\n </TooltipContent>\r\n </Tooltip>\r\n );\r\n }\r\n\r\n return (\r\n <Popover open={popoverOpen} onOpenChange={setPopoverOpen}>\r\n <PopoverTrigger asChild>\r\n <Tooltip>\r\n <TooltipTrigger asChild>{dotButton}</TooltipTrigger>\r\n <TooltipContent>\r\n <div className=\"font-medium\">{event.title}</div>\r\n </TooltipContent>\r\n </Tooltip>\r\n </PopoverTrigger>\r\n <PopoverContent className=\"w-80\">\r\n {renderPopover ? (\r\n renderPopover({ event, onClose: handleClose })\r\n ) : (\r\n <DefaultPopoverContent event={event} onClose={handleClose} />\r\n )}\r\n </PopoverContent>\r\n </Popover>\r\n );\r\n }\r\n\r\n // ========================================================================\r\n // COMPACT VARIANT (matches agenda-v2 - marquee title, time pill, drag support)\r\n // ========================================================================\r\n\r\n if (variant === 'compact') {\r\n const compactContent = (\r\n <div\r\n role=\"button\"\r\n tabIndex={0}\r\n draggable={!!canDrag}\r\n onDragStart={handleDragStart}\r\n onDragEnd={handleDragEnd}\r\n onClick={disablePopover ? handleClick : undefined}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault();\r\n handleClick();\r\n }\r\n }}\r\n className={cn(\r\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',\r\n canDrag ? 'cursor-grab active:cursor-grabbing' : 'cursor-pointer',\r\n isDragging && 'opacity-50',\r\n // Cancelled events get gray background with strikethrough\r\n isCanceled\r\n ? 'bg-zinc-100 dark:bg-zinc-800 text-zinc-500 dark:text-zinc-400 line-through'\r\n : // Past events get neutral zinc styling\r\n isPast\r\n ? 'bg-zinc-100 dark:bg-zinc-800 text-zinc-500 dark:text-zinc-400 line-through'\r\n : [\r\n badgeVariant === 'colored' && [colors.bg, colors.text],\r\n badgeVariant === 'mixed' && [colors.bg, colors.text],\r\n badgeVariant === 'dot' && 'bg-muted/50',\r\n ],\r\n className,\r\n )}\r\n style={style}\r\n >\r\n {/* Colored dot for dot/mixed variants (matches agenda-v2 - no isCanceled check) */}\r\n {['dot', 'mixed'].includes(badgeVariant) && !isPast && (\r\n <svg\r\n width=\"8\"\r\n height=\"8\"\r\n viewBox=\"0 0 8 8\"\r\n className=\"event-dot absolute -top-1 -left-1 shrink-0\"\r\n aria-hidden=\"true\"\r\n focusable=\"false\"\r\n >\r\n <circle cx=\"4\" cy=\"4\" r=\"4\" className={colors.dotFill} />\r\n </svg>\r\n )}\r\n\r\n {/* Title with marquee effect */}\r\n <span className=\"flex-1 min-w-0 overflow-hidden\">\r\n <span className=\"\">\r\n <span\r\n className=\"relative block overflow-hidden whitespace-nowrap text-xs leading-tight\"\r\n style={{\r\n maskImage:\r\n 'linear-gradient(to right, transparent 0, black 8px, black calc(100% - 8px), transparent 100%)',\r\n WebkitMaskImage:\r\n 'linear-gradient(to right, transparent 0, black 8px, black calc(100% - 8px), transparent 100%)',\r\n }}\r\n >\r\n <span className=\"inline-flex event-marquee\">\r\n <span className=\"shrink-0 px-1\">{event.title}</span>\r\n <span className=\"shrink-0 px-1\">•</span>\r\n <span aria-hidden=\"true\" className=\"shrink-0 px-1\">\r\n {event.title}\r\n </span>\r\n <span aria-hidden=\"true\" className=\"shrink-0 px-1\">\r\n •\r\n </span>\r\n </span>\r\n </span>\r\n\r\n {/* Time pill with dashed border - always shown in compact variant (matches agenda-v2) */}\r\n <div\r\n className={cn(\r\n 'w-fit mt-0.5 text-[10px] px-1 py-0.5 border border-dashed rounded-full font-medium',\r\n isPast ? 'border-zinc-400 dark:border-zinc-600' : colors.border,\r\n )}\r\n >\r\n {formatTimeRange(event.startDate, event.endDate)}\r\n </div>\r\n </span>\r\n </span>\r\n {/* Status icon on right (matches agenda-v2) */}\r\n <div className=\"flex gap-0.5\">{statusIcon}</div>\r\n </div>\r\n );\r\n\r\n if (disablePopover) {\r\n return (\r\n <Tooltip>\r\n <TooltipTrigger asChild>{compactContent}</TooltipTrigger>\r\n <TooltipContent>\r\n <div className=\"flex flex-col gap-0.5\">\r\n <div className=\"font-medium\">{event.title}</div>\r\n <div className=\"text-xs text-muted-foreground tabular-nums\">\r\n {formatTimeRange(event.startDate, event.endDate)}\r\n </div>\r\n </div>\r\n </TooltipContent>\r\n </Tooltip>\r\n );\r\n }\r\n\r\n return (\r\n <Popover open={popoverOpen} onOpenChange={setPopoverOpen}>\r\n <PopoverTrigger asChild>{compactContent}</PopoverTrigger>\r\n <PopoverContent className=\"w-80\">\r\n {renderPopover ? (\r\n renderPopover({ event, onClose: handleClose })\r\n ) : (\r\n <DefaultPopoverContent event={event} onClose={handleClose} />\r\n )}\r\n </PopoverContent>\r\n </Popover>\r\n );\r\n }\r\n\r\n // ========================================================================\r\n // FULL VARIANT (matches agenda-v2 - border, hover shadow, colored text)\r\n // ========================================================================\r\n\r\n const fullContent = (\r\n <button\r\n type=\"button\"\r\n onClick={handleClick}\r\n className={cn(\r\n 'group relative flex w-full flex-col gap-1 rounded-md border px-2 py-1.5 text-left transition-all hover:shadow-md',\r\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\r\n // Cancelled events get gray background with strikethrough\r\n isCanceled\r\n ? 'bg-zinc-100 dark:bg-zinc-800 border-zinc-300 dark:border-zinc-700 text-zinc-500 dark:text-zinc-400 line-through'\r\n : // Past events get neutral zinc styling with strikethrough\r\n isPast\r\n ? 'bg-zinc-100 dark:bg-zinc-800 border-zinc-300 dark:border-zinc-700 text-zinc-500 dark:text-zinc-400 line-through'\r\n : [\r\n badgeVariant === 'colored' && [colors.bg, colors.border, colors.text],\r\n badgeVariant === 'mixed' && [colors.bg, colors.border, colors.text],\r\n badgeVariant === 'dot' && 'bg-muted/50 border-border',\r\n ],\r\n className,\r\n )}\r\n style={style}\r\n >\r\n {/* Header row */}\r\n <div className=\"flex items-start justify-between gap-1\">\r\n <div className=\"flex items-center gap-1.5 min-w-0\">\r\n {/* Colored dot for dot/mixed variants */}\r\n {['dot', 'mixed'].includes(badgeVariant) && !isPast && !isCanceled && (\r\n <svg\r\n width=\"8\"\r\n height=\"8\"\r\n viewBox=\"0 0 8 8\"\r\n className=\"event-dot shrink-0\"\r\n aria-hidden=\"true\"\r\n focusable=\"false\"\r\n >\r\n <circle cx=\"4\" cy=\"4\" r=\"4\" className={colors.dotFill} />\r\n </svg>\r\n )}\r\n <span\r\n className={cn(\r\n 'text-sm font-medium truncate',\r\n !isPast && !isCanceled && badgeVariant !== 'dot' && colors.text,\r\n isCanceled && 'line-through',\r\n )}\r\n >\r\n {event.title}\r\n </span>\r\n </div>\r\n {/* Status icon (matches agenda-v2) */}\r\n {statusIcon}\r\n </div>\r\n\r\n {/* Time display */}\r\n {showTime && (\r\n <div className=\"flex items-center gap-1 text-xs text-muted-foreground\">\r\n <ClockIcon className=\"h-3 w-3 shrink-0\" />\r\n <span>{formatTimeRange(event.startDate, event.endDate)}</span>\r\n </div>\r\n )}\r\n\r\n {/* Description */}\r\n {showDescription && event.description && (\r\n <p className=\"text-xs text-muted-foreground line-clamp-2\">\r\n {event.description}\r\n </p>\r\n )}\r\n\r\n {/* Participants (matches agenda-v2) */}\r\n {showParticipants && event.participants && event.participants.length > 0 && (\r\n <div className=\"flex items-center gap-1 text-xs text-muted-foreground\">\r\n <UsersIcon className=\"h-3 w-3 shrink-0\" />\r\n <span className=\"truncate\">\r\n {event.participants.map((p) => p.name).join(', ')}\r\n </span>\r\n </div>\r\n )}\r\n\r\n {/* Schedule type badge (matches agenda-v2) */}\r\n {event.scheduleTypeName && (\r\n <span\r\n className={cn(\r\n 'mt-1 inline-flex self-start rounded-full px-2 py-0.5 text-[10px] font-medium',\r\n isPast\r\n ? 'bg-zinc-200 dark:bg-zinc-700 text-zinc-500 dark:text-zinc-400'\r\n : [colors.bg, colors.text],\r\n )}\r\n >\r\n {event.scheduleTypeName}\r\n </span>\r\n )}\r\n </button>\r\n );\r\n\r\n if (disablePopover) {\r\n return (\r\n <Tooltip>\r\n <TooltipTrigger asChild>{fullContent}</TooltipTrigger>\r\n <TooltipContent>\r\n <div className=\"flex flex-col gap-0.5\">\r\n <div className=\"font-medium\">{event.title}</div>\r\n <div className=\"text-xs text-muted-foreground tabular-nums\">\r\n {formatTimeRange(event.startDate, event.endDate)}\r\n </div>\r\n </div>\r\n </TooltipContent>\r\n </Tooltip>\r\n );\r\n }\r\n\r\n return (\r\n <Popover open={popoverOpen} onOpenChange={setPopoverOpen}>\r\n <PopoverTrigger asChild>{fullContent}</PopoverTrigger>\r\n <PopoverContent className=\"w-80\">\r\n {renderPopover ? (\r\n renderPopover({ event, onClose: handleClose })\r\n ) : (\r\n <DefaultPopoverContent event={event} onClose={handleClose} />\r\n )}\r\n </PopoverContent>\r\n </Popover>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// CLOCK ICON (inline SVG to avoid lucide-react dependency)\r\n// ============================================================================\r\n\r\nfunction ClockIcon({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={className}\r\n >\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\r\n <polyline points=\"12 6 12 12 16 14\" />\r\n </svg>\r\n );\r\n}\r\n\r\n/**\r\n * Check Icon (inline SVG to avoid lucide-react dependency)\r\n */\r\nfunction CheckIcon({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={className}\r\n >\r\n <path d=\"M20 6 9 17l-5-5\" />\r\n </svg>\r\n );\r\n}\r\n\r\n/**\r\n * X Icon (inline SVG to avoid lucide-react dependency)\r\n */\r\nfunction XIcon({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={className}\r\n >\r\n <path d=\"M18 6 6 18\" />\r\n <path d=\"m6 6 12 12\" />\r\n </svg>\r\n );\r\n}\r\n\r\n/**\r\n * Users Icon (inline SVG to avoid lucide-react dependency)\r\n */\r\nfunction UsersIcon({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={className}\r\n >\r\n <path d=\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\" />\r\n <circle cx=\"9\" cy=\"7\" r=\"4\" />\r\n <path d=\"M22 21v-2a4 4 0 0 0-3-3.87\" />\r\n <path d=\"M16 3.13a4 4 0 0 1 0 7.75\" />\r\n </svg>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// DEFAULT POPOVER CONTENT (matches agenda-v2 Google Calendar style)\r\n// ============================================================================\r\n\r\ninterface DefaultPopoverContentProps<TData> {\r\n event: CalendarEvent<TData>;\r\n onClose: () => void;\r\n}\r\n\r\nfunction DefaultPopoverContent<TData>({ event, onClose }: DefaultPopoverContentProps<TData>) {\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 {/* Header with color indicator */}\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 className={cn('font-semibold text-lg', isCanceled && 'line-through opacity-50')}>\r\n {event.title}\r\n </h3>\r\n <div className=\"flex items-center gap-1 text-sm text-muted-foreground mt-1\">\r\n <ClockIcon className=\"h-4 w-4 shrink-0\" />\r\n <span className=\"tabular-nums\">{formatTimeRange(event.startDate, event.endDate)}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Description */}\r\n {event.description && (\r\n <p className=\"text-sm text-muted-foreground\">{event.description}</p>\r\n )}\r\n\r\n {/* Status badges */}\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\">All day</span>\r\n )}\r\n {event.isRecurring && (\r\n <span className=\"text-xs bg-muted px-2 py-0.5 rounded-full font-medium\">Recurring</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 {/* Close button */}\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// EVENT BLOCK (positioned in time grid - matches agenda-v2)\r\n// ============================================================================\r\n\r\nexport interface EventBlockProps<TData = Record<string, unknown>> {\r\n /** The event to display */\r\n event: CalendarEvent<TData>;\r\n /** Position in the grid */\r\n position: {\r\n top: number;\r\n left: number;\r\n width: number;\r\n minWidth?: number;\r\n };\r\n /** Pixels per hour (default: 96 to match agenda-v2) */\r\n hourHeight?: number;\r\n /** Badge variant for coloring style */\r\n badgeVariant?: TBadgeVariant;\r\n /** Click handler */\r\n onClick?: ((event: CalendarEvent<TData>) => void) | undefined;\r\n /** Additional CSS classes */\r\n className?: string;\r\n /** Disable popover and use onClick instead */\r\n disablePopover?: boolean;\r\n /** Custom popover content */\r\n renderPopover?: ((props: { event: CalendarEvent<TData>; onClose: () => void }) => ReactNode) | undefined;\r\n /** Enable drag support for repositioning */\r\n enableDrag?: boolean;\r\n}\r\n\r\n/**\r\n * EventBlock - Positioned event in day/week time grid\r\n * Matches agenda-v2 styling:\r\n * - Height calculated from event duration\r\n * - Shows time when duration > 25 minutes\r\n * - Uses colored/dot/mixed badge variants\r\n * - Drag & drop support for event repositioning\r\n */\r\nexport function EventBlock<TData = Record<string, unknown>>({\r\n event,\r\n position,\r\n hourHeight = 96,\r\n badgeVariant = 'colored',\r\n onClick,\r\n className,\r\n disablePopover = false,\r\n renderPopover,\r\n enableDrag = true,\r\n}: EventBlockProps<TData>) {\r\n const colors = getEventColorClasses(event.color);\r\n const [popoverOpen, setPopoverOpen] = useState(false);\r\n const [isDragging, setIsDragging] = useState(false);\r\n\r\n // Get drag-drop context\r\n const dragDrop = useOptionalDragDrop();\r\n\r\n // Calculate duration and height\r\n const durationInMinutes = (event.endDate.getTime() - event.startDate.getTime()) / (1000 * 60);\r\n const heightInPixels = (durationInMinutes / 60) * hourHeight - 8;\r\n\r\n // Check if event is in the past\r\n const isPast = event.endDate < startOfDay(new Date());\r\n const isCanceled = event.isCanceled ?? false;\r\n\r\n // Don't allow dragging for cancelled or past events\r\n const canDrag = enableDrag && dragDrop && !isCanceled && !isPast;\r\n\r\n // Short events get centered content\r\n const isShortEvent = durationInMinutes < 35;\r\n const showTime = durationInMinutes > 25;\r\n\r\n // Determine color variant\r\n const isDotVariant = badgeVariant === 'dot';\r\n\r\n // Handle click\r\n const handleClick = useCallback(() => {\r\n if (isDragging) return; // Don't open popover during drag\r\n if (disablePopover && onClick) {\r\n onClick(event);\r\n } else if (!disablePopover) {\r\n setPopoverOpen(true);\r\n }\r\n }, [isDragging, disablePopover, onClick, event]);\r\n\r\n // Handle popover close\r\n const handleClose = useCallback(() => {\r\n setPopoverOpen(false);\r\n }, []);\r\n\r\n // Drag handlers (matches agenda-v2)\r\n const handleDragStart = useCallback(\r\n (e: React.DragEvent) => {\r\n if (!canDrag) return;\r\n e.dataTransfer.effectAllowed = 'move';\r\n e.dataTransfer.setData('text/plain', event.id);\r\n // Set custom drag image with some offset\r\n const target = e.currentTarget as HTMLElement;\r\n const rect = target.getBoundingClientRect();\r\n e.dataTransfer.setDragImage(target, e.clientX - rect.left, e.clientY - rect.top);\r\n setIsDragging(true);\r\n dragDrop?.startDrag?.(event);\r\n },\r\n [canDrag, event, dragDrop],\r\n );\r\n\r\n const handleDragEnd = useCallback(() => {\r\n setIsDragging(false);\r\n if (dragDrop?.isDragging) {\r\n dragDrop.endDrag?.();\r\n }\r\n }, [dragDrop]);\r\n\r\n const handleKeyDown = useCallback(\r\n (e: React.KeyboardEvent) => {\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault();\r\n handleClick();\r\n }\r\n },\r\n [handleClick],\r\n );\r\n\r\n const blockButton = (\r\n <div\r\n role=\"button\"\r\n tabIndex={0}\r\n draggable={!!canDrag}\r\n onDragStart={handleDragStart}\r\n onDragEnd={handleDragEnd}\r\n onKeyDown={handleKeyDown}\r\n onClick={isDragging ? undefined : handleClick}\r\n className={cn(\r\n 'group flex w-full select-none flex-col gap-0.5 overflow-hidden rounded-md border px-2 py-1.5 text-xs text-left',\r\n 'focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\r\n 'transition-opacity',\r\n canDrag ? 'cursor-grab active:cursor-grabbing' : 'cursor-pointer',\r\n isDragging && 'opacity-50',\r\n // Cancelled events get gray background with strikethrough\r\n isCanceled\r\n ? 'bg-zinc-100 dark:bg-zinc-800 border-zinc-300 dark:border-zinc-700 text-zinc-500 dark:text-zinc-400 line-through'\r\n : // Past events get neutral zinc styling with strikethrough\r\n isPast\r\n ? 'bg-zinc-100 dark:bg-zinc-800 border-zinc-300 dark:border-zinc-700 text-zinc-500 dark:text-zinc-400 line-through'\r\n : [\r\n // Colored/mixed variants\r\n !isDotVariant && [colors.bg, colors.border, colors.text],\r\n // Dot variant - neutral background\r\n isDotVariant && 'bg-neutral-50 dark:bg-neutral-900 border-neutral-200 dark:border-neutral-700',\r\n ],\r\n // Short events center content\r\n isShortEvent && 'py-0 justify-center',\r\n className,\r\n )}\r\n style={{ height: `${Math.max(heightInPixels, 20)}px` }}\r\n >\r\n <div className=\"flex items-start gap-1.5 min-w-0\">\r\n {/* Colored dot for dot/mixed variants */}\r\n {['mixed', 'dot'].includes(badgeVariant) && !isPast && !isCanceled && (\r\n <svg\r\n width=\"8\"\r\n height=\"8\"\r\n viewBox=\"0 0 8 8\"\r\n className=\"event-dot shrink-0\"\r\n aria-hidden=\"true\"\r\n focusable=\"false\"\r\n >\r\n <circle cx=\"4\" cy=\"4\" r=\"4\" className={colors.dotFill} />\r\n </svg>\r\n )}\r\n <div className=\"flex-1 min-w-0 overflow-hidden\">\r\n <p\r\n className={cn(\r\n 'font-semibold whitespace-nowrap',\r\n !isPast && !isCanceled && isDotVariant && 'text-foreground',\r\n )}\r\n >\r\n {event.title}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n {/* Time display - only show when there's enough space */}\r\n {showTime && (\r\n <p\r\n className={cn(\r\n 'text-[11px] tabular-nums',\r\n isDotVariant ? 'text-muted-foreground' : 'opacity-90',\r\n )}\r\n >\r\n {formatTime(event.startDate)} - {formatTime(event.endDate)}\r\n </p>\r\n )}\r\n </div>\r\n );\r\n\r\n const tooltipContent = (\r\n <TooltipContent>\r\n <div className=\"flex flex-col gap-0.5\">\r\n <div className=\"font-medium\">{event.title}</div>\r\n <div className=\"text-xs text-muted-foreground tabular-nums\">\r\n {formatTimeRange(event.startDate, event.endDate)}\r\n </div>\r\n </div>\r\n </TooltipContent>\r\n );\r\n\r\n if (disablePopover) {\r\n return (\r\n <div\r\n className=\"absolute p-0.5\"\r\n style={{\r\n top: `${position.top}px`,\r\n left: `${position.left}%`,\r\n width: position.minWidth ? `max(${position.minWidth}px, ${position.width}%)` : `${position.width}%`,\r\n minWidth: position.minWidth ? `${position.minWidth}px` : undefined,\r\n }}\r\n >\r\n <Tooltip>\r\n <TooltipTrigger asChild>{blockButton}</TooltipTrigger>\r\n {tooltipContent}\r\n </Tooltip>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div\r\n className=\"absolute p-0.5\"\r\n style={{\r\n top: `${position.top}px`,\r\n left: `${position.left}%`,\r\n width: position.minWidth ? `max(${position.minWidth}px, ${position.width}%)` : `${position.width}%`,\r\n minWidth: position.minWidth ? `${position.minWidth}px` : undefined,\r\n }}\r\n >\r\n <Popover open={popoverOpen} onOpenChange={setPopoverOpen}>\r\n <PopoverTrigger asChild>{blockButton}</PopoverTrigger>\r\n <PopoverContent className=\"w-80\">\r\n {renderPopover ? (\r\n renderPopover({ event, onClose: handleClose })\r\n ) : (\r\n <DefaultPopoverContent event={event} onClose={handleClose} />\r\n )}\r\n </PopoverContent>\r\n </Popover>\r\n </div>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// MULTI-DAY EVENT BAR (for week/month views - matches agenda-v2)\r\n// ============================================================================\r\n\r\nexport interface MultiDayEventBarProps<TData = Record<string, unknown>> {\r\n /** The event to display */\r\n event: CalendarEvent<TData>;\r\n /** Number of days the event spans */\r\n spanDays: number;\r\n /** Whether this is the start of the event span */\r\n isStart: boolean;\r\n /** Whether this is the end of the event span */\r\n isEnd: boolean;\r\n /** Click handler */\r\n onClick?: (event: CalendarEvent<TData>) => void;\r\n /** Additional CSS classes */\r\n className?: string;\r\n /** Disable popover and use onClick instead */\r\n disablePopover?: boolean;\r\n /** Custom popover content */\r\n renderPopover?: (props: { event: CalendarEvent<TData>; onClose: () => void }) => ReactNode;\r\n}\r\n\r\n/**\r\n * MultiDayEventBar - Horizontal bar for multi-day events in week/month views\r\n */\r\nexport function MultiDayEventBar<TData = Record<string, unknown>>({\r\n event,\r\n spanDays,\r\n isStart,\r\n isEnd,\r\n onClick,\r\n className,\r\n disablePopover = false,\r\n renderPopover,\r\n}: MultiDayEventBarProps<TData>) {\r\n const colors = getEventColorClasses(event.color);\r\n const [popoverOpen, setPopoverOpen] = useState(false);\r\n\r\n // Check if event is in the past\r\n const isPast = event.endDate < startOfDay(new Date());\r\n const isCanceled = event.isCanceled ?? false;\r\n\r\n // Handle click\r\n const handleClick = useCallback(() => {\r\n if (disablePopover && onClick) {\r\n onClick(event);\r\n } else if (!disablePopover) {\r\n setPopoverOpen(true);\r\n }\r\n }, [disablePopover, onClick, event]);\r\n\r\n // Handle popover close\r\n const handleClose = useCallback(() => {\r\n setPopoverOpen(false);\r\n }, []);\r\n\r\n const barButton = (\r\n <button\r\n type=\"button\"\r\n onClick={handleClick}\r\n className={cn(\r\n 'flex h-5 items-center px-1.5 text-xs font-medium transition-opacity hover:opacity-80',\r\n // Cancelled events get gray background with strikethrough\r\n isCanceled\r\n ? 'bg-zinc-200 dark:bg-zinc-700 text-zinc-500 dark:text-zinc-400 line-through'\r\n : // Past events get neutral zinc styling with strikethrough\r\n isPast\r\n ? 'bg-zinc-200 dark:bg-zinc-700 text-zinc-500 dark:text-zinc-400 line-through'\r\n : [colors.dot, 'text-white'],\r\n isStart && 'rounded-l',\r\n isEnd && 'rounded-r',\r\n !isStart && 'border-l-0',\r\n !isEnd && 'border-r-0',\r\n className,\r\n )}\r\n style={{ width: `${spanDays * 100}%` }}\r\n >\r\n {isStart && <span className=\"truncate\">{event.title}</span>}\r\n </button>\r\n );\r\n\r\n const tooltipContent = (\r\n <TooltipContent>\r\n <div className=\"flex flex-col gap-0.5\">\r\n <div className=\"font-medium\">{event.title}</div>\r\n <div className=\"text-xs text-muted-foreground tabular-nums\">\r\n {formatTimeRange(event.startDate, event.endDate)}\r\n </div>\r\n </div>\r\n </TooltipContent>\r\n );\r\n\r\n if (disablePopover) {\r\n return (\r\n <Tooltip>\r\n <TooltipTrigger asChild>{barButton}</TooltipTrigger>\r\n {tooltipContent}\r\n </Tooltip>\r\n );\r\n }\r\n\r\n return (\r\n <Popover open={popoverOpen} onOpenChange={setPopoverOpen}>\r\n <PopoverTrigger asChild>{barButton}</PopoverTrigger>\r\n <PopoverContent className=\"w-80\">\r\n {renderPopover ? (\r\n renderPopover({ event, onClose: handleClose })\r\n ) : (\r\n <DefaultPopoverContent event={event} onClose={handleClose} />\r\n )}\r\n </PopoverContent>\r\n </Popover>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// MARQUEE ANIMATION CSS INJECTION\r\n// ============================================================================\r\n\r\n// Inject marquee animation CSS into document head (runs once)\r\nif (typeof window !== 'undefined' && !document.getElementById('inno-calendar-event-marquee-style')) {\r\n const style = document.createElement('style');\r\n style.id = 'inno-calendar-event-marquee-style';\r\n style.innerHTML = `\r\n@keyframes event-marquee {\r\n 0% { transform: translateX(0); }\r\n 100% { transform: translateX(-50%); }\r\n}\r\n.event-marquee {\r\n animation: event-marquee 28s linear infinite;\r\n will-change: transform;\r\n}\r\n`;\r\n document.head.appendChild(style);\r\n}\r\n\r\nexport default EventCard;\r\n","/**\r\n * Multi-Day Event Banner\r\n *\r\n * Displays multi-day and all-day events in a banner above the time grid.\r\n * Used in Day and Week views.\r\n */\r\n\r\nimport { cn } from '../../lib/utils';\r\nimport type { CalendarEvent, TOnEventClick } from '../../core/types';\r\nimport { getEventColorClasses } from '../event/event-card';\r\nimport { isSameDay } from '../../core/utils/date-utils';\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface MultiDayBannerProps<TData = Record<string, unknown>> {\r\n /** Multi-day events to display */\r\n events: CalendarEvent<TData>[];\r\n /** Reference date (for determining start/end indicators) */\r\n date: Date;\r\n /** Click handler */\r\n onEventClick?: TOnEventClick<TData>;\r\n /** Additional CSS classes */\r\n className?: string;\r\n}\r\n\r\n// ============================================================================\r\n// COMPONENT\r\n// ============================================================================\r\n\r\nexport function MultiDayBanner<TData = Record<string, unknown>>({\r\n events,\r\n date,\r\n onEventClick,\r\n className,\r\n}: MultiDayBannerProps<TData>) {\r\n if (events.length === 0) return null;\r\n\r\n return (\r\n <div\r\n className={cn(\r\n 'border-b bg-muted/20 px-2 py-1.5 space-y-1',\r\n 'sm:px-4 sm:py-2',\r\n className,\r\n )}\r\n >\r\n {/* Label */}\r\n <span className=\"text-[10px] font-medium text-muted-foreground sm:text-xs\">\r\n All day / Multi-day\r\n </span>\r\n\r\n {/* Events */}\r\n <div className=\"flex flex-wrap gap-1\">\r\n {events.map((event) => {\r\n const colors = getEventColorClasses(event.color);\r\n const isStart = isSameDay(event.startDate, date);\r\n const isEnd = isSameDay(event.endDate, date);\r\n\r\n return (\r\n <button\r\n key={event.id}\r\n type=\"button\"\r\n onClick={() => onEventClick?.(event)}\r\n className={cn(\r\n 'inline-flex items-center gap-1 rounded px-1.5 py-0.5 text-[10px] font-medium transition-opacity hover:opacity-80',\r\n 'sm:px-2 sm:py-1 sm:text-xs',\r\n colors.bg,\r\n colors.text,\r\n event.isCanceled && 'opacity-60 line-through',\r\n )}\r\n >\r\n {isStart && '→ '}\r\n <span className=\"truncate max-w-24 sm:max-w-32\">{event.title}</span>\r\n {isEnd && ' →'}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default MultiDayBanner;\r\n","/**\r\n * Selectable Slot Component\r\n *\r\n * A unified component for handling slot interactions in calendar views.\r\n * Supports:\r\n * - Single click (quick event creation)\r\n * - Click and drag (range selection)\r\n * - Touch support for mobile\r\n * - Visual feedback during selection\r\n * - Drag & drop receiving for event repositioning\r\n *\r\n * This component consolidates the interaction logic that was previously\r\n * scattered across different view components.\r\n */\r\n\r\nimport { cn } from '../../lib/utils';\r\nimport { useCallback, useRef, useEffect, useState, type ReactNode } from 'react';\r\nimport type { ITimeSlot } from '../../core/types';\r\nimport { useOptionalDragDrop } from '../../core/context';\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface SelectableSlotProps {\r\n /** The time slot this component represents */\r\n slot: ITimeSlot;\r\n /** Called when selection starts on this slot */\r\n onSelectionStart?: (slot: ITimeSlot) => void;\r\n /** Called when pointer moves over this slot during selection */\r\n onSelectionMove?: (slot: ITimeSlot) => void;\r\n /** Called when selection ends on this slot */\r\n onSelectionEnd?: () => void;\r\n /** Whether this slot is currently in the selection range */\r\n isSelected?: boolean;\r\n /** Whether a selection is in progress (for hover effects) */\r\n isSelecting?: boolean;\r\n /** Whether this slot is disabled (non-working hours) */\r\n disabled?: boolean;\r\n /** Accessibility label */\r\n ariaLabel?: string;\r\n /** Child content */\r\n children?: ReactNode;\r\n /** Additional classes */\r\n className?: string;\r\n /** Height of the slot (for time grid positioning) */\r\n height?: string | number;\r\n /** Inline style for positioning */\r\n style?: React.CSSProperties;\r\n /** Custom data attributes */\r\n dataAttributes?: Record<string, string>;\r\n}\r\n\r\n// ============================================================================\r\n// CONSTANTS\r\n// ============================================================================\r\n\r\n/** Minimum drag distance to differentiate from click (in pixels) */\r\nconst DRAG_THRESHOLD = 5;\r\n\r\n// ============================================================================\r\n// COMPONENT\r\n// ============================================================================\r\n\r\nexport function SelectableSlot({\r\n slot,\r\n onSelectionStart,\r\n onSelectionMove,\r\n onSelectionEnd,\r\n isSelected = false,\r\n isSelecting = false,\r\n disabled = false,\r\n ariaLabel,\r\n children,\r\n className,\r\n height,\r\n style,\r\n dataAttributes,\r\n}: SelectableSlotProps) {\r\n // Track if this is a drag or click\r\n const startPositionRef = useRef<{ x: number; y: number } | null>(null);\r\n const isDraggingRef = useRef(false);\r\n const isMouseDownRef = useRef(false);\r\n const buttonRef = useRef<HTMLButtonElement>(null);\r\n const [isDragOver, setIsDragOver] = useState(false);\r\n\r\n // Get drag-drop context for receiving dropped events\r\n const dragDrop = useOptionalDragDrop();\r\n\r\n // Handle pointer down (mouse or touch)\r\n const handlePointerDown = useCallback(\r\n (e: React.PointerEvent) => {\r\n if (disabled) return;\r\n\r\n // Only handle primary button (left click) or touch\r\n if (e.button !== 0 && e.pointerType === 'mouse') return;\r\n\r\n // Prevent text selection during drag\r\n e.preventDefault();\r\n\r\n // Store start position for drag detection\r\n startPositionRef.current = { x: e.clientX, y: e.clientY };\r\n isDraggingRef.current = false;\r\n isMouseDownRef.current = true;\r\n\r\n // Start selection\r\n onSelectionStart?.(slot);\r\n },\r\n [disabled, slot, onSelectionStart],\r\n );\r\n\r\n // Handle pointer move - check for drag threshold\r\n const handlePointerMove = useCallback(\r\n (e: React.PointerEvent) => {\r\n if (!(startPositionRef.current && isMouseDownRef.current && !disabled)) return;\r\n\r\n // Check if we've moved enough to be a drag\r\n const dx = e.clientX - startPositionRef.current.x;\r\n const dy = e.clientY - startPositionRef.current.y;\r\n const distance = Math.sqrt(dx * dx + dy * dy);\r\n\r\n if (distance >= DRAG_THRESHOLD) {\r\n isDraggingRef.current = true;\r\n }\r\n },\r\n [disabled],\r\n );\r\n\r\n // Handle pointer enter - key for multi-cell selection\r\n const handlePointerEnter = useCallback(\r\n (e: React.PointerEvent) => {\r\n if (disabled) return;\r\n\r\n // Check if any pointer button is pressed (works for both mouse and touch)\r\n // e.buttons is a bitmask: 1 = primary button (left), 2 = secondary, etc.\r\n if (e.buttons > 0 || isSelecting) {\r\n onSelectionMove?.(slot);\r\n }\r\n },\r\n [disabled, isSelecting, slot, onSelectionMove],\r\n );\r\n\r\n // Handle pointer up\r\n const handlePointerUp = useCallback(() => {\r\n if (disabled) return;\r\n\r\n // End selection\r\n onSelectionEnd?.();\r\n\r\n // Reset tracking\r\n startPositionRef.current = null;\r\n isDraggingRef.current = false;\r\n isMouseDownRef.current = false;\r\n }, [disabled, onSelectionEnd]);\r\n\r\n // Drag & drop handlers for receiving events\r\n const handleDragOver = useCallback(\r\n (e: React.DragEvent) => {\r\n if (!dragDrop?.isDragging || disabled) return;\r\n e.preventDefault();\r\n e.dataTransfer.dropEffect = 'move';\r\n setIsDragOver(true);\r\n // Update preview position in drag context\r\n // For month view (no hour/minute), use current time\r\n const now = new Date();\r\n const hour = slot.hour ?? now.getHours();\r\n const minute = slot.minute ?? (now.getMinutes() >= 30 ? 30 : 0);\r\n dragDrop.updateDragPreview?.(slot.date, hour, minute);\r\n },\r\n [dragDrop, disabled, slot],\r\n );\r\n\r\n const handleDragLeave = useCallback(() => {\r\n setIsDragOver(false);\r\n }, []);\r\n\r\n const handleDrop = useCallback(\r\n (e: React.DragEvent) => {\r\n e.preventDefault();\r\n setIsDragOver(false);\r\n if (!dragDrop?.isDragging || disabled) return;\r\n // End drag and trigger the drop callback in DragDropProvider\r\n dragDrop.endDrag?.();\r\n },\r\n [dragDrop, disabled],\r\n );\r\n\r\n // Add global pointer up listener to handle cases where mouse is released outside\r\n useEffect(() => {\r\n const handleGlobalPointerUp = () => {\r\n if (isMouseDownRef.current) {\r\n isMouseDownRef.current = false;\r\n startPositionRef.current = null;\r\n isDraggingRef.current = false;\r\n }\r\n };\r\n\r\n window.addEventListener('pointerup', handleGlobalPointerUp);\r\n window.addEventListener('pointercancel', handleGlobalPointerUp);\r\n\r\n return () => {\r\n window.removeEventListener('pointerup', handleGlobalPointerUp);\r\n window.removeEventListener('pointercancel', handleGlobalPointerUp);\r\n };\r\n }, []);\r\n\r\n // Handle keyboard for accessibility\r\n const handleKeyDown = useCallback(\r\n (e: React.KeyboardEvent) => {\r\n if (disabled) return;\r\n\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault();\r\n onSelectionStart?.(slot);\r\n onSelectionEnd?.();\r\n }\r\n },\r\n [disabled, slot, onSelectionStart, onSelectionEnd],\r\n );\r\n\r\n return (\r\n <button\r\n ref={buttonRef}\r\n type=\"button\"\r\n aria-label={ariaLabel}\r\n aria-disabled={disabled}\r\n aria-pressed={isSelected}\r\n disabled={disabled}\r\n onPointerDown={handlePointerDown}\r\n onPointerMove={handlePointerMove}\r\n onPointerUp={handlePointerUp}\r\n onPointerEnter={handlePointerEnter}\r\n onKeyDown={handleKeyDown}\r\n onDragOver={handleDragOver}\r\n onDragLeave={handleDragLeave}\r\n onDrop={handleDrop}\r\n className={cn(\r\n 'select-none touch-none cursor-pointer transition-colors',\r\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset',\r\n // Hover state (only when not in selection)\r\n !(isSelecting || disabled) && 'hover:bg-accent/50',\r\n // Selection state\r\n isSelected && 'bg-zinc-50',\r\n // Drag over state - visual feedback when event is dragged over\r\n isDragOver && 'bg-primary/20 ring-2 ring-primary ring-inset',\r\n // Disabled state\r\n disabled && 'cursor-not-allowed opacity-50',\r\n className,\r\n )}\r\n style={{ height, ...style }}\r\n {...dataAttributes}\r\n >\r\n {children}\r\n </button>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// SPECIALIZED SLOT COMPONENTS\r\n// ============================================================================\r\n\r\n/**\r\n * TimeSlot - For day/week views with configurable time granularity\r\n * Supports 15, 30, or 60 minute slot durations\r\n * Accepts either a `slot` prop OR individual `date/hour/minute` props\r\n */\r\ninterface TimeSlotProps extends Omit<SelectableSlotProps, 'slot'> {\r\n /** Direct slot object (preferred) */\r\n slot?: ITimeSlot;\r\n /** Date for the slot (alternative to slot prop) */\r\n date?: Date;\r\n /** Hour for the slot (alternative to slot prop) */\r\n hour?: number;\r\n /** Minute for the slot (alternative to slot prop) */\r\n minute?: number;\r\n}\r\n\r\nexport function TimeSlot({ slot: slotProp, date, hour, minute, ariaLabel, ...props }: TimeSlotProps) {\r\n // Use provided slot or construct from individual props\r\n const slot: ITimeSlot = slotProp ?? { date: date!, hour: hour ?? 0, minute: minute ?? 0 };\r\n const label =\r\n ariaLabel ??\r\n `Add event at ${(slot.hour ?? 0).toString().padStart(2, '0')}:${(slot.minute ?? 0).toString().padStart(2, '0')} on ${slot.date.toLocaleDateString()}`;\r\n\r\n return <SelectableSlot slot={slot} ariaLabel={label} {...props} />;\r\n}\r\n\r\n/**\r\n * DaySlot - For month/year views with day granularity\r\n * Renders as a day cell\r\n * Accepts either a `slot` prop OR a `date` prop\r\n */\r\ninterface DaySlotProps extends Omit<SelectableSlotProps, 'slot'> {\r\n /** Direct slot object (preferred) */\r\n slot?: ITimeSlot;\r\n /** Date for the slot (alternative to slot prop) */\r\n date?: Date;\r\n}\r\n\r\nexport function DaySlot({ slot: slotProp, date, ariaLabel, ...props }: DaySlotProps) {\r\n // Use provided slot or construct from date\r\n const slot: ITimeSlot = slotProp ?? { date: date! };\r\n const label = ariaLabel ?? `Select ${slot.date.toLocaleDateString()}`;\r\n\r\n return <SelectableSlot slot={slot} ariaLabel={label} {...props} />;\r\n}\r\n\r\nexport type { TimeSlotProps, DaySlotProps };\r\nexport default SelectableSlot;\r\n","/**\r\n * Day View Component\r\n *\r\n * Full day time grid showing events hour by hour.\r\n * Features:\r\n * - Hourly time slots with event positioning\r\n * - Current time indicator\r\n * - Working hours highlighting\r\n * - Click to add event\r\n * - Drag to select time range\r\n *\r\n * Ported from agenda-v2 to maintain exact styling parity.\r\n */\r\n\r\nimport { cn } from '../../lib/utils';\r\nimport { useCallback, useLayoutEffect, useMemo, useRef } from 'react';\r\nimport type {\r\n CalendarEvent,\r\n ITimeSlot,\r\n IVisibleHours,\r\n TBadgeVariant,\r\n TOnEventClick,\r\n TOnSlotSelect,\r\n} from '../../core/types';\r\nimport {\r\n isToday,\r\n getVisibleHoursArray,\r\n formatHourLabel,\r\n separateEventsByDuration,\r\n isWorkingHour,\r\n type TWorkingHours,\r\n} from '../../core/utils/date-utils';\r\nimport { getEventsForDay } from '../../core/utils/event-utils';\r\nimport { calculateOverlappingPositions } from '../../core/utils/position-utils';\r\nimport { useOptionalSlotSelection } from '../../core/context/slot-selection-context';\r\nimport { EventBlock } from '../event/event-card';\r\nimport { MultiDayBanner } from '../primitives/multi-day-banner';\r\nimport { TimeSlot } from '../primitives/selectable-slot';\r\n\r\n// ============================================================================\r\n// CONSTANTS (matches agenda-v2)\r\n// ============================================================================\r\n\r\nconst HOUR_HEIGHT = 96; // pixels per hour (same as demo-scheduler)\r\nconst HOUR_COLUMN_WIDTH = 72; // width of hour labels column\r\nconst MIN_EVENT_CARD_WIDTH = 80; // minimum width in pixels for event cards\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface DayViewProps<TData = Record<string, unknown>> {\r\n /** Events to display */\r\n events: CalendarEvent<TData>[];\r\n /** The date to display */\r\n date: Date;\r\n /** Visible hours range */\r\n visibleHours?: IVisibleHours;\r\n /** Working hours per day */\r\n workingHours?: TWorkingHours;\r\n /** Slot duration in minutes */\r\n slotDuration?: number;\r\n /** Badge variant for events */\r\n badgeVariant?: TBadgeVariant;\r\n /** Event click handler */\r\n onEventClick?: TOnEventClick<TData>;\r\n /** Slot select handler */\r\n onSlotSelect?: TOnSlotSelect;\r\n /** Additional CSS classes */\r\n className?: string;\r\n /** Custom event renderer */\r\n renderEvent?: (props: {\r\n event: CalendarEvent<TData>;\r\n position: { top: number; height: number; left: number; width: number };\r\n }) => React.ReactNode;\r\n /** Custom popover content renderer */\r\n renderPopover?: (props: {\r\n event: CalendarEvent<TData>;\r\n onClose: () => void;\r\n }) => React.ReactNode;\r\n}\r\n\r\n// ============================================================================\r\n// COMPONENT\r\n// ============================================================================\r\n\r\nexport function DayView<TData = Record<string, unknown>>({\r\n events,\r\n date,\r\n visibleHours = { startHour: 0, endHour: 24 },\r\n workingHours,\r\n slotDuration = 30,\r\n badgeVariant = 'colored',\r\n onEventClick,\r\n onSlotSelect: _onSlotSelect,\r\n className,\r\n renderEvent,\r\n renderPopover,\r\n}: DayViewProps<TData>) {\r\n // Calculate slot configuration based on slotDuration\r\n const slotsPerHour = 60 / slotDuration;\r\n const slotHeightPercent = 100 / slotsPerHour;\r\n\r\n // Generate slot minutes for each hour (e.g., [0, 30] for 30min, [0, 15, 30, 45] for 15min)\r\n const slotMinutes = useMemo(() => {\r\n const minutes: number[] = [];\r\n for (let i = 0; i < slotsPerHour; i++) {\r\n minutes.push(i * slotDuration);\r\n }\r\n return minutes;\r\n }, [slotsPerHour, slotDuration]);\r\n\r\n // Get events for this day\r\n const dayEvents = useMemo(() => getEventsForDay(events, date), [events, date]);\r\n\r\n // Separate single-day and multi-day events\r\n const { singleDay, multiDay } = useMemo(\r\n () => separateEventsByDuration(dayEvents),\r\n [dayEvents],\r\n );\r\n\r\n // Calculate positions for overlapping events\r\n const eventPositions = useMemo(() => {\r\n const positions = calculateOverlappingPositions(singleDay, date, visibleHours, HOUR_HEIGHT);\r\n // Convert array to Map for fast lookup\r\n const map = new Map<string, { top: number; height: number; left: number; width: number }>();\r\n for (const positioned of positions) {\r\n map.set(positioned.event.id, positioned.position);\r\n }\r\n return map;\r\n }, [singleDay, date, visibleHours]);\r\n\r\n // Hours to display\r\n const hours = useMemo(() => getVisibleHoursArray(visibleHours), [visibleHours]);\r\n\r\n // Current time indicator position\r\n const now = new Date();\r\n const showCurrentTime = isToday(date);\r\n const currentTimeTop = useMemo(() => {\r\n if (!showCurrentTime) return 0;\r\n const currentHour = now.getHours() + now.getMinutes() / 60;\r\n if (currentHour < visibleHours.startHour || currentHour > visibleHours.endHour) {\r\n return -1; // Out of visible range\r\n }\r\n return (currentHour - visibleHours.startHour) * HOUR_HEIGHT;\r\n }, [showCurrentTime, visibleHours, now]);\r\n\r\n // Ref for scrollable container - used to auto-scroll to working hours\r\n const scrollContainerRef = useRef<HTMLDivElement>(null);\r\n\r\n // Auto-scroll to working hours on mount\r\n useLayoutEffect(() => {\r\n const container = scrollContainerRef.current;\r\n if (!container) return;\r\n\r\n // Use requestAnimationFrame to ensure DOM is fully rendered\r\n const scrollToWorkingHours = () => {\r\n // Get working hours for current day (0 = Sunday, 1 = Monday, etc.)\r\n const dayOfWeek = date.getDay();\r\n const todayWorkingHours = workingHours?.[dayOfWeek];\r\n\r\n // Calculate scroll position - aim for 1 hour before working hours start\r\n // This gives context and shows the user is at the start of the working day\r\n let scrollToHour: number;\r\n\r\n // Check if day has enabled working hours\r\n if (todayWorkingHours?.enabled && todayWorkingHours.from > 0) {\r\n // Scroll to 1 hour before working hours, but not before visible range\r\n scrollToHour = Math.max(todayWorkingHours.from - 1, visibleHours.startHour);\r\n } else {\r\n // Default to 7 AM if no working hours defined, disabled, or starts at midnight\r\n scrollToHour = Math.max(7, visibleHours.startHour);\r\n }\r\n\r\n // Calculate pixel position\r\n const scrollTop = (scrollToHour - visibleHours.startHour) * HOUR_HEIGHT;\r\n\r\n // Scroll to position (instant on initial load for better UX)\r\n container.scrollTo({\r\n top: scrollTop,\r\n behavior: 'instant',\r\n });\r\n };\r\n\r\n // Use double requestAnimationFrame to ensure layout is complete\r\n requestAnimationFrame(() => {\r\n requestAnimationFrame(scrollToWorkingHours);\r\n });\r\n }, [date, workingHours, visibleHours]);\r\n\r\n // Get slot selection context (optional - works without provider)\r\n const slotSelection = useOptionalSlotSelection();\r\n\r\n // Create selection handlers for time slots\r\n const handleSelectionStart = useCallback(\r\n (slot: ITimeSlot) => {\r\n slotSelection?.startSelection(slot);\r\n },\r\n [slotSelection],\r\n );\r\n\r\n const handleSelectionMove = useCallback(\r\n (slot: ITimeSlot) => {\r\n slotSelection?.updateSelection(slot);\r\n },\r\n [slotSelection],\r\n );\r\n\r\n const handleSelectionEnd = useCallback(() => {\r\n slotSelection?.endSelection();\r\n }, [slotSelection]);\r\n\r\n // Handle multi-day event click\r\n const handleMultiDayEventClick = useCallback(\r\n (event: CalendarEvent<TData>) => {\r\n onEventClick?.(event);\r\n },\r\n [onEventClick],\r\n );\r\n\r\n // Format header date like Google Calendar\r\n const headerDay = date.toLocaleDateString([], { weekday: 'short' });\r\n const headerDate = date.getDate();\r\n const today = isToday(date);\r\n\r\n return (\r\n <div className={cn('flex flex-col h-full', className)}>\r\n {/* Header - Google Calendar style */}\r\n <div className=\"flex items-center gap-3 border-b px-4 py-3\">\r\n {/* Day column with name + circled date */}\r\n <div className=\"flex flex-col items-center\">\r\n <span\r\n className={cn(\r\n 'text-[11px] font-medium uppercase tracking-wide',\r\n today ? 'text-primary' : 'text-muted-foreground',\r\n )}\r\n >\r\n {headerDay}\r\n </span>\r\n <span\r\n className={cn(\r\n 'flex items-center justify-center rounded-full mt-0.5',\r\n 'size-12 text-3xl font-normal',\r\n today ? 'bg-primary text-primary-foreground' : 'text-foreground',\r\n )}\r\n >\r\n {headerDate}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n {/* Multi-day events banner */}\r\n {multiDay.length > 0 && (\r\n <MultiDayBanner\r\n events={multiDay}\r\n date={date}\r\n onEventClick={handleMultiDayEventClick}\r\n />\r\n )}\r\n\r\n {/* Time grid */}\r\n <div ref={scrollContainerRef} className=\"flex-1 overflow-auto\">\r\n <div className=\"relative min-h-full\">\r\n {/* Hour rows */}\r\n {hours.map((hour, index) => {\r\n const isWorking = isWorkingHour(date, hour, workingHours);\r\n const isDisabled = !isWorking;\r\n\r\n return (\r\n <div\r\n key={hour}\r\n className={cn('relative flex', isDisabled && 'bg-calendar-disabled-hour')}\r\n style={{ height: HOUR_HEIGHT }}\r\n >\r\n {/* Hour label */}\r\n <div\r\n className=\"relative flex-shrink-0 border-r border-border/50 bg-zinc-50 dark:bg-zinc-900\"\r\n style={{ width: HOUR_COLUMN_WIDTH }}\r\n >\r\n <div className=\"absolute -top-2.5 right-1 sm:right-2 flex h-5 items-center\">\r\n {index !== 0 && (\r\n <span className=\"text-[10px] sm:text-xs text-muted-foreground\">\r\n {formatHourLabel(hour)}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Time slot area */}\r\n <div className=\"relative flex-1\">\r\n {/* Today highlight */}\r\n {showCurrentTime && !isDisabled && (\r\n <div className=\"absolute inset-0 bg-primary/5\" />\r\n )}\r\n\r\n {/* Top border (except first row) */}\r\n {index !== 0 && (\r\n <div className=\"pointer-events-none absolute inset-x-0 top-0 border-b border-border/50\" />\r\n )}\r\n\r\n {/* Dashed lines for sub-hour divisions */}\r\n {slotMinutes.slice(1).map((minute) => (\r\n <div\r\n key={minute}\r\n className=\"pointer-events-none absolute inset-x-0 border-b border-dashed border-border/30\"\r\n style={{ top: `${(minute / 60) * 100}%` }}\r\n />\r\n ))}\r\n\r\n {/* Dynamic time slots based on slotDuration */}\r\n {slotMinutes.map((minute, slotIndex) => {\r\n const slot: ITimeSlot = { date, hour, minute };\r\n\r\n return (\r\n <TimeSlot\r\n key={minute}\r\n slot={slot}\r\n onSelectionStart={handleSelectionStart}\r\n onSelectionMove={handleSelectionMove}\r\n onSelectionEnd={handleSelectionEnd}\r\n isSelected={slotSelection?.isSlotSelected(slot) ?? false}\r\n isSelecting={slotSelection?.isSelecting ?? false}\r\n disabled={isDisabled}\r\n className=\"absolute inset-x-0\"\r\n style={{\r\n top: `${slotIndex * slotHeightPercent}%`,\r\n height: `${slotHeightPercent}%`,\r\n }}\r\n ariaLabel={`Add event at ${formatHourLabel(hour)}:${String(minute).padStart(2, '0')}`}\r\n />\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n\r\n {/* Events layer - positioned within the content area */}\r\n <div\r\n className=\"absolute top-0 bottom-0 right-0 pointer-events-none\"\r\n style={{ left: HOUR_COLUMN_WIDTH }}\r\n >\r\n {singleDay.map((event) => {\r\n const position = eventPositions.get(event.id);\r\n if (!position) return null;\r\n\r\n // Calculate minimum width - ensure events are readable\r\n const calculatedWidth = `calc(${position.width}% - 2px)`;\r\n const minWidthStyle = `max(${MIN_EVENT_CARD_WIDTH}px, ${calculatedWidth})`;\r\n\r\n if (renderEvent) {\r\n return (\r\n <div\r\n key={event.id}\r\n className=\"absolute pointer-events-auto p-0.5\"\r\n style={{\r\n top: `${position.top}px`,\r\n left: `${position.left}%`,\r\n width: minWidthStyle,\r\n minWidth: `${MIN_EVENT_CARD_WIDTH}px`,\r\n }}\r\n >\r\n {renderEvent({ event: event as CalendarEvent<TData>, position })}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <EventBlock\r\n key={event.id}\r\n event={event as CalendarEvent<TData>}\r\n position={{\r\n top: position.top,\r\n left: position.left,\r\n width: position.width,\r\n minWidth: MIN_EVENT_CARD_WIDTH,\r\n }}\r\n hourHeight={HOUR_HEIGHT}\r\n badgeVariant={badgeVariant}\r\n onClick={onEventClick}\r\n disablePopover={!!onEventClick && !renderPopover}\r\n renderPopover={renderPopover}\r\n className=\"pointer-events-auto\"\r\n />\r\n );\r\n })}\r\n </div>\r\n\r\n {/* Current time indicator */}\r\n {showCurrentTime && currentTimeTop >= 0 && (\r\n <div\r\n className=\"absolute left-0 right-0 z-20 flex items-center pointer-events-none\"\r\n style={{\r\n top: currentTimeTop,\r\n left: HOUR_COLUMN_WIDTH,\r\n }}\r\n >\r\n <div className=\"h-2.5 w-2.5 -ml-1 rounded-full bg-red-500\" />\r\n <div className=\"flex-1 h-0.5 bg-red-500\" />\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default DayView;\r\n","/**\r\n * Week View Component\r\n *\r\n * 7-day grid showing a full week with time slots.\r\n * Features:\r\n * - Day columns with hour rows\r\n * - Multi-day event spanning\r\n * - Current time indicator\r\n * - Working hours highlighting\r\n * - Drag to select time range\r\n *\r\n * Ported from agenda-v2 to maintain exact styling parity.\r\n */\r\n\r\nimport { cn } from '../../lib/utils';\r\nimport { useCallback, useLayoutEffect, useMemo, useRef } from 'react';\r\nimport type {\r\n CalendarEvent,\r\n ITimeSlot,\r\n IVisibleHours,\r\n TBadgeVariant,\r\n TOnEventClick,\r\n TOnSlotSelect,\r\n} from '../../core/types';\r\nimport {\r\n isToday,\r\n getVisibleHoursArray,\r\n getWeekDays,\r\n formatHourLabel,\r\n separateEventsByDuration,\r\n startOfWeek,\r\n isWorkingHour,\r\n type TWorkingHours,\r\n} from '../../core/utils/date-utils';\r\nimport { getEventsForDay } from '../../core/utils/event-utils';\r\nimport { calculateOverlappingPositions } from '../../core/utils/position-utils';\r\nimport { EventBlock } from '../event/event-card';\r\nimport { MultiDayBanner } from '../primitives/multi-day-banner';\r\nimport { TimeSlot } from '../primitives/selectable-slot';\r\nimport { useOptionalSlotSelection } from '../../core/context/slot-selection-context';\r\n\r\n// ============================================================================\r\n// CONSTANTS (matches agenda-v2)\r\n// ============================================================================\r\n\r\nconst HOUR_HEIGHT = 96; // pixels per hour (same as demo-scheduler)\r\nconst HOUR_COLUMN_WIDTH = 56; // narrower for Google Calendar style\r\nconst DAY_HEADER_HEIGHT = 72; // taller for stacked day/date layout\r\nconst MIN_DAY_COLUMN_WIDTH = 120; // minimum width per day column\r\nconst MIN_EVENT_CARD_WIDTH = 100; // minimum width in pixels for event cards to be readable\r\nconst MAX_EVENTS_BEFORE_EXPAND = 3; // max overlapping events before column expands\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface WeekViewProps<TData = Record<string, unknown>> {\r\n /** Events to display */\r\n events: CalendarEvent<TData>[];\r\n /** The date (any day in the week to show) */\r\n date: Date;\r\n /** First day of week (0 = Sunday, 1 = Monday) */\r\n weekStartsOn?: 0 | 1;\r\n /** Visible hours range */\r\n visibleHours?: IVisibleHours;\r\n /** Working hours per day */\r\n workingHours?: TWorkingHours;\r\n /** Slot duration in minutes */\r\n slotDuration?: number;\r\n /** Badge variant for events */\r\n badgeVariant?: TBadgeVariant;\r\n /** Event click handler */\r\n onEventClick?: TOnEventClick<TData>;\r\n /** Slot select handler */\r\n onSlotSelect?: TOnSlotSelect;\r\n /** Day click handler */\r\n onDayClick?: (date: Date) => void;\r\n /** Additional CSS classes */\r\n className?: string;\r\n /** Custom event renderer */\r\n renderEvent?: (props: {\r\n event: CalendarEvent<TData>;\r\n position: { top: number; height: number; left: number; width: number };\r\n }) => React.ReactNode;\r\n /** Custom popover content renderer */\r\n renderPopover?: (props: {\r\n event: CalendarEvent<TData>;\r\n onClose: () => void;\r\n }) => React.ReactNode;\r\n}\r\n\r\n// ============================================================================\r\n// COMPONENT\r\n// ============================================================================\r\n\r\nexport function WeekView<TData = Record<string, unknown>>({\r\n events,\r\n date,\r\n weekStartsOn = 1,\r\n visibleHours = { startHour: 0, endHour: 24 },\r\n workingHours,\r\n slotDuration = 30,\r\n badgeVariant = 'colored',\r\n onEventClick,\r\n onSlotSelect: _onSlotSelect,\r\n onDayClick,\r\n className,\r\n renderEvent,\r\n renderPopover,\r\n}: WeekViewProps<TData>) {\r\n // Calculate slot configuration based on slotDuration\r\n const slotsPerHour = 60 / slotDuration;\r\n const slotHeightPercent = 100 / slotsPerHour;\r\n\r\n // Generate slot minutes for each hour\r\n const slotMinutes = useMemo(() => {\r\n const minutes: number[] = [];\r\n for (let i = 0; i < slotsPerHour; i++) {\r\n minutes.push(i * slotDuration);\r\n }\r\n return minutes;\r\n }, [slotsPerHour, slotDuration]);\r\n\r\n // Week days\r\n const weekDays = useMemo(() => getWeekDays(date, weekStartsOn), [date, weekStartsOn]);\r\n\r\n // Hours array\r\n const hours = useMemo(() => getVisibleHoursArray(visibleHours), [visibleHours]);\r\n\r\n // Events per day\r\n const eventsPerDay = useMemo(() => {\r\n const map = new Map<\r\n string,\r\n {\r\n singleDay: CalendarEvent<TData>[];\r\n multiDay: CalendarEvent<TData>[];\r\n positions: Map<string, { top: number; height: number; left: number; width: number }>;\r\n maxOverlapping: number; // Track max overlapping events for dynamic width\r\n }\r\n >();\r\n\r\n for (const day of weekDays) {\r\n const dayKey = day.toDateString();\r\n const dayEvents = getEventsForDay(events, day);\r\n const { singleDay, multiDay } = separateEventsByDuration(dayEvents);\r\n const positionsArray = calculateOverlappingPositions(singleDay, day, visibleHours, HOUR_HEIGHT);\r\n\r\n // Convert array to Map for fast lookup and find max overlapping\r\n const positions = new Map<string, { top: number; height: number; left: number; width: number }>();\r\n let maxOverlapping = 1;\r\n\r\n for (const positioned of positionsArray) {\r\n positions.set(positioned.event.id, positioned.position);\r\n // Calculate number of overlapping events based on width percentage\r\n // width of 100% = 1 event, 50% = 2 events, 33% = 3 events, etc.\r\n if (positioned.position.width > 0) {\r\n const overlapping = Math.round(100 / positioned.position.width);\r\n maxOverlapping = Math.max(maxOverlapping, overlapping);\r\n }\r\n }\r\n\r\n map.set(dayKey, {\r\n singleDay: singleDay as CalendarEvent<TData>[],\r\n multiDay: multiDay as CalendarEvent<TData>[],\r\n positions,\r\n maxOverlapping,\r\n });\r\n }\r\n\r\n return map;\r\n }, [weekDays, events, visibleHours]);\r\n\r\n // All multi-day events for the week (shown in banner)\r\n const weekMultiDayEvents = useMemo(() => {\r\n const unique = new Map<string, CalendarEvent<TData>>();\r\n for (const { multiDay } of eventsPerDay.values()) {\r\n for (const event of multiDay) {\r\n unique.set(event.id, event);\r\n }\r\n }\r\n return Array.from(unique.values());\r\n }, [eventsPerDay]);\r\n\r\n // Current time position\r\n const now = new Date();\r\n const todayIndex = weekDays.findIndex((d) => isToday(d));\r\n const currentTimeTop = useMemo(() => {\r\n if (todayIndex < 0) return -1;\r\n const currentHour = now.getHours() + now.getMinutes() / 60;\r\n if (currentHour < visibleHours.startHour || currentHour > visibleHours.endHour) {\r\n return -1;\r\n }\r\n return (currentHour - visibleHours.startHour) * HOUR_HEIGHT;\r\n }, [todayIndex, visibleHours, now]);\r\n\r\n // Ref for scrollable container - used to auto-scroll to working hours\r\n const scrollContainerRef = useRef<HTMLDivElement>(null);\r\n\r\n // Auto-scroll to working hours on mount and when week changes\r\n useLayoutEffect(() => {\r\n const container = scrollContainerRef.current;\r\n if (!container) return;\r\n\r\n // Use requestAnimationFrame to ensure DOM is fully rendered\r\n const scrollToWorkingHours = () => {\r\n // For week view, use today's working hours or first enabled weekday's working hours\r\n const today = new Date();\r\n const dayOfWeek = today.getDay();\r\n\r\n // Try to get working hours for today (must be enabled), fallback to Monday (1)\r\n let targetWorkingHours = workingHours?.[dayOfWeek];\r\n if (!targetWorkingHours?.enabled || targetWorkingHours.from === 0) {\r\n // Fallback to Monday's working hours if enabled\r\n const mondayHours = workingHours?.[1];\r\n if (mondayHours?.enabled) {\r\n targetWorkingHours = mondayHours;\r\n }\r\n }\r\n\r\n // Calculate scroll position - aim for 1 hour before working hours start\r\n let scrollToHour: number;\r\n\r\n // Check if we have enabled working hours\r\n if (targetWorkingHours?.enabled && targetWorkingHours.from > 0) {\r\n scrollToHour = Math.max(targetWorkingHours.from - 1, visibleHours.startHour);\r\n } else {\r\n // Default to 7 AM if no working hours defined or disabled\r\n scrollToHour = Math.max(7, visibleHours.startHour);\r\n }\r\n\r\n // Calculate pixel position\r\n const scrollTop = (scrollToHour - visibleHours.startHour) * HOUR_HEIGHT;\r\n\r\n // Scroll to position (instant on initial load for better UX)\r\n container.scrollTo({\r\n top: scrollTop,\r\n behavior: 'instant',\r\n });\r\n };\r\n\r\n // Use double requestAnimationFrame to ensure layout is complete\r\n requestAnimationFrame(() => {\r\n requestAnimationFrame(scrollToWorkingHours);\r\n });\r\n }, [date, workingHours, visibleHours]);\r\n\r\n // Get slot selection context (optional - works without provider)\r\n const slotSelection = useOptionalSlotSelection();\r\n\r\n // Create selection handlers for time slots (matches agenda-v2)\r\n const handleSelectionStart = useCallback(\r\n (slot: ITimeSlot) => {\r\n slotSelection?.startSelection(slot);\r\n },\r\n [slotSelection],\r\n );\r\n\r\n const handleSelectionMove = useCallback(\r\n (slot: ITimeSlot) => {\r\n slotSelection?.updateSelection(slot);\r\n },\r\n [slotSelection],\r\n );\r\n\r\n const handleSelectionEnd = useCallback(() => {\r\n slotSelection?.endSelection();\r\n }, [slotSelection]);\r\n\r\n // Handle multi-day event click\r\n const handleMultiDayEventClick = useCallback(\r\n (event: CalendarEvent<TData>) => {\r\n onEventClick?.(event);\r\n },\r\n [onEventClick],\r\n );\r\n\r\n // Calculate min width for the grid to allow horizontal scrolling\r\n const gridMinWidth = HOUR_COLUMN_WIDTH + 7 * MIN_DAY_COLUMN_WIDTH;\r\n\r\n // Calculate dynamic column widths based on max overlapping events per day\r\n const dayColumnWidths = useMemo(() => {\r\n const widths: number[] = [];\r\n for (const day of weekDays) {\r\n const dayKey = day.toDateString();\r\n const dayData = eventsPerDay.get(dayKey);\r\n const maxOverlapping = dayData?.maxOverlapping ?? 1;\r\n\r\n // If more than MAX_EVENTS_BEFORE_EXPAND events overlap, expand the column\r\n // Each event needs at least MIN_EVENT_CARD_WIDTH pixels\r\n if (maxOverlapping > MAX_EVENTS_BEFORE_EXPAND) {\r\n widths.push(Math.max(MIN_DAY_COLUMN_WIDTH, maxOverlapping * MIN_EVENT_CARD_WIDTH));\r\n } else {\r\n widths.push(MIN_DAY_COLUMN_WIDTH);\r\n }\r\n }\r\n return widths;\r\n }, [weekDays, eventsPerDay]);\r\n\r\n // Calculate actual grid width based on dynamic column widths\r\n const actualGridWidth = HOUR_COLUMN_WIDTH + dayColumnWidths.reduce((sum, w) => sum + w, 0);\r\n\r\n return (\r\n <div className={cn('ic-week-view flex flex-col h-full', className)}>\r\n {/* Multi-day events banner */}\r\n {weekMultiDayEvents.length > 0 && (\r\n <MultiDayBanner\r\n events={weekMultiDayEvents}\r\n date={startOfWeek(date, weekStartsOn)}\r\n onEventClick={handleMultiDayEventClick}\r\n />\r\n )}\r\n\r\n {/* Scrollable container for header + grid - overflow-auto is REQUIRED for scroll-to-working-hours */}\r\n <div ref={scrollContainerRef} className=\"ic-week-scroll-container flex-1\">\r\n {/* Single container for both header and grid - ensures columns align */}\r\n <div style={{ minWidth: Math.max(gridMinWidth, actualGridWidth) }}>\r\n {/* Week header - sticky at top, uses flex to match grid columns */}\r\n <div className=\"ic-week-header sticky top-0 z-20 border-b bg-background\">\r\n <div className=\"flex\">\r\n {/* Empty corner for hour column with timezone - matches hour column width */}\r\n <div\r\n className=\"flex-shrink-0 flex items-end justify-center pb-2 text-[10px] text-muted-foreground/70\"\r\n style={{ width: HOUR_COLUMN_WIDTH, height: DAY_HEADER_HEIGHT }}\r\n >\r\n <span className=\"hidden sm:inline\">\r\n GMT\r\n {(() => {\r\n const offset = new Date().getTimezoneOffset();\r\n const hrs = Math.abs(Math.floor(offset / 60));\r\n const sign = offset <= 0 ? '+' : '-';\r\n return hrs > 0 ? `${sign}${String(hrs).padStart(2, '0')}` : '';\r\n })()}\r\n </span>\r\n </div>\r\n\r\n {/* Day headers - must match grid column widths exactly */}\r\n {weekDays.map((day, dayIndex) => {\r\n const today = isToday(day);\r\n const columnWidth = dayColumnWidths[dayIndex] ?? MIN_DAY_COLUMN_WIDTH;\r\n // Only use fixed width if column needs expansion for many events\r\n const needsExpansion = columnWidth > MIN_DAY_COLUMN_WIDTH;\r\n\r\n return (\r\n <div\r\n key={day.toDateString()}\r\n className=\"flex-1 flex flex-col items-center justify-center border-r last:border-r-0 py-2\"\r\n style={{\r\n height: DAY_HEADER_HEIGHT,\r\n minWidth: needsExpansion ? columnWidth : MIN_DAY_COLUMN_WIDTH,\r\n }}\r\n >\r\n {/* Day name - small uppercase */}\r\n <span\r\n className={cn(\r\n 'text-[11px] font-medium uppercase tracking-wide',\r\n today ? 'text-primary' : 'text-muted-foreground',\r\n )}\r\n >\r\n {day.toLocaleDateString([], { weekday: 'short' })}\r\n </span>\r\n {/* Date number - large, circled if today */}\r\n <button\r\n type=\"button\"\r\n onClick={() => onDayClick?.(day)}\r\n className={cn(\r\n 'flex items-center justify-center rounded-full transition-colors mt-0.5',\r\n 'size-10 text-2xl font-normal',\r\n today\r\n ? 'bg-primary text-primary-foreground'\r\n : 'text-foreground hover:bg-muted',\r\n )}\r\n >\r\n {day.getDate()}\r\n </button>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n\r\n {/* Time grid - within same width container as header */}\r\n <div className=\"relative flex\">\r\n {/* Hour labels column - sticky left to stay visible when scrolling horizontally */}\r\n <div\r\n className=\"ic-hour-column sticky left-0 z-10 bg-zinc-50 dark:bg-zinc-900 border-r\"\r\n style={{ width: HOUR_COLUMN_WIDTH }}\r\n >\r\n {hours.map((hour, index) => (\r\n <div key={hour} className=\"relative\" style={{ height: HOUR_HEIGHT }}>\r\n <div className=\"absolute -top-2.5 right-1 sm:right-2 flex h-5 items-center\">\r\n {index !== 0 && (\r\n <span className=\"text-[10px] sm:text-xs text-muted-foreground\">\r\n {formatHourLabel(hour)}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n\r\n {/* Week grid - day columns */}\r\n <div className=\"ic-week-grid relative flex-1\">\r\n <div className=\"flex divide-x\">\r\n {weekDays.map((day, dayIndex) => {\r\n const dayKey = day.toDateString();\r\n const dayData = eventsPerDay.get(dayKey);\r\n const columnWidth = dayColumnWidths[dayIndex] ?? MIN_DAY_COLUMN_WIDTH;\r\n // Only use fixed width if column needs expansion for many events\r\n const needsExpansion = columnWidth > MIN_DAY_COLUMN_WIDTH;\r\n\r\n return (\r\n <div\r\n key={day.toDateString()}\r\n className=\"ic-day-column relative flex-1\"\r\n style={{\r\n minWidth: needsExpansion ? columnWidth : MIN_DAY_COLUMN_WIDTH,\r\n }}\r\n >\r\n {/* Hour slots */}\r\n {hours.map((hour, index) => {\r\n const isWorking = isWorkingHour(day, hour, workingHours);\r\n const isDisabled = !isWorking;\r\n\r\n return (\r\n <div\r\n key={hour}\r\n className={cn(\r\n 'relative',\r\n isDisabled && 'bg-calendar-disabled-hour',\r\n isToday(day) && !isDisabled && 'bg-primary/5',\r\n )}\r\n style={{ height: HOUR_HEIGHT }}\r\n >\r\n {/* Top border (except first row) */}\r\n {index !== 0 && (\r\n <div className=\"pointer-events-none absolute inset-x-0 top-0 border-b border-border/50\" />\r\n )}\r\n\r\n {/* Dashed lines for sub-hour divisions */}\r\n {slotMinutes.slice(1).map((minute) => (\r\n <div\r\n key={minute}\r\n className=\"pointer-events-none absolute inset-x-0 border-b border-dashed border-border/30\"\r\n style={{ top: `${(minute / 60) * 100}%` }}\r\n />\r\n ))}\r\n\r\n {/* Dynamic time slots based on slotDuration */}\r\n {slotMinutes.map((minute, slotIndex) => {\r\n const slot: ITimeSlot = { date: day, hour, minute };\r\n\r\n return (\r\n <TimeSlot\r\n key={minute}\r\n slot={slot}\r\n onSelectionStart={handleSelectionStart}\r\n onSelectionMove={handleSelectionMove}\r\n onSelectionEnd={handleSelectionEnd}\r\n isSelected={slotSelection?.isSlotSelected(slot) ?? false}\r\n isSelecting={slotSelection?.isSelecting ?? false}\r\n disabled={isDisabled}\r\n className=\"absolute inset-x-0\"\r\n style={{\r\n top: `${slotIndex * slotHeightPercent}%`,\r\n height: `${slotHeightPercent}%`,\r\n }}\r\n ariaLabel={`Add event on ${day.toLocaleDateString()} at ${formatHourLabel(hour)}:${String(minute).padStart(2, '0')}`}\r\n />\r\n );\r\n })}\r\n </div>\r\n );\r\n })}\r\n\r\n {/* Events for this day - positioned within the day column */}\r\n {dayData?.singleDay.map((event) => {\r\n const position = dayData.positions.get(event.id);\r\n if (!position) return null;\r\n\r\n // Calculate minimum width - ensure events are readable\r\n const calculatedWidth = `calc(${position.width}% - 2px)`;\r\n const minWidthStyle = `max(${MIN_EVENT_CARD_WIDTH}px, ${calculatedWidth})`;\r\n\r\n if (renderEvent) {\r\n return (\r\n <div\r\n key={event.id}\r\n className=\"absolute pointer-events-auto p-0.5\"\r\n style={{\r\n top: `${position.top}px`,\r\n left: `${position.left}%`,\r\n width: minWidthStyle,\r\n minWidth: `${MIN_EVENT_CARD_WIDTH}px`,\r\n }}\r\n >\r\n {renderEvent({ event, position })}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <EventBlock\r\n key={event.id}\r\n event={event}\r\n position={{\r\n top: position.top,\r\n left: position.left,\r\n width: position.width,\r\n minWidth: MIN_EVENT_CARD_WIDTH,\r\n }}\r\n hourHeight={HOUR_HEIGHT}\r\n badgeVariant={badgeVariant}\r\n onClick={onEventClick}\r\n disablePopover={!!onEventClick && !renderPopover}\r\n renderPopover={renderPopover}\r\n className=\"pointer-events-auto\"\r\n />\r\n );\r\n })}\r\n\r\n {/* Current time indicator for this day */}\r\n {dayIndex === todayIndex && currentTimeTop >= 0 && (\r\n <div\r\n className=\"absolute left-0 right-0 z-20 flex items-center pointer-events-none\"\r\n style={{ top: currentTimeTop }}\r\n >\r\n <div className=\"h-2 w-2 -ml-1 rounded-full bg-red-500\" />\r\n <div className=\"flex-1 h-0.5 bg-red-500\" />\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n </div>\r\n {/* End of width container that wraps header + grid */}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default WeekView;\r\n","/**\r\n * Month View Component\r\n *\r\n * Traditional calendar month grid with event indicators.\r\n * Features:\r\n * - 6-week grid with days from adjacent months\r\n * - Event dots/compact cards\r\n * - Today highlighting\r\n * - Click to view day / add event\r\n * - Drag to select date range\r\n *\r\n * Ported from agenda-v2 to maintain exact styling parity.\r\n */\r\n\r\nimport { cn } from '../../lib/utils';\r\nimport { useCallback, useMemo } from 'react';\r\nimport type {\r\n CalendarEvent,\r\n ITimeSlot,\r\n TBadgeVariant,\r\n TOnEventClick,\r\n TOnSlotSelect,\r\n} from '../../core/types';\r\nimport { generateMonthGrid, isToday } from '../../core/utils/date-utils';\r\nimport { getEventsForDay } from '../../core/utils/event-utils';\r\nimport { useOptionalSlotSelection } from '../../core/context/slot-selection-context';\r\nimport { EventCard } from '../event/event-card';\r\nimport { DaySlot } from '../primitives/selectable-slot';\r\n\r\n// ============================================================================\r\n// CONSTANTS (matches agenda-v2)\r\n// ============================================================================\r\n\r\nconst WEEKDAY_LABELS_MONDAY_START = [\r\n { full: 'Monday', short: 'Mon', tiny: 'M' },\r\n { full: 'Tuesday', short: 'Tue', tiny: 'T' },\r\n { full: 'Wednesday', short: 'Wed', tiny: 'W' },\r\n { full: 'Thursday', short: 'Thu', tiny: 'T' },\r\n { full: 'Friday', short: 'Fri', tiny: 'F' },\r\n { full: 'Saturday', short: 'Sat', tiny: 'S' },\r\n { full: 'Sunday', short: 'Sun', tiny: 'S' },\r\n];\r\nconst WEEKDAY_LABELS_SUNDAY_START = [\r\n { full: 'Sunday', short: 'Sun', tiny: 'S' },\r\n { full: 'Monday', short: 'Mon', tiny: 'M' },\r\n { full: 'Tuesday', short: 'Tue', tiny: 'T' },\r\n { full: 'Wednesday', short: 'Wed', tiny: 'W' },\r\n { full: 'Thursday', short: 'Thu', tiny: 'T' },\r\n { full: 'Friday', short: 'Fri', tiny: 'F' },\r\n { full: 'Saturday', short: 'Sat', tiny: 'S' },\r\n];\r\nconst MAX_EVENTS_SHOWN = 3;\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface MonthViewProps<TData = Record<string, unknown>> {\r\n /** Events to display */\r\n events: CalendarEvent<TData>[];\r\n /** The date (any day in the month to show) */\r\n date: Date;\r\n /** First day of week (0 = Sunday, 1 = Monday) */\r\n weekStartsOn?: 0 | 1;\r\n /** Badge variant for events */\r\n badgeVariant?: TBadgeVariant;\r\n /** Event click handler */\r\n onEventClick?: TOnEventClick<TData>;\r\n /** Slot select handler */\r\n onSlotSelect?: TOnSlotSelect;\r\n /** Day click handler */\r\n onDayClick?: (date: Date) => void;\r\n /** Additional CSS classes */\r\n className?: string;\r\n /** Custom event renderer */\r\n renderEvent?: (props: {\r\n event: CalendarEvent<TData>;\r\n variant: 'compact';\r\n }) => React.ReactNode;\r\n /** Custom popover content renderer */\r\n renderPopover?: (props: {\r\n event: CalendarEvent<TData>;\r\n onClose: () => void;\r\n }) => React.ReactNode;\r\n}\r\n\r\n// ============================================================================\r\n// COMPONENT\r\n// ============================================================================\r\n\r\nexport function MonthView<TData = Record<string, unknown>>({\r\n events,\r\n date,\r\n weekStartsOn = 1,\r\n badgeVariant = 'colored',\r\n onEventClick,\r\n onSlotSelect: _onSlotSelect,\r\n onDayClick,\r\n className,\r\n renderEvent,\r\n renderPopover,\r\n}: MonthViewProps<TData>) {\r\n // Generate month grid cells\r\n const cells = useMemo(() => generateMonthGrid(date, weekStartsOn), [date, weekStartsOn]);\r\n\r\n // Events by date for quick lookup\r\n const eventsByDate = useMemo(() => {\r\n const map = new Map<string, CalendarEvent<TData>[]>();\r\n for (const cell of cells) {\r\n const dayKey = cell.date.toDateString();\r\n const dayEvents = getEventsForDay(events, cell.date) as CalendarEvent<TData>[];\r\n // Sort by start time\r\n dayEvents.sort((a, b) => a.startDate.getTime() - b.startDate.getTime());\r\n map.set(dayKey, dayEvents);\r\n }\r\n return map;\r\n }, [cells, events]);\r\n\r\n // Get slot selection context (optional - works without provider)\r\n const slotSelection = useOptionalSlotSelection();\r\n\r\n // Create selection handlers for day slots\r\n const handleSelectionStart = useCallback(\r\n (slot: ITimeSlot) => {\r\n slotSelection?.startSelection(slot);\r\n },\r\n [slotSelection],\r\n );\r\n\r\n const handleSelectionMove = useCallback(\r\n (slot: ITimeSlot) => {\r\n slotSelection?.updateSelection(slot);\r\n },\r\n [slotSelection],\r\n );\r\n\r\n const handleSelectionEnd = useCallback(() => {\r\n slotSelection?.endSelection();\r\n }, [slotSelection]);\r\n\r\n // Handle day click (navigate to day view)\r\n const handleDayClick = useCallback(\r\n (cellDate: Date) => {\r\n onDayClick?.(cellDate);\r\n },\r\n [onDayClick],\r\n );\r\n\r\n // Get weekday labels based on weekStartsOn\r\n const weekdayLabels = weekStartsOn === 0 ? WEEKDAY_LABELS_SUNDAY_START : WEEKDAY_LABELS_MONDAY_START;\r\n\r\n return (\r\n <div className={cn('flex flex-col h-full overflow-hidden', className)}>\r\n {/* Scrollable container - horizontal on mobile, vertical overflow when needed */}\r\n <div className=\"flex flex-col flex-1 overflow-auto\">\r\n <div className=\"flex flex-col flex-1 min-w-[560px] sm:min-w-0\">\r\n {/* Weekday headers - Google Calendar style */}\r\n <div className=\"grid grid-cols-7 border-b !sticky !top-0 bg-background z-10\">\r\n {weekdayLabels.map((label, index) => (\r\n <div\r\n key={label.full}\r\n className={cn(\r\n 'py-2 sm:py-2.5 text-center text-[11px] uppercase font-medium tracking-wide text-muted-foreground',\r\n index >= 5 && 'text-muted-foreground/70', // Weekend\r\n )}\r\n >\r\n {/* Show short on mobile, full on desktop */}\r\n <span className=\"sm:hidden\">{label.short}</span>\r\n <span className=\"hidden sm:inline\">{label.short}</span>\r\n </div>\r\n ))}\r\n </div>\r\n\r\n {/* Calendar grid - each row sizes independently based on content */}\r\n <div className=\"grid grid-cols-7 auto-rows-min\">\r\n {cells.map((cell) => {\r\n const dayKey = cell.date.toDateString();\r\n const dayEvents = eventsByDate.get(dayKey) || [];\r\n const today = isToday(cell.date);\r\n const isWeekend = cell.date.getDay() === 0 || cell.date.getDay() === 6;\r\n const hasMoreEvents = dayEvents.length > MAX_EVENTS_SHOWN;\r\n\r\n return (\r\n <DaySlot\r\n key={dayKey}\r\n date={cell.date}\r\n onSelectionStart={handleSelectionStart}\r\n onSelectionMove={handleSelectionMove}\r\n onSelectionEnd={handleSelectionEnd}\r\n isSelected={slotSelection?.isSlotSelected({ date: cell.date }) ?? false}\r\n isSelecting={slotSelection?.isSelecting ?? false}\r\n className={cn(\r\n 'relative flex flex-col border-r border-b text-left min-h-[80px] sm:min-h-[100px] overflow-hidden',\r\n '[&:nth-child(7n)]:border-r-0',\r\n !cell.isCurrentMonth && 'bg-muted/20',\r\n isWeekend && cell.isCurrentMonth && 'bg-muted/10',\r\n )}\r\n ariaLabel={`${cell.date.toLocaleDateString()} - ${dayEvents.length} events. Click to create event, double-click to view day.`}\r\n >\r\n {/* Day number header - Google Calendar style */}\r\n <div\r\n className={cn(\r\n 'flex items-center justify-center p-1',\r\n !cell.isCurrentMonth && 'text-muted-foreground/40',\r\n )}\r\n >\r\n <button\r\n type=\"button\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n handleDayClick(cell.date);\r\n }}\r\n className={cn(\r\n 'flex items-center justify-center rounded-full transition-colors',\r\n 'size-7 text-sm font-normal',\r\n today\r\n ? 'bg-primary text-primary-foreground'\r\n : 'hover:bg-muted',\r\n )}\r\n >\r\n {cell.date.getDate()}\r\n </button>\r\n </div>\r\n\r\n {/* Events list */}\r\n <div className=\"flex-1 overflow-hidden px-2 pt-1 pb-1 space-y-1\">\r\n {dayEvents.slice(0, MAX_EVENTS_SHOWN).map((event) => (\r\n <div\r\n key={event.id}\r\n onPointerDown={(e) => {\r\n // Stop propagation to prevent slot selection when clicking event\r\n e.stopPropagation();\r\n }}\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={onEventClick}\r\n disablePopover={!!onEventClick && !renderPopover}\r\n renderPopover={renderPopover}\r\n showTime={false}\r\n enableDrag\r\n />\r\n )}\r\n </div>\r\n ))}\r\n\r\n {/* More events indicator - click to view day */}\r\n {hasMoreEvents && (\r\n <div\r\n onPointerDown={(e) => {\r\n e.stopPropagation();\r\n handleDayClick(cell.date);\r\n }}\r\n className=\"w-full text-left text-xs text-muted-foreground hover:text-foreground hover:underline px-1.5 cursor-pointer\"\r\n >\r\n +{dayEvents.length - MAX_EVENTS_SHOWN} more\r\n </div>\r\n )}\r\n </div>\r\n </DaySlot>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default MonthView;\r\n","/**\r\n * Agenda View Component\r\n *\r\n * List view of events grouped by date.\r\n * Features:\r\n * - Chronological event list\r\n * - Date grouping headers\r\n * - Full event details\r\n *\r\n * Ported from agenda-v2 to maintain exact styling parity.\r\n */\r\n\r\nimport { cn } from '../../lib/utils';\r\nimport { useMemo } from 'react';\r\nimport type {\r\n CalendarEvent,\r\n TBadgeVariant,\r\n TOnEventClick,\r\n} from '../../core/types';\r\nimport { isToday } from '../../core/utils/date-utils';\r\nimport { groupEventsByDate } from '../../core/utils/event-utils';\r\nimport { EventCard } from '../event/event-card';\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface AgendaViewProps<TData = Record<string, unknown>> {\r\n /** Events to display */\r\n events: CalendarEvent<TData>[];\r\n /** The selected date (agenda starts from this date) */\r\n date: Date;\r\n /** Number of days to show (default: 60) */\r\n daysAhead?: number;\r\n /** Badge variant for events */\r\n badgeVariant?: TBadgeVariant;\r\n /** Event click handler */\r\n onEventClick?: TOnEventClick<TData>;\r\n /** Additional CSS classes */\r\n className?: string;\r\n /** Custom event renderer */\r\n renderEvent?: (props: {\r\n event: CalendarEvent<TData>;\r\n variant: 'full';\r\n }) => React.ReactNode;\r\n /** Custom popover content renderer */\r\n renderPopover?: (props: {\r\n event: CalendarEvent<TData>;\r\n onClose: () => void;\r\n }) => React.ReactNode;\r\n}\r\n\r\n// ============================================================================\r\n// COMPONENT\r\n// ============================================================================\r\n\r\nexport function AgendaView<TData = Record<string, unknown>>({\r\n events,\r\n date,\r\n daysAhead = 60,\r\n badgeVariant = 'colored',\r\n onEventClick,\r\n className,\r\n renderEvent,\r\n renderPopover,\r\n}: AgendaViewProps<TData>) {\r\n // Filter events starting from selected date for the next N days\r\n const upcomingEvents = useMemo(() => {\r\n // Use selected date as base if provided, otherwise today\r\n const baseDate = new Date(date);\r\n baseDate.setHours(0, 0, 0, 0);\r\n const endDate = new Date(baseDate);\r\n endDate.setDate(endDate.getDate() + daysAhead);\r\n\r\n return events.filter((event) => {\r\n // Include events that end after base date and start before the end date\r\n return event.endDate >= baseDate && event.startDate <= endDate;\r\n });\r\n }, [events, daysAhead, date]);\r\n\r\n // Group by date\r\n const groupedEvents = useMemo(() => {\r\n const map = groupEventsByDate(upcomingEvents);\r\n const result: { date: Date; dateKey: string; events: CalendarEvent<TData>[] }[] = [];\r\n for (const [dateKey, eventList] of map) {\r\n result.push({\r\n date: new Date(dateKey),\r\n dateKey,\r\n events: eventList as CalendarEvent<TData>[],\r\n });\r\n }\r\n // Sort by date\r\n result.sort((a, b) => a.date.getTime() - b.date.getTime());\r\n return result;\r\n }, [upcomingEvents]);\r\n\r\n // Empty state\r\n if (groupedEvents.length === 0) {\r\n return (\r\n <div\r\n className={cn(\r\n 'flex flex-col items-center justify-center h-full py-12',\r\n className,\r\n )}\r\n >\r\n <div className=\"text-center\">\r\n <p className=\"text-muted-foreground\">No events found</p>\r\n <p className=\"text-sm text-muted-foreground/70\">\r\n No events scheduled for this period\r\n </p>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className={cn('flex flex-col h-full overflow-auto', className)}>\r\n {/* Header - Clean schedule header */}\r\n <div className=\"sticky top-0 z-10 bg-background border-b px-4 py-3\">\r\n <div className=\"flex items-center justify-between\">\r\n <h2 className=\"text-lg font-medium\">Schedule</h2>\r\n <span className=\"text-sm text-muted-foreground\">\r\n {upcomingEvents.length} event\r\n {upcomingEvents.length !== 1 ? 's' : ''}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n {/* Event groups */}\r\n <div className=\"flex-1\">\r\n {groupedEvents.map(({ date: groupDate, dateKey, events: groupEvents }) => {\r\n const today = isToday(groupDate);\r\n const dayName = groupDate.toLocaleDateString([], { weekday: 'short' });\r\n const dayNumber = groupDate.getDate();\r\n const monthName = groupDate.toLocaleDateString([], { month: 'short' });\r\n\r\n return (\r\n <div key={dateKey} className=\"\">\r\n {/* Date header - Google Calendar style */}\r\n <div\r\n className={cn(\r\n 'sticky top-[52px] z-10 bg-background px-4 py-3 border-b',\r\n )}\r\n >\r\n <div className=\"flex items-center gap-3\">\r\n {/* Day column with stacked name + circled date */}\r\n <div className=\"flex flex-col items-center min-w-[40px]\">\r\n <span\r\n className={cn(\r\n 'text-[11px] font-medium uppercase tracking-wide',\r\n today ? 'text-primary' : 'text-muted-foreground',\r\n )}\r\n >\r\n {dayName}\r\n </span>\r\n <span\r\n className={cn(\r\n 'flex items-center justify-center rounded-full mt-0.5',\r\n 'size-10 text-xl font-normal',\r\n today\r\n ? 'bg-primary text-primary-foreground'\r\n : 'text-foreground',\r\n )}\r\n >\r\n {dayNumber}\r\n </span>\r\n </div>\r\n {/* Month indicator for first day or month change */}\r\n <span className=\"text-sm text-muted-foreground\">\r\n {monthName} {groupDate.getFullYear()}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n {/* Events for this date */}\r\n <div className=\"px-4 py-3 space-y-2 border-b last:border-b-0\">\r\n {groupEvents.map((event) =>\r\n renderEvent ? (\r\n <div key={event.id}>{renderEvent({ event, variant: 'full' })}</div>\r\n ) : (\r\n <EventCard\r\n key={event.id}\r\n event={event}\r\n variant=\"full\"\r\n badgeVariant={badgeVariant}\r\n onClick={onEventClick}\r\n disablePopover={!!onEventClick && !renderPopover}\r\n renderPopover={renderPopover}\r\n showTime\r\n showDescription\r\n showParticipants\r\n />\r\n ),\r\n )}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default AgendaView;\r\n"],"names":["falsyToString","value","cx","clsx","cva","base","config","props","_config_compoundVariants","variants","defaultVariants","getVariantClassNames","variant","variantProp","defaultVariantProp","variantKey","propsWithoutUndefined","acc","param","key","getCompoundVariantClassNames","cvClass","cvClassName","compoundVariantOptions","buttonVariants","Button","forwardRef","className","size","loading","disabled","children","ref","jsxs","cn","jsx","mergeClasses","classes","index","array","toKebabCase","string","toCamelCase","match","p1","p2","toPascalCase","camelCase","defaultAttributes","hasA11yProp","prop","Icon","color","strokeWidth","absoluteStrokeWidth","iconNode","rest","createElement","tag","attrs","createLucideIcon","iconName","Component","__iconNode","Check","ChevronRight","Circle","DropdownMenu","DropdownMenuPrimitive","DropdownMenuTrigger","DropdownMenuSubTrigger","React","inset","DropdownMenuSubContent","DropdownMenuContent","sideOffset","DropdownMenuItem","DropdownMenuCheckboxItem","checked","DropdownMenuRadioItem","DropdownMenuLabel","DropdownMenuSeparator","Popover","PopoverPrimitive","PopoverTrigger","PopoverAnchor","PopoverContent","align","MONTH_NAMES","TodayButton","onClick","today","badgeVariants","Badge","ChevronLeft","DateNavigator","date","view","events","onNavigatePrev","onNavigateNext","weekStartsOn","showEventCount","month","year","eventCount","getEventsCountInView","rangeText","getRangeText","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","TooltipProvider","TooltipPrimitive","Tooltip","TooltipTrigger","TooltipContent","getEventColorClasses","formatTime","formatTimeRange","start","end","startOfDay","d","EventCard","event","badgeVariant","showTime","showDescription","showParticipants","style","disablePopover","renderPopover","enableDrag","colors","popoverOpen","setPopoverOpen","useState","isDragging","setIsDragging","dragDrop","useOptionalDragDrop","isPast","isCanceled","canDrag","statusIcon","XIcon","CheckIcon","handleClick","useCallback","handleClose","handleDragStart","e","handleDragEnd","dotButton","DefaultPopoverContent","compactContent","fullContent","ClockIcon","UsersIcon","p","onClose","EventBlock","position","hourHeight","durationInMinutes","heightInPixels","isShortEvent","isDotVariant","target","rect","handleKeyDown","blockButton","tooltipContent","MultiDayEventBar","spanDays","isStart","isEnd","barButton","MultiDayBanner","onEventClick","isSameDay","DRAG_THRESHOLD","SelectableSlot","slot","onSelectionStart","onSelectionMove","onSelectionEnd","isSelected","isSelecting","ariaLabel","height","dataAttributes","startPositionRef","useRef","isDraggingRef","isMouseDownRef","buttonRef","isDragOver","setIsDragOver","handlePointerDown","handlePointerMove","dx","dy","handlePointerEnter","handlePointerUp","handleDragOver","now","hour","minute","handleDragLeave","handleDrop","useEffect","handleGlobalPointerUp","TimeSlot","slotProp","label","DaySlot","HOUR_HEIGHT","HOUR_COLUMN_WIDTH","MIN_EVENT_CARD_WIDTH","DayView","visibleHours","workingHours","slotDuration","_onSlotSelect","renderEvent","slotsPerHour","slotHeightPercent","slotMinutes","minutes","i","dayEvents","getEventsForDay","singleDay","multiDay","separateEventsByDuration","eventPositions","positions","calculateOverlappingPositions","map","positioned","hours","getVisibleHoursArray","showCurrentTime","isToday","currentTimeTop","currentHour","scrollContainerRef","useLayoutEffect","container","scrollToWorkingHours","dayOfWeek","todayWorkingHours","scrollToHour","scrollTop","slotSelection","useOptionalSlotSelection","handleSelectionStart","handleSelectionMove","handleSelectionEnd","handleMultiDayEventClick","headerDay","headerDate","isDisabled","isWorkingHour","formatHourLabel","slotIndex","calculatedWidth","minWidthStyle","DAY_HEADER_HEIGHT","MIN_DAY_COLUMN_WIDTH","MAX_EVENTS_BEFORE_EXPAND","WeekView","onDayClick","weekDays","getWeekDays","eventsPerDay","day","dayKey","positionsArray","maxOverlapping","overlapping","weekMultiDayEvents","unique","todayIndex","targetWorkingHours","mondayHours","gridMinWidth","dayColumnWidths","widths","actualGridWidth","sum","w","startOfWeek","offset","hrs","sign","dayIndex","columnWidth","needsExpansion","dayData","WEEKDAY_LABELS_MONDAY_START","WEEKDAY_LABELS_SUNDAY_START","MAX_EVENTS_SHOWN","MonthView","cells","generateMonthGrid","eventsByDate","cell","a","b","handleDayClick","cellDate","weekdayLabels","isWeekend","hasMoreEvents","AgendaView","daysAhead","upcomingEvents","baseDate","endDate","groupedEvents","groupEventsByDate","result","dateKey","eventList","groupDate","groupEvents","dayName","dayNumber","monthName"],"mappings":"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","x_google_ignoreList":[0,2,3,4,5,6,7,8,9,10,11,12]}
1
+ {"version":3,"file":"agenda-view-DM01Fpvr.js","sources":["../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/popover.tsx","../src/components/header/components/today-button.tsx","../src/components/ui/badge.tsx","../src/components/header/components/date-navigator.tsx","../src/components/header/calendar-header.tsx","../src/components/ui/tooltip.tsx","../src/components/event/event-card.tsx","../src/components/primitives/multi-day-banner.tsx","../src/components/primitives/selectable-slot.tsx","../src/components/views/day-view.tsx","../src/components/views/week-view.tsx","../src/components/views/month-view.tsx","../src/components/views/agenda-view.tsx"],"sourcesContent":["/**\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","/**\r\n * Button Component\r\n *\r\n * A versatile button component with multiple variants and sizes.\r\n * Built with class-variance-authority for type-safe variants.\r\n */\r\n\r\nimport { forwardRef, type ButtonHTMLAttributes } from 'react';\r\nimport { cva, type VariantProps } from 'class-variance-authority';\r\nimport { cn } from '../../lib/utils';\r\n\r\n// ============================================================================\r\n// VARIANTS\r\n// ============================================================================\r\n\r\nconst buttonVariants = cva(\r\n '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',\r\n {\r\n variants: {\r\n variant: {\r\n default:\r\n 'bg-primary text-primary-foreground shadow hover:bg-primary/90',\r\n destructive:\r\n 'bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90',\r\n outline:\r\n 'border border-input active:!bg-zinc-100 hover:!bg-zinc-50 active:bg-white !bg-white hover:bg-accent hover:text-accent-foreground',\r\n secondary:\r\n 'bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80',\r\n ghost: 'hover:bg-accent hover:text-accent-foreground',\r\n link: 'text-primary underline-offset-4 hover:underline',\r\n },\r\n size: {\r\n default: 'h-9 px-4 py-2',\r\n sm: 'h-8 rounded-md px-3 text-xs',\r\n lg: 'h-10 rounded-md px-8',\r\n icon: 'h-9 w-9',\r\n },\r\n },\r\n defaultVariants: {\r\n variant: 'default',\r\n size: 'default',\r\n },\r\n },\r\n);\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface ButtonProps\r\n extends ButtonHTMLAttributes<HTMLButtonElement>,\r\n VariantProps<typeof buttonVariants> {\r\n /** Loading state - disables button and shows spinner */\r\n loading?: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// COMPONENT\r\n// ============================================================================\r\n\r\nconst Button = forwardRef<HTMLButtonElement, ButtonProps>(\r\n ({ className, variant, size, loading, disabled, children, ...props }, ref) => {\r\n return (\r\n <button\r\n className={cn(buttonVariants({ variant, size, className }))}\r\n ref={ref}\r\n disabled={disabled || loading}\r\n {...props}\r\n >\r\n {loading && (\r\n <svg\r\n className=\"animate-spin -ml-1 mr-2 size-4\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <circle\r\n className=\"opacity-25\"\r\n cx=\"12\"\r\n cy=\"12\"\r\n r=\"10\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"4\"\r\n />\r\n <path\r\n className=\"opacity-75\"\r\n fill=\"currentColor\"\r\n d=\"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\"\r\n />\r\n </svg>\r\n )}\r\n {children}\r\n </button>\r\n );\r\n },\r\n);\r\n\r\nButton.displayName = 'Button';\r\n\r\nexport { Button, buttonVariants };\r\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","/**\r\n * DropdownMenu Component\r\n *\r\n * A dropdown menu for displaying a list of actions or options.\r\n * Uses Radix UI dropdown primitives.\r\n */\r\n\r\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';\r\nimport { Check, ChevronRight, Circle } from 'lucide-react';\r\nimport * as React from 'react';\r\nimport { cn } from '../../lib/utils';\r\n\r\n// ============================================================================\r\n// ROOT\r\n// ============================================================================\r\n\r\nconst DropdownMenu = DropdownMenuPrimitive.Root;\r\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;\r\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group;\r\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal;\r\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub;\r\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;\r\n\r\n// ============================================================================\r\n// SUB TRIGGER\r\n// ============================================================================\r\n\r\nconst DropdownMenuSubTrigger = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\r\n inset?: boolean;\r\n }\r\n>(({ className, inset, children, ...props }, ref) => (\r\n <DropdownMenuPrimitive.SubTrigger\r\n ref={ref}\r\n className={cn(\r\n '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',\r\n inset && 'pl-8',\r\n className,\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n <ChevronRight className=\"ml-auto h-4 w-4\" />\r\n </DropdownMenuPrimitive.SubTrigger>\r\n));\r\nDropdownMenuSubTrigger.displayName =\r\n DropdownMenuPrimitive.SubTrigger.displayName;\r\n\r\n// ============================================================================\r\n// SUB CONTENT\r\n// ============================================================================\r\n\r\nconst DropdownMenuSubContent = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\r\n>(({ className, ...props }, ref) => (\r\n <DropdownMenuPrimitive.SubContent\r\n ref={ref}\r\n className={cn(\r\n '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',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n));\r\nDropdownMenuSubContent.displayName =\r\n DropdownMenuPrimitive.SubContent.displayName;\r\n\r\n// ============================================================================\r\n// CONTENT\r\n// ============================================================================\r\n\r\nconst DropdownMenuContent = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\r\n>(({ className, sideOffset = 4, ...props }, ref) => (\r\n <DropdownMenuPrimitive.Portal>\r\n <DropdownMenuPrimitive.Content\r\n ref={ref}\r\n sideOffset={sideOffset}\r\n className={cn(\r\n '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',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n </DropdownMenuPrimitive.Portal>\r\n));\r\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;\r\n\r\n// ============================================================================\r\n// ITEM\r\n// ============================================================================\r\n\r\nconst DropdownMenuItem = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.Item>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\r\n inset?: boolean;\r\n }\r\n>(({ className, inset, ...props }, ref) => (\r\n <DropdownMenuPrimitive.Item\r\n ref={ref}\r\n className={cn(\r\n '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',\r\n inset && 'pl-8',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n));\r\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;\r\n\r\n// ============================================================================\r\n// CHECKBOX ITEM\r\n// ============================================================================\r\n\r\nconst DropdownMenuCheckboxItem = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\r\n>(({ className, children, checked = false, ...props }, ref) => (\r\n <DropdownMenuPrimitive.CheckboxItem\r\n ref={ref}\r\n className={cn(\r\n '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',\r\n className,\r\n )}\r\n checked={checked}\r\n {...props}\r\n >\r\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\r\n <DropdownMenuPrimitive.ItemIndicator>\r\n <Check className=\"h-4 w-4\" />\r\n </DropdownMenuPrimitive.ItemIndicator>\r\n </span>\r\n {children}\r\n </DropdownMenuPrimitive.CheckboxItem>\r\n));\r\nDropdownMenuCheckboxItem.displayName =\r\n DropdownMenuPrimitive.CheckboxItem.displayName;\r\n\r\n// ============================================================================\r\n// RADIO ITEM\r\n// ============================================================================\r\n\r\nconst DropdownMenuRadioItem = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\r\n>(({ className, children, ...props }, ref) => (\r\n <DropdownMenuPrimitive.RadioItem\r\n ref={ref}\r\n className={cn(\r\n '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',\r\n className,\r\n )}\r\n {...props}\r\n >\r\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\r\n <DropdownMenuPrimitive.ItemIndicator>\r\n <Circle className=\"h-2 w-2 fill-current\" />\r\n </DropdownMenuPrimitive.ItemIndicator>\r\n </span>\r\n {children}\r\n </DropdownMenuPrimitive.RadioItem>\r\n));\r\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;\r\n\r\n// ============================================================================\r\n// LABEL\r\n// ============================================================================\r\n\r\nconst DropdownMenuLabel = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.Label>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\r\n inset?: boolean;\r\n }\r\n>(({ className, inset, ...props }, ref) => (\r\n <DropdownMenuPrimitive.Label\r\n ref={ref}\r\n className={cn('px-2 py-1.5 text-sm font-semibold', inset && 'pl-8', className)}\r\n {...props}\r\n />\r\n));\r\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;\r\n\r\n// ============================================================================\r\n// SEPARATOR\r\n// ============================================================================\r\n\r\nconst DropdownMenuSeparator = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.Separator>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\r\n>(({ className, ...props }, ref) => (\r\n <DropdownMenuPrimitive.Separator\r\n ref={ref}\r\n className={cn('-mx-1 my-1 h-px bg-muted', className)}\r\n {...props}\r\n />\r\n));\r\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName;\r\n\r\n// ============================================================================\r\n// SHORTCUT\r\n// ============================================================================\r\n\r\nconst DropdownMenuShortcut = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLSpanElement>) => (\r\n <span className={cn('ml-auto text-xs tracking-widest opacity-60', className)} {...props} />\r\n);\r\nDropdownMenuShortcut.displayName = 'DropdownMenuShortcut';\r\n\r\nexport {\r\n DropdownMenu,\r\n DropdownMenuCheckboxItem,\r\n DropdownMenuContent,\r\n DropdownMenuGroup,\r\n DropdownMenuItem,\r\n DropdownMenuLabel,\r\n DropdownMenuPortal,\r\n DropdownMenuRadioGroup,\r\n DropdownMenuRadioItem,\r\n DropdownMenuSeparator,\r\n DropdownMenuShortcut,\r\n DropdownMenuSub,\r\n DropdownMenuSubContent,\r\n DropdownMenuSubTrigger,\r\n DropdownMenuTrigger,\r\n};\r\n","import * as PopoverPrimitive from '@radix-ui/react-popover';\r\nimport * as React from 'react';\r\n\r\nimport { cn } from '../../lib/utils';\r\n\r\nconst Popover = PopoverPrimitive.Root;\r\n\r\nconst PopoverTrigger = PopoverPrimitive.Trigger;\r\n\r\nconst PopoverAnchor = PopoverPrimitive.Anchor;\r\n\r\nconst PopoverContent = React.forwardRef<\r\n React.ElementRef<typeof PopoverPrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\r\n>(({ className, align = 'center', sideOffset = 4, ...props }, ref) => (\r\n <PopoverPrimitive.Portal>\r\n <PopoverPrimitive.Content\r\n ref={ref}\r\n align={align}\r\n sideOffset={sideOffset}\r\n className={cn(\r\n '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',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n </PopoverPrimitive.Portal>\r\n));\r\nPopoverContent.displayName = PopoverPrimitive.Content.displayName;\r\n\r\nexport { Popover, PopoverAnchor, PopoverContent, PopoverTrigger };\r\n","/**\r\n * TodayButton - Styled Calendar Icon Button\r\n *\r\n * A visual button showing today's date that navigates to today.\r\n * Matches the production agenda-v2 implementation.\r\n */\r\n\r\nimport { cn } from '../../../lib/utils';\r\n\r\n// ============================================================================\r\n// CONSTANTS\r\n// ============================================================================\r\n\r\nconst MONTH_NAMES = [\r\n 'JAN',\r\n 'FEB',\r\n 'MAR',\r\n 'APR',\r\n 'MAY',\r\n 'JUN',\r\n 'JUL',\r\n 'AUG',\r\n 'SEP',\r\n 'OCT',\r\n 'NOV',\r\n 'DEC',\r\n];\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface TodayButtonProps {\r\n /** Click handler - should navigate to today */\r\n onClick?: () => void;\r\n /** Additional CSS classes */\r\n className?: string;\r\n}\r\n\r\n// ============================================================================\r\n// COMPONENT\r\n// ============================================================================\r\n\r\nexport function TodayButton({ onClick, className }: TodayButtonProps) {\r\n const today = new Date();\r\n\r\n return (\r\n <button\r\n type=\"button\"\r\n className={cn(\r\n 'flex size-11 sm:size-14 flex-col items-start overflow-hidden rounded-lg border shrink-0',\r\n 'focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\r\n 'hover:bg-accent/50 transition-colors',\r\n className,\r\n )}\r\n onClick={onClick}\r\n >\r\n <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\">\r\n {MONTH_NAMES[today.getMonth()]}\r\n </p>\r\n <p className=\"flex w-full flex-1 items-center justify-center text-sm sm:text-lg font-bold\">\r\n {today.getDate()}\r\n </p>\r\n </button>\r\n );\r\n}\r\n\r\nexport default TodayButton;\r\n","/**\r\n * Badge Component\r\n *\r\n * Displays a small badge with optional variants.\r\n */\r\n\r\nimport { cn } from '../../lib/utils';\r\nimport { cva, type VariantProps } from 'class-variance-authority';\r\nimport type * as React from 'react';\r\n\r\n// ============================================================================\r\n// VARIANTS\r\n// ============================================================================\r\n\r\nconst badgeVariants = cva(\r\n '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',\r\n {\r\n variants: {\r\n variant: {\r\n default:\r\n 'border-transparent bg-primary text-primary-foreground hover:bg-primary/80',\r\n secondary:\r\n 'border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80',\r\n destructive:\r\n 'border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80',\r\n outline: 'text-foreground',\r\n },\r\n },\r\n defaultVariants: { variant: 'default' },\r\n },\r\n);\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface BadgeProps\r\n extends React.HTMLAttributes<HTMLDivElement>,\r\n VariantProps<typeof badgeVariants> { }\r\n\r\n// ============================================================================\r\n// COMPONENT\r\n// ============================================================================\r\n\r\nfunction Badge({ className, variant, ...props }: BadgeProps) {\r\n return (\r\n <div className={cn(badgeVariants({ variant }), className)} {...props} />\r\n );\r\n}\r\n\r\nexport { Badge, badgeVariants };\r\n","/**\r\n * DateNavigator - Navigation Controls with Date Range\r\n *\r\n * Shows month/year title, event count badge, and prev/next navigation.\r\n * Matches the production agenda-v2 implementation.\r\n */\r\n\r\nimport { cn } from '../../../lib/utils';\r\nimport type { TCalendarView, CalendarEvent } from '../../../core/types';\r\nimport { getRangeText, getEventsCountInView } from '../../../core/utils/grid-utils';\r\nimport { Button } from '../../ui/button';\r\nimport { Badge } from '../../ui/badge';\r\n\r\n// ============================================================================\r\n// ICONS (Inline SVGs for zero dependencies)\r\n// ============================================================================\r\n\r\nfunction ChevronLeft({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <path d=\"m15 18-6-6 6-6\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction ChevronRight({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <path d=\"m9 18 6-6-6-6\" />\r\n </svg>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// CONSTANTS\r\n// ============================================================================\r\n\r\nconst MONTH_NAMES = [\r\n 'January',\r\n 'February',\r\n 'March',\r\n 'April',\r\n 'May',\r\n 'June',\r\n 'July',\r\n 'August',\r\n 'September',\r\n 'October',\r\n 'November',\r\n 'December',\r\n];\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface DateNavigatorProps<TData = Record<string, unknown>> {\r\n /** Current date */\r\n date: Date;\r\n /** Current view */\r\n view: TCalendarView;\r\n /** Events to count */\r\n events?: CalendarEvent<TData>[];\r\n /** Navigate to previous period */\r\n onNavigatePrev?: () => void;\r\n /** Navigate to next period */\r\n onNavigateNext?: () => void;\r\n /** Week starts on (0 = Sunday, 1 = Monday) */\r\n weekStartsOn?: 0 | 1;\r\n /** Show event count badge */\r\n showEventCount?: boolean;\r\n /** Additional CSS classes */\r\n className?: string;\r\n}\r\n\r\n// ============================================================================\r\n// COMPONENT\r\n// ============================================================================\r\n\r\nexport function DateNavigator<TData = Record<string, unknown>>({\r\n date,\r\n view,\r\n events = [],\r\n onNavigatePrev,\r\n onNavigateNext,\r\n weekStartsOn = 1,\r\n showEventCount = true,\r\n className,\r\n}: DateNavigatorProps<TData>) {\r\n const month = MONTH_NAMES[date.getMonth()];\r\n const year = date.getFullYear();\r\n const eventCount = showEventCount\r\n ? getEventsCountInView(events, date, view, weekStartsOn)\r\n : 0;\r\n const rangeText = getRangeText(date, view);\r\n\r\n return (\r\n <div className={cn('min-w-0 flex-1', className)}>\r\n {/* Title row with month/year and event count */}\r\n <div className=\"flex items-center gap-1.5 sm:gap-2 flex-wrap\">\r\n <span className=\"text-base sm:text-lg font-semibold truncate\">\r\n {month} {year}\r\n </span>\r\n {showEventCount && (\r\n <Badge\r\n variant=\"outline\"\r\n className=\"px-1 sm:px-1.5 text-[10px] sm:text-xs shrink-0\"\r\n >\r\n {eventCount}\r\n </Badge>\r\n )}\r\n </div>\r\n\r\n {/* Navigation row */}\r\n <div className=\"flex items-center gap-1.5 sm:gap-2\">\r\n <Button\r\n variant=\"outline\"\r\n size=\"icon\"\r\n className=\"size-5 sm:size-6 [&_svg]:size-3 sm:[&_svg]:size-4\"\r\n onClick={onNavigatePrev}\r\n >\r\n <ChevronLeft />\r\n </Button>\r\n\r\n <p className=\"text-xs sm:text-sm text-muted-foreground truncate\">\r\n {rangeText}\r\n </p>\r\n\r\n <Button\r\n variant=\"outline\"\r\n size=\"icon\"\r\n className=\"size-5 sm:size-6 [&_svg]:size-3 sm:[&_svg]:size-4\"\r\n onClick={onNavigateNext}\r\n >\r\n <ChevronRight />\r\n </Button>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default DateNavigator;\r\n","/**\r\n * Calendar Header Component\r\n *\r\n * Navigation and view controls for the calendar.\r\n * Matches the production agenda-v2 implementation.\r\n *\r\n * Features:\r\n * - Styled TodayButton with calendar icon\r\n * - DateNavigator with event count and range text\r\n * - Calendar View dropdown (Day, Week, Month, Year)\r\n * - Timeline View dropdown (Resource views)\r\n * - Settings popover slot (via settingsContent prop)\r\n * - Filter row slot (via filterContent prop)\r\n * - Add event button\r\n */\r\n\r\nimport { cn } from '../../lib/utils';\r\nimport { useMemo, type ReactNode } from 'react';\r\nimport type { TCalendarView, CalendarEvent } from '../../core/types';\r\nimport { Button } from '../ui/button';\r\nimport {\r\n DropdownMenu,\r\n DropdownMenuContent,\r\n DropdownMenuItem,\r\n DropdownMenuTrigger,\r\n} from '../ui/dropdown-menu';\r\nimport {\r\n Popover,\r\n PopoverContent,\r\n PopoverTrigger,\r\n} from '../ui/popover';\r\nimport { TodayButton } from './components/today-button';\r\nimport { DateNavigator } from './components/date-navigator';\r\n\r\n// ============================================================================\r\n// ICONS (Inline SVGs for zero dependencies)\r\n// ============================================================================\r\n\r\nfunction CalendarDays({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <path d=\"M8 2v4\" />\r\n <path d=\"M16 2v4\" />\r\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"4\" rx=\"2\" />\r\n <path d=\"M3 10h18\" />\r\n <path d=\"M8 14h.01\" />\r\n <path d=\"M12 14h.01\" />\r\n <path d=\"M16 14h.01\" />\r\n <path d=\"M8 18h.01\" />\r\n <path d=\"M12 18h.01\" />\r\n <path d=\"M16 18h.01\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction GanttChartSquare({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\r\n <path d=\"M9 8h7\" />\r\n <path d=\"M8 12h6\" />\r\n <path d=\"M11 16h5\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction ChevronDown({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <path d=\"m6 9 6 6 6-6\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction Settings({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <path d=\"M12.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\" />\r\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction Plus({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <path d=\"M5 12h14\" />\r\n <path d=\"M12 5v14\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction LayoutList({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <rect width=\"7\" height=\"7\" x=\"3\" y=\"3\" rx=\"1\" />\r\n <rect width=\"7\" height=\"7\" x=\"3\" y=\"14\" rx=\"1\" />\r\n <path d=\"M14 4h7\" />\r\n <path d=\"M14 9h7\" />\r\n <path d=\"M14 15h7\" />\r\n <path d=\"M14 20h7\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction Columns({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\r\n <path d=\"M12 3v18\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction Grid2X2({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\r\n <path d=\"M3 12h18\" />\r\n <path d=\"M12 3v18\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction Grid3X3({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\r\n <path d=\"M3 9h18\" />\r\n <path d=\"M3 15h18\" />\r\n <path d=\"M9 3v18\" />\r\n <path d=\"M15 3v18\" />\r\n </svg>\r\n );\r\n}\r\n\r\n// function ListIcon({ className }: { className?: string }) {\r\n// return (\r\n// <svg\r\n// className={className}\r\n// xmlns=\"http://www.w3.org/2000/svg\"\r\n// width=\"24\"\r\n// height=\"24\"\r\n// viewBox=\"0 0 24 24\"\r\n// fill=\"none\"\r\n// stroke=\"currentColor\"\r\n// strokeWidth=\"2\"\r\n// strokeLinecap=\"round\"\r\n// strokeLinejoin=\"round\"\r\n// >\r\n// <line x1=\"8\" x2=\"21\" y1=\"6\" y2=\"6\" />\r\n// <line x1=\"8\" x2=\"21\" y1=\"12\" y2=\"12\" />\r\n// <line x1=\"8\" x2=\"21\" y1=\"18\" y2=\"18\" />\r\n// <line x1=\"3\" x2=\"3.01\" y1=\"6\" y2=\"6\" />\r\n// <line x1=\"3\" x2=\"3.01\" y1=\"12\" y2=\"12\" />\r\n// <line x1=\"3\" x2=\"3.01\" y1=\"18\" y2=\"18\" />\r\n// </svg>\r\n// );\r\n// }\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\ninterface ViewOption {\r\n value: TCalendarView;\r\n label: string;\r\n icon: React.ComponentType<{ className?: string }>;\r\n}\r\n\r\nexport interface CalendarHeaderProps<TData = Record<string, unknown>> {\r\n /** Current date */\r\n currentDate: Date;\r\n /** Current view */\r\n view: TCalendarView;\r\n /** Events for count display */\r\n events?: CalendarEvent<TData>[];\r\n /** Navigate to today */\r\n onNavigateToday?: () => void;\r\n /** Navigate prev */\r\n onNavigatePrev?: () => void;\r\n /** Navigate next */\r\n onNavigateNext?: () => void;\r\n /** Navigate callback (legacy) */\r\n onNavigate?: (direction: 'prev' | 'next' | 'today') => void;\r\n /** View change callback */\r\n onViewChange?: (view: TCalendarView) => void;\r\n /** Add event callback */\r\n onAddEvent?: () => void;\r\n /** Available calendar views to show */\r\n availableViews?: TCalendarView[];\r\n /** Show timeline views dropdown */\r\n showTimelineViews?: boolean;\r\n /** Available timeline views */\r\n timelineViews?: TCalendarView[];\r\n /** Settings content (rendered in popover) */\r\n settingsContent?: ReactNode;\r\n /** Show settings button */\r\n showSettings?: boolean;\r\n /** Filter row content */\r\n filterContent?: ReactNode;\r\n /** Additional actions to render */\r\n actions?: ReactNode;\r\n /** Additional CSS classes */\r\n className?: string;\r\n /** Week starts on (0 = Sunday, 1 = Monday) */\r\n weekStartsOn?: 0 | 1;\r\n /** Labels for i18n */\r\n labels?: {\r\n today?: string;\r\n day?: string;\r\n week?: string;\r\n month?: string;\r\n year?: string;\r\n agenda?: string;\r\n addEvent?: string;\r\n calendarView?: string;\r\n resourceView?: string;\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// VIEW CONFIGURATION\r\n// ============================================================================\r\n\r\n/** Calendar grid views */\r\nconst CALENDAR_VIEWS: ViewOption[] = [\r\n { value: 'day', label: 'Day', icon: LayoutList },\r\n { value: 'week', label: 'Week', icon: Columns },\r\n { value: 'month', label: 'Month', icon: Grid2X2 },\r\n { value: 'year', label: 'Year', icon: Grid3X3 },\r\n // { value: 'agenda', label: 'Agenda', icon: ListIcon }, NOTE: Not needed currently\r\n];\r\n\r\n/** Timeline/Resource views */\r\nconst TIMELINE_VIEWS: ViewOption[] = [\r\n { value: 'timeline-day', label: '1 Day', icon: GanttChartSquare },\r\n { value: 'timeline-3day', label: '3 Days', icon: GanttChartSquare },\r\n { value: 'timeline-week', label: '7 Days', icon: GanttChartSquare },\r\n];\r\n\r\n// ============================================================================\r\n// COMPONENT\r\n// ============================================================================\r\n\r\nexport function CalendarHeader<TData = Record<string, unknown>>({\r\n currentDate,\r\n view,\r\n events = [],\r\n onNavigateToday,\r\n onNavigatePrev,\r\n onNavigateNext,\r\n onNavigate,\r\n onViewChange,\r\n onAddEvent,\r\n availableViews = ['day', 'week', 'month', 'agenda'],\r\n showTimelineViews = false,\r\n timelineViews: _timelineViews,\r\n settingsContent,\r\n showSettings = false,\r\n filterContent,\r\n actions,\r\n className,\r\n weekStartsOn = 1,\r\n labels = {},\r\n}: CalendarHeaderProps<TData>) {\r\n // Merge labels\r\n const mergedLabels = useMemo(\r\n () => ({\r\n today: 'Today',\r\n addEvent: 'Add Event',\r\n calendarView: 'Calendar View',\r\n resourceView: 'Resource View',\r\n ...labels,\r\n }),\r\n [labels],\r\n );\r\n\r\n // Handle navigation (support both new and legacy callbacks)\r\n const handleToday = () => {\r\n onNavigateToday?.();\r\n onNavigate?.('today');\r\n };\r\n const handlePrev = () => {\r\n onNavigatePrev?.();\r\n onNavigate?.('prev');\r\n };\r\n const handleNext = () => {\r\n onNavigateNext?.();\r\n onNavigate?.('next');\r\n };\r\n\r\n // Determine current view category\r\n const isCalendarView = ['day', 'week', 'month', 'year', 'agenda'].includes(view);\r\n const isTimelineView = view.startsWith('timeline-') || view.startsWith('resource-');\r\n\r\n // Filter available views\r\n const calendarViewOptions = CALENDAR_VIEWS.filter((v) =>\r\n availableViews.includes(v.value),\r\n );\r\n\r\n // Get current calendar view label\r\n const currentCalendarView = isCalendarView\r\n ? calendarViewOptions.find((v) => v.value === view)\r\n : null;\r\n\r\n // Get current timeline view label\r\n const currentTimelineView = isTimelineView\r\n ? TIMELINE_VIEWS.find((v) => v.value === view)\r\n : null;\r\n\r\n return (\r\n <div className={cn('flex flex-col w-full gap-3 mb-2', className)}>\r\n {/* Main header row: Today + Date + View selectors + Settings + Add */}\r\n <div className=\"flex lg:flex-row flex-col w-full justify-between gap-3\">\r\n {/* Left: Today + Date + Add button (mobile) */}\r\n <div className=\"flex items-center justify-between gap-2\">\r\n <div className=\"flex items-center gap-2 sm:gap-3 min-w-0\">\r\n <TodayButton onClick={handleToday} />\r\n <DateNavigator\r\n date={currentDate}\r\n view={view}\r\n events={events}\r\n onNavigatePrev={handlePrev}\r\n onNavigateNext={handleNext}\r\n weekStartsOn={weekStartsOn}\r\n />\r\n </div>\r\n\r\n {/* Add button - visible on mobile */}\r\n {onAddEvent && (\r\n <Button\r\n size=\"icon\"\r\n className=\"shrink-0 lg:hidden\"\r\n onClick={onAddEvent}\r\n >\r\n <Plus className=\"size-4\" />\r\n </Button>\r\n )}\r\n </div>\r\n\r\n {/* Right: View selectors and controls */}\r\n <div className=\"flex items-center gap-1.5 sm:gap-2 overflow-x-auto pb-1 -mb-1 scrollbar-none\">\r\n {/* Calendar View Dropdown */}\r\n {onViewChange && calendarViewOptions.length > 0 && (\r\n <DropdownMenu>\r\n <DropdownMenuTrigger\r\n className={cn(\r\n 'inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors',\r\n 'h-10 px-2 sm:px-3 gap-1 sm:gap-1.5 shrink-0',\r\n isCalendarView\r\n ? 'bg-primary text-primary-foreground hover:bg-primary/90'\r\n : 'border border-input bg-background hover:bg-accent hover:text-accent-foreground',\r\n )}\r\n >\r\n <CalendarDays className=\"size-4\" />\r\n <span className=\"text-xs sm:text-sm font-medium\">\r\n {currentCalendarView?.label ?? mergedLabels.calendarView}\r\n </span>\r\n <ChevronDown className=\"size-3 opacity-60\" />\r\n </DropdownMenuTrigger>\r\n <DropdownMenuContent align=\"start\" className=\"min-w-[120px]\">\r\n {calendarViewOptions.map((viewOption) => {\r\n const Icon = viewOption.icon;\r\n return (\r\n <DropdownMenuItem\r\n key={viewOption.value}\r\n onClick={() => onViewChange(viewOption.value)}\r\n className={cn(\r\n 'gap-2',\r\n view === viewOption.value && 'bg-accent',\r\n )}\r\n >\r\n <Icon className=\"size-4\" />\r\n <span>{viewOption.label}</span>\r\n </DropdownMenuItem>\r\n );\r\n })}\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n )}\r\n\r\n {/* Timeline View Dropdown */}\r\n {showTimelineViews && onViewChange && (\r\n <DropdownMenu>\r\n <DropdownMenuTrigger\r\n className={cn(\r\n 'inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors',\r\n 'h-10 px-2 sm:px-3 gap-1 sm:gap-1.5 shrink-0',\r\n isTimelineView\r\n ? 'bg-primary text-primary-foreground hover:bg-primary/90'\r\n : 'border border-input bg-white hover:bg-zinc-50 hover:text-accent-foreground',\r\n )}\r\n >\r\n <GanttChartSquare className=\"size-4\" />\r\n <span className=\"text-xs sm:text-sm font-medium\">\r\n {currentTimelineView?.label ?? mergedLabels.resourceView}\r\n </span>\r\n <ChevronDown className=\"size-3 opacity-60\" />\r\n </DropdownMenuTrigger>\r\n <DropdownMenuContent align=\"start\" className=\"min-w-[120px]\">\r\n {TIMELINE_VIEWS.map((viewOption) => {\r\n const Icon = viewOption.icon;\r\n return (\r\n <DropdownMenuItem\r\n key={viewOption.value}\r\n onClick={() => onViewChange(viewOption.value)}\r\n className={cn(\r\n 'gap-2',\r\n view === viewOption.value && 'bg-accent',\r\n )}\r\n >\r\n <Icon className=\"size-4\" />\r\n <span>{viewOption.label}</span>\r\n </DropdownMenuItem>\r\n );\r\n })}\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n )}\r\n\r\n {/* Settings popover */}\r\n {showSettings && settingsContent && (\r\n <Popover>\r\n <PopoverTrigger asChild>\r\n <Button\r\n variant=\"outline\"\r\n size=\"icon\"\r\n className=\"min-w-10 min-h-10 shrink-0 mx-0\"\r\n >\r\n <Settings className=\"size-4 sm:size-5\" />\r\n </Button>\r\n </PopoverTrigger>\r\n <PopoverContent\r\n className=\"w-auto min-w-80 p-0\"\r\n align=\"end\"\r\n sideOffset={8}\r\n >\r\n <div className=\"max-h-[70vh] overflow-y-auto p-4 space-y-6\">\r\n {settingsContent}\r\n </div>\r\n </PopoverContent>\r\n </Popover>\r\n )}\r\n\r\n {/* Custom actions */}\r\n {actions}\r\n\r\n {/* Add Event button - desktop only */}\r\n {onAddEvent && (\r\n <Button className=\"hidden lg:flex shrink-0 max-h-10\" onClick={onAddEvent}>\r\n <Plus className=\"size-4\" />\r\n {mergedLabels.addEvent}\r\n </Button>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Filter row */}\r\n {filterContent && (\r\n <div className=\"flex items-center gap-2 overflow-x-auto pb-1 -mb-1 scrollbar-none\">\r\n {filterContent}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default CalendarHeader;\r\n","import * as TooltipPrimitive from '@radix-ui/react-tooltip';\r\nimport * as React from 'react';\r\n\r\nimport { cn } from '../../lib/utils';\r\n\r\nconst TooltipProvider = TooltipPrimitive.Provider;\r\n\r\nconst Tooltip = TooltipPrimitive.Root;\r\n\r\nconst TooltipTrigger = TooltipPrimitive.Trigger;\r\n\r\nconst TooltipContent = React.forwardRef<\r\n React.ElementRef<typeof TooltipPrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\r\n>(({ className, sideOffset = 4, ...props }, ref) => (\r\n <TooltipPrimitive.Content\r\n ref={ref}\r\n sideOffset={sideOffset}\r\n className={cn(\r\n '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',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n));\r\nTooltipContent.displayName = TooltipPrimitive.Content.displayName;\r\n\r\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };\r\n","/**\r\n * Event Card Component\r\n *\r\n * A versatile event display component with multiple variants:\r\n * - full: Full card with all details (for day/week views)\r\n * - compact: Compact single-line (for month view cells)\r\n * - dot: Dot indicator only (for mini calendars)\r\n *\r\n * Supports badge variants:\r\n * - colored: Full colored background\r\n * - dot: Neutral background with colored dot\r\n * - mixed: Colored background with dot\r\n *\r\n * Styling matches agenda-v2 production design:\r\n * - Soft backgrounds with dark mode support\r\n * - Colored borders and text for better readability\r\n * - SVG dots with fill classes\r\n * - Canceled/past event states\r\n * - Drag & drop support for event repositioning\r\n *\r\n * @template TData - Custom event data type\r\n */\r\n\r\nimport { type CSSProperties, useCallback, useState, type ReactNode } from 'react';\r\nimport { cn } from '../../lib/utils';\r\nimport type { CalendarEvent, TBadgeVariant, TEventColor } from '../../core/types';\r\nimport { useOptionalDragDrop } from '../../core/context';\r\nimport { Popover, PopoverContent, PopoverTrigger } from '../ui/popover';\r\nimport { Tooltip, TooltipContent, TooltipTrigger } from '../ui/tooltip';\r\n\r\n// ============================================================================\r\n// COLOR UTILITIES (matches agenda-v2 transformers.ts)\r\n// ============================================================================\r\n\r\n/**\r\n * Get color classes for an event - matches agenda-v2 styling\r\n * Uses soft backgrounds with darker text for better readability\r\n */\r\nexport function getEventColorClasses(color?: TEventColor): {\r\n bg: string;\r\n text: string;\r\n dot: string;\r\n dotFill: string;\r\n border: string;\r\n} {\r\n const colorMap: Record<TEventColor, { bg: string; text: string; dot: string; dotFill: string; border: string }> = {\r\n blue: {\r\n bg: 'bg-blue-50 dark:bg-blue-950/30',\r\n text: 'text-blue-700 dark:text-blue-300',\r\n dot: 'bg-blue-500',\r\n dotFill: 'fill-blue-600 dark:fill-blue-500',\r\n border: 'border-blue-400 dark:border-blue-600',\r\n },\r\n green: {\r\n bg: 'bg-green-50 dark:bg-green-950/30',\r\n text: 'text-green-700 dark:text-green-300',\r\n dot: 'bg-green-500',\r\n dotFill: 'fill-green-600 dark:fill-green-500',\r\n border: 'border-green-400 dark:border-green-600',\r\n },\r\n red: {\r\n bg: 'bg-red-50 dark:bg-red-950/30',\r\n text: 'text-red-700 dark:text-red-300',\r\n dot: 'bg-red-500',\r\n dotFill: 'fill-red-600 dark:fill-red-500',\r\n border: 'border-red-400 dark:border-red-600',\r\n },\r\n yellow: {\r\n bg: 'bg-yellow-50 dark:bg-yellow-950/30',\r\n text: 'text-yellow-700 dark:text-yellow-300',\r\n dot: 'bg-yellow-500',\r\n dotFill: 'fill-yellow-600 dark:fill-yellow-500',\r\n border: 'border-yellow-400 dark:border-yellow-600',\r\n },\r\n purple: {\r\n bg: 'bg-purple-50 dark:bg-purple-950/30',\r\n text: 'text-purple-700 dark:text-purple-300',\r\n dot: 'bg-purple-500',\r\n dotFill: 'fill-purple-600 dark:fill-purple-500',\r\n border: 'border-purple-400 dark:border-purple-600',\r\n },\r\n orange: {\r\n bg: 'bg-orange-50 dark:bg-orange-950/30',\r\n text: 'text-orange-700 dark:text-orange-300',\r\n dot: 'bg-orange-500',\r\n dotFill: 'fill-orange-600 dark:fill-orange-500',\r\n border: 'border-orange-400 dark:border-orange-600',\r\n },\r\n pink: {\r\n bg: 'bg-pink-50 dark:bg-pink-950/30',\r\n text: 'text-pink-700 dark:text-pink-300',\r\n dot: 'bg-pink-500',\r\n dotFill: 'fill-pink-600 dark:fill-pink-500',\r\n border: 'border-pink-400 dark:border-pink-600',\r\n },\r\n teal: {\r\n bg: 'bg-teal-50 dark:bg-teal-950/30',\r\n text: 'text-teal-700 dark:text-teal-300',\r\n dot: 'bg-teal-500',\r\n dotFill: 'fill-teal-600 dark:fill-teal-500',\r\n border: 'border-teal-400 dark:border-teal-600',\r\n },\r\n gray: {\r\n bg: 'bg-gray-50 dark:bg-gray-950/30',\r\n text: 'text-gray-700 dark:text-gray-300',\r\n dot: 'bg-gray-500',\r\n dotFill: 'fill-gray-600 dark:fill-gray-500',\r\n border: 'border-gray-400 dark:border-gray-600',\r\n },\r\n indigo: {\r\n bg: 'bg-indigo-50 dark:bg-indigo-950/30',\r\n text: 'text-indigo-700 dark:text-indigo-300',\r\n dot: 'bg-indigo-500',\r\n dotFill: 'fill-indigo-600 dark:fill-indigo-500',\r\n border: 'border-indigo-400 dark:border-indigo-600',\r\n },\r\n };\r\n\r\n return colorMap[color ?? 'blue'];\r\n}\r\n\r\n// ============================================================================\r\n// TIME FORMATTING\r\n// ============================================================================\r\n\r\n/**\r\n * Format time for display (24h format: HH:mm)\r\n */\r\nfunction formatTime(date: Date): string {\r\n return date.toLocaleTimeString([], {\r\n hour: '2-digit',\r\n minute: '2-digit',\r\n hour12: false,\r\n });\r\n}\r\n\r\n/**\r\n * Format time range\r\n */\r\nfunction formatTimeRange(start: Date, end: Date): string {\r\n return `${formatTime(start)} - ${formatTime(end)}`;\r\n}\r\n\r\n/**\r\n * Check if a date is at the start of today (past detection)\r\n */\r\nfunction startOfDay(date: Date): Date {\r\n const d = new Date(date);\r\n d.setHours(0, 0, 0, 0);\r\n return d;\r\n}\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface EventCardProps<TData = Record<string, unknown>> {\r\n /** The event to display */\r\n event: CalendarEvent<TData>;\r\n /** Display variant */\r\n variant?: 'full' | 'compact' | 'dot';\r\n /** Badge variant for coloring style */\r\n badgeVariant?: TBadgeVariant;\r\n /** Click handler */\r\n onClick?: ((event: CalendarEvent<TData>) => void) | undefined;\r\n /** Additional CSS classes */\r\n className?: string;\r\n /** Show time */\r\n showTime?: boolean;\r\n /** Show description */\r\n showDescription?: boolean;\r\n /** Show participants */\r\n showParticipants?: boolean;\r\n /** Inline styles (for positioning) */\r\n style?: CSSProperties;\r\n /** Disable popover and use onClick instead */\r\n disablePopover?: boolean;\r\n /** Custom popover content */\r\n renderPopover?: ((props: { event: CalendarEvent<TData>; onClose: () => void }) => ReactNode) | undefined;\r\n /** Enable drag support for event repositioning */\r\n enableDrag?: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// COMPONENT\r\n// ============================================================================\r\n\r\nexport function EventCard<TData = Record<string, unknown>>({\r\n event,\r\n variant = 'full',\r\n badgeVariant = 'colored',\r\n onClick,\r\n className,\r\n showTime = true,\r\n showDescription = false,\r\n showParticipants = false,\r\n style,\r\n disablePopover = false,\r\n renderPopover,\r\n enableDrag = false,\r\n}: EventCardProps<TData>) {\r\n const colors = getEventColorClasses(event.color);\r\n const [popoverOpen, setPopoverOpen] = useState(false);\r\n const [isDragging, setIsDragging] = useState(false);\r\n\r\n // Get drag-drop context\r\n const dragDrop = useOptionalDragDrop();\r\n\r\n // Check if event is in the past (ended before start of today)\r\n const isPast = event.endDate < startOfDay(new Date());\r\n\r\n // Check if event is canceled\r\n const isCanceled = event.isCanceled ?? false;\r\n\r\n // Don't allow dragging for cancelled or past events\r\n const canDrag = enableDrag && dragDrop && !isCanceled && !isPast;\r\n\r\n // Status icons (matches agenda-v2)\r\n const statusIcon = isCanceled ? (\r\n <XIcon className=\"h-3 w-3 text-zinc-800 dark:text-zinc-200\" />\r\n ) : event.meetingTookPlace ? (\r\n <CheckIcon className={cn('h-3 w-3', colors.text)} />\r\n ) : null;\r\n\r\n // Handle click\r\n const handleClick = useCallback(() => {\r\n if (isDragging) return; // Don't open popover during drag\r\n if (disablePopover && onClick) {\r\n onClick(event);\r\n } else if (!disablePopover) {\r\n setPopoverOpen(true);\r\n }\r\n }, [isDragging, disablePopover, onClick, event]);\r\n\r\n // Handle popover close\r\n const handleClose = useCallback(() => {\r\n setPopoverOpen(false);\r\n }, []);\r\n\r\n // Drag handlers (matches agenda-v2)\r\n const handleDragStart = useCallback(\r\n (e: React.DragEvent) => {\r\n if (!canDrag) return;\r\n e.dataTransfer.effectAllowed = 'move';\r\n e.dataTransfer.setData('text/plain', event.id);\r\n setIsDragging(true);\r\n dragDrop?.startDrag?.(event);\r\n },\r\n [canDrag, event, dragDrop],\r\n );\r\n\r\n const handleDragEnd = useCallback(() => {\r\n setIsDragging(false);\r\n if (dragDrop?.isDragging) {\r\n dragDrop.endDrag?.();\r\n }\r\n }, [dragDrop]);\r\n\r\n // ========================================================================\r\n // DOT VARIANT\r\n // ========================================================================\r\n\r\n if (variant === 'dot') {\r\n const dotButton = (\r\n <button\r\n type=\"button\"\r\n onClick={handleClick}\r\n className={cn(\r\n 'size-2 rounded-full cursor-pointer transition-opacity',\r\n isPast ? 'bg-gray-400' : colors.dot,\r\n event.isCanceled && 'opacity-50',\r\n className,\r\n )}\r\n style={style}\r\n aria-label={event.title}\r\n />\r\n );\r\n\r\n if (disablePopover) {\r\n return (\r\n <Tooltip>\r\n <TooltipTrigger asChild>{dotButton}</TooltipTrigger>\r\n <TooltipContent>\r\n <div className=\"flex flex-col gap-0.5\">\r\n <div className=\"font-medium\">{event.title}</div>\r\n <div className=\"text-xs opacity-80\">\r\n {formatTimeRange(event.startDate, event.endDate)}\r\n </div>\r\n </div>\r\n </TooltipContent>\r\n </Tooltip>\r\n );\r\n }\r\n\r\n return (\r\n <Popover open={popoverOpen} onOpenChange={setPopoverOpen}>\r\n <PopoverTrigger asChild>\r\n <Tooltip>\r\n <TooltipTrigger asChild>{dotButton}</TooltipTrigger>\r\n <TooltipContent>\r\n <div className=\"font-medium\">{event.title}</div>\r\n </TooltipContent>\r\n </Tooltip>\r\n </PopoverTrigger>\r\n <PopoverContent className=\"w-80\">\r\n {renderPopover ? (\r\n renderPopover({ event, onClose: handleClose })\r\n ) : (\r\n <DefaultPopoverContent event={event} onClose={handleClose} />\r\n )}\r\n </PopoverContent>\r\n </Popover>\r\n );\r\n }\r\n\r\n // ========================================================================\r\n // COMPACT VARIANT (matches agenda-v2 - marquee title, time pill, drag support)\r\n // ========================================================================\r\n\r\n if (variant === 'compact') {\r\n const compactContent = (\r\n <div\r\n role=\"button\"\r\n tabIndex={0}\r\n draggable={!!canDrag}\r\n onDragStart={handleDragStart}\r\n onDragEnd={handleDragEnd}\r\n onClick={disablePopover ? handleClick : undefined}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault();\r\n handleClick();\r\n }\r\n }}\r\n className={cn(\r\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',\r\n canDrag ? 'cursor-grab active:cursor-grabbing' : 'cursor-pointer',\r\n isDragging && 'opacity-50',\r\n // Cancelled events get gray background with strikethrough\r\n isCanceled\r\n ? 'bg-zinc-100 dark:bg-zinc-800 text-zinc-500 dark:text-zinc-400 line-through'\r\n : // Past events get neutral zinc styling\r\n isPast\r\n ? 'bg-zinc-100 dark:bg-zinc-800 text-zinc-500 dark:text-zinc-400 line-through'\r\n : [\r\n badgeVariant === 'colored' && [colors.bg, colors.text],\r\n badgeVariant === 'mixed' && [colors.bg, colors.text],\r\n badgeVariant === 'dot' && 'bg-muted/50',\r\n ],\r\n className,\r\n )}\r\n style={style}\r\n >\r\n {/* Colored dot for dot/mixed variants (matches agenda-v2 - no isCanceled check) */}\r\n {['dot', 'mixed'].includes(badgeVariant) && !isPast && (\r\n <svg\r\n width=\"8\"\r\n height=\"8\"\r\n viewBox=\"0 0 8 8\"\r\n className=\"event-dot absolute -top-1 -left-1 shrink-0\"\r\n aria-hidden=\"true\"\r\n focusable=\"false\"\r\n >\r\n <circle cx=\"4\" cy=\"4\" r=\"4\" className={colors.dotFill} />\r\n </svg>\r\n )}\r\n\r\n {/* Title with marquee effect */}\r\n <span className=\"flex-1 min-w-0 overflow-hidden\">\r\n <span className=\"\">\r\n <span\r\n className=\"relative block overflow-hidden whitespace-nowrap text-xs leading-tight\"\r\n style={{\r\n maskImage:\r\n 'linear-gradient(to right, transparent 0, black 8px, black calc(100% - 8px), transparent 100%)',\r\n WebkitMaskImage:\r\n 'linear-gradient(to right, transparent 0, black 8px, black calc(100% - 8px), transparent 100%)',\r\n }}\r\n >\r\n <span className=\"inline-flex event-marquee\">\r\n <span className=\"shrink-0 px-1\">{event.title}</span>\r\n <span className=\"shrink-0 px-1\">•</span>\r\n <span aria-hidden=\"true\" className=\"shrink-0 px-1\">\r\n {event.title}\r\n </span>\r\n <span aria-hidden=\"true\" className=\"shrink-0 px-1\">\r\n •\r\n </span>\r\n </span>\r\n </span>\r\n\r\n {/* Time pill with dashed border - always shown in compact variant (matches agenda-v2) */}\r\n <div\r\n className={cn(\r\n 'w-fit mt-0.5 text-[10px] px-1 py-0.5 border border-dashed rounded-full font-medium',\r\n isPast ? 'border-zinc-400 dark:border-zinc-600' : colors.border,\r\n )}\r\n >\r\n {formatTimeRange(event.startDate, event.endDate)}\r\n </div>\r\n </span>\r\n </span>\r\n {/* Status icon on right (matches agenda-v2) */}\r\n <div className=\"flex gap-0.5\">{statusIcon}</div>\r\n </div>\r\n );\r\n\r\n if (disablePopover) {\r\n return (\r\n <Tooltip>\r\n <TooltipTrigger asChild>{compactContent}</TooltipTrigger>\r\n <TooltipContent>\r\n <div className=\"flex flex-col gap-0.5\">\r\n <div className=\"font-medium\">{event.title}</div>\r\n <div className=\"text-xs text-muted-foreground tabular-nums\">\r\n {formatTimeRange(event.startDate, event.endDate)}\r\n </div>\r\n </div>\r\n </TooltipContent>\r\n </Tooltip>\r\n );\r\n }\r\n\r\n return (\r\n <Popover open={popoverOpen} onOpenChange={setPopoverOpen}>\r\n <PopoverTrigger asChild>{compactContent}</PopoverTrigger>\r\n <PopoverContent className=\"w-80\">\r\n {renderPopover ? (\r\n renderPopover({ event, onClose: handleClose })\r\n ) : (\r\n <DefaultPopoverContent event={event} onClose={handleClose} />\r\n )}\r\n </PopoverContent>\r\n </Popover>\r\n );\r\n }\r\n\r\n // ========================================================================\r\n // FULL VARIANT (matches agenda-v2 - border, hover shadow, colored text)\r\n // ========================================================================\r\n\r\n const fullContent = (\r\n <button\r\n type=\"button\"\r\n onClick={handleClick}\r\n className={cn(\r\n 'group relative flex w-full flex-col gap-1 rounded-md border px-2 py-1.5 text-left transition-all hover:shadow-md',\r\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\r\n // Cancelled events get gray background with strikethrough\r\n isCanceled\r\n ? 'bg-zinc-100 dark:bg-zinc-800 border-zinc-300 dark:border-zinc-700 text-zinc-500 dark:text-zinc-400 line-through'\r\n : // Past events get neutral zinc styling with strikethrough\r\n isPast\r\n ? 'bg-zinc-100 dark:bg-zinc-800 border-zinc-300 dark:border-zinc-700 text-zinc-500 dark:text-zinc-400 line-through'\r\n : [\r\n badgeVariant === 'colored' && [colors.bg, colors.border, colors.text],\r\n badgeVariant === 'mixed' && [colors.bg, colors.border, colors.text],\r\n badgeVariant === 'dot' && 'bg-muted/50 border-border',\r\n ],\r\n className,\r\n )}\r\n style={style}\r\n >\r\n {/* Header row */}\r\n <div className=\"flex items-start justify-between gap-1\">\r\n <div className=\"flex items-center gap-1.5 min-w-0\">\r\n {/* Colored dot for dot/mixed variants */}\r\n {['dot', 'mixed'].includes(badgeVariant) && !isPast && !isCanceled && (\r\n <svg\r\n width=\"8\"\r\n height=\"8\"\r\n viewBox=\"0 0 8 8\"\r\n className=\"event-dot shrink-0\"\r\n aria-hidden=\"true\"\r\n focusable=\"false\"\r\n >\r\n <circle cx=\"4\" cy=\"4\" r=\"4\" className={colors.dotFill} />\r\n </svg>\r\n )}\r\n <span\r\n className={cn(\r\n 'text-sm font-medium truncate',\r\n !isPast && !isCanceled && badgeVariant !== 'dot' && colors.text,\r\n isCanceled && 'line-through',\r\n )}\r\n >\r\n {event.title}\r\n </span>\r\n </div>\r\n {/* Status icon (matches agenda-v2) */}\r\n {statusIcon}\r\n </div>\r\n\r\n {/* Time display */}\r\n {showTime && (\r\n <div className=\"flex items-center gap-1 text-xs text-muted-foreground\">\r\n <ClockIcon className=\"h-3 w-3 shrink-0\" />\r\n <span>{formatTimeRange(event.startDate, event.endDate)}</span>\r\n </div>\r\n )}\r\n\r\n {/* Description */}\r\n {showDescription && event.description && (\r\n <p className=\"text-xs text-muted-foreground line-clamp-2\">\r\n {event.description}\r\n </p>\r\n )}\r\n\r\n {/* Participants (matches agenda-v2) */}\r\n {showParticipants && event.participants && event.participants.length > 0 && (\r\n <div className=\"flex items-center gap-1 text-xs text-muted-foreground\">\r\n <UsersIcon className=\"h-3 w-3 shrink-0\" />\r\n <span className=\"truncate\">\r\n {event.participants.map((p) => p.name).join(', ')}\r\n </span>\r\n </div>\r\n )}\r\n\r\n {/* Schedule type badge (matches agenda-v2) */}\r\n {event.scheduleTypeName && (\r\n <span\r\n className={cn(\r\n 'mt-1 inline-flex self-start rounded-full px-2 py-0.5 text-[10px] font-medium',\r\n isPast\r\n ? 'bg-zinc-200 dark:bg-zinc-700 text-zinc-500 dark:text-zinc-400'\r\n : [colors.bg, colors.text],\r\n )}\r\n >\r\n {event.scheduleTypeName}\r\n </span>\r\n )}\r\n </button>\r\n );\r\n\r\n if (disablePopover) {\r\n return (\r\n <Tooltip>\r\n <TooltipTrigger asChild>{fullContent}</TooltipTrigger>\r\n <TooltipContent>\r\n <div className=\"flex flex-col gap-0.5\">\r\n <div className=\"font-medium\">{event.title}</div>\r\n <div className=\"text-xs text-muted-foreground tabular-nums\">\r\n {formatTimeRange(event.startDate, event.endDate)}\r\n </div>\r\n </div>\r\n </TooltipContent>\r\n </Tooltip>\r\n );\r\n }\r\n\r\n return (\r\n <Popover open={popoverOpen} onOpenChange={setPopoverOpen}>\r\n <PopoverTrigger asChild>{fullContent}</PopoverTrigger>\r\n <PopoverContent className=\"w-80\">\r\n {renderPopover ? (\r\n renderPopover({ event, onClose: handleClose })\r\n ) : (\r\n <DefaultPopoverContent event={event} onClose={handleClose} />\r\n )}\r\n </PopoverContent>\r\n </Popover>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// CLOCK ICON (inline SVG to avoid lucide-react dependency)\r\n// ============================================================================\r\n\r\nfunction ClockIcon({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={className}\r\n >\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\r\n <polyline points=\"12 6 12 12 16 14\" />\r\n </svg>\r\n );\r\n}\r\n\r\n/**\r\n * Check Icon (inline SVG to avoid lucide-react dependency)\r\n */\r\nfunction CheckIcon({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={className}\r\n >\r\n <path d=\"M20 6 9 17l-5-5\" />\r\n </svg>\r\n );\r\n}\r\n\r\n/**\r\n * X Icon (inline SVG to avoid lucide-react dependency)\r\n */\r\nfunction XIcon({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={className}\r\n >\r\n <path d=\"M18 6 6 18\" />\r\n <path d=\"m6 6 12 12\" />\r\n </svg>\r\n );\r\n}\r\n\r\n/**\r\n * Users Icon (inline SVG to avoid lucide-react dependency)\r\n */\r\nfunction UsersIcon({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={className}\r\n >\r\n <path d=\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\" />\r\n <circle cx=\"9\" cy=\"7\" r=\"4\" />\r\n <path d=\"M22 21v-2a4 4 0 0 0-3-3.87\" />\r\n <path d=\"M16 3.13a4 4 0 0 1 0 7.75\" />\r\n </svg>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// DEFAULT POPOVER CONTENT (matches agenda-v2 Google Calendar style)\r\n// ============================================================================\r\n\r\ninterface DefaultPopoverContentProps<TData> {\r\n event: CalendarEvent<TData>;\r\n onClose: () => void;\r\n}\r\n\r\nfunction DefaultPopoverContent<TData>({ event, onClose }: DefaultPopoverContentProps<TData>) {\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 {/* Header with color indicator */}\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 className={cn('font-semibold text-lg', isCanceled && 'line-through opacity-50')}>\r\n {event.title}\r\n </h3>\r\n <div className=\"flex items-center gap-1 text-sm text-muted-foreground mt-1\">\r\n <ClockIcon className=\"h-4 w-4 shrink-0\" />\r\n <span className=\"tabular-nums\">{formatTimeRange(event.startDate, event.endDate)}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Description */}\r\n {event.description && (\r\n <p className=\"text-sm text-muted-foreground\">{event.description}</p>\r\n )}\r\n\r\n {/* Status badges */}\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\">All day</span>\r\n )}\r\n {event.isRecurring && (\r\n <span className=\"text-xs bg-muted px-2 py-0.5 rounded-full font-medium\">Recurring</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 {/* Close button */}\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// EVENT BLOCK (positioned in time grid - matches agenda-v2)\r\n// ============================================================================\r\n\r\nexport interface EventBlockProps<TData = Record<string, unknown>> {\r\n /** The event to display */\r\n event: CalendarEvent<TData>;\r\n /** Position in the grid */\r\n position: {\r\n top: number;\r\n left: number;\r\n width: number;\r\n minWidth?: number;\r\n };\r\n /** Pixels per hour (default: 96 to match agenda-v2) */\r\n hourHeight?: number;\r\n /** Badge variant for coloring style */\r\n badgeVariant?: TBadgeVariant;\r\n /** Click handler */\r\n onClick?: ((event: CalendarEvent<TData>) => void) | undefined;\r\n /** Additional CSS classes */\r\n className?: string;\r\n /** Disable popover and use onClick instead */\r\n disablePopover?: boolean;\r\n /** Custom popover content */\r\n renderPopover?: ((props: { event: CalendarEvent<TData>; onClose: () => void }) => ReactNode) | undefined;\r\n /** Enable drag support for repositioning */\r\n enableDrag?: boolean;\r\n}\r\n\r\n/**\r\n * EventBlock - Positioned event in day/week time grid\r\n * Matches agenda-v2 styling:\r\n * - Height calculated from event duration\r\n * - Shows time when duration > 25 minutes\r\n * - Uses colored/dot/mixed badge variants\r\n * - Drag & drop support for event repositioning\r\n */\r\nexport function EventBlock<TData = Record<string, unknown>>({\r\n event,\r\n position,\r\n hourHeight = 96,\r\n badgeVariant = 'colored',\r\n onClick,\r\n className,\r\n disablePopover = false,\r\n renderPopover,\r\n enableDrag = true,\r\n}: EventBlockProps<TData>) {\r\n const colors = getEventColorClasses(event.color);\r\n const [popoverOpen, setPopoverOpen] = useState(false);\r\n const [isDragging, setIsDragging] = useState(false);\r\n\r\n // Get drag-drop context\r\n const dragDrop = useOptionalDragDrop();\r\n\r\n // Calculate duration and height\r\n const durationInMinutes = (event.endDate.getTime() - event.startDate.getTime()) / (1000 * 60);\r\n const heightInPixels = (durationInMinutes / 60) * hourHeight - 8;\r\n\r\n // Check if event is in the past\r\n const isPast = event.endDate < startOfDay(new Date());\r\n const isCanceled = event.isCanceled ?? false;\r\n\r\n // Don't allow dragging for cancelled or past events\r\n const canDrag = enableDrag && dragDrop && !isCanceled && !isPast;\r\n\r\n // Short events get centered content\r\n const isShortEvent = durationInMinutes < 35;\r\n const showTime = durationInMinutes > 25;\r\n\r\n // Determine color variant\r\n const isDotVariant = badgeVariant === 'dot';\r\n\r\n // Handle click\r\n const handleClick = useCallback(() => {\r\n if (isDragging) return; // Don't open popover during drag\r\n if (disablePopover && onClick) {\r\n onClick(event);\r\n } else if (!disablePopover) {\r\n setPopoverOpen(true);\r\n }\r\n }, [isDragging, disablePopover, onClick, event]);\r\n\r\n // Handle popover close\r\n const handleClose = useCallback(() => {\r\n setPopoverOpen(false);\r\n }, []);\r\n\r\n // Drag handlers (matches agenda-v2)\r\n const handleDragStart = useCallback(\r\n (e: React.DragEvent) => {\r\n if (!canDrag) return;\r\n e.dataTransfer.effectAllowed = 'move';\r\n e.dataTransfer.setData('text/plain', event.id);\r\n // Set custom drag image with some offset\r\n const target = e.currentTarget as HTMLElement;\r\n const rect = target.getBoundingClientRect();\r\n e.dataTransfer.setDragImage(target, e.clientX - rect.left, e.clientY - rect.top);\r\n setIsDragging(true);\r\n dragDrop?.startDrag?.(event);\r\n },\r\n [canDrag, event, dragDrop],\r\n );\r\n\r\n const handleDragEnd = useCallback(() => {\r\n setIsDragging(false);\r\n if (dragDrop?.isDragging) {\r\n dragDrop.endDrag?.();\r\n }\r\n }, [dragDrop]);\r\n\r\n const handleKeyDown = useCallback(\r\n (e: React.KeyboardEvent) => {\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault();\r\n handleClick();\r\n }\r\n },\r\n [handleClick],\r\n );\r\n\r\n const blockButton = (\r\n <div\r\n role=\"button\"\r\n tabIndex={0}\r\n draggable={!!canDrag}\r\n onDragStart={handleDragStart}\r\n onDragEnd={handleDragEnd}\r\n onKeyDown={handleKeyDown}\r\n onClick={isDragging ? undefined : handleClick}\r\n className={cn(\r\n 'group flex w-full select-none flex-col gap-0.5 overflow-hidden rounded-md border px-2 py-1.5 text-xs text-left',\r\n 'focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\r\n 'transition-opacity',\r\n canDrag ? 'cursor-grab active:cursor-grabbing' : 'cursor-pointer',\r\n isDragging && 'opacity-50',\r\n // Cancelled events get gray background with strikethrough\r\n isCanceled\r\n ? 'bg-zinc-100 dark:bg-zinc-800 border-zinc-300 dark:border-zinc-700 text-zinc-500 dark:text-zinc-400 line-through'\r\n : // Past events get neutral zinc styling with strikethrough\r\n isPast\r\n ? 'bg-zinc-100 dark:bg-zinc-800 border-zinc-300 dark:border-zinc-700 text-zinc-500 dark:text-zinc-400 line-through'\r\n : [\r\n // Colored/mixed variants\r\n !isDotVariant && [colors.bg, colors.border, colors.text],\r\n // Dot variant - neutral background\r\n isDotVariant && 'bg-neutral-50 dark:bg-neutral-900 border-neutral-200 dark:border-neutral-700',\r\n ],\r\n // Short events center content\r\n isShortEvent && 'py-0 justify-center',\r\n className,\r\n )}\r\n style={{ height: `${Math.max(heightInPixels, 20)}px` }}\r\n >\r\n <div className=\"flex items-start gap-1.5 min-w-0\">\r\n {/* Colored dot for dot/mixed variants */}\r\n {['mixed', 'dot'].includes(badgeVariant) && !isPast && !isCanceled && (\r\n <svg\r\n width=\"8\"\r\n height=\"8\"\r\n viewBox=\"0 0 8 8\"\r\n className=\"event-dot shrink-0\"\r\n aria-hidden=\"true\"\r\n focusable=\"false\"\r\n >\r\n <circle cx=\"4\" cy=\"4\" r=\"4\" className={colors.dotFill} />\r\n </svg>\r\n )}\r\n <div className=\"flex-1 min-w-0 overflow-hidden\">\r\n <p\r\n className={cn(\r\n 'font-semibold whitespace-nowrap',\r\n !isPast && !isCanceled && isDotVariant && 'text-foreground',\r\n )}\r\n >\r\n {event.title}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n {/* Time display - only show when there's enough space */}\r\n {showTime && (\r\n <p\r\n className={cn(\r\n 'text-[11px] tabular-nums',\r\n isDotVariant ? 'text-muted-foreground' : 'opacity-90',\r\n )}\r\n >\r\n {formatTime(event.startDate)} - {formatTime(event.endDate)}\r\n </p>\r\n )}\r\n </div>\r\n );\r\n\r\n const tooltipContent = (\r\n <TooltipContent>\r\n <div className=\"flex flex-col gap-0.5\">\r\n <div className=\"font-medium\">{event.title}</div>\r\n <div className=\"text-xs text-muted-foreground tabular-nums\">\r\n {formatTimeRange(event.startDate, event.endDate)}\r\n </div>\r\n </div>\r\n </TooltipContent>\r\n );\r\n\r\n if (disablePopover) {\r\n return (\r\n <div\r\n className=\"absolute p-0.5\"\r\n style={{\r\n top: `${position.top}px`,\r\n left: `${position.left}%`,\r\n width: position.minWidth ? `max(${position.minWidth}px, ${position.width}%)` : `${position.width}%`,\r\n minWidth: position.minWidth ? `${position.minWidth}px` : undefined,\r\n }}\r\n >\r\n <Tooltip>\r\n <TooltipTrigger asChild>{blockButton}</TooltipTrigger>\r\n {tooltipContent}\r\n </Tooltip>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div\r\n className=\"absolute p-0.5\"\r\n style={{\r\n top: `${position.top}px`,\r\n left: `${position.left}%`,\r\n width: position.minWidth ? `max(${position.minWidth}px, ${position.width}%)` : `${position.width}%`,\r\n minWidth: position.minWidth ? `${position.minWidth}px` : undefined,\r\n }}\r\n >\r\n <Popover open={popoverOpen} onOpenChange={setPopoverOpen}>\r\n <PopoverTrigger asChild>{blockButton}</PopoverTrigger>\r\n <PopoverContent className=\"w-80\">\r\n {renderPopover ? (\r\n renderPopover({ event, onClose: handleClose })\r\n ) : (\r\n <DefaultPopoverContent event={event} onClose={handleClose} />\r\n )}\r\n </PopoverContent>\r\n </Popover>\r\n </div>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// MULTI-DAY EVENT BAR (for week/month views - matches agenda-v2)\r\n// ============================================================================\r\n\r\nexport interface MultiDayEventBarProps<TData = Record<string, unknown>> {\r\n /** The event to display */\r\n event: CalendarEvent<TData>;\r\n /** Number of days the event spans */\r\n spanDays: number;\r\n /** Whether this is the start of the event span */\r\n isStart: boolean;\r\n /** Whether this is the end of the event span */\r\n isEnd: boolean;\r\n /** Click handler */\r\n onClick?: (event: CalendarEvent<TData>) => void;\r\n /** Additional CSS classes */\r\n className?: string;\r\n /** Disable popover and use onClick instead */\r\n disablePopover?: boolean;\r\n /** Custom popover content */\r\n renderPopover?: (props: { event: CalendarEvent<TData>; onClose: () => void }) => ReactNode;\r\n}\r\n\r\n/**\r\n * MultiDayEventBar - Horizontal bar for multi-day events in week/month views\r\n */\r\nexport function MultiDayEventBar<TData = Record<string, unknown>>({\r\n event,\r\n spanDays,\r\n isStart,\r\n isEnd,\r\n onClick,\r\n className,\r\n disablePopover = false,\r\n renderPopover,\r\n}: MultiDayEventBarProps<TData>) {\r\n const colors = getEventColorClasses(event.color);\r\n const [popoverOpen, setPopoverOpen] = useState(false);\r\n\r\n // Check if event is in the past\r\n const isPast = event.endDate < startOfDay(new Date());\r\n const isCanceled = event.isCanceled ?? false;\r\n\r\n // Handle click\r\n const handleClick = useCallback(() => {\r\n if (disablePopover && onClick) {\r\n onClick(event);\r\n } else if (!disablePopover) {\r\n setPopoverOpen(true);\r\n }\r\n }, [disablePopover, onClick, event]);\r\n\r\n // Handle popover close\r\n const handleClose = useCallback(() => {\r\n setPopoverOpen(false);\r\n }, []);\r\n\r\n const barButton = (\r\n <button\r\n type=\"button\"\r\n onClick={handleClick}\r\n className={cn(\r\n 'flex h-5 items-center px-1.5 text-xs font-medium transition-opacity hover:opacity-80',\r\n // Cancelled events get gray background with strikethrough\r\n isCanceled\r\n ? 'bg-zinc-200 dark:bg-zinc-700 text-zinc-500 dark:text-zinc-400 line-through'\r\n : // Past events get neutral zinc styling with strikethrough\r\n isPast\r\n ? 'bg-zinc-200 dark:bg-zinc-700 text-zinc-500 dark:text-zinc-400 line-through'\r\n : [colors.dot, 'text-white'],\r\n isStart && 'rounded-l',\r\n isEnd && 'rounded-r',\r\n !isStart && 'border-l-0',\r\n !isEnd && 'border-r-0',\r\n className,\r\n )}\r\n style={{ width: `${spanDays * 100}%` }}\r\n >\r\n {isStart && <span className=\"truncate\">{event.title}</span>}\r\n </button>\r\n );\r\n\r\n const tooltipContent = (\r\n <TooltipContent>\r\n <div className=\"flex flex-col gap-0.5\">\r\n <div className=\"font-medium\">{event.title}</div>\r\n <div className=\"text-xs text-muted-foreground tabular-nums\">\r\n {formatTimeRange(event.startDate, event.endDate)}\r\n </div>\r\n </div>\r\n </TooltipContent>\r\n );\r\n\r\n if (disablePopover) {\r\n return (\r\n <Tooltip>\r\n <TooltipTrigger asChild>{barButton}</TooltipTrigger>\r\n {tooltipContent}\r\n </Tooltip>\r\n );\r\n }\r\n\r\n return (\r\n <Popover open={popoverOpen} onOpenChange={setPopoverOpen}>\r\n <PopoverTrigger asChild>{barButton}</PopoverTrigger>\r\n <PopoverContent className=\"w-80\">\r\n {renderPopover ? (\r\n renderPopover({ event, onClose: handleClose })\r\n ) : (\r\n <DefaultPopoverContent event={event} onClose={handleClose} />\r\n )}\r\n </PopoverContent>\r\n </Popover>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// MARQUEE ANIMATION CSS INJECTION\r\n// ============================================================================\r\n\r\n// Inject marquee animation CSS into document head (runs once)\r\nif (typeof window !== 'undefined' && !document.getElementById('inno-calendar-event-marquee-style')) {\r\n const style = document.createElement('style');\r\n style.id = 'inno-calendar-event-marquee-style';\r\n style.innerHTML = `\r\n@keyframes event-marquee {\r\n 0% { transform: translateX(0); }\r\n 100% { transform: translateX(-50%); }\r\n}\r\n.event-marquee {\r\n animation: event-marquee 28s linear infinite;\r\n will-change: transform;\r\n}\r\n`;\r\n document.head.appendChild(style);\r\n}\r\n\r\nexport default EventCard;\r\n","/**\r\n * Multi-Day Event Banner\r\n *\r\n * Displays multi-day and all-day events in a banner above the time grid.\r\n * Used in Day and Week views.\r\n */\r\n\r\nimport { cn } from '../../lib/utils';\r\nimport type { CalendarEvent, TOnEventClick } from '../../core/types';\r\nimport { getEventColorClasses } from '../event/event-card';\r\nimport { isSameDay } from '../../core/utils/date-utils';\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface MultiDayBannerProps<TData = Record<string, unknown>> {\r\n /** Multi-day events to display */\r\n events: CalendarEvent<TData>[];\r\n /** Reference date (for determining start/end indicators) */\r\n date: Date;\r\n /** Click handler */\r\n onEventClick?: TOnEventClick<TData>;\r\n /** Additional CSS classes */\r\n className?: string;\r\n}\r\n\r\n// ============================================================================\r\n// COMPONENT\r\n// ============================================================================\r\n\r\nexport function MultiDayBanner<TData = Record<string, unknown>>({\r\n events,\r\n date,\r\n onEventClick,\r\n className,\r\n}: MultiDayBannerProps<TData>) {\r\n if (events.length === 0) return null;\r\n\r\n return (\r\n <div\r\n className={cn(\r\n 'border-b bg-muted/20 px-2 py-1.5 space-y-1',\r\n 'sm:px-4 sm:py-2',\r\n className,\r\n )}\r\n >\r\n {/* Label */}\r\n <span className=\"text-[10px] font-medium text-muted-foreground sm:text-xs\">\r\n All day / Multi-day\r\n </span>\r\n\r\n {/* Events */}\r\n <div className=\"flex flex-wrap gap-1\">\r\n {events.map((event) => {\r\n const colors = getEventColorClasses(event.color);\r\n const isStart = isSameDay(event.startDate, date);\r\n const isEnd = isSameDay(event.endDate, date);\r\n\r\n return (\r\n <button\r\n key={event.id}\r\n type=\"button\"\r\n onClick={() => onEventClick?.(event)}\r\n className={cn(\r\n 'inline-flex items-center gap-1 rounded px-1.5 py-0.5 text-[10px] font-medium transition-opacity hover:opacity-80',\r\n 'sm:px-2 sm:py-1 sm:text-xs',\r\n colors.bg,\r\n colors.text,\r\n event.isCanceled && 'opacity-60 line-through',\r\n )}\r\n >\r\n {isStart && '→ '}\r\n <span className=\"truncate max-w-24 sm:max-w-32\">{event.title}</span>\r\n {isEnd && ' →'}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default MultiDayBanner;\r\n","/**\r\n * Selectable Slot Component\r\n *\r\n * A unified component for handling slot interactions in calendar views.\r\n * Supports:\r\n * - Single click (quick event creation)\r\n * - Click and drag (range selection)\r\n * - Touch support for mobile\r\n * - Visual feedback during selection\r\n * - Drag & drop receiving for event repositioning\r\n *\r\n * This component consolidates the interaction logic that was previously\r\n * scattered across different view components.\r\n */\r\n\r\nimport { cn } from '../../lib/utils';\r\nimport { useCallback, useRef, useEffect, useState, type ReactNode } from 'react';\r\nimport type { ITimeSlot } from '../../core/types';\r\nimport { useOptionalDragDrop } from '../../core/context';\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface SelectableSlotProps {\r\n /** The time slot this component represents */\r\n slot: ITimeSlot;\r\n /** Called when selection starts on this slot */\r\n onSelectionStart?: (slot: ITimeSlot) => void;\r\n /** Called when pointer moves over this slot during selection */\r\n onSelectionMove?: (slot: ITimeSlot) => void;\r\n /** Called when selection ends on this slot */\r\n onSelectionEnd?: () => void;\r\n /** Whether this slot is currently in the selection range */\r\n isSelected?: boolean;\r\n /** Whether a selection is in progress (for hover effects) */\r\n isSelecting?: boolean;\r\n /** Whether this slot is disabled (non-working hours) */\r\n disabled?: boolean;\r\n /** Accessibility label */\r\n ariaLabel?: string;\r\n /** Child content */\r\n children?: ReactNode;\r\n /** Additional classes */\r\n className?: string;\r\n /** Height of the slot (for time grid positioning) */\r\n height?: string | number;\r\n /** Inline style for positioning */\r\n style?: React.CSSProperties;\r\n /** Custom data attributes */\r\n dataAttributes?: Record<string, string>;\r\n}\r\n\r\n// ============================================================================\r\n// CONSTANTS\r\n// ============================================================================\r\n\r\n/** Minimum drag distance to differentiate from click (in pixels) */\r\nconst DRAG_THRESHOLD = 5;\r\n\r\n// ============================================================================\r\n// COMPONENT\r\n// ============================================================================\r\n\r\nexport function SelectableSlot({\r\n slot,\r\n onSelectionStart,\r\n onSelectionMove,\r\n onSelectionEnd,\r\n isSelected = false,\r\n isSelecting = false,\r\n disabled = false,\r\n ariaLabel,\r\n children,\r\n className,\r\n height,\r\n style,\r\n dataAttributes,\r\n}: SelectableSlotProps) {\r\n // Track if this is a drag or click\r\n const startPositionRef = useRef<{ x: number; y: number } | null>(null);\r\n const isDraggingRef = useRef(false);\r\n const isMouseDownRef = useRef(false);\r\n const buttonRef = useRef<HTMLButtonElement>(null);\r\n const [isDragOver, setIsDragOver] = useState(false);\r\n\r\n // Get drag-drop context for receiving dropped events\r\n const dragDrop = useOptionalDragDrop();\r\n\r\n // Handle pointer down (mouse or touch)\r\n const handlePointerDown = useCallback(\r\n (e: React.PointerEvent) => {\r\n if (disabled) return;\r\n\r\n // Only handle primary button (left click) or touch\r\n if (e.button !== 0 && e.pointerType === 'mouse') return;\r\n\r\n // Prevent text selection during drag\r\n e.preventDefault();\r\n\r\n // Store start position for drag detection\r\n startPositionRef.current = { x: e.clientX, y: e.clientY };\r\n isDraggingRef.current = false;\r\n isMouseDownRef.current = true;\r\n\r\n // Start selection\r\n onSelectionStart?.(slot);\r\n },\r\n [disabled, slot, onSelectionStart],\r\n );\r\n\r\n // Handle pointer move - check for drag threshold\r\n const handlePointerMove = useCallback(\r\n (e: React.PointerEvent) => {\r\n if (!(startPositionRef.current && isMouseDownRef.current && !disabled)) return;\r\n\r\n // Check if we've moved enough to be a drag\r\n const dx = e.clientX - startPositionRef.current.x;\r\n const dy = e.clientY - startPositionRef.current.y;\r\n const distance = Math.sqrt(dx * dx + dy * dy);\r\n\r\n if (distance >= DRAG_THRESHOLD) {\r\n isDraggingRef.current = true;\r\n }\r\n },\r\n [disabled],\r\n );\r\n\r\n // Handle pointer enter - key for multi-cell selection\r\n const handlePointerEnter = useCallback(\r\n (e: React.PointerEvent) => {\r\n if (disabled) return;\r\n\r\n // Check if any pointer button is pressed (works for both mouse and touch)\r\n // e.buttons is a bitmask: 1 = primary button (left), 2 = secondary, etc.\r\n if (e.buttons > 0 || isSelecting) {\r\n onSelectionMove?.(slot);\r\n }\r\n },\r\n [disabled, isSelecting, slot, onSelectionMove],\r\n );\r\n\r\n // Handle pointer up\r\n const handlePointerUp = useCallback(() => {\r\n if (disabled) return;\r\n\r\n // End selection\r\n onSelectionEnd?.();\r\n\r\n // Reset tracking\r\n startPositionRef.current = null;\r\n isDraggingRef.current = false;\r\n isMouseDownRef.current = false;\r\n }, [disabled, onSelectionEnd]);\r\n\r\n // Drag & drop handlers for receiving events\r\n const handleDragOver = useCallback(\r\n (e: React.DragEvent) => {\r\n if (!dragDrop?.isDragging || disabled) return;\r\n e.preventDefault();\r\n e.dataTransfer.dropEffect = 'move';\r\n setIsDragOver(true);\r\n // Update preview position in drag context\r\n // For month view (no hour/minute), use current time\r\n const now = new Date();\r\n const hour = slot.hour ?? now.getHours();\r\n const minute = slot.minute ?? (now.getMinutes() >= 30 ? 30 : 0);\r\n dragDrop.updateDragPreview?.(slot.date, hour, minute);\r\n },\r\n [dragDrop, disabled, slot],\r\n );\r\n\r\n const handleDragLeave = useCallback(() => {\r\n setIsDragOver(false);\r\n }, []);\r\n\r\n const handleDrop = useCallback(\r\n (e: React.DragEvent) => {\r\n e.preventDefault();\r\n setIsDragOver(false);\r\n if (!dragDrop?.isDragging || disabled) return;\r\n // End drag and trigger the drop callback in DragDropProvider\r\n dragDrop.endDrag?.();\r\n },\r\n [dragDrop, disabled],\r\n );\r\n\r\n // Add global pointer up listener to handle cases where mouse is released outside\r\n useEffect(() => {\r\n const handleGlobalPointerUp = () => {\r\n if (isMouseDownRef.current) {\r\n isMouseDownRef.current = false;\r\n startPositionRef.current = null;\r\n isDraggingRef.current = false;\r\n }\r\n };\r\n\r\n window.addEventListener('pointerup', handleGlobalPointerUp);\r\n window.addEventListener('pointercancel', handleGlobalPointerUp);\r\n\r\n return () => {\r\n window.removeEventListener('pointerup', handleGlobalPointerUp);\r\n window.removeEventListener('pointercancel', handleGlobalPointerUp);\r\n };\r\n }, []);\r\n\r\n // Handle keyboard for accessibility\r\n const handleKeyDown = useCallback(\r\n (e: React.KeyboardEvent) => {\r\n if (disabled) return;\r\n\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault();\r\n onSelectionStart?.(slot);\r\n onSelectionEnd?.();\r\n }\r\n },\r\n [disabled, slot, onSelectionStart, onSelectionEnd],\r\n );\r\n\r\n return (\r\n <button\r\n ref={buttonRef}\r\n type=\"button\"\r\n aria-label={ariaLabel}\r\n aria-disabled={disabled}\r\n aria-pressed={isSelected}\r\n disabled={disabled}\r\n onPointerDown={handlePointerDown}\r\n onPointerMove={handlePointerMove}\r\n onPointerUp={handlePointerUp}\r\n onPointerEnter={handlePointerEnter}\r\n onKeyDown={handleKeyDown}\r\n onDragOver={handleDragOver}\r\n onDragLeave={handleDragLeave}\r\n onDrop={handleDrop}\r\n className={cn(\r\n 'select-none touch-none cursor-pointer transition-colors',\r\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset',\r\n // Hover state (only when not in selection)\r\n !(isSelecting || disabled) && 'hover:bg-accent/50',\r\n // Selection state\r\n isSelected && 'bg-zinc-50',\r\n // Drag over state - visual feedback when event is dragged over\r\n isDragOver && 'bg-primary/20 ring-2 ring-primary ring-inset',\r\n // Disabled state\r\n disabled && 'cursor-not-allowed opacity-50',\r\n className,\r\n )}\r\n style={{ height, ...style }}\r\n {...dataAttributes}\r\n >\r\n {children}\r\n </button>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// SPECIALIZED SLOT COMPONENTS\r\n// ============================================================================\r\n\r\n/**\r\n * TimeSlot - For day/week views with configurable time granularity\r\n * Supports 15, 30, or 60 minute slot durations\r\n * Accepts either a `slot` prop OR individual `date/hour/minute` props\r\n */\r\ninterface TimeSlotProps extends Omit<SelectableSlotProps, 'slot'> {\r\n /** Direct slot object (preferred) */\r\n slot?: ITimeSlot;\r\n /** Date for the slot (alternative to slot prop) */\r\n date?: Date;\r\n /** Hour for the slot (alternative to slot prop) */\r\n hour?: number;\r\n /** Minute for the slot (alternative to slot prop) */\r\n minute?: number;\r\n}\r\n\r\nexport function TimeSlot({ slot: slotProp, date, hour, minute, ariaLabel, ...props }: TimeSlotProps) {\r\n // Use provided slot or construct from individual props\r\n const slot: ITimeSlot = slotProp ?? { date: date!, hour: hour ?? 0, minute: minute ?? 0 };\r\n const label =\r\n ariaLabel ??\r\n `Add event at ${(slot.hour ?? 0).toString().padStart(2, '0')}:${(slot.minute ?? 0).toString().padStart(2, '0')} on ${slot.date.toLocaleDateString()}`;\r\n\r\n return <SelectableSlot slot={slot} ariaLabel={label} {...props} />;\r\n}\r\n\r\n/**\r\n * DaySlot - For month/year views with day granularity\r\n * Renders as a day cell\r\n * Accepts either a `slot` prop OR a `date` prop\r\n */\r\ninterface DaySlotProps extends Omit<SelectableSlotProps, 'slot'> {\r\n /** Direct slot object (preferred) */\r\n slot?: ITimeSlot;\r\n /** Date for the slot (alternative to slot prop) */\r\n date?: Date;\r\n}\r\n\r\nexport function DaySlot({ slot: slotProp, date, ariaLabel, ...props }: DaySlotProps) {\r\n // Use provided slot or construct from date\r\n const slot: ITimeSlot = slotProp ?? { date: date! };\r\n const label = ariaLabel ?? `Select ${slot.date.toLocaleDateString()}`;\r\n\r\n return <SelectableSlot slot={slot} ariaLabel={label} {...props} />;\r\n}\r\n\r\nexport type { TimeSlotProps, DaySlotProps };\r\nexport default SelectableSlot;\r\n","/**\r\n * Day View Component\r\n *\r\n * Full day time grid showing events hour by hour.\r\n * Features:\r\n * - Hourly time slots with event positioning\r\n * - Current time indicator\r\n * - Working hours highlighting\r\n * - Click to add event\r\n * - Drag to select time range\r\n *\r\n * Ported from agenda-v2 to maintain exact styling parity.\r\n */\r\n\r\nimport { cn } from '../../lib/utils';\r\nimport { useCallback, useLayoutEffect, useMemo, useRef } from 'react';\r\nimport type {\r\n CalendarEvent,\r\n ITimeSlot,\r\n IVisibleHours,\r\n TBadgeVariant,\r\n TOnEventClick,\r\n TOnSlotSelect,\r\n} from '../../core/types';\r\nimport {\r\n isToday,\r\n getVisibleHoursArray,\r\n formatHourLabel,\r\n separateEventsByDuration,\r\n isWorkingHour,\r\n type TWorkingHours,\r\n} from '../../core/utils/date-utils';\r\nimport { getEventsForDay } from '../../core/utils/event-utils';\r\nimport { calculateOverlappingPositions } from '../../core/utils/position-utils';\r\nimport { useOptionalSlotSelection } from '../../core/context/slot-selection-context';\r\nimport { EventBlock } from '../event/event-card';\r\nimport { MultiDayBanner } from '../primitives/multi-day-banner';\r\nimport { TimeSlot } from '../primitives/selectable-slot';\r\n\r\n// ============================================================================\r\n// CONSTANTS (matches agenda-v2)\r\n// ============================================================================\r\n\r\nconst HOUR_HEIGHT = 96; // pixels per hour (same as demo-scheduler)\r\nconst HOUR_COLUMN_WIDTH = 72; // width of hour labels column\r\nconst MIN_EVENT_CARD_WIDTH = 80; // minimum width in pixels for event cards\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface DayViewProps<TData = Record<string, unknown>> {\r\n /** Events to display */\r\n events: CalendarEvent<TData>[];\r\n /** The date to display */\r\n date: Date;\r\n /** Visible hours range */\r\n visibleHours?: IVisibleHours;\r\n /** Working hours per day */\r\n workingHours?: TWorkingHours;\r\n /** Slot duration in minutes */\r\n slotDuration?: number;\r\n /** Badge variant for events */\r\n badgeVariant?: TBadgeVariant;\r\n /** Event click handler */\r\n onEventClick?: TOnEventClick<TData>;\r\n /** Slot select handler */\r\n onSlotSelect?: TOnSlotSelect;\r\n /** Additional CSS classes */\r\n className?: string;\r\n /** Custom event renderer */\r\n renderEvent?: (props: {\r\n event: CalendarEvent<TData>;\r\n position: { top: number; height: number; left: number; width: number };\r\n }) => React.ReactNode;\r\n /** Custom popover content renderer */\r\n renderPopover?: (props: {\r\n event: CalendarEvent<TData>;\r\n onClose: () => void;\r\n }) => React.ReactNode;\r\n}\r\n\r\n// ============================================================================\r\n// COMPONENT\r\n// ============================================================================\r\n\r\nexport function DayView<TData = Record<string, unknown>>({\r\n events,\r\n date,\r\n visibleHours = { startHour: 0, endHour: 24 },\r\n workingHours,\r\n slotDuration = 30,\r\n badgeVariant = 'colored',\r\n onEventClick,\r\n onSlotSelect: _onSlotSelect,\r\n className,\r\n renderEvent,\r\n renderPopover,\r\n}: DayViewProps<TData>) {\r\n // Calculate slot configuration based on slotDuration\r\n const slotsPerHour = 60 / slotDuration;\r\n const slotHeightPercent = 100 / slotsPerHour;\r\n\r\n // Generate slot minutes for each hour (e.g., [0, 30] for 30min, [0, 15, 30, 45] for 15min)\r\n const slotMinutes = useMemo(() => {\r\n const minutes: number[] = [];\r\n for (let i = 0; i < slotsPerHour; i++) {\r\n minutes.push(i * slotDuration);\r\n }\r\n return minutes;\r\n }, [slotsPerHour, slotDuration]);\r\n\r\n // Get events for this day\r\n const dayEvents = useMemo(() => getEventsForDay(events, date), [events, date]);\r\n\r\n // Separate single-day and multi-day events\r\n const { singleDay, multiDay } = useMemo(\r\n () => separateEventsByDuration(dayEvents),\r\n [dayEvents],\r\n );\r\n\r\n // Calculate positions for overlapping events\r\n const eventPositions = useMemo(() => {\r\n const positions = calculateOverlappingPositions(singleDay, date, visibleHours, HOUR_HEIGHT);\r\n // Convert array to Map for fast lookup\r\n const map = new Map<string, { top: number; height: number; left: number; width: number }>();\r\n for (const positioned of positions) {\r\n map.set(positioned.event.id, positioned.position);\r\n }\r\n return map;\r\n }, [singleDay, date, visibleHours]);\r\n\r\n // Hours to display\r\n const hours = useMemo(() => getVisibleHoursArray(visibleHours), [visibleHours]);\r\n\r\n // Current time indicator position\r\n const now = new Date();\r\n const showCurrentTime = isToday(date);\r\n const currentTimeTop = useMemo(() => {\r\n if (!showCurrentTime) return 0;\r\n const currentHour = now.getHours() + now.getMinutes() / 60;\r\n if (currentHour < visibleHours.startHour || currentHour > visibleHours.endHour) {\r\n return -1; // Out of visible range\r\n }\r\n return (currentHour - visibleHours.startHour) * HOUR_HEIGHT;\r\n }, [showCurrentTime, visibleHours, now]);\r\n\r\n // Ref for scrollable container - used to auto-scroll to working hours\r\n const scrollContainerRef = useRef<HTMLDivElement>(null);\r\n\r\n // Auto-scroll to working hours on mount\r\n useLayoutEffect(() => {\r\n const container = scrollContainerRef.current;\r\n if (!container) return;\r\n\r\n // Use requestAnimationFrame to ensure DOM is fully rendered\r\n const scrollToWorkingHours = () => {\r\n // Get working hours for current day (0 = Sunday, 1 = Monday, etc.)\r\n const dayOfWeek = date.getDay();\r\n const todayWorkingHours = workingHours?.[dayOfWeek];\r\n\r\n // Calculate scroll position - aim for 1 hour before working hours start\r\n // This gives context and shows the user is at the start of the working day\r\n let scrollToHour: number;\r\n\r\n // Check if day has enabled working hours\r\n if (todayWorkingHours?.enabled && todayWorkingHours.from > 0) {\r\n // Scroll to 1 hour before working hours, but not before visible range\r\n scrollToHour = Math.max(todayWorkingHours.from - 1, visibleHours.startHour);\r\n } else {\r\n // Default to 7 AM if no working hours defined, disabled, or starts at midnight\r\n scrollToHour = Math.max(7, visibleHours.startHour);\r\n }\r\n\r\n // Calculate pixel position\r\n const scrollTop = (scrollToHour - visibleHours.startHour) * HOUR_HEIGHT;\r\n\r\n // Scroll to position (instant on initial load for better UX)\r\n container.scrollTo({\r\n top: scrollTop,\r\n behavior: 'instant',\r\n });\r\n };\r\n\r\n // Use double requestAnimationFrame to ensure layout is complete\r\n requestAnimationFrame(() => {\r\n requestAnimationFrame(scrollToWorkingHours);\r\n });\r\n }, [date, workingHours, visibleHours]);\r\n\r\n // Get slot selection context (optional - works without provider)\r\n const slotSelection = useOptionalSlotSelection();\r\n\r\n // Create selection handlers for time slots\r\n const handleSelectionStart = useCallback(\r\n (slot: ITimeSlot) => {\r\n slotSelection?.startSelection(slot);\r\n },\r\n [slotSelection],\r\n );\r\n\r\n const handleSelectionMove = useCallback(\r\n (slot: ITimeSlot) => {\r\n slotSelection?.updateSelection(slot);\r\n },\r\n [slotSelection],\r\n );\r\n\r\n const handleSelectionEnd = useCallback(() => {\r\n slotSelection?.endSelection();\r\n }, [slotSelection]);\r\n\r\n // Handle multi-day event click\r\n const handleMultiDayEventClick = useCallback(\r\n (event: CalendarEvent<TData>) => {\r\n onEventClick?.(event);\r\n },\r\n [onEventClick],\r\n );\r\n\r\n // Format header date like Google Calendar\r\n const headerDay = date.toLocaleDateString([], { weekday: 'short' });\r\n const headerDate = date.getDate();\r\n const today = isToday(date);\r\n\r\n return (\r\n <div className={cn('flex flex-col h-full', className)}>\r\n {/* Header - Google Calendar style */}\r\n <div className=\"flex items-center gap-3 border-b px-4 py-3\">\r\n {/* Day column with name + circled date */}\r\n <div className=\"flex flex-col items-center\">\r\n <span\r\n className={cn(\r\n 'text-[11px] font-medium uppercase tracking-wide',\r\n today ? 'text-primary' : 'text-muted-foreground',\r\n )}\r\n >\r\n {headerDay}\r\n </span>\r\n <span\r\n className={cn(\r\n 'flex items-center justify-center rounded-full mt-0.5',\r\n 'size-12 text-3xl font-normal',\r\n today ? 'bg-primary text-primary-foreground' : 'text-foreground',\r\n )}\r\n >\r\n {headerDate}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n {/* Multi-day events banner */}\r\n {multiDay.length > 0 && (\r\n <MultiDayBanner\r\n events={multiDay}\r\n date={date}\r\n onEventClick={handleMultiDayEventClick}\r\n />\r\n )}\r\n\r\n {/* Time grid */}\r\n <div ref={scrollContainerRef} className=\"flex-1 overflow-auto\">\r\n <div className=\"relative min-h-full\">\r\n {/* Hour rows */}\r\n {hours.map((hour, index) => {\r\n const isWorking = isWorkingHour(date, hour, workingHours);\r\n const isDisabled = !isWorking;\r\n\r\n return (\r\n <div\r\n key={hour}\r\n className={cn('relative flex', isDisabled && 'bg-calendar-disabled-hour')}\r\n style={{ height: HOUR_HEIGHT }}\r\n >\r\n {/* Hour label */}\r\n <div\r\n className=\"relative flex-shrink-0 border-r border-border/50 bg-zinc-50 dark:bg-zinc-900\"\r\n style={{ width: HOUR_COLUMN_WIDTH }}\r\n >\r\n <div className=\"absolute -top-2.5 right-1 sm:right-2 flex h-5 items-center\">\r\n {index !== 0 && (\r\n <span className=\"text-[10px] sm:text-xs text-muted-foreground\">\r\n {formatHourLabel(hour)}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Time slot area */}\r\n <div className=\"relative flex-1\">\r\n {/* Today highlight */}\r\n {showCurrentTime && !isDisabled && (\r\n <div className=\"absolute inset-0 bg-primary/5\" />\r\n )}\r\n\r\n {/* Top border (except first row) */}\r\n {index !== 0 && (\r\n <div className=\"pointer-events-none absolute inset-x-0 top-0 border-b border-border/50\" />\r\n )}\r\n\r\n {/* Dashed lines for sub-hour divisions */}\r\n {slotMinutes.slice(1).map((minute) => (\r\n <div\r\n key={minute}\r\n className=\"pointer-events-none absolute inset-x-0 border-b border-dashed border-border/30\"\r\n style={{ top: `${(minute / 60) * 100}%` }}\r\n />\r\n ))}\r\n\r\n {/* Dynamic time slots based on slotDuration */}\r\n {slotMinutes.map((minute, slotIndex) => {\r\n const slot: ITimeSlot = { date, hour, minute };\r\n\r\n return (\r\n <TimeSlot\r\n key={minute}\r\n slot={slot}\r\n onSelectionStart={handleSelectionStart}\r\n onSelectionMove={handleSelectionMove}\r\n onSelectionEnd={handleSelectionEnd}\r\n isSelected={slotSelection?.isSlotSelected(slot) ?? false}\r\n isSelecting={slotSelection?.isSelecting ?? false}\r\n disabled={isDisabled}\r\n className=\"absolute inset-x-0\"\r\n style={{\r\n top: `${slotIndex * slotHeightPercent}%`,\r\n height: `${slotHeightPercent}%`,\r\n }}\r\n ariaLabel={`Add event at ${formatHourLabel(hour)}:${String(minute).padStart(2, '0')}`}\r\n />\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n\r\n {/* Events layer - positioned within the content area */}\r\n <div\r\n className=\"absolute top-0 bottom-0 right-0 pointer-events-none\"\r\n style={{ left: HOUR_COLUMN_WIDTH }}\r\n >\r\n {singleDay.map((event) => {\r\n const position = eventPositions.get(event.id);\r\n if (!position) return null;\r\n\r\n // Calculate minimum width - ensure events are readable\r\n const calculatedWidth = `calc(${position.width}% - 2px)`;\r\n const minWidthStyle = `max(${MIN_EVENT_CARD_WIDTH}px, ${calculatedWidth})`;\r\n\r\n if (renderEvent) {\r\n return (\r\n <div\r\n key={event.id}\r\n className=\"absolute pointer-events-auto p-0.5\"\r\n style={{\r\n top: `${position.top}px`,\r\n left: `${position.left}%`,\r\n width: minWidthStyle,\r\n minWidth: `${MIN_EVENT_CARD_WIDTH}px`,\r\n }}\r\n >\r\n {renderEvent({ event: event as CalendarEvent<TData>, position })}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <EventBlock\r\n key={event.id}\r\n event={event as CalendarEvent<TData>}\r\n position={{\r\n top: position.top,\r\n left: position.left,\r\n width: position.width,\r\n minWidth: MIN_EVENT_CARD_WIDTH,\r\n }}\r\n hourHeight={HOUR_HEIGHT}\r\n badgeVariant={badgeVariant}\r\n onClick={onEventClick}\r\n disablePopover={!!onEventClick && !renderPopover}\r\n renderPopover={renderPopover}\r\n className=\"pointer-events-auto\"\r\n />\r\n );\r\n })}\r\n </div>\r\n\r\n {/* Current time indicator */}\r\n {showCurrentTime && currentTimeTop >= 0 && (\r\n <div\r\n className=\"absolute left-0 right-0 z-20 flex items-center pointer-events-none\"\r\n style={{\r\n top: currentTimeTop,\r\n left: HOUR_COLUMN_WIDTH,\r\n }}\r\n >\r\n <div className=\"h-2.5 w-2.5 -ml-1 rounded-full bg-red-500\" />\r\n <div className=\"flex-1 h-0.5 bg-red-500\" />\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default DayView;\r\n","/**\r\n * Week View Component\r\n *\r\n * 7-day grid showing a full week with time slots.\r\n * Features:\r\n * - Day columns with hour rows\r\n * - Multi-day event spanning\r\n * - Current time indicator\r\n * - Working hours highlighting\r\n * - Drag to select time range\r\n *\r\n * Ported from agenda-v2 to maintain exact styling parity.\r\n */\r\n\r\nimport { cn } from '../../lib/utils';\r\nimport { useCallback, useLayoutEffect, useMemo, useRef } from 'react';\r\nimport type {\r\n CalendarEvent,\r\n ITimeSlot,\r\n IVisibleHours,\r\n TBadgeVariant,\r\n TOnEventClick,\r\n TOnSlotSelect,\r\n} from '../../core/types';\r\nimport {\r\n isToday,\r\n getVisibleHoursArray,\r\n getWeekDays,\r\n formatHourLabel,\r\n separateEventsByDuration,\r\n startOfWeek,\r\n isWorkingHour,\r\n type TWorkingHours,\r\n} from '../../core/utils/date-utils';\r\nimport { getEventsForDay } from '../../core/utils/event-utils';\r\nimport { calculateOverlappingPositions } from '../../core/utils/position-utils';\r\nimport { EventBlock } from '../event/event-card';\r\nimport { MultiDayBanner } from '../primitives/multi-day-banner';\r\nimport { TimeSlot } from '../primitives/selectable-slot';\r\nimport { useOptionalSlotSelection } from '../../core/context/slot-selection-context';\r\n\r\n// ============================================================================\r\n// CONSTANTS (matches agenda-v2)\r\n// ============================================================================\r\n\r\nconst HOUR_HEIGHT = 96; // pixels per hour (same as demo-scheduler)\r\nconst HOUR_COLUMN_WIDTH = 56; // narrower for Google Calendar style\r\nconst DAY_HEADER_HEIGHT = 72; // taller for stacked day/date layout\r\nconst MIN_DAY_COLUMN_WIDTH = 120; // minimum width per day column\r\nconst MIN_EVENT_CARD_WIDTH = 100; // minimum width in pixels for event cards to be readable\r\nconst MAX_EVENTS_BEFORE_EXPAND = 3; // max overlapping events before column expands\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface WeekViewProps<TData = Record<string, unknown>> {\r\n /** Events to display */\r\n events: CalendarEvent<TData>[];\r\n /** The date (any day in the week to show) */\r\n date: Date;\r\n /** First day of week (0 = Sunday, 1 = Monday) */\r\n weekStartsOn?: 0 | 1;\r\n /** Visible hours range */\r\n visibleHours?: IVisibleHours;\r\n /** Working hours per day */\r\n workingHours?: TWorkingHours;\r\n /** Slot duration in minutes */\r\n slotDuration?: number;\r\n /** Badge variant for events */\r\n badgeVariant?: TBadgeVariant;\r\n /** Event click handler */\r\n onEventClick?: TOnEventClick<TData>;\r\n /** Slot select handler */\r\n onSlotSelect?: TOnSlotSelect;\r\n /** Day click handler */\r\n onDayClick?: (date: Date) => void;\r\n /** Additional CSS classes */\r\n className?: string;\r\n /** Custom event renderer */\r\n renderEvent?: (props: {\r\n event: CalendarEvent<TData>;\r\n position: { top: number; height: number; left: number; width: number };\r\n }) => React.ReactNode;\r\n /** Custom popover content renderer */\r\n renderPopover?: (props: {\r\n event: CalendarEvent<TData>;\r\n onClose: () => void;\r\n }) => React.ReactNode;\r\n}\r\n\r\n// ============================================================================\r\n// COMPONENT\r\n// ============================================================================\r\n\r\nexport function WeekView<TData = Record<string, unknown>>({\r\n events,\r\n date,\r\n weekStartsOn = 1,\r\n visibleHours = { startHour: 0, endHour: 24 },\r\n workingHours,\r\n slotDuration = 30,\r\n badgeVariant = 'colored',\r\n onEventClick,\r\n onSlotSelect: _onSlotSelect,\r\n onDayClick,\r\n className,\r\n renderEvent,\r\n renderPopover,\r\n}: WeekViewProps<TData>) {\r\n // Calculate slot configuration based on slotDuration\r\n const slotsPerHour = 60 / slotDuration;\r\n const slotHeightPercent = 100 / slotsPerHour;\r\n\r\n // Generate slot minutes for each hour\r\n const slotMinutes = useMemo(() => {\r\n const minutes: number[] = [];\r\n for (let i = 0; i < slotsPerHour; i++) {\r\n minutes.push(i * slotDuration);\r\n }\r\n return minutes;\r\n }, [slotsPerHour, slotDuration]);\r\n\r\n // Week days\r\n const weekDays = useMemo(() => getWeekDays(date, weekStartsOn), [date, weekStartsOn]);\r\n\r\n // Hours array\r\n const hours = useMemo(() => getVisibleHoursArray(visibleHours), [visibleHours]);\r\n\r\n // Events per day\r\n const eventsPerDay = useMemo(() => {\r\n const map = new Map<\r\n string,\r\n {\r\n singleDay: CalendarEvent<TData>[];\r\n multiDay: CalendarEvent<TData>[];\r\n positions: Map<string, { top: number; height: number; left: number; width: number }>;\r\n maxOverlapping: number; // Track max overlapping events for dynamic width\r\n }\r\n >();\r\n\r\n for (const day of weekDays) {\r\n const dayKey = day.toDateString();\r\n const dayEvents = getEventsForDay(events, day);\r\n const { singleDay, multiDay } = separateEventsByDuration(dayEvents);\r\n const positionsArray = calculateOverlappingPositions(singleDay, day, visibleHours, HOUR_HEIGHT);\r\n\r\n // Convert array to Map for fast lookup and find max overlapping\r\n const positions = new Map<string, { top: number; height: number; left: number; width: number }>();\r\n let maxOverlapping = 1;\r\n\r\n for (const positioned of positionsArray) {\r\n positions.set(positioned.event.id, positioned.position);\r\n // Calculate number of overlapping events based on width percentage\r\n // width of 100% = 1 event, 50% = 2 events, 33% = 3 events, etc.\r\n if (positioned.position.width > 0) {\r\n const overlapping = Math.round(100 / positioned.position.width);\r\n maxOverlapping = Math.max(maxOverlapping, overlapping);\r\n }\r\n }\r\n\r\n map.set(dayKey, {\r\n singleDay: singleDay as CalendarEvent<TData>[],\r\n multiDay: multiDay as CalendarEvent<TData>[],\r\n positions,\r\n maxOverlapping,\r\n });\r\n }\r\n\r\n return map;\r\n }, [weekDays, events, visibleHours]);\r\n\r\n // All multi-day events for the week (shown in banner)\r\n const weekMultiDayEvents = useMemo(() => {\r\n const unique = new Map<string, CalendarEvent<TData>>();\r\n for (const { multiDay } of eventsPerDay.values()) {\r\n for (const event of multiDay) {\r\n unique.set(event.id, event);\r\n }\r\n }\r\n return Array.from(unique.values());\r\n }, [eventsPerDay]);\r\n\r\n // Current time position\r\n const now = new Date();\r\n const todayIndex = weekDays.findIndex((d) => isToday(d));\r\n const currentTimeTop = useMemo(() => {\r\n if (todayIndex < 0) return -1;\r\n const currentHour = now.getHours() + now.getMinutes() / 60;\r\n if (currentHour < visibleHours.startHour || currentHour > visibleHours.endHour) {\r\n return -1;\r\n }\r\n return (currentHour - visibleHours.startHour) * HOUR_HEIGHT;\r\n }, [todayIndex, visibleHours, now]);\r\n\r\n // Ref for scrollable container - used to auto-scroll to working hours\r\n const scrollContainerRef = useRef<HTMLDivElement>(null);\r\n\r\n // Auto-scroll to working hours on mount and when week changes\r\n useLayoutEffect(() => {\r\n const container = scrollContainerRef.current;\r\n if (!container) return;\r\n\r\n // Use requestAnimationFrame to ensure DOM is fully rendered\r\n const scrollToWorkingHours = () => {\r\n // For week view, use today's working hours or first enabled weekday's working hours\r\n const today = new Date();\r\n const dayOfWeek = today.getDay();\r\n\r\n // Try to get working hours for today (must be enabled), fallback to Monday (1)\r\n let targetWorkingHours = workingHours?.[dayOfWeek];\r\n if (!targetWorkingHours?.enabled || targetWorkingHours.from === 0) {\r\n // Fallback to Monday's working hours if enabled\r\n const mondayHours = workingHours?.[1];\r\n if (mondayHours?.enabled) {\r\n targetWorkingHours = mondayHours;\r\n }\r\n }\r\n\r\n // Calculate scroll position - aim for 1 hour before working hours start\r\n let scrollToHour: number;\r\n\r\n // Check if we have enabled working hours\r\n if (targetWorkingHours?.enabled && targetWorkingHours.from > 0) {\r\n scrollToHour = Math.max(targetWorkingHours.from - 1, visibleHours.startHour);\r\n } else {\r\n // Default to 7 AM if no working hours defined or disabled\r\n scrollToHour = Math.max(7, visibleHours.startHour);\r\n }\r\n\r\n // Calculate pixel position\r\n const scrollTop = (scrollToHour - visibleHours.startHour) * HOUR_HEIGHT;\r\n\r\n // Scroll to position (instant on initial load for better UX)\r\n container.scrollTo({\r\n top: scrollTop,\r\n behavior: 'instant',\r\n });\r\n };\r\n\r\n // Use double requestAnimationFrame to ensure layout is complete\r\n requestAnimationFrame(() => {\r\n requestAnimationFrame(scrollToWorkingHours);\r\n });\r\n }, [date, workingHours, visibleHours]);\r\n\r\n // Get slot selection context (optional - works without provider)\r\n const slotSelection = useOptionalSlotSelection();\r\n\r\n // Create selection handlers for time slots (matches agenda-v2)\r\n const handleSelectionStart = useCallback(\r\n (slot: ITimeSlot) => {\r\n slotSelection?.startSelection(slot);\r\n },\r\n [slotSelection],\r\n );\r\n\r\n const handleSelectionMove = useCallback(\r\n (slot: ITimeSlot) => {\r\n slotSelection?.updateSelection(slot);\r\n },\r\n [slotSelection],\r\n );\r\n\r\n const handleSelectionEnd = useCallback(() => {\r\n slotSelection?.endSelection();\r\n }, [slotSelection]);\r\n\r\n // Handle multi-day event click\r\n const handleMultiDayEventClick = useCallback(\r\n (event: CalendarEvent<TData>) => {\r\n onEventClick?.(event);\r\n },\r\n [onEventClick],\r\n );\r\n\r\n // Calculate min width for the grid to allow horizontal scrolling\r\n const gridMinWidth = HOUR_COLUMN_WIDTH + 7 * MIN_DAY_COLUMN_WIDTH;\r\n\r\n // Calculate dynamic column widths based on max overlapping events per day\r\n const dayColumnWidths = useMemo(() => {\r\n const widths: number[] = [];\r\n for (const day of weekDays) {\r\n const dayKey = day.toDateString();\r\n const dayData = eventsPerDay.get(dayKey);\r\n const maxOverlapping = dayData?.maxOverlapping ?? 1;\r\n\r\n // If more than MAX_EVENTS_BEFORE_EXPAND events overlap, expand the column\r\n // Each event needs at least MIN_EVENT_CARD_WIDTH pixels\r\n if (maxOverlapping > MAX_EVENTS_BEFORE_EXPAND) {\r\n widths.push(Math.max(MIN_DAY_COLUMN_WIDTH, maxOverlapping * MIN_EVENT_CARD_WIDTH));\r\n } else {\r\n widths.push(MIN_DAY_COLUMN_WIDTH);\r\n }\r\n }\r\n return widths;\r\n }, [weekDays, eventsPerDay]);\r\n\r\n // Calculate actual grid width based on dynamic column widths\r\n const actualGridWidth = HOUR_COLUMN_WIDTH + dayColumnWidths.reduce((sum, w) => sum + w, 0);\r\n\r\n return (\r\n <div className={cn('ic-week-view flex flex-col h-full', className)}>\r\n {/* Multi-day events banner */}\r\n {weekMultiDayEvents.length > 0 && (\r\n <MultiDayBanner\r\n events={weekMultiDayEvents}\r\n date={startOfWeek(date, weekStartsOn)}\r\n onEventClick={handleMultiDayEventClick}\r\n />\r\n )}\r\n\r\n {/* Scrollable container for header + grid - overflow-auto is REQUIRED for scroll-to-working-hours */}\r\n <div ref={scrollContainerRef} className=\"ic-week-scroll-container flex-1\">\r\n {/* Single container for both header and grid - ensures columns align */}\r\n <div style={{ minWidth: Math.max(gridMinWidth, actualGridWidth) }}>\r\n {/* Week header - sticky at top, uses flex to match grid columns */}\r\n <div className=\"ic-week-header sticky top-0 z-20 border-b bg-background\">\r\n <div className=\"flex\">\r\n {/* Empty corner for hour column with timezone - matches hour column width */}\r\n <div\r\n className=\"flex-shrink-0 flex items-end justify-center pb-2 text-[10px] text-muted-foreground/70\"\r\n style={{ width: HOUR_COLUMN_WIDTH, height: DAY_HEADER_HEIGHT }}\r\n >\r\n <span className=\"hidden sm:inline\">\r\n GMT\r\n {(() => {\r\n const offset = new Date().getTimezoneOffset();\r\n const hrs = Math.abs(Math.floor(offset / 60));\r\n const sign = offset <= 0 ? '+' : '-';\r\n return hrs > 0 ? `${sign}${String(hrs).padStart(2, '0')}` : '';\r\n })()}\r\n </span>\r\n </div>\r\n\r\n {/* Day headers - must match grid column widths exactly */}\r\n {weekDays.map((day, dayIndex) => {\r\n const today = isToday(day);\r\n const columnWidth = dayColumnWidths[dayIndex] ?? MIN_DAY_COLUMN_WIDTH;\r\n // Only use fixed width if column needs expansion for many events\r\n const needsExpansion = columnWidth > MIN_DAY_COLUMN_WIDTH;\r\n\r\n return (\r\n <div\r\n key={day.toDateString()}\r\n className=\"flex-1 flex flex-col items-center justify-center border-r last:border-r-0 py-2\"\r\n style={{\r\n height: DAY_HEADER_HEIGHT,\r\n minWidth: needsExpansion ? columnWidth : MIN_DAY_COLUMN_WIDTH,\r\n }}\r\n >\r\n {/* Day name - small uppercase */}\r\n <span\r\n className={cn(\r\n 'text-[11px] font-medium uppercase tracking-wide',\r\n today ? 'text-primary' : 'text-muted-foreground',\r\n )}\r\n >\r\n {day.toLocaleDateString([], { weekday: 'short' })}\r\n </span>\r\n {/* Date number - large, circled if today */}\r\n <button\r\n type=\"button\"\r\n onClick={() => onDayClick?.(day)}\r\n className={cn(\r\n 'flex items-center justify-center rounded-full transition-colors mt-0.5',\r\n 'size-10 text-2xl font-normal',\r\n today\r\n ? 'bg-primary text-primary-foreground'\r\n : 'text-foreground hover:bg-muted',\r\n )}\r\n >\r\n {day.getDate()}\r\n </button>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n\r\n {/* Time grid - within same width container as header */}\r\n <div className=\"relative flex\">\r\n {/* Hour labels column - sticky left to stay visible when scrolling horizontally */}\r\n <div\r\n className=\"ic-hour-column sticky left-0 z-10 bg-zinc-50 dark:bg-zinc-900 border-r\"\r\n style={{ width: HOUR_COLUMN_WIDTH }}\r\n >\r\n {hours.map((hour, index) => (\r\n <div key={hour} className=\"relative\" style={{ height: HOUR_HEIGHT }}>\r\n <div className=\"absolute -top-2.5 right-1 sm:right-2 flex h-5 items-center\">\r\n {index !== 0 && (\r\n <span className=\"text-[10px] sm:text-xs text-muted-foreground\">\r\n {formatHourLabel(hour)}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n\r\n {/* Week grid - day columns */}\r\n <div className=\"ic-week-grid relative flex-1\">\r\n <div className=\"flex divide-x\">\r\n {weekDays.map((day, dayIndex) => {\r\n const dayKey = day.toDateString();\r\n const dayData = eventsPerDay.get(dayKey);\r\n const columnWidth = dayColumnWidths[dayIndex] ?? MIN_DAY_COLUMN_WIDTH;\r\n // Only use fixed width if column needs expansion for many events\r\n const needsExpansion = columnWidth > MIN_DAY_COLUMN_WIDTH;\r\n\r\n return (\r\n <div\r\n key={day.toDateString()}\r\n className=\"ic-day-column relative flex-1\"\r\n style={{\r\n minWidth: needsExpansion ? columnWidth : MIN_DAY_COLUMN_WIDTH,\r\n }}\r\n >\r\n {/* Hour slots */}\r\n {hours.map((hour, index) => {\r\n const isWorking = isWorkingHour(day, hour, workingHours);\r\n const isDisabled = !isWorking;\r\n\r\n return (\r\n <div\r\n key={hour}\r\n className={cn(\r\n 'relative',\r\n isDisabled && 'bg-calendar-disabled-hour',\r\n isToday(day) && !isDisabled && 'bg-primary/5',\r\n )}\r\n style={{ height: HOUR_HEIGHT }}\r\n >\r\n {/* Top border (except first row) */}\r\n {index !== 0 && (\r\n <div className=\"pointer-events-none absolute inset-x-0 top-0 border-b border-border/50\" />\r\n )}\r\n\r\n {/* Dashed lines for sub-hour divisions */}\r\n {slotMinutes.slice(1).map((minute) => (\r\n <div\r\n key={minute}\r\n className=\"pointer-events-none absolute inset-x-0 border-b border-dashed border-border/30\"\r\n style={{ top: `${(minute / 60) * 100}%` }}\r\n />\r\n ))}\r\n\r\n {/* Dynamic time slots based on slotDuration */}\r\n {slotMinutes.map((minute, slotIndex) => {\r\n const slot: ITimeSlot = { date: day, hour, minute };\r\n\r\n return (\r\n <TimeSlot\r\n key={minute}\r\n slot={slot}\r\n onSelectionStart={handleSelectionStart}\r\n onSelectionMove={handleSelectionMove}\r\n onSelectionEnd={handleSelectionEnd}\r\n isSelected={slotSelection?.isSlotSelected(slot) ?? false}\r\n isSelecting={slotSelection?.isSelecting ?? false}\r\n disabled={isDisabled}\r\n className=\"absolute inset-x-0\"\r\n style={{\r\n top: `${slotIndex * slotHeightPercent}%`,\r\n height: `${slotHeightPercent}%`,\r\n }}\r\n ariaLabel={`Add event on ${day.toLocaleDateString()} at ${formatHourLabel(hour)}:${String(minute).padStart(2, '0')}`}\r\n />\r\n );\r\n })}\r\n </div>\r\n );\r\n })}\r\n\r\n {/* Events for this day - positioned within the day column */}\r\n {dayData?.singleDay.map((event) => {\r\n const position = dayData.positions.get(event.id);\r\n if (!position) return null;\r\n\r\n // Calculate minimum width - ensure events are readable\r\n const calculatedWidth = `calc(${position.width}% - 2px)`;\r\n const minWidthStyle = `max(${MIN_EVENT_CARD_WIDTH}px, ${calculatedWidth})`;\r\n\r\n if (renderEvent) {\r\n return (\r\n <div\r\n key={event.id}\r\n className=\"absolute pointer-events-auto p-0.5\"\r\n style={{\r\n top: `${position.top}px`,\r\n left: `${position.left}%`,\r\n width: minWidthStyle,\r\n minWidth: `${MIN_EVENT_CARD_WIDTH}px`,\r\n }}\r\n >\r\n {renderEvent({ event, position })}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <EventBlock\r\n key={event.id}\r\n event={event}\r\n position={{\r\n top: position.top,\r\n left: position.left,\r\n width: position.width,\r\n minWidth: MIN_EVENT_CARD_WIDTH,\r\n }}\r\n hourHeight={HOUR_HEIGHT}\r\n badgeVariant={badgeVariant}\r\n onClick={onEventClick}\r\n disablePopover={!!onEventClick && !renderPopover}\r\n renderPopover={renderPopover}\r\n className=\"pointer-events-auto\"\r\n />\r\n );\r\n })}\r\n\r\n {/* Current time indicator for this day */}\r\n {dayIndex === todayIndex && currentTimeTop >= 0 && (\r\n <div\r\n className=\"absolute left-0 right-0 z-20 flex items-center pointer-events-none\"\r\n style={{ top: currentTimeTop }}\r\n >\r\n <div className=\"h-2 w-2 -ml-1 rounded-full bg-red-500\" />\r\n <div className=\"flex-1 h-0.5 bg-red-500\" />\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n </div>\r\n {/* End of width container that wraps header + grid */}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default WeekView;\r\n","/**\r\n * Month View Component\r\n *\r\n * Traditional calendar month grid with event indicators.\r\n * Features:\r\n * - 6-week grid with days from adjacent months\r\n * - Event dots/compact cards\r\n * - Today highlighting\r\n * - Click to view day / add event\r\n * - Drag to select date range\r\n * - Optional popover for \"+N more\" events (instead of redirecting to day view)\r\n *\r\n * Ported from agenda-v2 to maintain exact styling parity.\r\n */\r\n\r\nimport { cn } from '../../lib/utils';\r\nimport { useCallback, useMemo, useState } from 'react';\r\nimport type {\r\n CalendarEvent,\r\n ITimeSlot,\r\n TBadgeVariant,\r\n TOnEventClick,\r\n TOnSlotSelect,\r\n} from '../../core/types';\r\nimport { generateMonthGrid, isToday } from '../../core/utils/date-utils';\r\nimport { getEventsForDay } from '../../core/utils/event-utils';\r\nimport { useOptionalSlotSelection } from '../../core/context/slot-selection-context';\r\nimport { EventCard } from '../event/event-card';\r\nimport { DaySlot } from '../primitives/selectable-slot';\r\nimport { Popover, PopoverContent, PopoverTrigger } from '../ui/popover';\r\n\r\n// ============================================================================\r\n// CONSTANTS (matches agenda-v2)\r\n// ============================================================================\r\n\r\nconst WEEKDAY_LABELS_MONDAY_START = [\r\n { full: 'Monday', short: 'Mon', tiny: 'M' },\r\n { full: 'Tuesday', short: 'Tue', tiny: 'T' },\r\n { full: 'Wednesday', short: 'Wed', tiny: 'W' },\r\n { full: 'Thursday', short: 'Thu', tiny: 'T' },\r\n { full: 'Friday', short: 'Fri', tiny: 'F' },\r\n { full: 'Saturday', short: 'Sat', tiny: 'S' },\r\n { full: 'Sunday', short: 'Sun', tiny: 'S' },\r\n];\r\nconst WEEKDAY_LABELS_SUNDAY_START = [\r\n { full: 'Sunday', short: 'Sun', tiny: 'S' },\r\n { full: 'Monday', short: 'Mon', tiny: 'M' },\r\n { full: 'Tuesday', short: 'Tue', tiny: 'T' },\r\n { full: 'Wednesday', short: 'Wed', tiny: 'W' },\r\n { full: 'Thursday', short: 'Thu', tiny: 'T' },\r\n { full: 'Friday', short: 'Fri', tiny: 'F' },\r\n { full: 'Saturday', short: 'Sat', tiny: 'S' },\r\n];\r\nconst MAX_EVENTS_SHOWN = 3;\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface MonthViewProps<TData = Record<string, unknown>> {\r\n /** Events to display */\r\n events: CalendarEvent<TData>[];\r\n /** The date (any day in the month to show) */\r\n date: Date;\r\n /** First day of week (0 = Sunday, 1 = Monday) */\r\n weekStartsOn?: 0 | 1;\r\n /** Badge variant for events */\r\n badgeVariant?: TBadgeVariant;\r\n /** Event click handler */\r\n onEventClick?: TOnEventClick<TData>;\r\n /** Slot select handler */\r\n onSlotSelect?: TOnSlotSelect;\r\n /** Day click handler */\r\n onDayClick?: (date: Date) => void;\r\n /** Additional CSS classes */\r\n className?: string;\r\n /** Custom event renderer */\r\n renderEvent?: (props: {\r\n event: CalendarEvent<TData>;\r\n variant: 'compact';\r\n }) => React.ReactNode;\r\n /** Custom popover content renderer */\r\n renderPopover?: (props: {\r\n event: CalendarEvent<TData>;\r\n onClose: () => void;\r\n }) => React.ReactNode;\r\n /**\r\n * Show remaining events in a popover instead of redirecting to day view\r\n * When enabled, clicking \"+N more\" opens a popover with all day events\r\n * @default false\r\n */\r\n showMoreEventsInPopover?: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// COMPONENT\r\n// ============================================================================\r\n\r\nexport function MonthView<TData = Record<string, unknown>>({\r\n events,\r\n date,\r\n weekStartsOn = 1,\r\n badgeVariant = 'colored',\r\n onEventClick,\r\n onSlotSelect: _onSlotSelect,\r\n onDayClick,\r\n className,\r\n renderEvent,\r\n renderPopover,\r\n showMoreEventsInPopover = false,\r\n}: MonthViewProps<TData>) {\r\n // Track which day's popover is open (by date string key)\r\n const [openPopoverDay, setOpenPopoverDay] = useState<string | null>(null);\r\n\r\n // Generate month grid cells\r\n const cells = useMemo(() => generateMonthGrid(date, weekStartsOn), [date, weekStartsOn]);\r\n\r\n // Events by date for quick lookup\r\n const eventsByDate = useMemo(() => {\r\n const map = new Map<string, CalendarEvent<TData>[]>();\r\n for (const cell of cells) {\r\n const dayKey = cell.date.toDateString();\r\n const dayEvents = getEventsForDay(events, cell.date) as CalendarEvent<TData>[];\r\n // Sort by start time\r\n dayEvents.sort((a, b) => a.startDate.getTime() - b.startDate.getTime());\r\n map.set(dayKey, dayEvents);\r\n }\r\n return map;\r\n }, [cells, events]);\r\n\r\n // Get slot selection context (optional - works without provider)\r\n const slotSelection = useOptionalSlotSelection();\r\n\r\n // Create selection handlers for day slots\r\n const handleSelectionStart = useCallback(\r\n (slot: ITimeSlot) => {\r\n slotSelection?.startSelection(slot);\r\n },\r\n [slotSelection],\r\n );\r\n\r\n const handleSelectionMove = useCallback(\r\n (slot: ITimeSlot) => {\r\n slotSelection?.updateSelection(slot);\r\n },\r\n [slotSelection],\r\n );\r\n\r\n const handleSelectionEnd = useCallback(() => {\r\n slotSelection?.endSelection();\r\n }, [slotSelection]);\r\n\r\n // Handle day click (navigate to day view)\r\n const handleDayClick = useCallback(\r\n (cellDate: Date) => {\r\n onDayClick?.(cellDate);\r\n },\r\n [onDayClick],\r\n );\r\n\r\n // Get weekday labels based on weekStartsOn\r\n const weekdayLabels = weekStartsOn === 0 ? WEEKDAY_LABELS_SUNDAY_START : WEEKDAY_LABELS_MONDAY_START;\r\n\r\n return (\r\n <div className={cn('flex flex-col h-full overflow-hidden', className)}>\r\n {/* Scrollable container - horizontal on mobile, vertical overflow when needed */}\r\n <div className=\"flex flex-col flex-1 overflow-auto\">\r\n <div className=\"flex flex-col flex-1 min-w-[560px] sm:min-w-0\">\r\n {/* Weekday headers - Google Calendar style */}\r\n <div className=\"grid grid-cols-7 border-b !sticky !top-0 bg-background z-10\">\r\n {weekdayLabels.map((label, index) => (\r\n <div\r\n key={label.full}\r\n className={cn(\r\n 'py-2 sm:py-2.5 text-center text-[11px] uppercase font-medium tracking-wide text-muted-foreground',\r\n index >= 5 && 'text-muted-foreground/70', // Weekend\r\n )}\r\n >\r\n {/* Show short on mobile, full on desktop */}\r\n <span className=\"sm:hidden\">{label.short}</span>\r\n <span className=\"hidden sm:inline\">{label.short}</span>\r\n </div>\r\n ))}\r\n </div>\r\n\r\n {/* Calendar grid - each row sizes independently based on content */}\r\n <div className=\"grid grid-cols-7 auto-rows-min\">\r\n {cells.map((cell) => {\r\n const dayKey = cell.date.toDateString();\r\n const dayEvents = eventsByDate.get(dayKey) || [];\r\n const today = isToday(cell.date);\r\n const isWeekend = cell.date.getDay() === 0 || cell.date.getDay() === 6;\r\n const hasMoreEvents = dayEvents.length > MAX_EVENTS_SHOWN;\r\n\r\n return (\r\n <DaySlot\r\n key={dayKey}\r\n date={cell.date}\r\n onSelectionStart={handleSelectionStart}\r\n onSelectionMove={handleSelectionMove}\r\n onSelectionEnd={handleSelectionEnd}\r\n isSelected={slotSelection?.isSlotSelected({ date: cell.date }) ?? false}\r\n isSelecting={slotSelection?.isSelecting ?? false}\r\n className={cn(\r\n 'relative flex flex-col border-r border-b text-left min-h-[80px] sm:min-h-[100px] overflow-hidden',\r\n '[&:nth-child(7n)]:border-r-0',\r\n !cell.isCurrentMonth && 'bg-muted/20',\r\n isWeekend && cell.isCurrentMonth && 'bg-muted/10',\r\n )}\r\n ariaLabel={`${cell.date.toLocaleDateString()} - ${dayEvents.length} events. Click to create event, double-click to view day.`}\r\n >\r\n {/* Day number header - Google Calendar style */}\r\n <div\r\n className={cn(\r\n 'flex items-center justify-center p-1',\r\n !cell.isCurrentMonth && 'text-muted-foreground/40',\r\n )}\r\n >\r\n <button\r\n type=\"button\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n handleDayClick(cell.date);\r\n }}\r\n className={cn(\r\n 'flex items-center justify-center rounded-full transition-colors',\r\n 'size-7 text-sm font-normal',\r\n today\r\n ? 'bg-primary text-primary-foreground'\r\n : 'hover:bg-muted',\r\n )}\r\n >\r\n {cell.date.getDate()}\r\n </button>\r\n </div>\r\n\r\n {/* Events list */}\r\n <div className=\"flex-1 overflow-hidden px-2 pt-1 pb-1 space-y-1\">\r\n {dayEvents.slice(0, MAX_EVENTS_SHOWN).map((event) => (\r\n <div\r\n key={event.id}\r\n onPointerDown={(e) => {\r\n // Stop propagation to prevent slot selection when clicking event\r\n e.stopPropagation();\r\n }}\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={onEventClick}\r\n disablePopover={!!onEventClick && !renderPopover}\r\n renderPopover={renderPopover}\r\n showTime={false}\r\n enableDrag\r\n />\r\n )}\r\n </div>\r\n ))}\r\n\r\n {/* More events indicator - popover or redirect to day view */}\r\n {hasMoreEvents && (\r\n showMoreEventsInPopover ? (\r\n <Popover\r\n open={openPopoverDay === dayKey}\r\n onOpenChange={(open) => setOpenPopoverDay(open ? dayKey : null)}\r\n >\r\n <PopoverTrigger asChild>\r\n <button\r\n type=\"button\"\r\n onPointerDown={(e) => e.stopPropagation()}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n setOpenPopoverDay(dayKey);\r\n }}\r\n className=\"w-full text-left text-xs text-muted-foreground hover:text-foreground hover:underline px-1.5 cursor-pointer\"\r\n >\r\n +{dayEvents.length - MAX_EVENTS_SHOWN} more\r\n </button>\r\n </PopoverTrigger>\r\n <PopoverContent\r\n align=\"start\"\r\n side=\"right\"\r\n sideOffset={8}\r\n className=\"w-72 max-h-80 overflow-y-auto p-2\"\r\n onPointerDown={(e) => e.stopPropagation()}\r\n >\r\n {/* Day header */}\r\n <div className=\"flex items-center justify-between mb-2 pb-2 border-b\">\r\n <span className=\"text-sm font-medium\">\r\n {cell.date.toLocaleDateString(undefined, {\r\n weekday: 'short',\r\n month: 'short',\r\n day: 'numeric',\r\n })}\r\n </span>\r\n <span className=\"text-xs text-muted-foreground\">\r\n {dayEvents.length} events\r\n </span>\r\n </div>\r\n {/* All events for the day */}\r\n <div className=\"space-y-1.5\">\r\n {dayEvents.map((event) => (\r\n <div key={event.id}>\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 setOpenPopoverDay(null);\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 </div>\r\n </PopoverContent>\r\n </Popover>\r\n ) : (\r\n <div\r\n onPointerDown={(e) => {\r\n e.stopPropagation();\r\n handleDayClick(cell.date);\r\n }}\r\n className=\"w-full text-left text-xs text-muted-foreground hover:text-foreground hover:underline px-1.5 cursor-pointer\"\r\n >\r\n +{dayEvents.length - MAX_EVENTS_SHOWN} more\r\n </div>\r\n )\r\n )}\r\n </div>\r\n </DaySlot>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default MonthView;\r\n","/**\r\n * Agenda View Component\r\n *\r\n * List view of events grouped by date.\r\n * Features:\r\n * - Chronological event list\r\n * - Date grouping headers\r\n * - Full event details\r\n *\r\n * Ported from agenda-v2 to maintain exact styling parity.\r\n */\r\n\r\nimport { cn } from '../../lib/utils';\r\nimport { useMemo } from 'react';\r\nimport type {\r\n CalendarEvent,\r\n TBadgeVariant,\r\n TOnEventClick,\r\n} from '../../core/types';\r\nimport { isToday } from '../../core/utils/date-utils';\r\nimport { groupEventsByDate } from '../../core/utils/event-utils';\r\nimport { EventCard } from '../event/event-card';\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface AgendaViewProps<TData = Record<string, unknown>> {\r\n /** Events to display */\r\n events: CalendarEvent<TData>[];\r\n /** The selected date (agenda starts from this date) */\r\n date: Date;\r\n /** Number of days to show (default: 60) */\r\n daysAhead?: number;\r\n /** Badge variant for events */\r\n badgeVariant?: TBadgeVariant;\r\n /** Event click handler */\r\n onEventClick?: TOnEventClick<TData>;\r\n /** Additional CSS classes */\r\n className?: string;\r\n /** Custom event renderer */\r\n renderEvent?: (props: {\r\n event: CalendarEvent<TData>;\r\n variant: 'full';\r\n }) => React.ReactNode;\r\n /** Custom popover content renderer */\r\n renderPopover?: (props: {\r\n event: CalendarEvent<TData>;\r\n onClose: () => void;\r\n }) => React.ReactNode;\r\n}\r\n\r\n// ============================================================================\r\n// COMPONENT\r\n// ============================================================================\r\n\r\nexport function AgendaView<TData = Record<string, unknown>>({\r\n events,\r\n date,\r\n daysAhead = 60,\r\n badgeVariant = 'colored',\r\n onEventClick,\r\n className,\r\n renderEvent,\r\n renderPopover,\r\n}: AgendaViewProps<TData>) {\r\n // Filter events starting from selected date for the next N days\r\n const upcomingEvents = useMemo(() => {\r\n // Use selected date as base if provided, otherwise today\r\n const baseDate = new Date(date);\r\n baseDate.setHours(0, 0, 0, 0);\r\n const endDate = new Date(baseDate);\r\n endDate.setDate(endDate.getDate() + daysAhead);\r\n\r\n return events.filter((event) => {\r\n // Include events that end after base date and start before the end date\r\n return event.endDate >= baseDate && event.startDate <= endDate;\r\n });\r\n }, [events, daysAhead, date]);\r\n\r\n // Group by date\r\n const groupedEvents = useMemo(() => {\r\n const map = groupEventsByDate(upcomingEvents);\r\n const result: { date: Date; dateKey: string; events: CalendarEvent<TData>[] }[] = [];\r\n for (const [dateKey, eventList] of map) {\r\n result.push({\r\n date: new Date(dateKey),\r\n dateKey,\r\n events: eventList as CalendarEvent<TData>[],\r\n });\r\n }\r\n // Sort by date\r\n result.sort((a, b) => a.date.getTime() - b.date.getTime());\r\n return result;\r\n }, [upcomingEvents]);\r\n\r\n // Empty state\r\n if (groupedEvents.length === 0) {\r\n return (\r\n <div\r\n className={cn(\r\n 'flex flex-col items-center justify-center h-full py-12',\r\n className,\r\n )}\r\n >\r\n <div className=\"text-center\">\r\n <p className=\"text-muted-foreground\">No events found</p>\r\n <p className=\"text-sm text-muted-foreground/70\">\r\n No events scheduled for this period\r\n </p>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className={cn('flex flex-col h-full overflow-auto', className)}>\r\n {/* Header - Clean schedule header */}\r\n <div className=\"sticky top-0 z-10 bg-background border-b px-4 py-3\">\r\n <div className=\"flex items-center justify-between\">\r\n <h2 className=\"text-lg font-medium\">Schedule</h2>\r\n <span className=\"text-sm text-muted-foreground\">\r\n {upcomingEvents.length} event\r\n {upcomingEvents.length !== 1 ? 's' : ''}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n {/* Event groups */}\r\n <div className=\"flex-1\">\r\n {groupedEvents.map(({ date: groupDate, dateKey, events: groupEvents }) => {\r\n const today = isToday(groupDate);\r\n const dayName = groupDate.toLocaleDateString([], { weekday: 'short' });\r\n const dayNumber = groupDate.getDate();\r\n const monthName = groupDate.toLocaleDateString([], { month: 'short' });\r\n\r\n return (\r\n <div key={dateKey} className=\"\">\r\n {/* Date header - Google Calendar style */}\r\n <div\r\n className={cn(\r\n 'sticky top-[52px] z-10 bg-background px-4 py-3 border-b',\r\n )}\r\n >\r\n <div className=\"flex items-center gap-3\">\r\n {/* Day column with stacked name + circled date */}\r\n <div className=\"flex flex-col items-center min-w-[40px]\">\r\n <span\r\n className={cn(\r\n 'text-[11px] font-medium uppercase tracking-wide',\r\n today ? 'text-primary' : 'text-muted-foreground',\r\n )}\r\n >\r\n {dayName}\r\n </span>\r\n <span\r\n className={cn(\r\n 'flex items-center justify-center rounded-full mt-0.5',\r\n 'size-10 text-xl font-normal',\r\n today\r\n ? 'bg-primary text-primary-foreground'\r\n : 'text-foreground',\r\n )}\r\n >\r\n {dayNumber}\r\n </span>\r\n </div>\r\n {/* Month indicator for first day or month change */}\r\n <span className=\"text-sm text-muted-foreground\">\r\n {monthName} {groupDate.getFullYear()}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n {/* Events for this date */}\r\n <div className=\"px-4 py-3 space-y-2 border-b last:border-b-0\">\r\n {groupEvents.map((event) =>\r\n renderEvent ? (\r\n <div key={event.id}>{renderEvent({ event, variant: 'full' })}</div>\r\n ) : (\r\n <EventCard\r\n key={event.id}\r\n event={event}\r\n variant=\"full\"\r\n badgeVariant={badgeVariant}\r\n onClick={onEventClick}\r\n disablePopover={!!onEventClick && !renderPopover}\r\n renderPopover={renderPopover}\r\n showTime\r\n showDescription\r\n showParticipants\r\n />\r\n ),\r\n )}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default AgendaView;\r\n"],"names":["falsyToString","value","cx","clsx","cva","base","config","props","_config_compoundVariants","variants","defaultVariants","getVariantClassNames","variant","variantProp","defaultVariantProp","variantKey","propsWithoutUndefined","acc","param","key","getCompoundVariantClassNames","cvClass","cvClassName","compoundVariantOptions","buttonVariants","Button","forwardRef","className","size","loading","disabled","children","ref","jsxs","cn","jsx","mergeClasses","classes","index","array","toKebabCase","string","toCamelCase","match","p1","p2","toPascalCase","camelCase","defaultAttributes","hasA11yProp","prop","Icon","color","strokeWidth","absoluteStrokeWidth","iconNode","rest","createElement","tag","attrs","createLucideIcon","iconName","Component","__iconNode","Check","ChevronRight","Circle","DropdownMenu","DropdownMenuPrimitive","DropdownMenuTrigger","DropdownMenuSubTrigger","React","inset","DropdownMenuSubContent","DropdownMenuContent","sideOffset","DropdownMenuItem","DropdownMenuCheckboxItem","checked","DropdownMenuRadioItem","DropdownMenuLabel","DropdownMenuSeparator","Popover","PopoverPrimitive","PopoverTrigger","PopoverAnchor","PopoverContent","align","MONTH_NAMES","TodayButton","onClick","today","badgeVariants","Badge","ChevronLeft","DateNavigator","date","view","events","onNavigatePrev","onNavigateNext","weekStartsOn","showEventCount","month","year","eventCount","getEventsCountInView","rangeText","getRangeText","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","TooltipProvider","TooltipPrimitive","Tooltip","TooltipTrigger","TooltipContent","getEventColorClasses","formatTime","formatTimeRange","start","end","startOfDay","d","EventCard","event","badgeVariant","showTime","showDescription","showParticipants","style","disablePopover","renderPopover","enableDrag","colors","popoverOpen","setPopoverOpen","useState","isDragging","setIsDragging","dragDrop","useOptionalDragDrop","isPast","isCanceled","canDrag","statusIcon","XIcon","CheckIcon","handleClick","useCallback","handleClose","handleDragStart","e","handleDragEnd","dotButton","DefaultPopoverContent","compactContent","fullContent","ClockIcon","UsersIcon","p","onClose","EventBlock","position","hourHeight","durationInMinutes","heightInPixels","isShortEvent","isDotVariant","target","rect","handleKeyDown","blockButton","tooltipContent","MultiDayEventBar","spanDays","isStart","isEnd","barButton","MultiDayBanner","onEventClick","isSameDay","DRAG_THRESHOLD","SelectableSlot","slot","onSelectionStart","onSelectionMove","onSelectionEnd","isSelected","isSelecting","ariaLabel","height","dataAttributes","startPositionRef","useRef","isDraggingRef","isMouseDownRef","buttonRef","isDragOver","setIsDragOver","handlePointerDown","handlePointerMove","dx","dy","handlePointerEnter","handlePointerUp","handleDragOver","now","hour","minute","handleDragLeave","handleDrop","useEffect","handleGlobalPointerUp","TimeSlot","slotProp","label","DaySlot","HOUR_HEIGHT","HOUR_COLUMN_WIDTH","MIN_EVENT_CARD_WIDTH","DayView","visibleHours","workingHours","slotDuration","_onSlotSelect","renderEvent","slotsPerHour","slotHeightPercent","slotMinutes","minutes","i","dayEvents","getEventsForDay","singleDay","multiDay","separateEventsByDuration","eventPositions","positions","calculateOverlappingPositions","map","positioned","hours","getVisibleHoursArray","showCurrentTime","isToday","currentTimeTop","currentHour","scrollContainerRef","useLayoutEffect","container","scrollToWorkingHours","dayOfWeek","todayWorkingHours","scrollToHour","scrollTop","slotSelection","useOptionalSlotSelection","handleSelectionStart","handleSelectionMove","handleSelectionEnd","handleMultiDayEventClick","headerDay","headerDate","isDisabled","isWorkingHour","formatHourLabel","slotIndex","calculatedWidth","minWidthStyle","DAY_HEADER_HEIGHT","MIN_DAY_COLUMN_WIDTH","MAX_EVENTS_BEFORE_EXPAND","WeekView","onDayClick","weekDays","getWeekDays","eventsPerDay","day","dayKey","positionsArray","maxOverlapping","overlapping","weekMultiDayEvents","unique","todayIndex","targetWorkingHours","mondayHours","gridMinWidth","dayColumnWidths","widths","actualGridWidth","sum","w","startOfWeek","offset","hrs","sign","dayIndex","columnWidth","needsExpansion","dayData","WEEKDAY_LABELS_MONDAY_START","WEEKDAY_LABELS_SUNDAY_START","MAX_EVENTS_SHOWN","MonthView","showMoreEventsInPopover","openPopoverDay","setOpenPopoverDay","cells","generateMonthGrid","eventsByDate","cell","a","b","handleDayClick","cellDate","weekdayLabels","isWeekend","hasMoreEvents","open","AgendaView","daysAhead","upcomingEvents","baseDate","endDate","groupedEvents","groupEventsByDate","result","dateKey","eventList","groupDate","groupEvents","dayName","dayNumber","monthName"],"mappings":"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","x_google_ignoreList":[0,2,3,4,5,6,7,8,9,10,11,12]}