@ttianqii/takaui 0.1.4 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +102 -244
- package/dist/index.d.ts +0 -36
- package/dist/takaui.cjs +1 -1
- package/dist/takaui.cjs.map +1 -1
- package/dist/takaui.js +1108 -1255
- package/dist/takaui.js.map +1 -1
- package/package.json +10 -2
- package/dist/vite.svg +0 -1
package/dist/takaui.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"takaui.cjs","sources":["../src/lib/utils.ts","../src/components/ui/button.tsx","../src/components/ui/checkbox.tsx","../src/components/ui/input.tsx","../src/components/ui/separator.tsx","../src/components/ui/table.tsx","../src/components/ui/dropdown-menu.tsx","../src/components/DataTable.tsx","../src/components/DataGrid.tsx","../src/components/DataGridTable.tsx","../src/components/ui/select.tsx","../src/components/DataGridPagination.tsx","../src/components/DataGridColumnHeader.tsx","../src/components/DataGridRowSelect.tsx","../src/components/ui/data-table.tsx","../src/components/ui/data-table-container.tsx","../src/components/ui/data-table-view.tsx","../src/components/ui/data-table-pagination.tsx","../src/components/ui/data-table-column-header.tsx","../src/components/Calendar.tsx","../src/components/ui/popover.tsx","../src/components/DatePicker.tsx","../src/components/TimePicker.tsx","../src/components/ui/card.tsx","../src/components/ui/label.tsx","../src/components/ui/modal.tsx","../src/components/WeekNavigator.tsx","../src/utils/weekNavigatorUtils.ts","../src/components/Schedule.tsx","../src/utils/timeUtils.ts"],"sourcesContent":["import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cn } from \"@/lib/utils\"\n\nexport interface ButtonProps extends React.ComponentProps<\"button\"> {\n variant?: \"default\" | \"destructive\" | \"outline\" | \"secondary\" | \"ghost\" | \"link\"\n size?: \"default\" | \"sm\" | \"lg\" | \"icon\" | \"icon-sm\" | \"icon-lg\"\n asChild?: boolean\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant = \"default\", size = \"default\", asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\"\n \n return (\n <Comp\n className={cn(\n // Base styles\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2\",\n \"disabled:pointer-events-none disabled:opacity-50\",\n // Variant styles\n variant === \"default\" && \"bg-blue-600 text-white hover:bg-blue-700 active:bg-blue-800 active:scale-95\",\n variant === \"destructive\" && \"bg-red-600 text-white hover:bg-red-700 active:bg-red-800 active:scale-95\",\n variant === \"outline\" && \"border border-gray-300 bg-white text-gray-900 hover:bg-gray-50 active:bg-gray-100 active:scale-95\",\n variant === \"secondary\" && \"bg-gray-200 text-gray-900 hover:bg-gray-300 active:bg-gray-400 active:scale-95\",\n variant === \"ghost\" && \"bg-transparent text-gray-900 hover:bg-gray-100 active:bg-gray-200 active:scale-95\",\n variant === \"link\" && \"bg-transparent text-blue-600 underline-offset-4 hover:text-blue-700 hover:underline active:text-blue-800\",\n // Size styles\n size === \"default\" && \"h-9 px-4 py-2\",\n size === \"sm\" && \"h-8 px-3 text-xs gap-1.5\",\n size === \"lg\" && \"h-10 px-6\",\n size === \"icon\" && \"h-9 w-9 p-0\",\n size === \"icon-sm\" && \"h-8 w-8 p-0\",\n size === \"icon-lg\" && \"h-10 w-10 p-0\",\n className\n )}\n ref={ref}\n {...props}\n />\n )\n }\n)\n\nButton.displayName = \"Button\"\n\nexport { Button }\n","import * as React from \"react\"\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\"\nimport { Check } from \"lucide-react\"\nimport { cn } from \"@/lib/utils\"\n\nconst Checkbox = React.forwardRef<\n React.ElementRef<typeof CheckboxPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <CheckboxPrimitive.Root\n ref={ref}\n className={cn(\n \"peer h-4 w-4 shrink-0 rounded border border-gray-200 bg-white ring-offset-white focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-gray-400 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-gray-900 data-[state=checked]:border-gray-900 data-[state=checked]:text-white transition-colors\",\n className\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n className={cn(\"flex items-center justify-center text-current\")}\n >\n <Check className=\"h-3.5 w-3.5 stroke-[2.5]\" />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n))\nCheckbox.displayName = CheckboxPrimitive.Root.displayName\n\nexport { Checkbox }\n","import * as React from \"react\"\nimport { cn } from \"@/lib/utils\"\n\nconst Input = React.forwardRef<HTMLInputElement, React.InputHTMLAttributes<HTMLInputElement>>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n \"flex h-10 w-full rounded-md border border-gray-300 bg-white px-3 py-2 text-sm file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-gray-400 focus:outline-none focus:border-gray-500 hover:border-gray-400 disabled:cursor-not-allowed disabled:opacity-50 transition-colors\",\n className\n )}\n ref={ref}\n {...props}\n />\n )\n }\n)\nInput.displayName = \"Input\"\n\nexport { Input }\n","import * as React from \"react\"\nimport { cn } from \"@/lib/utils\"\n\nexport interface SeparatorProps extends React.HTMLAttributes<HTMLDivElement> {\n orientation?: \"horizontal\" | \"vertical\"\n decorative?: boolean\n}\n\nconst Separator = React.forwardRef<HTMLDivElement, SeparatorProps>(\n (\n { className, orientation = \"horizontal\", decorative = true, ...props },\n ref\n ) => {\n return (\n <div\n ref={ref}\n role={decorative ? \"none\" : \"separator\"}\n aria-orientation={orientation}\n className={cn(\n \"shrink-0 bg-gray-200\",\n orientation === \"horizontal\" ? \"h-[1px] w-full\" : \"h-full w-[1px]\",\n className\n )}\n {...props}\n />\n )\n }\n)\n\nSeparator.displayName = \"Separator\"\n\nexport { Separator }\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype TableVariant = \"default\" | \"clean\"\n\nconst TableContext = React.createContext<{ variant: TableVariant }>({\n variant: \"default\",\n})\n\nfunction Table({ \n className, \n variant = \"default\",\n ...props \n}: React.ComponentProps<\"table\"> & { variant?: TableVariant }) {\n return (\n <TableContext.Provider value={{ variant }}>\n <div\n data-slot=\"table-container\"\n className=\"relative w-full overflow-x-auto\"\n >\n <table\n data-slot=\"table\"\n className={cn(\"w-full caption-bottom text-sm\", className)}\n {...props}\n />\n </div>\n </TableContext.Provider>\n )\n}\n\nfunction TableHeader({ className, ...props }: React.ComponentProps<\"thead\">) {\n return (\n <thead\n data-slot=\"table-header\"\n className={cn(\"bg-gray-50 [&_tr]:border-b [&_tr]:border-gray-200\", className)}\n {...props}\n />\n )\n}\n\nfunction TableBody({ className, ...props }: React.ComponentProps<\"tbody\">) {\n return (\n <tbody\n data-slot=\"table-body\"\n className={cn(\"[&_tr:last-child]:border-b-0\", className)}\n {...props}\n />\n )\n}\n\nfunction TableFooter({ className, ...props }: React.ComponentProps<\"tfoot\">) {\n return (\n <tfoot\n data-slot=\"table-footer\"\n className={cn(\n \"bg-muted/50 border-t font-medium [&>tr]:last:border-b-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableRow({ className, ...props }: React.ComponentProps<\"tr\">) {\n const { variant } = React.useContext(TableContext)\n \n return (\n <tr\n data-slot=\"table-row\"\n className={cn(\n \"hover:bg-gray-50 data-[state=selected]:bg-gray-50 transition-colors border-b border-gray-200\",\n variant === \"clean\" && \"border-b-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableHead({ className, ...props }: React.ComponentProps<\"th\">) {\n return (\n <th\n data-slot=\"table-head\"\n className={cn(\n \"text-foreground h-auto px-3 py-2 text-left align-middle font-medium whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableCell({ className, ...props }: React.ComponentProps<\"td\">) {\n return (\n <td\n data-slot=\"table-cell\"\n className={cn(\n \"px-3 py-2 text-left align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableCaption({\n className,\n ...props\n}: React.ComponentProps<\"caption\">) {\n return (\n <caption\n data-slot=\"table-caption\"\n className={cn(\"text-muted-foreground mt-4 text-sm\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\"\nimport { CheckIcon, ChevronRightIcon, CircleIcon } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction DropdownMenu({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {\n return <DropdownMenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />\n}\n\nfunction DropdownMenuPortal({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\n return (\n <DropdownMenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />\n )\n}\n\nfunction DropdownMenuTrigger({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {\n return (\n <DropdownMenuPrimitive.Trigger\n data-slot=\"dropdown-menu-trigger\"\n suppressHydrationWarning\n {...props}\n />\n )\n}\n\nfunction DropdownMenuContent({\n className,\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {\n return (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n data-slot=\"dropdown-menu-content\"\n sideOffset={sideOffset}\n className={cn(\n \"bg-white text-gray-900 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 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border border-gray-200 p-2 shadow-lg\",\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n )\n}\n\nfunction DropdownMenuGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {\n return (\n <DropdownMenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />\n )\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n variant?: \"default\" | \"destructive\"\n}) {\n return (\n <DropdownMenuPrimitive.Item\n data-slot=\"dropdown-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"focus:bg-gray-100 focus:text-gray-900 data-[variant=destructive]:text-red-600 data-[variant=destructive]:focus:bg-red-50 data-[variant=destructive]:focus:text-red-700 [&_svg:not([class*='text-'])]:text-gray-500 relative flex cursor-pointer items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none select-none transition-colors data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>) {\n return (\n <DropdownMenuPrimitive.CheckboxItem\n data-slot=\"dropdown-menu-checkbox-item\"\n className={cn(\n \"focus:bg-gray-100 focus:text-gray-900 relative flex cursor-pointer items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-none select-none transition-colors data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CheckIcon className=\"size-4 text-blue-600\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n )\n}\n\nfunction DropdownMenuRadioGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {\n return (\n <DropdownMenuPrimitive.RadioGroup\n data-slot=\"dropdown-menu-radio-group\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuRadioItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>) {\n return (\n <DropdownMenuPrimitive.RadioItem\n data-slot=\"dropdown-menu-radio-item\"\n className={cn(\n \"focus:bg-gray-100 focus:text-gray-900 relative flex cursor-pointer items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-none select-none transition-colors data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CircleIcon className=\"size-2 fill-blue-600\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n )\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.Label\n data-slot=\"dropdown-menu-label\"\n data-inset={inset}\n className={cn(\n \"px-2 py-1.5 text-sm font-semibold text-gray-900 data-[inset]:pl-8\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\n return (\n <DropdownMenuPrimitive.Separator\n data-slot=\"dropdown-menu-separator\"\n className={cn(\"bg-gray-100 my-1 h-px\", className)}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn(\n \"text-gray-500 ml-auto text-xs tracking-widest\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSub({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {\n return <DropdownMenuPrimitive.Sub data-slot=\"dropdown-menu-sub\" {...props} />\n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.SubTrigger\n data-slot=\"dropdown-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"focus:bg-gray-100 focus:text-gray-900 data-[state=open]:bg-gray-100 data-[state=open]:text-gray-900 [&_svg:not([class*='text-'])]:text-gray-500 flex cursor-pointer items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none select-none transition-colors data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto size-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n )\n}\n\nfunction DropdownMenuSubContent({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {\n return (\n <DropdownMenuPrimitive.SubContent\n data-slot=\"dropdown-menu-sub-content\"\n className={cn(\n \"bg-white text-gray-900 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 z-50 min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border border-gray-200 p-2 shadow-lg\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n DropdownMenu,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuSubContent,\n}\n","import React, { useState, useMemo } from 'react';\nimport { ChevronLeft, ChevronRight, Search, ChevronsUpDown, ChevronUp, ChevronDown } from 'lucide-react';\nimport { Button } from './ui/button';\nimport { Input } from './ui/input';\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from './ui/table';\nimport { cn } from '@/lib/utils';\n\nexport interface DataTableColumn<T = Record<string, unknown>> {\n key: string;\n header: string | React.ReactNode;\n accessor?: (row: T) => unknown;\n cell?: (value: unknown, row: T, index: number) => React.ReactNode;\n sortable?: boolean;\n width?: string;\n align?: 'left' | 'center' | 'right';\n}\n\nexport interface DataTableProps<T = Record<string, unknown>> {\n data: T[];\n columns: DataTableColumn<T>[];\n searchPlaceholder?: string;\n onRowClick?: (row: T) => void;\n className?: string;\n showPagination?: boolean;\n showSearch?: boolean;\n pageSize?: number;\n renderToolbar?: () => React.ReactNode;\n variant?: 'default' | 'clean';\n}\n\nexport function DataTable<T = Record<string, unknown>>({\n data = [],\n columns,\n searchPlaceholder = 'Search...',\n onRowClick,\n className = '',\n showPagination = true,\n showSearch = true,\n pageSize: initialPageSize = 10,\n renderToolbar,\n variant = 'default',\n}: DataTableProps<T>) {\n const [currentPage, setCurrentPage] = useState(1);\n const [pageSize] = useState(initialPageSize);\n const [searchQuery, setSearchQuery] = useState('');\n const [sortKey, setSortKey] = useState<string | null>(null);\n const [sortOrder, setSortOrder] = useState<'asc' | 'desc'>('asc');\n\n const filteredData = useMemo(() => {\n if (!showSearch || !searchQuery.trim()) return data;\n const query = searchQuery.toLowerCase();\n return data.filter((row) => {\n return columns.some(column => {\n const value = column.accessor ? column.accessor(row) : (row as Record<string, unknown>)[column.key];\n return value?.toString().toLowerCase().includes(query);\n });\n });\n }, [data, searchQuery, showSearch, columns]);\n\n const sortedData = useMemo(() => {\n if (!sortKey) return filteredData;\n return [...filteredData].sort((a, b) => {\n const column = columns.find(col => col.key === sortKey);\n if (!column) return 0;\n \n const aVal = column.accessor ? column.accessor(a) : (a as Record<string, unknown>)[column.key];\n const bVal = column.accessor ? column.accessor(b) : (b as Record<string, unknown>)[column.key];\n \n if (aVal === bVal) return 0;\n if (aVal === null || aVal === undefined) return 1;\n if (bVal === null || bVal === undefined) return -1;\n \n const comparison = aVal < bVal ? -1 : 1;\n return sortOrder === 'asc' ? comparison : -comparison;\n });\n }, [filteredData, sortKey, sortOrder, columns]);\n\n const paginatedData = useMemo(() => {\n if (!showPagination) return sortedData;\n const start = (currentPage - 1) * pageSize;\n return sortedData.slice(start, start + pageSize);\n }, [sortedData, currentPage, pageSize, showPagination]);\n\n React.useEffect(() => setCurrentPage(1), [searchQuery]);\n\n const handleSort = (columnKey: string) => {\n if (sortKey === columnKey) {\n setSortOrder(sortOrder === 'asc' ? 'desc' : 'asc');\n } else {\n setSortKey(columnKey);\n setSortOrder('asc');\n }\n };\n\n const getCellValue = (row: T, column: DataTableColumn<T>, rowIndex: number): React.ReactNode => {\n const value = column.accessor ? column.accessor(row) : (row as Record<string, unknown>)[column.key];\n return column.cell ? column.cell(value, row, rowIndex) : (value as React.ReactNode);\n };\n\n return (\n <div className={cn('w-full space-y-4', className)}>\n {/* Search and Toolbar */}\n {(showSearch || renderToolbar) && (\n <div className=\"flex flex-col sm:flex-row justify-between items-start sm:items-center gap-4\">\n {showSearch && (\n <div className=\"relative w-full sm:w-auto\">\n <Search className=\"absolute left-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-gray-400\" />\n <Input\n placeholder={searchPlaceholder}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"pl-10 w-full sm:w-[300px] bg-gray-50 border-gray-300\"\n />\n </div>\n )}\n {renderToolbar && <div className=\"w-full sm:w-auto\">{renderToolbar()}</div>}\n </div>\n )}\n\n {/* Table */}\n <div className=\"border border-gray-200 rounded-lg overflow-hidden\">\n <div className=\"overflow-x-auto\">\n <Table variant={variant}>\n <TableHeader>\n <TableRow>\n {columns.map((column) => (\n <TableHead\n key={column.key}\n className=\"h-10 px-0 py-0\"\n style={{ width: column.width }}\n >\n {column.align === 'center' || (!column.align && typeof column.header !== 'string') ? (\n <div className=\"h-10 flex items-center justify-center\">\n {typeof column.header !== 'string' ? (\n column.header\n ) : (\n <span className=\"text-xs font-normal text-gray-500 uppercase tracking-widest\">{column.header}</span>\n )}\n </div>\n ) : (\n <div className=\"h-10 flex items-center text-xs font-normal text-gray-500 uppercase tracking-widest\">\n {typeof column.header !== 'string' ? (\n <div>{column.header}</div>\n ) : column.sortable !== false ? (\n <Button\n variant=\"ghost\"\n className=\"h-auto px-3 py-1.5 font-normal hover:bg-transparent hover:text-gray-900\"\n onClick={() => handleSort(column.key)}\n >\n {column.header}\n {sortKey === column.key && sortOrder === 'desc' ? (\n <ChevronDown className=\"h-4 w-4\" />\n ) : sortKey === column.key && sortOrder === 'asc' ? (\n <ChevronUp className=\"h-4 w-4\" />\n ) : (\n <ChevronsUpDown className=\"h-4 w-4\" />\n )}\n </Button>\n ) : (\n <span className=\"px-3\">{column.header}</span>\n )}\n </div>\n )}\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {paginatedData.length === 0 ? (\n <TableRow>\n <TableCell\n colSpan={columns.length}\n className=\"text-center py-8 text-gray-500\"\n >\n No results found.\n </TableCell>\n </TableRow>\n ) : (\n paginatedData.map((row, rowIndex) => (\n <TableRow\n key={rowIndex}\n className=\"hover:bg-gray-50 cursor-pointer\"\n onClick={() => onRowClick?.(row)}\n >\n {columns.map((column) => {\n const shouldCenter = column.align === 'center' || (!column.align && typeof column.header !== 'string');\n return (\n <TableCell \n key={column.key} \n className={shouldCenter ? \"px-0 py-4\" : \"px-3 py-4\"}\n style={{ width: column.width }}\n >\n {shouldCenter ? (\n <div className=\"flex items-center justify-center h-full\">\n {getCellValue(row, column, rowIndex)}\n </div>\n ) : (\n getCellValue(row, column, rowIndex)\n )}\n </TableCell>\n );\n })}\n </TableRow>\n ))\n )}\n </TableBody>\n </Table>\n </div>\n </div>\n\n {/* Pagination */}\n {showPagination && (\n <div className=\"flex items-center justify-between px-2 py-4\">\n <div className=\"text-sm text-gray-600\">\n Showing {paginatedData.length} of {sortedData.length} row(s)\n </div>\n\n <div className=\"flex items-center gap-3\">\n <span className=\"text-sm text-gray-700\">\n Page {currentPage} of {Math.ceil(sortedData.length / pageSize)}\n </span>\n <div className=\"flex gap-1\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setCurrentPage(p => Math.max(1, p - 1))}\n disabled={currentPage === 1}\n className=\"h-8 w-8 p-0\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setCurrentPage(p => Math.min(Math.ceil(sortedData.length / pageSize), p + 1))}\n disabled={currentPage === Math.ceil(sortedData.length / pageSize)}\n className=\"h-8 w-8 p-0\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n </div>\n )}\n </div>\n )\n}\n","import React, { createContext, useContext, useMemo, useState } from 'react';\nimport type { ReactNode } from 'react';\n\nexport interface DataGridColumn<T = Record<string, unknown>> {\n id: string;\n accessorKey?: keyof T;\n header: string | React.ReactNode;\n cell?: (row: T, index: number) => React.ReactNode;\n size?: number;\n enableSorting?: boolean;\n enableHiding?: boolean;\n align?: 'left' | 'center' | 'right';\n}\n\nexport interface DataGridProps<T = Record<string, unknown>> {\n columns: DataGridColumn<T>[];\n data: T[];\n getRowId?: (row: T) => string;\n onRowClick?: (row: T) => void;\n children: ReactNode;\n recordCount?: number;\n}\n\ninterface DataGridContextValue<T = Record<string, unknown>> {\n columns: DataGridColumn<T>[];\n data: T[];\n getRowId: (row: T) => string;\n onRowClick?: (row: T) => void;\n \n // Pagination\n pagination: { pageIndex: number; pageSize: number };\n setPagination: React.Dispatch<React.SetStateAction<{ pageIndex: number; pageSize: number }>>;\n canPreviousPage: boolean;\n canNextPage: boolean;\n previousPage: () => void;\n nextPage: () => void;\n setPageSize: (size: number) => void;\n goToPage: (page: number) => void;\n pageCount: number;\n \n // Sorting\n sorting: { id: string; desc: boolean }[];\n setSorting: React.Dispatch<React.SetStateAction<{ id: string; desc: boolean }[]>>;\n \n // Selection\n selectedRows: Set<string>;\n toggleRow: (id: string) => void;\n toggleAllRows: () => void;\n isAllRowsSelected: boolean;\n \n // Computed data\n paginatedData: T[];\n sortedData: T[];\n totalPages: number;\n recordCount: number;\n}\n\nconst DataGridContext = createContext<DataGridContextValue | null>(null);\n\n// eslint-disable-next-line react-refresh/only-export-components\nexport function useDataGrid<T = Record<string, unknown>>() {\n const context = useContext(DataGridContext);\n if (!context) {\n throw new Error('useDataGrid must be used within DataGrid');\n }\n return context as DataGridContextValue<T>;\n}\n\nexport function DataGrid<T extends Record<string, unknown>>({\n columns,\n data,\n getRowId = (row: T) => (row as { id?: string }).id || String(Math.random()),\n onRowClick,\n children,\n recordCount,\n}: DataGridProps<T>) {\n const [pagination, setPagination] = useState({ pageIndex: 0, pageSize: 5 });\n const [sorting, setSorting] = useState<{ id: string; desc: boolean }[]>([]);\n const [selectedRows, setSelectedRows] = useState<Set<string>>(new Set());\n\n // Sorting logic\n const sortedData = useMemo(() => {\n if (sorting.length === 0) return data;\n \n const sorted = [...data].sort((a, b) => {\n for (const sort of sorting) {\n const column = columns.find((col) => col.id === sort.id);\n if (!column?.accessorKey) continue;\n \n const aValue = a[column.accessorKey];\n const bValue = b[column.accessorKey];\n \n if (aValue === bValue) continue;\n \n const comparison = aValue < bValue ? -1 : 1;\n return sort.desc ? -comparison : comparison;\n }\n return 0;\n });\n \n return sorted;\n }, [data, sorting, columns]);\n\n // Pagination logic\n const paginatedData = useMemo(() => {\n const start = pagination.pageIndex * pagination.pageSize;\n const end = start + pagination.pageSize;\n return sortedData.slice(start, end);\n }, [sortedData, pagination]);\n\n const totalPages = Math.ceil(sortedData.length / pagination.pageSize);\n const pageCount = totalPages;\n\n // Pagination helpers\n const canPreviousPage = pagination.pageIndex > 0;\n const canNextPage = pagination.pageIndex < totalPages - 1;\n const previousPage = () => setPagination((prev) => ({ ...prev, pageIndex: prev.pageIndex - 1 }));\n const nextPage = () => {\n setPagination((prev) => ({\n ...prev,\n pageIndex: Math.min(prev.pageIndex + 1, pageCount - 1),\n }));\n };\n\n const setPageSize = (size: number) => {\n setPagination(() => ({\n pageIndex: 0,\n pageSize: size,\n }));\n };\n\n const goToPage = (page: number) => {\n setPagination((prev) => ({\n ...prev,\n pageIndex: Math.max(0, Math.min(page, pageCount - 1)),\n }));\n };\n\n // Selection logic\n const toggleRow = (id: string) => {\n setSelectedRows((prev) => {\n const next = new Set(prev);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n return next;\n });\n };\n\n const toggleAllRows = () => {\n if (selectedRows.size === paginatedData.length) {\n setSelectedRows(new Set());\n } else {\n setSelectedRows(new Set(paginatedData.map((row) => getRowId(row))));\n }\n };\n\n const isAllRowsSelected = paginatedData.length > 0 && selectedRows.size === paginatedData.length;\n\n const value: DataGridContextValue<T> = {\n columns,\n data,\n getRowId,\n onRowClick,\n pagination,\n setPagination,\n canPreviousPage,\n canNextPage,\n previousPage,\n nextPage,\n setPageSize,\n goToPage,\n pageCount,\n sorting,\n setSorting,\n selectedRows,\n toggleRow,\n toggleAllRows,\n isAllRowsSelected,\n paginatedData,\n sortedData,\n totalPages,\n recordCount: recordCount ?? data.length,\n };\n\n return <DataGridContext.Provider value={value as DataGridContextValue}>{children}</DataGridContext.Provider>;\n}\n\nexport default DataGrid;\n","import { useDataGrid } from './DataGrid';\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from './ui/table';\n\nexport function DataGridTable() {\n const { columns, paginatedData, getRowId, onRowClick } = useDataGrid();\n\n return (\n <div className=\"border border-gray-200 rounded-lg overflow-hidden\">\n <div className=\"overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n {columns.map((column) => (\n <TableHead\n key={column.id}\n className=\"h-10 px-0 py-0\"\n style={{ width: column.size ? `${column.size}px` : undefined }}\n >\n {column.align === 'center' ? (\n <div className=\"h-10 flex items-center justify-center\">\n {typeof column.header !== 'string' ? (\n column.header\n ) : (\n <span className=\"text-xs font-normal text-gray-500 uppercase tracking-widest\">{column.header}</span>\n )}\n </div>\n ) : (\n <div className=\"h-10 flex items-center text-xs font-normal text-gray-500 uppercase tracking-widest\">\n {typeof column.header !== 'string' ? (\n <div>{column.header}</div>\n ) : (\n <span className=\"px-3\">{column.header}</span>\n )}\n </div>\n )}\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {paginatedData.length === 0 ? (\n <TableRow>\n <TableCell colSpan={columns.length} className=\"text-center py-8 text-gray-500\">\n No results found.\n </TableCell>\n </TableRow>\n ) : (\n paginatedData.map((row, rowIndex) => (\n <TableRow\n key={getRowId(row)}\n className=\"hover:bg-gray-50 cursor-pointer\"\n onClick={() => onRowClick?.(row)}\n >\n {columns.map((column) => {\n const shouldCenter = column.align === 'center';\n const cellValue = column.cell\n ? column.cell(row, rowIndex)\n : column.accessorKey\n ? row[column.accessorKey]\n : null;\n\n return (\n <TableCell\n key={column.id}\n className={shouldCenter ? 'px-0 py-4' : 'px-3 py-4'}\n style={{ width: column.size ? `${column.size}px` : undefined }}\n >\n {shouldCenter ? (\n <div className=\"flex items-center justify-center h-full\">{cellValue as React.ReactNode}</div>\n ) : (\n (cellValue as React.ReactNode)\n )}\n </TableCell>\n );\n })}\n </TableRow>\n ))\n )}\n </TableBody>\n </Table>\n </div>\n </div>\n );\n}\n\nexport default DataGridTable;\n","import * as React from \"react\"\nimport * as SelectPrimitive from \"@radix-ui/react-select\"\nimport { Check, ChevronDown, ChevronUp } from \"lucide-react\"\nimport { cn } from \"@/lib/utils\"\n\nconst Select = SelectPrimitive.Root\n\nconst SelectGroup = SelectPrimitive.Group\n\nconst SelectValue = SelectPrimitive.Value\n\nconst SelectTrigger = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n \"flex h-10 w-full items-center justify-between rounded-md border border-gray-300 bg-white px-3 py-2 text-sm ring-offset-white placeholder:text-gray-400 focus:outline-none focus:border-gray-500 hover:border-gray-400 disabled:cursor-not-allowed disabled:opacity-50 transition-colors\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"h-4 w-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n))\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName\n\nconst SelectScrollUpButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollUpButton\n ref={ref}\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronUp className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollUpButton>\n))\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName\n\nconst SelectScrollDownButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollDownButton\n ref={ref}\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronDown className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollDownButton>\n))\nSelectScrollDownButton.displayName =\n SelectPrimitive.ScrollDownButton.displayName\n\nconst SelectContent = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = \"popper\", ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n \"relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border border-gray-200 bg-white text-gray-950 shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n \"p-1\",\n position === \"popper\" &&\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n))\nSelectContent.displayName = SelectPrimitive.Content.displayName\n\nconst SelectLabel = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label\n ref={ref}\n className={cn(\"py-1.5 pl-8 pr-2 text-sm font-semibold\", className)}\n {...props}\n />\n))\nSelectLabel.displayName = SelectPrimitive.Label.displayName\n\nconst SelectItem = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-gray-100 focus:text-gray-900 data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n))\nSelectItem.displayName = SelectPrimitive.Item.displayName\n\nconst SelectSeparator = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-gray-100\", className)}\n {...props}\n />\n))\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectLabel,\n SelectItem,\n SelectSeparator,\n SelectScrollUpButton,\n SelectScrollDownButton,\n}\n","import { ChevronLeft, ChevronRight } from 'lucide-react';\nimport { useDataGrid } from './DataGrid';\nimport { Button } from './ui/button';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from './ui/select';\n\nexport interface DataGridPaginationProps {\n mode?: 'simple' | 'advanced';\n pageSizeOptions?: number[];\n}\n\nexport function DataGridPagination({ \n mode = 'simple',\n pageSizeOptions = [5, 10, 15, 20]\n}: DataGridPaginationProps) {\n const {\n canPreviousPage,\n canNextPage,\n previousPage,\n nextPage,\n pageCount,\n pagination,\n setPageSize,\n goToPage,\n } = useDataGrid();\n\n // Generate page numbers to display\n const getPageNumbers = () => {\n const current = pagination.pageIndex;\n const total = pageCount;\n const pages: (number | string)[] = [];\n\n if (total <= 7) {\n // Show all pages if total is small (1 2 3 4 5 6 7)\n for (let i = 0; i < total; i++) {\n pages.push(i);\n }\n } else {\n if (current <= 3) {\n // Near the beginning (1 2 3 4 5 ... 10)\n for (let i = 0; i <= 4; i++) {\n pages.push(i);\n }\n pages.push('...');\n pages.push(total - 1);\n } else if (current >= total - 4) {\n // Near the end (1 ... 6 7 8 9 10)\n pages.push(0);\n pages.push('...');\n for (let i = total - 5; i < total; i++) {\n pages.push(i);\n }\n } else {\n // In the middle (1 ... 5 6 7 ... 10)\n pages.push(0);\n pages.push('...');\n pages.push(current - 1);\n pages.push(current);\n pages.push(current + 1);\n pages.push('...');\n pages.push(total - 1);\n }\n }\n\n return pages;\n };\n\n if (mode === 'simple') {\n return (\n <div className=\"flex items-center justify-end px-2 py-4\">\n <div className=\"flex items-center gap-3\">\n <span className=\"text-sm text-gray-700 hidden sm:block\">\n Page {pagination.pageIndex + 1} of {pageCount}\n </span>\n <div className=\"flex gap-1\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={previousPage}\n disabled={!canPreviousPage}\n className=\"h-8 w-8 p-0\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={nextPage}\n disabled={!canNextPage}\n className=\"h-8 w-8 p-0\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n </div>\n );\n }\n\n // Advanced mode\n return (\n <div className=\"flex items-center justify-between gap-3 px-2 py-4\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm text-gray-600 hidden sm:inline\">Rows per page:</span>\n <Select\n value={String(pagination.pageSize)}\n onValueChange={(value) => setPageSize(Number(value))}\n >\n <SelectTrigger className=\"h-8 w-16\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {pageSizeOptions.map((size) => (\n <SelectItem key={size} value={String(size)}>\n {size}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={previousPage}\n disabled={!canPreviousPage}\n className=\"h-8 w-8 p-0\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n \n {/* Show page count on mobile */}\n <span className=\"text-sm text-gray-700 sm:hidden px-2\">\n {pagination.pageIndex + 1} / {pageCount}\n </span>\n \n {/* Show page numbers on desktop */}\n <div className=\"hidden sm:flex gap-1\">\n {getPageNumbers().map((page, index) => (\n typeof page === 'number' ? (\n <Button\n key={index}\n variant={pagination.pageIndex === page ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => goToPage(page)}\n className=\"h-8 w-8 p-0\"\n >\n {page + 1}\n </Button>\n ) : (\n <span key={index} className=\"flex h-8 w-8 items-center justify-center text-gray-400\">\n {page}\n </span>\n )\n ))}\n </div>\n\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={nextPage}\n disabled={!canNextPage}\n className=\"h-8 w-8 p-0\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n );\n}\n\nexport default DataGridPagination;\n","import { ChevronDown, ChevronUp, ChevronsUpDown } from 'lucide-react';\nimport { useDataGrid } from './DataGrid';\nimport { Button } from './ui/button';\n\ninterface DataGridColumnHeaderProps {\n id: string;\n title: string;\n}\n\nexport function DataGridColumnHeader({ id, title }: DataGridColumnHeaderProps) {\n const { sorting, setSorting } = useDataGrid();\n\n const sortState = sorting.find((s) => s.id === id);\n const isSorted = !!sortState;\n const isDesc = sortState?.desc ?? false;\n\n const handleSort = () => {\n setSorting((prev) => {\n const existing = prev.find((s) => s.id === id);\n if (!existing) {\n return [{ id, desc: false }];\n }\n if (!existing.desc) {\n return [{ id, desc: true }];\n }\n return [];\n });\n };\n\n return (\n <Button\n variant=\"ghost\"\n className=\"h-auto px-3 py-1.5 font-normal hover:bg-transparent hover:text-gray-900\"\n onClick={handleSort}\n >\n {title}\n {isSorted && isDesc ? (\n <ChevronDown className=\"h-4 w-4\" />\n ) : isSorted ? (\n <ChevronUp className=\"h-4 w-4\" />\n ) : (\n <ChevronsUpDown className=\"h-4 w-4\" />\n )}\n </Button>\n );\n}\n\nexport default DataGridColumnHeader;\n","import { useDataGrid } from './DataGrid';\nimport { Checkbox } from './ui/checkbox';\n\nexport function DataGridTableRowSelectAll() {\n const { toggleAllRows, isAllRowsSelected } = useDataGrid();\n\n return <Checkbox checked={isAllRowsSelected} onCheckedChange={toggleAllRows} />;\n}\n\ninterface DataGridTableRowSelectProps<T = Record<string, unknown>> {\n row: T;\n}\n\nexport function DataGridTableRowSelect<T = Record<string, unknown>>({\n row,\n}: DataGridTableRowSelectProps<T>) {\n const { selectedRows, toggleRow, getRowId } = useDataGrid<T>();\n const rowId = getRowId(row);\n\n return <Checkbox checked={selectedRows.has(rowId)} onCheckedChange={() => toggleRow(rowId)} />;\n}\n\nexport default DataGridTableRowSelect;\n","import * as React from \"react\"\nimport type { Table } from \"@tanstack/react-table\"\n\ninterface TableProviderValue<TData> {\n tableInstance: Table<TData>\n totalRecords: number\n}\n\nconst TableContext = React.createContext<TableProviderValue<any> | null>(null)\n\nexport function useTableContext<TData>() {\n const context = React.useContext(TableContext)\n if (!context) {\n throw new Error(\"useTableContext must be used within a TableRoot component\")\n }\n return context as TableProviderValue<TData>\n}\n\ninterface TableRootProps<TData> {\n table: Table<TData>\n totalRecords: number\n children: React.ReactNode\n}\n\nexport function TableRoot<TData>({ table, totalRecords, children }: TableRootProps<TData>) {\n return (\n <TableContext.Provider value={{ tableInstance: table, totalRecords }}>\n {children}\n </TableContext.Provider>\n )\n}\n","import * as React from \"react\"\nimport { cn } from \"@/lib/utils\"\n\ninterface TableWrapperProps {\n children: React.ReactNode\n className?: string\n}\n\nexport function TableWrapper({ children, className }: TableWrapperProps) {\n return (\n <div className={cn(\"rounded-xl border border-gray-200 bg-white overflow-hidden\", className)}>\n {children}\n </div>\n )\n}\n","import { flexRender } from \"@tanstack/react-table\"\nimport { useTableContext } from \"./data-table\"\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"./table\"\n\nexport function TableContent() {\n const { tableInstance } = useTableContext()\n\n return (\n <Table>\n <TableHeader>\n {tableInstance.getHeaderGroups().map((headerGroup) => (\n <TableRow key={headerGroup.id}>\n {headerGroup.headers.map((header) => (\n <TableHead key={header.id}>\n {header.isPlaceholder\n ? null\n : flexRender(header.column.columnDef.header, header.getContext())}\n </TableHead>\n ))}\n </TableRow>\n ))}\n </TableHeader>\n <TableBody>\n {tableInstance.getRowModel().rows?.length ? (\n tableInstance.getRowModel().rows.map((row) => (\n <TableRow key={row.id} data-state={row.getIsSelected() && \"selected\"}>\n {row.getVisibleCells().map((cell) => (\n <TableCell key={cell.id}>\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </TableCell>\n ))}\n </TableRow>\n ))\n ) : (\n <TableRow>\n <TableCell colSpan={tableInstance.getAllColumns().length} className=\"h-24 text-center\">\n No results.\n </TableCell>\n </TableRow>\n )}\n </TableBody>\n </Table>\n )\n}\n","import { ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight } from \"lucide-react\"\nimport { useTableContext } from \"./data-table\"\nimport { Button } from \"./button\"\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"./select\"\n\nexport interface TableNavigatorProps {\n rowsPerPageOptions?: number[]\n showPageSelector?: boolean\n showRecordInfo?: boolean\n showControls?: boolean\n}\n\nexport function TableNavigator({\n rowsPerPageOptions = [5, 10, 20, 30, 50],\n showPageSelector = true,\n showRecordInfo = true,\n showControls = true,\n}: TableNavigatorProps = {}) {\n const { tableInstance, totalRecords } = useTableContext()\n \n const currentPage = tableInstance.getState().pagination.pageIndex + 1\n const totalPages = tableInstance.getPageCount()\n const pageSize = tableInstance.getState().pagination.pageSize\n const startRecord = currentPage === 1 ? 1 : (currentPage - 1) * pageSize + 1\n const endRecord = Math.min(currentPage * pageSize, totalRecords)\n\n return (\n <div className=\"flex flex-col sm:flex-row items-center justify-between gap-4 px-3 py-4\">\n {/* Page size selector */}\n {showPageSelector && (\n <div className=\"flex items-center gap-2.5\">\n <span className=\"text-sm text-gray-700 font-medium\">Items per page:</span>\n <Select\n value={`${pageSize}`}\n onValueChange={(value) => {\n tableInstance.setPageSize(Number(value))\n }}\n >\n <SelectTrigger className=\"h-9 w-[75px]\">\n <SelectValue placeholder={pageSize} />\n </SelectTrigger>\n <SelectContent side=\"top\">\n {rowsPerPageOptions.map((size) => (\n <SelectItem key={size} value={`${size}`}>\n {size}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )}\n\n {/* Record info */}\n {showRecordInfo && (\n <div className=\"flex items-center gap-2 text-sm text-gray-700\">\n <span>\n {startRecord}–{endRecord} of {totalRecords}\n </span>\n </div>\n )}\n\n {/* Navigation controls */}\n {showControls && (\n <div className=\"flex items-center gap-1.5\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => tableInstance.setPageIndex(0)}\n disabled={!tableInstance.getCanPreviousPage()}\n className=\"h-9 w-9 p-0\"\n >\n <span className=\"sr-only\">First page</span>\n <ChevronsLeft className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => tableInstance.previousPage()}\n disabled={!tableInstance.getCanPreviousPage()}\n className=\"h-9 w-9 p-0\"\n >\n <span className=\"sr-only\">Previous page</span>\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n <div className=\"flex items-center justify-center text-sm font-medium min-w-[110px]\">\n Page {currentPage} of {totalPages}\n </div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => tableInstance.nextPage()}\n disabled={!tableInstance.getCanNextPage()}\n className=\"h-9 w-9 p-0\"\n >\n <span className=\"sr-only\">Next page</span>\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => tableInstance.setPageIndex(tableInstance.getPageCount() - 1)}\n disabled={!tableInstance.getCanNextPage()}\n className=\"h-9 w-9 p-0\"\n >\n <span className=\"sr-only\">Last page</span>\n <ChevronsRight className=\"h-4 w-4\" />\n </Button>\n </div>\n )}\n </div>\n )\n}\n","import type { Column } from \"@tanstack/react-table\"\nimport { ChevronDown, ChevronUp, ChevronsUpDown } from \"lucide-react\"\nimport { Button } from \"./button\"\nimport { cn } from \"@/lib/utils\"\n\nexport interface SortableHeaderProps<TData, TValue>\n extends React.HTMLAttributes<HTMLDivElement> {\n column: Column<TData, TValue>\n title: string\n align?: \"left\" | \"center\" | \"right\"\n}\n\nexport function SortableHeader<TData, TValue>({\n column,\n title,\n align = \"left\",\n className,\n}: SortableHeaderProps<TData, TValue>) {\n const canSort = column.getCanSort()\n const sortDirection = column.getIsSorted()\n\n const alignmentClasses = {\n left: \"\",\n center: \"text-center\",\n right: \"text-right\",\n }\n\n const getSortIcon = () => {\n if (sortDirection === \"asc\") return <ChevronDown className=\"h-4 w-4\" />\n if (sortDirection === \"desc\") return <ChevronUp className=\"h-4 w-4\" />\n return <ChevronsUpDown className=\"h-4 w-4\" />\n }\n\n if (!canSort) {\n return (\n <div className={cn(\"px-2 py-1\", className)}>\n {title}\n </div>\n )\n }\n\n return (\n <div className={cn(alignmentClasses[align])}>\n <Button\n variant=\"ghost\"\n className=\"h-auto px-2 py-1 font-normal hover:bg-transparent hover:text-gray-900\"\n onClick={() => column.toggleSorting(sortDirection === \"asc\")}\n >\n {title}\n {getSortIcon()}\n </Button>\n </div>\n )\n}\n","import * as React from \"react\"\nimport { ChevronLeft, ChevronRight, Calendar as CalendarIcon } from \"lucide-react\"\nimport { Button } from \"./ui/button\"\nimport { cn } from \"@/lib/utils\"\nimport type { Holiday } from \"./DatePicker\"\n\nexport interface CalendarEvent {\n date: Date\n title: string\n type?: string\n time?: string\n id?: string\n location?: string\n}\n\nexport interface CalendarProps {\n selected?: Date\n onSelect?: (date: Date) => void\n events?: CalendarEvent[]\n holidays?: Holiday[]\n className?: string\n}\n\n// Utility functions for date manipulation\nconst startOfMonth = (date: Date): Date => {\n return new Date(date.getFullYear(), date.getMonth(), 1)\n}\n\nconst endOfMonth = (date: Date): Date => {\n return new Date(date.getFullYear(), date.getMonth() + 1, 0)\n}\n\nconst eachDayOfInterval = (start: Date, end: Date): Date[] => {\n const days: Date[] = []\n const current = new Date(start)\n while (current <= end) {\n days.push(new Date(current))\n current.setDate(current.getDate() + 1)\n }\n return days\n}\n\nconst isSameMonth = (date1: Date, date2: Date): boolean => {\n return date1.getMonth() === date2.getMonth() && date1.getFullYear() === date2.getFullYear()\n}\n\nconst isSameDay = (date1: Date, date2: Date): boolean => {\n return date1.getDate() === date2.getDate() && \n date1.getMonth() === date2.getMonth() && \n date1.getFullYear() === date2.getFullYear()\n}\n\nconst isToday = (date: Date): boolean => {\n return isSameDay(date, new Date())\n}\n\nconst isTomorrow = (date: Date): boolean => {\n const tomorrow = new Date()\n tomorrow.setDate(tomorrow.getDate() + 1)\n return isSameDay(date, tomorrow)\n}\n\nconst addMonths = (date: Date, months: number): Date => {\n const newDate = new Date(date)\n newDate.setMonth(newDate.getMonth() + months)\n return newDate\n}\n\nconst formatDate = (date: Date, format: string): string => {\n const monthNames = [\n \"January\", \"February\", \"March\", \"April\", \"May\", \"June\",\n \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"\n ]\n const monthNamesShort = [\n \"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\",\n \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"\n ]\n \n if (format === \"MMMM yyyy\") {\n return `${monthNames[date.getMonth()]} ${date.getFullYear()}`\n }\n if (format === \"MMM d, yyyy\") {\n return `${monthNamesShort[date.getMonth()]} ${date.getDate()}, ${date.getFullYear()}`\n }\n if (format === \"d\") {\n return date.getDate().toString()\n }\n return date.toLocaleDateString()\n}\n\nexport function Calendar({\n selected,\n onSelect,\n events = [],\n holidays = [],\n className,\n ...props\n}: CalendarProps) {\n const [currentMonth, setCurrentMonth] = React.useState(new Date())\n const [view, setView] = React.useState<'calendar' | 'months' | 'years'>('calendar')\n\n const monthStart = startOfMonth(currentMonth)\n const monthEnd = endOfMonth(currentMonth)\n const days = eachDayOfInterval(monthStart, monthEnd)\n\n const months = [\n \"January\", \"February\", \"March\", \"April\", \"May\", \"June\",\n \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"\n ]\n\n const dayNames = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"]\n\n const currentYear = currentMonth.getFullYear()\n const years = Array.from({ length: 20 }, (_, i) => currentYear - 10 + i)\n\n const previousMonth = () => {\n setCurrentMonth(addMonths(currentMonth, -1))\n }\n\n const nextMonth = () => {\n setCurrentMonth(addMonths(currentMonth, 1))\n }\n\n const previousYear = () => {\n const newDate = new Date(currentMonth)\n newDate.setFullYear(currentYear - 1)\n setCurrentMonth(newDate)\n }\n\n const nextYear = () => {\n const newDate = new Date(currentMonth)\n newDate.setFullYear(currentYear + 1)\n setCurrentMonth(newDate)\n }\n\n const selectMonth = (monthIndex: number) => {\n const newDate = new Date(currentMonth)\n newDate.setMonth(monthIndex)\n setCurrentMonth(newDate)\n setView('calendar')\n }\n\n const selectYear = (year: number) => {\n const newDate = new Date(currentMonth)\n newDate.setFullYear(year)\n setCurrentMonth(newDate)\n setView('calendar')\n }\n\n const getEventsForDay = (day: Date) => {\n return events.filter(event => isSameDay(event.date, day))\n }\n\n const isHoliday = (checkDate: Date) => {\n return holidays.some(h => isSameDay(h.date, checkDate))\n }\n\n // Month picker view\n if (view === 'months') {\n return (\n <div className={cn(\"bg-white rounded-lg border border-gray-200 w-full\", className)} {...props}>\n <div className=\"px-6 py-4 border-b border-gray-100\">\n <div className=\"flex items-center justify-between\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setView('calendar')}\n className=\"h-9 px-3 text-sm font-medium text-gray-600 hover:text-gray-900 hover:bg-gray-50 rounded\"\n >\n ← Back\n </Button>\n \n <div className=\"flex items-center space-x-1\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={previousYear}\n className=\"h-9 w-9 p-0 border-gray-200 rounded\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n \n <Button\n variant=\"ghost\"\n onClick={() => setView('years')}\n className=\"h-9 px-4 text-lg font-semibold text-gray-900 hover:bg-gray-50 rounded\"\n >\n {currentYear}\n </Button>\n \n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={nextYear}\n className=\"h-9 w-9 p-0 border-gray-200 rounded\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n </div>\n\n <div className=\"p-6\">\n <div className=\"grid grid-cols-3 gap-2\">\n {months.map((month, index) => (\n <Button\n key={month}\n variant=\"ghost\"\n onClick={() => selectMonth(index)}\n className={cn(\n \"h-11 w-full text-sm font-medium rounded transition-all duration-200\",\n index === currentMonth.getMonth() \n ? \"bg-gray-900 text-white hover:bg-gray-800 shadow-sm\" \n : \"text-gray-600 hover:text-gray-900 hover:bg-gray-50\"\n )}\n >\n {month}\n </Button>\n ))}\n </div>\n </div>\n </div>\n )\n }\n\n // Year picker view\n if (view === 'years') {\n return (\n <div className={cn(\"bg-white rounded-lg border border-gray-200 w-full\", className)} {...props}>\n <div className=\"px-6 py-4 border-b border-gray-100\">\n <div className=\"flex items-center justify-between\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setView('months')}\n className=\"h-9 px-3 text-sm font-medium text-gray-600 hover:text-gray-900 hover:bg-gray-50 rounded\"\n >\n ← Back\n </Button>\n \n <h3 className=\"text-lg font-semibold text-gray-900\">Select Year</h3>\n </div>\n </div>\n\n <div className=\"p-6\">\n <div className=\"grid grid-cols-4 gap-2 max-h-64 overflow-y-auto\">\n {years.map((year) => (\n <Button\n key={year}\n variant=\"ghost\"\n onClick={() => selectYear(year)}\n className={cn(\n \"h-11 w-full text-sm font-medium rounded transition-all duration-200\",\n year === currentYear \n ? \"bg-gray-900 text-white hover:bg-gray-800 shadow-sm\" \n : \"text-gray-600 hover:text-gray-900 hover:bg-gray-50\"\n )}\n >\n {year}\n </Button>\n ))}\n </div>\n </div>\n </div>\n )\n }\n\n // Default calendar view\n return (\n <div className={cn(\"bg-white rounded-lg border border-gray-200 w-full\", className)} {...props}>\n {/* Month/Year Navigation */}\n <div className=\"px-6 py-4 border-b border-gray-100\">\n <div className=\"flex items-center justify-between\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={previousMonth}\n className=\"h-9 w-9 p-0 border-gray-200 rounded\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n \n <Button\n variant=\"ghost\"\n onClick={() => setView('months')}\n className=\"h-9 px-4 text-lg font-semibold text-gray-900 hover:bg-gray-50 rounded\"\n >\n {formatDate(currentMonth, \"MMMM yyyy\")}\n </Button>\n\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={nextMonth}\n className=\"h-9 w-9 p-0 border-gray-200 rounded\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n\n {/* Calendar Body */}\n <div className=\"p-6\">\n {/* Weekday headers */}\n <div className=\"grid grid-cols-7 gap-1 mb-2\">\n {dayNames.map((day, index) => (\n <div key={index} className=\"h-10 flex items-center justify-center\">\n <span className=\"text-xs font-medium text-gray-400 uppercase\">\n {day}\n </span>\n </div>\n ))}\n </div>\n\n {/* Calendar grid */}\n <div className=\"grid grid-cols-7 gap-1\">\n {Array.from({ length: monthStart.getDay() }).map((_, index) => (\n <div key={`empty-${index}`} className=\"h-12\" />\n ))}\n {days.map((day) => {\n const dayEvents = getEventsForDay(day)\n const isSelectedDay = selected && isSameDay(day, selected)\n const isTodayDay = isToday(day)\n const isCurrentMonth = isSameMonth(day, currentMonth)\n const isHolidayDay = isHoliday(day)\n\n return (\n <div key={day.toISOString()} className=\"relative\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={cn(\n \"h-12 w-full p-0 text-sm relative rounded transition-all duration-200\",\n !isCurrentMonth && \"text-gray-300\",\n isCurrentMonth && !isSelectedDay && !isTodayDay && !isHolidayDay && \"text-gray-700 hover:bg-gray-50\",\n isHolidayDay && !isSelectedDay && \"text-red-600 font-medium hover:bg-red-50\",\n isTodayDay && !isSelectedDay && \"bg-gray-100 text-gray-900 font-medium border border-gray-200\",\n isSelectedDay && \"bg-gray-900 text-white font-medium shadow-sm\",\n )}\n onClick={() => onSelect?.(day)}\n >\n {formatDate(day, \"d\")}\n \n {/* Event indicators */}\n {dayEvents.length > 0 && (\n <div className=\"absolute bottom-1 left-1/2 transform -translate-x-1/2 flex space-x-0.5\">\n {dayEvents.slice(0, 3).map((event, idx) => {\n const getEventColor = (type?: string) => {\n if (isSelectedDay) return \"bg-white/80\"\n switch (type) {\n case \"class\": return \"bg-blue-500\"\n case \"meeting\": return \"bg-green-500\"\n case \"appointment\": return \"bg-orange-500\"\n case \"deadline\": return \"bg-red-500\"\n default: return \"bg-gray-500\"\n }\n }\n \n return (\n <div\n key={idx}\n className={cn(\n \"w-1 h-1 rounded-full\",\n getEventColor(event.type)\n )}\n />\n )\n })}\n {dayEvents.length > 3 && (\n <div className={cn(\n \"w-1 h-1 rounded-full\",\n isSelectedDay ? \"bg-white/60\" : \"bg-gray-400\"\n )} />\n )}\n </div>\n )}\n </Button>\n </div>\n )\n })}\n </div>\n </div>\n\n {/* Events Section */}\n {selected && (\n <div className=\"border-t border-gray-100\">\n <div className=\"p-6\">\n <div className=\"flex items-center justify-between mb-4\">\n <h4 className=\"text-sm font-semibold text-gray-900\">\n {isToday(selected) \n ? \"Today\"\n : isTomorrow(selected) \n ? \"Tomorrow\"\n : formatDate(selected, \"MMM d, yyyy\")\n }\n </h4>\n </div>\n \n {(() => {\n const dayEvents = events.filter(event => isSameDay(event.date, selected))\n \n return (\n <div className=\"space-y-3\">\n {dayEvents.length > 0 && dayEvents.map((event) => {\n const getEventTypeStyles = (type?: string) => {\n switch (type) {\n case \"class\": return { bg: \"bg-blue-50\", border: \"border-blue-100\", dot: \"bg-blue-500\", text: \"text-blue-900\", subtext: \"text-blue-600\" }\n case \"meeting\": return { bg: \"bg-green-50\", border: \"border-green-100\", dot: \"bg-green-500\", text: \"text-green-900\", subtext: \"text-green-600\" }\n case \"appointment\": return { bg: \"bg-orange-50\", border: \"border-orange-100\", dot: \"bg-orange-500\", text: \"text-orange-900\", subtext: \"text-orange-600\" }\n case \"deadline\": return { bg: \"bg-red-50\", border: \"border-red-100\", dot: \"bg-red-500\", text: \"text-red-900\", subtext: \"text-red-600\" }\n default: return { bg: \"bg-gray-50\", border: \"border-gray-100\", dot: \"bg-gray-500\", text: \"text-gray-900\", subtext: \"text-gray-600\" }\n }\n }\n \n const styles = getEventTypeStyles(event.type)\n \n return (\n <div key={event.id || event.title} className={`flex items-center space-x-3 p-3 ${styles.bg} rounded border ${styles.border} hover:shadow-sm transition-shadow cursor-pointer`}>\n <div className={`w-2 h-2 rounded-full ${styles.dot} flex-shrink-0`} />\n <div className=\"flex-1 min-w-0\">\n <p className={`text-sm font-medium ${styles.text} truncate`}>{event.title}</p>\n {(event.time || event.location) && (\n <p className={`text-xs ${styles.subtext} truncate`}>\n {event.time}\n {event.time && event.location && ' • '}\n {event.location}\n </p>\n )}\n </div>\n </div>\n )\n })}\n \n {dayEvents.length === 0 && (\n <div className=\"text-center py-8\">\n <div className=\"w-12 h-12 bg-gray-100 rounded-full flex items-center justify-center mx-auto mb-3\">\n <CalendarIcon className=\"w-5 h-5 text-gray-400\" />\n </div>\n <p className=\"text-sm text-gray-500\">No events scheduled</p>\n </div>\n )}\n </div>\n )\n })()}\n </div>\n </div>\n )}\n\n {/* Footer with today button */}\n {!isSameMonth(currentMonth, new Date()) && (\n <div className=\"p-6 pt-0\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => {\n const today = new Date()\n setCurrentMonth(today)\n onSelect?.(today)\n setView('calendar')\n }}\n className=\"w-full h-10 text-sm font-medium border-gray-200 hover:bg-gray-50 rounded\"\n >\n Today\n </Button>\n </div>\n )}\n </div>\n )\n}\n","import * as React from \"react\"\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\"\nimport { cn } from \"@/lib/utils\"\n\nconst Popover = PopoverPrimitive.Root\n\nconst PopoverTrigger = PopoverPrimitive.Trigger\n\nconst PopoverAnchor = PopoverPrimitive.Anchor\n\nconst PopoverContent = React.forwardRef<\n React.ElementRef<typeof PopoverPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\n>(({ className, align = \"center\", sideOffset = 4, ...props }, ref) => {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 w-auto rounded-md border border-gray-200 bg-white p-3 text-gray-950 shadow-lg outline-none\",\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n \"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95\",\n \"data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2\",\n \"data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n )\n})\nPopoverContent.displayName = PopoverPrimitive.Content.displayName\n\nexport { Popover, PopoverTrigger, PopoverContent, PopoverAnchor }\n","import * as React from \"react\"\nimport { format, startOfMonth, endOfMonth, eachDayOfInterval, isSameDay, isToday, isSameMonth, addMonths, subMonths } from \"date-fns\"\nimport { Calendar as CalendarIcon, ChevronLeft, ChevronRight } from \"lucide-react\"\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"./ui/button\"\nimport { Popover, PopoverContent, PopoverTrigger } from \"./ui/popover\"\n\nexport interface Holiday {\n date: Date\n name: string\n country?: string\n}\n\nexport interface DatePickerProps {\n /** The selected date */\n date?: Date\n /** Callback when date changes */\n onDateChange?: (date: Date | undefined) => void\n /** Mode: single date or range */\n mode?: 'single' | 'range'\n /** Selected date range (for range mode) */\n dateRange?: { from?: Date; to?: Date }\n /** Callback when date range changes (for range mode) */\n onDateRangeChange?: (range: { from?: Date; to?: Date } | undefined) => void\n /** Placeholder text when no date is selected */\n placeholder?: string\n /** Date format string (default: \"PPP\") */\n dateFormat?: string\n /** Disabled state */\n disabled?: boolean\n /** Custom className for the trigger button */\n className?: string\n /** Button variant */\n variant?: \"default\" | \"outline\" | \"ghost\"\n /** Button size */\n size?: \"default\" | \"sm\" | \"lg\"\n /** Alignment of the popover */\n align?: \"start\" | \"center\" | \"end\"\n /** Show icon in button */\n showIcon?: boolean\n /** Custom icon */\n icon?: React.ReactNode\n /** Minimum selectable date */\n minDate?: Date\n /** Maximum selectable date */\n maxDate?: Date\n /** Array of disabled dates */\n disabledDates?: Date[]\n /** Function to determine if a date should be disabled */\n isDateDisabled?: (date: Date) => boolean\n /** Full width button */\n fullWidth?: boolean\n /** Custom trigger element */\n customTrigger?: React.ReactNode\n /** Number of months to display (1 or 2) */\n numberOfMonths?: 1 | 2\n /** Array of holidays to display */\n holidays?: Holiday[]\n}\n\nexport function DatePicker({\n date,\n onDateChange,\n mode = 'single',\n dateRange,\n onDateRangeChange,\n placeholder = \"Pick a date\",\n dateFormat = \"PPP\",\n disabled = false,\n className,\n variant = \"outline\",\n size = \"default\",\n align = \"start\",\n showIcon = true,\n icon,\n minDate,\n maxDate,\n disabledDates,\n isDateDisabled,\n fullWidth = false,\n customTrigger,\n numberOfMonths = 1,\n holidays = [],\n}: DatePickerProps) {\n const [open, setOpen] = React.useState(false)\n const [currentMonth, setCurrentMonth] = React.useState(date || new Date())\n const [view, setView] = React.useState<'calendar' | 'months' | 'years'>('calendar')\n const [rangeStart, setRangeStart] = React.useState<Date | undefined>(dateRange?.from)\n const [rangeEnd, setRangeEnd] = React.useState<Date | undefined>(dateRange?.to)\n const [hoverDate, setHoverDate] = React.useState<Date | undefined>()\n\n // Sync range state with prop changes\n React.useEffect(() => {\n setRangeStart(dateRange?.from)\n setRangeEnd(dateRange?.to)\n }, [dateRange])\n\n // Sync currentMonth with date prop and reset view when opening\n React.useEffect(() => {\n if (open) {\n setView('calendar')\n if (mode === 'single' && date) {\n setCurrentMonth(date)\n } else if (mode === 'range' && dateRange?.from) {\n setCurrentMonth(dateRange.from)\n }\n }\n }, [open, date, dateRange, mode])\n\n const handleSelect = (selectedDate: Date) => {\n if (mode === 'range') {\n if (!rangeStart || (rangeStart && rangeEnd)) {\n // Start new range\n setRangeStart(selectedDate)\n setRangeEnd(undefined)\n onDateRangeChange?.({ from: selectedDate, to: undefined })\n } else {\n // Complete the range\n const from = rangeStart < selectedDate ? rangeStart : selectedDate\n const to = rangeStart < selectedDate ? selectedDate : rangeStart\n setRangeStart(from)\n setRangeEnd(to)\n onDateRangeChange?.({ from, to })\n setOpen(false)\n }\n } else {\n onDateChange?.(selectedDate)\n setOpen(false)\n }\n }\n\n const isDateDisabledCheck = (checkDate: Date) => {\n if (disabledDates?.some(d => d.toDateString() === checkDate.toDateString())) {\n return true\n }\n if (minDate && checkDate < minDate) return true\n if (maxDate && checkDate > maxDate) return true\n if (isDateDisabled?.(checkDate)) return true\n return false\n }\n\n const isHoliday = (checkDate: Date) => {\n return holidays.some(h => isSameDay(h.date, checkDate))\n }\n\n const monthStart = startOfMonth(currentMonth)\n const monthEnd = endOfMonth(currentMonth)\n const days = eachDayOfInterval({ start: monthStart, end: monthEnd })\n const dayNames = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"]\n\n const nextMonthDate = addMonths(currentMonth, 1)\n const nextMonthStart = startOfMonth(nextMonthDate)\n const nextMonthEnd = endOfMonth(nextMonthDate)\n const nextMonthDays = eachDayOfInterval({ start: nextMonthStart, end: nextMonthEnd })\n\n const previousMonth = () => {\n setCurrentMonth(subMonths(currentMonth, 1))\n }\n\n const nextMonth = () => {\n setCurrentMonth(addMonths(currentMonth, 1))\n }\n\n const formatDate = (date: Date, formatStr: string) => {\n return format(date, formatStr)\n }\n\n const isInRange = (day: Date) => {\n if (rangeStart && rangeEnd) {\n return day >= rangeStart && day <= rangeEnd\n }\n if (rangeStart && !rangeEnd && hoverDate) {\n const start = rangeStart < hoverDate ? rangeStart : hoverDate\n const end = rangeStart < hoverDate ? hoverDate : rangeStart\n return day >= start && day <= end\n }\n return false\n }\n\n const isRangeStart = (day: Date) => {\n return rangeStart && isSameDay(day, rangeStart)\n }\n\n const isRangeEnd = (day: Date) => {\n return rangeEnd && isSameDay(day, rangeEnd)\n }\n\n const previousYear = () => {\n const newDate = new Date(currentMonth)\n newDate.setFullYear(currentYear - 1)\n setCurrentMonth(newDate)\n }\n\n const nextYear = () => {\n const newDate = new Date(currentMonth)\n newDate.setFullYear(currentYear + 1)\n setCurrentMonth(newDate)\n }\n\n const selectMonth = (monthIndex: number) => {\n const newDate = new Date(currentMonth.getFullYear(), monthIndex, 1)\n setCurrentMonth(newDate)\n setView('calendar')\n }\n\n const selectYear = (year: number) => {\n const newDate = new Date(year, currentMonth.getMonth(), 1)\n setCurrentMonth(newDate)\n setView('calendar')\n }\n\n const monthNames = [\n 'January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December'\n ]\n\n const currentYear = currentMonth.getFullYear()\n const years = Array.from({ length: 20 }, (_, i) => currentYear - 10 + i)\n\n const triggerContent = customTrigger || (\n <Button\n variant={variant}\n size={size}\n className={cn(\n \"justify-start text-left font-normal\",\n !date && !rangeStart && \"text-gray-500\",\n fullWidth && \"w-full\",\n className\n )}\n disabled={disabled}\n >\n {showIcon && (icon || <CalendarIcon className=\"mr-2 h-4 w-4\" />)}\n {mode === 'range' ? (\n rangeStart && rangeEnd ? (\n <span>{format(rangeStart, dateFormat)} - {format(rangeEnd, dateFormat)}</span>\n ) : rangeStart ? (\n <span>{format(rangeStart, dateFormat)} - ...</span>\n ) : (\n <span>{placeholder}</span>\n )\n ) : (\n date ? format(date, dateFormat) : <span>{placeholder}</span>\n )}\n </Button>\n )\n\n const renderDayCell = (day: Date, isCurrentMonth: boolean) => {\n const isSelectedDay = mode === 'single' ? (date && isSameDay(day, date)) : (isRangeStart(day) || isRangeEnd(day))\n const isTodayDay = isToday(day)\n const isDisabled = isDateDisabledCheck(day)\n const inRange = mode === 'range' && isInRange(day)\n const isHolidayDay = isHoliday(day)\n const dayOfWeek = day.getDay()\n const isRangeStartDay = isRangeStart(day)\n const isRangeEndDay = isRangeEnd(day)\n\n return (\n <div\n key={day.toISOString()}\n className={cn(\n \"relative p-0.5\",\n inRange && \"bg-gray-100\",\n inRange && dayOfWeek === 0 && \"rounded-l-md\",\n inRange && dayOfWeek === 6 && \"rounded-r-md\",\n inRange && isRangeStartDay && \"rounded-l-md\",\n inRange && isRangeEndDay && \"rounded-r-md\"\n )}\n onMouseEnter={() => mode === 'range' && rangeStart && !rangeEnd && setHoverDate(day)}\n onMouseLeave={() => setHoverDate(undefined)}\n >\n <Button\n variant=\"ghost\"\n size=\"sm\"\n disabled={isDisabled || disabled}\n className={cn(\n \"h-10 w-full p-0 text-sm relative transition-all duration-200 rounded-md text-gray-900\",\n !isCurrentMonth && \"text-gray-300\",\n isHolidayDay && !isSelectedDay && \"text-red-600 font-medium\",\n isTodayDay && !isSelectedDay && !inRange && \"bg-gray-50 text-gray-900 font-medium border border-gray-200\",\n isSelectedDay && \"bg-gray-900 text-white font-medium shadow-sm z-10 hover:bg-gray-800\",\n inRange && !isSelectedDay && \"text-gray-900 bg-gray-100\",\n isDisabled && \"opacity-40 cursor-not-allowed\"\n )}\n onClick={() => !isDisabled && handleSelect(day)}\n >\n {formatDate(day, \"d\")}\n </Button>\n </div>\n )\n }\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n {triggerContent}\n </PopoverTrigger>\n <PopoverContent \n className={cn(\n \"p-0 border-gray-200\",\n numberOfMonths === 2 ? \"w-[640px]\" : \"w-80\"\n )}\n align={align} \n side=\"bottom\" \n sideOffset={4} \n collisionPadding={8}\n >\n <div className=\"bg-white rounded-lg\" data-takaui=\"datepicker\">\n {/* Calendar Header */}\n <div className=\"border-b border-gray-100 px-6 py-4\">\n <div className=\"flex items-center justify-between\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={previousMonth}\n className=\"h-9 w-9 p-0\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n\n {numberOfMonths === 2 ? (\n <div className=\"flex items-center gap-1\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setView('months')}\n className=\"h-9 px-3 font-semibold text-base\"\n >\n {formatDate(currentMonth, \"MMMM\")}\n </Button>\n <span className=\"text-gray-400 text-sm\">-</span>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setView('months')}\n className=\"h-9 px-3 font-semibold text-base\"\n >\n {formatDate(nextMonthDate, \"MMMM yyyy\")}\n </Button>\n </div>\n ) : (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setView('months')}\n className=\"h-9 px-4 font-semibold text-lg\"\n >\n {formatDate(currentMonth, \"MMMM yyyy\")}\n </Button>\n )}\n\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={nextMonth}\n className=\"h-9 w-9 p-0\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n\n {/* Calendar Body */}\n <div className=\"p-6\">\n {view === 'years' && (\n <>\n <div className=\"flex items-center justify-between\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setView('months')}\n className=\"h-9 px-3 text-sm font-medium text-gray-600\"\n >\n ← Back\n </Button>\n <h3 className=\"text-lg font-semibold text-gray-900\">Select Year</h3>\n </div>\n <div className=\"grid grid-cols-4 gap-2 max-h-64 overflow-y-auto\">\n {years.map((year) => (\n <Button\n key={year}\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => selectYear(year)}\n className={cn(\n \"h-11 w-full text-sm font-medium rounded-md transition-all duration-200\",\n year === currentYear\n ? \"bg-gray-900 text-white shadow-sm hover:bg-gray-800\"\n : \"text-gray-900 bg-transparent\"\n )}\n >\n {year}\n </Button>\n ))}\n </div>\n </>\n )}\n\n {view === 'months' && (\n <>\n <div className=\"flex items-center justify-between\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setView('calendar')}\n className=\"h-9 px-3 text-sm font-medium text-gray-600\"\n >\n ← Back\n </Button>\n \n <div className=\"flex items-center gap-1\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={previousYear}\n className=\"h-9 w-9 p-0\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n \n <Button\n variant=\"ghost\"\n onClick={() => setView('years')}\n className=\"h-9 px-4 text-lg font-semibold text-gray-900\"\n >\n {currentYear}\n </Button>\n \n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={nextYear}\n className=\"h-9 w-9 p-0\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n <div className=\"grid grid-cols-3 gap-2\">\n {monthNames.map((month, index) => (\n <Button\n key={month}\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => selectMonth(index)}\n className={cn(\n \"h-11 w-full text-sm font-medium rounded-md transition-all duration-200\",\n index === currentMonth.getMonth()\n ? \"bg-gray-900 text-white shadow-sm hover:bg-gray-800\"\n : \"text-gray-900 bg-transparent\"\n )}\n >\n {month}\n </Button>\n ))}\n </div>\n </>\n )}\n\n {view === 'calendar' && (\n <div className={cn(\"flex\", numberOfMonths === 2 ? \"gap-6\" : \"gap-0\")}>\n {/* Current Month */}\n <div className=\"flex-1\">\n {/* Weekday headers */}\n <div className=\"grid grid-cols-7 gap-1 mb-2\">\n {dayNames.map((day, index) => (\n <div key={index} className=\"h-8 flex items-center justify-center\">\n <span className=\"text-xs font-medium text-gray-400 uppercase\">\n {day}\n </span>\n </div>\n ))}\n </div>\n\n {/* Calendar grid */}\n <div className=\"grid grid-cols-7\">\n {Array.from({ length: monthStart.getDay() }).map((_, index) => (\n <div key={`empty-${index}`} className=\"h-10\" />\n ))}\n {days.map((day) => renderDayCell(day, isSameMonth(day, currentMonth)))}\n </div>\n </div>\n\n {/* Next Month */}\n {numberOfMonths === 2 && (\n <div className=\"flex-1\">\n {/* Weekday headers */}\n <div className=\"grid grid-cols-7 gap-1 mb-2\">\n {dayNames.map((day, index) => (\n <div key={index} className=\"h-8 flex items-center justify-center\">\n <span className=\"text-xs font-medium text-gray-400 uppercase\">\n {day}\n </span>\n </div>\n ))}\n </div>\n\n {/* Calendar grid */}\n <div className=\"grid grid-cols-7\">\n {Array.from({ length: nextMonthStart.getDay() }).map((_, index) => (\n <div key={`next-empty-${index}`} className=\"h-10\" />\n ))}\n {nextMonthDays.map((day) => renderDayCell(day, isSameMonth(day, nextMonthDate)))}\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n </PopoverContent>\n </Popover>\n )\n}\n","import React, { useState, useEffect, useRef } from 'react';\nimport { Popover, PopoverContent, PopoverTrigger } from './ui/popover';\nimport { Button } from './ui/button';\nimport { Clock } from 'lucide-react';\nimport { cn } from '../lib/utils';\n\ninterface TimePickerProps {\n time: Date | undefined;\n onTimeChange: (date: Date | undefined) => void;\n timezone?: string;\n onTimezoneChange?: (timezone: string) => void;\n format?: '12h' | '24h';\n showTimezone?: boolean;\n minuteStep?: 1 | 5 | 10 | 15 | 30;\n showSeconds?: boolean;\n placeholder?: string;\n variant?: 'default' | 'outline' | 'ghost';\n size?: 'sm' | 'default' | 'lg';\n showClockFace?: boolean;\n}\n\nexport const TimePicker: React.FC<TimePickerProps> = ({\n time,\n onTimeChange,\n timezone = 'UTC',\n format = '24h',\n showTimezone = false,\n minuteStep = 1,\n showSeconds = false,\n placeholder = 'Select time',\n variant = 'outline',\n size = 'default',\n showClockFace = false,\n}) => {\n const is24Hour = format === '24h';\n \n // Initialize state from time prop to avoid cascading renders\n const initialHours = time ? time.getHours() : 0;\n const initialMinutes = time ? time.getMinutes() : 0;\n const initialSeconds = time ? time.getSeconds() : 0;\n const initialPeriod = initialHours >= 12 ? 'PM' : 'AM';\n \n const [hours, setHours] = useState<number>(initialHours);\n const [minutes, setMinutes] = useState<number>(initialMinutes);\n const [seconds, setSeconds] = useState<number>(initialSeconds);\n const [period, setPeriod] = useState<'AM' | 'PM'>(initialPeriod);\n\n // Input states for editable fields\n const [hourInput, setHourInput] = useState<string>('');\n const [minuteInput, setMinuteInput] = useState<string>('');\n const [secondInput, setSecondInput] = useState<string>('');\n\n const hourInputRef = useRef<HTMLInputElement>(null);\n const minuteInputRef = useRef<HTMLInputElement>(null);\n const secondInputRef = useRef<HTMLInputElement>(null);\n\n const hourScrollRef = useRef<HTMLDivElement>(null);\n const minuteScrollRef = useRef<HTMLDivElement>(null);\n const secondScrollRef = useRef<HTMLDivElement>(null);\n\n // Update internal state when time prop changes\n useEffect(() => {\n if (time) {\n const h = time.getHours();\n const m = time.getMinutes();\n const s = time.getSeconds();\n const p = h >= 12 ? 'PM' : 'AM';\n \n // Only update if values actually changed to prevent loops\n if (h !== hours) setHours(h);\n if (m !== minutes) setMinutes(m);\n if (s !== seconds) setSeconds(s);\n if (p !== period) setPeriod(p);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [time]); // Only depend on time prop\n\n useEffect(() => {\n // Scroll to selected values\n if (hourScrollRef.current) {\n const selectedHour = hourScrollRef.current.querySelector('[data-selected=\"true\"]');\n selectedHour?.scrollIntoView({ block: 'center', behavior: 'smooth' });\n }\n if (minuteScrollRef.current) {\n const selectedMinute = minuteScrollRef.current.querySelector('[data-selected=\"true\"]');\n selectedMinute?.scrollIntoView({ block: 'center', behavior: 'smooth' });\n }\n if (secondScrollRef.current) {\n const selectedSecond = secondScrollRef.current.querySelector('[data-selected=\"true\"]');\n selectedSecond?.scrollIntoView({ block: 'center', behavior: 'smooth' });\n }\n }, [hours, minutes, seconds, is24Hour]);\n\n const updateTime = (h: number, m: number, s: number) => {\n const newTime = new Date();\n newTime.setHours(h);\n newTime.setMinutes(m);\n newTime.setSeconds(s);\n onTimeChange(newTime);\n };\n\n const handleHourChange = (hour: number) => {\n let newHour = hour;\n if (!is24Hour) {\n if (period === 'PM' && hour !== 12) {\n newHour = hour + 12;\n } else if (period === 'AM' && hour === 12) {\n newHour = 0;\n }\n }\n setHours(newHour);\n updateTime(newHour, minutes, seconds);\n };\n\n const handleMinuteChange = (minute: number) => {\n setMinutes(minute);\n updateTime(hours, minute, seconds);\n };\n\n const handleSecondChange = (second: number) => {\n setSeconds(second);\n updateTime(hours, minutes, second);\n };\n\n const handlePeriodToggle = (newPeriod: 'AM' | 'PM') => {\n if (period === newPeriod) return;\n setPeriod(newPeriod);\n const newHour = newPeriod === 'PM' ? \n (hours % 12) + 12 : \n hours % 12;\n setHours(newHour);\n updateTime(newHour, minutes, seconds);\n };\n\n const handleNow = () => {\n const now = new Date();\n setHours(now.getHours());\n setMinutes(now.getMinutes());\n setSeconds(now.getSeconds());\n setPeriod(now.getHours() >= 12 ? 'PM' : 'AM');\n onTimeChange(now);\n };\n\n const formatTime = () => {\n if (!time) return placeholder;\n \n const h = is24Hour ? hours : (hours % 12 || 12);\n const m = minutes.toString().padStart(2, '0');\n const s = seconds.toString().padStart(2, '0');\n \n let timeStr = `${h.toString().padStart(2, '0')}:${m}`;\n if (showSeconds) timeStr += `:${s}`;\n if (!is24Hour) timeStr += ` ${period}`;\n if (showTimezone) timeStr += ` ${timezone}`;\n \n return timeStr;\n };\n\n const generateHours = () => {\n const max = is24Hour ? 23 : 12;\n const start = is24Hour ? 0 : 1;\n return Array.from({ length: max - start + 1 }, (_, i) => start + i);\n };\n\n const generateMinutes = () => {\n return Array.from({ length: Math.floor(60 / minuteStep) }, (_, i) => i * minuteStep);\n };\n\n const generateSeconds = () => {\n return Array.from({ length: 60 }, (_, i) => i);\n };\n\n const displayHour = is24Hour ? hours : (hours % 12 || 12);\n\n // Clock face rendering\n const renderClockFace = () => {\n const size = 200;\n const center = size / 2;\n const hourHandLength = 50;\n const minuteHandLength = 70;\n \n const hourAngle = ((displayHour % 12) * 30 + minutes * 0.5) * (Math.PI / 180) - Math.PI / 2;\n const minuteAngle = (minutes * 6) * (Math.PI / 180) - Math.PI / 2;\n \n const hourX = center + hourHandLength * Math.cos(hourAngle);\n const hourY = center + hourHandLength * Math.sin(hourAngle);\n const minuteX = center + minuteHandLength * Math.cos(minuteAngle);\n const minuteY = center + minuteHandLength * Math.sin(minuteAngle);\n\n return (\n <svg width={size} height={size} className=\"mx-auto\">\n {/* Clock circle */}\n <circle cx={center} cy={center} r={95} fill=\"white\" stroke=\"#e5e7eb\" strokeWidth=\"2\" />\n \n {/* Hour markers */}\n {Array.from({ length: 12 }, (_, i) => {\n const angle = (i * 30) * (Math.PI / 180) - Math.PI / 2;\n const x = center + 80 * Math.cos(angle);\n const y = center + 80 * Math.sin(angle);\n return (\n <text\n key={i}\n x={x}\n y={y}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n className=\"text-sm fill-gray-600\"\n >\n {i === 0 ? 12 : i}\n </text>\n );\n })}\n \n {/* Hour hand */}\n <line\n x1={center}\n y1={center}\n x2={hourX}\n y2={hourY}\n stroke=\"#374151\"\n strokeWidth=\"6\"\n strokeLinecap=\"round\"\n />\n \n {/* Minute hand */}\n <line\n x1={center}\n y1={center}\n x2={minuteX}\n y2={minuteY}\n stroke=\"#ef4444\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n />\n \n {/* Center dot */}\n <circle cx={center} cy={center} r=\"6\" fill=\"#ef4444\" />\n </svg>\n );\n };\n\n return (\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant={variant}\n size={size}\n className={cn(\n 'justify-start text-left font-normal',\n !time && 'text-muted-foreground'\n )}\n >\n <Clock className=\"mr-2 h-4 w-4\" />\n {formatTime()}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-0\" align=\"start\">\n <div className=\"p-6 space-y-4 min-w-[460px]\">\n {/* Time Display with AM/PM buttons */}\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-center gap-6\">\n {/* Time Display - Editable */}\n <div className=\"flex items-center gap-1\">\n <input\n ref={hourInputRef}\n type=\"text\"\n inputMode=\"numeric\"\n value={hourInput !== '' ? hourInput.padStart(2, '0') : displayHour.toString().padStart(2, '0')}\n onKeyDown={(e) => {\n if (e.key >= '0' && e.key <= '9') {\n e.preventDefault();\n const newVal = hourInput + e.key;\n if (newVal.length === 1) {\n setHourInput(e.key);\n } else if (newVal.length === 2) {\n const num = parseInt(newVal);\n const max = is24Hour ? 23 : 12;\n const min = is24Hour ? 0 : 1;\n let validVal = num;\n \n // Validate range\n if (num < min) validVal = min;\n if (num > max) validVal = max;\n \n setHourInput('');\n handleHourChange(validVal);\n setTimeout(() => minuteInputRef.current?.focus(), 0);\n }\n } else if (e.key === 'Backspace') {\n e.preventDefault();\n if (hourInput.length > 0) {\n setHourInput(hourInput.slice(0, -1));\n }\n } else if (e.key === 'ArrowRight' || e.key === 'Tab') {\n if (e.key === 'ArrowRight') e.preventDefault();\n minuteInputRef.current?.focus();\n } else if (e.key === ':') {\n e.preventDefault();\n minuteInputRef.current?.focus();\n }\n }}\n onBlur={() => {\n if (hourInput) {\n const val = parseInt(hourInput);\n const max = is24Hour ? 23 : 12;\n const min = is24Hour ? 0 : 1;\n let validVal = val;\n if (val < min) validVal = min;\n if (val > max) validVal = max;\n handleHourChange(validVal);\n }\n setHourInput('');\n }}\n onFocus={() => {\n setHourInput('');\n }}\n className=\"text-6xl font-medium tabular-nums leading-none w-[85px] text-center bg-transparent outline-none focus:ring-2 focus:ring-primary rounded px-1 cursor-text\"\n readOnly\n />\n <div className=\"text-6xl font-medium leading-none flex items-center px-1\">:</div>\n <input\n ref={minuteInputRef}\n type=\"text\"\n inputMode=\"numeric\"\n value={minuteInput !== '' ? minuteInput.padStart(2, '0') : minutes.toString().padStart(2, '0')}\n onKeyDown={(e) => {\n if (e.key >= '0' && e.key <= '9') {\n e.preventDefault();\n const newVal = minuteInput + e.key;\n if (newVal.length === 1) {\n setMinuteInput(e.key);\n } else if (newVal.length === 2) {\n const num = parseInt(newVal);\n const validVal = Math.min(59, Math.max(0, num));\n setMinuteInput('');\n handleMinuteChange(validVal);\n if (showSeconds) {\n setTimeout(() => secondInputRef.current?.focus(), 0);\n }\n }\n } else if (e.key === 'Backspace') {\n e.preventDefault();\n if (minuteInput.length > 0) {\n setMinuteInput(minuteInput.slice(0, -1));\n } else {\n hourInputRef.current?.focus();\n }\n } else if (e.key === 'ArrowLeft') {\n e.preventDefault();\n hourInputRef.current?.focus();\n } else if (e.key === 'ArrowRight' || e.key === 'Tab') {\n if (e.key === 'ArrowRight') e.preventDefault();\n if (showSeconds) {\n secondInputRef.current?.focus();\n }\n } else if (e.key === ':') {\n e.preventDefault();\n if (showSeconds) {\n secondInputRef.current?.focus();\n }\n }\n }}\n onBlur={() => {\n if (minuteInput) {\n const val = parseInt(minuteInput);\n const validVal = Math.min(59, Math.max(0, val));\n handleMinuteChange(validVal);\n }\n setMinuteInput('');\n }}\n onFocus={() => {\n setMinuteInput('');\n }}\n className=\"text-6xl font-medium tabular-nums leading-none w-[85px] text-center bg-transparent outline-none focus:ring-2 focus:ring-primary rounded px-1 cursor-text\"\n readOnly\n />\n {showSeconds && (\n <>\n <div className=\"text-6xl font-medium leading-none flex items-center px-1\">:</div>\n <input\n ref={secondInputRef}\n type=\"text\"\n inputMode=\"numeric\"\n value={secondInput !== '' ? secondInput.padStart(2, '0') : seconds.toString().padStart(2, '0')}\n onKeyDown={(e) => {\n if (e.key >= '0' && e.key <= '9') {\n e.preventDefault();\n const newVal = secondInput + e.key;\n if (newVal.length === 1) {\n setSecondInput(e.key);\n } else if (newVal.length === 2) {\n const num = parseInt(newVal);\n const validVal = Math.min(59, Math.max(0, num));\n setSecondInput('');\n handleSecondChange(validVal);\n }\n } else if (e.key === 'Backspace') {\n e.preventDefault();\n if (secondInput.length > 0) {\n setSecondInput(secondInput.slice(0, -1));\n } else {\n minuteInputRef.current?.focus();\n }\n } else if (e.key === 'ArrowLeft') {\n e.preventDefault();\n minuteInputRef.current?.focus();\n }\n }}\n onBlur={() => {\n if (secondInput) {\n const val = parseInt(secondInput);\n const validVal = Math.min(59, Math.max(0, val));\n handleSecondChange(validVal);\n }\n setSecondInput('');\n }}\n onFocus={() => {\n setSecondInput('');\n }}\n className=\"text-6xl font-medium tabular-nums leading-none w-[85px] text-center bg-transparent outline-none focus:ring-2 focus:ring-primary rounded px-1 cursor-text\"\n readOnly\n />\n </>\n )}\n </div>\n\n {/* AM/PM Buttons - Right Side */}\n {!is24Hour && (\n <div className=\"flex flex-col gap-1\">\n <Button\n size=\"sm\"\n variant={period === 'AM' ? 'default' : 'outline'}\n onClick={() => handlePeriodToggle('AM')}\n className=\"h-8 w-12 text-xs font-medium\"\n >\n AM\n </Button>\n <Button\n size=\"sm\"\n variant={period === 'PM' ? 'default' : 'outline'}\n onClick={() => handlePeriodToggle('PM')}\n className=\"h-8 w-12 text-xs font-medium\"\n >\n PM\n </Button>\n </div>\n )}\n </div>\n\n {showTimezone && (\n <div className=\"text-xs text-gray-500 text-center\">{timezone}</div>\n )}\n </div>\n\n {showClockFace ? (\n /* Clock Face View */\n <div className=\"space-y-4\">\n {renderClockFace()}\n </div>\n ) : (\n /* Scrollable Column View */\n <div className=\"flex gap-2 justify-center items-start\">\n {/* Hours Column */}\n <div className=\"flex-1 max-w-[80px]\">\n <div className=\"text-xs text-center text-gray-500 mb-2\">Hour</div>\n <div \n ref={hourScrollRef}\n className=\"h-40 overflow-y-scroll border rounded-md scrollbar-thin scrollbar-thumb-gray-300 scrollbar-track-gray-100\"\n >\n {generateHours().map((h) => (\n <button\n key={h}\n data-selected={displayHour === h}\n onClick={() => handleHourChange(h)}\n className={cn(\n \"w-full py-2 text-center transition-colors\",\n displayHour === h\n ? \"bg-blue-500 text-white font-medium\"\n : \"hover:bg-gray-100 text-gray-700\"\n )}\n >\n {h.toString().padStart(2, '0')}\n </button>\n ))}\n </div>\n </div>\n\n {/* Minutes Column */}\n <div className=\"flex-1 max-w-[80px]\">\n <div className=\"text-xs text-center text-gray-500 mb-2\">Min</div>\n <div \n ref={minuteScrollRef}\n className=\"h-40 overflow-y-scroll border rounded-md scrollbar-thin scrollbar-thumb-gray-300 scrollbar-track-gray-100\"\n >\n {generateMinutes().map((m) => (\n <button\n key={m}\n data-selected={minutes === m}\n onClick={() => handleMinuteChange(m)}\n className={cn(\n \"w-full py-2 text-center transition-colors\",\n minutes === m\n ? \"bg-blue-500 text-white font-medium\"\n : \"hover:bg-gray-100 text-gray-700\"\n )}\n >\n {m.toString().padStart(2, '0')}\n </button>\n ))}\n </div>\n </div>\n\n {/* Seconds Column */}\n {showSeconds && (\n <div className=\"flex-1 max-w-[80px]\">\n <div className=\"text-xs text-center text-gray-500 mb-2\">Sec</div>\n <div \n ref={secondScrollRef}\n className=\"h-40 overflow-y-scroll border rounded-md scrollbar-thin scrollbar-thumb-gray-300 scrollbar-track-gray-100\"\n >\n {generateSeconds().map((s) => (\n <button\n key={s}\n data-selected={seconds === s}\n onClick={() => handleSecondChange(s)}\n className={cn(\n \"w-full py-2 text-center transition-colors\",\n seconds === s\n ? \"bg-blue-500 text-white font-medium\"\n : \"hover:bg-gray-100 text-gray-700\"\n )}\n >\n {s.toString().padStart(2, '0')}\n </button>\n ))}\n </div>\n </div>\n )}\n </div>\n )}\n\n {/* Action Buttons */}\n <div className=\"flex gap-2 justify-between pt-2 border-t\">\n <Button size=\"sm\" variant=\"outline\" onClick={handleNow}>\n Now\n </Button>\n <Button size=\"sm\" onClick={() => onTimeChange(time)}>\n Done\n </Button>\n </div>\n </div>\n </PopoverContent>\n </Popover>\n );\n};","import * as React from \"react\"\nimport { cn } from \"@/lib/utils\"\n\nconst Card = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"rounded-lg border border-gray-200 bg-white text-gray-950 shadow-sm\",\n className\n )}\n {...props}\n />\n))\nCard.displayName = \"Card\"\n\nconst CardHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex flex-col space-y-1.5 p-6\", className)}\n {...props}\n />\n))\nCardHeader.displayName = \"CardHeader\"\n\nconst CardTitle = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h3\n ref={ref}\n className={cn(\n \"text-2xl font-semibold leading-none tracking-tight\",\n className\n )}\n {...props}\n />\n))\nCardTitle.displayName = \"CardTitle\"\n\nconst CardDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn(\"text-sm text-gray-500\", className)}\n {...props}\n />\n))\nCardDescription.displayName = \"CardDescription\"\n\nconst CardContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn(\"p-6 pt-0\", className)} {...props} />\n))\nCardContent.displayName = \"CardContent\"\n\nconst CardFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex items-center p-6 pt-0\", className)}\n {...props}\n />\n))\nCardFooter.displayName = \"CardFooter\"\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }\n","import * as React from \"react\"\nimport * as LabelPrimitive from \"@radix-ui/react-label\"\nimport { cn } from \"@/lib/utils\"\n\nconst Label = React.forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <LabelPrimitive.Root\n ref={ref}\n className={cn(\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\",\n className\n )}\n {...props}\n />\n))\nLabel.displayName = LabelPrimitive.Root.displayName\n\nexport { Label }\n","import * as React from \"react\"\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\nimport { X } from \"lucide-react\"\nimport { cn } from \"@/lib/utils\"\n\nconst Modal = DialogPrimitive.Root\n\nconst ModalTrigger = DialogPrimitive.Trigger\n\nconst ModalPortal = DialogPrimitive.Portal\n\nconst ModalClose = DialogPrimitive.Close\n\nconst ModalOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n \"fixed inset-0 z-50 bg-black/50 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n />\n))\nModalOverlay.displayName = DialogPrimitive.Overlay.displayName\n\nconst ModalContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <ModalPortal>\n <ModalOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border border-gray-200 bg-white p-6 shadow-lg duration-200 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-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] rounded-lg\",\n className\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-white transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-gray-950 focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-gray-100\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </ModalPortal>\n))\nModalContent.displayName = DialogPrimitive.Content.displayName\n\nconst ModalHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-1.5 text-center sm:text-left\",\n className\n )}\n {...props}\n />\n)\nModalHeader.displayName = \"ModalHeader\"\n\nconst ModalFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className\n )}\n {...props}\n />\n)\nModalFooter.displayName = \"ModalFooter\"\n\nconst ModalTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn(\n \"text-lg font-semibold leading-none tracking-tight\",\n className\n )}\n {...props}\n />\n))\nModalTitle.displayName = DialogPrimitive.Title.displayName\n\nconst ModalDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-gray-500\", className)}\n {...props}\n />\n))\nModalDescription.displayName = DialogPrimitive.Description.displayName\n\n// Simple Modal wrapper for backwards compatibility\nexport interface SimpleModalProps {\n isOpen: boolean\n onClose: () => void\n title?: string\n description?: string\n children: React.ReactNode\n className?: string\n}\n\nexport function SimpleModal({ isOpen, onClose, title, description, children, className }: SimpleModalProps) {\n return (\n <Modal open={isOpen} onOpenChange={onClose}>\n <ModalContent className={className}>\n {(title || description) && (\n <ModalHeader>\n {title && <ModalTitle>{title}</ModalTitle>}\n {description && <ModalDescription>{description}</ModalDescription>}\n </ModalHeader>\n )}\n {children}\n </ModalContent>\n </Modal>\n )\n}\n\nexport {\n Modal,\n ModalPortal,\n ModalOverlay,\n ModalClose,\n ModalTrigger,\n ModalContent,\n ModalHeader,\n ModalFooter,\n ModalTitle,\n ModalDescription,\n}\n","import * as React from \"react\"\nimport { ChevronLeft, ChevronRight, Calendar } from \"lucide-react\"\nimport { Button } from \"./ui/button\"\nimport { cn } from \"@/lib/utils\"\n\nconst monthNames: string[] = [\n 'January', 'February', 'March', 'April',\n 'May', 'June', 'July', 'August',\n 'September', 'October', 'November', 'December'\n]\n\nexport interface WeekNavigatorProps {\n onWeekChange?: (weekStart: Date) => void\n initialDate?: Date\n className?: string\n compact?: boolean\n}\n\nexport function WeekNavigator({\n onWeekChange,\n initialDate = new Date(),\n className,\n compact = false\n}: WeekNavigatorProps) {\n const [currentWeekStart, setCurrentWeekStart] = React.useState(initialDate)\n const [showCalendar, setShowCalendar] = React.useState(false)\n const [showMonthGrid, setShowMonthGrid] = React.useState(false)\n const [showYearGrid, setShowYearGrid] = React.useState(false)\n const [calendarYear, setCalendarYear] = React.useState(initialDate.getFullYear())\n const [calendarMonth, setCalendarMonth] = React.useState(initialDate.getMonth())\n const [selectedWeekIndex, setSelectedWeekIndex] = React.useState(0)\n const calendarDropdownRef = React.useRef<HTMLDivElement>(null)\n const calendarButtonRef = React.useRef<HTMLDivElement>(null)\n\n // Calculate week dates from a start date\n const calculateWeekDates = (startDate: Date): Date[] => {\n const dates = []\n const start = new Date(startDate)\n const dayOfWeek = start.getDay()\n const diff = dayOfWeek === 0 ? -6 : 1 - dayOfWeek\n start.setDate(start.getDate() + diff)\n\n for (let i = 0; i < 7; i++) {\n const date = new Date(start)\n date.setDate(start.getDate() + i)\n dates.push(date)\n }\n return dates\n }\n\n // Get weeks in a month\n const getWeeksInMonth = (year: number, month: number) => {\n const firstDay = new Date(year, month, 1)\n const lastDay = new Date(year, month + 1, 0)\n const startDate = new Date(firstDay)\n startDate.setDate(firstDay.getDate() - ((firstDay.getDay() + 6) % 7))\n const weeks = []\n const currentWeekStart = new Date(startDate)\n while (currentWeekStart <= lastDay || currentWeekStart.getMonth() === month) {\n const weekEnd = new Date(currentWeekStart)\n weekEnd.setDate(currentWeekStart.getDate() + 6)\n weeks.push({ start: new Date(currentWeekStart), end: new Date(weekEnd) })\n currentWeekStart.setDate(currentWeekStart.getDate() + 7)\n if (weeks.length > 6) break\n }\n return weeks\n }\n\n const formatWeekRange = (start: Date, end: Date) => {\n const startMonth = start.toLocaleDateString('en-US', { month: 'short' })\n const endMonth = end.toLocaleDateString('en-US', { month: 'short' })\n if (startMonth === endMonth) {\n return `${startMonth} ${start.getDate()}-${end.getDate()}`\n } else {\n return `${startMonth} ${start.getDate()}-${endMonth} ${end.getDate()}`\n }\n }\n\n const currentWeekDates = calculateWeekDates(currentWeekStart)\n const yearOptions = Array.from({ length: 10 }, (_, i) => calendarYear - 5 + i)\n\n // Handle week navigation\n const navigateWeek = (direction: 'prev' | 'next') => {\n const newWeekStart = new Date(currentWeekStart)\n newWeekStart.setDate(currentWeekStart.getDate() + (direction === 'next' ? 7 : -7))\n setCurrentWeekStart(newWeekStart)\n setCalendarYear(newWeekStart.getFullYear())\n setCalendarMonth(newWeekStart.getMonth())\n onWeekChange?.(newWeekStart)\n }\n\n const handleWeekSelectorClick = (week: { start: Date; end: Date }, index: number) => {\n setSelectedWeekIndex(index)\n setShowCalendar(false)\n setCurrentWeekStart(week.start)\n onWeekChange?.(week.start)\n }\n\n // Click outside handler for calendar dropdown\n React.useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n calendarDropdownRef.current &&\n !calendarDropdownRef.current.contains(event.target as Node) &&\n calendarButtonRef.current &&\n !calendarButtonRef.current.contains(event.target as Node)\n ) {\n setShowCalendar(false)\n setShowMonthGrid(false)\n setShowYearGrid(false)\n }\n }\n\n if (showCalendar) {\n document.addEventListener('mousedown', handleClickOutside)\n }\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [showCalendar])\n\n // Update selected week index when currentWeekStart changes\n React.useEffect(() => {\n const weeks = getWeeksInMonth(calendarYear, calendarMonth)\n const currentWeekIndex = weeks.findIndex(week =>\n currentWeekStart >= week.start && currentWeekStart <= week.end\n )\n if (currentWeekIndex !== -1) {\n setSelectedWeekIndex(currentWeekIndex)\n }\n }, [currentWeekStart, calendarYear, calendarMonth])\n\n return (\n <div className={cn(\"flex items-center gap-3\", className)}>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => navigateWeek('prev')}\n className={cn(\n \"rounded-lg border-gray-200 hover:border-gray-300 hover:bg-gray-50\",\n compact ? \"h-8 w-8 p-0\" : \"h-9 w-9 p-0\"\n )}\n >\n <ChevronLeft className={cn(compact ? \"h-3 w-3\" : \"h-4 w-4\", \"text-gray-600\")} />\n </Button>\n\n {/* Month/Year/Week Selector Dropdown */}\n <div className=\"relative\">\n <div\n ref={calendarButtonRef}\n className={cn(\n \"flex items-center gap-2 bg-white rounded-lg border border-gray-200 shadow-sm cursor-pointer hover:bg-gray-50 transition-colors\",\n compact ? \"px-2 py-1\" : \"px-3 py-2\"\n )}\n onClick={() => setShowCalendar(!showCalendar)}\n >\n <Calendar className={cn(compact ? \"h-3 w-3\" : \"h-4 w-4\", \"text-gray-500\")} />\n <span className={cn(compact ? \"text-xs\" : \"text-sm\", \"font-medium text-gray-700\")}>\n {currentWeekDates.length >= 7 && currentWeekDates[0] && currentWeekDates[6] &&\n `${currentWeekDates[0].getDate()}-${currentWeekDates[6].getDate()} ${monthNames[currentWeekDates[0].getMonth()]} ${currentWeekDates[0].getFullYear()}`\n }\n </span>\n <ChevronRight className={cn(\n compact ? \"h-2 w-2\" : \"h-3 w-3\",\n \"text-gray-400 transition-transform\",\n showCalendar && \"rotate-90\"\n )} />\n </div>\n\n {showCalendar && (\n <div ref={calendarDropdownRef} className=\"absolute top-full right-0 mt-2 bg-white border border-gray-200 rounded-lg shadow-lg p-4 z-50 w-80 sm:w-96\">\n {/* Year and Month Selector at Top */}\n {!showMonthGrid && !showYearGrid && (\n <div className=\"flex items-center justify-between mb-4\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => {\n const newMonth = calendarMonth === 0 ? 11 : calendarMonth - 1\n const newYear = calendarMonth === 0 ? calendarYear - 1 : calendarYear\n setCalendarMonth(newMonth)\n setCalendarYear(newYear)\n }}\n className=\"h-8 w-8 p-0\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n <div className=\"flex items-center gap-2\">\n <button\n className=\"text-lg font-semibold text-gray-800 hover:text-blue-600 transition-colors\"\n onClick={() => setShowMonthGrid(!showMonthGrid)}\n >\n {monthNames[calendarMonth]}\n </button>\n <button\n className=\"text-lg font-semibold text-gray-800 hover:text-blue-600 transition-colors\"\n onClick={() => setShowYearGrid(!showYearGrid)}\n >\n {calendarYear}\n </button>\n </div>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => {\n const newMonth = calendarMonth === 11 ? 0 : calendarMonth + 1\n const newYear = calendarMonth === 11 ? calendarYear + 1 : calendarYear\n setCalendarMonth(newMonth)\n setCalendarYear(newYear)\n }}\n className=\"h-8 w-8 p-0\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </div>\n )}\n\n {/* Month Grid View */}\n {showMonthGrid ? (\n <div className=\"p-6\">\n <div className=\"flex items-center justify-between mb-4\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setShowMonthGrid(false)}\n className=\"h-9 px-3 text-sm font-medium\"\n >\n ← Back\n </Button>\n <span className=\"text-lg font-semibold\">{calendarYear}</span>\n </div>\n <div className=\"grid grid-cols-3 gap-2\">\n {monthNames.map((month, idx) => (\n <button\n key={month}\n className={cn(\n \"h-11 w-full text-sm font-medium rounded-xl transition-all\",\n calendarMonth === idx\n ? \"bg-blue-500 text-white\"\n : \"text-gray-600 hover:bg-gray-50\"\n )}\n onClick={() => {\n setCalendarMonth(idx)\n setShowMonthGrid(false)\n }}\n >\n {month}\n </button>\n ))}\n </div>\n </div>\n ) : showYearGrid ? (\n <div className=\"p-6\">\n <div className=\"flex items-center justify-start mb-4\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setShowYearGrid(false)}\n className=\"h-9 px-3 text-sm font-medium\"\n >\n ← Back\n </Button>\n </div>\n <div className=\"grid grid-cols-4 gap-2 max-h-64 overflow-y-auto\">\n {yearOptions.map((year) => (\n <button\n key={year}\n className={cn(\n \"h-11 w-full text-sm font-medium rounded-xl transition-all\",\n calendarYear === year\n ? \"bg-blue-500 text-white\"\n : \"text-gray-600 hover:bg-gray-50\"\n )}\n onClick={() => {\n setCalendarYear(year)\n setShowYearGrid(false)\n setShowMonthGrid(true)\n }}\n >\n {year}\n </button>\n ))}\n </div>\n </div>\n ) : (\n /* Week Selector View */\n <div className=\"grid grid-cols-2 gap-2 max-h-64 overflow-y-auto\">\n {getWeeksInMonth(calendarYear, calendarMonth).map((week, index) => {\n const isCurrentWeek = new Date() >= week.start && new Date() <= week.end\n const isSelected = selectedWeekIndex === index\n return (\n <button\n key={index}\n className={cn(\n \"w-full p-3 text-left rounded-lg border transition-all\",\n isSelected\n ? \"bg-blue-500 text-white border-blue-500\"\n : isCurrentWeek\n ? \"bg-white text-blue-600 border-blue-500\"\n : \"bg-white border-gray-200 text-gray-700 hover:border-blue-300\"\n )}\n onClick={() => handleWeekSelectorClick(week, index)}\n >\n <div className=\"flex flex-col\">\n <div className={cn(\n \"font-medium text-sm\",\n isSelected ? \"text-white\" : \"text-gray-800\"\n )}>\n Week {index + 1}\n </div>\n <div className={cn(\n \"text-xs\",\n isSelected ? \"text-blue-100\" : \"text-gray-500\"\n )}>\n {formatWeekRange(week.start, week.end)}\n </div>\n </div>\n </button>\n )\n })}\n </div>\n )}\n\n <div className=\"flex gap-2 pt-3 border-t border-gray-100 mt-3\">\n <Button\n size=\"sm\"\n variant=\"outline\"\n className=\"flex-1\"\n onClick={() => {\n const today = new Date()\n setCurrentWeekStart(today)\n setShowCalendar(false)\n setShowMonthGrid(false)\n setShowYearGrid(false)\n onWeekChange?.(today)\n }}\n >\n This Week\n </Button>\n </div>\n </div>\n )}\n </div>\n\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => navigateWeek('next')}\n className={cn(\n \"rounded-lg border-gray-200 hover:border-gray-300 hover:bg-gray-50\",\n compact ? \"h-8 w-8 p-0\" : \"h-9 w-9 p-0\"\n )}\n >\n <ChevronRight className={cn(compact ? \"h-3 w-3\" : \"h-4 w-4\", \"text-gray-600\")} />\n </Button>\n </div>\n )\n}\n","// Utility functions for WeekNavigator component\n\nexport const weekNavigatorUtils = {\n calculateWeekDates: (startDate: Date): Date[] => {\n const dates = []\n const start = new Date(startDate)\n const dayOfWeek = start.getDay()\n const diff = dayOfWeek === 0 ? -6 : 1 - dayOfWeek\n start.setDate(start.getDate() + diff)\n\n for (let i = 0; i < 7; i++) {\n const date = new Date(start)\n date.setDate(start.getDate() + i)\n dates.push(date)\n }\n return dates\n },\n\n formatDateDisplay: (date: Date): string => {\n return date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric'\n })\n },\n\n getWeekNumber: (date: Date): number => {\n const firstDayOfYear = new Date(date.getFullYear(), 0, 1)\n const pastDaysOfYear = (date.getTime() - firstDayOfYear.getTime()) / 86400000\n return Math.ceil((pastDaysOfYear + firstDayOfYear.getDay() + 1) / 7)\n },\n\n getWeekOfMonth: (date: Date): number => {\n const firstDayOfMonth = new Date(date.getFullYear(), date.getMonth(), 1)\n const firstDayOfWeek = firstDayOfMonth.getDay()\n const offsetDate = date.getDate() + firstDayOfWeek - 1\n return Math.ceil(offsetDate / 7)\n }\n}\n","import * as React from \"react\"\nimport { useState } from \"react\"\nimport { Plus, Trash2 } from \"lucide-react\"\nimport { Card, CardContent, CardHeader, CardTitle } from \"./ui/card\"\nimport { Button } from \"./ui/button\"\nimport { Input } from \"./ui/input\"\nimport { Label } from \"./ui/label\"\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"./ui/select\"\nimport { SimpleModal } from \"./ui/modal\"\nimport { cn } from \"@/lib/utils\"\nimport { WeekNavigator } from \"./WeekNavigator\"\nimport { weekNavigatorUtils } from \"../utils/weekNavigatorUtils\"\n\nexport interface ScheduleEvent {\n id: string\n title: string\n day: string\n startTime: string\n endTime: string\n color: string\n description?: string\n // Recurrence options\n recurrenceType?: 'none' | 'weekly' | 'monthly' | 'yearly'\n specificDate?: string // For monthly/yearly recurrence\n // Flexible metadata - can be anything\n [key: string]: string | number | boolean | Date | undefined\n}\n\nexport interface CustomField {\n key: string\n label: string\n type: \"text\" | \"number\" | \"select\"\n placeholder?: string\n options?: { label: string; value: string }[]\n icon?: React.ReactNode\n showInCard?: boolean\n required?: boolean\n}\n\nexport interface ScheduleProps {\n title?: string\n subtitle?: string\n events: ScheduleEvent[]\n onEventAdd?: (event: Omit<ScheduleEvent, \"id\">) => void\n onEventUpdate?: (event: ScheduleEvent) => void\n onEventDelete?: (eventId: string) => void\n className?: string\n timeSlots?: string[]\n daysOfWeek?: string[]\n showAddButton?: boolean\n eventColors?: { name: string; value: string }[]\n customFields?: CustomField[]\n showWeekNavigation?: boolean\n showHalfHourLines?: boolean // Show separator line at :30 mark\n showCurrentTimeIndicator?: boolean // Show red line for current time\n slotHeight?: number // Height in pixels for each hour slot (default 85)\n}\n\nconst defaultTimeSlots = [\n \"08:00\", \"09:00\", \"10:00\", \"11:00\", \"12:00\",\n \"13:00\", \"14:00\", \"15:00\", \"16:00\"\n]\n\nconst defaultDays = [\"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\"]\n\nconst defaultColors = [\n { name: \"Blue\", value: \"bg-blue-500\" },\n { name: \"Green\", value: \"bg-emerald-500\" },\n { name: \"Purple\", value: \"bg-purple-500\" },\n { name: \"Orange\", value: \"bg-orange-500\" },\n { name: \"Pink\", value: \"bg-pink-500\" },\n]\n\nexport function Schedule({\n title = \"Weekly Schedule\",\n subtitle,\n events,\n onEventAdd,\n onEventUpdate,\n onEventDelete,\n className,\n timeSlots = defaultTimeSlots,\n daysOfWeek = defaultDays,\n showAddButton = true,\n eventColors = defaultColors,\n customFields = [],\n showWeekNavigation = false,\n showHalfHourLines = true,\n showCurrentTimeIndicator = true,\n slotHeight = 85,\n}: ScheduleProps) {\n const [isModalOpen, setIsModalOpen] = useState(false)\n const [selectedEvent, setSelectedEvent] = useState<ScheduleEvent | null>(null)\n const [formData, setFormData] = useState<Record<string, string | number | boolean | Date>>({\n title: \"\",\n day: \"\",\n startTime: \"\",\n endTime: \"\",\n color: \"bg-blue-500\",\n description: \"\",\n recurrenceType: \"none\",\n specificDate: \"\",\n scheduleMode: \"day\", // \"day\" or \"date\"\n })\n\n // Week navigation state - simplified to just track current week\n const [currentWeekStart, setCurrentWeekStart] = useState(new Date())\n const currentWeekDates = showWeekNavigation ? weekNavigatorUtils.calculateWeekDates(currentWeekStart) : []\n\n const handleOpenModal = (day?: string, time?: string, event?: ScheduleEvent) => {\n if (event) {\n setSelectedEvent(event)\n // Populate form with all event data including custom fields\n const data: Record<string, string | number | boolean> = {\n title: event.title,\n day: event.day,\n startTime: event.startTime,\n endTime: event.endTime,\n color: event.color,\n description: event.description || \"\",\n recurrenceType: event.recurrenceType || \"none\",\n specificDate: event.specificDate || \"\",\n scheduleMode: event.specificDate ? \"date\" : \"day\",\n }\n // Add custom field values\n customFields.forEach(field => {\n const value = event[field.key];\n data[field.key] = value instanceof Date ? value.toISOString() : (value || (field.type === \"number\" ? 0 : \"\"))\n })\n setFormData(data)\n } else {\n setSelectedEvent(null)\n // Initialize form with empty values\n const data: Record<string, string | number | boolean | Date> = {\n title: \"\",\n day: day || \"\",\n startTime: time || \"\",\n endTime: \"\",\n color: \"bg-blue-500\",\n description: \"\",\n recurrenceType: \"none\",\n specificDate: \"\",\n scheduleMode: \"day\",\n }\n // Initialize custom fields with default values\n customFields.forEach(field => {\n data[field.key] = field.type === \"number\" ? 0 : \"\"\n })\n setFormData(data)\n }\n setIsModalOpen(true)\n }\n\n const handleSave = () => {\n if (!formData.title || !formData.day || !formData.startTime || !formData.endTime) {\n return\n }\n\n const eventData = {\n ...formData,\n id: selectedEvent?.id || Date.now().toString(),\n }\n\n if (selectedEvent) {\n onEventUpdate?.(eventData as ScheduleEvent)\n } else {\n onEventAdd?.(formData)\n }\n\n setIsModalOpen(false)\n }\n\n const handleDelete = () => {\n if (selectedEvent) {\n onEventDelete?.(selectedEvent.id)\n setIsModalOpen(false)\n }\n }\n\n const getEventsForSlot = (day: string, time: string) => {\n return events.filter(event => {\n if (event.day !== day) return false\n const eventStart = parseInt(event.startTime.replace(\":\", \"\"))\n const slotTime = parseInt(time.replace(\":\", \"\"))\n return eventStart === slotTime\n })\n }\n\n const getEventHeight = (event: ScheduleEvent) => {\n const [startHour, startMin] = event.startTime.split(':').map(Number)\n const [endHour, endMin] = event.endTime.split(':').map(Number)\n const startInMinutes = startHour * 60 + startMin\n const endInMinutes = endHour * 60 + endMin\n const durationInMinutes = endInMinutes - startInMinutes\n const durationInHours = durationInMinutes / 60\n // Use proportional padding based on slot height (roughly 10% of slot height)\n const padding = Math.max(4, slotHeight * 0.1)\n return durationInHours * slotHeight - padding\n }\n\n return (\n <>\n <Card className={cn(\"w-full\", className)}>\n <CardHeader className=\"pb-6 bg-gradient-to-r from-slate-50 to-gray-50 border-b border-gray-100\">\n <div className=\"flex justify-between items-center\">\n <div>\n <CardTitle className=\"text-2xl\">{title}</CardTitle>\n {subtitle && (\n <p className=\"text-sm text-gray-500 mt-1\">{subtitle}</p>\n )}\n </div>\n <div className=\"flex items-center gap-4\">\n {/* Week Navigation */}\n {showWeekNavigation && (\n <WeekNavigator\n onWeekChange={setCurrentWeekStart}\n initialDate={currentWeekStart}\n />\n )}\n\n {showAddButton && (\n <Button onClick={() => handleOpenModal()} className=\"gap-2\">\n <Plus className=\"h-4 w-4\" />\n Add Event\n </Button>\n )}\n </div>\n </div>\n </CardHeader>\n\n <CardContent className=\"p-0\">\n <div className=\"overflow-x-auto\">\n <div className=\"min-w-[800px]\">\n {/* Header Row */}\n <div className={`grid border-b border-gray-200`} style={{ gridTemplateColumns: `80px repeat(${daysOfWeek.length}, 1fr)` }}>\n <div className=\"p-3 bg-gray-50 border-r border-gray-200\">\n <span className=\"text-xs font-medium text-gray-500\">\n Time\n </span>\n </div>\n {daysOfWeek.map((day, index) => {\n const today = new Date()\n const dateForDay = showWeekNavigation && currentWeekDates[index]\n const isToday = dateForDay && dateForDay.getDate() === today.getDate() && dateForDay.getMonth() === today.getMonth() && dateForDay.getFullYear() === today.getFullYear()\n\n return (\n <div key={day} className=\"p-4 text-center border-r border-gray-200 last:border-r-0 bg-gray-50 hover:bg-white/50 transition-colors\">\n <div className={`font-semibold text-sm ${isToday ? 'text-blue-600' : 'text-gray-800'}`}>{day}</div>\n {showWeekNavigation && dateForDay && (\n <div className={`text-xs mt-1 font-medium ${isToday ? 'text-blue-600 font-bold' : 'text-gray-500'}`}>\n {weekNavigatorUtils.formatDateDisplay(dateForDay)}\n </div>\n )}\n </div>\n )\n })}\n </div>\n\n {/* Time Slots */}\n {timeSlots.map((time) => {\n // Calculate current time indicator position for this slot\n const now = new Date()\n const currentHour = now.getHours()\n const currentMinute = now.getMinutes()\n const [slotHour, slotMinuteRaw] = time.split(\":\")\n const slotMinute = parseInt(slotMinuteRaw || \"0\")\n const slotHourNum = parseInt(slotHour || \"0\")\n const slotStart = slotHourNum * 60 + slotMinute\n const slotEnd = slotStart + 60\n const nowMinutes = currentHour * 60 + currentMinute\n const isCurrentTimeSlot = nowMinutes >= slotStart && nowMinutes < slotEnd\n const elapsedMinutes = nowMinutes - slotStart\n const progressRatio = elapsedMinutes / 60\n const indicatorTop = progressRatio * slotHeight\n\n return (\n <div key={time} className=\"grid border-b border-gray-100 last:border-b-0\" style={{ gridTemplateColumns: `80px repeat(${daysOfWeek.length}, 1fr)` }}>\n <div className=\"p-2 bg-gray-50/50 border-r border-gray-200\">\n <span className=\"text-xs text-gray-600\">{time}</span>\n </div>\n {daysOfWeek.map((day, dayIndex) => {\n const dayEvents = getEventsForSlot(day, time)\n const today = new Date()\n const dateForDay = showWeekNavigation && currentWeekDates[dayIndex]\n const isToday = dateForDay ? \n dateForDay.getDate() === today.getDate() && \n dateForDay.getMonth() === today.getMonth() && \n dateForDay.getFullYear() === today.getFullYear() \n : false\n\n return (\n <div\n key={`${day}-${time}`}\n className=\"relative border-r border-gray-200 last:border-r-0 hover:bg-blue-50/30 cursor-pointer transition-colors\"\n style={{ minHeight: `${slotHeight}px` }}\n onClick={() => !dayEvents.length && handleOpenModal(day, time)}\n >\n {/* Half-hour separator line */}\n {showHalfHourLines && (\n <div className=\"absolute top-1/2 left-0 right-0 h-px bg-gray-200/60 z-[5]\" />\n )}\n\n {dayEvents.map(event => {\n const eventHeight = getEventHeight(event)\n const isShortEvent = eventHeight < 40 // Less than 40px is considered short\n \n return (\n <div\n key={event.id}\n className={cn(\n \"absolute rounded-md text-white cursor-pointer hover:scale-[1.02] transition-transform overflow-visible\",\n event.color,\n isShortEvent ? \"inset-x-1 py-0.5 px-1\" : \"inset-1 p-2\"\n )}\n style={{ \n height: `${eventHeight}px`, \n zIndex: 10,\n minHeight: isShortEvent ? 'auto' : undefined\n }}\n onClick={(e) => {\n e.stopPropagation()\n handleOpenModal(undefined, undefined, event)\n }}\n >\n {isShortEvent ? (\n // Short event layout: title and time side by side\n <div className=\"flex items-center justify-between gap-1\">\n <div className=\"font-semibold truncate text-[10px] leading-tight flex-1\">\n {event.title}\n </div>\n <div className=\"text-[9px] opacity-80 whitespace-nowrap\">\n {event.startTime}-{event.endTime}\n </div>\n </div>\n ) : (\n // Normal event layout\n <>\n <div className=\"text-xs font-semibold truncate\">\n {event.title}\n </div>\n\n {/* Display custom fields with showInCard: true */}\n {customFields\n .filter(field => field.showInCard && event[field.key])\n .map(field => (\n <div key={field.key} className=\"text-xs opacity-90 flex items-center gap-1 mt-1\">\n {field.icon}\n <span className=\"truncate\">{event[field.key] instanceof Date ? (event[field.key] as Date).toLocaleString() : String(event[field.key] || '')}</span>\n </div>\n ))}\n\n <div className=\"text-xs opacity-80 mt-1\">\n <span>{event.startTime}-{event.endTime}</span>\n </div>\n </>\n )}\n </div>\n )\n })}\n\n {/* Current Time Indicator */}\n {showCurrentTimeIndicator && isToday && isCurrentTimeSlot && (\n <div className=\"absolute left-0 right-0 flex items-center z-20\" style={{ top: `${indicatorTop - 8}px` }}>\n <div className=\"h-[3px] bg-red-500 absolute -left-14 right-0\"></div>\n <div className=\"bg-red-500 text-white text-xs px-2 py-0.5 rounded font-bold whitespace-nowrap relative z-30 -ml-14\">\n {now.getHours()}:{now.getMinutes().toString().padStart(2, '0')}\n </div>\n </div>\n )}\n\n {!dayEvents.length && (\n <div className=\"absolute inset-0 flex items-center justify-center opacity-0 hover:opacity-100 transition-opacity\">\n <Plus className=\"h-5 w-5 text-gray-400\" />\n </div>\n )}\n </div>\n )\n })}\n </div>\n )\n })}\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Event Modal */}\n <SimpleModal\n isOpen={isModalOpen}\n onClose={() => setIsModalOpen(false)}\n title={selectedEvent ? \"Edit Event\" : \"Add New Event\"}\n >\n <div className=\"space-y-4 p-6\">\n {/* Schedule Mode Selection */}\n <div className=\"space-y-2\">\n <Label className=\"text-sm font-medium\">Schedule Type</Label>\n <Select\n value={String(formData.scheduleMode)}\n onValueChange={(value) => setFormData({ ...formData, scheduleMode: value })}\n >\n <SelectTrigger>\n <SelectValue placeholder=\"Select schedule type\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"day\">By Day (Monday, Tuesday, etc.)</SelectItem>\n <SelectItem value=\"date\">By Date (Specific date)</SelectItem>\n </SelectContent>\n </Select>\n <p className=\"text-xs text-gray-500\">\n {formData.scheduleMode === \"day\"\n ? \"Schedule by day of the week (e.g., every Monday)\"\n : \"Schedule by specific date (e.g., January 15, 2025)\"}\n </p>\n </div>\n\n {/* Title Field */}\n <div className=\"space-y-2\">\n <Label htmlFor=\"title\">Title *</Label>\n <Input\n id=\"title\"\n value={String(formData.title)}\n onChange={(e) => setFormData({ ...formData, title: e.target.value })}\n placeholder=\"Event title\"\n />\n </div>\n\n {/* Day/Date and Time Fields */}\n <div className=\"grid grid-cols-3 gap-4\">\n {formData.scheduleMode === \"day\" ? (\n <div className=\"space-y-2\">\n <Label>Day *</Label>\n <Select value={String(formData.day)} onValueChange={(value) => setFormData({ ...formData, day: value })}>\n <SelectTrigger>\n <SelectValue placeholder=\"Select day\" />\n </SelectTrigger>\n <SelectContent>\n {daysOfWeek.map(day => (\n <SelectItem key={day} value={day}>{day}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n ) : (\n <div className=\"space-y-2\">\n <Label htmlFor=\"specificDate\">Date *</Label>\n <Input\n id=\"specificDate\"\n type=\"date\"\n value={String(formData.specificDate)}\n onChange={(e) => setFormData({ ...formData, specificDate: e.target.value })}\n />\n </div>\n )}\n <div className=\"space-y-2\">\n <Label htmlFor=\"startTime\">Start Time *</Label>\n <Input\n id=\"startTime\"\n type=\"time\"\n value={String(formData.startTime)}\n onChange={(e) => setFormData({ ...formData, startTime: e.target.value })}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"endTime\">End Time *</Label>\n <Input\n id=\"endTime\"\n type=\"time\"\n value={String(formData.endTime)}\n onChange={(e) => setFormData({ ...formData, endTime: e.target.value })}\n />\n </div>\n </div>\n\n {/* Custom Fields - Dynamic Rendering */}\n {customFields.length > 0 && (\n <div className=\"grid grid-cols-2 gap-4\">\n {customFields.map(field => (\n <div key={field.key} className=\"space-y-2\">\n <Label htmlFor={field.key}>\n {field.label} {field.required && \"*\"}\n </Label>\n {field.type === \"select\" ? (\n <Select\n value={String(formData[field.key] || \"\")}\n onValueChange={(value) => setFormData({ ...formData, [field.key]: value })}\n >\n <SelectTrigger>\n <SelectValue placeholder={field.placeholder || `Select ${field.label}`} />\n </SelectTrigger>\n <SelectContent>\n {field.options?.map(option => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : (\n <Input\n id={field.key}\n type={field.type}\n value={field.type === \"number\" ? Number(formData[field.key] || 0) : String(formData[field.key] || \"\")}\n onChange={(e) => setFormData({\n ...formData,\n [field.key]: field.type === \"number\" ? parseInt(e.target.value) || 0 : e.target.value\n })}\n placeholder={field.placeholder}\n />\n )}\n </div>\n ))}\n </div>\n )}\n\n {/* Recurrence Checkbox */}\n <div className=\"flex items-center space-x-2\">\n <input\n type=\"checkbox\"\n id=\"isRecurring\"\n checked={formData.recurrenceType !== \"none\"}\n onChange={(e) => {\n if (e.target.checked) {\n // Enable recurrence based on schedule mode\n setFormData({\n ...formData,\n recurrenceType: formData.scheduleMode === \"day\" ? \"weekly\" : \"monthly\"\n })\n } else {\n // Disable recurrence\n setFormData({ ...formData, recurrenceType: \"none\" })\n }\n }}\n className=\"w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded focus:ring-blue-500 focus:ring-2\"\n />\n <Label htmlFor=\"isRecurring\" className=\"text-sm font-medium text-gray-700 cursor-pointer\">\n {formData.scheduleMode === \"day\"\n ? \"Repeat every week on this day\"\n : \"Repeat every month on this date\"}\n </Label>\n </div>\n\n {/* Color Selection */}\n <div className=\"space-y-2\">\n <Label>Color</Label>\n <Select value={String(formData.color)} onValueChange={(value) => setFormData({ ...formData, color: value })}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {eventColors.map(color => (\n <SelectItem key={color.value} value={color.value}>\n <div className=\"flex items-center gap-2\">\n <div className={cn(\"w-4 h-4 rounded\", color.value)} />\n {color.name}\n </div>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {/* Description Field */}\n <div className=\"space-y-2\">\n <Label htmlFor=\"description\">Description</Label>\n <Input\n id=\"description\"\n value={String(formData.description || \"\")}\n onChange={(e) => setFormData({ ...formData, description: e.target.value })}\n placeholder=\"Optional description\"\n />\n </div>\n\n <div className=\"flex gap-2 pt-4\">\n {selectedEvent && (\n <Button variant=\"destructive\" onClick={handleDelete} className=\"gap-2\">\n <Trash2 className=\"h-4 w-4\" />\n Delete\n </Button>\n )}\n <div className=\"flex-1\" />\n <Button variant=\"outline\" onClick={() => setIsModalOpen(false)}>\n Cancel\n </Button>\n <Button onClick={handleSave}>\n {selectedEvent ? \"Update\" : \"Add\"} Event\n </Button>\n </div>\n </div>\n </SimpleModal>\n </>\n )\n}\n","// Timezone definitions\nexport const TIMEZONES = [\n { label: 'UTC', offset: 0 },\n { label: 'EST', offset: -5 },\n { label: 'CST', offset: -6 },\n { label: 'MST', offset: -7 },\n { label: 'PST', offset: -8 },\n { label: 'GMT', offset: 0 },\n { label: 'CET', offset: 1 },\n { label: 'EET', offset: 2 },\n { label: 'IST', offset: 5.5 },\n { label: 'CST (China)', offset: 8 },\n { label: 'JST', offset: 9 },\n { label: 'AEST', offset: 10 },\n { label: 'NZST', offset: 12 },\n { label: 'HST', offset: -10 },\n { label: 'AKST', offset: -9 },\n { label: 'Asia/Bangkok', offset: 7 },\n];\n\n// Utility function to convert time between timezones\nexport const convertTimezone = (date: Date, fromTz: string, toTz: string): Date => {\n const fromOffset = TIMEZONES.find(tz => tz.label === fromTz)?.offset || 0;\n const toOffset = TIMEZONES.find(tz => tz.label === toTz)?.offset || 0;\n \n const converted = new Date(date);\n converted.setHours(converted.getHours() + (toOffset - fromOffset));\n \n return converted;\n};\n\n// Utility function to format time with timezone\nexport const formatTimeWithTimezone = (\n date: Date,\n timezone: string,\n format: '12h' | '24h' = '24h',\n showSeconds: boolean = false\n): string => {\n const h = format === '12h' ? (date.getHours() % 12 || 12) : date.getHours();\n const m = date.getMinutes().toString().padStart(2, '0');\n const s = date.getSeconds().toString().padStart(2, '0');\n const period = date.getHours() >= 12 ? 'PM' : 'AM';\n \n let timeStr = `${h.toString().padStart(2, '0')}:${m}`;\n if (showSeconds) timeStr += `:${s}`;\n if (format === '12h') timeStr += ` ${period}`;\n timeStr += ` ${timezone}`;\n \n return timeStr;\n};\n"],"names":["cn","inputs","twMerge","clsx","Button","React","className","variant","size","asChild","props","ref","Comp","Slot","jsx","Checkbox","CheckboxPrimitive","Check","Input","type","Separator","orientation","decorative","TableContext","Table","TableHeader","TableBody","TableFooter","TableRow","TableHead","TableCell","TableCaption","DropdownMenu","DropdownMenuPrimitive","DropdownMenuPortal","DropdownMenuTrigger","DropdownMenuContent","sideOffset","DropdownMenuGroup","DropdownMenuItem","inset","DropdownMenuCheckboxItem","children","checked","jsxs","CheckIcon","DropdownMenuRadioGroup","DropdownMenuRadioItem","CircleIcon","DropdownMenuLabel","DropdownMenuSeparator","DropdownMenuShortcut","DropdownMenuSub","DropdownMenuSubTrigger","ChevronRightIcon","DropdownMenuSubContent","DataTable","data","columns","searchPlaceholder","onRowClick","showPagination","showSearch","initialPageSize","renderToolbar","currentPage","setCurrentPage","useState","pageSize","searchQuery","setSearchQuery","sortKey","setSortKey","sortOrder","setSortOrder","filteredData","useMemo","query","row","column","sortedData","a","b","col","aVal","bVal","comparison","paginatedData","start","handleSort","columnKey","getCellValue","rowIndex","value","Search","e","ChevronDown","ChevronUp","ChevronsUpDown","shouldCenter","p","ChevronLeft","ChevronRight","DataGridContext","createContext","useDataGrid","context","useContext","DataGrid","getRowId","recordCount","pagination","setPagination","sorting","setSorting","selectedRows","setSelectedRows","sort","aValue","bValue","end","totalPages","pageCount","canPreviousPage","canNextPage","previousPage","prev","nextPage","setPageSize","goToPage","page","toggleRow","id","next","toggleAllRows","isAllRowsSelected","DataGridTable","cellValue","Select","SelectPrimitive","SelectGroup","SelectValue","SelectTrigger","SelectScrollUpButton","SelectScrollDownButton","SelectContent","position","SelectLabel","SelectItem","SelectSeparator","DataGridPagination","mode","pageSizeOptions","getPageNumbers","current","total","pages","i","index","DataGridColumnHeader","title","sortState","s","isSorted","isDesc","existing","DataGridTableRowSelectAll","DataGridTableRowSelect","rowId","useTableContext","TableRoot","table","totalRecords","TableWrapper","TableContent","tableInstance","headerGroup","header","flexRender","cell","TableNavigator","rowsPerPageOptions","showPageSelector","showRecordInfo","showControls","startRecord","endRecord","ChevronsLeft","ChevronsRight","SortableHeader","align","canSort","sortDirection","alignmentClasses","getSortIcon","startOfMonth","date","endOfMonth","eachDayOfInterval","days","isSameMonth","date1","date2","isSameDay","isToday","isTomorrow","tomorrow","addMonths","months","newDate","formatDate","format","monthNames","monthNamesShort","Calendar","selected","onSelect","events","holidays","currentMonth","setCurrentMonth","view","setView","monthStart","monthEnd","dayNames","currentYear","years","_","previousMonth","nextMonth","previousYear","nextYear","selectMonth","monthIndex","selectYear","year","getEventsForDay","day","event","isHoliday","checkDate","h","month","dayEvents","isSelectedDay","isTodayDay","isCurrentMonth","isHolidayDay","idx","getEventColor","styles","CalendarIcon","today","Popover","PopoverPrimitive","PopoverTrigger","PopoverAnchor","PopoverContent","DatePicker","onDateChange","dateRange","onDateRangeChange","placeholder","dateFormat","disabled","showIcon","icon","minDate","maxDate","disabledDates","isDateDisabled","fullWidth","customTrigger","numberOfMonths","open","setOpen","rangeStart","setRangeStart","rangeEnd","setRangeEnd","hoverDate","setHoverDate","handleSelect","selectedDate","from","to","isDateDisabledCheck","d","nextMonthDate","nextMonthStart","nextMonthEnd","nextMonthDays","subMonths","formatStr","isInRange","isRangeStart","isRangeEnd","triggerContent","renderDayCell","isDisabled","inRange","dayOfWeek","isRangeStartDay","isRangeEndDay","Fragment","TimePicker","time","onTimeChange","timezone","showTimezone","minuteStep","showSeconds","showClockFace","is24Hour","initialHours","initialMinutes","initialSeconds","initialPeriod","hours","setHours","minutes","setMinutes","seconds","setSeconds","period","setPeriod","hourInput","setHourInput","minuteInput","setMinuteInput","secondInput","setSecondInput","hourInputRef","useRef","minuteInputRef","secondInputRef","hourScrollRef","minuteScrollRef","secondScrollRef","useEffect","m","updateTime","newTime","handleHourChange","hour","newHour","handleMinuteChange","minute","handleSecondChange","second","handlePeriodToggle","newPeriod","handleNow","now","formatTime","timeStr","generateHours","max","generateMinutes","generateSeconds","displayHour","renderClockFace","hourAngle","minuteAngle","hourX","hourY","minuteX","minuteY","angle","x","y","Clock","newVal","num","min","validVal","val","Card","CardHeader","CardTitle","CardDescription","CardContent","CardFooter","Label","LabelPrimitive","Modal","DialogPrimitive","ModalPortal","ModalOverlay","ModalContent","X","ModalHeader","ModalTitle","ModalDescription","SimpleModal","isOpen","onClose","description","WeekNavigator","onWeekChange","initialDate","compact","currentWeekStart","setCurrentWeekStart","showCalendar","setShowCalendar","showMonthGrid","setShowMonthGrid","showYearGrid","setShowYearGrid","calendarYear","setCalendarYear","calendarMonth","setCalendarMonth","selectedWeekIndex","setSelectedWeekIndex","calendarDropdownRef","calendarButtonRef","calculateWeekDates","startDate","dates","diff","getWeeksInMonth","firstDay","lastDay","weeks","weekEnd","formatWeekRange","startMonth","endMonth","currentWeekDates","yearOptions","navigateWeek","direction","newWeekStart","handleWeekSelectorClick","week","handleClickOutside","currentWeekIndex","newMonth","newYear","isCurrentWeek","isSelected","weekNavigatorUtils","firstDayOfYear","pastDaysOfYear","firstDayOfWeek","offsetDate","defaultTimeSlots","defaultDays","defaultColors","Schedule","subtitle","onEventAdd","onEventUpdate","onEventDelete","timeSlots","daysOfWeek","showAddButton","eventColors","customFields","showWeekNavigation","showHalfHourLines","showCurrentTimeIndicator","slotHeight","isModalOpen","setIsModalOpen","selectedEvent","setSelectedEvent","formData","setFormData","handleOpenModal","field","handleSave","eventData","handleDelete","getEventsForSlot","eventStart","slotTime","getEventHeight","startHour","startMin","endHour","endMin","startInMinutes","durationInHours","padding","Plus","dateForDay","currentHour","currentMinute","slotHour","slotMinuteRaw","slotMinute","slotStart","slotEnd","nowMinutes","isCurrentTimeSlot","indicatorTop","dayIndex","eventHeight","isShortEvent","option","color","Trash2","TIMEZONES","convertTimezone","fromTz","toTz","fromOffset","tz","toOffset","converted","formatTimeWithTimezone"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"takaui.cjs","sources":["../src/lib/utils.ts","../src/components/ui/button.tsx","../src/components/ui/checkbox.tsx","../src/components/ui/input.tsx","../src/components/ui/separator.tsx","../src/components/ui/table.tsx","../src/components/ui/dropdown-menu.tsx","../src/components/DataTable.tsx","../src/components/DataGrid.tsx","../src/components/DataGridTable.tsx","../src/components/ui/select.tsx","../src/components/DataGridPagination.tsx","../src/components/DataGridColumnHeader.tsx","../src/components/DataGridRowSelect.tsx","../src/components/Calendar.tsx","../src/components/ui/popover.tsx","../src/components/DatePicker.tsx","../src/components/TimePicker.tsx","../src/components/ui/card.tsx","../src/components/ui/label.tsx","../src/components/ui/modal.tsx","../src/components/WeekNavigator.tsx","../src/utils/weekNavigatorUtils.ts","../src/components/Schedule.tsx","../src/utils/timeUtils.ts"],"sourcesContent":["import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cn } from \"@/lib/utils\"\n\nexport interface ButtonProps extends React.ComponentProps<\"button\"> {\n variant?: \"default\" | \"destructive\" | \"outline\" | \"secondary\" | \"ghost\" | \"link\"\n size?: \"default\" | \"sm\" | \"lg\" | \"icon\" | \"icon-sm\" | \"icon-lg\"\n asChild?: boolean\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant = \"default\", size = \"default\", asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\"\n \n return (\n <Comp\n className={cn(\n // Base styles\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2\",\n \"disabled:pointer-events-none disabled:opacity-50\",\n // Variant styles\n variant === \"default\" && \"bg-blue-600 text-white hover:bg-blue-700 active:bg-blue-800 active:scale-95\",\n variant === \"destructive\" && \"bg-red-600 text-white hover:bg-red-700 active:bg-red-800 active:scale-95\",\n variant === \"outline\" && \"border border-gray-300 bg-white text-gray-900 hover:bg-gray-50 active:bg-gray-100 active:scale-95\",\n variant === \"secondary\" && \"bg-gray-200 text-gray-900 hover:bg-gray-300 active:bg-gray-400 active:scale-95\",\n variant === \"ghost\" && \"bg-transparent text-gray-900 hover:bg-gray-100 active:bg-gray-200 active:scale-95\",\n variant === \"link\" && \"bg-transparent text-blue-600 underline-offset-4 hover:text-blue-700 hover:underline active:text-blue-800\",\n // Size styles\n size === \"default\" && \"h-9 px-4 py-2\",\n size === \"sm\" && \"h-8 px-3 text-xs gap-1.5\",\n size === \"lg\" && \"h-10 px-6\",\n size === \"icon\" && \"h-9 w-9 p-0\",\n size === \"icon-sm\" && \"h-8 w-8 p-0\",\n size === \"icon-lg\" && \"h-10 w-10 p-0\",\n className\n )}\n ref={ref}\n {...props}\n />\n )\n }\n)\n\nButton.displayName = \"Button\"\n\nexport { Button }\n","import * as React from \"react\"\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\"\nimport { Check } from \"lucide-react\"\nimport { cn } from \"@/lib/utils\"\n\nconst Checkbox = React.forwardRef<\n React.ElementRef<typeof CheckboxPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <CheckboxPrimitive.Root\n ref={ref}\n className={cn(\n \"peer h-4 w-4 shrink-0 rounded border border-gray-200 bg-white ring-offset-white focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-gray-400 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-gray-900 data-[state=checked]:border-gray-900 data-[state=checked]:text-white transition-colors\",\n className\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n className={cn(\"flex items-center justify-center text-current\")}\n >\n <Check className=\"h-3.5 w-3.5 stroke-[2.5]\" />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n))\nCheckbox.displayName = CheckboxPrimitive.Root.displayName\n\nexport { Checkbox }\n","import * as React from \"react\"\nimport { cn } from \"@/lib/utils\"\n\nconst Input = React.forwardRef<HTMLInputElement, React.InputHTMLAttributes<HTMLInputElement>>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n \"flex h-10 w-full rounded-md border border-gray-300 bg-white px-3 py-2 text-sm file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-gray-400 focus:outline-none focus:border-gray-500 hover:border-gray-400 disabled:cursor-not-allowed disabled:opacity-50 transition-colors\",\n className\n )}\n ref={ref}\n {...props}\n />\n )\n }\n)\nInput.displayName = \"Input\"\n\nexport { Input }\n","import * as React from \"react\"\nimport { cn } from \"@/lib/utils\"\n\nexport interface SeparatorProps extends React.HTMLAttributes<HTMLDivElement> {\n orientation?: \"horizontal\" | \"vertical\"\n decorative?: boolean\n}\n\nconst Separator = React.forwardRef<HTMLDivElement, SeparatorProps>(\n (\n { className, orientation = \"horizontal\", decorative = true, ...props },\n ref\n ) => {\n return (\n <div\n ref={ref}\n role={decorative ? \"none\" : \"separator\"}\n aria-orientation={orientation}\n className={cn(\n \"shrink-0 bg-gray-200\",\n orientation === \"horizontal\" ? \"h-[1px] w-full\" : \"h-full w-[1px]\",\n className\n )}\n {...props}\n />\n )\n }\n)\n\nSeparator.displayName = \"Separator\"\n\nexport { Separator }\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype TableVariant = \"default\" | \"clean\"\n\nconst TableContext = React.createContext<{ variant: TableVariant }>({\n variant: \"default\",\n})\n\nfunction Table({ \n className, \n variant = \"default\",\n ...props \n}: React.ComponentProps<\"table\"> & { variant?: TableVariant }) {\n return (\n <TableContext.Provider value={{ variant }}>\n <div\n data-slot=\"table-container\"\n className=\"relative w-full overflow-x-auto\"\n >\n <table\n data-slot=\"table\"\n className={cn(\"w-full caption-bottom text-sm\", className)}\n {...props}\n />\n </div>\n </TableContext.Provider>\n )\n}\n\nfunction TableHeader({ className, ...props }: React.ComponentProps<\"thead\">) {\n return (\n <thead\n data-slot=\"table-header\"\n className={cn(\"bg-gray-50 [&_tr]:border-b [&_tr]:border-gray-200\", className)}\n {...props}\n />\n )\n}\n\nfunction TableBody({ className, ...props }: React.ComponentProps<\"tbody\">) {\n return (\n <tbody\n data-slot=\"table-body\"\n className={cn(\"[&_tr:last-child]:border-b-0\", className)}\n {...props}\n />\n )\n}\n\nfunction TableFooter({ className, ...props }: React.ComponentProps<\"tfoot\">) {\n return (\n <tfoot\n data-slot=\"table-footer\"\n className={cn(\n \"bg-muted/50 border-t font-medium [&>tr]:last:border-b-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableRow({ className, ...props }: React.ComponentProps<\"tr\">) {\n const { variant } = React.useContext(TableContext)\n \n return (\n <tr\n data-slot=\"table-row\"\n className={cn(\n \"hover:bg-gray-50 data-[state=selected]:bg-gray-50 transition-colors border-b border-gray-200\",\n variant === \"clean\" && \"border-b-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableHead({ className, ...props }: React.ComponentProps<\"th\">) {\n return (\n <th\n data-slot=\"table-head\"\n className={cn(\n \"text-foreground h-auto px-3 py-2 text-left align-middle font-medium whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableCell({ className, ...props }: React.ComponentProps<\"td\">) {\n return (\n <td\n data-slot=\"table-cell\"\n className={cn(\n \"px-3 py-2 text-left align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableCaption({\n className,\n ...props\n}: React.ComponentProps<\"caption\">) {\n return (\n <caption\n data-slot=\"table-caption\"\n className={cn(\"text-muted-foreground mt-4 text-sm\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\"\nimport { CheckIcon, ChevronRightIcon, CircleIcon } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction DropdownMenu({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {\n return <DropdownMenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />\n}\n\nfunction DropdownMenuPortal({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\n return (\n <DropdownMenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />\n )\n}\n\nfunction DropdownMenuTrigger({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {\n return (\n <DropdownMenuPrimitive.Trigger\n data-slot=\"dropdown-menu-trigger\"\n suppressHydrationWarning\n {...props}\n />\n )\n}\n\nfunction DropdownMenuContent({\n className,\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {\n return (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n data-slot=\"dropdown-menu-content\"\n sideOffset={sideOffset}\n className={cn(\n \"bg-white text-gray-900 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 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border border-gray-200 p-2 shadow-lg\",\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n )\n}\n\nfunction DropdownMenuGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {\n return (\n <DropdownMenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />\n )\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n variant?: \"default\" | \"destructive\"\n}) {\n return (\n <DropdownMenuPrimitive.Item\n data-slot=\"dropdown-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"focus:bg-gray-100 focus:text-gray-900 data-[variant=destructive]:text-red-600 data-[variant=destructive]:focus:bg-red-50 data-[variant=destructive]:focus:text-red-700 [&_svg:not([class*='text-'])]:text-gray-500 relative flex cursor-pointer items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none select-none transition-colors data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>) {\n return (\n <DropdownMenuPrimitive.CheckboxItem\n data-slot=\"dropdown-menu-checkbox-item\"\n className={cn(\n \"focus:bg-gray-100 focus:text-gray-900 relative flex cursor-pointer items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-none select-none transition-colors data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CheckIcon className=\"size-4 text-blue-600\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n )\n}\n\nfunction DropdownMenuRadioGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {\n return (\n <DropdownMenuPrimitive.RadioGroup\n data-slot=\"dropdown-menu-radio-group\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuRadioItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>) {\n return (\n <DropdownMenuPrimitive.RadioItem\n data-slot=\"dropdown-menu-radio-item\"\n className={cn(\n \"focus:bg-gray-100 focus:text-gray-900 relative flex cursor-pointer items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-none select-none transition-colors data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CircleIcon className=\"size-2 fill-blue-600\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n )\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.Label\n data-slot=\"dropdown-menu-label\"\n data-inset={inset}\n className={cn(\n \"px-2 py-1.5 text-sm font-semibold text-gray-900 data-[inset]:pl-8\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\n return (\n <DropdownMenuPrimitive.Separator\n data-slot=\"dropdown-menu-separator\"\n className={cn(\"bg-gray-100 my-1 h-px\", className)}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn(\n \"text-gray-500 ml-auto text-xs tracking-widest\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSub({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {\n return <DropdownMenuPrimitive.Sub data-slot=\"dropdown-menu-sub\" {...props} />\n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.SubTrigger\n data-slot=\"dropdown-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"focus:bg-gray-100 focus:text-gray-900 data-[state=open]:bg-gray-100 data-[state=open]:text-gray-900 [&_svg:not([class*='text-'])]:text-gray-500 flex cursor-pointer items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none select-none transition-colors data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto size-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n )\n}\n\nfunction DropdownMenuSubContent({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {\n return (\n <DropdownMenuPrimitive.SubContent\n data-slot=\"dropdown-menu-sub-content\"\n className={cn(\n \"bg-white text-gray-900 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 z-50 min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border border-gray-200 p-2 shadow-lg\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n DropdownMenu,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuSubContent,\n}\n","import React, { useState, useMemo } from 'react';\nimport { ChevronLeft, ChevronRight, Search, ChevronsUpDown, ChevronUp, ChevronDown } from 'lucide-react';\nimport { Button } from './ui/button';\nimport { Input } from './ui/input';\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from './ui/table';\nimport { cn } from '@/lib/utils';\n\nexport interface DataTableColumn<T = Record<string, unknown>> {\n key: string;\n header: string | React.ReactNode;\n accessor?: (row: T) => unknown;\n cell?: (value: unknown, row: T, index: number) => React.ReactNode;\n sortable?: boolean;\n width?: string;\n align?: 'left' | 'center' | 'right';\n}\n\nexport interface DataTableProps<T = Record<string, unknown>> {\n data: T[];\n columns: DataTableColumn<T>[];\n searchPlaceholder?: string;\n onRowClick?: (row: T) => void;\n className?: string;\n showPagination?: boolean;\n showSearch?: boolean;\n pageSize?: number;\n renderToolbar?: () => React.ReactNode;\n variant?: 'default' | 'clean';\n}\n\nexport function DataTable<T = Record<string, unknown>>({\n data = [],\n columns,\n searchPlaceholder = 'Search...',\n onRowClick,\n className = '',\n showPagination = true,\n showSearch = true,\n pageSize: initialPageSize = 10,\n renderToolbar,\n variant = 'default',\n}: DataTableProps<T>) {\n const [currentPage, setCurrentPage] = useState(1);\n const [pageSize] = useState(initialPageSize);\n const [searchQuery, setSearchQuery] = useState('');\n const [sortKey, setSortKey] = useState<string | null>(null);\n const [sortOrder, setSortOrder] = useState<'asc' | 'desc'>('asc');\n\n const filteredData = useMemo(() => {\n if (!showSearch || !searchQuery.trim()) return data;\n const query = searchQuery.toLowerCase();\n return data.filter((row) => {\n return columns.some(column => {\n const value = column.accessor ? column.accessor(row) : (row as Record<string, unknown>)[column.key];\n return value?.toString().toLowerCase().includes(query);\n });\n });\n }, [data, searchQuery, showSearch, columns]);\n\n const sortedData = useMemo(() => {\n if (!sortKey) return filteredData;\n return [...filteredData].sort((a, b) => {\n const column = columns.find(col => col.key === sortKey);\n if (!column) return 0;\n \n const aVal = column.accessor ? column.accessor(a) : (a as Record<string, unknown>)[column.key];\n const bVal = column.accessor ? column.accessor(b) : (b as Record<string, unknown>)[column.key];\n \n if (aVal === bVal) return 0;\n if (aVal === null || aVal === undefined) return 1;\n if (bVal === null || bVal === undefined) return -1;\n \n const comparison = aVal < bVal ? -1 : 1;\n return sortOrder === 'asc' ? comparison : -comparison;\n });\n }, [filteredData, sortKey, sortOrder, columns]);\n\n const paginatedData = useMemo(() => {\n if (!showPagination) return sortedData;\n const start = (currentPage - 1) * pageSize;\n return sortedData.slice(start, start + pageSize);\n }, [sortedData, currentPage, pageSize, showPagination]);\n\n React.useEffect(() => setCurrentPage(1), [searchQuery]);\n\n const handleSort = (columnKey: string) => {\n if (sortKey === columnKey) {\n setSortOrder(sortOrder === 'asc' ? 'desc' : 'asc');\n } else {\n setSortKey(columnKey);\n setSortOrder('asc');\n }\n };\n\n const getCellValue = (row: T, column: DataTableColumn<T>, rowIndex: number): React.ReactNode => {\n const value = column.accessor ? column.accessor(row) : (row as Record<string, unknown>)[column.key];\n return column.cell ? column.cell(value, row, rowIndex) : (value as React.ReactNode);\n };\n\n return (\n <div className={cn('w-full space-y-4', className)}>\n {/* Search and Toolbar */}\n {(showSearch || renderToolbar) && (\n <div className=\"flex flex-col sm:flex-row justify-between items-start sm:items-center gap-4\">\n {showSearch && (\n <div className=\"relative w-full sm:w-auto\">\n <Search className=\"absolute left-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-gray-400\" />\n <Input\n placeholder={searchPlaceholder}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"pl-10 w-full sm:w-[300px] bg-gray-50 border-gray-300\"\n />\n </div>\n )}\n {renderToolbar && <div className=\"w-full sm:w-auto\">{renderToolbar()}</div>}\n </div>\n )}\n\n {/* Table */}\n <div className=\"border border-gray-200 rounded-lg overflow-hidden\">\n <div className=\"overflow-x-auto\">\n <Table variant={variant}>\n <TableHeader>\n <TableRow>\n {columns.map((column) => (\n <TableHead\n key={column.key}\n className=\"h-10 px-0 py-0\"\n style={{ width: column.width }}\n >\n {column.align === 'center' || (!column.align && typeof column.header !== 'string') ? (\n <div className=\"h-10 flex items-center justify-center\">\n {typeof column.header !== 'string' ? (\n column.header\n ) : (\n <span className=\"text-xs font-normal text-gray-500 uppercase tracking-widest\">{column.header}</span>\n )}\n </div>\n ) : (\n <div className=\"h-10 flex items-center text-xs font-normal text-gray-500 uppercase tracking-widest\">\n {typeof column.header !== 'string' ? (\n <div>{column.header}</div>\n ) : column.sortable !== false ? (\n <Button\n variant=\"ghost\"\n className=\"h-auto px-3 py-1.5 font-normal hover:bg-transparent hover:text-gray-900\"\n onClick={() => handleSort(column.key)}\n >\n {column.header}\n {sortKey === column.key && sortOrder === 'desc' ? (\n <ChevronDown className=\"h-4 w-4\" />\n ) : sortKey === column.key && sortOrder === 'asc' ? (\n <ChevronUp className=\"h-4 w-4\" />\n ) : (\n <ChevronsUpDown className=\"h-4 w-4\" />\n )}\n </Button>\n ) : (\n <span className=\"px-3\">{column.header}</span>\n )}\n </div>\n )}\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {paginatedData.length === 0 ? (\n <TableRow>\n <TableCell\n colSpan={columns.length}\n className=\"text-center py-8 text-gray-500\"\n >\n No results found.\n </TableCell>\n </TableRow>\n ) : (\n paginatedData.map((row, rowIndex) => (\n <TableRow\n key={rowIndex}\n className=\"hover:bg-gray-50 cursor-pointer\"\n onClick={() => onRowClick?.(row)}\n >\n {columns.map((column) => {\n const shouldCenter = column.align === 'center' || (!column.align && typeof column.header !== 'string');\n return (\n <TableCell \n key={column.key} \n className={shouldCenter ? \"px-0 py-4\" : \"px-3 py-4\"}\n style={{ width: column.width }}\n >\n {shouldCenter ? (\n <div className=\"flex items-center justify-center h-full\">\n {getCellValue(row, column, rowIndex)}\n </div>\n ) : (\n getCellValue(row, column, rowIndex)\n )}\n </TableCell>\n );\n })}\n </TableRow>\n ))\n )}\n </TableBody>\n </Table>\n </div>\n </div>\n\n {/* Pagination */}\n {showPagination && (\n <div className=\"flex items-center justify-between px-2 py-4\">\n <div className=\"text-sm text-gray-600\">\n Showing {paginatedData.length} of {sortedData.length} row(s)\n </div>\n\n <div className=\"flex items-center gap-3\">\n <span className=\"text-sm text-gray-700\">\n Page {currentPage} of {Math.ceil(sortedData.length / pageSize)}\n </span>\n <div className=\"flex gap-1\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setCurrentPage(p => Math.max(1, p - 1))}\n disabled={currentPage === 1}\n className=\"h-8 w-8 p-0\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setCurrentPage(p => Math.min(Math.ceil(sortedData.length / pageSize), p + 1))}\n disabled={currentPage === Math.ceil(sortedData.length / pageSize)}\n className=\"h-8 w-8 p-0\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n </div>\n )}\n </div>\n )\n}\n","import React, { createContext, useContext, useMemo, useState } from 'react';\nimport type { ReactNode } from 'react';\n\nexport interface DataGridColumn<T = Record<string, unknown>> {\n id: string;\n accessorKey?: keyof T;\n header: string | React.ReactNode;\n cell?: (row: T, index: number) => React.ReactNode;\n size?: number;\n enableSorting?: boolean;\n enableHiding?: boolean;\n align?: 'left' | 'center' | 'right';\n}\n\nexport interface DataGridProps<T = Record<string, unknown>> {\n columns: DataGridColumn<T>[];\n data: T[];\n getRowId?: (row: T) => string;\n onRowClick?: (row: T) => void;\n children: ReactNode;\n recordCount?: number;\n}\n\ninterface DataGridContextValue<T = Record<string, unknown>> {\n columns: DataGridColumn<T>[];\n data: T[];\n getRowId: (row: T) => string;\n onRowClick?: (row: T) => void;\n \n // Pagination\n pagination: { pageIndex: number; pageSize: number };\n setPagination: React.Dispatch<React.SetStateAction<{ pageIndex: number; pageSize: number }>>;\n canPreviousPage: boolean;\n canNextPage: boolean;\n previousPage: () => void;\n nextPage: () => void;\n setPageSize: (size: number) => void;\n goToPage: (page: number) => void;\n pageCount: number;\n \n // Sorting\n sorting: { id: string; desc: boolean }[];\n setSorting: React.Dispatch<React.SetStateAction<{ id: string; desc: boolean }[]>>;\n \n // Selection\n selectedRows: Set<string>;\n toggleRow: (id: string) => void;\n toggleAllRows: () => void;\n isAllRowsSelected: boolean;\n \n // Computed data\n paginatedData: T[];\n sortedData: T[];\n totalPages: number;\n recordCount: number;\n}\n\nconst DataGridContext = createContext<DataGridContextValue | null>(null);\n\n// eslint-disable-next-line react-refresh/only-export-components\nexport function useDataGrid<T = Record<string, unknown>>() {\n const context = useContext(DataGridContext);\n if (!context) {\n throw new Error('useDataGrid must be used within DataGrid');\n }\n return context as DataGridContextValue<T>;\n}\n\nexport function DataGrid<T extends Record<string, unknown>>({\n columns,\n data,\n getRowId = (row: T) => (row as { id?: string }).id || String(Math.random()),\n onRowClick,\n children,\n recordCount,\n}: DataGridProps<T>) {\n const [pagination, setPagination] = useState({ pageIndex: 0, pageSize: 5 });\n const [sorting, setSorting] = useState<{ id: string; desc: boolean }[]>([]);\n const [selectedRows, setSelectedRows] = useState<Set<string>>(new Set());\n\n // Sorting logic\n const sortedData = useMemo(() => {\n if (sorting.length === 0) return data;\n \n const sorted = [...data].sort((a, b) => {\n for (const sort of sorting) {\n const column = columns.find((col) => col.id === sort.id);\n if (!column?.accessorKey) continue;\n \n const aValue = a[column.accessorKey];\n const bValue = b[column.accessorKey];\n \n if (aValue === bValue) continue;\n \n const comparison = aValue < bValue ? -1 : 1;\n return sort.desc ? -comparison : comparison;\n }\n return 0;\n });\n \n return sorted;\n }, [data, sorting, columns]);\n\n // Pagination logic\n const paginatedData = useMemo(() => {\n const start = pagination.pageIndex * pagination.pageSize;\n const end = start + pagination.pageSize;\n return sortedData.slice(start, end);\n }, [sortedData, pagination]);\n\n const totalPages = Math.ceil(sortedData.length / pagination.pageSize);\n const pageCount = totalPages;\n\n // Pagination helpers\n const canPreviousPage = pagination.pageIndex > 0;\n const canNextPage = pagination.pageIndex < totalPages - 1;\n const previousPage = () => setPagination((prev) => ({ ...prev, pageIndex: prev.pageIndex - 1 }));\n const nextPage = () => {\n setPagination((prev) => ({\n ...prev,\n pageIndex: Math.min(prev.pageIndex + 1, pageCount - 1),\n }));\n };\n\n const setPageSize = (size: number) => {\n setPagination(() => ({\n pageIndex: 0,\n pageSize: size,\n }));\n };\n\n const goToPage = (page: number) => {\n setPagination((prev) => ({\n ...prev,\n pageIndex: Math.max(0, Math.min(page, pageCount - 1)),\n }));\n };\n\n // Selection logic\n const toggleRow = (id: string) => {\n setSelectedRows((prev) => {\n const next = new Set(prev);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n return next;\n });\n };\n\n const toggleAllRows = () => {\n if (selectedRows.size === paginatedData.length) {\n setSelectedRows(new Set());\n } else {\n setSelectedRows(new Set(paginatedData.map((row) => getRowId(row))));\n }\n };\n\n const isAllRowsSelected = paginatedData.length > 0 && selectedRows.size === paginatedData.length;\n\n const value: DataGridContextValue<T> = {\n columns,\n data,\n getRowId,\n onRowClick,\n pagination,\n setPagination,\n canPreviousPage,\n canNextPage,\n previousPage,\n nextPage,\n setPageSize,\n goToPage,\n pageCount,\n sorting,\n setSorting,\n selectedRows,\n toggleRow,\n toggleAllRows,\n isAllRowsSelected,\n paginatedData,\n sortedData,\n totalPages,\n recordCount: recordCount ?? data.length,\n };\n\n return <DataGridContext.Provider value={value as DataGridContextValue}>{children}</DataGridContext.Provider>;\n}\n\nexport default DataGrid;\n","import { useDataGrid } from './DataGrid';\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from './ui/table';\n\nexport function DataGridTable() {\n const { columns, paginatedData, getRowId, onRowClick } = useDataGrid();\n\n return (\n <div className=\"border border-gray-200 rounded-lg overflow-hidden\">\n <div className=\"overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n {columns.map((column) => (\n <TableHead\n key={column.id}\n className=\"h-10 px-0 py-0\"\n style={{ width: column.size ? `${column.size}px` : undefined }}\n >\n {column.align === 'center' ? (\n <div className=\"h-10 flex items-center justify-center\">\n {typeof column.header !== 'string' ? (\n column.header\n ) : (\n <span className=\"text-xs font-normal text-gray-500 uppercase tracking-widest\">{column.header}</span>\n )}\n </div>\n ) : (\n <div className=\"h-10 flex items-center text-xs font-normal text-gray-500 uppercase tracking-widest\">\n {typeof column.header !== 'string' ? (\n <div>{column.header}</div>\n ) : (\n <span className=\"px-3\">{column.header}</span>\n )}\n </div>\n )}\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {paginatedData.length === 0 ? (\n <TableRow>\n <TableCell colSpan={columns.length} className=\"text-center py-8 text-gray-500\">\n No results found.\n </TableCell>\n </TableRow>\n ) : (\n paginatedData.map((row, rowIndex) => (\n <TableRow\n key={getRowId(row)}\n className=\"hover:bg-gray-50 cursor-pointer\"\n onClick={() => onRowClick?.(row)}\n >\n {columns.map((column) => {\n const shouldCenter = column.align === 'center';\n const cellValue = column.cell\n ? column.cell(row, rowIndex)\n : column.accessorKey\n ? row[column.accessorKey]\n : null;\n\n return (\n <TableCell\n key={column.id}\n className={shouldCenter ? 'px-0 py-4' : 'px-3 py-4'}\n style={{ width: column.size ? `${column.size}px` : undefined }}\n >\n {shouldCenter ? (\n <div className=\"flex items-center justify-center h-full\">{cellValue as React.ReactNode}</div>\n ) : (\n (cellValue as React.ReactNode)\n )}\n </TableCell>\n );\n })}\n </TableRow>\n ))\n )}\n </TableBody>\n </Table>\n </div>\n </div>\n );\n}\n\nexport default DataGridTable;\n","import * as React from \"react\"\nimport * as SelectPrimitive from \"@radix-ui/react-select\"\nimport { Check, ChevronDown, ChevronUp } from \"lucide-react\"\nimport { cn } from \"@/lib/utils\"\n\nconst Select = SelectPrimitive.Root\n\nconst SelectGroup = SelectPrimitive.Group\n\nconst SelectValue = SelectPrimitive.Value\n\nconst SelectTrigger = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n \"flex h-10 w-full items-center justify-between rounded-md border border-gray-300 bg-white px-3 py-2 text-sm ring-offset-white placeholder:text-gray-400 focus:outline-none focus:border-gray-500 hover:border-gray-400 disabled:cursor-not-allowed disabled:opacity-50 transition-colors\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"h-4 w-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n))\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName\n\nconst SelectScrollUpButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollUpButton\n ref={ref}\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronUp className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollUpButton>\n))\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName\n\nconst SelectScrollDownButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollDownButton\n ref={ref}\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronDown className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollDownButton>\n))\nSelectScrollDownButton.displayName =\n SelectPrimitive.ScrollDownButton.displayName\n\nconst SelectContent = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = \"popper\", ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n \"relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border border-gray-200 bg-white text-gray-950 shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n \"p-1\",\n position === \"popper\" &&\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n))\nSelectContent.displayName = SelectPrimitive.Content.displayName\n\nconst SelectLabel = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label\n ref={ref}\n className={cn(\"py-1.5 pl-8 pr-2 text-sm font-semibold\", className)}\n {...props}\n />\n))\nSelectLabel.displayName = SelectPrimitive.Label.displayName\n\nconst SelectItem = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-gray-100 focus:text-gray-900 data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n))\nSelectItem.displayName = SelectPrimitive.Item.displayName\n\nconst SelectSeparator = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-gray-100\", className)}\n {...props}\n />\n))\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectLabel,\n SelectItem,\n SelectSeparator,\n SelectScrollUpButton,\n SelectScrollDownButton,\n}\n","import { ChevronLeft, ChevronRight } from 'lucide-react';\nimport { useDataGrid } from './DataGrid';\nimport { Button } from './ui/button';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from './ui/select';\n\nexport interface DataGridPaginationProps {\n mode?: 'simple' | 'advanced';\n pageSizeOptions?: number[];\n}\n\nexport function DataGridPagination({ \n mode = 'simple',\n pageSizeOptions = [5, 10, 15, 20]\n}: DataGridPaginationProps) {\n const {\n canPreviousPage,\n canNextPage,\n previousPage,\n nextPage,\n pageCount,\n pagination,\n setPageSize,\n goToPage,\n } = useDataGrid();\n\n // Generate page numbers to display\n const getPageNumbers = () => {\n const current = pagination.pageIndex;\n const total = pageCount;\n const pages: (number | string)[] = [];\n\n if (total <= 7) {\n // Show all pages if total is small (1 2 3 4 5 6 7)\n for (let i = 0; i < total; i++) {\n pages.push(i);\n }\n } else {\n if (current <= 3) {\n // Near the beginning (1 2 3 4 5 ... 10)\n for (let i = 0; i <= 4; i++) {\n pages.push(i);\n }\n pages.push('...');\n pages.push(total - 1);\n } else if (current >= total - 4) {\n // Near the end (1 ... 6 7 8 9 10)\n pages.push(0);\n pages.push('...');\n for (let i = total - 5; i < total; i++) {\n pages.push(i);\n }\n } else {\n // In the middle (1 ... 5 6 7 ... 10)\n pages.push(0);\n pages.push('...');\n pages.push(current - 1);\n pages.push(current);\n pages.push(current + 1);\n pages.push('...');\n pages.push(total - 1);\n }\n }\n\n return pages;\n };\n\n if (mode === 'simple') {\n return (\n <div className=\"flex items-center justify-end px-2 py-4\">\n <div className=\"flex items-center gap-3\">\n <span className=\"text-sm text-gray-700 hidden sm:block\">\n Page {pagination.pageIndex + 1} of {pageCount}\n </span>\n <div className=\"flex gap-1\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={previousPage}\n disabled={!canPreviousPage}\n className=\"h-8 w-8 p-0\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={nextPage}\n disabled={!canNextPage}\n className=\"h-8 w-8 p-0\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n </div>\n );\n }\n\n // Advanced mode\n return (\n <div className=\"flex items-center justify-between gap-3 px-2 py-4\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm text-gray-600 hidden sm:inline\">Rows per page:</span>\n <Select\n value={String(pagination.pageSize)}\n onValueChange={(value) => setPageSize(Number(value))}\n >\n <SelectTrigger className=\"h-8 w-16\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {pageSizeOptions.map((size) => (\n <SelectItem key={size} value={String(size)}>\n {size}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={previousPage}\n disabled={!canPreviousPage}\n className=\"h-8 w-8 p-0\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n \n {/* Show page count on mobile */}\n <span className=\"text-sm text-gray-700 sm:hidden px-2\">\n {pagination.pageIndex + 1} / {pageCount}\n </span>\n \n {/* Show page numbers on desktop */}\n <div className=\"hidden sm:flex gap-1\">\n {getPageNumbers().map((page, index) => (\n typeof page === 'number' ? (\n <Button\n key={index}\n variant={pagination.pageIndex === page ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => goToPage(page)}\n className=\"h-8 w-8 p-0\"\n >\n {page + 1}\n </Button>\n ) : (\n <span key={index} className=\"flex h-8 w-8 items-center justify-center text-gray-400\">\n {page}\n </span>\n )\n ))}\n </div>\n\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={nextPage}\n disabled={!canNextPage}\n className=\"h-8 w-8 p-0\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n );\n}\n\nexport default DataGridPagination;\n","import { ChevronDown, ChevronUp, ChevronsUpDown } from 'lucide-react';\nimport { useDataGrid } from './DataGrid';\nimport { Button } from './ui/button';\n\ninterface DataGridColumnHeaderProps {\n id: string;\n title: string;\n}\n\nexport function DataGridColumnHeader({ id, title }: DataGridColumnHeaderProps) {\n const { sorting, setSorting } = useDataGrid();\n\n const sortState = sorting.find((s) => s.id === id);\n const isSorted = !!sortState;\n const isDesc = sortState?.desc ?? false;\n\n const handleSort = () => {\n setSorting((prev) => {\n const existing = prev.find((s) => s.id === id);\n if (!existing) {\n return [{ id, desc: false }];\n }\n if (!existing.desc) {\n return [{ id, desc: true }];\n }\n return [];\n });\n };\n\n return (\n <Button\n variant=\"ghost\"\n className=\"h-auto px-3 py-1.5 font-normal hover:bg-transparent hover:text-gray-900\"\n onClick={handleSort}\n >\n {title}\n {isSorted && isDesc ? (\n <ChevronDown className=\"h-4 w-4\" />\n ) : isSorted ? (\n <ChevronUp className=\"h-4 w-4\" />\n ) : (\n <ChevronsUpDown className=\"h-4 w-4\" />\n )}\n </Button>\n );\n}\n\nexport default DataGridColumnHeader;\n","import { useDataGrid } from './DataGrid';\nimport { Checkbox } from './ui/checkbox';\n\nexport function DataGridTableRowSelectAll() {\n const { toggleAllRows, isAllRowsSelected } = useDataGrid();\n\n return <Checkbox checked={isAllRowsSelected} onCheckedChange={toggleAllRows} />;\n}\n\ninterface DataGridTableRowSelectProps<T = Record<string, unknown>> {\n row: T;\n}\n\nexport function DataGridTableRowSelect<T = Record<string, unknown>>({\n row,\n}: DataGridTableRowSelectProps<T>) {\n const { selectedRows, toggleRow, getRowId } = useDataGrid<T>();\n const rowId = getRowId(row);\n\n return <Checkbox checked={selectedRows.has(rowId)} onCheckedChange={() => toggleRow(rowId)} />;\n}\n\nexport default DataGridTableRowSelect;\n","import * as React from \"react\"\nimport { ChevronLeft, ChevronRight, Calendar as CalendarIcon } from \"lucide-react\"\nimport { Button } from \"./ui/button\"\nimport { cn } from \"@/lib/utils\"\nimport type { Holiday } from \"./DatePicker\"\n\nexport interface CalendarEvent {\n date: Date\n title: string\n type?: string\n time?: string\n id?: string\n location?: string\n}\n\nexport interface CalendarProps {\n selected?: Date\n onSelect?: (date: Date) => void\n events?: CalendarEvent[]\n holidays?: Holiday[]\n className?: string\n}\n\n// Utility functions for date manipulation\nconst startOfMonth = (date: Date): Date => {\n return new Date(date.getFullYear(), date.getMonth(), 1)\n}\n\nconst endOfMonth = (date: Date): Date => {\n return new Date(date.getFullYear(), date.getMonth() + 1, 0)\n}\n\nconst eachDayOfInterval = (start: Date, end: Date): Date[] => {\n const days: Date[] = []\n const current = new Date(start)\n while (current <= end) {\n days.push(new Date(current))\n current.setDate(current.getDate() + 1)\n }\n return days\n}\n\nconst isSameMonth = (date1: Date, date2: Date): boolean => {\n return date1.getMonth() === date2.getMonth() && date1.getFullYear() === date2.getFullYear()\n}\n\nconst isSameDay = (date1: Date, date2: Date): boolean => {\n return date1.getDate() === date2.getDate() && \n date1.getMonth() === date2.getMonth() && \n date1.getFullYear() === date2.getFullYear()\n}\n\nconst isToday = (date: Date): boolean => {\n return isSameDay(date, new Date())\n}\n\nconst isTomorrow = (date: Date): boolean => {\n const tomorrow = new Date()\n tomorrow.setDate(tomorrow.getDate() + 1)\n return isSameDay(date, tomorrow)\n}\n\nconst addMonths = (date: Date, months: number): Date => {\n const newDate = new Date(date)\n newDate.setMonth(newDate.getMonth() + months)\n return newDate\n}\n\nconst formatDate = (date: Date, format: string): string => {\n const monthNames = [\n \"January\", \"February\", \"March\", \"April\", \"May\", \"June\",\n \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"\n ]\n const monthNamesShort = [\n \"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\",\n \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"\n ]\n \n if (format === \"MMMM yyyy\") {\n return `${monthNames[date.getMonth()]} ${date.getFullYear()}`\n }\n if (format === \"MMM d, yyyy\") {\n return `${monthNamesShort[date.getMonth()]} ${date.getDate()}, ${date.getFullYear()}`\n }\n if (format === \"d\") {\n return date.getDate().toString()\n }\n return date.toLocaleDateString()\n}\n\nexport function Calendar({\n selected,\n onSelect,\n events = [],\n holidays = [],\n className,\n ...props\n}: CalendarProps) {\n const [currentMonth, setCurrentMonth] = React.useState(new Date())\n const [view, setView] = React.useState<'calendar' | 'months' | 'years'>('calendar')\n\n const monthStart = startOfMonth(currentMonth)\n const monthEnd = endOfMonth(currentMonth)\n const days = eachDayOfInterval(monthStart, monthEnd)\n\n const months = [\n \"January\", \"February\", \"March\", \"April\", \"May\", \"June\",\n \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"\n ]\n\n const dayNames = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"]\n\n const currentYear = currentMonth.getFullYear()\n const years = Array.from({ length: 20 }, (_, i) => currentYear - 10 + i)\n\n const previousMonth = () => {\n setCurrentMonth(addMonths(currentMonth, -1))\n }\n\n const nextMonth = () => {\n setCurrentMonth(addMonths(currentMonth, 1))\n }\n\n const previousYear = () => {\n const newDate = new Date(currentMonth)\n newDate.setFullYear(currentYear - 1)\n setCurrentMonth(newDate)\n }\n\n const nextYear = () => {\n const newDate = new Date(currentMonth)\n newDate.setFullYear(currentYear + 1)\n setCurrentMonth(newDate)\n }\n\n const selectMonth = (monthIndex: number) => {\n const newDate = new Date(currentMonth)\n newDate.setMonth(monthIndex)\n setCurrentMonth(newDate)\n setView('calendar')\n }\n\n const selectYear = (year: number) => {\n const newDate = new Date(currentMonth)\n newDate.setFullYear(year)\n setCurrentMonth(newDate)\n setView('calendar')\n }\n\n const getEventsForDay = (day: Date) => {\n return events.filter(event => isSameDay(event.date, day))\n }\n\n const isHoliday = (checkDate: Date) => {\n return holidays.some(h => isSameDay(h.date, checkDate))\n }\n\n // Month picker view\n if (view === 'months') {\n return (\n <div className={cn(\"bg-white rounded-lg border border-gray-200 w-full\", className)} {...props}>\n <div className=\"px-6 py-4 border-b border-gray-100\">\n <div className=\"flex items-center justify-between\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setView('calendar')}\n className=\"h-9 px-3 text-sm font-medium text-gray-600 hover:text-gray-900 hover:bg-gray-50 rounded\"\n >\n ← Back\n </Button>\n \n <div className=\"flex items-center space-x-1\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={previousYear}\n className=\"h-9 w-9 p-0 border-gray-200 rounded\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n \n <Button\n variant=\"ghost\"\n onClick={() => setView('years')}\n className=\"h-9 px-4 text-lg font-semibold text-gray-900 hover:bg-gray-50 rounded\"\n >\n {currentYear}\n </Button>\n \n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={nextYear}\n className=\"h-9 w-9 p-0 border-gray-200 rounded\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n </div>\n\n <div className=\"p-6\">\n <div className=\"grid grid-cols-3 gap-2\">\n {months.map((month, index) => (\n <Button\n key={month}\n variant=\"ghost\"\n onClick={() => selectMonth(index)}\n className={cn(\n \"h-11 w-full text-sm font-medium rounded transition-all duration-200\",\n index === currentMonth.getMonth() \n ? \"bg-gray-900 text-white hover:bg-gray-800 shadow-sm\" \n : \"text-gray-600 hover:text-gray-900 hover:bg-gray-50\"\n )}\n >\n {month}\n </Button>\n ))}\n </div>\n </div>\n </div>\n )\n }\n\n // Year picker view\n if (view === 'years') {\n return (\n <div className={cn(\"bg-white rounded-lg border border-gray-200 w-full\", className)} {...props}>\n <div className=\"px-6 py-4 border-b border-gray-100\">\n <div className=\"flex items-center justify-between\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setView('months')}\n className=\"h-9 px-3 text-sm font-medium text-gray-600 hover:text-gray-900 hover:bg-gray-50 rounded\"\n >\n ← Back\n </Button>\n \n <h3 className=\"text-lg font-semibold text-gray-900\">Select Year</h3>\n </div>\n </div>\n\n <div className=\"p-6\">\n <div className=\"grid grid-cols-4 gap-2 max-h-64 overflow-y-auto\">\n {years.map((year) => (\n <Button\n key={year}\n variant=\"ghost\"\n onClick={() => selectYear(year)}\n className={cn(\n \"h-11 w-full text-sm font-medium rounded transition-all duration-200\",\n year === currentYear \n ? \"bg-gray-900 text-white hover:bg-gray-800 shadow-sm\" \n : \"text-gray-600 hover:text-gray-900 hover:bg-gray-50\"\n )}\n >\n {year}\n </Button>\n ))}\n </div>\n </div>\n </div>\n )\n }\n\n // Default calendar view\n return (\n <div className={cn(\"bg-white rounded-lg border border-gray-200 w-full\", className)} {...props}>\n {/* Month/Year Navigation */}\n <div className=\"px-6 py-4 border-b border-gray-100\">\n <div className=\"flex items-center justify-between\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={previousMonth}\n className=\"h-9 w-9 p-0 border-gray-200 rounded\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n \n <Button\n variant=\"ghost\"\n onClick={() => setView('months')}\n className=\"h-9 px-4 text-lg font-semibold text-gray-900 hover:bg-gray-50 rounded\"\n >\n {formatDate(currentMonth, \"MMMM yyyy\")}\n </Button>\n\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={nextMonth}\n className=\"h-9 w-9 p-0 border-gray-200 rounded\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n\n {/* Calendar Body */}\n <div className=\"p-6\">\n {/* Weekday headers */}\n <div className=\"grid grid-cols-7 gap-1 mb-2\">\n {dayNames.map((day, index) => (\n <div key={index} className=\"h-10 flex items-center justify-center\">\n <span className=\"text-xs font-medium text-gray-400 uppercase\">\n {day}\n </span>\n </div>\n ))}\n </div>\n\n {/* Calendar grid */}\n <div className=\"grid grid-cols-7 gap-1\">\n {Array.from({ length: monthStart.getDay() }).map((_, index) => (\n <div key={`empty-${index}`} className=\"h-12\" />\n ))}\n {days.map((day) => {\n const dayEvents = getEventsForDay(day)\n const isSelectedDay = selected && isSameDay(day, selected)\n const isTodayDay = isToday(day)\n const isCurrentMonth = isSameMonth(day, currentMonth)\n const isHolidayDay = isHoliday(day)\n\n return (\n <div key={day.toISOString()} className=\"relative\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={cn(\n \"h-12 w-full p-0 text-sm relative rounded transition-all duration-200\",\n !isCurrentMonth && \"text-gray-300\",\n isCurrentMonth && !isSelectedDay && !isTodayDay && !isHolidayDay && \"text-gray-700 hover:bg-gray-50\",\n isHolidayDay && !isSelectedDay && \"text-red-600 font-medium hover:bg-red-50\",\n isTodayDay && !isSelectedDay && \"bg-gray-100 text-gray-900 font-medium border border-gray-200\",\n isSelectedDay && \"bg-gray-900 text-white font-medium shadow-sm\",\n )}\n onClick={() => onSelect?.(day)}\n >\n {formatDate(day, \"d\")}\n \n {/* Event indicators */}\n {dayEvents.length > 0 && (\n <div className=\"absolute bottom-1 left-1/2 transform -translate-x-1/2 flex space-x-0.5\">\n {dayEvents.slice(0, 3).map((event, idx) => {\n const getEventColor = (type?: string) => {\n if (isSelectedDay) return \"bg-white/80\"\n switch (type) {\n case \"class\": return \"bg-blue-500\"\n case \"meeting\": return \"bg-green-500\"\n case \"appointment\": return \"bg-orange-500\"\n case \"deadline\": return \"bg-red-500\"\n default: return \"bg-gray-500\"\n }\n }\n \n return (\n <div\n key={idx}\n className={cn(\n \"w-1 h-1 rounded-full\",\n getEventColor(event.type)\n )}\n />\n )\n })}\n {dayEvents.length > 3 && (\n <div className={cn(\n \"w-1 h-1 rounded-full\",\n isSelectedDay ? \"bg-white/60\" : \"bg-gray-400\"\n )} />\n )}\n </div>\n )}\n </Button>\n </div>\n )\n })}\n </div>\n </div>\n\n {/* Events Section */}\n {selected && (\n <div className=\"border-t border-gray-100\">\n <div className=\"p-6\">\n <div className=\"flex items-center justify-between mb-4\">\n <h4 className=\"text-sm font-semibold text-gray-900\">\n {isToday(selected) \n ? \"Today\"\n : isTomorrow(selected) \n ? \"Tomorrow\"\n : formatDate(selected, \"MMM d, yyyy\")\n }\n </h4>\n </div>\n \n {(() => {\n const dayEvents = events.filter(event => isSameDay(event.date, selected))\n \n return (\n <div className=\"space-y-3\">\n {dayEvents.length > 0 && dayEvents.map((event) => {\n const getEventTypeStyles = (type?: string) => {\n switch (type) {\n case \"class\": return { bg: \"bg-blue-50\", border: \"border-blue-100\", dot: \"bg-blue-500\", text: \"text-blue-900\", subtext: \"text-blue-600\" }\n case \"meeting\": return { bg: \"bg-green-50\", border: \"border-green-100\", dot: \"bg-green-500\", text: \"text-green-900\", subtext: \"text-green-600\" }\n case \"appointment\": return { bg: \"bg-orange-50\", border: \"border-orange-100\", dot: \"bg-orange-500\", text: \"text-orange-900\", subtext: \"text-orange-600\" }\n case \"deadline\": return { bg: \"bg-red-50\", border: \"border-red-100\", dot: \"bg-red-500\", text: \"text-red-900\", subtext: \"text-red-600\" }\n default: return { bg: \"bg-gray-50\", border: \"border-gray-100\", dot: \"bg-gray-500\", text: \"text-gray-900\", subtext: \"text-gray-600\" }\n }\n }\n \n const styles = getEventTypeStyles(event.type)\n \n return (\n <div key={event.id || event.title} className={`flex items-center space-x-3 p-3 ${styles.bg} rounded border ${styles.border} hover:shadow-sm transition-shadow cursor-pointer`}>\n <div className={`w-2 h-2 rounded-full ${styles.dot} flex-shrink-0`} />\n <div className=\"flex-1 min-w-0\">\n <p className={`text-sm font-medium ${styles.text} truncate`}>{event.title}</p>\n {(event.time || event.location) && (\n <p className={`text-xs ${styles.subtext} truncate`}>\n {event.time}\n {event.time && event.location && ' • '}\n {event.location}\n </p>\n )}\n </div>\n </div>\n )\n })}\n \n {dayEvents.length === 0 && (\n <div className=\"text-center py-8\">\n <div className=\"w-12 h-12 bg-gray-100 rounded-full flex items-center justify-center mx-auto mb-3\">\n <CalendarIcon className=\"w-5 h-5 text-gray-400\" />\n </div>\n <p className=\"text-sm text-gray-500\">No events scheduled</p>\n </div>\n )}\n </div>\n )\n })()}\n </div>\n </div>\n )}\n\n {/* Footer with today button */}\n {!isSameMonth(currentMonth, new Date()) && (\n <div className=\"p-6 pt-0\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => {\n const today = new Date()\n setCurrentMonth(today)\n onSelect?.(today)\n setView('calendar')\n }}\n className=\"w-full h-10 text-sm font-medium border-gray-200 hover:bg-gray-50 rounded\"\n >\n Today\n </Button>\n </div>\n )}\n </div>\n )\n}\n","import * as React from \"react\"\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\"\nimport { cn } from \"@/lib/utils\"\n\nconst Popover = PopoverPrimitive.Root\n\nconst PopoverTrigger = PopoverPrimitive.Trigger\n\nconst PopoverAnchor = PopoverPrimitive.Anchor\n\nconst PopoverContent = React.forwardRef<\n React.ElementRef<typeof PopoverPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\n>(({ className, align = \"center\", sideOffset = 4, ...props }, ref) => {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 w-auto rounded-md border border-gray-200 bg-white p-3 text-gray-950 shadow-lg outline-none\",\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n \"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95\",\n \"data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2\",\n \"data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n )\n})\nPopoverContent.displayName = PopoverPrimitive.Content.displayName\n\nexport { Popover, PopoverTrigger, PopoverContent, PopoverAnchor }\n","import * as React from \"react\"\nimport { format, startOfMonth, endOfMonth, eachDayOfInterval, isSameDay, isToday, isSameMonth, addMonths, subMonths } from \"date-fns\"\nimport { Calendar as CalendarIcon, ChevronLeft, ChevronRight } from \"lucide-react\"\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"./ui/button\"\nimport { Popover, PopoverContent, PopoverTrigger } from \"./ui/popover\"\n\nexport interface Holiday {\n date: Date\n name: string\n country?: string\n}\n\nexport interface DatePickerProps {\n /** The selected date */\n date?: Date\n /** Callback when date changes */\n onDateChange?: (date: Date | undefined) => void\n /** Mode: single date or range */\n mode?: 'single' | 'range'\n /** Selected date range (for range mode) */\n dateRange?: { from?: Date; to?: Date }\n /** Callback when date range changes (for range mode) */\n onDateRangeChange?: (range: { from?: Date; to?: Date } | undefined) => void\n /** Placeholder text when no date is selected */\n placeholder?: string\n /** Date format string (default: \"PPP\") */\n dateFormat?: string\n /** Disabled state */\n disabled?: boolean\n /** Custom className for the trigger button */\n className?: string\n /** Button variant */\n variant?: \"default\" | \"outline\" | \"ghost\"\n /** Button size */\n size?: \"default\" | \"sm\" | \"lg\"\n /** Alignment of the popover */\n align?: \"start\" | \"center\" | \"end\"\n /** Show icon in button */\n showIcon?: boolean\n /** Custom icon */\n icon?: React.ReactNode\n /** Minimum selectable date */\n minDate?: Date\n /** Maximum selectable date */\n maxDate?: Date\n /** Array of disabled dates */\n disabledDates?: Date[]\n /** Function to determine if a date should be disabled */\n isDateDisabled?: (date: Date) => boolean\n /** Full width button */\n fullWidth?: boolean\n /** Custom trigger element */\n customTrigger?: React.ReactNode\n /** Number of months to display (1 or 2) */\n numberOfMonths?: 1 | 2\n /** Array of holidays to display */\n holidays?: Holiday[]\n}\n\nexport function DatePicker({\n date,\n onDateChange,\n mode = 'single',\n dateRange,\n onDateRangeChange,\n placeholder = \"Pick a date\",\n dateFormat = \"PPP\",\n disabled = false,\n className,\n variant = \"outline\",\n size = \"default\",\n align = \"start\",\n showIcon = true,\n icon,\n minDate,\n maxDate,\n disabledDates,\n isDateDisabled,\n fullWidth = false,\n customTrigger,\n numberOfMonths = 1,\n holidays = [],\n}: DatePickerProps) {\n const [open, setOpen] = React.useState(false)\n const [currentMonth, setCurrentMonth] = React.useState(date || new Date())\n const [view, setView] = React.useState<'calendar' | 'months' | 'years'>('calendar')\n const [rangeStart, setRangeStart] = React.useState<Date | undefined>(dateRange?.from)\n const [rangeEnd, setRangeEnd] = React.useState<Date | undefined>(dateRange?.to)\n const [hoverDate, setHoverDate] = React.useState<Date | undefined>()\n\n // Sync range state with prop changes\n React.useEffect(() => {\n setRangeStart(dateRange?.from)\n setRangeEnd(dateRange?.to)\n }, [dateRange])\n\n // Sync currentMonth with date prop and reset view when opening\n React.useEffect(() => {\n if (open) {\n setView('calendar')\n if (mode === 'single' && date) {\n setCurrentMonth(date)\n } else if (mode === 'range' && dateRange?.from) {\n setCurrentMonth(dateRange.from)\n }\n }\n }, [open, date, dateRange, mode])\n\n const handleSelect = (selectedDate: Date) => {\n if (mode === 'range') {\n if (!rangeStart || (rangeStart && rangeEnd)) {\n // Start new range\n setRangeStart(selectedDate)\n setRangeEnd(undefined)\n onDateRangeChange?.({ from: selectedDate, to: undefined })\n } else {\n // Complete the range\n const from = rangeStart < selectedDate ? rangeStart : selectedDate\n const to = rangeStart < selectedDate ? selectedDate : rangeStart\n setRangeStart(from)\n setRangeEnd(to)\n onDateRangeChange?.({ from, to })\n setOpen(false)\n }\n } else {\n onDateChange?.(selectedDate)\n setOpen(false)\n }\n }\n\n const isDateDisabledCheck = (checkDate: Date) => {\n if (disabledDates?.some(d => d.toDateString() === checkDate.toDateString())) {\n return true\n }\n if (minDate && checkDate < minDate) return true\n if (maxDate && checkDate > maxDate) return true\n if (isDateDisabled?.(checkDate)) return true\n return false\n }\n\n const isHoliday = (checkDate: Date) => {\n return holidays.some(h => isSameDay(h.date, checkDate))\n }\n\n const monthStart = startOfMonth(currentMonth)\n const monthEnd = endOfMonth(currentMonth)\n const days = eachDayOfInterval({ start: monthStart, end: monthEnd })\n const dayNames = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"]\n\n const nextMonthDate = addMonths(currentMonth, 1)\n const nextMonthStart = startOfMonth(nextMonthDate)\n const nextMonthEnd = endOfMonth(nextMonthDate)\n const nextMonthDays = eachDayOfInterval({ start: nextMonthStart, end: nextMonthEnd })\n\n const previousMonth = () => {\n setCurrentMonth(subMonths(currentMonth, 1))\n }\n\n const nextMonth = () => {\n setCurrentMonth(addMonths(currentMonth, 1))\n }\n\n const formatDate = (date: Date, formatStr: string) => {\n return format(date, formatStr)\n }\n\n const isInRange = (day: Date) => {\n if (rangeStart && rangeEnd) {\n return day >= rangeStart && day <= rangeEnd\n }\n if (rangeStart && !rangeEnd && hoverDate) {\n const start = rangeStart < hoverDate ? rangeStart : hoverDate\n const end = rangeStart < hoverDate ? hoverDate : rangeStart\n return day >= start && day <= end\n }\n return false\n }\n\n const isRangeStart = (day: Date) => {\n return rangeStart && isSameDay(day, rangeStart)\n }\n\n const isRangeEnd = (day: Date) => {\n return rangeEnd && isSameDay(day, rangeEnd)\n }\n\n const previousYear = () => {\n const newDate = new Date(currentMonth)\n newDate.setFullYear(currentYear - 1)\n setCurrentMonth(newDate)\n }\n\n const nextYear = () => {\n const newDate = new Date(currentMonth)\n newDate.setFullYear(currentYear + 1)\n setCurrentMonth(newDate)\n }\n\n const selectMonth = (monthIndex: number) => {\n const newDate = new Date(currentMonth.getFullYear(), monthIndex, 1)\n setCurrentMonth(newDate)\n setView('calendar')\n }\n\n const selectYear = (year: number) => {\n const newDate = new Date(year, currentMonth.getMonth(), 1)\n setCurrentMonth(newDate)\n setView('calendar')\n }\n\n const monthNames = [\n 'January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December'\n ]\n\n const currentYear = currentMonth.getFullYear()\n const years = Array.from({ length: 20 }, (_, i) => currentYear - 10 + i)\n\n const triggerContent = customTrigger || (\n <Button\n variant={variant}\n size={size}\n className={cn(\n \"justify-start text-left font-normal\",\n !date && !rangeStart && \"text-gray-500\",\n fullWidth && \"w-full\",\n className\n )}\n disabled={disabled}\n >\n {showIcon && (icon || <CalendarIcon className=\"mr-2 h-4 w-4\" />)}\n {mode === 'range' ? (\n rangeStart && rangeEnd ? (\n <span>{format(rangeStart, dateFormat)} - {format(rangeEnd, dateFormat)}</span>\n ) : rangeStart ? (\n <span>{format(rangeStart, dateFormat)} - ...</span>\n ) : (\n <span>{placeholder}</span>\n )\n ) : (\n date ? format(date, dateFormat) : <span>{placeholder}</span>\n )}\n </Button>\n )\n\n const renderDayCell = (day: Date, isCurrentMonth: boolean) => {\n const isSelectedDay = mode === 'single' ? (date && isSameDay(day, date)) : (isRangeStart(day) || isRangeEnd(day))\n const isTodayDay = isToday(day)\n const isDisabled = isDateDisabledCheck(day)\n const inRange = mode === 'range' && isInRange(day)\n const isHolidayDay = isHoliday(day)\n const dayOfWeek = day.getDay()\n const isRangeStartDay = isRangeStart(day)\n const isRangeEndDay = isRangeEnd(day)\n\n return (\n <div\n key={day.toISOString()}\n className={cn(\n \"relative p-0.5\",\n inRange && \"bg-gray-100\",\n inRange && dayOfWeek === 0 && \"rounded-l-md\",\n inRange && dayOfWeek === 6 && \"rounded-r-md\",\n inRange && isRangeStartDay && \"rounded-l-md\",\n inRange && isRangeEndDay && \"rounded-r-md\"\n )}\n onMouseEnter={() => mode === 'range' && rangeStart && !rangeEnd && setHoverDate(day)}\n onMouseLeave={() => setHoverDate(undefined)}\n >\n <Button\n variant=\"ghost\"\n size=\"sm\"\n disabled={isDisabled || disabled}\n className={cn(\n \"h-10 w-full p-0 text-sm relative transition-all duration-200 rounded-md text-gray-900\",\n !isCurrentMonth && \"text-gray-300\",\n isHolidayDay && !isSelectedDay && \"text-red-600 font-medium\",\n isTodayDay && !isSelectedDay && !inRange && \"bg-gray-50 text-gray-900 font-medium border border-gray-200\",\n isSelectedDay && \"bg-gray-900 text-white font-medium shadow-sm z-10 hover:bg-gray-800\",\n inRange && !isSelectedDay && \"text-gray-900 bg-gray-100\",\n isDisabled && \"opacity-40 cursor-not-allowed\"\n )}\n onClick={() => !isDisabled && handleSelect(day)}\n >\n {formatDate(day, \"d\")}\n </Button>\n </div>\n )\n }\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n {triggerContent}\n </PopoverTrigger>\n <PopoverContent \n className={cn(\n \"p-0 border-gray-200\",\n numberOfMonths === 2 ? \"w-[640px]\" : \"w-80\"\n )}\n align={align} \n side=\"bottom\" \n sideOffset={4} \n collisionPadding={8}\n >\n <div className=\"bg-white rounded-lg\" data-takaui=\"datepicker\">\n {/* Calendar Header */}\n <div className=\"border-b border-gray-100 px-6 py-4\">\n <div className=\"flex items-center justify-between\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={previousMonth}\n className=\"h-9 w-9 p-0\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n\n {numberOfMonths === 2 ? (\n <div className=\"flex items-center gap-1\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setView('months')}\n className=\"h-9 px-3 font-semibold text-base\"\n >\n {formatDate(currentMonth, \"MMMM\")}\n </Button>\n <span className=\"text-gray-400 text-sm\">-</span>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setView('months')}\n className=\"h-9 px-3 font-semibold text-base\"\n >\n {formatDate(nextMonthDate, \"MMMM yyyy\")}\n </Button>\n </div>\n ) : (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setView('months')}\n className=\"h-9 px-4 font-semibold text-lg\"\n >\n {formatDate(currentMonth, \"MMMM yyyy\")}\n </Button>\n )}\n\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={nextMonth}\n className=\"h-9 w-9 p-0\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n\n {/* Calendar Body */}\n <div className=\"p-6\">\n {view === 'years' && (\n <>\n <div className=\"flex items-center justify-between\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setView('months')}\n className=\"h-9 px-3 text-sm font-medium text-gray-600\"\n >\n ← Back\n </Button>\n <h3 className=\"text-lg font-semibold text-gray-900\">Select Year</h3>\n </div>\n <div className=\"grid grid-cols-4 gap-2 max-h-64 overflow-y-auto\">\n {years.map((year) => (\n <Button\n key={year}\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => selectYear(year)}\n className={cn(\n \"h-11 w-full text-sm font-medium rounded-md transition-all duration-200\",\n year === currentYear\n ? \"bg-gray-900 text-white shadow-sm hover:bg-gray-800\"\n : \"text-gray-900 bg-transparent\"\n )}\n >\n {year}\n </Button>\n ))}\n </div>\n </>\n )}\n\n {view === 'months' && (\n <>\n <div className=\"flex items-center justify-between\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setView('calendar')}\n className=\"h-9 px-3 text-sm font-medium text-gray-600\"\n >\n ← Back\n </Button>\n \n <div className=\"flex items-center gap-1\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={previousYear}\n className=\"h-9 w-9 p-0\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n \n <Button\n variant=\"ghost\"\n onClick={() => setView('years')}\n className=\"h-9 px-4 text-lg font-semibold text-gray-900\"\n >\n {currentYear}\n </Button>\n \n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={nextYear}\n className=\"h-9 w-9 p-0\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n <div className=\"grid grid-cols-3 gap-2\">\n {monthNames.map((month, index) => (\n <Button\n key={month}\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => selectMonth(index)}\n className={cn(\n \"h-11 w-full text-sm font-medium rounded-md transition-all duration-200\",\n index === currentMonth.getMonth()\n ? \"bg-gray-900 text-white shadow-sm hover:bg-gray-800\"\n : \"text-gray-900 bg-transparent\"\n )}\n >\n {month}\n </Button>\n ))}\n </div>\n </>\n )}\n\n {view === 'calendar' && (\n <div className={cn(\"flex\", numberOfMonths === 2 ? \"gap-6\" : \"gap-0\")}>\n {/* Current Month */}\n <div className=\"flex-1\">\n {/* Weekday headers */}\n <div className=\"grid grid-cols-7 gap-1 mb-2\">\n {dayNames.map((day, index) => (\n <div key={index} className=\"h-8 flex items-center justify-center\">\n <span className=\"text-xs font-medium text-gray-400 uppercase\">\n {day}\n </span>\n </div>\n ))}\n </div>\n\n {/* Calendar grid */}\n <div className=\"grid grid-cols-7\">\n {Array.from({ length: monthStart.getDay() }).map((_, index) => (\n <div key={`empty-${index}`} className=\"h-10\" />\n ))}\n {days.map((day) => renderDayCell(day, isSameMonth(day, currentMonth)))}\n </div>\n </div>\n\n {/* Next Month */}\n {numberOfMonths === 2 && (\n <div className=\"flex-1\">\n {/* Weekday headers */}\n <div className=\"grid grid-cols-7 gap-1 mb-2\">\n {dayNames.map((day, index) => (\n <div key={index} className=\"h-8 flex items-center justify-center\">\n <span className=\"text-xs font-medium text-gray-400 uppercase\">\n {day}\n </span>\n </div>\n ))}\n </div>\n\n {/* Calendar grid */}\n <div className=\"grid grid-cols-7\">\n {Array.from({ length: nextMonthStart.getDay() }).map((_, index) => (\n <div key={`next-empty-${index}`} className=\"h-10\" />\n ))}\n {nextMonthDays.map((day) => renderDayCell(day, isSameMonth(day, nextMonthDate)))}\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n </PopoverContent>\n </Popover>\n )\n}\n","import React, { useState, useEffect, useRef } from 'react';\nimport { Popover, PopoverContent, PopoverTrigger } from './ui/popover';\nimport { Button } from './ui/button';\nimport { Clock } from 'lucide-react';\nimport { cn } from '../lib/utils';\n\ninterface TimePickerProps {\n time: Date | undefined;\n onTimeChange: (date: Date | undefined) => void;\n timezone?: string;\n onTimezoneChange?: (timezone: string) => void;\n format?: '12h' | '24h';\n showTimezone?: boolean;\n minuteStep?: 1 | 5 | 10 | 15 | 30;\n showSeconds?: boolean;\n placeholder?: string;\n variant?: 'default' | 'outline' | 'ghost';\n size?: 'sm' | 'default' | 'lg';\n showClockFace?: boolean;\n}\n\nexport const TimePicker: React.FC<TimePickerProps> = ({\n time,\n onTimeChange,\n timezone = 'UTC',\n format = '24h',\n showTimezone = false,\n minuteStep = 1,\n showSeconds = false,\n placeholder = 'Select time',\n variant = 'outline',\n size = 'default',\n showClockFace = false,\n}) => {\n const is24Hour = format === '24h';\n \n // Initialize state from time prop to avoid cascading renders\n const initialHours = time ? time.getHours() : 0;\n const initialMinutes = time ? time.getMinutes() : 0;\n const initialSeconds = time ? time.getSeconds() : 0;\n const initialPeriod = initialHours >= 12 ? 'PM' : 'AM';\n \n const [hours, setHours] = useState<number>(initialHours);\n const [minutes, setMinutes] = useState<number>(initialMinutes);\n const [seconds, setSeconds] = useState<number>(initialSeconds);\n const [period, setPeriod] = useState<'AM' | 'PM'>(initialPeriod);\n\n // Input states for editable fields\n const [hourInput, setHourInput] = useState<string>('');\n const [minuteInput, setMinuteInput] = useState<string>('');\n const [secondInput, setSecondInput] = useState<string>('');\n\n const hourInputRef = useRef<HTMLInputElement>(null);\n const minuteInputRef = useRef<HTMLInputElement>(null);\n const secondInputRef = useRef<HTMLInputElement>(null);\n\n const hourScrollRef = useRef<HTMLDivElement>(null);\n const minuteScrollRef = useRef<HTMLDivElement>(null);\n const secondScrollRef = useRef<HTMLDivElement>(null);\n\n // Update internal state when time prop changes\n useEffect(() => {\n if (time) {\n const h = time.getHours();\n const m = time.getMinutes();\n const s = time.getSeconds();\n const p = h >= 12 ? 'PM' : 'AM';\n \n // Only update if values actually changed to prevent loops\n if (h !== hours) setHours(h);\n if (m !== minutes) setMinutes(m);\n if (s !== seconds) setSeconds(s);\n if (p !== period) setPeriod(p);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [time]); // Only depend on time prop\n\n useEffect(() => {\n // Scroll to selected values\n if (hourScrollRef.current) {\n const selectedHour = hourScrollRef.current.querySelector('[data-selected=\"true\"]');\n selectedHour?.scrollIntoView({ block: 'center', behavior: 'smooth' });\n }\n if (minuteScrollRef.current) {\n const selectedMinute = minuteScrollRef.current.querySelector('[data-selected=\"true\"]');\n selectedMinute?.scrollIntoView({ block: 'center', behavior: 'smooth' });\n }\n if (secondScrollRef.current) {\n const selectedSecond = secondScrollRef.current.querySelector('[data-selected=\"true\"]');\n selectedSecond?.scrollIntoView({ block: 'center', behavior: 'smooth' });\n }\n }, [hours, minutes, seconds, is24Hour]);\n\n const updateTime = (h: number, m: number, s: number) => {\n const newTime = new Date();\n newTime.setHours(h);\n newTime.setMinutes(m);\n newTime.setSeconds(s);\n onTimeChange(newTime);\n };\n\n const handleHourChange = (hour: number) => {\n let newHour = hour;\n if (!is24Hour) {\n if (period === 'PM' && hour !== 12) {\n newHour = hour + 12;\n } else if (period === 'AM' && hour === 12) {\n newHour = 0;\n }\n }\n setHours(newHour);\n updateTime(newHour, minutes, seconds);\n };\n\n const handleMinuteChange = (minute: number) => {\n setMinutes(minute);\n updateTime(hours, minute, seconds);\n };\n\n const handleSecondChange = (second: number) => {\n setSeconds(second);\n updateTime(hours, minutes, second);\n };\n\n const handlePeriodToggle = (newPeriod: 'AM' | 'PM') => {\n if (period === newPeriod) return;\n setPeriod(newPeriod);\n const newHour = newPeriod === 'PM' ? \n (hours % 12) + 12 : \n hours % 12;\n setHours(newHour);\n updateTime(newHour, minutes, seconds);\n };\n\n const handleNow = () => {\n const now = new Date();\n setHours(now.getHours());\n setMinutes(now.getMinutes());\n setSeconds(now.getSeconds());\n setPeriod(now.getHours() >= 12 ? 'PM' : 'AM');\n onTimeChange(now);\n };\n\n const formatTime = () => {\n if (!time) return placeholder;\n \n const h = is24Hour ? hours : (hours % 12 || 12);\n const m = minutes.toString().padStart(2, '0');\n const s = seconds.toString().padStart(2, '0');\n \n let timeStr = `${h.toString().padStart(2, '0')}:${m}`;\n if (showSeconds) timeStr += `:${s}`;\n if (!is24Hour) timeStr += ` ${period}`;\n if (showTimezone) timeStr += ` ${timezone}`;\n \n return timeStr;\n };\n\n const generateHours = () => {\n const max = is24Hour ? 23 : 12;\n const start = is24Hour ? 0 : 1;\n return Array.from({ length: max - start + 1 }, (_, i) => start + i);\n };\n\n const generateMinutes = () => {\n return Array.from({ length: Math.floor(60 / minuteStep) }, (_, i) => i * minuteStep);\n };\n\n const generateSeconds = () => {\n return Array.from({ length: 60 }, (_, i) => i);\n };\n\n const displayHour = is24Hour ? hours : (hours % 12 || 12);\n\n // Clock face rendering\n const renderClockFace = () => {\n const size = 200;\n const center = size / 2;\n const hourHandLength = 50;\n const minuteHandLength = 70;\n \n const hourAngle = ((displayHour % 12) * 30 + minutes * 0.5) * (Math.PI / 180) - Math.PI / 2;\n const minuteAngle = (minutes * 6) * (Math.PI / 180) - Math.PI / 2;\n \n const hourX = center + hourHandLength * Math.cos(hourAngle);\n const hourY = center + hourHandLength * Math.sin(hourAngle);\n const minuteX = center + minuteHandLength * Math.cos(minuteAngle);\n const minuteY = center + minuteHandLength * Math.sin(minuteAngle);\n\n return (\n <svg width={size} height={size} className=\"mx-auto\">\n {/* Clock circle */}\n <circle cx={center} cy={center} r={95} fill=\"white\" stroke=\"#e5e7eb\" strokeWidth=\"2\" />\n \n {/* Hour markers */}\n {Array.from({ length: 12 }, (_, i) => {\n const angle = (i * 30) * (Math.PI / 180) - Math.PI / 2;\n const x = center + 80 * Math.cos(angle);\n const y = center + 80 * Math.sin(angle);\n return (\n <text\n key={i}\n x={x}\n y={y}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n className=\"text-sm fill-gray-600\"\n >\n {i === 0 ? 12 : i}\n </text>\n );\n })}\n \n {/* Hour hand */}\n <line\n x1={center}\n y1={center}\n x2={hourX}\n y2={hourY}\n stroke=\"#374151\"\n strokeWidth=\"6\"\n strokeLinecap=\"round\"\n />\n \n {/* Minute hand */}\n <line\n x1={center}\n y1={center}\n x2={minuteX}\n y2={minuteY}\n stroke=\"#ef4444\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n />\n \n {/* Center dot */}\n <circle cx={center} cy={center} r=\"6\" fill=\"#ef4444\" />\n </svg>\n );\n };\n\n return (\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant={variant}\n size={size}\n className={cn(\n 'justify-start text-left font-normal',\n !time && 'text-muted-foreground'\n )}\n >\n <Clock className=\"mr-2 h-4 w-4\" />\n {formatTime()}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-0\" align=\"start\">\n <div className=\"p-6 space-y-4 min-w-[460px]\">\n {/* Time Display with AM/PM buttons */}\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-center gap-6\">\n {/* Time Display - Editable */}\n <div className=\"flex items-center gap-1\">\n <input\n ref={hourInputRef}\n type=\"text\"\n inputMode=\"numeric\"\n value={hourInput !== '' ? hourInput.padStart(2, '0') : displayHour.toString().padStart(2, '0')}\n onKeyDown={(e) => {\n if (e.key >= '0' && e.key <= '9') {\n e.preventDefault();\n const newVal = hourInput + e.key;\n if (newVal.length === 1) {\n setHourInput(e.key);\n } else if (newVal.length === 2) {\n const num = parseInt(newVal);\n const max = is24Hour ? 23 : 12;\n const min = is24Hour ? 0 : 1;\n let validVal = num;\n \n // Validate range\n if (num < min) validVal = min;\n if (num > max) validVal = max;\n \n setHourInput('');\n handleHourChange(validVal);\n setTimeout(() => minuteInputRef.current?.focus(), 0);\n }\n } else if (e.key === 'Backspace') {\n e.preventDefault();\n if (hourInput.length > 0) {\n setHourInput(hourInput.slice(0, -1));\n }\n } else if (e.key === 'ArrowRight' || e.key === 'Tab') {\n if (e.key === 'ArrowRight') e.preventDefault();\n minuteInputRef.current?.focus();\n } else if (e.key === ':') {\n e.preventDefault();\n minuteInputRef.current?.focus();\n }\n }}\n onBlur={() => {\n if (hourInput) {\n const val = parseInt(hourInput);\n const max = is24Hour ? 23 : 12;\n const min = is24Hour ? 0 : 1;\n let validVal = val;\n if (val < min) validVal = min;\n if (val > max) validVal = max;\n handleHourChange(validVal);\n }\n setHourInput('');\n }}\n onFocus={() => {\n setHourInput('');\n }}\n className=\"text-6xl font-medium tabular-nums leading-none w-[85px] text-center bg-transparent outline-none focus:ring-2 focus:ring-primary rounded px-1 cursor-text\"\n readOnly\n />\n <div className=\"text-6xl font-medium leading-none flex items-center px-1\">:</div>\n <input\n ref={minuteInputRef}\n type=\"text\"\n inputMode=\"numeric\"\n value={minuteInput !== '' ? minuteInput.padStart(2, '0') : minutes.toString().padStart(2, '0')}\n onKeyDown={(e) => {\n if (e.key >= '0' && e.key <= '9') {\n e.preventDefault();\n const newVal = minuteInput + e.key;\n if (newVal.length === 1) {\n setMinuteInput(e.key);\n } else if (newVal.length === 2) {\n const num = parseInt(newVal);\n const validVal = Math.min(59, Math.max(0, num));\n setMinuteInput('');\n handleMinuteChange(validVal);\n if (showSeconds) {\n setTimeout(() => secondInputRef.current?.focus(), 0);\n }\n }\n } else if (e.key === 'Backspace') {\n e.preventDefault();\n if (minuteInput.length > 0) {\n setMinuteInput(minuteInput.slice(0, -1));\n } else {\n hourInputRef.current?.focus();\n }\n } else if (e.key === 'ArrowLeft') {\n e.preventDefault();\n hourInputRef.current?.focus();\n } else if (e.key === 'ArrowRight' || e.key === 'Tab') {\n if (e.key === 'ArrowRight') e.preventDefault();\n if (showSeconds) {\n secondInputRef.current?.focus();\n }\n } else if (e.key === ':') {\n e.preventDefault();\n if (showSeconds) {\n secondInputRef.current?.focus();\n }\n }\n }}\n onBlur={() => {\n if (minuteInput) {\n const val = parseInt(minuteInput);\n const validVal = Math.min(59, Math.max(0, val));\n handleMinuteChange(validVal);\n }\n setMinuteInput('');\n }}\n onFocus={() => {\n setMinuteInput('');\n }}\n className=\"text-6xl font-medium tabular-nums leading-none w-[85px] text-center bg-transparent outline-none focus:ring-2 focus:ring-primary rounded px-1 cursor-text\"\n readOnly\n />\n {showSeconds && (\n <>\n <div className=\"text-6xl font-medium leading-none flex items-center px-1\">:</div>\n <input\n ref={secondInputRef}\n type=\"text\"\n inputMode=\"numeric\"\n value={secondInput !== '' ? secondInput.padStart(2, '0') : seconds.toString().padStart(2, '0')}\n onKeyDown={(e) => {\n if (e.key >= '0' && e.key <= '9') {\n e.preventDefault();\n const newVal = secondInput + e.key;\n if (newVal.length === 1) {\n setSecondInput(e.key);\n } else if (newVal.length === 2) {\n const num = parseInt(newVal);\n const validVal = Math.min(59, Math.max(0, num));\n setSecondInput('');\n handleSecondChange(validVal);\n }\n } else if (e.key === 'Backspace') {\n e.preventDefault();\n if (secondInput.length > 0) {\n setSecondInput(secondInput.slice(0, -1));\n } else {\n minuteInputRef.current?.focus();\n }\n } else if (e.key === 'ArrowLeft') {\n e.preventDefault();\n minuteInputRef.current?.focus();\n }\n }}\n onBlur={() => {\n if (secondInput) {\n const val = parseInt(secondInput);\n const validVal = Math.min(59, Math.max(0, val));\n handleSecondChange(validVal);\n }\n setSecondInput('');\n }}\n onFocus={() => {\n setSecondInput('');\n }}\n className=\"text-6xl font-medium tabular-nums leading-none w-[85px] text-center bg-transparent outline-none focus:ring-2 focus:ring-primary rounded px-1 cursor-text\"\n readOnly\n />\n </>\n )}\n </div>\n\n {/* AM/PM Buttons - Right Side */}\n {!is24Hour && (\n <div className=\"flex flex-col gap-1\">\n <Button\n size=\"sm\"\n variant={period === 'AM' ? 'default' : 'outline'}\n onClick={() => handlePeriodToggle('AM')}\n className=\"h-8 w-12 text-xs font-medium\"\n >\n AM\n </Button>\n <Button\n size=\"sm\"\n variant={period === 'PM' ? 'default' : 'outline'}\n onClick={() => handlePeriodToggle('PM')}\n className=\"h-8 w-12 text-xs font-medium\"\n >\n PM\n </Button>\n </div>\n )}\n </div>\n\n {showTimezone && (\n <div className=\"text-xs text-gray-500 text-center\">{timezone}</div>\n )}\n </div>\n\n {showClockFace ? (\n /* Clock Face View */\n <div className=\"space-y-4\">\n {renderClockFace()}\n </div>\n ) : (\n /* Scrollable Column View */\n <div className=\"flex gap-2 justify-center items-start\">\n {/* Hours Column */}\n <div className=\"flex-1 max-w-[80px]\">\n <div className=\"text-xs text-center text-gray-500 mb-2\">Hour</div>\n <div \n ref={hourScrollRef}\n className=\"h-40 overflow-y-scroll border rounded-md scrollbar-thin scrollbar-thumb-gray-300 scrollbar-track-gray-100\"\n >\n {generateHours().map((h) => (\n <button\n key={h}\n data-selected={displayHour === h}\n onClick={() => handleHourChange(h)}\n className={cn(\n \"w-full py-2 text-center transition-colors\",\n displayHour === h\n ? \"bg-blue-500 text-white font-medium\"\n : \"hover:bg-gray-100 text-gray-700\"\n )}\n >\n {h.toString().padStart(2, '0')}\n </button>\n ))}\n </div>\n </div>\n\n {/* Minutes Column */}\n <div className=\"flex-1 max-w-[80px]\">\n <div className=\"text-xs text-center text-gray-500 mb-2\">Min</div>\n <div \n ref={minuteScrollRef}\n className=\"h-40 overflow-y-scroll border rounded-md scrollbar-thin scrollbar-thumb-gray-300 scrollbar-track-gray-100\"\n >\n {generateMinutes().map((m) => (\n <button\n key={m}\n data-selected={minutes === m}\n onClick={() => handleMinuteChange(m)}\n className={cn(\n \"w-full py-2 text-center transition-colors\",\n minutes === m\n ? \"bg-blue-500 text-white font-medium\"\n : \"hover:bg-gray-100 text-gray-700\"\n )}\n >\n {m.toString().padStart(2, '0')}\n </button>\n ))}\n </div>\n </div>\n\n {/* Seconds Column */}\n {showSeconds && (\n <div className=\"flex-1 max-w-[80px]\">\n <div className=\"text-xs text-center text-gray-500 mb-2\">Sec</div>\n <div \n ref={secondScrollRef}\n className=\"h-40 overflow-y-scroll border rounded-md scrollbar-thin scrollbar-thumb-gray-300 scrollbar-track-gray-100\"\n >\n {generateSeconds().map((s) => (\n <button\n key={s}\n data-selected={seconds === s}\n onClick={() => handleSecondChange(s)}\n className={cn(\n \"w-full py-2 text-center transition-colors\",\n seconds === s\n ? \"bg-blue-500 text-white font-medium\"\n : \"hover:bg-gray-100 text-gray-700\"\n )}\n >\n {s.toString().padStart(2, '0')}\n </button>\n ))}\n </div>\n </div>\n )}\n </div>\n )}\n\n {/* Action Buttons */}\n <div className=\"flex gap-2 justify-between pt-2 border-t\">\n <Button size=\"sm\" variant=\"outline\" onClick={handleNow}>\n Now\n </Button>\n <Button size=\"sm\" onClick={() => onTimeChange(time)}>\n Done\n </Button>\n </div>\n </div>\n </PopoverContent>\n </Popover>\n );\n};","import * as React from \"react\"\nimport { cn } from \"@/lib/utils\"\n\nconst Card = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"rounded-lg border border-gray-200 bg-white text-gray-950 shadow-sm\",\n className\n )}\n {...props}\n />\n))\nCard.displayName = \"Card\"\n\nconst CardHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex flex-col space-y-1.5 p-6\", className)}\n {...props}\n />\n))\nCardHeader.displayName = \"CardHeader\"\n\nconst CardTitle = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h3\n ref={ref}\n className={cn(\n \"text-2xl font-semibold leading-none tracking-tight\",\n className\n )}\n {...props}\n />\n))\nCardTitle.displayName = \"CardTitle\"\n\nconst CardDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn(\"text-sm text-gray-500\", className)}\n {...props}\n />\n))\nCardDescription.displayName = \"CardDescription\"\n\nconst CardContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn(\"p-6 pt-0\", className)} {...props} />\n))\nCardContent.displayName = \"CardContent\"\n\nconst CardFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex items-center p-6 pt-0\", className)}\n {...props}\n />\n))\nCardFooter.displayName = \"CardFooter\"\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }\n","import * as React from \"react\"\nimport * as LabelPrimitive from \"@radix-ui/react-label\"\nimport { cn } from \"@/lib/utils\"\n\nconst Label = React.forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <LabelPrimitive.Root\n ref={ref}\n className={cn(\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\",\n className\n )}\n {...props}\n />\n))\nLabel.displayName = LabelPrimitive.Root.displayName\n\nexport { Label }\n","import * as React from \"react\"\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\nimport { X } from \"lucide-react\"\nimport { cn } from \"@/lib/utils\"\n\nconst Modal = DialogPrimitive.Root\n\nconst ModalTrigger = DialogPrimitive.Trigger\n\nconst ModalPortal = DialogPrimitive.Portal\n\nconst ModalClose = DialogPrimitive.Close\n\nconst ModalOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n \"fixed inset-0 z-50 bg-black/50 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n />\n))\nModalOverlay.displayName = DialogPrimitive.Overlay.displayName\n\nconst ModalContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <ModalPortal>\n <ModalOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border border-gray-200 bg-white p-6 shadow-lg duration-200 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-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] rounded-lg\",\n className\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-white transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-gray-950 focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-gray-100\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </ModalPortal>\n))\nModalContent.displayName = DialogPrimitive.Content.displayName\n\nconst ModalHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-1.5 text-center sm:text-left\",\n className\n )}\n {...props}\n />\n)\nModalHeader.displayName = \"ModalHeader\"\n\nconst ModalFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className\n )}\n {...props}\n />\n)\nModalFooter.displayName = \"ModalFooter\"\n\nconst ModalTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn(\n \"text-lg font-semibold leading-none tracking-tight\",\n className\n )}\n {...props}\n />\n))\nModalTitle.displayName = DialogPrimitive.Title.displayName\n\nconst ModalDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-gray-500\", className)}\n {...props}\n />\n))\nModalDescription.displayName = DialogPrimitive.Description.displayName\n\n// Simple Modal wrapper for backwards compatibility\nexport interface SimpleModalProps {\n isOpen: boolean\n onClose: () => void\n title?: string\n description?: string\n children: React.ReactNode\n className?: string\n}\n\nexport function SimpleModal({ isOpen, onClose, title, description, children, className }: SimpleModalProps) {\n return (\n <Modal open={isOpen} onOpenChange={onClose}>\n <ModalContent className={className}>\n {(title || description) && (\n <ModalHeader>\n {title && <ModalTitle>{title}</ModalTitle>}\n {description && <ModalDescription>{description}</ModalDescription>}\n </ModalHeader>\n )}\n {children}\n </ModalContent>\n </Modal>\n )\n}\n\nexport {\n Modal,\n ModalPortal,\n ModalOverlay,\n ModalClose,\n ModalTrigger,\n ModalContent,\n ModalHeader,\n ModalFooter,\n ModalTitle,\n ModalDescription,\n}\n","import * as React from \"react\"\nimport { ChevronLeft, ChevronRight, Calendar } from \"lucide-react\"\nimport { Button } from \"./ui/button\"\nimport { cn } from \"@/lib/utils\"\n\nconst monthNames: string[] = [\n 'January', 'February', 'March', 'April',\n 'May', 'June', 'July', 'August',\n 'September', 'October', 'November', 'December'\n]\n\nexport interface WeekNavigatorProps {\n onWeekChange?: (weekStart: Date) => void\n initialDate?: Date\n className?: string\n compact?: boolean\n}\n\nexport function WeekNavigator({\n onWeekChange,\n initialDate = new Date(),\n className,\n compact = false\n}: WeekNavigatorProps) {\n const [currentWeekStart, setCurrentWeekStart] = React.useState(initialDate)\n const [showCalendar, setShowCalendar] = React.useState(false)\n const [showMonthGrid, setShowMonthGrid] = React.useState(false)\n const [showYearGrid, setShowYearGrid] = React.useState(false)\n const [calendarYear, setCalendarYear] = React.useState(initialDate.getFullYear())\n const [calendarMonth, setCalendarMonth] = React.useState(initialDate.getMonth())\n const [selectedWeekIndex, setSelectedWeekIndex] = React.useState(0)\n const calendarDropdownRef = React.useRef<HTMLDivElement>(null)\n const calendarButtonRef = React.useRef<HTMLDivElement>(null)\n\n // Calculate week dates from a start date\n const calculateWeekDates = (startDate: Date): Date[] => {\n const dates = []\n const start = new Date(startDate)\n const dayOfWeek = start.getDay()\n const diff = dayOfWeek === 0 ? -6 : 1 - dayOfWeek\n start.setDate(start.getDate() + diff)\n\n for (let i = 0; i < 7; i++) {\n const date = new Date(start)\n date.setDate(start.getDate() + i)\n dates.push(date)\n }\n return dates\n }\n\n // Get weeks in a month\n const getWeeksInMonth = (year: number, month: number) => {\n const firstDay = new Date(year, month, 1)\n const lastDay = new Date(year, month + 1, 0)\n const startDate = new Date(firstDay)\n startDate.setDate(firstDay.getDate() - ((firstDay.getDay() + 6) % 7))\n const weeks = []\n const currentWeekStart = new Date(startDate)\n while (currentWeekStart <= lastDay || currentWeekStart.getMonth() === month) {\n const weekEnd = new Date(currentWeekStart)\n weekEnd.setDate(currentWeekStart.getDate() + 6)\n weeks.push({ start: new Date(currentWeekStart), end: new Date(weekEnd) })\n currentWeekStart.setDate(currentWeekStart.getDate() + 7)\n if (weeks.length > 6) break\n }\n return weeks\n }\n\n const formatWeekRange = (start: Date, end: Date) => {\n const startMonth = start.toLocaleDateString('en-US', { month: 'short' })\n const endMonth = end.toLocaleDateString('en-US', { month: 'short' })\n if (startMonth === endMonth) {\n return `${startMonth} ${start.getDate()}-${end.getDate()}`\n } else {\n return `${startMonth} ${start.getDate()}-${endMonth} ${end.getDate()}`\n }\n }\n\n const currentWeekDates = calculateWeekDates(currentWeekStart)\n const yearOptions = Array.from({ length: 10 }, (_, i) => calendarYear - 5 + i)\n\n // Handle week navigation\n const navigateWeek = (direction: 'prev' | 'next') => {\n const newWeekStart = new Date(currentWeekStart)\n newWeekStart.setDate(currentWeekStart.getDate() + (direction === 'next' ? 7 : -7))\n setCurrentWeekStart(newWeekStart)\n setCalendarYear(newWeekStart.getFullYear())\n setCalendarMonth(newWeekStart.getMonth())\n onWeekChange?.(newWeekStart)\n }\n\n const handleWeekSelectorClick = (week: { start: Date; end: Date }, index: number) => {\n setSelectedWeekIndex(index)\n setShowCalendar(false)\n setCurrentWeekStart(week.start)\n onWeekChange?.(week.start)\n }\n\n // Click outside handler for calendar dropdown\n React.useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n calendarDropdownRef.current &&\n !calendarDropdownRef.current.contains(event.target as Node) &&\n calendarButtonRef.current &&\n !calendarButtonRef.current.contains(event.target as Node)\n ) {\n setShowCalendar(false)\n setShowMonthGrid(false)\n setShowYearGrid(false)\n }\n }\n\n if (showCalendar) {\n document.addEventListener('mousedown', handleClickOutside)\n }\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [showCalendar])\n\n // Update selected week index when currentWeekStart changes\n React.useEffect(() => {\n const weeks = getWeeksInMonth(calendarYear, calendarMonth)\n const currentWeekIndex = weeks.findIndex(week =>\n currentWeekStart >= week.start && currentWeekStart <= week.end\n )\n if (currentWeekIndex !== -1) {\n setSelectedWeekIndex(currentWeekIndex)\n }\n }, [currentWeekStart, calendarYear, calendarMonth])\n\n return (\n <div className={cn(\"flex items-center gap-3\", className)}>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => navigateWeek('prev')}\n className={cn(\n \"rounded-lg border-gray-200 hover:border-gray-300 hover:bg-gray-50\",\n compact ? \"h-8 w-8 p-0\" : \"h-9 w-9 p-0\"\n )}\n >\n <ChevronLeft className={cn(compact ? \"h-3 w-3\" : \"h-4 w-4\", \"text-gray-600\")} />\n </Button>\n\n {/* Month/Year/Week Selector Dropdown */}\n <div className=\"relative\">\n <div\n ref={calendarButtonRef}\n className={cn(\n \"flex items-center gap-2 bg-white rounded-lg border border-gray-200 shadow-sm cursor-pointer hover:bg-gray-50 transition-colors\",\n compact ? \"px-2 py-1\" : \"px-3 py-2\"\n )}\n onClick={() => setShowCalendar(!showCalendar)}\n >\n <Calendar className={cn(compact ? \"h-3 w-3\" : \"h-4 w-4\", \"text-gray-500\")} />\n <span className={cn(compact ? \"text-xs\" : \"text-sm\", \"font-medium text-gray-700\")}>\n {currentWeekDates.length >= 7 && currentWeekDates[0] && currentWeekDates[6] &&\n `${currentWeekDates[0].getDate()}-${currentWeekDates[6].getDate()} ${monthNames[currentWeekDates[0].getMonth()]} ${currentWeekDates[0].getFullYear()}`\n }\n </span>\n <ChevronRight className={cn(\n compact ? \"h-2 w-2\" : \"h-3 w-3\",\n \"text-gray-400 transition-transform\",\n showCalendar && \"rotate-90\"\n )} />\n </div>\n\n {showCalendar && (\n <div ref={calendarDropdownRef} className=\"absolute top-full right-0 mt-2 bg-white border border-gray-200 rounded-lg shadow-lg p-4 z-50 w-80 sm:w-96\">\n {/* Year and Month Selector at Top */}\n {!showMonthGrid && !showYearGrid && (\n <div className=\"flex items-center justify-between mb-4\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => {\n const newMonth = calendarMonth === 0 ? 11 : calendarMonth - 1\n const newYear = calendarMonth === 0 ? calendarYear - 1 : calendarYear\n setCalendarMonth(newMonth)\n setCalendarYear(newYear)\n }}\n className=\"h-8 w-8 p-0\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n <div className=\"flex items-center gap-2\">\n <button\n className=\"text-lg font-semibold text-gray-800 hover:text-blue-600 transition-colors\"\n onClick={() => setShowMonthGrid(!showMonthGrid)}\n >\n {monthNames[calendarMonth]}\n </button>\n <button\n className=\"text-lg font-semibold text-gray-800 hover:text-blue-600 transition-colors\"\n onClick={() => setShowYearGrid(!showYearGrid)}\n >\n {calendarYear}\n </button>\n </div>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => {\n const newMonth = calendarMonth === 11 ? 0 : calendarMonth + 1\n const newYear = calendarMonth === 11 ? calendarYear + 1 : calendarYear\n setCalendarMonth(newMonth)\n setCalendarYear(newYear)\n }}\n className=\"h-8 w-8 p-0\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </div>\n )}\n\n {/* Month Grid View */}\n {showMonthGrid ? (\n <div className=\"p-6\">\n <div className=\"flex items-center justify-between mb-4\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setShowMonthGrid(false)}\n className=\"h-9 px-3 text-sm font-medium\"\n >\n ← Back\n </Button>\n <span className=\"text-lg font-semibold\">{calendarYear}</span>\n </div>\n <div className=\"grid grid-cols-3 gap-2\">\n {monthNames.map((month, idx) => (\n <button\n key={month}\n className={cn(\n \"h-11 w-full text-sm font-medium rounded-xl transition-all\",\n calendarMonth === idx\n ? \"bg-blue-500 text-white\"\n : \"text-gray-600 hover:bg-gray-50\"\n )}\n onClick={() => {\n setCalendarMonth(idx)\n setShowMonthGrid(false)\n }}\n >\n {month}\n </button>\n ))}\n </div>\n </div>\n ) : showYearGrid ? (\n <div className=\"p-6\">\n <div className=\"flex items-center justify-start mb-4\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setShowYearGrid(false)}\n className=\"h-9 px-3 text-sm font-medium\"\n >\n ← Back\n </Button>\n </div>\n <div className=\"grid grid-cols-4 gap-2 max-h-64 overflow-y-auto\">\n {yearOptions.map((year) => (\n <button\n key={year}\n className={cn(\n \"h-11 w-full text-sm font-medium rounded-xl transition-all\",\n calendarYear === year\n ? \"bg-blue-500 text-white\"\n : \"text-gray-600 hover:bg-gray-50\"\n )}\n onClick={() => {\n setCalendarYear(year)\n setShowYearGrid(false)\n setShowMonthGrid(true)\n }}\n >\n {year}\n </button>\n ))}\n </div>\n </div>\n ) : (\n /* Week Selector View */\n <div className=\"grid grid-cols-2 gap-2 max-h-64 overflow-y-auto\">\n {getWeeksInMonth(calendarYear, calendarMonth).map((week, index) => {\n const isCurrentWeek = new Date() >= week.start && new Date() <= week.end\n const isSelected = selectedWeekIndex === index\n return (\n <button\n key={index}\n className={cn(\n \"w-full p-3 text-left rounded-lg border transition-all\",\n isSelected\n ? \"bg-blue-500 text-white border-blue-500\"\n : isCurrentWeek\n ? \"bg-white text-blue-600 border-blue-500\"\n : \"bg-white border-gray-200 text-gray-700 hover:border-blue-300\"\n )}\n onClick={() => handleWeekSelectorClick(week, index)}\n >\n <div className=\"flex flex-col\">\n <div className={cn(\n \"font-medium text-sm\",\n isSelected ? \"text-white\" : \"text-gray-800\"\n )}>\n Week {index + 1}\n </div>\n <div className={cn(\n \"text-xs\",\n isSelected ? \"text-blue-100\" : \"text-gray-500\"\n )}>\n {formatWeekRange(week.start, week.end)}\n </div>\n </div>\n </button>\n )\n })}\n </div>\n )}\n\n <div className=\"flex gap-2 pt-3 border-t border-gray-100 mt-3\">\n <Button\n size=\"sm\"\n variant=\"outline\"\n className=\"flex-1\"\n onClick={() => {\n const today = new Date()\n setCurrentWeekStart(today)\n setShowCalendar(false)\n setShowMonthGrid(false)\n setShowYearGrid(false)\n onWeekChange?.(today)\n }}\n >\n This Week\n </Button>\n </div>\n </div>\n )}\n </div>\n\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => navigateWeek('next')}\n className={cn(\n \"rounded-lg border-gray-200 hover:border-gray-300 hover:bg-gray-50\",\n compact ? \"h-8 w-8 p-0\" : \"h-9 w-9 p-0\"\n )}\n >\n <ChevronRight className={cn(compact ? \"h-3 w-3\" : \"h-4 w-4\", \"text-gray-600\")} />\n </Button>\n </div>\n )\n}\n","// Utility functions for WeekNavigator component\n\nexport const weekNavigatorUtils = {\n calculateWeekDates: (startDate: Date): Date[] => {\n const dates = []\n const start = new Date(startDate)\n const dayOfWeek = start.getDay()\n const diff = dayOfWeek === 0 ? -6 : 1 - dayOfWeek\n start.setDate(start.getDate() + diff)\n\n for (let i = 0; i < 7; i++) {\n const date = new Date(start)\n date.setDate(start.getDate() + i)\n dates.push(date)\n }\n return dates\n },\n\n formatDateDisplay: (date: Date): string => {\n return date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric'\n })\n },\n\n getWeekNumber: (date: Date): number => {\n const firstDayOfYear = new Date(date.getFullYear(), 0, 1)\n const pastDaysOfYear = (date.getTime() - firstDayOfYear.getTime()) / 86400000\n return Math.ceil((pastDaysOfYear + firstDayOfYear.getDay() + 1) / 7)\n },\n\n getWeekOfMonth: (date: Date): number => {\n const firstDayOfMonth = new Date(date.getFullYear(), date.getMonth(), 1)\n const firstDayOfWeek = firstDayOfMonth.getDay()\n const offsetDate = date.getDate() + firstDayOfWeek - 1\n return Math.ceil(offsetDate / 7)\n }\n}\n","import * as React from \"react\"\nimport { useState } from \"react\"\nimport { Plus, Trash2 } from \"lucide-react\"\nimport { Card, CardContent, CardHeader, CardTitle } from \"./ui/card\"\nimport { Button } from \"./ui/button\"\nimport { Input } from \"./ui/input\"\nimport { Label } from \"./ui/label\"\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"./ui/select\"\nimport { SimpleModal } from \"./ui/modal\"\nimport { cn } from \"@/lib/utils\"\nimport { WeekNavigator } from \"./WeekNavigator\"\nimport { weekNavigatorUtils } from \"../utils/weekNavigatorUtils\"\n\nexport interface ScheduleEvent {\n id: string\n title: string\n day: string\n startTime: string\n endTime: string\n color: string\n description?: string\n // Recurrence options\n recurrenceType?: 'none' | 'weekly' | 'monthly' | 'yearly'\n specificDate?: string // For monthly/yearly recurrence\n // Flexible metadata - can be anything\n [key: string]: string | number | boolean | Date | undefined\n}\n\nexport interface CustomField {\n key: string\n label: string\n type: \"text\" | \"number\" | \"select\"\n placeholder?: string\n options?: { label: string; value: string }[]\n icon?: React.ReactNode\n showInCard?: boolean\n required?: boolean\n}\n\nexport interface ScheduleProps {\n title?: string\n subtitle?: string\n events: ScheduleEvent[]\n onEventAdd?: (event: Omit<ScheduleEvent, \"id\">) => void\n onEventUpdate?: (event: ScheduleEvent) => void\n onEventDelete?: (eventId: string) => void\n className?: string\n timeSlots?: string[]\n daysOfWeek?: string[]\n showAddButton?: boolean\n eventColors?: { name: string; value: string }[]\n customFields?: CustomField[]\n showWeekNavigation?: boolean\n showHalfHourLines?: boolean // Show separator line at :30 mark\n showCurrentTimeIndicator?: boolean // Show red line for current time\n slotHeight?: number // Height in pixels for each hour slot (default 85)\n}\n\nconst defaultTimeSlots = [\n \"08:00\", \"09:00\", \"10:00\", \"11:00\", \"12:00\",\n \"13:00\", \"14:00\", \"15:00\", \"16:00\"\n]\n\nconst defaultDays = [\"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\"]\n\nconst defaultColors = [\n { name: \"Blue\", value: \"bg-blue-500\" },\n { name: \"Green\", value: \"bg-emerald-500\" },\n { name: \"Purple\", value: \"bg-purple-500\" },\n { name: \"Orange\", value: \"bg-orange-500\" },\n { name: \"Pink\", value: \"bg-pink-500\" },\n]\n\nexport function Schedule({\n title = \"Weekly Schedule\",\n subtitle,\n events,\n onEventAdd,\n onEventUpdate,\n onEventDelete,\n className,\n timeSlots = defaultTimeSlots,\n daysOfWeek = defaultDays,\n showAddButton = true,\n eventColors = defaultColors,\n customFields = [],\n showWeekNavigation = false,\n showHalfHourLines = true,\n showCurrentTimeIndicator = true,\n slotHeight = 85,\n}: ScheduleProps) {\n const [isModalOpen, setIsModalOpen] = useState(false)\n const [selectedEvent, setSelectedEvent] = useState<ScheduleEvent | null>(null)\n const [formData, setFormData] = useState<Record<string, string | number | boolean | Date>>({\n title: \"\",\n day: \"\",\n startTime: \"\",\n endTime: \"\",\n color: \"bg-blue-500\",\n description: \"\",\n recurrenceType: \"none\",\n specificDate: \"\",\n scheduleMode: \"day\", // \"day\" or \"date\"\n })\n\n // Week navigation state - simplified to just track current week\n const [currentWeekStart, setCurrentWeekStart] = useState(new Date())\n const currentWeekDates = showWeekNavigation ? weekNavigatorUtils.calculateWeekDates(currentWeekStart) : []\n\n const handleOpenModal = (day?: string, time?: string, event?: ScheduleEvent) => {\n if (event) {\n setSelectedEvent(event)\n // Populate form with all event data including custom fields\n const data: Record<string, string | number | boolean> = {\n title: event.title,\n day: event.day,\n startTime: event.startTime,\n endTime: event.endTime,\n color: event.color,\n description: event.description || \"\",\n recurrenceType: event.recurrenceType || \"none\",\n specificDate: event.specificDate || \"\",\n scheduleMode: event.specificDate ? \"date\" : \"day\",\n }\n // Add custom field values\n customFields.forEach(field => {\n const value = event[field.key];\n data[field.key] = value instanceof Date ? value.toISOString() : (value || (field.type === \"number\" ? 0 : \"\"))\n })\n setFormData(data)\n } else {\n setSelectedEvent(null)\n // Initialize form with empty values\n const data: Record<string, string | number | boolean | Date> = {\n title: \"\",\n day: day || \"\",\n startTime: time || \"\",\n endTime: \"\",\n color: \"bg-blue-500\",\n description: \"\",\n recurrenceType: \"none\",\n specificDate: \"\",\n scheduleMode: \"day\",\n }\n // Initialize custom fields with default values\n customFields.forEach(field => {\n data[field.key] = field.type === \"number\" ? 0 : \"\"\n })\n setFormData(data)\n }\n setIsModalOpen(true)\n }\n\n const handleSave = () => {\n if (!formData.title || !formData.day || !formData.startTime || !formData.endTime) {\n return\n }\n\n const eventData = {\n ...formData,\n id: selectedEvent?.id || Date.now().toString(),\n }\n\n if (selectedEvent) {\n onEventUpdate?.(eventData as ScheduleEvent)\n } else {\n onEventAdd?.(formData)\n }\n\n setIsModalOpen(false)\n }\n\n const handleDelete = () => {\n if (selectedEvent) {\n onEventDelete?.(selectedEvent.id)\n setIsModalOpen(false)\n }\n }\n\n const getEventsForSlot = (day: string, time: string) => {\n return events.filter(event => {\n if (event.day !== day) return false\n const eventStart = parseInt(event.startTime.replace(\":\", \"\"))\n const slotTime = parseInt(time.replace(\":\", \"\"))\n return eventStart === slotTime\n })\n }\n\n const getEventHeight = (event: ScheduleEvent) => {\n const [startHour, startMin] = event.startTime.split(':').map(Number)\n const [endHour, endMin] = event.endTime.split(':').map(Number)\n const startInMinutes = startHour * 60 + startMin\n const endInMinutes = endHour * 60 + endMin\n const durationInMinutes = endInMinutes - startInMinutes\n const durationInHours = durationInMinutes / 60\n // Use proportional padding based on slot height (roughly 10% of slot height)\n const padding = Math.max(4, slotHeight * 0.1)\n return durationInHours * slotHeight - padding\n }\n\n return (\n <>\n <Card className={cn(\"w-full\", className)}>\n <CardHeader className=\"pb-6 bg-gradient-to-r from-slate-50 to-gray-50 border-b border-gray-100\">\n <div className=\"flex justify-between items-center\">\n <div>\n <CardTitle className=\"text-2xl\">{title}</CardTitle>\n {subtitle && (\n <p className=\"text-sm text-gray-500 mt-1\">{subtitle}</p>\n )}\n </div>\n <div className=\"flex items-center gap-4\">\n {/* Week Navigation */}\n {showWeekNavigation && (\n <WeekNavigator\n onWeekChange={setCurrentWeekStart}\n initialDate={currentWeekStart}\n />\n )}\n\n {showAddButton && (\n <Button onClick={() => handleOpenModal()} className=\"gap-2\">\n <Plus className=\"h-4 w-4\" />\n Add Event\n </Button>\n )}\n </div>\n </div>\n </CardHeader>\n\n <CardContent className=\"p-0\">\n <div className=\"overflow-x-auto\">\n <div className=\"min-w-[800px]\">\n {/* Header Row */}\n <div className={`grid border-b border-gray-200`} style={{ gridTemplateColumns: `80px repeat(${daysOfWeek.length}, 1fr)` }}>\n <div className=\"p-3 bg-gray-50 border-r border-gray-200\">\n <span className=\"text-xs font-medium text-gray-500\">\n Time\n </span>\n </div>\n {daysOfWeek.map((day, index) => {\n const today = new Date()\n const dateForDay = showWeekNavigation && currentWeekDates[index]\n const isToday = dateForDay && dateForDay.getDate() === today.getDate() && dateForDay.getMonth() === today.getMonth() && dateForDay.getFullYear() === today.getFullYear()\n\n return (\n <div key={day} className=\"p-4 text-center border-r border-gray-200 last:border-r-0 bg-gray-50 hover:bg-white/50 transition-colors\">\n <div className={`font-semibold text-sm ${isToday ? 'text-blue-600' : 'text-gray-800'}`}>{day}</div>\n {showWeekNavigation && dateForDay && (\n <div className={`text-xs mt-1 font-medium ${isToday ? 'text-blue-600 font-bold' : 'text-gray-500'}`}>\n {weekNavigatorUtils.formatDateDisplay(dateForDay)}\n </div>\n )}\n </div>\n )\n })}\n </div>\n\n {/* Time Slots */}\n {timeSlots.map((time) => {\n // Calculate current time indicator position for this slot\n const now = new Date()\n const currentHour = now.getHours()\n const currentMinute = now.getMinutes()\n const [slotHour, slotMinuteRaw] = time.split(\":\")\n const slotMinute = parseInt(slotMinuteRaw || \"0\")\n const slotHourNum = parseInt(slotHour || \"0\")\n const slotStart = slotHourNum * 60 + slotMinute\n const slotEnd = slotStart + 60\n const nowMinutes = currentHour * 60 + currentMinute\n const isCurrentTimeSlot = nowMinutes >= slotStart && nowMinutes < slotEnd\n const elapsedMinutes = nowMinutes - slotStart\n const progressRatio = elapsedMinutes / 60\n const indicatorTop = progressRatio * slotHeight\n\n return (\n <div key={time} className=\"grid border-b border-gray-100 last:border-b-0\" style={{ gridTemplateColumns: `80px repeat(${daysOfWeek.length}, 1fr)` }}>\n <div className=\"p-2 bg-gray-50/50 border-r border-gray-200\">\n <span className=\"text-xs text-gray-600\">{time}</span>\n </div>\n {daysOfWeek.map((day, dayIndex) => {\n const dayEvents = getEventsForSlot(day, time)\n const today = new Date()\n const dateForDay = showWeekNavigation && currentWeekDates[dayIndex]\n const isToday = dateForDay ? \n dateForDay.getDate() === today.getDate() && \n dateForDay.getMonth() === today.getMonth() && \n dateForDay.getFullYear() === today.getFullYear() \n : false\n\n return (\n <div\n key={`${day}-${time}`}\n className=\"relative border-r border-gray-200 last:border-r-0 hover:bg-blue-50/30 cursor-pointer transition-colors\"\n style={{ minHeight: `${slotHeight}px` }}\n onClick={() => !dayEvents.length && handleOpenModal(day, time)}\n >\n {/* Half-hour separator line */}\n {showHalfHourLines && (\n <div className=\"absolute top-1/2 left-0 right-0 h-px bg-gray-200/60 z-[5]\" />\n )}\n\n {dayEvents.map(event => {\n const eventHeight = getEventHeight(event)\n const isShortEvent = eventHeight < 40 // Less than 40px is considered short\n \n return (\n <div\n key={event.id}\n className={cn(\n \"absolute rounded-md text-white cursor-pointer hover:scale-[1.02] transition-transform overflow-visible\",\n event.color,\n isShortEvent ? \"inset-x-1 py-0.5 px-1\" : \"inset-1 p-2\"\n )}\n style={{ \n height: `${eventHeight}px`, \n zIndex: 10,\n minHeight: isShortEvent ? 'auto' : undefined\n }}\n onClick={(e) => {\n e.stopPropagation()\n handleOpenModal(undefined, undefined, event)\n }}\n >\n {isShortEvent ? (\n // Short event layout: title and time side by side\n <div className=\"flex items-center justify-between gap-1\">\n <div className=\"font-semibold truncate text-[10px] leading-tight flex-1\">\n {event.title}\n </div>\n <div className=\"text-[9px] opacity-80 whitespace-nowrap\">\n {event.startTime}-{event.endTime}\n </div>\n </div>\n ) : (\n // Normal event layout\n <>\n <div className=\"text-xs font-semibold truncate\">\n {event.title}\n </div>\n\n {/* Display custom fields with showInCard: true */}\n {customFields\n .filter(field => field.showInCard && event[field.key])\n .map(field => (\n <div key={field.key} className=\"text-xs opacity-90 flex items-center gap-1 mt-1\">\n {field.icon}\n <span className=\"truncate\">{event[field.key] instanceof Date ? (event[field.key] as Date).toLocaleString() : String(event[field.key] || '')}</span>\n </div>\n ))}\n\n <div className=\"text-xs opacity-80 mt-1\">\n <span>{event.startTime}-{event.endTime}</span>\n </div>\n </>\n )}\n </div>\n )\n })}\n\n {/* Current Time Indicator */}\n {showCurrentTimeIndicator && isToday && isCurrentTimeSlot && (\n <div className=\"absolute left-0 right-0 flex items-center z-20\" style={{ top: `${indicatorTop - 8}px` }}>\n <div className=\"h-[3px] bg-red-500 absolute -left-14 right-0\"></div>\n <div className=\"bg-red-500 text-white text-xs px-2 py-0.5 rounded font-bold whitespace-nowrap relative z-30 -ml-14\">\n {now.getHours()}:{now.getMinutes().toString().padStart(2, '0')}\n </div>\n </div>\n )}\n\n {!dayEvents.length && (\n <div className=\"absolute inset-0 flex items-center justify-center opacity-0 hover:opacity-100 transition-opacity\">\n <Plus className=\"h-5 w-5 text-gray-400\" />\n </div>\n )}\n </div>\n )\n })}\n </div>\n )\n })}\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Event Modal */}\n <SimpleModal\n isOpen={isModalOpen}\n onClose={() => setIsModalOpen(false)}\n title={selectedEvent ? \"Edit Event\" : \"Add New Event\"}\n >\n <div className=\"space-y-4 p-6\">\n {/* Schedule Mode Selection */}\n <div className=\"space-y-2\">\n <Label className=\"text-sm font-medium\">Schedule Type</Label>\n <Select\n value={String(formData.scheduleMode)}\n onValueChange={(value) => setFormData({ ...formData, scheduleMode: value })}\n >\n <SelectTrigger>\n <SelectValue placeholder=\"Select schedule type\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"day\">By Day (Monday, Tuesday, etc.)</SelectItem>\n <SelectItem value=\"date\">By Date (Specific date)</SelectItem>\n </SelectContent>\n </Select>\n <p className=\"text-xs text-gray-500\">\n {formData.scheduleMode === \"day\"\n ? \"Schedule by day of the week (e.g., every Monday)\"\n : \"Schedule by specific date (e.g., January 15, 2025)\"}\n </p>\n </div>\n\n {/* Title Field */}\n <div className=\"space-y-2\">\n <Label htmlFor=\"title\">Title *</Label>\n <Input\n id=\"title\"\n value={String(formData.title)}\n onChange={(e) => setFormData({ ...formData, title: e.target.value })}\n placeholder=\"Event title\"\n />\n </div>\n\n {/* Day/Date and Time Fields */}\n <div className=\"grid grid-cols-3 gap-4\">\n {formData.scheduleMode === \"day\" ? (\n <div className=\"space-y-2\">\n <Label>Day *</Label>\n <Select value={String(formData.day)} onValueChange={(value) => setFormData({ ...formData, day: value })}>\n <SelectTrigger>\n <SelectValue placeholder=\"Select day\" />\n </SelectTrigger>\n <SelectContent>\n {daysOfWeek.map(day => (\n <SelectItem key={day} value={day}>{day}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n ) : (\n <div className=\"space-y-2\">\n <Label htmlFor=\"specificDate\">Date *</Label>\n <Input\n id=\"specificDate\"\n type=\"date\"\n value={String(formData.specificDate)}\n onChange={(e) => setFormData({ ...formData, specificDate: e.target.value })}\n />\n </div>\n )}\n <div className=\"space-y-2\">\n <Label htmlFor=\"startTime\">Start Time *</Label>\n <Input\n id=\"startTime\"\n type=\"time\"\n value={String(formData.startTime)}\n onChange={(e) => setFormData({ ...formData, startTime: e.target.value })}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"endTime\">End Time *</Label>\n <Input\n id=\"endTime\"\n type=\"time\"\n value={String(formData.endTime)}\n onChange={(e) => setFormData({ ...formData, endTime: e.target.value })}\n />\n </div>\n </div>\n\n {/* Custom Fields - Dynamic Rendering */}\n {customFields.length > 0 && (\n <div className=\"grid grid-cols-2 gap-4\">\n {customFields.map(field => (\n <div key={field.key} className=\"space-y-2\">\n <Label htmlFor={field.key}>\n {field.label} {field.required && \"*\"}\n </Label>\n {field.type === \"select\" ? (\n <Select\n value={String(formData[field.key] || \"\")}\n onValueChange={(value) => setFormData({ ...formData, [field.key]: value })}\n >\n <SelectTrigger>\n <SelectValue placeholder={field.placeholder || `Select ${field.label}`} />\n </SelectTrigger>\n <SelectContent>\n {field.options?.map(option => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : (\n <Input\n id={field.key}\n type={field.type}\n value={field.type === \"number\" ? Number(formData[field.key] || 0) : String(formData[field.key] || \"\")}\n onChange={(e) => setFormData({\n ...formData,\n [field.key]: field.type === \"number\" ? parseInt(e.target.value) || 0 : e.target.value\n })}\n placeholder={field.placeholder}\n />\n )}\n </div>\n ))}\n </div>\n )}\n\n {/* Recurrence Checkbox */}\n <div className=\"flex items-center space-x-2\">\n <input\n type=\"checkbox\"\n id=\"isRecurring\"\n checked={formData.recurrenceType !== \"none\"}\n onChange={(e) => {\n if (e.target.checked) {\n // Enable recurrence based on schedule mode\n setFormData({\n ...formData,\n recurrenceType: formData.scheduleMode === \"day\" ? \"weekly\" : \"monthly\"\n })\n } else {\n // Disable recurrence\n setFormData({ ...formData, recurrenceType: \"none\" })\n }\n }}\n className=\"w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded focus:ring-blue-500 focus:ring-2\"\n />\n <Label htmlFor=\"isRecurring\" className=\"text-sm font-medium text-gray-700 cursor-pointer\">\n {formData.scheduleMode === \"day\"\n ? \"Repeat every week on this day\"\n : \"Repeat every month on this date\"}\n </Label>\n </div>\n\n {/* Color Selection */}\n <div className=\"space-y-2\">\n <Label>Color</Label>\n <Select value={String(formData.color)} onValueChange={(value) => setFormData({ ...formData, color: value })}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {eventColors.map(color => (\n <SelectItem key={color.value} value={color.value}>\n <div className=\"flex items-center gap-2\">\n <div className={cn(\"w-4 h-4 rounded\", color.value)} />\n {color.name}\n </div>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {/* Description Field */}\n <div className=\"space-y-2\">\n <Label htmlFor=\"description\">Description</Label>\n <Input\n id=\"description\"\n value={String(formData.description || \"\")}\n onChange={(e) => setFormData({ ...formData, description: e.target.value })}\n placeholder=\"Optional description\"\n />\n </div>\n\n <div className=\"flex gap-2 pt-4\">\n {selectedEvent && (\n <Button variant=\"destructive\" onClick={handleDelete} className=\"gap-2\">\n <Trash2 className=\"h-4 w-4\" />\n Delete\n </Button>\n )}\n <div className=\"flex-1\" />\n <Button variant=\"outline\" onClick={() => setIsModalOpen(false)}>\n Cancel\n </Button>\n <Button onClick={handleSave}>\n {selectedEvent ? \"Update\" : \"Add\"} Event\n </Button>\n </div>\n </div>\n </SimpleModal>\n </>\n )\n}\n","// Timezone definitions\nexport const TIMEZONES = [\n { label: 'UTC', offset: 0 },\n { label: 'EST', offset: -5 },\n { label: 'CST', offset: -6 },\n { label: 'MST', offset: -7 },\n { label: 'PST', offset: -8 },\n { label: 'GMT', offset: 0 },\n { label: 'CET', offset: 1 },\n { label: 'EET', offset: 2 },\n { label: 'IST', offset: 5.5 },\n { label: 'CST (China)', offset: 8 },\n { label: 'JST', offset: 9 },\n { label: 'AEST', offset: 10 },\n { label: 'NZST', offset: 12 },\n { label: 'HST', offset: -10 },\n { label: 'AKST', offset: -9 },\n { label: 'Asia/Bangkok', offset: 7 },\n];\n\n// Utility function to convert time between timezones\nexport const convertTimezone = (date: Date, fromTz: string, toTz: string): Date => {\n const fromOffset = TIMEZONES.find(tz => tz.label === fromTz)?.offset || 0;\n const toOffset = TIMEZONES.find(tz => tz.label === toTz)?.offset || 0;\n \n const converted = new Date(date);\n converted.setHours(converted.getHours() + (toOffset - fromOffset));\n \n return converted;\n};\n\n// Utility function to format time with timezone\nexport const formatTimeWithTimezone = (\n date: Date,\n timezone: string,\n format: '12h' | '24h' = '24h',\n showSeconds: boolean = false\n): string => {\n const h = format === '12h' ? (date.getHours() % 12 || 12) : date.getHours();\n const m = date.getMinutes().toString().padStart(2, '0');\n const s = date.getSeconds().toString().padStart(2, '0');\n const period = date.getHours() >= 12 ? 'PM' : 'AM';\n \n let timeStr = `${h.toString().padStart(2, '0')}:${m}`;\n if (showSeconds) timeStr += `:${s}`;\n if (format === '12h') timeStr += ` ${period}`;\n timeStr += ` ${timezone}`;\n \n return timeStr;\n};\n"],"names":["cn","inputs","twMerge","clsx","Button","React","className","variant","size","asChild","props","ref","Comp","Slot","jsx","Checkbox","CheckboxPrimitive","Check","Input","type","Separator","orientation","decorative","TableContext","Table","TableHeader","TableBody","TableFooter","TableRow","TableHead","TableCell","TableCaption","DropdownMenu","DropdownMenuPrimitive","DropdownMenuPortal","DropdownMenuTrigger","DropdownMenuContent","sideOffset","DropdownMenuGroup","DropdownMenuItem","inset","DropdownMenuCheckboxItem","children","checked","jsxs","CheckIcon","DropdownMenuRadioGroup","DropdownMenuRadioItem","CircleIcon","DropdownMenuLabel","DropdownMenuSeparator","DropdownMenuShortcut","DropdownMenuSub","DropdownMenuSubTrigger","ChevronRightIcon","DropdownMenuSubContent","DataTable","data","columns","searchPlaceholder","onRowClick","showPagination","showSearch","initialPageSize","renderToolbar","currentPage","setCurrentPage","useState","pageSize","searchQuery","setSearchQuery","sortKey","setSortKey","sortOrder","setSortOrder","filteredData","useMemo","query","row","column","sortedData","a","b","col","aVal","bVal","comparison","paginatedData","start","handleSort","columnKey","getCellValue","rowIndex","value","Search","e","ChevronDown","ChevronUp","ChevronsUpDown","shouldCenter","p","ChevronLeft","ChevronRight","DataGridContext","createContext","useDataGrid","context","useContext","DataGrid","getRowId","recordCount","pagination","setPagination","sorting","setSorting","selectedRows","setSelectedRows","sort","aValue","bValue","end","totalPages","pageCount","canPreviousPage","canNextPage","previousPage","prev","nextPage","setPageSize","goToPage","page","toggleRow","id","next","toggleAllRows","isAllRowsSelected","DataGridTable","cellValue","Select","SelectPrimitive","SelectGroup","SelectValue","SelectTrigger","SelectScrollUpButton","SelectScrollDownButton","SelectContent","position","SelectLabel","SelectItem","SelectSeparator","DataGridPagination","mode","pageSizeOptions","getPageNumbers","current","total","pages","i","index","DataGridColumnHeader","title","sortState","s","isSorted","isDesc","existing","DataGridTableRowSelectAll","DataGridTableRowSelect","rowId","startOfMonth","date","endOfMonth","eachDayOfInterval","days","isSameMonth","date1","date2","isSameDay","isToday","isTomorrow","tomorrow","addMonths","months","newDate","formatDate","format","monthNames","monthNamesShort","Calendar","selected","onSelect","events","holidays","currentMonth","setCurrentMonth","view","setView","monthStart","monthEnd","dayNames","currentYear","years","_","previousMonth","nextMonth","previousYear","nextYear","selectMonth","monthIndex","selectYear","year","getEventsForDay","day","event","isHoliday","checkDate","h","month","dayEvents","isSelectedDay","isTodayDay","isCurrentMonth","isHolidayDay","idx","getEventColor","styles","CalendarIcon","today","Popover","PopoverPrimitive","PopoverTrigger","PopoverAnchor","PopoverContent","align","DatePicker","onDateChange","dateRange","onDateRangeChange","placeholder","dateFormat","disabled","showIcon","icon","minDate","maxDate","disabledDates","isDateDisabled","fullWidth","customTrigger","numberOfMonths","open","setOpen","rangeStart","setRangeStart","rangeEnd","setRangeEnd","hoverDate","setHoverDate","handleSelect","selectedDate","from","to","isDateDisabledCheck","d","nextMonthDate","nextMonthStart","nextMonthEnd","nextMonthDays","subMonths","formatStr","isInRange","isRangeStart","isRangeEnd","triggerContent","renderDayCell","isDisabled","inRange","dayOfWeek","isRangeStartDay","isRangeEndDay","Fragment","TimePicker","time","onTimeChange","timezone","showTimezone","minuteStep","showSeconds","showClockFace","is24Hour","initialHours","initialMinutes","initialSeconds","initialPeriod","hours","setHours","minutes","setMinutes","seconds","setSeconds","period","setPeriod","hourInput","setHourInput","minuteInput","setMinuteInput","secondInput","setSecondInput","hourInputRef","useRef","minuteInputRef","secondInputRef","hourScrollRef","minuteScrollRef","secondScrollRef","useEffect","m","updateTime","newTime","handleHourChange","hour","newHour","handleMinuteChange","minute","handleSecondChange","second","handlePeriodToggle","newPeriod","handleNow","now","formatTime","timeStr","generateHours","max","generateMinutes","generateSeconds","displayHour","renderClockFace","hourAngle","minuteAngle","hourX","hourY","minuteX","minuteY","angle","x","y","Clock","newVal","num","min","validVal","val","Card","CardHeader","CardTitle","CardDescription","CardContent","CardFooter","Label","LabelPrimitive","Modal","DialogPrimitive","ModalPortal","ModalOverlay","ModalContent","X","ModalHeader","ModalTitle","ModalDescription","SimpleModal","isOpen","onClose","description","WeekNavigator","onWeekChange","initialDate","compact","currentWeekStart","setCurrentWeekStart","showCalendar","setShowCalendar","showMonthGrid","setShowMonthGrid","showYearGrid","setShowYearGrid","calendarYear","setCalendarYear","calendarMonth","setCalendarMonth","selectedWeekIndex","setSelectedWeekIndex","calendarDropdownRef","calendarButtonRef","calculateWeekDates","startDate","dates","diff","getWeeksInMonth","firstDay","lastDay","weeks","weekEnd","formatWeekRange","startMonth","endMonth","currentWeekDates","yearOptions","navigateWeek","direction","newWeekStart","handleWeekSelectorClick","week","handleClickOutside","currentWeekIndex","newMonth","newYear","isCurrentWeek","isSelected","weekNavigatorUtils","firstDayOfYear","pastDaysOfYear","firstDayOfWeek","offsetDate","defaultTimeSlots","defaultDays","defaultColors","Schedule","subtitle","onEventAdd","onEventUpdate","onEventDelete","timeSlots","daysOfWeek","showAddButton","eventColors","customFields","showWeekNavigation","showHalfHourLines","showCurrentTimeIndicator","slotHeight","isModalOpen","setIsModalOpen","selectedEvent","setSelectedEvent","formData","setFormData","handleOpenModal","field","handleSave","eventData","handleDelete","getEventsForSlot","eventStart","slotTime","getEventHeight","startHour","startMin","endHour","endMin","startInMinutes","durationInHours","padding","Plus","dateForDay","currentHour","currentMinute","slotHour","slotMinuteRaw","slotMinute","slotStart","slotEnd","nowMinutes","isCurrentTimeSlot","indicatorTop","dayIndex","eventHeight","isShortEvent","option","color","Trash2","TIMEZONES","convertTimezone","fromTz","toTz","fromOffset","tz","toOffset","converted","formatTimeWithTimezone"],"mappings":"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"}
|