@lego-box/ui-kit 0.1.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/button.tsx","../src/lib/utils.ts","../src/components/card.tsx","../src/components/checkbox.tsx","../src/components/input.tsx","../src/components/label.tsx","../src/components/link.tsx","../src/components/password-input.tsx","../src/components/stats-card.tsx","../src/components/badge.tsx","../src/components/tabs.tsx","../src/components/data-table.tsx","../src/components/grouped-table.tsx","../src/components/search-input.tsx","../src/components/filter-chip.tsx","../src/components/status-badge.tsx","../src/components/pagination.tsx","../src/components/select.tsx","../src/components/console-log.tsx","../src/components/user-form-dialog.tsx","../src/components/dialog.tsx","../src/lib/passwordGenerator.ts","../src/components/role-form-dialog.tsx","../src/components/assign-users-to-role-dialog.tsx","../src/components/permission-form-dialog.tsx","../src/components/delete-confirmation-dialog.tsx","../src/components/change-password-dialog.tsx","../src/components/bulk-action-toolbar.tsx","../src/components/bulk-confirmation-dialog.tsx","../src/components/can-guard.tsx","../src/components/tooltip.tsx","../src/components/quick-action-card.tsx","../src/components/ticket-stats-card.tsx","../src/components/ticket-form-dialog.tsx","../src/components/health-status-card.tsx","../src/components/service-status-card.tsx","../src/components/admin-shell.tsx","../src/components/topbar.tsx","../src/components/profile-dropdown.tsx","../src/components/theme-toggle.tsx","../src/components/sidenav.tsx","../src/components/welcome-banner.tsx","../src/components/tech-stack-card.tsx","../src/components/feature-card.tsx","../src/components/loading.tsx","../src/components/not-found.tsx","../src/components/access-denied.tsx","#style-inject:#style-inject","../src/index.css"],"sourcesContent":["import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../lib/utils';\n\nconst buttonVariants = cva(\n 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-lg text-sm font-semibold transition-all duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 relative',\n {\n variants: {\n variant: {\n default: [\n 'bg-primary',\n 'text-primary-foreground',\n 'shadow-md',\n 'hover:shadow-lg',\n 'active:shadow-sm',\n 'active:translate-y-px',\n ],\n destructive: [\n 'bg-destructive',\n 'text-destructive-foreground',\n 'hover:bg-destructive/90',\n ],\n success: [\n 'bg-emerald-500',\n 'text-white',\n 'hover:bg-emerald-600',\n 'dark:bg-emerald-600',\n 'dark:hover:bg-emerald-700',\n ],\n outline: [\n 'border-2',\n 'border-input',\n 'bg-background',\n 'hover:bg-accent',\n 'hover:text-accent-foreground',\n ],\n secondary: [\n 'bg-muted',\n 'text-muted-foreground',\n 'hover:bg-muted/80',\n ],\n ghost: [\n 'hover:bg-accent',\n 'hover:text-accent-foreground',\n ],\n link: [\n 'text-primary',\n 'underline-offset-4',\n 'hover:underline',\n ],\n },\n size: {\n default: 'h-9 px-4 py-2 text-sm',\n sm: 'h-8 rounded-md px-3 text-xs',\n lg: 'h-11 rounded-lg px-6 text-base',\n icon: 'h-9 w-9',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n);\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n shimmer?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, shimmer = false, children, ...props }, ref) => {\n return (\n <button\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n >\n {children}\n </button>\n );\n }\n);\nButton.displayName = 'Button';\n\nexport { Button, buttonVariants };\n","import { clsx, type ClassValue } 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';\r\nimport { cn } from '../lib/utils';\r\n\r\nexport interface CardProps extends React.HTMLAttributes<HTMLDivElement> {\r\n variant?: 'default' | 'elevated' | 'glass';\r\n}\r\n\r\nconst Card = React.forwardRef<HTMLDivElement, CardProps>(\n ({ className, variant = 'default', ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n 'rounded-lg border bg-card text-card-foreground transition-all duration-300',\n // Border color using theme variable\n 'border-border',\n // Variant-specific styles\n variant === 'default' && 'shadow-sm',\n variant === 'elevated' && 'shadow-lg',\n variant === 'glass' && [\n 'backdrop-blur-xl',\n 'bg-card/80',\n 'border-border',\n 'shadow-lg',\n ],\n className\n )}\n {...props}\n />\n )\n);\nCard.displayName = 'Card';\n\r\nconst CardHeader = React.forwardRef<HTMLDivElement, 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 )\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-lg font-semibold leading-none tracking-tight text-card-foreground',\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-muted-foreground', className)}\n {...props}\n />\n));\nCardDescription.displayName = 'CardDescription';\n\nconst CardContent = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('p-6 pt-0', className)} {...props} />\n )\n);\nCardContent.displayName = 'CardContent';\n\nconst CardFooter = React.forwardRef<HTMLDivElement, 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 )\n);\nCardFooter.displayName = 'CardFooter';\n\r\nexport {\r\n Card,\r\n CardHeader,\r\n CardFooter,\r\n CardTitle,\r\n CardDescription,\r\n CardContent,\r\n};\r\n","import * as React from 'react';\r\nimport { cn } from '../lib/utils';\r\n\r\nexport interface CheckboxProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type'> {\r\n label?: string;\r\n}\r\n\r\nconst Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(\r\n ({ className, label, id, ...props }, ref) => {\r\n const checkboxId = id || `checkbox-${Math.random().toString(36).substr(2, 9)}`;\r\n\r\n return (\r\n <div className=\"flex items-center gap-2\">\r\n <input\r\n type=\"checkbox\"\r\n ref={ref}\r\n id={checkboxId}\r\n className={cn(\r\n 'h-[18px] w-[18px] rounded border border-slate-300 bg-white text-primary',\r\n 'focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2',\r\n 'cursor-pointer',\r\n 'checked:bg-primary checked:border-primary',\r\n 'disabled:cursor-not-allowed disabled:opacity-50',\r\n 'transition-colors duration-200',\r\n className\r\n )}\r\n {...props}\r\n />\r\n {label && (\r\n <label\r\n htmlFor={checkboxId}\r\n className=\"text-sm font-normal text-slate-600 cursor-pointer select-none\"\r\n >\r\n {label}\r\n </label>\r\n )}\r\n </div>\r\n );\r\n }\r\n);\r\nCheckbox.displayName = 'Checkbox';\r\n\r\nexport { Checkbox };\r\n","import * as React from 'react';\r\nimport { cn } from '../lib/utils';\r\n\r\nexport interface InputProps\r\n extends React.InputHTMLAttributes<HTMLInputElement> {\r\n wrapperClassName?: string;\r\n}\r\n\r\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\r\n ({ className, type, wrapperClassName, ...props }, ref) => {\r\n return (\r\n <input\r\n type={type}\r\n className={cn(\r\n 'flex h-11 w-full rounded-lg',\r\n 'border border-slate-200 bg-white',\r\n 'px-4 py-2.5 text-sm text-foreground',\r\n 'placeholder:text-slate-400',\r\n 'transition-colors duration-200',\r\n 'focus-visible:outline-none',\r\n 'focus-visible:border-primary',\r\n 'focus-visible:ring-2 focus-visible:ring-primary/20',\r\n 'disabled:cursor-not-allowed disabled:opacity-50',\r\n className\r\n )}\r\n ref={ref}\r\n {...props}\r\n />\r\n );\r\n }\r\n);\r\nInput.displayName = 'Input';\r\n\r\nexport { Input };\r\n","import * as React from 'react';\r\nimport { cn } from '../lib/utils';\r\n\r\nexport interface LabelProps\r\n extends React.LabelHTMLAttributes<HTMLLabelElement> {\r\n required?: boolean;\r\n}\r\n\r\nconst Label = React.forwardRef<HTMLLabelElement, LabelProps>(\r\n ({ className, children, required, ...props }, ref) => (\r\n <label\r\n ref={ref}\r\n className={cn(\r\n 'text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70 text-slate-700',\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n {required && <span className=\"text-destructive ml-1\">*</span>}\r\n </label>\r\n )\r\n);\r\nLabel.displayName = 'Label';\r\n\r\nexport { Label };\r\n","import * as React from 'react';\r\nimport { cn } from '../lib/utils';\r\n\r\nexport interface LinkProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {\r\n variant?: 'default' | 'primary' | 'muted';\r\n}\r\n\r\nconst Link = React.forwardRef<HTMLAnchorElement, LinkProps>(\r\n ({ className, variant = 'default', href = '#', ...props }, ref) => {\r\n const variants = {\r\n default: 'text-slate-600 hover:text-slate-900',\r\n primary: 'text-primary font-medium hover:underline',\r\n muted: 'text-muted-foreground hover:text-foreground',\r\n };\r\n\r\n return (\r\n <a\r\n ref={ref}\r\n href={href}\r\n className={cn(\r\n 'text-sm transition-colors duration-200 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 rounded',\r\n variants[variant],\r\n className\r\n )}\r\n {...props}\r\n />\r\n );\r\n }\r\n);\r\nLink.displayName = 'Link';\r\n\r\nexport { Link };\r\n","import * as React from 'react';\nimport { cn } from '../lib/utils';\nimport { Input } from './input';\n\nexport interface PasswordInputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n wrapperClassName?: string;\n}\n\nconst PasswordInput = React.forwardRef<HTMLInputElement, PasswordInputProps>(\n ({ className, wrapperClassName, ...props }, ref) => {\n const [showPassword, setShowPassword] = React.useState(false);\n\n return (\n <div className={cn('relative w-full', wrapperClassName)}>\n <Input\n type={showPassword ? 'text' : 'password'}\n className={cn('pr-10', className)}\n ref={ref}\n {...props}\n />\n <button\n type=\"button\"\n onClick={() => setShowPassword(!showPassword)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 rounded\"\n aria-label={showPassword ? 'Hide password' : 'Show password'}\n >\n {showPassword ? (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24\" />\n <line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\" />\n </svg>\n ) : (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n )}\n </button>\n </div>\n );\n }\n);\nPasswordInput.displayName = 'PasswordInput';\n\nexport { PasswordInput };\n","import * as React from 'react';\nimport { cn } from '../lib/utils';\n\nexport interface StatsCardProps extends React.HTMLAttributes<HTMLDivElement> {\n value: string | number;\n label: string;\n icon?: React.ReactNode;\n trend?: {\n value: string;\n positive?: boolean;\n };\n}\n\n/**\n * StatsCard - Displays a statistic with an icon and optional trend indicator\n * \n * Design specs from Pencil:\n * - White background with rounded corners (16px)\n * - Large value (32px, bold)\n * - Label below (14px, muted)\n * - Icon in top-right with colored background\n * - Optional trend indicator with green/red color\n */\nconst StatsCard = React.forwardRef<HTMLDivElement, StatsCardProps>(\n ({ value, label, icon, trend, className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n 'bg-card rounded-2xl p-5 border border-border',\n 'flex flex-col gap-3',\n className\n )}\n {...props}\n >\n {/* Top row: Icon and trend */}\n <div className=\"flex items-center justify-between\">\n {icon && (\n <div className=\"w-10 h-10 rounded-xl bg-primary/10 flex items-center justify-center text-primary\">\n {icon}\n </div>\n )}\n {trend && (\n <span\n className={cn(\n 'text-xs font-medium px-2 py-1 rounded-full',\n trend.positive\n ? 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400'\n : 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400'\n )}\n >\n {trend.positive ? '+' : ''}{trend.value}\n </span>\n )}\n </div>\n\n {/* Value and Label */}\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-3xl font-bold text-foreground\">{value}</span>\n <span className=\"text-sm text-muted-foreground\">{label}</span>\n </div>\n </div>\n );\n }\n);\n\nStatsCard.displayName = 'StatsCard';\n\nexport { StatsCard };\n","import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../lib/utils';\n\nconst badgeVariants = cva(\n 'inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium transition-colors',\n {\n variants: {\n variant: {\n default: 'bg-primary/10 text-primary border border-primary/20',\n secondary: 'bg-secondary text-secondary-foreground',\n destructive: 'bg-destructive/10 text-destructive border border-destructive/20',\n outline: 'border border-border text-foreground',\n success: 'bg-green-100 text-green-700 border border-green-200 dark:bg-green-900/30 dark:text-green-400 dark:border-green-800',\n warning: 'bg-yellow-100 text-yellow-700 border border-yellow-200 dark:bg-yellow-900/30 dark:text-yellow-400 dark:border-yellow-800',\n info: 'bg-blue-100 text-blue-700 border border-blue-200 dark:bg-blue-900/30 dark:text-blue-400 dark:border-blue-800',\n muted: 'bg-muted text-muted-foreground',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n }\n);\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {}\n\n/**\n * Badge - Small status indicator component\n * \n * Used for:\n * - User status (Active, Inactive, Pending)\n * - Roles (Admin, Editor, Viewer, etc.)\n * - Filter chips\n * - Status indicators\n */\nconst Badge = React.forwardRef<HTMLDivElement, BadgeProps>(\n ({ className, variant, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(badgeVariants({ variant }), className)}\n {...props}\n />\n );\n }\n);\n\nBadge.displayName = 'Badge';\n\nexport { Badge, badgeVariants };\n","import * as React from 'react';\r\nimport { cn } from '../lib/utils';\r\n\r\nexport interface TabsProps extends React.HTMLAttributes<HTMLDivElement> {\r\n value: string;\r\n onValueChange: (value: string) => void;\r\n children: React.ReactNode;\r\n}\r\n\r\nexport interface TabsListProps extends React.HTMLAttributes<HTMLDivElement> {\r\n children: React.ReactNode;\r\n}\r\n\r\nexport interface TabsTriggerProps extends React.HTMLAttributes<HTMLButtonElement> {\r\n value: string;\r\n children: React.ReactNode;\r\n /** Optional badge (number or node) - active tab shows blue badge, inactive shows grey */\r\n badge?: React.ReactNode | number;\r\n /** When true, tab cannot be selected */\r\n disabled?: boolean;\r\n}\r\n\r\n/**\r\n * Tabs - Tab navigation component\r\n * \r\n * Design specs from Pencil:\r\n * - Container with gray background and rounded corners\r\n * - Active tab has white background with shadow\r\n * - Inactive tabs are transparent with hover state\r\n * - Gap between tabs\r\n */\r\nconst Tabs = React.forwardRef<HTMLDivElement, TabsProps>(\r\n ({ value, onValueChange, children, className, ...props }, ref) => {\r\n return (\r\n <div\r\n ref={ref}\r\n className={cn('w-full', className)}\r\n {...props}\r\n >\r\n {React.Children.map(children, (child) => {\r\n if (React.isValidElement(child)) {\r\n return React.cloneElement(child as React.ReactElement<any>, {\r\n selectedValue: value,\r\n onValueChange,\r\n });\r\n }\r\n return child;\r\n })}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nTabs.displayName = 'Tabs';\r\n\r\nconst TabsList = React.forwardRef<HTMLDivElement, TabsListProps & { selectedValue?: string; onValueChange?: (value: string) => void }>(\r\n ({ children, className, selectedValue, onValueChange, ...props }, ref) => {\r\n return (\r\n <div\r\n ref={ref}\r\n className={cn(\r\n 'inline-flex items-center gap-1 p-1.5 rounded-xl bg-white dark:bg-slate-800 border border-border dark:border-slate-700 shadow-sm',\r\n className\r\n )}\r\n {...props}\r\n >\r\n {React.Children.map(children, (child) => {\r\n if (React.isValidElement(child)) {\r\n return React.cloneElement(child as React.ReactElement<any>, {\r\n selectedValue,\r\n onValueChange,\r\n });\r\n }\r\n return child;\r\n })}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nTabsList.displayName = 'TabsList';\r\n\r\nconst TabsTrigger = React.forwardRef<HTMLButtonElement, TabsTriggerProps & { selectedValue?: string; onValueChange?: (value: string) => void }>(\r\n ({ value, children, className, selectedValue, onValueChange, badge, disabled, ...props }, ref) => {\r\n const isActive = selectedValue === value;\r\n \r\n return (\r\n <button\r\n ref={ref}\r\n onClick={() => !disabled && onValueChange?.(value)}\r\n disabled={disabled}\r\n className={cn(\r\n 'inline-flex items-center justify-center gap-2 px-4 py-2.5 text-sm font-medium rounded-lg transition-all duration-200',\r\n disabled && 'cursor-not-allowed opacity-50',\r\n !disabled && 'cursor-pointer',\r\n isActive\r\n ? 'bg-primary/10 text-primary dark:bg-primary/15 dark:text-primary shadow-sm'\r\n : 'text-muted-foreground hover:text-foreground hover:bg-muted/50 dark:hover:bg-slate-700/30',\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n {badge !== undefined && badge !== null && (\r\n <span\r\n className={cn(\r\n 'ml-2 px-2 py-0.5 text-xs font-medium rounded-full text-white min-w-[1.25rem] text-center',\r\n isActive ? 'bg-primary' : 'bg-muted-foreground/80 dark:bg-slate-600'\r\n )}\r\n >\r\n {typeof badge === 'number' ? badge : badge}\r\n </span>\r\n )}\r\n </button>\r\n );\r\n }\r\n);\r\n\r\nTabsTrigger.displayName = 'TabsTrigger';\r\n\r\nexport { Tabs, TabsList, TabsTrigger };\r\n","import * as React from 'react';\r\nimport { cn } from '../lib/utils';\r\n\r\nexport interface DataTableColumn<T> {\r\n key: string;\r\n header: string;\r\n width?: string;\r\n cell: (row: T) => React.ReactNode;\r\n}\r\n\r\nexport interface DataTableProps<T> extends React.HTMLAttributes<HTMLDivElement> {\r\n columns: DataTableColumn<T>[];\r\n data: T[];\r\n keyExtractor: (row: T) => string;\r\n selectable?: boolean;\r\n selectedRows?: Set<string>;\r\n onSelectRow?: (id: string, selected: boolean) => void;\r\n onSelectAll?: (selected: boolean) => void;\r\n /**\r\n * Layout variant:\r\n * - \"card\": Wraps table in bordered card (matches /migrations style). Use for standalone tables.\r\n * - \"inline\": No wrapper. Use when table is inside Card or other container.\r\n */\r\n variant?: 'card' | 'inline';\r\n}\r\n\r\n/**\r\n * DataTable - Flexible table component for displaying tabular data\r\n *\r\n * Consistent design across pages (User Management, Migrations, etc.):\r\n * - Card variant: Bordered card wrapper with rounded corners\r\n * - Header row with muted background\r\n * - Row dividers (divide-y)\r\n * - Hover states\r\n */\r\nfunction DataTable<T>({\r\n columns,\r\n data,\r\n keyExtractor,\r\n selectable = false,\r\n selectedRows = new Set(),\r\n onSelectRow,\r\n onSelectAll,\r\n variant = 'card',\r\n className,\r\n ...props\r\n}: DataTableProps<T>) {\r\n const allSelected = data.length > 0 && data.every((row) => selectedRows.has(keyExtractor(row)));\r\n const someSelected = data.some((row) => selectedRows.has(keyExtractor(row))) && !allSelected;\r\n\r\n const tableContent = (\r\n <div className=\"overflow-x-auto\">\r\n <table className=\"w-full\">\r\n {/* Header */}\r\n <thead>\r\n <tr className=\"bg-muted/50 dark:bg-slate-800\">\r\n {selectable && (\r\n <th className=\"w-12 px-6 py-3 text-left\">\r\n <input\r\n type=\"checkbox\"\r\n checked={allSelected}\r\n ref={(input) => {\r\n if (input) {\r\n input.indeterminate = someSelected;\r\n }\r\n }}\r\n onChange={(e) => onSelectAll?.(e.target.checked)}\r\n className=\"w-4 h-4 rounded border-border text-primary focus:ring-primary\"\r\n />\r\n </th>\r\n )}\r\n {columns.map((column) => (\r\n <th\r\n key={column.key}\r\n className=\"px-6 py-3 text-left text-xs font-medium text-muted-foreground uppercase tracking-wider\"\r\n style={{ width: column.width }}\r\n >\r\n {column.header}\r\n </th>\r\n ))}\r\n </tr>\r\n </thead>\r\n\r\n {/* Body */}\r\n <tbody className=\"divide-y divide-border dark:divide-slate-700\">\r\n {data.map((row) => {\r\n const rowId = keyExtractor(row);\r\n const isSelected = selectedRows.has(rowId);\r\n\r\n return (\r\n <tr\r\n key={rowId}\r\n className={cn(\r\n 'transition-colors hover:bg-muted/30 dark:hover:bg-slate-800/50',\r\n isSelected && 'bg-primary/5'\r\n )}\r\n >\r\n {selectable && (\r\n <td className=\"w-12 px-6 py-4\">\r\n <input\r\n type=\"checkbox\"\r\n checked={isSelected}\r\n onChange={(e) => onSelectRow?.(rowId, e.target.checked)}\r\n className=\"w-4 h-4 rounded border-border text-primary focus:ring-primary\"\r\n />\r\n </td>\r\n )}\r\n {columns.map((column) => (\r\n <td key={column.key} className=\"px-6 py-4 align-middle\">\r\n {column.cell(row)}\r\n </td>\r\n ))}\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n </table>\r\n </div>\r\n );\r\n\r\n if (variant === 'card') {\r\n return (\r\n <div\r\n className={cn(\r\n 'w-full rounded-2xl border border-border dark:border-slate-700 overflow-hidden bg-card dark:bg-slate-800/50',\r\n className\r\n )}\r\n {...props}\r\n >\r\n {tableContent}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className={cn('w-full overflow-x-auto', className)} {...props}>\r\n {tableContent}\r\n </div>\r\n );\r\n}\r\n\r\nexport { DataTable };\r\n","import * as React from 'react';\r\nimport { cn } from '../lib/utils';\r\n\r\nexport interface GroupedTableColumn<T> {\r\n key: string;\r\n header: string;\r\n /** Width: Tailwind class (e.g. 'w-32') or CSS value (e.g. '8rem') */\r\n width?: string;\r\n cell: (row: T) => React.ReactNode;\r\n}\r\n\r\nfunction isTailwindWidth(w: string): boolean {\r\n return /^w-\\d+$/.test(w) || /^w-\\d+\\/\\d+$/.test(w) || w === 'w-auto' || w === 'w-full';\r\n}\r\n\r\nexport interface GroupedTableProps<T> {\r\n /** Data to display */\r\n data: T[];\r\n /** Extract the group key from each row (e.g. perm => perm.collection, log => log.resource) */\r\n groupBy: (row: T) => string;\r\n /** Unique key for each row */\r\n keyExtractor: (row: T) => string;\r\n /** Column definitions for child rows */\r\n columns: GroupedTableColumn<T>[];\r\n /** Message when data is empty */\r\n emptyMessage?: string;\r\n /** Customize group header label. Default: \"{groupKey} ({count} item(s))\" */\r\n groupLabel?: (groupKey: string, count: number) => string;\r\n /** Whether to expand all groups by default */\r\n expandByDefault?: boolean;\r\n}\r\n\r\n/**\r\n * GroupedTable - Reusable table with expand/collapse grouping\r\n *\r\n * Use for data that should be grouped by a key (e.g. permissions by collection,\r\n * audit logs by resource). Groups are expandable/collapsible.\r\n *\r\n * Same visual design as DataTable card variant.\r\n */\r\nexport function GroupedTable<T>({\r\n data,\r\n groupBy,\r\n keyExtractor,\r\n columns,\r\n emptyMessage = 'No data found',\r\n groupLabel = (key, count) => `${key} (${count} item${count !== 1 ? 's' : ''})`,\r\n expandByDefault = true,\r\n}: GroupedTableProps<T>) {\r\n const [expandedGroups, setExpandedGroups] = React.useState<Set<string>>(new Set());\r\n const hasInitializedRef = React.useRef(false);\r\n\r\n const groupedData = React.useMemo(() => {\r\n const groups = new Map<string, T[]>();\r\n for (const row of data) {\r\n const key = groupBy(row) || '_unknown';\r\n if (!groups.has(key)) {\r\n groups.set(key, []);\r\n }\r\n groups.get(key)!.push(row);\r\n }\r\n return Array.from(groups.entries()).map(([groupKey, rows]) => ({\r\n groupKey,\r\n rows,\r\n }));\r\n }, [data, groupBy]);\r\n\r\n const toggleGroup = (groupKey: string) => {\r\n setExpandedGroups((prev) => {\r\n const next = new Set(prev);\r\n if (next.has(groupKey)) {\r\n next.delete(groupKey);\r\n } else {\r\n next.add(groupKey);\r\n }\r\n return next;\r\n });\r\n };\r\n\r\n React.useEffect(() => {\r\n if (groupedData.length > 0 && !hasInitializedRef.current) {\r\n hasInitializedRef.current = true;\r\n setExpandedGroups(\r\n expandByDefault ? new Set(groupedData.map((g) => g.groupKey)) : new Set()\r\n );\r\n }\r\n }, [groupedData, expandByDefault]);\r\n\r\n if (data.length === 0) {\r\n return (\r\n <div className=\"rounded-2xl border border-border dark:border-slate-700 overflow-hidden bg-card dark:bg-slate-800/50\">\r\n <div className=\"px-6 py-12 text-center text-muted-foreground\">\r\n {emptyMessage}\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"w-full rounded-2xl border border-border dark:border-slate-700 overflow-hidden bg-card dark:bg-slate-800/50\">\r\n <div className=\"overflow-x-auto\">\r\n <table className=\"w-full\">\r\n <thead>\r\n <tr className=\"bg-muted/50 dark:bg-slate-800\">\r\n <th className=\"w-10 px-6 py-3 text-left\" />\r\n {columns.map((column) => (\r\n <th\r\n key={column.key}\r\n className={cn(\r\n 'px-6 py-3 text-left text-xs font-medium text-muted-foreground uppercase tracking-wider',\r\n column.width && isTailwindWidth(column.width) && column.width\r\n )}\r\n style={column.width && !isTailwindWidth(column.width) ? { width: column.width } : undefined}\r\n >\r\n {column.header}\r\n </th>\r\n ))}\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-border dark:divide-slate-700\">\r\n {groupedData.map(({ groupKey, rows }) => {\r\n const isExpanded = expandedGroups.has(groupKey);\r\n return (\r\n <React.Fragment key={groupKey}>\r\n {/* Group header row */}\r\n <tr\r\n className=\"bg-muted/30 dark:bg-slate-800/70 hover:bg-muted/50 dark:hover:bg-slate-800 transition-colors cursor-pointer\"\r\n onClick={() => toggleGroup(groupKey)}\r\n >\r\n <td className=\"px-6 py-3 align-middle\">\r\n <button\r\n type=\"button\"\r\n className=\"p-0.5 rounded hover:bg-muted text-muted-foreground hover:text-foreground transition-colors\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n toggleGroup(groupKey);\r\n }}\r\n aria-label={isExpanded ? 'Collapse' : 'Expand'}\r\n >\r\n <svg\r\n className={cn('w-5 h-5 transition-transform', isExpanded && 'rotate-90')}\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\r\n </svg>\r\n </button>\r\n </td>\r\n <td colSpan={columns.length} className=\"px-6 py-3 align-middle\">\r\n <span className=\"font-medium text-foreground\">{groupLabel(groupKey, rows.length)}</span>\r\n </td>\r\n </tr>\r\n {/* Child rows */}\r\n {isExpanded &&\r\n rows.map((row) => (\r\n <tr\r\n key={keyExtractor(row)}\r\n className=\"transition-colors hover:bg-muted/30 dark:hover:bg-slate-800/50\"\r\n >\r\n <td className=\"px-6 py-4 align-middle\" />\r\n {columns.map((column) => (\r\n <td key={column.key} className=\"px-6 py-4 align-middle\">\r\n {column.cell(row)}\r\n </td>\r\n ))}\r\n </tr>\r\n ))}\r\n </React.Fragment>\r\n );\r\n })}\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import * as React from 'react';\nimport { cn } from '../lib/utils';\n\nexport interface SearchInputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n icon?: React.ReactNode;\n}\n\n/**\n * SearchInput - Search input with icon\n * \n * Design specs from Pencil:\n * - Gray background (muted)\n * - Search icon on left\n * - Rounded corners\n * - Placeholder text\n */\nconst SearchInput = React.forwardRef<HTMLInputElement, SearchInputProps>(\n ({ className, icon, ...props }, ref) => {\n return (\n <div className={cn('relative', className)}>\n {icon && (\n <div className=\"absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground\">\n {icon}\n </div>\n )}\n <input\n ref={ref}\n type=\"text\"\n className={cn(\n 'w-full h-10 pl-10 pr-4 rounded-lg bg-muted border-0',\n 'text-sm text-foreground placeholder:text-muted-foreground',\n 'focus:outline-none focus:ring-2 focus:ring-primary/20',\n className\n )}\n {...props}\n />\n </div>\n );\n }\n);\n\nSearchInput.displayName = 'SearchInput';\n\nexport { SearchInput };\n","import * as React from 'react';\nimport { cn } from '../lib/utils';\n\nexport interface FilterChipProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n active?: boolean;\n count?: number;\n}\n\n/**\n * FilterChip - Chip button for filtering data\n * \n * Design specs from Pencil:\n * - Rounded pill shape\n * - Active state has gray background\n * - Inactive state has white background with border\n * - Optional count badge\n */\nconst FilterChip = React.forwardRef<HTMLButtonElement, FilterChipProps>(\n ({ active, count, children, className, ...props }, ref) => {\n return (\n <button\n ref={ref}\n className={cn(\n 'inline-flex items-center gap-2 px-3 py-1.5 rounded-lg text-sm font-medium transition-all duration-200',\n active\n ? 'bg-muted text-foreground'\n : 'bg-background text-muted-foreground border border-border hover:text-foreground hover:border-foreground/20',\n className\n )}\n {...props}\n >\n {children}\n {count !== undefined && (\n <span className={cn(\n 'text-xs px-1.5 py-0.5 rounded-full',\n active\n ? 'bg-background text-foreground'\n : 'bg-muted text-muted-foreground'\n )}>\n {count}\n </span>\n )}\n </button>\n );\n }\n);\n\nFilterChip.displayName = 'FilterChip';\n\nexport { FilterChip };\n","import * as React from 'react';\nimport { cn } from '../lib/utils';\n\ntype StatusType = 'applied' | 'pending' | 'failed' | 'success' | 'warning' | 'error' | 'info';\n\nexport interface StatusBadgeProps extends React.HTMLAttributes<HTMLDivElement> {\n status: StatusType;\n label?: string;\n showDot?: boolean;\n}\n\n/**\n * StatusBadge - Displays status with colored badge and dot\n * \n * Design specs from Pencil:\n * - Colored background matching status\n * - Small colored dot on the left\n * - Rounded corners\n * - Text label\n * \n * Statuses:\n * - applied/success: Green background with green dot\n * - pending/warning: Amber/Yellow background with amber dot\n * - failed/error: Red background with red dot\n */\nconst StatusBadge = React.forwardRef<HTMLDivElement, StatusBadgeProps>(\n ({ status, label, showDot = true, className, children, ...props }, ref) => {\n const getStatusConfig = (status: StatusType) => {\n switch (status) {\n case 'applied':\n case 'success':\n return {\n bgClass: 'bg-emerald-50 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-400',\n dotClass: 'bg-emerald-500',\n defaultLabel: 'Applied',\n };\n case 'pending':\n case 'warning':\n return {\n bgClass: 'bg-amber-50 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400',\n dotClass: 'bg-amber-500',\n defaultLabel: 'Pending',\n };\n case 'failed':\n case 'error':\n return {\n bgClass: 'bg-red-50 text-red-700 dark:bg-red-900/30 dark:text-red-400',\n dotClass: 'bg-red-500',\n defaultLabel: 'Failed',\n };\n case 'info':\n return {\n bgClass: 'bg-blue-50 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400',\n dotClass: 'bg-blue-500',\n defaultLabel: 'Info',\n };\n default:\n return {\n bgClass: 'bg-gray-50 text-gray-700 dark:bg-gray-800 dark:text-gray-400',\n dotClass: 'bg-gray-500',\n defaultLabel: 'Unknown',\n };\n }\n };\n\n const config = getStatusConfig(status);\n const displayLabel = label || config.defaultLabel;\n\n return (\n <div\n ref={ref}\n className={cn(\n 'inline-flex items-center gap-2 px-3 py-1.5 rounded-md text-xs font-medium',\n config.bgClass,\n className\n )}\n {...props}\n >\n {showDot && (\n <span className={cn('w-1.5 h-1.5 rounded-full', config.dotClass)} />\n )}\n <span>{children || displayLabel}</span>\n </div>\n );\n }\n);\n\nStatusBadge.displayName = 'StatusBadge';\n\nexport { StatusBadge };\n","import * as React from 'react';\r\nimport { cn } from '../lib/utils';\r\n\r\nexport interface PaginationProps {\r\n currentPage: number;\r\n totalPages: number;\r\n totalItems: number;\r\n perPage: number;\r\n onPageChange: (page: number) => void;\r\n onPerPageChange?: (perPage: number) => void;\r\n pageSizeOptions?: number[];\r\n showPageSizeSelector?: boolean;\r\n /** Label for items, e.g. \"users\" for \"Showing 1-5 of 248 users\" */\r\n itemsLabel?: string;\r\n}\r\n\r\n/**\r\n * Reusable pagination component with page navigation and optional page size selector.\r\n *\r\n * @example\r\n * <Pagination\r\n * currentPage={1}\r\n * totalPages={10}\r\n * totalItems={250}\r\n * perPage={25}\r\n * onPageChange={(page) => setPage(page)}\r\n * onPerPageChange={(size) => setPerPage(size)}\r\n * showPageSizeSelector={true}\r\n * pageSizeOptions={[10, 25, 50, 100]}\r\n * />\r\n */\r\nexport function Pagination({\r\n currentPage,\r\n totalPages,\r\n totalItems,\r\n perPage,\r\n onPageChange,\r\n onPerPageChange,\r\n pageSizeOptions = [10, 25, 50, 100],\r\n showPageSizeSelector = false,\r\n itemsLabel = 'results',\r\n}: PaginationProps) {\r\n // Calculate range text with fallback for undefined values\r\n const safeTotalItems = totalItems || 0;\r\n const safeCurrentPage = currentPage || 1;\r\n const safePerPage = perPage || 25;\r\n const safeTotalPages = totalPages || 1;\r\n \r\n const startItem = safeTotalItems === 0 ? 0 : (safeCurrentPage - 1) * safePerPage + 1;\r\n const endItem = Math.min(safeCurrentPage * safePerPage, safeTotalItems);\r\n\r\n // Generate page numbers to display\r\n const getPageNumbers = () => {\r\n const pages: (number | string)[] = [];\r\n\r\n if (totalPages <= 5) {\r\n // Show all pages if 5 or fewer\r\n for (let i = 1; i <= totalPages; i++) {\r\n pages.push(i);\r\n }\r\n } else if (currentPage <= 3) {\r\n // Near start: show 1, 2, 3, 4, 5\r\n for (let i = 1; i <= 5; i++) {\r\n pages.push(i);\r\n }\r\n } else if (currentPage >= totalPages - 2) {\r\n // Near end: show last 5 pages\r\n for (let i = totalPages - 4; i <= totalPages; i++) {\r\n pages.push(i);\r\n }\r\n } else {\r\n // Middle: show current page and 2 on each side\r\n for (let i = currentPage - 2; i <= currentPage + 2; i++) {\r\n pages.push(i);\r\n }\r\n }\r\n\r\n return pages;\r\n };\r\n\r\n const pageNumbers = getPageNumbers();\r\n const showEllipsisStart = safeTotalPages > 5 && safeCurrentPage > 3;\r\n const showEllipsisEnd = safeTotalPages > 5 && safeCurrentPage < safeTotalPages - 2;\r\n\r\n return (\r\n <div className=\"flex flex-wrap items-center justify-between gap-4\">\r\n {/* Results info */}\r\n <span className=\"text-sm text-muted-foreground\">\r\n Showing {startItem.toLocaleString()}-{endItem.toLocaleString()} of {safeTotalItems.toLocaleString()} {itemsLabel}\r\n </span>\r\n\r\n <div className=\"flex items-center gap-4\">\r\n {/* Page size selector */}\r\n {showPageSizeSelector && onPerPageChange && (\r\n <div className=\"flex items-center gap-2\">\r\n <select\r\n value={perPage}\r\n onChange={(e) => onPerPageChange(Number(e.target.value))}\r\n className=\"text-sm border border-border rounded-lg px-3 py-1.5 bg-background focus:outline-none focus:ring-2 focus:ring-ring\"\r\n >\r\n {pageSizeOptions.map((size) => (\r\n <option key={size} value={size}>\r\n {size} / page\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n )}\r\n\r\n {/* Pagination controls */}\r\n <div className=\"flex items-center gap-1\">\r\n {/* Previous button */}\r\n <button\r\n className=\"w-8 h-8 flex items-center justify-center rounded-lg text-sm font-medium text-muted-foreground hover:bg-muted hover:text-foreground disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\r\n onClick={() => onPageChange(safeCurrentPage - 1)}\r\n disabled={safeCurrentPage <= 1}\r\n aria-label=\"Previous page\"\r\n >\r\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\r\n </svg>\r\n </button>\r\n\r\n {/* First page + ellipsis if needed */}\r\n {showEllipsisStart && (\r\n <>\r\n <button\r\n className=\"w-8 h-8 rounded-lg text-sm font-medium text-muted-foreground hover:bg-muted transition-colors\"\r\n onClick={() => onPageChange(1)}\r\n >\r\n 1\r\n </button>\r\n <span className=\"text-muted-foreground px-1\">...</span>\r\n </>\r\n )}\r\n\r\n {/* Page number buttons */}\r\n {pageNumbers.map((pageNum, index) => (\r\n <button\r\n key={`${pageNum}-${index}`}\r\n className={cn(\r\n 'w-8 h-8 rounded-lg text-sm font-medium transition-colors',\r\n safeCurrentPage === pageNum\r\n ? 'bg-primary text-primary-foreground'\r\n : 'text-muted-foreground hover:bg-muted'\r\n )}\r\n onClick={() => onPageChange(pageNum as number)}\r\n >\r\n {pageNum}\r\n </button>\r\n ))}\r\n\r\n {/* Ellipsis + last page if needed */}\r\n {showEllipsisEnd && (\r\n <>\r\n <span className=\"text-muted-foreground px-1\">...</span>\r\n <button\r\n className=\"w-8 h-8 rounded-lg text-sm font-medium text-muted-foreground hover:bg-muted transition-colors\"\r\n onClick={() => onPageChange(safeTotalPages)}\r\n >\r\n {safeTotalPages}\r\n </button>\r\n </>\r\n )}\r\n\r\n {/* Next button */}\r\n <button\r\n className=\"w-8 h-8 flex items-center justify-center rounded-lg text-sm font-medium text-muted-foreground hover:bg-muted hover:text-foreground disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\r\n onClick={() => onPageChange(safeCurrentPage + 1)}\r\n disabled={safeCurrentPage >= safeTotalPages}\r\n aria-label=\"Next page\"\r\n >\r\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { cn } from '../lib/utils';\r\n\r\nexport interface SelectOption {\r\n value: string;\r\n label: string;\r\n}\r\n\r\nexport interface SelectProps extends React.SelectHTMLAttributes<HTMLSelectElement> {\r\n options: SelectOption[];\r\n label?: string;\r\n}\r\n\r\n/**\r\n * Select - Dropdown select component\r\n * \r\n * Design specs from Pencil:\r\n * - White background (light mode) / Dark background (dark mode)\r\n * - Border\r\n * - Rounded corners\r\n * - Label support\r\n */\r\nconst Select = React.forwardRef<HTMLSelectElement, SelectProps>(\r\n ({ className, options, label, ...props }, ref) => {\r\n return (\r\n <div className=\"flex items-center gap-2 w-full\">\r\n {label && (\r\n <span className=\"text-sm text-muted-foreground\">{label}</span>\r\n )}\r\n <select\r\n ref={ref}\r\n className={cn(\r\n 'w-full min-w-0 px-3 py-2 text-sm bg-background dark:bg-slate-800',\r\n 'border border-border dark:border-slate-700',\r\n 'rounded-lg text-foreground dark:text-slate-200',\r\n 'focus:outline-none focus:ring-2 focus:ring-primary',\r\n 'cursor-pointer',\r\n className\r\n )}\r\n {...props}\r\n >\r\n {options.map((option) => (\r\n <option key={option.value} value={option.value}>\r\n {option.label}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nSelect.displayName = 'Select';\r\n\r\nexport { Select };\r\n","import * as React from 'react';\nimport { cn } from '../lib/utils';\n\nexport interface LogEntry {\n text: string;\n color?: string;\n type?: 'info' | 'success' | 'error' | 'warning' | 'command';\n}\n\nexport interface ConsoleLogProps extends React.HTMLAttributes<HTMLDivElement> {\n logs: LogEntry[];\n title?: string;\n onClear?: () => void;\n onCopy?: () => void;\n}\n\n/**\n * ConsoleLog - Terminal-style log display component\n * \n * Design specs from Pencil:\n * - Dark background (slate-800/900)\n * - Monospace font\n * - Optional title and action buttons (Clear, Copy)\n * - Color-coded log entries\n */\nconst ConsoleLog = React.forwardRef<HTMLDivElement, ConsoleLogProps>(\n ({ className, logs, title = 'Console Output', onClear, onCopy, ...props }, ref) => {\n const getLogColor = (type?: LogEntry['type'], customColor?: string) => {\n if (customColor) return customColor;\n \n switch (type) {\n case 'command':\n return '#A5B4FC'; // Indigo\n case 'success':\n return '#34D399'; // Emerald\n case 'error':\n return '#F87171'; // Red\n case 'warning':\n return '#FBBF24'; // Amber\n case 'info':\n default:\n return '#9CA3AF'; // Gray\n }\n };\n\n return (\n <div className={cn('space-y-3', className)} {...props}>\n {/* Header */}\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <svg \n className=\"w-5 h-5 text-muted-foreground\" \n fill=\"none\" \n stroke=\"currentColor\" \n viewBox=\"0 0 24 24\"\n >\n <path \n strokeLinecap=\"round\" \n strokeLinejoin=\"round\" \n strokeWidth={2} \n d=\"M8 9l3 3-3 3m5 0h3M5 20h14a2 2 0 002-2V6a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\" \n />\n </svg>\n <span className=\"text-sm font-medium text-foreground\">{title}</span>\n </div>\n <div className=\"flex items-center gap-2\">\n {onClear && (\n <button\n onClick={onClear}\n className=\"px-3 py-1.5 text-xs font-medium text-muted-foreground bg-background dark:bg-slate-800 border border-border dark:border-slate-700 rounded-md hover:bg-muted transition-colors\"\n >\n Clear\n </button>\n )}\n {onCopy && (\n <button\n onClick={onCopy}\n className=\"px-3 py-1.5 text-xs font-medium text-muted-foreground bg-background dark:bg-slate-800 border border-border dark:border-slate-700 rounded-md hover:bg-muted transition-colors\"\n >\n Copy\n </button>\n )}\n </div>\n </div>\n\n {/* Log Content */}\n <div\n ref={ref}\n className=\"bg-slate-800 dark:bg-slate-900 rounded-lg p-4 font-mono text-sm overflow-x-auto\"\n >\n <div className=\"space-y-1\">\n {logs.map((log, index) => (\n <div\n key={index}\n style={{ color: getLogColor(log.type, log.color) }}\n className=\"whitespace-pre-wrap break-all\"\n >\n {log.text}\n </div>\n ))}\n </div>\n </div>\n </div>\n );\n }\n);\n\nConsoleLog.displayName = 'ConsoleLog';\n\nexport { ConsoleLog };\n","import * as React from 'react';\r\nimport { Button } from './button';\r\nimport { Input } from './input';\r\nimport { Label } from './label';\r\nimport { Select } from './select';\r\nimport { PasswordInput } from './password-input';\r\nimport {\r\n DialogContent,\r\n DialogHeader,\r\n DialogTitle,\r\n DialogDescription,\r\n DialogFooter,\r\n} from './dialog';\r\nimport { generatePassword } from '../lib/passwordGenerator';\r\nimport { Shuffle } from 'lucide-react';\r\n\r\nexport interface UserFormData {\r\n name: string;\r\n email: string;\r\n role: string;\r\n status: 'Active' | 'Inactive';\r\n password?: string;\r\n passwordConfirm?: string;\r\n}\r\n\r\nexport interface UserFormDialogProps {\r\n isOpen: boolean;\r\n onClose: () => void;\r\n onSubmit: (data: UserFormData) => Promise<void>;\r\n user?: {\r\n id: string;\r\n name: string;\r\n email: string;\r\n roleId?: string;\r\n status?: 'Active' | 'Inactive';\r\n } | null;\r\n roles: Array<{ id: string; name: string }>;\r\n loading?: boolean;\r\n existingEmails?: string[];\r\n}\r\n\r\nexport function UserFormDialog({\r\n isOpen,\r\n onClose,\r\n onSubmit,\r\n user,\r\n roles,\r\n loading = false,\r\n existingEmails = [],\r\n}: UserFormDialogProps) {\r\n const isEditMode = !!user;\r\n\r\n const [formData, setFormData] = React.useState<UserFormData>({\r\n name: '',\r\n email: '',\r\n role: '',\r\n status: 'Active',\r\n password: '',\r\n passwordConfirm: '',\r\n });\r\n\r\n const [originalData, setOriginalData] = React.useState<UserFormData | null>(null);\r\n const [fieldErrors, setFieldErrors] = React.useState<Partial<Record<keyof UserFormData, string>>>({});\r\n const [formError, setFormError] = React.useState('');\r\n const [emailChecking, setEmailChecking] = React.useState(false);\r\n\r\n // Pre-populate form when editing\r\n React.useEffect(() => {\r\n if (user) {\r\n const initialData: UserFormData = {\r\n name: user.name || '',\r\n email: user.email || '',\r\n role: user.roleId || '',\r\n status: (user.status as 'Active' | 'Inactive') || 'Active',\r\n };\r\n setFormData(initialData);\r\n setOriginalData(initialData);\r\n } else {\r\n const initialData: UserFormData = {\r\n name: '',\r\n email: '',\r\n role: '',\r\n status: 'Active',\r\n password: '',\r\n passwordConfirm: '',\r\n };\r\n setFormData(initialData);\r\n setOriginalData(null);\r\n }\r\n setFieldErrors({});\r\n setFormError('');\r\n setEmailChecking(false);\r\n }, [user, isOpen]);\r\n\r\n // Check if form has changes from original (for edit mode)\r\n const hasChanges = React.useMemo(() => {\r\n if (!isEditMode || !originalData) return true;\r\n return (\r\n formData.name !== originalData.name ||\r\n formData.email !== originalData.email ||\r\n formData.role !== originalData.role ||\r\n formData.status !== originalData.status\r\n );\r\n }, [formData, originalData, isEditMode]);\r\n\r\n // Check if email already exists (for create mode)\r\n const isEmailUnique = React.useMemo(() => {\r\n if (isEditMode) return true; // Skip check for edit mode\r\n if (!formData.email) return true;\r\n return !existingEmails.includes(formData.email.toLowerCase());\r\n }, [formData.email, existingEmails, isEditMode]);\r\n\r\n const validateForm = (): boolean => {\r\n const errors: Partial<Record<keyof UserFormData, string>> = {};\r\n\r\n if (!formData.name || formData.name.length < 2) {\r\n errors.name = 'Name is required and must be at least 2 characters';\r\n }\r\n\r\n if (!formData.email) {\r\n errors.email = 'Email is required';\r\n } else if (!formData.email.includes('@') || !formData.email.includes('.')) {\r\n errors.email = 'Please enter a valid email address';\r\n } else if (!isEmailUnique) {\r\n errors.email = 'This email is already registered';\r\n }\r\n\r\n if (!formData.role) {\r\n errors.role = 'Role is required';\r\n }\r\n\r\n // Password required only when creating\r\n if (!isEditMode) {\r\n if (!formData.password || formData.password.trim().length < 8) {\r\n errors.password = 'Password is required and must be at least 8 characters';\r\n }\r\n if (formData.password !== formData.passwordConfirm) {\r\n errors.passwordConfirm = 'Passwords do not match';\r\n }\r\n }\r\n\r\n setFieldErrors(errors);\r\n return Object.keys(errors).length === 0;\r\n };\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setFormError('');\r\n\r\n if (!validateForm()) {\r\n return;\r\n }\r\n\r\n try {\r\n await onSubmit(formData);\r\n onClose();\r\n } catch (err: any) {\r\n setFormError(err.message || 'Failed to save user. Please try again.');\r\n }\r\n };\r\n\r\n if (!isOpen) return null;\r\n\r\n const roleOptions = [\r\n { value: '', label: 'Select a role' },\r\n ...roles.map((r) => ({ value: r.id, label: r.name })),\r\n ];\r\n\r\n const statusOptions = [\r\n { value: 'Active', label: 'Active' },\r\n { value: 'Inactive', label: 'Inactive' },\r\n ];\r\n\r\n return (\r\n <DialogContent isOpen={isOpen} onClose={onClose}>\r\n <DialogHeader>\r\n <DialogTitle>{isEditMode ? 'Edit User' : 'Add User'}</DialogTitle>\r\n <DialogDescription>\r\n {isEditMode\r\n ? 'Update user details and permissions.'\r\n : 'Create a new user account with a role.'}\r\n </DialogDescription>\r\n </DialogHeader>\r\n\r\n <form onSubmit={handleSubmit} className=\"space-y-4\">\r\n {formError && (\r\n <div className=\"p-3 rounded-lg bg-destructive/10 border border-destructive/30\">\r\n <p className=\"text-sm text-destructive font-medium\">{formError}</p>\r\n </div>\r\n )}\r\n\r\n <div className=\"space-y-2\">\r\n <Label htmlFor=\"name\">Name</Label>\r\n <Input\r\n id=\"name\"\r\n value={formData.name}\r\n onChange={(e) => {\r\n setFormData((prev) => ({ ...prev, name: e.target.value }));\r\n if (fieldErrors.name) {\r\n setFieldErrors((prev) => ({ ...prev, name: undefined }));\r\n }\r\n }}\r\n placeholder=\"Enter full name\"\r\n disabled={loading}\r\n className={fieldErrors.name ? 'border-destructive' : ''}\r\n />\r\n {fieldErrors.name && (\r\n <p className=\"text-sm text-destructive\">{fieldErrors.name}</p>\r\n )}\r\n </div>\r\n\r\n <div className=\"space-y-2\">\r\n <Label htmlFor=\"email\">Email</Label>\r\n <Input\r\n id=\"email\"\r\n type=\"email\"\r\n value={formData.email}\r\n onChange={(e) => {\r\n setFormData((prev) => ({ ...prev, email: e.target.value }));\r\n if (fieldErrors.email) {\r\n setFieldErrors((prev) => ({ ...prev, email: undefined }));\r\n }\r\n }}\r\n placeholder=\"you@example.com\"\r\n disabled={loading}\r\n className={fieldErrors.email ? 'border-destructive' : ''}\r\n />\r\n {fieldErrors.email && (\r\n <p className=\"text-sm text-destructive\">{fieldErrors.email}</p>\r\n )}\r\n </div>\r\n\r\n {!isEditMode && (\r\n <>\r\n <div className=\"space-y-2\">\r\n <div className=\"flex items-center justify-between gap-2\">\r\n <Label htmlFor=\"password\">Password</Label>\r\n <Button\r\n type=\"button\"\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n onClick={() => {\r\n const generated = generatePassword({ length: 16, numbers: true, symbols: true, uppercase: true, lowercase: true });\r\n setFormData((prev) => ({ ...prev, password: generated, passwordConfirm: generated }));\r\n setFieldErrors((prev) => ({ ...prev, password: undefined, passwordConfirm: undefined }));\r\n }}\r\n className=\"gap-1.5 text-muted-foreground hover:text-foreground\"\r\n >\r\n <Shuffle className=\"h-4 w-4\" />\r\n Generate\r\n </Button>\r\n </div>\r\n <PasswordInput\r\n id=\"password\"\r\n value={formData.password || ''}\r\n onChange={(e) => {\r\n setFormData((prev) => ({ ...prev, password: e.target.value }));\r\n if (fieldErrors.password) {\r\n setFieldErrors((prev) => ({ ...prev, password: undefined }));\r\n }\r\n }}\r\n placeholder=\"Enter password (min 8 characters)\"\r\n disabled={loading}\r\n className={fieldErrors.password ? 'border-destructive' : ''}\r\n />\r\n {fieldErrors.password && (\r\n <p className=\"text-sm text-destructive\">{fieldErrors.password}</p>\r\n )}\r\n </div>\r\n\r\n <div className=\"space-y-2\">\r\n <Label htmlFor=\"passwordConfirm\">Confirm Password</Label>\r\n <PasswordInput\r\n id=\"passwordConfirm\"\r\n value={formData.passwordConfirm || ''}\r\n onChange={(e) => {\r\n setFormData((prev) => ({ ...prev, passwordConfirm: e.target.value }));\r\n if (fieldErrors.passwordConfirm) {\r\n setFieldErrors((prev) => ({ ...prev, passwordConfirm: undefined }));\r\n }\r\n }}\r\n placeholder=\"Confirm password\"\r\n disabled={loading}\r\n className={fieldErrors.passwordConfirm ? 'border-destructive' : ''}\r\n />\r\n {fieldErrors.passwordConfirm && (\r\n <p className=\"text-sm text-destructive\">{fieldErrors.passwordConfirm}</p>\r\n )}\r\n </div>\r\n </>\r\n )}\r\n\r\n <div className=\"grid grid-cols-2 gap-4 w-full\">\r\n <div className=\"space-y-2 min-w-0\">\r\n <Label htmlFor=\"role\">Role</Label>\r\n <Select\r\n id=\"role\"\r\n value={formData.role}\r\n onChange={(e) => {\r\n setFormData((prev) => ({ ...prev, role: e.target.value }));\r\n if (fieldErrors.role) {\r\n setFieldErrors((prev) => ({ ...prev, role: undefined }));\r\n }\r\n }}\r\n options={roleOptions}\r\n disabled={loading || roleOptions.length <= 1}\r\n className={fieldErrors.role ? 'border-destructive' : ''}\r\n />\r\n {fieldErrors.role && (\r\n <p className=\"text-sm text-destructive\">{fieldErrors.role}</p>\r\n )}\r\n </div>\r\n\r\n <div className=\"space-y-2 min-w-0\">\r\n <Label htmlFor=\"status\">Status</Label>\r\n <Select\r\n id=\"status\"\r\n value={formData.status}\r\n onChange={(e) =>\r\n setFormData((prev) => ({\r\n ...prev,\r\n status: e.target.value as 'Active' | 'Inactive',\r\n }))\r\n }\r\n options={statusOptions}\r\n disabled={loading}\r\n />\r\n </div>\r\n </div>\r\n\r\n <DialogFooter>\r\n <Button type=\"button\" variant=\"secondary\" onClick={onClose} disabled={loading} className=\"min-w-[6.5rem]\">\r\n Cancel\r\n </Button>\r\n <Button type=\"submit\" disabled={loading || (isEditMode && !hasChanges)} className=\"min-w-[6.5rem]\">\r\n {loading ? (\r\n <span className=\"flex items-center gap-2\">\r\n <svg\r\n className=\"animate-spin h-4 w-4\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <circle\r\n className=\"opacity-25\"\r\n cx=\"12\"\r\n cy=\"12\"\r\n r=\"10\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"4\"\r\n />\r\n <path\r\n className=\"opacity-75\"\r\n fill=\"currentColor\"\r\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\r\n />\r\n </svg>\r\n {isEditMode ? 'Saving...' : 'Creating...'}\r\n </span>\r\n ) : isEditMode ? (\r\n 'Save Changes'\r\n ) : (\r\n 'Create User'\r\n )}\r\n </Button>\r\n </DialogFooter>\r\n </form>\r\n </DialogContent>\r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { cn } from '../lib/utils';\r\n\r\nexport interface DialogProps {\r\n isOpen: boolean;\r\n onClose: () => void;\r\n title?: string;\r\n description?: string;\r\n children?: React.ReactNode;\r\n /** Optional className for the dialog container (e.g. max-w-2xl for wider modals) */\r\n className?: string;\r\n}\r\n\r\nexport interface DialogTriggerProps {\r\n children: React.ReactNode;\r\n onClick: () => void;\r\n}\r\n\r\nconst DialogContext = React.createContext<{\r\n isOpen: boolean;\r\n onClose: () => void;\r\n} | null>(null);\r\n\r\nconst Dialog: React.FC<{ children: React.ReactNode }> = ({ children }) => {\r\n const [isOpen, setIsOpen] = React.useState(false);\r\n\r\n const onClose = React.useCallback(() => {\r\n setIsOpen(false);\r\n }, []);\r\n\r\n const onOpen = React.useCallback(() => {\r\n setIsOpen(true);\r\n }, []);\r\n\r\n return (\r\n <DialogContext.Provider value={{ isOpen, onClose }}>\r\n {React.Children.map(children, (child) => {\r\n if (React.isValidElement(child) && child.type === DialogTrigger) {\r\n return React.cloneElement(child as React.ReactElement<DialogTriggerProps>, {\r\n onClick: onOpen,\r\n });\r\n }\r\n return child;\r\n })}\r\n </DialogContext.Provider>\r\n );\r\n};\r\n\r\nconst DialogTrigger: React.FC<DialogTriggerProps> = ({ children, onClick }) => {\r\n return (\r\n <button onClick={onClick} className=\"contents\">\r\n {children}\r\n </button>\r\n );\r\n};\r\n\r\nconst DialogContent: React.FC<DialogProps> = ({ isOpen, onClose, title, description, children, className }) => {\r\n const context = React.useContext(DialogContext);\r\n const open = context ? context.isOpen : isOpen;\r\n const close = context ? context.onClose : onClose;\r\n\r\n React.useEffect(() => {\r\n const handleEscape = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape') {\r\n close();\r\n }\r\n };\r\n\r\n if (open) {\r\n document.addEventListener('keydown', handleEscape);\r\n document.body.style.overflow = 'hidden';\r\n }\r\n\r\n return () => {\r\n document.removeEventListener('keydown', handleEscape);\r\n document.body.style.overflow = 'unset';\r\n };\r\n }, [open, close]);\r\n\r\n if (!open) return null;\r\n\r\n return (\r\n <div \r\n className=\"dialog-overlay flex items-center justify-center\"\r\n >\r\n {/* Backdrop */}\r\n <div\r\n className=\"absolute inset-0 bg-black/50 backdrop-blur-sm transition-opacity\"\r\n style={{ \r\n position: 'absolute', \r\n top: 0, \r\n left: 0, \r\n right: 0, \r\n bottom: 0,\r\n width: '100%',\r\n height: '100%',\r\n margin: 0,\r\n padding: 0\r\n }}\r\n onClick={close}\r\n />\r\n\r\n {/* Dialog */}\r\n <div\r\n className={cn(\r\n 'relative z-10 w-full max-w-md mx-4 bg-background rounded-xl shadow-2xl border border-border animate-in fade-in zoom-in-95 duration-200 max-h-[90vh] flex flex-col',\r\n className\r\n )}\r\n style={{ maxHeight: '90vh' }}\r\n >\r\n {/* Close button */}\r\n <button\r\n onClick={close}\r\n className=\"absolute top-4 right-4 w-8 h-8 rounded-lg flex items-center justify-center text-muted-foreground hover:text-foreground hover:bg-muted transition-colors z-10\"\r\n aria-label=\"Close dialog\"\r\n >\r\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\r\n </svg>\r\n </button>\r\n\r\n {/* Content - scrollable when content overflows */}\r\n <div className=\"p-6 flex flex-col flex-1 min-h-0 overflow-y-auto\">\r\n {title && (\r\n <h2 className=\"text-lg font-semibold text-foreground mb-2\">\r\n {title}\r\n </h2>\r\n )}\r\n {description && (\r\n <p className=\"text-sm text-muted-foreground mb-4\">\r\n {description}\r\n </p>\r\n )}\r\n {children}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nconst DialogHeader: React.FC<{ children: React.ReactNode; className?: string }> = ({\r\n children,\r\n className,\r\n}) => {\r\n return <div className={cn('mb-4', className)}>{children}</div>;\r\n};\r\n\r\nconst DialogFooter: React.FC<{ children: React.ReactNode; className?: string }> = ({\r\n children,\r\n className,\r\n}) => {\r\n return (\r\n <div\r\n className={cn(\r\n 'mt-6 pt-4 flex flex-col-reverse sm:flex-row justify-end gap-3 border-t border-border',\r\n className\r\n )}\r\n >\r\n {children}\r\n </div>\r\n );\r\n};\r\n\r\nconst DialogTitle: React.FC<{ children: React.ReactNode; className?: string }> = ({\r\n children,\r\n className,\r\n}) => {\r\n return <h2 className={cn('text-lg font-semibold text-foreground', className)}>{children}</h2>;\r\n};\r\n\r\nconst DialogDescription: React.FC<{ children: React.ReactNode; className?: string }> = ({\r\n children,\r\n className,\r\n}) => {\r\n return <p className={cn('text-sm text-muted-foreground mt-1', className)}>{children}</p>;\r\n};\r\n\r\nexport {\r\n Dialog,\r\n DialogTrigger,\r\n DialogContent,\r\n DialogHeader,\r\n DialogFooter,\r\n DialogTitle,\r\n DialogDescription,\r\n};","/**\r\n * Generates a random password using crypto.getRandomValues.\r\n * Works in both browser and Node.js environments.\r\n */\r\nexport interface PasswordGeneratorOptions {\r\n length?: number;\r\n numbers?: boolean;\r\n symbols?: boolean;\r\n uppercase?: boolean;\r\n lowercase?: boolean;\r\n}\r\n\r\nconst LOWERCASE = 'abcdefghijklmnopqrstuvwxyz';\r\nconst UPPERCASE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\r\nconst NUMBERS = '0123456789';\r\nconst SYMBOLS = '!@#$%^&*()_+-=[]{}|;:,.<>?';\r\n\r\nexport function generatePassword(options: PasswordGeneratorOptions = {}): string {\r\n const {\r\n length = 16,\r\n numbers = true,\r\n symbols = true,\r\n uppercase = true,\r\n lowercase = true,\r\n } = options;\r\n\r\n let chars = '';\r\n if (lowercase) chars += LOWERCASE;\r\n if (uppercase) chars += UPPERCASE;\r\n if (numbers) chars += NUMBERS;\r\n if (symbols) chars += SYMBOLS;\r\n if (!chars) chars = LOWERCASE;\r\n\r\n const arr = new Uint8Array(length);\r\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\r\n crypto.getRandomValues(arr);\r\n } else {\r\n // Fallback for environments without crypto (should not happen in modern browsers/Node)\r\n for (let i = 0; i < length; i++) {\r\n arr[i] = Math.floor(Math.random() * 256);\r\n }\r\n }\r\n\r\n return Array.from(arr, (x) => chars[x % chars.length]).join('');\r\n}\r\n","import * as React from 'react';\r\nimport { Button } from './button';\r\nimport { Input } from './input';\r\nimport { Label } from './label';\r\nimport { cn } from '../lib/utils';\r\nimport {\r\n DialogContent,\r\n DialogHeader,\r\n DialogTitle,\r\n DialogDescription,\r\n DialogFooter,\r\n} from './dialog';\r\n\r\nexport interface Permission {\r\n id: string;\r\n name: string;\r\n collection: string;\r\n action: string;\r\n description?: string;\r\n}\r\n\r\nexport interface RoleFormData {\r\n name: string;\r\n description: string;\r\n permissions: string[];\r\n}\r\n\r\nexport interface RoleFormDialogProps {\r\n isOpen: boolean;\r\n onClose: () => void;\r\n onSubmit: (data: RoleFormData) => Promise<void>;\r\n role?: {\r\n id: string;\r\n name: string;\r\n description?: string;\r\n permissions?: string[];\r\n } | null;\r\n permissions: Permission[];\r\n loading?: boolean;\r\n /** Loading state for permissions list (e.g. when fetching for role form) */\r\n permissionsLoading?: boolean;\r\n /** Permission names that are mandatory for every role. Auto-selected and cannot be unchecked. */\r\n mandatoryPermissionNames?: readonly string[];\r\n}\r\n\r\nexport function RoleFormDialog({\r\n isOpen,\r\n onClose,\r\n onSubmit,\r\n role,\r\n permissions,\r\n loading = false,\r\n permissionsLoading = false,\r\n mandatoryPermissionNames = [],\r\n}: RoleFormDialogProps) {\r\n const isEditMode = !!role;\r\n\r\n const [formData, setFormData] = React.useState<RoleFormData>({\r\n name: '',\r\n description: '',\r\n permissions: [],\r\n });\r\n\r\n const [fieldErrors, setFieldErrors] = React.useState<Partial<Record<keyof RoleFormData, string>>>({});\r\n const [formError, setFormError] = React.useState('');\r\n const [permissionSearch, setPermissionSearch] = React.useState('');\r\n const selectAllCheckboxRef = React.useRef<HTMLInputElement | null>(null);\r\n\r\n const mandatorySet = React.useMemo(\r\n () => new Set(mandatoryPermissionNames),\r\n [mandatoryPermissionNames]\r\n );\r\n const mandatoryPermissionIds = React.useMemo(\r\n () => permissions.filter((p) => mandatorySet.has(p.name)).map((p) => p.id),\r\n [permissions, mandatorySet]\r\n );\r\n\r\n // Filter permissions based on search (name, collection, action, description)\r\n const filteredPermissions = React.useMemo(() => {\r\n if (!permissionSearch.trim()) return permissions;\r\n const search = permissionSearch.toLowerCase().trim();\r\n return permissions.filter(\r\n (p) =>\r\n p.name.toLowerCase().includes(search) ||\r\n p.collection.toLowerCase().includes(search) ||\r\n p.action.toLowerCase().includes(search) ||\r\n (p.description && p.description.toLowerCase().includes(search))\r\n );\r\n }, [permissions, permissionSearch]);\r\n\r\n // Keep select-all checkbox indeterminate state in sync\r\n React.useEffect(() => {\r\n const el = selectAllCheckboxRef.current;\r\n if (!el) return;\r\n const some = filteredPermissions.some((p) => formData.permissions.includes(p.id));\r\n const all =\r\n filteredPermissions.length > 0 &&\r\n filteredPermissions.every((p) => formData.permissions.includes(p.id));\r\n el.indeterminate = some && !all;\r\n }, [formData.permissions, filteredPermissions]);\r\n\r\n // Pre-populate form when editing; always include mandatory permissions\r\n React.useEffect(() => {\r\n const baseIds = Array.isArray(role?.permissions) ? role.permissions : [];\r\n const withMandatory = [...new Set([...mandatoryPermissionIds, ...baseIds])];\r\n\r\n if (role) {\r\n setFormData({\r\n name: role.name || '',\r\n description: role.description || '',\r\n permissions: withMandatory,\r\n });\r\n } else {\r\n setFormData({\r\n name: '',\r\n description: '',\r\n permissions: [...mandatoryPermissionIds],\r\n });\r\n }\r\n setFieldErrors({});\r\n setFormError('');\r\n setPermissionSearch('');\r\n }, [role, isOpen, mandatoryPermissionIds]);\r\n\r\n const validateForm = (): boolean => {\r\n const errors: Partial<Record<keyof RoleFormData, string>> = {};\r\n\r\n if (!formData.name || formData.name.length < 2) {\r\n errors.name = 'Name is required and must be at least 2 characters';\r\n }\r\n\r\n setFieldErrors(errors);\r\n return Object.keys(errors).length === 0;\r\n };\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setFormError('');\r\n\r\n if (!validateForm()) {\r\n return;\r\n }\r\n\r\n try {\r\n await onSubmit(formData);\r\n onClose();\r\n } catch (err: any) {\r\n setFormError(err.message || 'Failed to save role. Please try again.');\r\n }\r\n };\r\n\r\n const togglePermission = (permissionId: string, selected?: boolean) => {\r\n if (mandatoryPermissionIds.includes(permissionId) && selected === false) {\r\n return; // Cannot uncheck mandatory permissions\r\n }\r\n setFormData((prev) => {\r\n const isCurrentlySelected = prev.permissions.includes(permissionId);\r\n const newSelected = selected ?? !isCurrentlySelected;\r\n const newPermissions = newSelected\r\n ? [...prev.permissions, permissionId]\r\n : prev.permissions.filter((id) => id !== permissionId);\r\n return { ...prev, permissions: newPermissions };\r\n });\r\n };\r\n\r\n const selectAllFiltered = (selected: boolean) => {\r\n const ids = filteredPermissions.map((p) => p.id);\r\n setFormData((prev) => {\r\n if (selected) {\r\n return { ...prev, permissions: [...new Set([...prev.permissions, ...ids])] };\r\n }\r\n return {\r\n ...prev,\r\n permissions: prev.permissions.filter(\r\n (id) => mandatoryPermissionIds.includes(id) || !ids.includes(id)\r\n ),\r\n };\r\n });\r\n };\r\n\r\n if (!isOpen) return null;\r\n\r\n const selectedCount = formData.permissions.length;\r\n\r\n return (\r\n <DialogContent isOpen={isOpen} onClose={onClose} className=\"max-w-2xl\">\r\n <DialogHeader className=\"flex-shrink-0\">\r\n <DialogTitle>{isEditMode ? 'Edit Role' : 'Add Role'}</DialogTitle>\r\n <DialogDescription>\r\n {isEditMode\r\n ? 'Update role details and permissions.'\r\n : 'Create a new role with specific permissions.'}\r\n </DialogDescription>\r\n </DialogHeader>\r\n\r\n <form onSubmit={handleSubmit} className=\"flex flex-col flex-1 min-h-0 overflow-hidden\">\r\n <div className=\"flex flex-col flex-1 min-h-0 overflow-hidden space-y-4\">\r\n {formError && (\r\n <div className=\"p-3 rounded-lg bg-destructive/10 border border-destructive/30\">\r\n <p className=\"text-sm text-destructive font-medium\">{formError}</p>\r\n </div>\r\n )}\r\n\r\n <div className=\"space-y-2\">\r\n <Label htmlFor=\"role-name\">Name *</Label>\r\n <Input\r\n id=\"role-name\"\r\n value={formData.name}\r\n onChange={(e) => {\r\n setFormData((prev) => ({ ...prev, name: e.target.value }));\r\n if (fieldErrors.name) {\r\n setFieldErrors((prev) => ({ ...prev, name: undefined }));\r\n }\r\n }}\r\n placeholder=\"Enter role name\"\r\n disabled={loading}\r\n className={fieldErrors.name ? 'border-destructive' : ''}\r\n />\r\n {fieldErrors.name && (\r\n <p className=\"text-sm text-destructive\">{fieldErrors.name}</p>\r\n )}\r\n </div>\r\n\r\n <div className=\"space-y-2\">\r\n <Label htmlFor=\"role-description\">Description</Label>\r\n <Input\r\n id=\"role-description\"\r\n value={formData.description}\r\n onChange={(e) =>\r\n setFormData((prev) => ({ ...prev, description: e.target.value }))\r\n }\r\n placeholder=\"Enter role description\"\r\n disabled={loading}\r\n />\r\n </div>\r\n\r\n <div className=\"space-y-3 flex flex-col flex-1 min-h-0\">\r\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3 shrink-0\">\r\n <Label className=\"shrink-0\">Permissions ({selectedCount} selected)</Label>\r\n <Input\r\n type=\"text\"\r\n placeholder=\"Search permissions...\"\r\n value={permissionSearch}\r\n onChange={(e) => setPermissionSearch(e.target.value)}\r\n className=\"w-full sm:w-56 text-sm\"\r\n disabled={loading || permissionsLoading}\r\n />\r\n </div>\r\n\r\n {permissionsLoading ? (\r\n <div className=\"py-8 flex items-center justify-center text-muted-foreground\">\r\n <span className=\"flex items-center gap-2\">\r\n <svg\r\n className=\"animate-spin h-4 w-4\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <circle\r\n className=\"opacity-25\"\r\n cx=\"12\"\r\n cy=\"12\"\r\n r=\"10\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"4\"\r\n />\r\n <path\r\n className=\"opacity-75\"\r\n fill=\"currentColor\"\r\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\r\n />\r\n </svg>\r\n Loading permissions...\r\n </span>\r\n </div>\r\n ) : permissions.length === 0 ? (\r\n <p className=\"text-sm text-muted-foreground italic py-4\">\r\n No permissions available. Create permissions first.\r\n </p>\r\n ) : filteredPermissions.length === 0 ? (\r\n <p className=\"text-sm text-muted-foreground italic py-4\">\r\n No permissions match your search. Try a different term.\r\n </p>\r\n ) : (\r\n <div className=\"border rounded-xl overflow-hidden bg-muted/20 flex-1 min-h-[180px] overflow-y-auto\">\r\n <div className=\"overflow-x-auto\">\r\n <table className=\"w-full\">\r\n <thead>\r\n <tr className=\"bg-muted/50 dark:bg-slate-800/80 sticky top-0 z-10\">\r\n <th className=\"w-12 px-4 py-3 text-left\">\r\n <input\r\n type=\"checkbox\"\r\n checked={\r\n filteredPermissions.length > 0 &&\r\n filteredPermissions.every((p) => formData.permissions.includes(p.id))\r\n }\r\n ref={selectAllCheckboxRef}\r\n onChange={(e) => selectAllFiltered(e.target.checked)}\r\n className=\"w-4 h-4 rounded border-border text-primary focus:ring-primary cursor-pointer\"\r\n />\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-muted-foreground uppercase tracking-wider\">\r\n Action\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-muted-foreground uppercase tracking-wider\">\r\n Collection\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-muted-foreground uppercase tracking-wider\">\r\n Description\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-border/60 dark:divide-slate-700/60\">\r\n {filteredPermissions.map((p) => {\r\n const isSelected = formData.permissions.includes(p.id);\r\n const isMandatory = mandatoryPermissionIds.includes(p.id);\r\n return (\r\n <tr\r\n key={p.id}\r\n role=\"button\"\r\n tabIndex={0}\r\n onClick={() => !isMandatory && togglePermission(p.id)}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault();\r\n if (!isMandatory) togglePermission(p.id);\r\n }\r\n }}\r\n className={cn(\r\n 'transition-all select-none',\r\n isMandatory ? 'cursor-default' : 'cursor-pointer',\r\n 'hover:bg-muted/40 dark:hover:bg-slate-700/30',\r\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/50 focus-visible:ring-inset',\r\n isSelected && 'bg-primary/10 dark:bg-primary/15'\r\n )}\r\n >\r\n <td className=\"w-12 px-4 py-3 align-middle\" onClick={(e) => e.stopPropagation()}>\r\n <input\r\n type=\"checkbox\"\r\n checked={isSelected}\r\n disabled={isMandatory}\r\n onChange={(e) => togglePermission(p.id, e.target.checked)}\r\n className={cn(\r\n 'w-4 h-4 rounded border-border text-primary focus:ring-primary',\r\n isMandatory ? 'cursor-not-allowed opacity-80' : 'cursor-pointer'\r\n )}\r\n title={isMandatory ? 'Required for all roles (audit logging and login recording)' : undefined}\r\n />\r\n </td>\r\n <td className=\"px-4 py-3 align-middle\">\r\n <span\r\n className={cn(\r\n 'inline-flex items-center rounded-full px-3 py-1.5 text-xs font-medium',\r\n 'bg-muted/80 dark:bg-slate-700/80 text-foreground border border-border/60',\r\n 'transition-colors',\r\n isSelected &&\r\n 'border-primary/40 bg-primary/10 text-primary dark:bg-primary/20 dark:text-primary'\r\n )}\r\n >\r\n {p.action}\r\n </span>\r\n </td>\r\n <td className=\"px-4 py-3 align-middle\">\r\n <span\r\n className={cn(\r\n 'inline-flex items-center rounded-full px-3 py-1.5 text-xs font-medium',\r\n 'bg-muted/80 dark:bg-slate-700/80 text-foreground border border-border/60',\r\n 'transition-colors',\r\n isSelected &&\r\n 'border-primary/40 bg-primary/10 text-primary dark:bg-primary/20 dark:text-primary'\r\n )}\r\n >\r\n {p.collection}\r\n </span>\r\n </td>\r\n <td className=\"px-4 py-3 align-middle\">\r\n <span className=\"text-xs text-muted-foreground line-clamp-2 max-w-[240px]\">\r\n {p.description || '—'}\r\n </span>\r\n </td>\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n <DialogFooter className=\"flex-shrink-0\">\r\n <Button type=\"button\" variant=\"secondary\" onClick={onClose} disabled={loading} className=\"min-w-[6.5rem]\">\r\n Cancel\r\n </Button>\r\n <Button type=\"submit\" disabled={loading} className=\"min-w-[6.5rem]\">\r\n {loading ? (\r\n <span className=\"flex items-center gap-2\">\r\n <svg\r\n className=\"animate-spin h-4 w-4\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <circle\r\n className=\"opacity-25\"\r\n cx=\"12\"\r\n cy=\"12\"\r\n r=\"10\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"4\"\r\n />\r\n <path\r\n className=\"opacity-75\"\r\n fill=\"currentColor\"\r\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\r\n />\r\n </svg>\r\n {isEditMode ? 'Saving...' : 'Creating...'}\r\n </span>\r\n ) : isEditMode ? (\r\n 'Save Changes'\r\n ) : (\r\n 'Create Role'\r\n )}\r\n </Button>\r\n </DialogFooter>\r\n </form>\r\n </DialogContent>\r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { Button } from './button';\r\nimport { Input } from './input';\r\nimport { cn } from '../lib/utils';\r\nimport {\r\n DialogContent,\r\n DialogHeader,\r\n DialogTitle,\r\n DialogDescription,\r\n DialogFooter,\r\n} from './dialog';\r\nimport { Badge } from './badge';\r\nimport { Tabs, TabsList, TabsTrigger } from './tabs';\r\nimport { Search } from 'lucide-react';\r\n\r\nexport interface UserForAssign {\r\n id: string;\r\n name: string;\r\n email: string;\r\n roleId?: string;\r\n roleName?: string;\r\n is_superuser?: boolean;\r\n}\r\n\r\nexport interface AssignUsersToRoleDialogProps {\r\n isOpen: boolean;\r\n onClose: () => void;\r\n role: { id: string; name: string } | null;\r\n users: UserForAssign[];\r\n onAssign: (userId: string) => Promise<void>;\r\n loading?: boolean;\r\n /** Loading state when fetching users */\r\n usersLoading?: boolean;\r\n}\r\n\r\nexport function AssignUsersToRoleDialog({\r\n isOpen,\r\n onClose,\r\n role,\r\n users,\r\n onAssign,\r\n loading = false,\r\n usersLoading = false,\r\n}: AssignUsersToRoleDialogProps) {\r\n const [activeTab, setActiveTab] = React.useState<'assigned' | 'not_assigned'>('not_assigned');\r\n const [searchQuery, setSearchQuery] = React.useState('');\r\n const [assigningUserId, setAssigningUserId] = React.useState<string | null>(null);\r\n\r\n React.useEffect(() => {\r\n if (!isOpen) {\r\n setSearchQuery('');\r\n setActiveTab('not_assigned');\r\n setAssigningUserId(null);\r\n }\r\n }, [isOpen]);\r\n\r\n const searchLower = searchQuery.trim().toLowerCase();\r\n const usersList = (users ?? []).filter((u) => u.is_superuser !== true);\r\n const filteredUsers = React.useMemo(() => {\r\n if (!searchLower) return usersList;\r\n return usersList.filter(\r\n (u) =>\r\n u.name?.toLowerCase().includes(searchLower) ||\r\n u.email?.toLowerCase().includes(searchLower)\r\n );\r\n }, [usersList, searchLower]);\r\n\r\n const roleId = role?.id ?? '';\r\n const assignedUsers = React.useMemo(\r\n () => filteredUsers.filter((u) => u.roleId === roleId),\r\n [filteredUsers, roleId]\r\n );\r\n const notAssignedUsers = React.useMemo(\r\n () => filteredUsers.filter((u) => u.roleId !== roleId),\r\n [filteredUsers, roleId]\r\n );\r\n\r\n const handleAssign = React.useCallback(\r\n async (userId: string) => {\r\n setAssigningUserId(userId);\r\n try {\r\n await onAssign(userId);\r\n } finally {\r\n setAssigningUserId(null);\r\n }\r\n },\r\n [onAssign]\r\n );\r\n\r\n const getRoleBadge = React.useCallback(\r\n (u: UserForAssign) => {\r\n if (!u.roleId) {\r\n return <Badge variant=\"muted\">Not assigned</Badge>;\r\n }\r\n if (u.roleId === roleId) {\r\n return <Badge variant=\"default\">{u.roleName || role?.name}</Badge>;\r\n }\r\n return <Badge variant=\"outline\">{u.roleName || 'Other'}</Badge>;\r\n },\r\n [roleId, role?.name]\r\n );\r\n\r\n const isDialogOpen = Boolean(role && isOpen);\r\n\r\n return (\r\n <DialogContent isOpen={isDialogOpen} onClose={onClose} className=\"max-w-2xl\">\r\n {role && (\r\n <>\r\n <DialogHeader className=\"flex-shrink-0\">\r\n <DialogTitle>Assign users to {role.name}</DialogTitle>\r\n <DialogDescription>\r\n Assign or reassign users to this role. Users currently in another role will be moved to this role.\r\n </DialogDescription>\r\n </DialogHeader>\r\n\r\n <div className=\"flex flex-col flex-1 min-h-0 space-y-4\">\r\n <div className=\"flex flex-col sm:flex-row gap-3\">\r\n <div className=\"relative flex-1\">\r\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground\" />\r\n <Input\r\n type=\"text\"\r\n placeholder=\"Search users by name or email...\"\r\n value={searchQuery}\r\n onChange={(e) => setSearchQuery(e.target.value)}\r\n className=\"pl-9\"\r\n disabled={usersLoading}\r\n />\r\n </div>\r\n </div>\r\n\r\n <Tabs value={activeTab} onValueChange={(v) => setActiveTab(v as 'assigned' | 'not_assigned')}>\r\n <TabsList>\r\n <TabsTrigger value=\"assigned\" badge={assignedUsers.length}>\r\n Assigned\r\n </TabsTrigger>\r\n <TabsTrigger value=\"not_assigned\" badge={notAssignedUsers.length}>\r\n Not assigned\r\n </TabsTrigger>\r\n </TabsList>\r\n\r\n <div className=\"mt-4 border rounded-xl overflow-hidden bg-muted/20 min-h-[200px] max-h-[320px] overflow-y-auto\">\r\n {usersLoading ? (\r\n <div className=\"py-12 flex items-center justify-center text-muted-foreground\">\r\n <span className=\"flex items-center gap-2\">\r\n <svg\r\n className=\"animate-spin h-4 w-4\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" />\r\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\" />\r\n </svg>\r\n Loading users...\r\n </span>\r\n </div>\r\n ) : activeTab === 'assigned' ? (\r\n assignedUsers.length === 0 ? (\r\n <div className=\"py-12 text-center text-sm text-muted-foreground\">\r\n No users assigned to this role.{' '}\r\n {searchQuery ? 'Try a different search.' : 'Switch to \"Not assigned\" to assign users.'}\r\n </div>\r\n ) : (\r\n <table className=\"w-full\">\r\n <thead>\r\n <tr className=\"bg-muted/50 dark:bg-slate-800/80 sticky top-0\">\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-muted-foreground uppercase\">User</th>\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-muted-foreground uppercase\">Current role</th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-border/60\">\r\n {assignedUsers.map((u) => (\r\n <tr key={u.id} className=\"hover:bg-muted/30\">\r\n <td className=\"px-4 py-3\">\r\n <div>\r\n <p className=\"font-medium text-sm\">{u.name || '—'}</p>\r\n <p className=\"text-xs text-muted-foreground\">{u.email || '—'}</p>\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3\">{getRoleBadge(u)}</td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n )\r\n ) : (\r\n notAssignedUsers.length === 0 ? (\r\n <div className=\"py-12 text-center text-sm text-muted-foreground\">\r\n No users to assign.{' '}\r\n {searchQuery ? 'Try a different search.' : 'All users are already assigned to this role.'}\r\n </div>\r\n ) : (\r\n <table className=\"w-full\">\r\n <thead>\r\n <tr className=\"bg-muted/50 dark:bg-slate-800/80 sticky top-0\">\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-muted-foreground uppercase\">User</th>\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-muted-foreground uppercase\">Current role</th>\r\n <th className=\"px-4 py-3 text-right text-xs font-medium text-muted-foreground uppercase w-24\">Action</th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-border/60\">\r\n {notAssignedUsers.map((u) => (\r\n <tr key={u.id} className=\"hover:bg-muted/30\">\r\n <td className=\"px-4 py-3\">\r\n <div>\r\n <p className=\"font-medium text-sm\">{u.name || '—'}</p>\r\n <p className=\"text-xs text-muted-foreground\">{u.email || '—'}</p>\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3\">{getRoleBadge(u)}</td>\r\n <td className=\"px-4 py-3 text-right\">\r\n <Button\r\n size=\"sm\"\r\n onClick={() => handleAssign(u.id)}\r\n disabled={loading || assigningUserId === u.id}\r\n title={u.roleId ? `Reassign from ${u.roleName || 'current role'} to ${role.name}` : `Assign to ${role.name}`}\r\n >\r\n {assigningUserId === u.id ? (\r\n <span className=\"flex items-center gap-1\">\r\n <svg className=\"animate-spin h-3.5 w-3.5\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" />\r\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\" />\r\n </svg>\r\n Assigning...\r\n </span>\r\n ) : (\r\n u.roleId ? 'Reassign' : 'Assign'\r\n )}\r\n </Button>\r\n </td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n )\r\n )}\r\n </div>\r\n </Tabs>\r\n </div>\r\n\r\n <DialogFooter className=\"flex-shrink-0\">\r\n <Button type=\"button\" variant=\"secondary\" onClick={onClose} disabled={loading} className=\"min-w-[6.5rem]\">\r\n Close\r\n </Button>\r\n </DialogFooter>\r\n </>\r\n )}\r\n </DialogContent>\r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { Button } from './button';\r\nimport { Input } from './input';\r\nimport { Label } from './label';\r\nimport {\r\n DialogContent,\r\n DialogHeader,\r\n DialogTitle,\r\n DialogDescription,\r\n DialogFooter,\r\n} from './dialog';\r\n\r\nexport interface PermissionFormData {\r\n name: string;\r\n collection: string;\r\n action: string;\r\n description: string;\r\n resourceType: 'collection' | 'field' | 'custom';\r\n resourceName: string;\r\n}\r\n\r\nexport interface PermissionFormDialogProps {\r\n isOpen: boolean;\r\n onClose: () => void;\r\n onSubmit: (data: PermissionFormData) => Promise<void>;\r\n permission?: {\r\n id: string;\r\n name: string;\r\n collection: string;\r\n action: string;\r\n description?: string;\r\n resourceType: 'collection' | 'field' | 'custom';\r\n resourceName?: string;\r\n } | null;\r\n loading?: boolean;\r\n /** Existing collection names for autocomplete suggestions */\r\n existingCollections?: string[];\r\n}\r\n\r\nexport function PermissionFormDialog({\r\n isOpen,\r\n onClose,\r\n onSubmit,\r\n permission,\r\n loading = false,\r\n existingCollections = [],\r\n}: PermissionFormDialogProps) {\r\n const isEditMode = !!permission;\r\n\r\n const [formData, setFormData] = React.useState<PermissionFormData>({\r\n name: '',\r\n collection: '',\r\n action: '',\r\n description: '',\r\n resourceType: 'collection',\r\n resourceName: '',\r\n });\r\n\r\n const [fieldErrors, setFieldErrors] = React.useState<Partial<Record<keyof PermissionFormData, string>>>({});\r\n const [formError, setFormError] = React.useState('');\r\n const [collectionPopoverOpen, setCollectionPopoverOpen] = React.useState(false);\r\n const collectionInputRef = React.useRef<HTMLInputElement>(null);\r\n const collectionPopoverRef = React.useRef<HTMLDivElement>(null);\r\n\r\n // Derive name from action:collection (lowercase, trimmed)\r\n const derivedName = React.useMemo(() => {\r\n const action = formData.action.trim().toLowerCase();\r\n const collection = formData.collection.trim().toLowerCase();\r\n if (!action || !collection) return '';\r\n return `${action}:${collection}`;\r\n }, [formData.action, formData.collection]);\r\n\r\n // Filter existing collections that match the typed value (for autocomplete)\r\n const collectionSuggestions = React.useMemo(() => {\r\n const query = formData.collection.trim().toLowerCase();\r\n if (!query) return [];\r\n return existingCollections.filter((c) => c.toLowerCase().includes(query));\r\n }, [formData.collection, existingCollections]);\r\n\r\n // Pre-populate form when editing\r\n React.useEffect(() => {\r\n if (permission) {\r\n setFormData({\r\n name: permission.name || '',\r\n collection: permission.collection || '',\r\n action: permission.action || '',\r\n description: permission.description || '',\r\n resourceType: permission.resourceType || 'collection',\r\n resourceName: permission.resourceName || permission.collection || '',\r\n });\r\n } else {\r\n setFormData({\r\n name: '',\r\n collection: '',\r\n action: '',\r\n description: '',\r\n resourceType: 'collection',\r\n resourceName: '',\r\n });\r\n }\r\n setFieldErrors({});\r\n setFormError('');\r\n }, [permission, isOpen]);\r\n\r\n const validateForm = (): boolean => {\r\n const errors: Partial<Record<keyof PermissionFormData, string>> = {};\r\n\r\n if (!formData.collection.trim()) {\r\n errors.collection = 'Collection is required';\r\n }\r\n\r\n if (!formData.action.trim()) {\r\n errors.action = 'Action is required';\r\n }\r\n\r\n setFieldErrors(errors);\r\n return Object.keys(errors).length === 0;\r\n };\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setFormError('');\r\n\r\n if (!validateForm()) {\r\n return;\r\n }\r\n\r\n // Build final payload with auto-derived values\r\n const collection = formData.collection.trim().toLowerCase();\r\n const action = formData.action.trim().toLowerCase();\r\n const name = `${action}:${collection}`;\r\n\r\n const payload: PermissionFormData = {\r\n ...formData,\r\n name,\r\n collection,\r\n action,\r\n resourceType: 'collection',\r\n resourceName: collection,\r\n };\r\n\r\n try {\r\n await onSubmit(payload);\r\n onClose();\r\n } catch (err: any) {\r\n setFormError(err.message || 'Failed to save permission. Please try again.');\r\n }\r\n };\r\n\r\n const handleCollectionChange = (value: string) => {\r\n const normalized = value.trim().toLowerCase();\r\n setFormData((prev) => ({ ...prev, collection: normalized }));\r\n setCollectionPopoverOpen(normalized.length > 0);\r\n if (fieldErrors.collection) {\r\n setFieldErrors((prev) => ({ ...prev, collection: undefined }));\r\n }\r\n };\r\n\r\n const handleCollectionBlur = () => {\r\n // Delay closing so clicking a suggestion works\r\n setTimeout(() => setCollectionPopoverOpen(false), 150);\r\n };\r\n\r\n const handleSelectSuggestion = (suggestion: string) => {\r\n setFormData((prev) => ({ ...prev, collection: suggestion }));\r\n setCollectionPopoverOpen(false);\r\n };\r\n\r\n if (!isOpen) return null;\r\n\r\n return (\r\n <DialogContent isOpen={isOpen} onClose={onClose}>\r\n <DialogHeader>\r\n <DialogTitle>{isEditMode ? 'Edit Permission' : 'Add Permission'}</DialogTitle>\r\n <DialogDescription>\r\n {isEditMode\r\n ? 'Update permission details.'\r\n : 'Create a new permission for the system.'}\r\n </DialogDescription>\r\n </DialogHeader>\r\n\r\n <form onSubmit={handleSubmit} className=\"space-y-4 max-h-[70vh] overflow-y-auto\">\r\n {formError && (\r\n <div className=\"p-3 rounded-lg bg-destructive/10 border border-destructive/30\">\r\n <p className=\"text-sm text-destructive font-medium\">{formError}</p>\r\n </div>\r\n )}\r\n\r\n {/* Name - read-only, auto-derived from action:collection */}\r\n <div className=\"space-y-2\">\r\n <Label htmlFor=\"permission-name\">Name</Label>\r\n <Input\r\n id=\"permission-name\"\r\n value={derivedName}\r\n readOnly\r\n disabled\r\n placeholder=\"Auto-generated from action and collection\"\r\n className=\"bg-muted text-muted-foreground cursor-not-allowed\"\r\n />\r\n <p className=\"text-xs text-muted-foreground\">\r\n Automatically set as &lt;action&gt;:&lt;collection&gt;\r\n </p>\r\n </div>\r\n\r\n {/* Collection - trim, lowercase, autocomplete popup */}\r\n <div className=\"space-y-2 relative\">\r\n <Label htmlFor=\"permission-collection\">Collection *</Label>\r\n <div className=\"relative\">\r\n <Input\r\n ref={collectionInputRef}\r\n id=\"permission-collection\"\r\n value={formData.collection}\r\n onChange={(e) => handleCollectionChange(e.target.value)}\r\n onFocus={() => formData.collection.trim() && setCollectionPopoverOpen(true)}\r\n onBlur={handleCollectionBlur}\r\n placeholder=\"Enter collection name (e.g., users, roles)\"\r\n disabled={loading}\r\n className={fieldErrors.collection ? 'border-destructive' : ''}\r\n />\r\n {collectionPopoverOpen && collectionSuggestions.length > 0 && (\r\n <div\r\n ref={collectionPopoverRef}\r\n className=\"absolute top-full left-0 right-0 mt-1 z-50 rounded-lg border border-border bg-card shadow-lg py-1 max-h-40 overflow-y-auto\"\r\n >\r\n {collectionSuggestions.map((c) => (\r\n <button\r\n key={c}\r\n type=\"button\"\r\n className=\"w-full px-3 py-2 text-left text-sm hover:bg-muted transition-colors\"\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n handleSelectSuggestion(c);\r\n }}\r\n >\r\n {c}\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n {fieldErrors.collection && (\r\n <p className=\"text-sm text-destructive\">{fieldErrors.collection}</p>\r\n )}\r\n </div>\r\n\r\n {/* Action - free text field */}\r\n <div className=\"space-y-2\">\r\n <Label htmlFor=\"permission-action\">Action *</Label>\r\n <Input\r\n id=\"permission-action\"\r\n value={formData.action}\r\n onChange={(e) => {\r\n setFormData((prev) => ({ ...prev, action: e.target.value }));\r\n if (fieldErrors.action) {\r\n setFieldErrors((prev) => ({ ...prev, action: undefined }));\r\n }\r\n }}\r\n placeholder=\"e.g., read, create, update, delete, or custom action\"\r\n disabled={loading}\r\n className={fieldErrors.action ? 'border-destructive' : ''}\r\n />\r\n {fieldErrors.action && (\r\n <p className=\"text-sm text-destructive\">{fieldErrors.action}</p>\r\n )}\r\n </div>\r\n\r\n {/* Description */}\r\n <div className=\"space-y-2\">\r\n <Label htmlFor=\"permission-description\">Description</Label>\r\n <Input\r\n id=\"permission-description\"\r\n value={formData.description}\r\n onChange={(e) =>\r\n setFormData((prev) => ({ ...prev, description: e.target.value }))\r\n }\r\n placeholder=\"Enter permission description\"\r\n disabled={loading}\r\n />\r\n </div>\r\n\r\n <DialogFooter>\r\n <Button type=\"button\" variant=\"secondary\" onClick={onClose} disabled={loading} className=\"min-w-[6.5rem]\">\r\n Cancel\r\n </Button>\r\n <Button type=\"submit\" disabled={loading} className=\"min-w-[6.5rem]\">\r\n {loading ? (\r\n <span className=\"flex items-center gap-2\">\r\n <svg\r\n className=\"animate-spin h-4 w-4\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <circle\r\n className=\"opacity-25\"\r\n cx=\"12\"\r\n cy=\"12\"\r\n r=\"10\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"4\"\r\n />\r\n <path\r\n className=\"opacity-75\"\r\n fill=\"currentColor\"\r\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\r\n />\r\n </svg>\r\n {isEditMode ? 'Saving...' : 'Creating...'}\r\n </span>\r\n ) : isEditMode ? (\r\n 'Save Changes'\r\n ) : (\r\n 'Create Permission'\r\n )}\r\n </Button>\r\n </DialogFooter>\r\n </form>\r\n </DialogContent>\r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { Button } from './button';\r\nimport {\r\n DialogContent,\r\n DialogHeader,\r\n DialogTitle,\r\n DialogDescription,\r\n DialogFooter,\r\n} from './dialog';\r\n\r\nexport interface DeleteConfirmationDialogProps {\r\n isOpen: boolean;\r\n onClose: () => void;\r\n onConfirm: () => Promise<void>;\r\n title?: string;\r\n description?: string;\r\n itemName?: string;\r\n loading?: boolean;\r\n}\r\n\r\nexport function DeleteConfirmationDialog({\r\n isOpen,\r\n onClose,\r\n onConfirm,\r\n title = 'Confirm Deletion',\r\n description = 'Are you sure you want to delete this item? This action cannot be undone.',\r\n itemName,\r\n loading = false,\r\n}: DeleteConfirmationDialogProps) {\r\n const [error, setError] = React.useState('');\r\n\r\n const handleConfirm = async () => {\r\n setError('');\r\n try {\r\n await onConfirm();\r\n onClose();\r\n } catch (err: any) {\r\n setError(err.message || 'Failed to delete. Please try again.');\r\n }\r\n };\r\n\r\n if (!isOpen) return null;\r\n\r\n return (\r\n <DialogContent isOpen={isOpen} onClose={onClose}>\r\n <DialogHeader>\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"w-10 h-10 rounded-full bg-destructive/10 flex items-center justify-center\">\r\n <svg\r\n className=\"w-5 h-5 text-destructive\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth={2}\r\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\r\n />\r\n </svg>\r\n </div>\r\n <div>\r\n <DialogTitle>{title}</DialogTitle>\r\n </div>\r\n </div>\r\n </DialogHeader>\r\n\r\n <div className=\"space-y-4\">\r\n <DialogDescription>\r\n {itemName ? (\r\n <>\r\n Are you sure you want to delete <strong>{itemName}</strong>? This\r\n action cannot be undone.\r\n </>\r\n ) : (\r\n description\r\n )}\r\n </DialogDescription>\r\n\r\n {error && (\r\n <div className=\"p-3 rounded-lg bg-destructive/10 border border-destructive/30\">\r\n <p className=\"text-sm text-destructive font-medium\">{error}</p>\r\n </div>\r\n )}\r\n\r\n <DialogFooter>\r\n <Button\r\n type=\"button\"\r\n variant=\"secondary\"\r\n onClick={onClose}\r\n disabled={loading}\r\n className=\"min-w-[6.5rem]\"\r\n >\r\n Cancel\r\n </Button>\r\n <Button\r\n type=\"button\"\r\n variant=\"destructive\"\r\n onClick={handleConfirm}\r\n disabled={loading}\r\n className=\"min-w-[6.5rem]\"\r\n >\r\n {loading ? (\r\n <span className=\"flex items-center gap-2\">\r\n <svg\r\n className=\"animate-spin h-4 w-4\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <circle\r\n className=\"opacity-25\"\r\n cx=\"12\"\r\n cy=\"12\"\r\n r=\"10\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"4\"\r\n />\r\n <path\r\n className=\"opacity-75\"\r\n fill=\"currentColor\"\r\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\r\n />\r\n </svg>\r\n Deleting...\r\n </span>\r\n ) : (\r\n 'Delete'\r\n )}\r\n </Button>\r\n </DialogFooter>\r\n </div>\r\n </DialogContent>\r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { Button } from './button';\r\nimport { Label } from './label';\r\nimport { PasswordInput } from './password-input';\r\nimport {\r\n DialogContent,\r\n DialogHeader,\r\n DialogTitle,\r\n DialogDescription,\r\n DialogFooter,\r\n} from './dialog';\r\nimport { generatePassword } from '../lib/passwordGenerator';\r\nimport { Shuffle } from 'lucide-react';\r\n\r\nexport interface ChangePasswordDialogProps {\r\n isOpen: boolean;\r\n onClose: () => void;\r\n onSubmit: (password: string, passwordConfirm: string) => Promise<void>;\r\n userName?: string;\r\n loading?: boolean;\r\n}\r\n\r\nexport function ChangePasswordDialog({\r\n isOpen,\r\n onClose,\r\n onSubmit,\r\n userName,\r\n loading = false,\r\n}: ChangePasswordDialogProps) {\r\n const [password, setPassword] = React.useState('');\r\n const [passwordConfirm, setPasswordConfirm] = React.useState('');\r\n const [passwordError, setPasswordError] = React.useState('');\r\n const [passwordConfirmError, setPasswordConfirmError] = React.useState('');\r\n const [formError, setFormError] = React.useState('');\r\n\r\n React.useEffect(() => {\r\n if (isOpen) {\r\n setPassword('');\r\n setPasswordConfirm('');\r\n setPasswordError('');\r\n setPasswordConfirmError('');\r\n setFormError('');\r\n }\r\n }, [isOpen]);\r\n\r\n const handleGeneratePassword = () => {\r\n const generated = generatePassword({ length: 16, numbers: true, symbols: true, uppercase: true, lowercase: true });\r\n setPassword(generated);\r\n setPasswordConfirm(generated);\r\n setPasswordError('');\r\n setPasswordConfirmError('');\r\n };\r\n\r\n const validate = (): boolean => {\r\n const errors: { password?: string; passwordConfirm?: string } = {};\r\n if (!password || password.trim().length < 8) {\r\n errors.password = 'Password must be at least 8 characters';\r\n }\r\n if (password !== passwordConfirm) {\r\n errors.passwordConfirm = 'Passwords do not match';\r\n }\r\n setPasswordError(errors.password ?? '');\r\n setPasswordConfirmError(errors.passwordConfirm ?? '');\r\n return Object.keys(errors).length === 0;\r\n };\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setFormError('');\r\n if (!validate()) return;\r\n try {\r\n await onSubmit(password, passwordConfirm);\r\n onClose();\r\n } catch (err: any) {\r\n setFormError(err.message || 'Failed to change password. Please try again.');\r\n }\r\n };\r\n\r\n if (!isOpen) return null;\r\n\r\n return (\r\n <DialogContent isOpen={isOpen} onClose={onClose}>\r\n <DialogHeader>\r\n <DialogTitle>Change Password</DialogTitle>\r\n <DialogDescription>\r\n {userName\r\n ? `Set a new password for ${userName}. The user will need to use this password to sign in.`\r\n : 'Set a new password for this user. The user will need to use this password to sign in.'}\r\n </DialogDescription>\r\n </DialogHeader>\r\n\r\n <form onSubmit={handleSubmit} className=\"space-y-4\">\r\n {formError && (\r\n <div className=\"p-3 rounded-lg bg-destructive/10 border border-destructive/30\">\r\n <p className=\"text-sm text-destructive font-medium\">{formError}</p>\r\n </div>\r\n )}\r\n\r\n <div className=\"space-y-2\">\r\n <div className=\"flex items-center justify-between gap-2\">\r\n <Label htmlFor=\"change-password\">New Password</Label>\r\n <Button\r\n type=\"button\"\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n onClick={handleGeneratePassword}\r\n className=\"gap-1.5 text-muted-foreground hover:text-foreground\"\r\n >\r\n <Shuffle className=\"h-4 w-4\" />\r\n Generate\r\n </Button>\r\n </div>\r\n <PasswordInput\r\n id=\"change-password\"\r\n value={password}\r\n onChange={(e) => {\r\n setPassword(e.target.value);\r\n if (passwordError) setPasswordError('');\r\n }}\r\n placeholder=\"Enter new password (min 8 characters)\"\r\n disabled={loading}\r\n className={passwordError ? 'border-destructive' : ''}\r\n />\r\n {passwordError && (\r\n <p className=\"text-sm text-destructive\">{passwordError}</p>\r\n )}\r\n </div>\r\n\r\n <div className=\"space-y-2\">\r\n <Label htmlFor=\"change-password-confirm\">Confirm Password</Label>\r\n <PasswordInput\r\n id=\"change-password-confirm\"\r\n value={passwordConfirm}\r\n onChange={(e) => {\r\n setPasswordConfirm(e.target.value);\r\n if (passwordConfirmError) setPasswordConfirmError('');\r\n }}\r\n placeholder=\"Confirm new password\"\r\n disabled={loading}\r\n className={passwordConfirmError ? 'border-destructive' : ''}\r\n />\r\n {passwordConfirmError && (\r\n <p className=\"text-sm text-destructive\">{passwordConfirmError}</p>\r\n )}\r\n </div>\r\n\r\n <DialogFooter>\r\n <Button type=\"button\" variant=\"secondary\" onClick={onClose} disabled={loading} className=\"min-w-[6.5rem]\">\r\n Cancel\r\n </Button>\r\n <Button type=\"submit\" disabled={loading} className=\"min-w-[6.5rem]\">\r\n {loading ? (\r\n <span className=\"flex items-center gap-2\">\r\n <svg\r\n className=\"animate-spin h-4 w-4\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <circle\r\n className=\"opacity-25\"\r\n cx=\"12\"\r\n cy=\"12\"\r\n r=\"10\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"4\"\r\n />\r\n <path\r\n className=\"opacity-75\"\r\n fill=\"currentColor\"\r\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\r\n />\r\n </svg>\r\n Saving...\r\n </span>\r\n ) : (\r\n 'Change Password'\r\n )}\r\n </Button>\r\n </DialogFooter>\r\n </form>\r\n </DialogContent>\r\n );\r\n}\r\n","import * as React from 'react';\nimport { Button } from './button';\nimport { Badge } from './badge';\n\nexport interface BulkActionToolbarProps {\n selectedCount: number;\n onActivate?: () => void;\n onDeactivate?: () => void;\n onDelete?: () => void;\n onAssignRole?: () => void;\n onClearSelection: () => void;\n}\n\nexport function BulkActionToolbar({\n selectedCount,\n onActivate,\n onDeactivate,\n onDelete,\n onAssignRole,\n onClearSelection,\n}: BulkActionToolbarProps) {\n if (selectedCount === 0) return null;\n\n return (\n <div className=\"flex items-center gap-3 px-4 py-3 bg-muted/50 border-y border-border animate-in fade-in slide-in-from-bottom-2\">\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"info\" className=\"text-sm\">\n {selectedCount} selected\n </Badge>\n </div>\n\n <div className=\"h-4 w-px bg-border\" />\n\n <div className=\"flex items-center gap-2\">\n {onActivate && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={onActivate}\n className=\"gap-1\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n Activate\n </Button>\n )}\n\n {onDeactivate && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={onDeactivate}\n className=\"gap-1\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n Deactivate\n </Button>\n )}\n\n {onAssignRole && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={onAssignRole}\n className=\"gap-1\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z\" />\n </svg>\n Assign Role\n </Button>\n )}\n\n {onDelete && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={onDelete}\n className=\"gap-1 text-destructive hover:text-destructive hover:bg-destructive/10\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\n </svg>\n Delete\n </Button>\n )}\n </div>\n\n <div className=\"flex-1\" />\n\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onClearSelection}\n className=\"text-muted-foreground hover:text-foreground\"\n >\n Clear selection\n </Button>\n </div>\n );\n}\n","import * as React from 'react';\r\nimport { Button } from './button';\r\nimport { Checkbox } from './checkbox';\r\nimport { Badge } from './badge';\r\nimport {\r\n DialogContent,\r\n DialogHeader,\r\n DialogTitle,\r\n DialogDescription,\r\n DialogFooter,\r\n} from './dialog';\r\n\r\nexport interface BulkConfirmationDialogProps {\r\n isOpen: boolean;\r\n onClose: () => void;\r\n onConfirm: () => void;\r\n title: string;\r\n description?: string;\r\n itemCount: number;\r\n actionType: 'delete' | 'activate' | 'deactivate' | 'assign-role';\r\n loading?: boolean;\r\n affectedItems?: string[];\r\n}\r\n\r\nexport function BulkConfirmationDialog({\r\n isOpen,\r\n onClose,\r\n onConfirm,\r\n title,\r\n description,\r\n itemCount,\r\n actionType,\r\n loading = false,\r\n affectedItems = [],\r\n}: BulkConfirmationDialogProps) {\r\n const [confirmed, setConfirmed] = React.useState(false);\r\n\r\n // Reset confirmation when dialog opens\r\n React.useEffect(() => {\r\n if (isOpen) {\r\n setConfirmed(false);\r\n }\r\n }, [isOpen]);\r\n\r\n if (!isOpen) return null;\r\n\r\n const getActionColor = () => {\r\n switch (actionType) {\r\n case 'delete':\r\n return 'text-destructive';\r\n case 'activate':\r\n return 'text-success';\r\n case 'deactivate':\r\n return 'text-warning';\r\n default:\r\n return 'text-foreground';\r\n }\r\n };\r\n\r\n const getActionButtonVariant = () => {\r\n switch (actionType) {\r\n case 'delete':\r\n return 'destructive';\r\n default:\r\n return 'default';\r\n }\r\n };\r\n\r\n return (\r\n <DialogContent isOpen={isOpen} onClose={onClose}>\r\n <DialogHeader>\r\n <DialogTitle className={getActionColor()}>{title}</DialogTitle>\r\n <DialogDescription>\r\n {description || `You are about to ${actionType} ${itemCount} item${itemCount !== 1 ? 's' : ''}.`}\r\n </DialogDescription>\r\n </DialogHeader>\r\n\r\n <div className=\"space-y-4 py-4\">\r\n <div className=\"flex items-center justify-center py-4\">\r\n <Badge variant={actionType === 'delete' ? 'destructive' : 'default'} className=\"text-lg px-4 py-2\">\r\n {itemCount} item{itemCount !== 1 ? 's' : ''}\r\n </Badge>\r\n </div>\r\n\r\n {affectedItems.length > 0 && (\r\n <div className=\"bg-muted rounded-lg p-3 max-h-32 overflow-y-auto\">\r\n <ul className=\"space-y-1 text-sm\">\r\n {affectedItems.slice(0, 5).map((item, idx) => (\r\n <li key={idx} className=\"text-muted-foreground truncate\">• {item}</li>\r\n ))}\r\n {affectedItems.length > 5 && (\r\n <li className=\"text-muted-foreground italic\">and {affectedItems.length - 5} more...</li>\r\n )}\r\n </ul>\r\n </div>\r\n )}\r\n\r\n {actionType === 'delete' && (\r\n <div className=\"flex items-start gap-3 p-3 bg-destructive/10 border border-destructive/20 rounded-lg\">\r\n <div className=\"mt-0.5\">\r\n <svg className=\"w-5 h-5 text-destructive\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\" />\r\n </svg>\r\n </div>\r\n <div className=\"flex-1\">\r\n <p className=\"text-sm text-destructive font-medium\">Warning</p>\r\n <p className=\"text-sm text-destructive/80\">\r\n This action cannot be undone. The deleted items will be permanently removed from the system.\r\n </p>\r\n </div>\r\n </div>\r\n )}\r\n\r\n <div className=\"flex items-center gap-2 pt-2\">\r\n <Checkbox\r\n id=\"bulk-confirm\"\r\n checked={confirmed}\r\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setConfirmed(e.target.checked)}\r\n />\r\n <label htmlFor=\"bulk-confirm\" className=\"text-sm cursor-pointer\">\r\n I understand this action {actionType === 'delete' ? 'cannot be undone' : 'will affect the selected items'}\r\n </label>\r\n </div>\r\n </div>\r\n\r\n <DialogFooter>\r\n <Button type=\"button\" variant=\"secondary\" onClick={onClose} disabled={loading} className=\"min-w-[6.5rem]\">\r\n Cancel\r\n </Button>\r\n <Button\r\n type=\"button\"\r\n variant={getActionButtonVariant()}\r\n onClick={onConfirm}\r\n disabled={!confirmed || loading}\r\n className=\"min-w-[6.5rem]\"\r\n >\r\n {loading ? (\r\n <span className=\"flex items-center gap-2\">\r\n <svg\r\n className=\"animate-spin h-4 w-4\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <circle\r\n className=\"opacity-25\"\r\n cx=\"12\"\r\n cy=\"12\"\r\n r=\"10\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"4\"\r\n />\r\n <path\r\n className=\"opacity-75\"\r\n fill=\"currentColor\"\r\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\r\n />\r\n </svg>\r\n Processing...\r\n </span>\r\n ) : (\r\n `Confirm ${actionType}`\r\n )}\r\n </Button>\r\n </DialogFooter>\r\n </DialogContent>\r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { Tooltip, NO_ACCESS_MESSAGE } from './tooltip';\r\n\r\n/**\r\n * CanGuard - Renders children only when allowed. Use for hiding menus/items.\r\n */\r\nexport interface CanGuardProps {\r\n /** Whether the action is allowed */\r\n allowed: boolean;\r\n /** Content to render when allowed */\r\n children: React.ReactNode;\r\n /** Optional fallback when not allowed (default: null) */\r\n fallback?: React.ReactNode;\r\n}\r\n\r\nexport function CanGuard({ allowed, children, fallback = null }: CanGuardProps) {\r\n return <>{allowed ? children : fallback}</>;\r\n}\r\n\r\n/**\r\n * CanDisable - Disables children when not allowed and shows tooltip on hover.\r\n * Use for tabs, buttons, and actions that should be disabled (not hidden) when lacking permission.\r\n * Forwards all additional props (e.g. selectedValue, onValueChange from TabsList) to the child.\r\n */\r\nexport interface CanDisableProps {\r\n /** Whether the action is allowed */\r\n allowed: boolean;\r\n /** Content to render (typically Button, TabsTrigger, or other interactive element) */\r\n children: React.ReactNode;\r\n /** Tooltip message when disabled (default: \"You do not have access\") */\r\n disabledTooltip?: string;\r\n}\r\n\r\nexport function CanDisable({\r\n allowed,\r\n children,\r\n disabledTooltip = NO_ACCESS_MESSAGE,\r\n ...rest\r\n}: CanDisableProps) {\r\n const child = React.Children.only(children);\r\n if (!React.isValidElement(child)) {\r\n return <>{children}</>;\r\n }\r\n\r\n if (allowed) {\r\n return React.cloneElement(child as React.ReactElement<any>, rest);\r\n }\r\n\r\n const disabledChild = React.cloneElement(child as React.ReactElement<any>, {\r\n ...rest,\r\n disabled: true,\r\n });\r\n\r\n return (\r\n <Tooltip content={disabledTooltip} side=\"top\">\r\n <span className=\"inline-flex cursor-not-allowed\">\r\n {disabledChild}\r\n </span>\r\n </Tooltip>\r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { cn } from '../lib/utils';\r\n\r\nexport interface TooltipProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'content'> {\r\n /** Content shown on hover */\r\n content: React.ReactNode;\r\n /** Optional side for tooltip placement */\r\n side?: 'top' | 'bottom' | 'left' | 'right';\r\n children: React.ReactNode;\r\n}\r\n\r\n/** Default message when user lacks permission */\r\nexport const NO_ACCESS_MESSAGE = 'You do not have access';\r\n\r\n/**\r\n * Tooltip - Shows content on hover. Uses CSS for positioning.\r\n * Wraps children in a span to ensure hover works even when child is disabled.\r\n */\r\nconst Tooltip = React.forwardRef<HTMLDivElement, TooltipProps>(\r\n ({ content, side = 'top', children, className, ...props }, ref) => {\r\n return (\r\n <div\r\n ref={ref}\r\n className={cn('relative inline-flex group/tooltip', className)}\r\n {...props}\r\n >\r\n {children}\r\n <span\r\n role=\"tooltip\"\r\n className={cn(\r\n 'absolute z-50 px-2.5 py-1.5 text-xs font-medium text-white bg-gray-900 dark:bg-gray-800 rounded-md shadow-lg whitespace-nowrap',\r\n 'opacity-0 invisible group-hover/tooltip:opacity-100 group-hover/tooltip:visible',\r\n 'transition-opacity duration-150 pointer-events-none',\r\n side === 'top' && 'bottom-full left-1/2 -translate-x-1/2 mb-2',\r\n side === 'bottom' && 'top-full left-1/2 -translate-x-1/2 mt-2',\r\n side === 'left' && 'right-full top-1/2 -translate-y-1/2 mr-2',\r\n side === 'right' && 'left-full top-1/2 -translate-y-1/2 ml-2'\r\n )}\r\n >\r\n {content}\r\n </span>\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nTooltip.displayName = 'Tooltip';\r\n\r\nexport { Tooltip };\r\n","import * as React from 'react';\r\nimport { ArrowRight } from 'lucide-react';\r\nimport { cn } from '../lib/utils';\r\n\r\nexport interface QuickActionCardProps extends React.HTMLAttributes<HTMLDivElement> {\r\n title: string;\r\n description: string;\r\n icon: React.ReactNode;\r\n variant: 'bug' | 'feature' | 'inquiry';\r\n onClick: () => void;\r\n}\r\n\r\nconst variantStyles = {\r\n bug: {\r\n border: 'border-red-200 dark:border-red-900/50',\r\n iconBg: 'bg-red-100 dark:bg-red-900/30',\r\n iconColor: 'text-red-600 dark:text-red-400',\r\n arrowColor: 'text-red-600 dark:text-red-400',\r\n },\r\n feature: {\r\n border: 'border-blue-200 dark:border-blue-900/50',\r\n iconBg: 'bg-blue-100 dark:bg-blue-900/30',\r\n iconColor: 'text-blue-600 dark:text-blue-400',\r\n arrowColor: 'text-blue-600 dark:text-blue-400',\r\n },\r\n inquiry: {\r\n border: 'border-purple-200 dark:border-purple-900/50',\r\n iconBg: 'bg-purple-100 dark:bg-purple-900/30',\r\n iconColor: 'text-purple-600 dark:text-purple-400',\r\n arrowColor: 'text-purple-600 dark:text-purple-400',\r\n },\r\n};\r\n\r\nexport function QuickActionCard({\r\n title,\r\n description,\r\n icon,\r\n variant,\r\n onClick,\r\n className,\r\n ...props\r\n}: QuickActionCardProps) {\r\n const styles = variantStyles[variant];\r\n\r\n return (\r\n <div\r\n onClick={onClick}\r\n role=\"button\"\r\n tabIndex={0}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault();\r\n onClick();\r\n }\r\n }}\r\n className={cn(\r\n 'bg-card rounded-xl border-2 p-4',\r\n 'flex items-center gap-4 cursor-pointer',\r\n 'transition-all duration-200 ease-in-out',\r\n 'hover:scale-[1.02] hover:shadow-md',\r\n 'focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary',\r\n styles.border,\r\n className\r\n )}\r\n aria-label={`${title}: ${description}`}\r\n {...props}\r\n >\r\n {/* Icon Container */}\r\n <div\r\n className={`\r\n w-12 h-12 rounded-xl ${styles.iconBg}\r\n flex items-center justify-center flex-shrink-0\r\n `}\r\n >\r\n <div className={`w-6 h-6 ${styles.iconColor}`}>\r\n {icon}\r\n </div>\r\n </div>\r\n\r\n {/* Content */}\r\n <div className=\"flex-1 min-w-0\">\r\n <h3 className=\"text-[15px] font-semibold text-foreground\">\r\n {title}\r\n </h3>\r\n <p className=\"text-xs text-muted-foreground\">\r\n {description}\r\n </p>\r\n </div>\r\n\r\n {/* Arrow */}\r\n <ArrowRight className={`w-5 h-5 ${styles.arrowColor} flex-shrink-0`} />\r\n </div>\r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { cn } from '../lib/utils';\r\n\r\nexport interface TicketStatsCardProps extends React.HTMLAttributes<HTMLDivElement> {\r\n value: string | number;\r\n label: string;\r\n icon: React.ReactNode;\r\n iconBgColor: string;\r\n iconColor: string;\r\n badge?: {\r\n icon: React.ReactNode;\r\n text: string;\r\n bgColor: string;\r\n textColor: string;\r\n };\r\n}\r\n\r\nexport function TicketStatsCard({\r\n value,\r\n label,\r\n icon,\r\n iconBgColor,\r\n iconColor,\r\n badge,\r\n className,\r\n ...props\r\n}: TicketStatsCardProps) {\r\n return (\r\n <div\r\n className={cn(\r\n 'bg-card rounded-xl p-4 border border-border',\r\n 'flex flex-col gap-2',\r\n className\r\n )}\r\n {...props}\r\n >\r\n {/* Top Row */}\r\n <div className=\"flex items-center justify-between gap-2\">\r\n {/* Icon Container */}\r\n <div\r\n className={`\r\n w-10 h-10 rounded-lg\r\n flex items-center justify-center\r\n ${iconBgColor}\r\n `}\r\n >\r\n <div className={`w-5 h-5 ${iconColor}`}>\r\n {icon}\r\n </div>\r\n </div>\r\n\r\n {/* Trend Badge */}\r\n {badge && (\r\n <div\r\n className={`\r\n h-6 px-2 rounded-md\r\n flex items-center gap-1\r\n ${badge.bgColor}\r\n `}\r\n >\r\n <span className=\"w-3 h-3\">{badge.icon}</span>\r\n <span className={`text-xs font-medium ${badge.textColor}`}>\r\n {badge.text}\r\n </span>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Value */}\r\n <div className=\"text-2xl font-bold text-foreground\">\r\n {value}\r\n </div>\r\n\r\n {/* Label */}\r\n <div className=\"text-sm text-muted-foreground\">\r\n {label}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { Button } from './button';\r\nimport { Input } from './input';\r\nimport { Label } from './label';\r\nimport { Select } from './select';\r\nimport {\r\n DialogContent,\r\n DialogHeader,\r\n DialogTitle,\r\n DialogDescription,\r\n DialogFooter,\r\n} from './dialog';\r\n\r\nexport interface TicketFormData {\r\n title: string;\r\n description: string;\r\n category: 'bug' | 'feature' | 'inquiry';\r\n priority: 'low' | 'medium' | 'high';\r\n status: 'open' | 'in_progress' | 'resolved' | 'closed';\r\n}\r\n\r\nexport interface TicketFormDialogProps {\r\n isOpen: boolean;\r\n onClose: () => void;\r\n onSubmit: (data: TicketFormData) => Promise<void>;\r\n ticket?: {\r\n id: string;\r\n title: string;\r\n description: string;\r\n category: string;\r\n priority: string;\r\n status: string;\r\n } | null;\r\n loading?: boolean;\r\n initialCategory?: 'bug' | 'feature' | 'inquiry';\r\n}\r\n\r\nexport function TicketFormDialog({\r\n isOpen,\r\n onClose,\r\n onSubmit,\r\n ticket,\r\n loading = false,\r\n initialCategory,\r\n}: TicketFormDialogProps) {\r\n const isEditMode = !!ticket;\r\n\r\n const [formData, setFormData] = React.useState<TicketFormData>({\r\n title: '',\r\n description: '',\r\n category: 'bug',\r\n priority: 'medium',\r\n status: 'open',\r\n });\r\n\r\n const [fieldErrors, setFieldErrors] = React.useState<Partial<Record<keyof TicketFormData, string>>>({});\r\n const [formError, setFormError] = React.useState('');\r\n\r\n // Pre-populate form when editing or when initialCategory changes\r\n React.useEffect(() => {\r\n if (ticket) {\r\n setFormData({\r\n title: ticket.title || '',\r\n description: ticket.description || '',\r\n category: (ticket.category as TicketFormData['category']) || 'bug',\r\n priority: (ticket.priority as TicketFormData['priority']) || 'medium',\r\n status: (ticket.status as TicketFormData['status']) || 'open',\r\n });\r\n } else {\r\n setFormData({\r\n title: '',\r\n description: '',\r\n category: initialCategory || 'bug',\r\n priority: 'medium',\r\n status: 'open',\r\n });\r\n }\r\n setFieldErrors({});\r\n setFormError('');\r\n }, [ticket, isOpen, initialCategory]);\r\n\r\n const validateForm = (): boolean => {\r\n const errors: Partial<Record<keyof TicketFormData, string>> = {};\r\n\r\n if (!formData.title || formData.title.length < 5) {\r\n errors.title = 'Title is required and must be at least 5 characters';\r\n }\r\n\r\n if (!formData.description || formData.description.length < 10) {\r\n errors.description = 'Description is required and must be at least 10 characters';\r\n }\r\n\r\n setFieldErrors(errors);\r\n return Object.keys(errors).length === 0;\r\n };\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setFormError('');\r\n\r\n if (!validateForm()) {\r\n return;\r\n }\r\n\r\n try {\r\n await onSubmit(formData);\r\n onClose();\r\n } catch (err: any) {\r\n setFormError(err.message || 'Failed to save ticket. Please try again.');\r\n }\r\n };\r\n\r\n if (!isOpen) return null;\r\n\r\n const categoryOptions = [\r\n { value: 'bug', label: 'Bug Report' },\r\n { value: 'feature', label: 'Feature Request' },\r\n { value: 'inquiry', label: 'General Inquiry' },\r\n ];\r\n\r\n const priorityOptions = [\r\n { value: 'low', label: 'Low' },\r\n { value: 'medium', label: 'Medium' },\r\n { value: 'high', label: 'High' },\r\n ];\r\n\r\n const statusOptions = [\r\n { value: 'open', label: 'Open' },\r\n { value: 'in_progress', label: 'In Progress' },\r\n { value: 'resolved', label: 'Resolved' },\r\n { value: 'closed', label: 'Closed' },\r\n ];\r\n\r\n return (\r\n <DialogContent isOpen={isOpen} onClose={onClose}>\r\n <DialogHeader>\r\n <DialogTitle>{isEditMode ? 'Edit Ticket' : 'Create Ticket'}</DialogTitle>\r\n <DialogDescription>\r\n {isEditMode\r\n ? 'Update ticket details and status.'\r\n : 'Submit a bug report, feature request, or general inquiry.'}\r\n </DialogDescription>\r\n </DialogHeader>\r\n\r\n <form onSubmit={handleSubmit} className=\"space-y-4\">\r\n {formError && (\r\n <div className=\"p-3 rounded-lg bg-destructive/10 border border-destructive/30\">\r\n <p className=\"text-sm text-destructive font-medium\">{formError}</p>\r\n </div>\r\n )}\r\n\r\n {/* Title */}\r\n <div className=\"space-y-2\">\r\n <Label htmlFor=\"title\">Title *</Label>\r\n <Input\r\n id=\"title\"\r\n value={formData.title}\r\n onChange={(e) => {\r\n setFormData((prev) => ({ ...prev, title: e.target.value }));\r\n if (fieldErrors.title) {\r\n setFieldErrors((prev) => ({ ...prev, title: undefined }));\r\n }\r\n }}\r\n placeholder=\"Enter ticket title\"\r\n disabled={loading}\r\n className={fieldErrors.title ? 'border-destructive' : ''}\r\n />\r\n {fieldErrors.title && (\r\n <p className=\"text-sm text-destructive\">{fieldErrors.title}</p>\r\n )}\r\n </div>\r\n\r\n {/* Description */}\r\n <div className=\"space-y-2\">\r\n <Label htmlFor=\"description\">Description *</Label>\r\n <textarea\r\n id=\"description\"\r\n value={formData.description}\r\n onChange={(e) => {\r\n setFormData((prev) => ({ ...prev, description: e.target.value }));\r\n if (fieldErrors.description) {\r\n setFieldErrors((prev) => ({ ...prev, description: undefined }));\r\n }\r\n }}\r\n placeholder=\"Describe your issue or request in detail\"\r\n disabled={loading}\r\n rows={4}\r\n className={`w-full px-3 py-2 text-sm bg-background border rounded-lg \r\n focus:outline-none focus:ring-2 focus:ring-primary resize-vertical min-h-[100px]\r\n ${fieldErrors.description ? 'border-destructive' : 'border-border'}\r\n `}\r\n />\r\n {fieldErrors.description && (\r\n <p className=\"text-sm text-destructive\">{fieldErrors.description}</p>\r\n )}\r\n </div>\r\n\r\n {/* Category */}\r\n <div className=\"space-y-2\">\r\n <Label htmlFor=\"category\">Category *</Label>\r\n <Select\r\n id=\"category\"\r\n value={formData.category}\r\n onChange={(e) =>\r\n setFormData((prev) => ({\r\n ...prev,\r\n category: e.target.value as TicketFormData['category'],\r\n }))\r\n }\r\n options={categoryOptions}\r\n disabled={loading}\r\n />\r\n </div>\r\n\r\n {/* Priority */}\r\n <div className=\"space-y-2\">\r\n <Label htmlFor=\"priority\">Priority *</Label>\r\n <Select\r\n id=\"priority\"\r\n value={formData.priority}\r\n onChange={(e) =>\r\n setFormData((prev) => ({\r\n ...prev,\r\n priority: e.target.value as TicketFormData['priority'],\r\n }))\r\n }\r\n options={priorityOptions}\r\n disabled={loading}\r\n />\r\n </div>\r\n\r\n {/* Status - Only in edit mode */}\r\n {isEditMode && (\r\n <div className=\"space-y-2\">\r\n <Label htmlFor=\"status\">Status *</Label>\r\n <Select\r\n id=\"status\"\r\n value={formData.status}\r\n onChange={(e) =>\r\n setFormData((prev) => ({\r\n ...prev,\r\n status: e.target.value as TicketFormData['status'],\r\n }))\r\n }\r\n options={statusOptions}\r\n disabled={loading}\r\n />\r\n </div>\r\n )}\r\n\r\n <DialogFooter>\r\n <Button type=\"button\" variant=\"secondary\" onClick={onClose} disabled={loading} className=\"min-w-[6.5rem]\">\r\n Cancel\r\n </Button>\r\n <Button type=\"submit\" disabled={loading} className=\"min-w-[6.5rem]\">\r\n {loading ? (\r\n <span className=\"flex items-center gap-2\">\r\n <svg\r\n className=\"animate-spin h-4 w-4\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <circle\r\n className=\"opacity-25\"\r\n cx=\"12\"\r\n cy=\"12\"\r\n r=\"10\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"4\"\r\n />\r\n <path\r\n className=\"opacity-75\"\r\n fill=\"currentColor\"\r\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\r\n />\r\n </svg>\r\n {isEditMode ? 'Saving...' : 'Creating...'}\r\n </span>\r\n ) : isEditMode ? (\r\n 'Save Changes'\r\n ) : (\r\n 'Create Ticket'\r\n )}\r\n </Button>\r\n </DialogFooter>\r\n </form>\r\n </DialogContent>\r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { cn } from '../lib/utils';\r\n\r\nexport interface HealthStatusCardProps extends React.HTMLAttributes<HTMLDivElement> {\r\n /**\r\n * Overall health status\r\n */\r\n status: 'healthy' | 'degraded' | 'unhealthy' | 'checking';\r\n /**\r\n * Health percentage (0-100)\r\n */\r\n percentage?: number;\r\n /**\r\n * Uptime information\r\n */\r\n uptime?: {\r\n days: number;\r\n hours: number;\r\n minutes: number;\r\n };\r\n /**\r\n * Last check timestamp\r\n */\r\n lastCheck?: string;\r\n}\r\n\r\n/**\r\n * HealthStatusCard - Displays overall system health with a circular progress indicator\r\n * \r\n * Shows overall health percentage, uptime stats, and service count\r\n */\r\nconst HealthStatusCard = React.forwardRef<HTMLDivElement, HealthStatusCardProps>(\r\n ({ \r\n status, \r\n percentage = 100, \r\n uptime, \r\n lastCheck,\r\n className,\r\n ...props \r\n }, ref) => {\r\n const getStatusColor = () => {\r\n switch (status) {\r\n case 'healthy':\r\n return 'text-emerald-500';\r\n case 'degraded':\r\n return 'text-amber-500';\r\n case 'unhealthy':\r\n return 'text-red-500';\r\n case 'checking':\r\n return 'text-blue-500';\r\n default:\r\n return 'text-muted-foreground';\r\n }\r\n };\r\n\r\n const getStatusBg = () => {\r\n switch (status) {\r\n case 'healthy':\r\n return 'bg-emerald-500';\r\n case 'degraded':\r\n return 'bg-amber-500';\r\n case 'unhealthy':\r\n return 'bg-red-500';\r\n case 'checking':\r\n return 'bg-blue-500';\r\n default:\r\n return 'bg-muted';\r\n }\r\n };\r\n\r\n const getStatusText = () => {\r\n switch (status) {\r\n case 'healthy':\r\n return 'All Systems Operational';\r\n case 'degraded':\r\n return 'Some Services Degraded';\r\n case 'unhealthy':\r\n return 'System Unhealthy';\r\n case 'checking':\r\n return 'Checking Health...';\r\n default:\r\n return 'Unknown Status';\r\n }\r\n };\r\n\r\n // Calculate circle progress\r\n const radius = 45;\r\n const circumference = 2 * Math.PI * radius;\r\n const strokeDashoffset = circumference - (percentage / 100) * circumference;\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={cn(\r\n 'rounded-2xl border bg-card p-8',\r\n 'border-border',\r\n className\r\n )}\r\n {...props}\r\n >\r\n <div className=\"flex flex-col lg:flex-row gap-6\">\r\n {/* Left side - Circular progress */}\r\n <div className=\"flex flex-col items-center gap-4\">\r\n <div className=\"relative w-[140px] h-[140px]\">\r\n {/* Background circle */}\r\n <svg className=\"w-full h-full -rotate-90\" viewBox=\"0 0 100 100\">\r\n <circle\r\n cx=\"50\"\r\n cy=\"50\"\r\n r={radius}\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"8\"\r\n className=\"text-muted/30\"\r\n />\r\n {/* Progress circle */}\r\n <circle\r\n cx=\"50\"\r\n cy=\"50\"\r\n r={radius}\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"8\"\r\n strokeLinecap=\"round\"\r\n strokeDasharray={circumference}\r\n strokeDashoffset={strokeDashoffset}\r\n className={cn('transition-all duration-500', getStatusColor())}\r\n />\r\n </svg>\r\n {/* Center content */}\r\n <div className=\"absolute inset-0 flex flex-col items-center justify-center\">\r\n <span className={cn('text-3xl font-bold', getStatusColor())}>\r\n {percentage}%\r\n </span>\r\n <span className=\"text-xs text-muted-foreground mt-1\">Health Score</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Right side - Details */}\r\n <div className=\"flex-1 flex flex-col justify-center gap-6\">\r\n {/* Status */}\r\n <div>\r\n <div className=\"flex items-center gap-2 mb-2\">\r\n <div className={cn('w-2 h-2 rounded-full animate-pulse', getStatusBg())} />\r\n <span className=\"text-sm text-muted-foreground\">Current Status</span>\r\n </div>\r\n <h3 className={cn('text-xl font-semibold', getStatusColor())}>\r\n {getStatusText()}\r\n </h3>\r\n </div>\r\n\r\n {/* Uptime Stats */}\r\n {uptime && (\r\n <div className=\"grid grid-cols-3 gap-4\">\r\n <div className=\"text-center p-3 rounded-lg bg-muted/50\">\r\n <div className=\"text-2xl font-bold text-foreground\">{uptime.days}</div>\r\n <div className=\"text-xs text-muted-foreground\">Days</div>\r\n </div>\r\n <div className=\"text-center p-3 rounded-lg bg-muted/50\">\r\n <div className=\"text-2xl font-bold text-foreground\">{uptime.hours}</div>\r\n <div className=\"text-xs text-muted-foreground\">Hours</div>\r\n </div>\r\n <div className=\"text-center p-3 rounded-lg bg-muted/50\">\r\n <div className=\"text-2xl font-bold text-foreground\">{uptime.minutes}</div>\r\n <div className=\"text-xs text-muted-foreground\">Minutes</div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Last check time */}\r\n {lastCheck && (\r\n <div className=\"mt-6 pt-4 border-t border-border\">\r\n <div className=\"flex items-center gap-2 text-xs text-muted-foreground\">\r\n <svg className=\"w-3 h-3\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z\" />\r\n </svg>\r\n Last checked: {lastCheck}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nHealthStatusCard.displayName = 'HealthStatusCard';\r\n\r\nexport { HealthStatusCard };\r\n","import * as React from 'react';\nimport { cn } from '../lib/utils';\n\nexport interface ServiceStatusCardProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Service name\n */\n name: string;\n /**\n * Service description\n */\n description?: string;\n /**\n * Current status of the service\n */\n status: 'operational' | 'degraded' | 'down' | 'checking';\n /**\n * Response time in milliseconds\n */\n responseTime?: number;\n /**\n * Service icon\n */\n icon?: React.ReactNode;\n /**\n * Additional details about the service\n */\n details?: string;\n /**\n * Last checked timestamp\n */\n lastChecked?: string;\n}\n\n/**\n * ServiceStatusCard - Displays the status of an individual service\n * \n * Shows service name, status badge, response time, and additional details\n */\nconst ServiceStatusCard = React.forwardRef<HTMLDivElement, ServiceStatusCardProps>(\n ({ \n name, \n description,\n status, \n responseTime,\n icon,\n details,\n lastChecked,\n className,\n ...props \n }, ref) => {\n const getStatusConfig = () => {\n switch (status) {\n case 'operational':\n return {\n label: 'Operational',\n badgeClass: 'bg-emerald-100 text-emerald-700 dark:bg-emerald-500/20 dark:text-emerald-400',\n dotClass: 'bg-emerald-500',\n iconColor: 'text-emerald-500',\n };\n case 'degraded':\n return {\n label: 'Degraded',\n badgeClass: 'bg-amber-100 text-amber-700 dark:bg-amber-500/20 dark:text-amber-400',\n dotClass: 'bg-amber-500',\n iconColor: 'text-amber-500',\n };\n case 'down':\n return {\n label: 'Down',\n badgeClass: 'bg-red-100 text-red-700 dark:bg-red-500/20 dark:text-red-400',\n dotClass: 'bg-red-500',\n iconColor: 'text-red-500',\n };\n case 'checking':\n return {\n label: 'Checking...',\n badgeClass: 'bg-blue-100 text-blue-700 dark:bg-blue-500/20 dark:text-blue-400',\n dotClass: 'bg-blue-500',\n iconColor: 'text-blue-500',\n };\n default:\n return {\n label: 'Unknown',\n badgeClass: 'bg-muted text-muted-foreground',\n dotClass: 'bg-muted',\n iconColor: 'text-muted-foreground',\n };\n }\n };\n\n const config = getStatusConfig();\n\n const getResponseTimeColor = () => {\n if (!responseTime) return 'text-muted-foreground';\n if (responseTime < 100) return 'text-emerald-500';\n if (responseTime < 300) return 'text-amber-500';\n return 'text-red-500';\n };\n\n return (\n <div\n ref={ref}\n className={cn(\n 'rounded-2xl border bg-card p-6',\n 'border-border',\n 'transition-all duration-200',\n 'hover:shadow-md',\n className\n )}\n {...props}\n >\n {/* Header */}\n <div className=\"flex items-start justify-between mb-4\">\n <div className=\"flex items-center gap-3\">\n {icon && (\n <div className={cn(\n 'w-10 h-10 rounded-xl flex items-center justify-center',\n 'bg-muted',\n config.iconColor\n )}>\n {icon}\n </div>\n )}\n <div>\n <h4 className=\"font-semibold text-foreground\">{name}</h4>\n {description && (\n <p className=\"text-xs text-muted-foreground\">{description}</p>\n )}\n </div>\n </div>\n <div className={cn(\n 'inline-flex items-center gap-1.5 px-2.5 py-1 rounded-full text-xs font-medium',\n config.badgeClass\n )}>\n <span className={cn('w-1.5 h-1.5 rounded-full', config.dotClass)} />\n {config.label}\n </div>\n </div>\n\n {/* Response Time */}\n {responseTime !== undefined && (\n <div className=\"mb-4\">\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-xs text-muted-foreground\">Response Time</span>\n <span className={cn('text-sm font-medium', getResponseTimeColor())}>\n {responseTime}ms\n </span>\n </div>\n {/* Response time bar */}\n <div className=\"h-1.5 bg-muted rounded-full overflow-hidden\">\n <div \n className={cn(\n 'h-full rounded-full transition-all duration-500',\n responseTime < 100 ? 'bg-emerald-500' : \n responseTime < 300 ? 'bg-amber-500' : 'bg-red-500'\n )}\n style={{ width: `${Math.min((responseTime / 500) * 100, 100)}%` }}\n />\n </div>\n </div>\n )}\n\n {/* Details */}\n {details && (\n <div className=\"mb-3\">\n <p className=\"text-xs text-muted-foreground\">{details}</p>\n </div>\n )}\n\n {/* Last checked */}\n {lastChecked && (\n <div className=\"pt-3 border-t border-border\">\n <div className=\"flex items-center gap-1.5 text-xs text-muted-foreground\">\n <svg className=\"w-3 h-3\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n {lastChecked}\n </div>\n </div>\n )}\n </div>\n );\n }\n);\n\nServiceStatusCard.displayName = 'ServiceStatusCard';\n\nexport { ServiceStatusCard };\n","import * as React from 'react';\r\nimport { cn } from '../lib/utils';\r\nimport { TopBar, TopBarNavItem, TopBarMoreItem } from './topbar';\r\nimport { SideNav, MenuItem } from './sidenav';\r\n\r\nexport interface AdminShellProps extends React.HTMLAttributes<HTMLDivElement> {\r\n children: React.ReactNode;\r\n /**\r\n * Navigation items for the topbar center menu\r\n */\r\n topBarNavItems?: TopBarNavItem[];\r\n /**\r\n * Additional items for the topbar \"More\" dropdown\r\n */\r\n topBarMoreItems?: TopBarMoreItem[];\r\n /**\r\n * Menu items for the sidebar\r\n */\r\n sideNavMenuItems?: MenuItem[];\r\n /**\r\n * Sidebar header title\r\n */\r\n sideNavHeaderTitle?: string;\r\n /**\r\n * Sidebar support section configuration\r\n */\r\n sideNavSupportSection?: {\r\n title: string;\r\n subtitle: string;\r\n buttonText: string;\r\n icon?: React.ReactNode;\r\n onClick?: () => void;\r\n } | null;\r\n /**\r\n * Logo configuration\r\n */\r\n logo?: {\r\n icon?: React.ReactNode;\r\n text?: string;\r\n href?: string;\r\n };\r\n /**\r\n * User info for the profile section\r\n */\r\n user?: {\r\n name?: string;\r\n email?: string;\r\n avatar?: string;\r\n role?: string;\r\n };\r\n /**\r\n * Callback for navigation\r\n */\r\n onNavigate?: (href: string) => void;\r\n /**\r\n * Callback for logout\r\n */\r\n onLogout?: () => void;\r\n /**\r\n * Callback when Profile menu item is clicked\r\n */\r\n onProfileClick?: () => void;\r\n /**\r\n * Callback when Settings menu item is clicked\r\n */\r\n onSettingsClick?: () => void;\r\n /**\r\n * Callback when Help & Support menu item is clicked\r\n */\r\n onHelpSupportClick?: () => void;\r\n}\r\n\r\n/**\r\n * AdminShell - Main layout wrapper with fixed positioning.\r\n * \r\n * Layout Structure (matching Pencil design exactly):\r\n * - Topbar: Fixed at top, full width, 68px height, z-50\r\n * - Sidebar: Fixed below topbar, 260px width (72px collapsed), full height minus topbar\r\n * - Content: Absolute positioned with left offset for sidebar, top offset for topbar\r\n */\r\nconst AdminShell = React.forwardRef<HTMLDivElement, AdminShellProps>(\r\n (\r\n {\r\n children,\r\n topBarNavItems = [],\r\n topBarMoreItems = [],\r\n sideNavMenuItems = [],\r\n sideNavHeaderTitle,\r\n sideNavSupportSection,\r\n logo,\r\n user,\r\n onNavigate,\r\n onLogout,\r\n onProfileClick,\r\n onSettingsClick,\r\n onHelpSupportClick,\r\n className,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const [sidebarCollapsed, setSidebarCollapsed] = React.useState(false);\r\n const [mobileMenuOpen, setMobileMenuOpen] = React.useState(false);\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={cn('min-h-screen bg-background', className)}\r\n {...props}\r\n >\r\n {/* Fixed Topbar - Full width, 68px height */}\r\n <div className=\"fixed top-0 left-0 right-0 z-50 h-[68px]\">\r\n <TopBar\r\n logo={logo}\r\n navItems={topBarNavItems}\r\n moreItems={topBarMoreItems}\r\n user={user}\r\n onNavigate={onNavigate}\r\n onLogout={onLogout}\r\n onProfileClick={onProfileClick}\r\n onSettingsClick={onSettingsClick}\r\n onHelpSupportClick={onHelpSupportClick}\r\n onMobileMenuToggle={() => setMobileMenuOpen(!mobileMenuOpen)}\r\n />\r\n </div>\r\n\r\n {/* Fixed Sidebar - Below topbar, 260px width */}\r\n <aside \r\n className={cn(\r\n 'fixed left-0 top-[68px] bottom-0 z-40 bg-background border-r border-border transition-all duration-300 hidden lg:block',\r\n sidebarCollapsed ? 'w-[72px]' : 'w-[260px]'\r\n )}\r\n >\r\n <SideNav \r\n menuItems={sideNavMenuItems}\r\n headerTitle={sideNavHeaderTitle}\r\n supportSection={sideNavSupportSection}\r\n onNavigate={onNavigate}\r\n collapsed={sidebarCollapsed}\r\n onCollapseChange={setSidebarCollapsed}\r\n />\r\n </aside>\r\n\r\n {/* Mobile Sidebar Overlay */}\r\n {mobileMenuOpen && (\r\n <>\r\n <div \r\n className=\"fixed inset-0 z-40 bg-black/50 lg:hidden\"\r\n onClick={() => setMobileMenuOpen(false)}\r\n />\r\n <aside className=\"fixed left-0 top-[68px] bottom-0 z-50 w-[260px] bg-background border-r border-border lg:hidden\">\r\n <SideNav \r\n menuItems={sideNavMenuItems}\r\n headerTitle={sideNavHeaderTitle}\r\n supportSection={sideNavSupportSection}\r\n onNavigate={(href) => {\r\n onNavigate?.(href);\r\n setMobileMenuOpen(false);\r\n }}\r\n collapsed={false}\r\n />\r\n </aside>\r\n </>\r\n )}\r\n\r\n {/* Main Content Area - Offset by sidebar width and topbar height */}\r\n <main \r\n className={cn(\r\n 'min-h-screen pt-[68px] transition-all duration-300 bg-muted/30',\r\n sidebarCollapsed ? 'lg:pl-[72px]' : 'lg:pl-[260px]'\r\n )}\r\n >\r\n <div className=\"p-6 lg:p-8\">\r\n {children}\r\n </div>\r\n </main>\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nAdminShell.displayName = 'AdminShell';\r\n\r\nexport { AdminShell };\r\n","import * as React from 'react';\r\nimport { cn } from '../lib/utils';\r\nimport { ProfileDropdown } from './profile-dropdown';\r\nimport { ThemeToggle } from './theme-toggle';\r\nimport {\r\n Dialog,\r\n DialogContent,\r\n DialogHeader,\r\n DialogTitle,\r\n DialogDescription,\r\n DialogFooter,\r\n} from './dialog';\r\n\r\nexport interface TopBarNavItem {\r\n id: string;\r\n label: string;\r\n href: string;\r\n}\r\n\r\nexport interface TopBarMoreItem {\r\n id: string;\r\n label: string;\r\n href: string;\r\n}\r\n\r\nexport interface TopBarProps extends React.HTMLAttributes<HTMLDivElement> {\r\n /**\r\n * Logo configuration\r\n */\r\n logo?: {\r\n icon?: React.ReactNode;\r\n text?: string;\r\n href?: string;\r\n };\r\n /**\r\n * Navigation items for the topbar center menu\r\n */\r\n navItems?: TopBarNavItem[];\r\n /**\r\n * Additional items for the \"More\" dropdown\r\n */\r\n moreItems?: TopBarMoreItem[];\r\n /**\r\n * User info for the profile section\r\n */\r\n user?: {\r\n name?: string;\r\n email?: string;\r\n avatar?: string;\r\n role?: string;\r\n };\r\n /**\r\n * Currently active navigation item ID\r\n */\r\n activeItemId?: string | null;\r\n /**\r\n * Callback when active item changes\r\n */\r\n onActiveItemChange?: (itemId: string | null) => void;\r\n /**\r\n * Callback for navigation\r\n */\r\n onNavigate?: (href: string) => void;\r\n /**\r\n * Callback for mobile menu toggle\r\n */\r\n onMobileMenuToggle?: () => void;\r\n /**\r\n * Callback for logout\r\n */\r\n onLogout?: () => void;\r\n /**\r\n * Callback when Profile menu item is clicked\r\n */\r\n onProfileClick?: () => void;\r\n /**\r\n * Callback when Settings menu item is clicked\r\n */\r\n onSettingsClick?: () => void;\r\n /**\r\n * Callback when Help & Support menu item is clicked\r\n */\r\n onHelpSupportClick?: () => void;\r\n}\r\n\r\n/**\r\n * TopBar - Global topbar component\r\n * \r\n * Props-driven component that accepts logo, navigation items, user info, and more\r\n * via props for maximum reusability\r\n */\r\nconst TopBar = React.forwardRef<HTMLDivElement, TopBarProps>(\r\n ({ \r\n logo,\r\n navItems = [],\r\n moreItems = [],\r\n user,\r\n activeItemId: controlledActiveItemId,\r\n onActiveItemChange,\r\n onNavigate,\r\n onMobileMenuToggle,\r\n onLogout,\r\n onProfileClick,\r\n onSettingsClick,\r\n onHelpSupportClick,\r\n className,\r\n ...props \r\n }, ref) => {\r\n const [showMoreDropdown, setShowMoreDropdown] = React.useState(false);\r\n const [showNavMenu, setShowNavMenu] = React.useState(false);\r\n const [showThemeDialog, setShowThemeDialog] = React.useState(false);\r\n const [showNotificationDialog, setShowNotificationDialog] = React.useState(false);\r\n const [internalActiveItemId, setInternalActiveItemId] = React.useState<string | null>(null);\r\n const moreRef = React.useRef<HTMLButtonElement>(null);\r\n const navMenuRef = React.useRef<HTMLButtonElement>(null);\r\n\r\n // Use controlled or uncontrolled active item\r\n const activeItemId = controlledActiveItemId !== undefined \r\n ? controlledActiveItemId \r\n : internalActiveItemId;\r\n\r\n const setActiveItemId = (id: string | null) => {\r\n if (controlledActiveItemId === undefined) {\r\n setInternalActiveItemId(id);\r\n }\r\n onActiveItemChange?.(id);\r\n };\r\n\r\n const handleClick = (href: string, itemId?: string) => {\r\n // Set active item if it's a main nav item\r\n if (itemId) {\r\n setActiveItemId(itemId);\r\n }\r\n onNavigate?.(href);\r\n };\r\n\r\n const handleLogoClick = () => {\r\n setActiveItemId(null);\r\n onNavigate?.(logo?.href || '/');\r\n };\r\n\r\n return (\r\n <header\r\n ref={ref}\r\n className={cn(\r\n 'h-[68px] bg-background border-b border-border flex items-center justify-between px-4 lg:px-6 flex-shrink-0',\r\n className\r\n )}\r\n {...props}\r\n >\r\n {/* Left: Logo + Mobile Menu Button */}\r\n <div className=\"flex items-center gap-3\">\r\n {/* Mobile Hamburger Menu */}\r\n <button\r\n onClick={onMobileMenuToggle}\r\n className=\"lg:hidden w-10 h-10 rounded-lg flex items-center justify-center text-muted-foreground hover:text-foreground hover:bg-muted transition-all duration-200\"\r\n aria-label=\"Toggle sidebar\"\r\n >\r\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 6h16M4 12h16M4 18h16\" />\r\n </svg>\r\n </button>\r\n\r\n {/* Logo - Clickable to navigate to home */}\r\n <button\r\n onClick={handleLogoClick}\r\n className=\"flex items-center gap-3 hover:opacity-80 transition-opacity cursor-pointer\"\r\n >\r\n {/* Logo Icon */}\r\n {logo?.icon ? (\r\n <div className=\"w-10 h-10 rounded-[10px] bg-[#2563EB] flex items-center justify-center flex-shrink-0\">\r\n {logo.icon}\r\n </div>\r\n ) : (\r\n <div className=\"w-10 h-10 rounded-[10px] bg-[#2563EB] flex items-center justify-center flex-shrink-0\">\r\n <svg className=\"w-5 h-5 text-white\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path d=\"M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5\" />\r\n </svg>\r\n </div>\r\n )}\r\n {/* Logo Text */}\r\n {logo?.text && (\r\n <span className=\"font-lego text-[24px] lg:text-[28px] tracking-tight hidden sm:block whitespace-nowrap\">\r\n {logo.text}\r\n </span>\r\n )}\r\n </button>\r\n </div>\r\n\r\n {/* Tablet Navigation Menu Button */}\r\n <div className=\"hidden md:block lg:hidden relative flex-1 flex justify-center px-4\">\r\n <button\r\n ref={navMenuRef}\r\n onClick={() => setShowNavMenu(!showNavMenu)}\r\n className=\"h-9 px-4 rounded-lg text-sm font-medium bg-muted text-muted-foreground hover:text-foreground hover:bg-muted/80 transition-all duration-200 flex items-center gap-2\"\r\n >\r\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2V6zM14 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2V6zM4 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2v-2zM14 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2v-2z\" />\r\n </svg>\r\n <span>Menu</span>\r\n </button>\r\n\r\n {showNavMenu && (\r\n <>\r\n <div\r\n className=\"fixed inset-0 z-10\"\r\n onClick={() => setShowNavMenu(false)}\r\n />\r\n <div className=\"absolute left-0 mt-2 w-56 bg-background rounded-xl shadow-lg border border-border py-2 z-20\">\r\n {navItems.map((item) => {\r\n const isActive = activeItemId === item.id;\r\n return (\r\n <button\r\n key={item.id}\r\n onClick={() => {\r\n handleClick(item.href, item.id);\r\n setShowNavMenu(false);\r\n }}\r\n className={cn(\r\n 'w-full px-4 py-2.5 text-left text-sm font-medium transition-colors',\r\n isActive\r\n ? 'bg-muted text-foreground'\r\n : 'text-muted-foreground hover:bg-muted hover:text-foreground'\r\n )}\r\n >\r\n {item.label}\r\n </button>\r\n );\r\n })}\r\n {moreItems.length > 0 && (\r\n <>\r\n <div className=\"border-t border-border mt-1 pt-1\">\r\n {moreItems.map((item) => (\r\n <button\r\n key={item.id}\r\n onClick={() => {\r\n handleClick(item.href);\r\n setShowNavMenu(false);\r\n }}\r\n className=\"w-full px-4 py-2 text-left text-sm text-muted-foreground hover:bg-muted hover:text-foreground transition-colors\"\r\n >\r\n {item.label}\r\n </button>\r\n ))}\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n\r\n {/* Center: System Navigation */}\r\n <div className=\"hidden lg:flex flex-1 justify-center px-4\">\r\n <div className=\"flex items-center bg-muted rounded-xl p-1 gap-1\">\r\n {navItems.map((item) => {\r\n const isActive = activeItemId === item.id;\r\n return (\r\n <button\r\n key={item.id}\r\n onClick={() => handleClick(item.href, item.id)}\r\n className={cn(\r\n 'h-9 px-4 rounded-lg text-sm font-medium transition-all duration-200 whitespace-nowrap',\r\n isActive\r\n ? 'bg-background text-foreground shadow-sm'\r\n : 'text-muted-foreground hover:text-foreground hover:bg-background/50'\r\n )}\r\n >\r\n {item.label}\r\n </button>\r\n );\r\n })}\r\n\r\n {/* More Dropdown */}\r\n {moreItems.length > 0 && (\r\n <div className=\"relative\">\r\n <button\r\n ref={moreRef}\r\n onClick={() => setShowMoreDropdown(!showMoreDropdown)}\r\n className=\"h-9 px-3 rounded-lg text-sm font-medium text-muted-foreground hover:text-foreground hover:bg-background/50 transition-all duration-200 flex items-center gap-1\"\r\n >\r\n <span>More</span>\r\n <svg\r\n className={cn(\r\n 'w-4 h-4 transition-transform duration-200',\r\n showMoreDropdown && 'rotate-180'\r\n )}\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\r\n </svg>\r\n </button>\r\n\r\n {showMoreDropdown && (\r\n <>\r\n <div\r\n className=\"fixed inset-0 z-10\"\r\n onClick={() => setShowMoreDropdown(false)}\r\n />\r\n <div className=\"absolute right-0 mt-2 w-48 bg-background rounded-xl shadow-lg border border-border py-2 z-20\">\r\n {moreItems.map((item) => (\r\n <button\r\n key={item.id}\r\n onClick={() => {\r\n handleClick(item.href);\r\n setShowMoreDropdown(false);\r\n }}\r\n className=\"w-full px-4 py-2 text-left text-sm text-muted-foreground hover:bg-muted hover:text-foreground transition-colors\"\r\n >\r\n {item.label}\r\n </button>\r\n ))}\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Right: Utilities */}\r\n <div className=\"flex items-center gap-1 sm:gap-2\">\r\n {/* Theme Toggle */}\r\n <ThemeToggle className=\"hidden sm:flex\" />\r\n\r\n {/* Fullscreen Button */}\r\n <button\r\n className=\"hidden sm:flex w-10 h-10 rounded-lg items-center justify-center text-muted-foreground hover:text-foreground hover:bg-muted transition-all duration-200\"\r\n onClick={() => {\r\n if (document.fullscreenElement) {\r\n document.exitFullscreen();\r\n } else {\r\n document.documentElement.requestFullscreen();\r\n }\r\n }}\r\n aria-label=\"Toggle fullscreen\"\r\n >\r\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 8V4m0 0h4M4 4l5 5m11-1V4m0 0h-4m4 0l-5 5M4 16v4m0 0h4m-4 0l5-5m11 5l-5-5m5 5v-4m0 4h-4\" />\r\n </svg>\r\n </button>\r\n\r\n {/* Mobile Navigation Menu */}\r\n <div className=\"md:hidden relative\">\r\n <button\r\n ref={navMenuRef}\r\n onClick={() => setShowNavMenu(!showNavMenu)}\r\n className=\"w-10 h-10 rounded-lg flex items-center justify-center text-muted-foreground hover:text-foreground hover:bg-muted transition-all duration-200\"\r\n aria-label=\"Menu\"\r\n >\r\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2V6zM14 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2V6zM4 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2v-2zM14 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2v-2z\" />\r\n </svg>\r\n </button>\r\n\r\n {showNavMenu && (\r\n <>\r\n <div\r\n className=\"fixed inset-0 z-10\"\r\n onClick={() => setShowNavMenu(false)}\r\n />\r\n <div className=\"absolute right-0 mt-2 w-56 bg-background rounded-xl shadow-lg border border-border py-2 z-20\">\r\n {navItems.map((item) => {\r\n const isActive = activeItemId === item.id;\r\n return (\r\n <button\r\n key={item.id}\r\n onClick={() => {\r\n handleClick(item.href, item.id);\r\n setShowNavMenu(false);\r\n }}\r\n className={cn(\r\n 'w-full px-4 py-2.5 text-left text-sm font-medium transition-colors',\r\n isActive\r\n ? 'bg-muted text-foreground'\r\n : 'text-muted-foreground hover:bg-muted hover:text-foreground'\r\n )}\r\n >\r\n {item.label}\r\n </button>\r\n );\r\n })}\r\n {moreItems.length > 0 && (\r\n <>\r\n <div className=\"border-t border-border mt-1 pt-1\">\r\n {moreItems.map((item) => (\r\n <button\r\n key={item.id}\r\n onClick={() => {\r\n handleClick(item.href);\r\n setShowNavMenu(false);\r\n }}\r\n className=\"w-full px-4 py-2 text-left text-sm text-muted-foreground hover:bg-muted hover:text-foreground transition-colors\"\r\n >\r\n {item.label}\r\n </button>\r\n ))}\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n\r\n {/* Theme Customizer */}\r\n <button\r\n onClick={() => setShowThemeDialog(true)}\r\n className=\"hidden md:flex w-10 h-10 rounded-lg items-center justify-center text-muted-foreground hover:text-foreground hover:bg-muted transition-all duration-200\"\r\n aria-label=\"Theme customizer\"\r\n >\r\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 5a1 1 0 011-1h14a1 1 0 011 1v2a1 1 0 01-1 1H5a1 1 0 01-1-1V5zM4 13a1 1 0 011-1h6a1 1 0 011 1v6a1 1 0 01-1 1H5a1 1 0 01-1-1v-6zM16 13a1 1 0 011-1h2a1 1 0 011 1v6a1 1 0 01-1 1h-2a1 1 0 01-1-1v-6z\" />\r\n </svg>\r\n </button>\r\n\r\n {/* Notifications Button */}\r\n <button\r\n onClick={() => setShowNotificationDialog(true)}\r\n className=\"w-10 h-10 rounded-lg flex items-center justify-center text-muted-foreground hover:text-foreground hover:bg-muted transition-all duration-200 relative\"\r\n >\r\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9\" />\r\n </svg>\r\n <span className=\"absolute top-2 right-2 w-2 h-2 bg-red-500 rounded-full\" />\r\n </button>\r\n\r\n {/* Profile Dropdown */}\r\n <div className=\"pl-2 sm:pl-3 border-l border-border ml-1 sm:ml-2\">\r\n <ProfileDropdown \r\n user={user ? { name: user.name, email: user.email, avatar: user.avatar } : undefined}\r\n onLogout={onLogout}\r\n onProfileClick={onProfileClick}\r\n onSettingsClick={onSettingsClick}\r\n onHelpSupportClick={onHelpSupportClick}\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* Theme Customizer Dialog */}\r\n <DialogContent\r\n isOpen={showThemeDialog}\r\n onClose={() => setShowThemeDialog(false)}\r\n >\r\n <DialogHeader>\r\n <div className=\"w-12 h-12 rounded-full bg-primary/10 flex items-center justify-center mb-4\">\r\n <svg className=\"w-6 h-6 text-primary\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 5a1 1 0 011-1h14a1 1 0 011 1v2a1 1 0 01-1 1H5a1 1 0 01-1-1V5zM4 13a1 1 0 011-1h6a1 1 0 011 1v6a1 1 0 01-1 1H5a1 1 0 01-1-1v-6zM16 13a1 1 0 011-1h2a1 1 0 011 1v6a1 1 0 01-1 1h-2a1 1 0 01-1-1v-6z\" />\r\n </svg>\r\n </div>\r\n <DialogTitle>Theme Customizer</DialogTitle>\r\n <DialogDescription>\r\n This feature is currently under development. Check back soon!\r\n </DialogDescription>\r\n </DialogHeader>\r\n <DialogFooter>\r\n <button\r\n onClick={() => setShowThemeDialog(false)}\r\n className=\"px-4 py-2 bg-primary text-primary-foreground rounded-lg text-sm font-medium hover:bg-primary/90 transition-colors\"\r\n >\r\n Got it\r\n </button>\r\n </DialogFooter>\r\n </DialogContent>\r\n\r\n {/* Notifications Dialog */}\r\n <DialogContent\r\n isOpen={showNotificationDialog}\r\n onClose={() => setShowNotificationDialog(false)}\r\n >\r\n <DialogHeader>\r\n <div className=\"w-12 h-12 rounded-full bg-primary/10 flex items-center justify-center mb-4\">\r\n <svg className=\"w-6 h-6 text-primary\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9\" />\r\n </svg>\r\n </div>\r\n <DialogTitle>Notifications</DialogTitle>\r\n <DialogDescription>\r\n Notifications feature is currently under development. Check back soon!\r\n </DialogDescription>\r\n </DialogHeader>\r\n <DialogFooter>\r\n <button\r\n onClick={() => setShowNotificationDialog(false)}\r\n className=\"px-4 py-2 bg-primary text-primary-foreground rounded-lg text-sm font-medium hover:bg-primary/90 transition-colors\"\r\n >\r\n Got it\r\n </button>\r\n </DialogFooter>\r\n </DialogContent>\r\n </header>\r\n );\r\n }\r\n);\r\n\r\nTopBar.displayName = 'TopBar';\r\n\r\nexport { TopBar };\r\n","import * as React from 'react';\r\nimport { cn } from '../lib/utils';\r\n\r\nexport interface ProfileDropdownProps extends React.HTMLAttributes<HTMLDivElement> {\r\n user?: {\r\n name?: string;\r\n email?: string;\r\n avatar?: string;\r\n };\r\n onLogout?: () => void;\r\n onProfileClick?: () => void;\r\n onSettingsClick?: () => void;\r\n onHelpSupportClick?: () => void;\r\n}\r\n\r\n/**\r\n * ProfileDropdown - User profile dropdown menu.\r\n * Shows avatar/name and dropdown with options.\r\n */\r\nconst ProfileDropdown = React.forwardRef<HTMLDivElement, ProfileDropdownProps>(\r\n ({ user, onLogout, onProfileClick, onSettingsClick, onHelpSupportClick, className, ...props }, ref) => {\r\n const [isOpen, setIsOpen] = React.useState(false);\r\n const dropdownRef = React.useRef<HTMLDivElement>(null);\r\n\r\n // Close dropdown when clicking outside\r\n React.useEffect(() => {\r\n const handleClickOutside = (event: MouseEvent) => {\r\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\r\n setIsOpen(false);\r\n }\r\n };\r\n\r\n if (isOpen) {\r\n document.addEventListener('mousedown', handleClickOutside);\r\n }\r\n\r\n return () => {\r\n document.removeEventListener('mousedown', handleClickOutside);\r\n };\r\n }, [isOpen]);\r\n\r\n const initials = user?.name\r\n ? user.name\r\n .split(' ')\r\n .map((n) => n[0])\r\n .join('')\r\n .toUpperCase()\r\n .slice(0, 2)\r\n : user?.email\r\n ? user.email[0].toUpperCase()\r\n : 'U';\r\n\r\n return (\r\n <div\r\n ref={dropdownRef}\r\n className={cn('relative', className)}\r\n {...props}\r\n >\r\n <button\r\n onClick={() => setIsOpen(!isOpen)}\r\n className=\"h-10 px-3 rounded-[10px] bg-transparent flex items-center gap-2.5 text-[#64748B] hover:text-[#0F172A] hover:bg-[#F1F1F1] transition-all duration-200\"\r\n >\r\n {/* Avatar */}\r\n {!user?.avatar ? (\r\n <div className=\"w-7 h-7 rounded-full bg-gradient-to-br from-[#2563EB] to-[#7C3AED] flex items-center justify-center text-white text-xs font-semibold\">\r\n {initials}\r\n </div>\r\n ) : (\r\n <img\r\n src={user.avatar}\r\n alt={user.name || 'User'}\r\n className=\"w-7 h-7 rounded-full object-cover\"\r\n />\r\n )}\r\n\r\n {/* User Name (if available) */}\r\n {user?.name && (\r\n <span className=\"text-sm font-medium max-w-[120px] truncate\">\r\n {user.name}\r\n </span>\r\n )}\r\n\r\n {/* Chevron */}\r\n <svg\r\n className={cn(\r\n 'w-4 h-4 transition-transform duration-200 flex-shrink-0',\r\n isOpen && 'rotate-180'\r\n )}\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth={2}\r\n d=\"M19 9l-7 7-7-7\"\r\n />\r\n </svg>\r\n </button>\r\n\r\n {/* Dropdown Menu */}\r\n {isOpen && (\r\n <>\r\n <div\r\n className=\"fixed inset-0 z-10\"\r\n onClick={() => setIsOpen(false)}\r\n />\r\n <div className=\"absolute right-0 mt-2 w-56 bg-white rounded-xl shadow-lg border border-[#E7E5E4] py-2 z-20\">\r\n {/* User Info */}\r\n {user && (\r\n <div className=\"px-4 py-3 border-b border-[#E7E5E4]\">\r\n <p className=\"text-sm font-medium text-[#0F172A]\">\r\n {user.name || 'User'}\r\n </p>\r\n <p className=\"text-xs text-[#64748B] truncate\">\r\n {user.email}\r\n </p>\r\n </div>\r\n )}\r\n\r\n {/* Menu Items */}\r\n <div className=\"py-1\">\r\n <button\r\n onClick={() => {\r\n setIsOpen(false);\r\n onProfileClick?.();\r\n }}\r\n className=\"w-full px-4 py-2 text-left text-sm text-[#64748B] hover:bg-[#F1F1F1] hover:text-[#0F172A] transition-colors flex items-center gap-3\"\r\n >\r\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z\" />\r\n </svg>\r\n Profile\r\n </button>\r\n <button\r\n onClick={() => {\r\n setIsOpen(false);\r\n onSettingsClick?.();\r\n }}\r\n className=\"w-full px-4 py-2 text-left text-sm text-[#64748B] hover:bg-[#F1F1F1] hover:text-[#0F172A] transition-colors flex items-center gap-3\"\r\n >\r\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z\" />\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\r\n </svg>\r\n Settings\r\n </button>\r\n <button\r\n onClick={() => {\r\n setIsOpen(false);\r\n onHelpSupportClick?.();\r\n }}\r\n className=\"w-full px-4 py-2 text-left text-sm text-[#64748B] hover:bg-[#F1F1F1] hover:text-[#0F172A] transition-colors flex items-center gap-3\"\r\n >\r\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8.228 9c.549-1.165 2.03-2 3.772-2 2.21 0 4 1.343 4 3 0 1.4-1.278 2.575-3.006 2.907-.542.104-.994.54-.994 1.093m0 3h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\r\n </svg>\r\n Help & Support\r\n </button>\r\n </div>\r\n\r\n {/* Logout */}\r\n {user && (\r\n <div className=\"pt-1 border-t border-[#E7E5E4]\">\r\n <button\r\n onClick={() => {\r\n console.log('Logout clicked');\r\n setIsOpen(false);\r\n onLogout?.();\r\n }}\r\n className=\"w-full px-4 py-2 text-left text-sm text-red-600 hover:bg-red-50 transition-colors flex items-center gap-3\"\r\n >\r\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1\" />\r\n </svg>\r\n Logout\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nProfileDropdown.displayName = 'ProfileDropdown';\r\n\r\nexport { ProfileDropdown };\r\n","import * as React from 'react';\r\nimport { cn } from '../lib/utils';\r\n\r\nexport interface ThemeToggleProps extends React.HTMLAttributes<HTMLButtonElement> {}\r\n\r\n/**\r\n * ThemeToggle - Toggle between light and dark themes.\r\n * 40px square button with icon.\r\n * Persists theme preference to localStorage.\r\n */\r\nconst ThemeToggle = React.forwardRef<HTMLButtonElement, ThemeToggleProps>(\r\n ({ className, ...props }, ref) => {\r\n const [theme, setTheme] = React.useState<'light' | 'dark'>('light');\r\n const [mounted, setMounted] = React.useState(false);\r\n\r\n React.useEffect(() => {\r\n setMounted(true);\r\n \r\n // Check localStorage first\r\n const storedTheme = localStorage.getItem('theme') as 'light' | 'dark' | null;\r\n \r\n if (storedTheme) {\r\n setTheme(storedTheme);\r\n const root = document.documentElement;\r\n if (storedTheme === 'dark') {\r\n root.classList.add('dark');\r\n } else {\r\n root.classList.remove('dark');\r\n }\r\n } else {\r\n // Default to light mode (no system preference check)\r\n setTheme('light');\r\n document.documentElement.classList.remove('dark');\r\n }\r\n }, []);\r\n\r\n const toggleTheme = () => {\r\n const root = document.documentElement;\r\n const newTheme = theme === 'light' ? 'dark' : 'light';\r\n setTheme(newTheme);\r\n\r\n if (newTheme === 'dark') {\r\n root.classList.add('dark');\r\n } else {\r\n root.classList.remove('dark');\r\n }\r\n \r\n // Save to localStorage\r\n localStorage.setItem('theme', newTheme);\r\n };\r\n\r\n // Prevent hydration mismatch\r\n if (!mounted) {\r\n return (\r\n <button\r\n ref={ref}\r\n className={cn(\r\n 'w-10 h-10 rounded-[10px] bg-[#F1F1F1] flex items-center justify-center text-[#64748B] hover:text-[#0F172A] hover:bg-[#E5E5E5] transition-all duration-200',\r\n className\r\n )}\r\n aria-label=\"Toggle theme\"\r\n {...props}\r\n >\r\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth={2}\r\n d=\"M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z\"\r\n />\r\n </svg>\r\n </button>\r\n );\r\n }\r\n\r\n return (\r\n <button\r\n ref={ref}\r\n onClick={toggleTheme}\r\n className={cn(\r\n 'w-10 h-10 rounded-[10px] bg-muted flex items-center justify-center text-muted-foreground hover:text-foreground hover:bg-muted/80 transition-all duration-200',\r\n className\r\n )}\r\n aria-label=\"Toggle theme\"\r\n {...props}\r\n >\r\n {theme === 'light' ? (\r\n // Moon icon for dark mode\r\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth={2}\r\n d=\"M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z\"\r\n />\r\n </svg>\r\n ) : (\r\n // Sun icon for light mode\r\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth={2}\r\n d=\"M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z\"\r\n />\r\n </svg>\r\n )}\r\n </button>\r\n );\r\n }\r\n);\r\n\r\nThemeToggle.displayName = 'ThemeToggle';\r\n\r\nexport { ThemeToggle };\r\n","import * as React from 'react';\nimport { cn } from '../lib/utils';\n\nexport interface MenuItem {\n id: string;\n label: string;\n href?: string;\n icon?: React.ReactNode;\n children?: MenuItem[];\n}\n\nexport interface SideNavProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Menu items to display in the sidebar\n */\n menuItems?: MenuItem[];\n /**\n * Header title displayed at the top of the sidebar\n */\n headerTitle?: string;\n /**\n * Support section configuration\n */\n supportSection?: {\n title: string;\n subtitle: string;\n buttonText: string;\n icon?: React.ReactNode;\n onClick?: () => void;\n } | null;\n /**\n * Callback for navigation\n */\n onNavigate?: (href: string) => void;\n /**\n * Callback when sidebar collapse state changes\n */\n onCollapseChange?: (collapsed: boolean) => void;\n /**\n * Whether the sidebar is collapsed\n */\n collapsed?: boolean;\n /**\n * Initially expanded section IDs\n */\n defaultExpandedSections?: string[];\n}\n\n/**\n * SideNav - Sidebar navigation component\n * \n * Props-driven component that accepts menu items, header title, and support section\n * via props for maximum reusability\n */\nconst SideNav = React.forwardRef<HTMLDivElement, SideNavProps>(\n ({ \n menuItems = [], \n headerTitle = 'Application',\n supportSection,\n onNavigate, \n onCollapseChange, \n collapsed = false,\n defaultExpandedSections = [],\n className, \n ...props \n }, ref) => {\n const [isCollapsed, setIsCollapsed] = React.useState(collapsed);\n const [expandedSections, setExpandedSections] = React.useState<Set<string>>(\n new Set(defaultExpandedSections)\n );\n\n React.useEffect(() => {\n setIsCollapsed(collapsed);\n }, [collapsed]);\n\n const toggleCollapse = () => {\n const newState = !isCollapsed;\n setIsCollapsed(newState);\n onCollapseChange?.(newState);\n };\n\n const toggleSection = (id: string) => {\n setExpandedSections((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 return (\n <nav\n ref={ref}\n className={cn(\n 'flex flex-col h-full bg-background transition-all duration-300',\n isCollapsed ? 'w-[72px]' : 'w-[260px]',\n className\n )}\n {...props}\n >\n {/* Header - Application label with collapse button */}\n <div className=\"flex items-center justify-between px-4 py-4 border-b border-border\">\n {!isCollapsed && headerTitle && (\n <span className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wider\">\n {headerTitle}\n </span>\n )}\n <button\n onClick={toggleCollapse}\n className=\"w-8 h-8 rounded-lg hidden lg:flex items-center justify-center text-muted-foreground hover:text-foreground hover:bg-muted transition-all duration-200\"\n title={isCollapsed ? 'Expand sidebar' : 'Collapse sidebar'}\n >\n <svg\n className={cn(\n 'w-5 h-5 transition-transform duration-200',\n isCollapsed && 'rotate-180'\n )}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M11 19l-7-7 7-7m8 14l-7-7 7-7\" />\n </svg>\n </button>\n </div>\n\n {/* Menu Container */}\n <div className=\"flex-1 overflow-y-auto py-4\">\n {menuItems.map((item) => (\n <div key={item.id} className=\"mb-1\">\n {item.children ? (\n <>\n {/* Section with children */}\n <button\n onClick={() => toggleSection(item.id)}\n className={cn(\n 'w-full flex items-center justify-between px-4 py-2.5 text-sm font-medium text-muted-foreground hover:text-foreground hover:bg-muted transition-colors',\n isCollapsed && 'justify-center px-2'\n )}\n >\n <div className={cn('flex items-center gap-3', isCollapsed && 'gap-0')}>\n {item.icon && (\n <span className=\"w-5 h-5 flex-shrink-0\">{item.icon}</span>\n )}\n {!isCollapsed && <span>{item.label}</span>}\n </div>\n {!isCollapsed && (\n <svg\n className={cn(\n 'w-4 h-4 transition-transform duration-200 flex-shrink-0',\n expandedSections.has(item.id) && 'rotate-180'\n )}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n )}\n </button>\n\n {/* Nested Items */}\n {!isCollapsed && expandedSections.has(item.id) && (\n <div className=\"mt-1 space-y-[2px] pl-4\">\n {item.children.map((child) => (\n <button\n key={child.id}\n onClick={() => child.href && onNavigate?.(child.href)}\n className={cn(\n 'w-full px-4 py-2 flex items-center gap-3 text-sm transition-colors rounded-lg',\n 'text-muted-foreground hover:text-foreground hover:bg-muted'\n )}\n >\n {child.icon && (\n <span className=\"w-4 h-4 flex-shrink-0\">{child.icon}</span>\n )}\n <span>{child.label}</span>\n </button>\n ))}\n </div>\n )}\n </>\n ) : (\n /* Single item */\n <button\n onClick={() => item.href && onNavigate?.(item.href)}\n className={cn(\n 'w-full flex items-center gap-3 px-4 py-2.5 text-sm font-medium text-muted-foreground hover:text-foreground hover:bg-muted transition-colors',\n isCollapsed && 'justify-center px-2'\n )}\n >\n {item.icon && (\n <span className=\"w-5 h-5 flex-shrink-0\">{item.icon}</span>\n )}\n {!isCollapsed && <span>{item.label}</span>}\n </button>\n )}\n </div>\n ))}\n </div>\n\n {/* Support Section - At bottom of sidebar */}\n {!isCollapsed && supportSection && (\n <div className=\"p-4 border-t border-border\">\n <div className=\"bg-muted/50 rounded-xl p-4\">\n <div className=\"flex items-start gap-3 mb-3\">\n {supportSection.icon && (\n <div className=\"w-8 h-8 rounded-full bg-primary/10 flex items-center justify-center flex-shrink-0\">\n {supportSection.icon}\n </div>\n )}\n <div>\n <p className=\"text-sm font-semibold text-foreground\">{supportSection.title}</p>\n <p className=\"text-xs text-muted-foreground mt-0.5\">{supportSection.subtitle}</p>\n </div>\n </div>\n <button \n onClick={supportSection.onClick}\n className=\"w-full py-2.5 px-4 bg-[#2563EB] text-white text-sm font-medium rounded-lg hover:bg-[#1D4ED8] transition-colors flex items-center justify-center gap-2\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z\" />\n </svg>\n {supportSection.buttonText}\n </button>\n </div>\n </div>\n )}\n </nav>\n );\n }\n);\n\nSideNav.displayName = 'SideNav';\n\nexport { SideNav };\n","import * as React from 'react';\nimport { cn } from '../lib/utils';\n\nexport interface WelcomeBannerProps extends React.HTMLAttributes<HTMLDivElement> {\n userName?: string;\n subtitle?: string;\n badge?: string;\n}\n\n/**\n * WelcomeBanner - Hero section with user personalization\n * \n * Features gradient background, backdrop blur, and theme-aware styling\n */\nconst WelcomeBanner = React.forwardRef<HTMLDivElement, WelcomeBannerProps>(\n ({ className, userName = 'Developer', subtitle, badge = 'Lego Box Portal', ...props }, ref) => {\n return (\n <section\n ref={ref}\n className={cn(\n 'relative overflow-hidden rounded-2xl',\n 'bg-gradient-to-br from-blue-600 via-blue-700 to-indigo-800',\n 'text-white p-8 lg:p-12',\n className\n )}\n {...props}\n >\n {/* Background Pattern */}\n <div \n className=\"absolute inset-0 opacity-20\"\n style={{\n backgroundImage: `url(\"data:image/svg+xml,%3Csvg width='60' height='60' viewBox='0 0 60 60' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cg fill='%23ffffff' fill-opacity='0.05'%3E%3Cpath d='M36 34v-4h-2v4h-4v2h4v4h2v-4h4v-2h-4zm0-30V0h-2v4h-4v2h4v4h2V6h4V4h-4zM6 34v-4H4v4H0v2h4v4h2v-4h4v-2H6zM6 4V0H4v4H0v2h4v4h2V6h4V4H6z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E\")`,\n }}\n />\n \n <div className=\"relative\">\n {/* Badge */}\n <div className=\"flex items-center gap-3 mb-4\">\n <div className=\"w-12 h-12 rounded-[10px] bg-white/20 backdrop-blur-sm flex items-center justify-center\">\n <svg className=\"w-6 h-6 text-white\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5\" />\n </svg>\n </div>\n {badge && (\n <span className=\"text-sm font-medium bg-white/20 backdrop-blur-sm px-3 py-1 rounded-full\">\n {badge}\n </span>\n )}\n </div>\n \n {/* Title */}\n <h1 className=\"text-3xl lg:text-4xl font-bold mb-3\">\n Welcome back, {userName}!\n </h1>\n \n {/* Subtitle */}\n {subtitle && (\n <p className=\"text-blue-100 text-lg max-w-2xl\">\n {subtitle}\n </p>\n )}\n </div>\n </section>\n );\n }\n);\n\nWelcomeBanner.displayName = 'WelcomeBanner';\n\nexport { WelcomeBanner };\n","import * as React from 'react';\nimport { cn } from '../lib/utils';\n\nexport interface TechStackCardProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {\n name: string;\n description: string;\n icon: React.ReactNode;\n}\n\n/**\n * TechStackCard - Technology stack item with external link\n * \n * Features hover effects, external link indicator, and theme-aware styling\n */\nconst TechStackCard = React.forwardRef<HTMLAnchorElement, TechStackCardProps>(\n ({ className, name, description, icon, ...props }, ref) => {\n return (\n <a\n ref={ref}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\n 'group block',\n 'bg-card border border-border rounded-xl p-5',\n 'hover:shadow-lg hover:border-primary/30',\n 'transition-all duration-200',\n className\n )}\n {...props}\n >\n <div className=\"flex items-start gap-4\">\n <div className={cn(\n 'flex-shrink-0 w-12 h-12 rounded-xl',\n 'bg-muted flex items-center justify-center',\n 'group-hover:bg-primary/10 transition-colors'\n )}>\n {icon}\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <h3 className={cn(\n 'font-semibold',\n 'text-card-foreground',\n 'group-hover:text-primary transition-colors'\n )}>\n {name}\n </h3>\n <svg \n className={cn(\n 'w-4 h-4 text-muted-foreground',\n 'opacity-0 group-hover:opacity-100',\n 'transition-opacity'\n )} \n fill=\"none\" \n stroke=\"currentColor\" \n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14\" />\n </svg>\n </div>\n <p className=\"text-sm text-muted-foreground mt-1 line-clamp-2\">\n {description}\n </p>\n </div>\n </div>\n </a>\n );\n }\n);\n\nTechStackCard.displayName = 'TechStackCard';\n\nexport { TechStackCard };\n","import * as React from 'react';\nimport { cn } from '../lib/utils';\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from './card';\n\nexport interface FeatureCardProps extends React.HTMLAttributes<HTMLDivElement> {\n title: string;\n description?: string;\n icon?: React.ReactNode;\n iconClassName?: string;\n variant?: 'default' | 'primary' | 'secondary';\n children?: React.ReactNode;\n}\n\n/**\n * FeatureCard - Reusable card for displaying features/info\n * \n * Supports different color variants and theme-aware styling\n */\nconst FeatureCard = React.forwardRef<HTMLDivElement, FeatureCardProps>(\n ({ className, title, description, icon, iconClassName, variant = 'default', children, ...props }, ref) => {\n const variantStyles = {\n default: {\n card: 'border-border',\n icon: 'bg-muted text-muted-foreground',\n },\n primary: {\n card: 'border-primary/20',\n icon: 'bg-primary/10 text-primary',\n },\n secondary: {\n card: 'border-secondary/20',\n icon: 'bg-secondary/10 text-secondary',\n },\n };\n\n const styles = variantStyles[variant];\n\n return (\n <Card \n ref={ref} \n className={cn(styles.card, className)} \n {...props}\n >\n <CardHeader>\n <div className=\"flex items-center gap-3\">\n {icon && (\n <div className={cn(\n 'w-10 h-10 rounded-lg flex items-center justify-center',\n styles.icon,\n iconClassName\n )}>\n {icon}\n </div>\n )}\n <CardTitle>{title}</CardTitle>\n </div>\n {description && (\n <CardDescription className=\"text-base mt-2\">\n {description}\n </CardDescription>\n )}\n </CardHeader>\n {children && (\n <CardContent>\n {children}\n </CardContent>\n )}\n </Card>\n );\n }\n);\n\nFeatureCard.displayName = 'FeatureCard';\n\nexport { FeatureCard };\n","import * as React from 'react';\nimport { cn } from '../lib/utils';\n\nexport interface LoadingProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Size of the loading spinner\n */\n size?: 'sm' | 'md' | 'lg';\n /**\n * Message to display below the spinner\n */\n message?: string;\n /**\n * Whether to show the full page overlay\n */\n fullPage?: boolean;\n}\n\n/**\n * Loading - Professional loading component with animated spinner\n * \n * Features gradient background matching the Lego Box design system,\n * smooth animations, and theme-aware styling\n */\nconst Loading = React.forwardRef<HTMLDivElement, LoadingProps>(\n ({ className, size = 'md', message = 'Loading...', fullPage = true, ...props }, ref) => {\n const sizeClasses = {\n sm: 'w-8 h-8',\n md: 'w-12 h-12',\n lg: 'w-16 h-16',\n };\n\n const content = (\n <div\n ref={ref}\n className={cn(\n 'flex flex-col items-center justify-center',\n fullPage ? 'min-h-screen' : 'p-8',\n className\n )}\n {...props}\n >\n {/* Logo/Brand */}\n <div className=\"mb-8\">\n <div className=\"w-16 h-16 rounded-[12px] bg-gradient-to-br from-blue-600 via-blue-700 to-indigo-800 flex items-center justify-center shadow-lg\">\n <svg className=\"w-8 h-8 text-white\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5\" />\n </svg>\n </div>\n </div>\n\n {/* Spinner Container */}\n <div className=\"relative\">\n {/* Outer Ring */}\n <div\n className={cn(\n sizeClasses[size],\n 'rounded-full border-4 border-muted'\n )}\n />\n \n {/* Animated Spinner */}\n <div\n className={cn(\n sizeClasses[size],\n 'absolute top-0 left-0 rounded-full border-4 border-transparent',\n 'border-t-blue-600 border-r-blue-600',\n 'animate-spin'\n )}\n style={{ animationDuration: '1s' }}\n />\n </div>\n\n {/* Message */}\n {message && (\n <p className=\"mt-6 text-muted-foreground text-lg font-medium animate-pulse\">\n {message}\n </p>\n )}\n\n {/* Loading Dots */}\n <div className=\"mt-2 flex items-center gap-1\">\n <div className=\"w-2 h-2 rounded-full bg-blue-600 animate-bounce\" style={{ animationDelay: '0ms' }} />\n <div className=\"w-2 h-2 rounded-full bg-blue-600 animate-bounce\" style={{ animationDelay: '150ms' }} />\n <div className=\"w-2 h-2 rounded-full bg-blue-600 animate-bounce\" style={{ animationDelay: '300ms' }} />\n </div>\n </div>\n );\n\n if (fullPage) {\n return (\n <div className=\"fixed inset-0 bg-background z-50 flex items-center justify-center\">\n {content}\n </div>\n );\n }\n\n return content;\n }\n);\n\nLoading.displayName = 'Loading';\n\nexport { Loading };\n","import * as React from 'react';\nimport { cn } from '../lib/utils';\n\nexport interface NotFoundProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Title text for the 404 page\n */\n title?: string;\n /**\n * Description message\n */\n description?: string;\n /**\n * Callback when home button is clicked\n */\n onNavigateHome?: () => void;\n /**\n * Home button text\n */\n homeButtonText?: string;\n}\n\n/**\n * NotFound - Professional 404 error page component\n * \n * Features animated 404 display, gradient styling matching Lego Box design system,\n * glassmorphism effects, and clear navigation options\n */\nconst NotFound = React.forwardRef<HTMLDivElement, NotFoundProps>(\n ({ \n className, \n title = 'Page Not Found',\n description = \"Oops! The page you're looking for doesn't exist or has been moved.\",\n onNavigateHome,\n homeButtonText = 'Go Back Home',\n ...props \n }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n 'min-h-screen flex items-center justify-center',\n 'bg-background p-6',\n className\n )}\n {...props}\n >\n <div className=\"max-w-2xl mx-auto text-center\">\n {/* Animated 404 Display */}\n <div className=\"relative mb-8\">\n {/* Background Glow Effect */}\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <div className=\"w-64 h-64 bg-gradient-to-br from-blue-600/20 via-blue-700/20 to-indigo-800/20 rounded-full blur-3xl animate-pulse\" />\n </div>\n \n {/* 404 Numbers */}\n <div className=\"relative flex items-center justify-center gap-4\">\n <span className=\"text-8xl md:text-9xl font-bold text-transparent bg-clip-text bg-gradient-to-br from-blue-600 via-blue-700 to-indigo-800 animate-bounce\" style={{ animationDuration: '2s' }}>\n 4\n </span>\n \n {/* Center Icon */}\n <div className=\"relative\">\n <div className=\"w-24 h-24 md:w-32 md:h-32 rounded-2xl bg-gradient-to-br from-blue-600 via-blue-700 to-indigo-800 flex items-center justify-center shadow-2xl animate-pulse\">\n <svg \n className=\"w-12 h-12 md:w-16 md:h-16 text-white\" \n fill=\"none\" \n stroke=\"currentColor\" \n viewBox=\"0 0 24 24\"\n >\n <path \n strokeLinecap=\"round\" \n strokeLinejoin=\"round\" \n strokeWidth={1.5} \n d=\"M9.172 16.172a4 4 0 015.656 0M9 10h.01M15 10h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" \n />\n </svg>\n </div>\n \n {/* Decorative Ring */}\n <div className=\"absolute -inset-4 border-2 border-dashed border-blue-600/30 rounded-3xl animate-spin\" style={{ animationDuration: '10s' }} />\n </div>\n \n <span className=\"text-8xl md:text-9xl font-bold text-transparent bg-clip-text bg-gradient-to-br from-blue-600 via-blue-700 to-indigo-800 animate-bounce\" style={{ animationDuration: '2s', animationDelay: '0.2s' }}>\n 4\n </span>\n </div>\n </div>\n\n {/* Brand Logo */}\n <div className=\"flex items-center justify-center gap-3 mb-6\">\n <div className=\"w-10 h-10 rounded-xl bg-gradient-to-br from-blue-600 via-blue-700 to-indigo-800 flex items-center justify-center shadow-lg\">\n <svg className=\"w-5 h-5 text-white\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5\" />\n </svg>\n </div>\n <span className=\"text-xl font-semibold text-foreground\">Lego Box</span>\n </div>\n\n {/* Title */}\n <h1 className=\"text-3xl md:text-4xl font-bold text-foreground mb-4\">\n {title}\n </h1>\n\n {/* Description */}\n <p className=\"text-lg text-muted-foreground mb-8 max-w-md mx-auto\">\n {description}\n </p>\n\n {/* Action Buttons */}\n <div className=\"flex flex-col sm:flex-row items-center justify-center gap-4\">\n {onNavigateHome && (\n <button\n onClick={onNavigateHome}\n className=\"inline-flex items-center gap-2 px-6 py-3 bg-gradient-to-r from-blue-600 to-blue-700 text-white rounded-xl font-medium shadow-lg shadow-blue-600/25 hover:shadow-xl hover:shadow-blue-600/30 transition-all duration-300 hover:-translate-y-0.5 active:translate-y-0\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6\" />\n </svg>\n {homeButtonText}\n </button>\n )}\n \n <button\n onClick={() => window.history.back()}\n className=\"inline-flex items-center gap-2 px-6 py-3 bg-muted text-foreground rounded-xl font-medium hover:bg-muted/80 transition-all duration-300 border border-border\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M10 19l-7-7m0 0l7-7m-7 7h18\" />\n </svg>\n Go Back\n </button>\n </div>\n\n {/* Decorative Elements */}\n <div className=\"mt-12 flex items-center justify-center gap-2 text-muted-foreground text-sm\">\n <span className=\"w-12 h-px bg-border\" />\n <span>Error Code: 404</span>\n <span className=\"w-12 h-px bg-border\" />\n </div>\n </div>\n </div>\n );\n }\n);\n\nNotFound.displayName = 'NotFound';\n\nexport { NotFound };\n","import * as React from 'react';\r\nimport { cn } from '../lib/utils';\r\n\r\nexport interface AccessDeniedProps extends React.HTMLAttributes<HTMLDivElement> {\r\n /**\r\n * Title text for the access denied page\r\n */\r\n title?: string;\r\n /**\r\n * Description message\r\n */\r\n description?: string;\r\n /**\r\n * Callback when home button is clicked\r\n */\r\n onNavigateHome?: () => void;\r\n /**\r\n * Home button text\r\n */\r\n homeButtonText?: string;\r\n}\r\n\r\n/**\r\n * AccessDenied - Professional access denied / 403 error page component\r\n *\r\n * Matches the NotFound design with gradient styling, Lego Box branding,\r\n * and clear navigation options\r\n */\r\nconst AccessDenied = React.forwardRef<HTMLDivElement, AccessDeniedProps>(\r\n (\r\n {\r\n className,\r\n title = 'Access Denied',\r\n description = \"You don't have permission to view this page.\",\r\n onNavigateHome,\r\n homeButtonText = 'Go Back Home',\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n return (\r\n <div\r\n ref={ref}\r\n className={cn(\r\n 'min-h-screen flex items-center justify-center',\r\n 'bg-background p-6',\r\n className\r\n )}\r\n {...props}\r\n >\r\n <div className=\"max-w-2xl mx-auto text-center\">\r\n {/* Animated 403 Display */}\r\n <div className=\"relative mb-8\">\r\n {/* Background Glow Effect */}\r\n <div className=\"absolute inset-0 flex items-center justify-center\">\r\n <div className=\"w-64 h-64 bg-gradient-to-br from-amber-500/20 via-orange-500/20 to-red-600/20 rounded-full blur-3xl animate-pulse\" />\r\n </div>\r\n\r\n {/* 403 Numbers */}\r\n <div className=\"relative flex items-center justify-center gap-4\">\r\n <span\r\n className=\"text-8xl md:text-9xl font-bold text-transparent bg-clip-text bg-gradient-to-br from-amber-500 via-orange-500 to-red-600 animate-bounce\"\r\n style={{ animationDuration: '2s' }}\r\n >\r\n 4\r\n </span>\r\n\r\n {/* Center Lock Icon */}\r\n <div className=\"relative\">\r\n <div className=\"w-24 h-24 md:w-32 md:h-32 rounded-2xl bg-gradient-to-br from-amber-500 via-orange-500 to-red-600 flex items-center justify-center shadow-2xl animate-pulse\">\r\n <svg\r\n className=\"w-12 h-12 md:w-16 md:h-16 text-white\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth={1.5}\r\n d=\"M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z\"\r\n />\r\n </svg>\r\n </div>\r\n\r\n {/* Decorative Ring */}\r\n <div\r\n className=\"absolute -inset-4 border-2 border-dashed border-amber-500/30 rounded-3xl animate-spin\"\r\n style={{ animationDuration: '10s' }}\r\n />\r\n </div>\r\n\r\n <span\r\n className=\"text-8xl md:text-9xl font-bold text-transparent bg-clip-text bg-gradient-to-br from-amber-500 via-orange-500 to-red-600 animate-bounce\"\r\n style={{ animationDuration: '2s', animationDelay: '0.2s' }}\r\n >\r\n 3\r\n </span>\r\n </div>\r\n </div>\r\n\r\n {/* Brand Logo */}\r\n <div className=\"flex items-center justify-center gap-3 mb-6\">\r\n <div className=\"w-10 h-10 rounded-xl bg-gradient-to-br from-blue-600 via-blue-700 to-indigo-800 flex items-center justify-center shadow-lg\">\r\n <svg className=\"w-5 h-5 text-white\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path d=\"M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5\" />\r\n </svg>\r\n </div>\r\n <span className=\"text-xl font-semibold text-foreground\">Lego Box</span>\r\n </div>\r\n\r\n {/* Title */}\r\n <h1 className=\"text-3xl md:text-4xl font-bold text-foreground mb-4\">\r\n {title}\r\n </h1>\r\n\r\n {/* Description */}\r\n <p className=\"text-lg text-muted-foreground mb-8 max-w-md mx-auto\">\r\n {description}\r\n </p>\r\n\r\n {/* Action Buttons */}\r\n <div className=\"flex flex-col sm:flex-row items-center justify-center gap-4\">\r\n {onNavigateHome && (\r\n <button\r\n onClick={onNavigateHome}\r\n className=\"inline-flex items-center gap-2 px-6 py-3 bg-gradient-to-r from-blue-600 to-blue-700 text-white rounded-xl font-medium shadow-lg shadow-blue-600/25 hover:shadow-xl hover:shadow-blue-600/30 transition-all duration-300 hover:-translate-y-0.5 active:translate-y-0\"\r\n >\r\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6\" />\r\n </svg>\r\n {homeButtonText}\r\n </button>\r\n )}\r\n\r\n <button\r\n onClick={() => window.history.back()}\r\n className=\"inline-flex items-center gap-2 px-6 py-3 bg-muted text-foreground rounded-xl font-medium hover:bg-muted/80 transition-all duration-300 border border-border\"\r\n >\r\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M10 19l-7-7m0 0l7-7m-7 7h18\" />\r\n </svg>\r\n Go Back\r\n </button>\r\n </div>\r\n\r\n {/* Decorative Elements */}\r\n <div className=\"mt-12 flex items-center justify-center gap-2 text-muted-foreground text-sm\">\r\n <span className=\"w-12 h-px bg-border\" />\r\n <span>Error Code: 403</span>\r\n <span className=\"w-12 h-px bg-border\" />\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nAccessDenied.displayName = 'AccessDenied';\r\n\r\nexport { AccessDenied };\r\n","\n export default function styleInject(css, { insertAt } = {}) {\n if (!css || typeof document === 'undefined') return\n \n const head = document.head || document.getElementsByTagName('head')[0]\n const style = document.createElement('style')\n style.type = 'text/css'\n \n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild)\n } else {\n head.appendChild(style)\n }\n } else {\n head.appendChild(style)\n }\n \n if (style.styleSheet) {\n style.styleSheet.cssText = css\n } else {\n style.appendChild(document.createTextNode(css))\n }\n }\n ","import styleInject from '#style-inject';styleInject(\"@import \\\"https://fonts.googleapis.com/css2?family=Fredoka:wght@400;500;600;700&display=swap\\\";\\n*,\\n::before,\\n::after {\\n --tw-border-spacing-x: 0;\\n --tw-border-spacing-y: 0;\\n --tw-translate-x: 0;\\n --tw-translate-y: 0;\\n --tw-rotate: 0;\\n --tw-skew-x: 0;\\n --tw-skew-y: 0;\\n --tw-scale-x: 1;\\n --tw-scale-y: 1;\\n --tw-pan-x: ;\\n --tw-pan-y: ;\\n --tw-pinch-zoom: ;\\n --tw-scroll-snap-strictness: proximity;\\n --tw-gradient-from-position: ;\\n --tw-gradient-via-position: ;\\n --tw-gradient-to-position: ;\\n --tw-ordinal: ;\\n --tw-slashed-zero: ;\\n --tw-numeric-figure: ;\\n --tw-numeric-spacing: ;\\n --tw-numeric-fraction: ;\\n --tw-ring-inset: ;\\n --tw-ring-offset-width: 0px;\\n --tw-ring-offset-color: #fff;\\n --tw-ring-color: rgb(59 130 246 / 0.5);\\n --tw-ring-offset-shadow: 0 0 #0000;\\n --tw-ring-shadow: 0 0 #0000;\\n --tw-shadow: 0 0 #0000;\\n --tw-shadow-colored: 0 0 #0000;\\n --tw-blur: ;\\n --tw-brightness: ;\\n --tw-contrast: ;\\n --tw-grayscale: ;\\n --tw-hue-rotate: ;\\n --tw-invert: ;\\n --tw-saturate: ;\\n --tw-sepia: ;\\n --tw-drop-shadow: ;\\n --tw-backdrop-blur: ;\\n --tw-backdrop-brightness: ;\\n --tw-backdrop-contrast: ;\\n --tw-backdrop-grayscale: ;\\n --tw-backdrop-hue-rotate: ;\\n --tw-backdrop-invert: ;\\n --tw-backdrop-opacity: ;\\n --tw-backdrop-saturate: ;\\n --tw-backdrop-sepia: ;\\n --tw-contain-size: ;\\n --tw-contain-layout: ;\\n --tw-contain-paint: ;\\n --tw-contain-style: ;\\n}\\n::backdrop {\\n --tw-border-spacing-x: 0;\\n --tw-border-spacing-y: 0;\\n --tw-translate-x: 0;\\n --tw-translate-y: 0;\\n --tw-rotate: 0;\\n --tw-skew-x: 0;\\n --tw-skew-y: 0;\\n --tw-scale-x: 1;\\n --tw-scale-y: 1;\\n --tw-pan-x: ;\\n --tw-pan-y: ;\\n --tw-pinch-zoom: ;\\n --tw-scroll-snap-strictness: proximity;\\n --tw-gradient-from-position: ;\\n --tw-gradient-via-position: ;\\n --tw-gradient-to-position: ;\\n --tw-ordinal: ;\\n --tw-slashed-zero: ;\\n --tw-numeric-figure: ;\\n --tw-numeric-spacing: ;\\n --tw-numeric-fraction: ;\\n --tw-ring-inset: ;\\n --tw-ring-offset-width: 0px;\\n --tw-ring-offset-color: #fff;\\n --tw-ring-color: rgb(59 130 246 / 0.5);\\n --tw-ring-offset-shadow: 0 0 #0000;\\n --tw-ring-shadow: 0 0 #0000;\\n --tw-shadow: 0 0 #0000;\\n --tw-shadow-colored: 0 0 #0000;\\n --tw-blur: ;\\n --tw-brightness: ;\\n --tw-contrast: ;\\n --tw-grayscale: ;\\n --tw-hue-rotate: ;\\n --tw-invert: ;\\n --tw-saturate: ;\\n --tw-sepia: ;\\n --tw-drop-shadow: ;\\n --tw-backdrop-blur: ;\\n --tw-backdrop-brightness: ;\\n --tw-backdrop-contrast: ;\\n --tw-backdrop-grayscale: ;\\n --tw-backdrop-hue-rotate: ;\\n --tw-backdrop-invert: ;\\n --tw-backdrop-opacity: ;\\n --tw-backdrop-saturate: ;\\n --tw-backdrop-sepia: ;\\n --tw-contain-size: ;\\n --tw-contain-layout: ;\\n --tw-contain-paint: ;\\n --tw-contain-style: ;\\n}\\n*,\\n::before,\\n::after {\\n box-sizing: border-box;\\n border-width: 0;\\n border-style: solid;\\n border-color: #e5e7eb;\\n}\\n::before,\\n::after {\\n --tw-content: \\\"\\\";\\n}\\nhtml,\\n:host {\\n line-height: 1.5;\\n -webkit-text-size-adjust: 100%;\\n -moz-tab-size: 4;\\n -o-tab-size: 4;\\n tab-size: 4;\\n font-family:\\n Inter,\\n system-ui,\\n sans-serif;\\n font-feature-settings: normal;\\n font-variation-settings: normal;\\n -webkit-tap-highlight-color: transparent;\\n}\\nbody {\\n margin: 0;\\n line-height: inherit;\\n}\\nhr {\\n height: 0;\\n color: inherit;\\n border-top-width: 1px;\\n}\\nabbr:where([title]) {\\n -webkit-text-decoration: underline dotted;\\n text-decoration: underline dotted;\\n}\\nh1,\\nh2,\\nh3,\\nh4,\\nh5,\\nh6 {\\n font-size: inherit;\\n font-weight: inherit;\\n}\\na {\\n color: inherit;\\n text-decoration: inherit;\\n}\\nb,\\nstrong {\\n font-weight: bolder;\\n}\\ncode,\\nkbd,\\nsamp,\\npre {\\n font-family:\\n ui-monospace,\\n SFMono-Regular,\\n Menlo,\\n Monaco,\\n Consolas,\\n \\\"Liberation Mono\\\",\\n \\\"Courier New\\\",\\n monospace;\\n font-feature-settings: normal;\\n font-variation-settings: normal;\\n font-size: 1em;\\n}\\nsmall {\\n font-size: 80%;\\n}\\nsub,\\nsup {\\n font-size: 75%;\\n line-height: 0;\\n position: relative;\\n vertical-align: baseline;\\n}\\nsub {\\n bottom: -0.25em;\\n}\\nsup {\\n top: -0.5em;\\n}\\ntable {\\n text-indent: 0;\\n border-color: inherit;\\n border-collapse: collapse;\\n}\\nbutton,\\ninput,\\noptgroup,\\nselect,\\ntextarea {\\n font-family: inherit;\\n font-feature-settings: inherit;\\n font-variation-settings: inherit;\\n font-size: 100%;\\n font-weight: inherit;\\n line-height: inherit;\\n letter-spacing: inherit;\\n color: inherit;\\n margin: 0;\\n padding: 0;\\n}\\nbutton,\\nselect {\\n text-transform: none;\\n}\\nbutton,\\ninput:where([type=button]),\\ninput:where([type=reset]),\\ninput:where([type=submit]) {\\n -webkit-appearance: button;\\n background-color: transparent;\\n background-image: none;\\n}\\n:-moz-focusring {\\n outline: auto;\\n}\\n:-moz-ui-invalid {\\n box-shadow: none;\\n}\\nprogress {\\n vertical-align: baseline;\\n}\\n::-webkit-inner-spin-button,\\n::-webkit-outer-spin-button {\\n height: auto;\\n}\\n[type=search] {\\n -webkit-appearance: textfield;\\n outline-offset: -2px;\\n}\\n::-webkit-search-decoration {\\n -webkit-appearance: none;\\n}\\n::-webkit-file-upload-button {\\n -webkit-appearance: button;\\n font: inherit;\\n}\\nsummary {\\n display: list-item;\\n}\\nblockquote,\\ndl,\\ndd,\\nh1,\\nh2,\\nh3,\\nh4,\\nh5,\\nh6,\\nhr,\\nfigure,\\np,\\npre {\\n margin: 0;\\n}\\nfieldset {\\n margin: 0;\\n padding: 0;\\n}\\nlegend {\\n padding: 0;\\n}\\nol,\\nul,\\nmenu {\\n list-style: none;\\n margin: 0;\\n padding: 0;\\n}\\ndialog {\\n padding: 0;\\n}\\ntextarea {\\n resize: vertical;\\n}\\ninput::-moz-placeholder,\\ntextarea::-moz-placeholder {\\n opacity: 1;\\n color: #9ca3af;\\n}\\ninput::placeholder,\\ntextarea::placeholder {\\n opacity: 1;\\n color: #9ca3af;\\n}\\nbutton,\\n[role=button] {\\n cursor: pointer;\\n}\\n:disabled {\\n cursor: default;\\n}\\nimg,\\nsvg,\\nvideo,\\ncanvas,\\naudio,\\niframe,\\nembed,\\nobject {\\n display: block;\\n vertical-align: middle;\\n}\\nimg,\\nvideo {\\n max-width: 100%;\\n height: auto;\\n}\\n[hidden]:where(:not([hidden=until-found])) {\\n display: none;\\n}\\n:root {\\n --background: 0 0% 100%;\\n --foreground: 222.2 84% 4.9%;\\n --card: 0 0% 100%;\\n --card-foreground: 222.2 84% 4.9%;\\n --primary: 217 91% 60%;\\n --primary-foreground: 0 0% 100%;\\n --primary-50: 217 91% 97%;\\n --primary-100: 217 91% 93%;\\n --primary-200: 217 91% 85%;\\n --primary-300: 217 91% 75%;\\n --primary-400: 217 91% 68%;\\n --primary-500: 217 91% 60%;\\n --primary-600: 217 75% 50%;\\n --secondary: 258 90% 66%;\\n --secondary-foreground: 0 0% 100%;\\n --secondary-50: 258 90% 97%;\\n --secondary-100: 258 90% 93%;\\n --secondary-200: 258 90% 85%;\\n --destructive: 0 84% 60%;\\n --destructive-foreground: 0 0% 100%;\\n --success: 158 64% 52%;\\n --success-foreground: 0 0% 100%;\\n --warning: 38 92% 50%;\\n --warning-foreground: 0 0% 100%;\\n --muted: 210 40% 96.1%;\\n --muted-foreground: 215.4 16.3% 46.9%;\\n --accent: 210 40% 96.1%;\\n --accent-foreground: 222.2 47.4% 11.2%;\\n --border: 210 40% 88%;\\n --input: 210 40% 88%;\\n --ring: 217 91% 60%;\\n --radius: 0.5rem;\\n}\\n.dark {\\n --background: 222.2 84% 4.9%;\\n --foreground: 210 40% 98%;\\n --card: 222.2 84% 6.9%;\\n --card-foreground: 210 40% 98%;\\n --primary: 217 91% 60%;\\n --primary-foreground: 0 0% 100%;\\n --primary-50: 217 70% 15%;\\n --primary-100: 217 70% 20%;\\n --primary-200: 217 70% 30%;\\n --secondary: 258 90% 66%;\\n --secondary-foreground: 0 0% 100%;\\n --secondary-50: 258 70% 15%;\\n --secondary-100: 258 70% 20%;\\n --destructive: 0 84% 60%;\\n --destructive-foreground: 0 0% 100%;\\n --muted: 217.2 32.6% 17.5%;\\n --muted-foreground: 215 20.2% 65.1%;\\n --accent: 217.2 32.6% 17.5%;\\n --accent-foreground: 210 40% 98%;\\n --border: 217.2 32.6% 17.5%;\\n --input: 217.2 32.6% 17.5%;\\n --ring: 217 91% 60%;\\n --radius: 0.5rem;\\n}\\n* {\\n border-color: hsl(var(--border));\\n}\\nbody {\\n background-color: hsl(var(--background));\\n color: hsl(var(--foreground));\\n font-family:\\n \\\"Inter\\\",\\n system-ui,\\n -apple-system,\\n sans-serif;\\n}\\n.container {\\n width: 100%;\\n}\\n@media (min-width: 640px) {\\n .container {\\n max-width: 640px;\\n }\\n}\\n@media (min-width: 768px) {\\n .container {\\n max-width: 768px;\\n }\\n}\\n@media (min-width: 1024px) {\\n .container {\\n max-width: 1024px;\\n }\\n}\\n@media (min-width: 1280px) {\\n .container {\\n max-width: 1280px;\\n }\\n}\\n@media (min-width: 1536px) {\\n .container {\\n max-width: 1536px;\\n }\\n}\\n.pointer-events-none {\\n pointer-events: none;\\n}\\n.invisible {\\n visibility: hidden;\\n}\\n.collapse {\\n visibility: collapse;\\n}\\n.fixed {\\n position: fixed;\\n}\\n.absolute {\\n position: absolute;\\n}\\n.relative {\\n position: relative;\\n}\\n.sticky {\\n position: sticky;\\n}\\n.-inset-4 {\\n inset: -1rem;\\n}\\n.inset-0 {\\n inset: 0px;\\n}\\n.bottom-0 {\\n bottom: 0px;\\n}\\n.bottom-full {\\n bottom: 100%;\\n}\\n.left-0 {\\n left: 0px;\\n}\\n.left-1\\\\/2 {\\n left: 50%;\\n}\\n.left-3 {\\n left: 0.75rem;\\n}\\n.left-full {\\n left: 100%;\\n}\\n.right-0 {\\n right: 0px;\\n}\\n.right-2 {\\n right: 0.5rem;\\n}\\n.right-3 {\\n right: 0.75rem;\\n}\\n.right-4 {\\n right: 1rem;\\n}\\n.right-full {\\n right: 100%;\\n}\\n.top-0 {\\n top: 0px;\\n}\\n.top-1\\\\/2 {\\n top: 50%;\\n}\\n.top-2 {\\n top: 0.5rem;\\n}\\n.top-4 {\\n top: 1rem;\\n}\\n.top-\\\\[68px\\\\] {\\n top: 68px;\\n}\\n.top-full {\\n top: 100%;\\n}\\n.z-10 {\\n z-index: 10;\\n}\\n.z-20 {\\n z-index: 20;\\n}\\n.z-40 {\\n z-index: 40;\\n}\\n.z-50 {\\n z-index: 50;\\n}\\n.mx-4 {\\n margin-left: 1rem;\\n margin-right: 1rem;\\n}\\n.mx-auto {\\n margin-left: auto;\\n margin-right: auto;\\n}\\n.mb-1 {\\n margin-bottom: 0.25rem;\\n}\\n.mb-2 {\\n margin-bottom: 0.5rem;\\n}\\n.mb-3 {\\n margin-bottom: 0.75rem;\\n}\\n.mb-4 {\\n margin-bottom: 1rem;\\n}\\n.mb-6 {\\n margin-bottom: 1.5rem;\\n}\\n.mb-8 {\\n margin-bottom: 2rem;\\n}\\n.ml-1 {\\n margin-left: 0.25rem;\\n}\\n.ml-2 {\\n margin-left: 0.5rem;\\n}\\n.mr-2 {\\n margin-right: 0.5rem;\\n}\\n.mt-0\\\\.5 {\\n margin-top: 0.125rem;\\n}\\n.mt-1 {\\n margin-top: 0.25rem;\\n}\\n.mt-12 {\\n margin-top: 3rem;\\n}\\n.mt-2 {\\n margin-top: 0.5rem;\\n}\\n.mt-4 {\\n margin-top: 1rem;\\n}\\n.mt-6 {\\n margin-top: 1.5rem;\\n}\\n.line-clamp-2 {\\n overflow: hidden;\\n display: -webkit-box;\\n -webkit-box-orient: vertical;\\n -webkit-line-clamp: 2;\\n}\\n.block {\\n display: block;\\n}\\n.inline {\\n display: inline;\\n}\\n.flex {\\n display: flex;\\n}\\n.inline-flex {\\n display: inline-flex;\\n}\\n.table {\\n display: table;\\n}\\n.grid {\\n display: grid;\\n}\\n.contents {\\n display: contents;\\n}\\n.hidden {\\n display: none;\\n}\\n.h-1\\\\.5 {\\n height: 0.375rem;\\n}\\n.h-10 {\\n height: 2.5rem;\\n}\\n.h-11 {\\n height: 2.75rem;\\n}\\n.h-12 {\\n height: 3rem;\\n}\\n.h-16 {\\n height: 4rem;\\n}\\n.h-2 {\\n height: 0.5rem;\\n}\\n.h-24 {\\n height: 6rem;\\n}\\n.h-3 {\\n height: 0.75rem;\\n}\\n.h-3\\\\.5 {\\n height: 0.875rem;\\n}\\n.h-4 {\\n height: 1rem;\\n}\\n.h-5 {\\n height: 1.25rem;\\n}\\n.h-6 {\\n height: 1.5rem;\\n}\\n.h-64 {\\n height: 16rem;\\n}\\n.h-7 {\\n height: 1.75rem;\\n}\\n.h-8 {\\n height: 2rem;\\n}\\n.h-9 {\\n height: 2.25rem;\\n}\\n.h-\\\\[140px\\\\] {\\n height: 140px;\\n}\\n.h-\\\\[18px\\\\] {\\n height: 18px;\\n}\\n.h-\\\\[68px\\\\] {\\n height: 68px;\\n}\\n.h-full {\\n height: 100%;\\n}\\n.h-px {\\n height: 1px;\\n}\\n.max-h-32 {\\n max-height: 8rem;\\n}\\n.max-h-40 {\\n max-height: 10rem;\\n}\\n.max-h-\\\\[320px\\\\] {\\n max-height: 320px;\\n}\\n.max-h-\\\\[70vh\\\\] {\\n max-height: 70vh;\\n}\\n.max-h-\\\\[90vh\\\\] {\\n max-height: 90vh;\\n}\\n.min-h-0 {\\n min-height: 0px;\\n}\\n.min-h-\\\\[100px\\\\] {\\n min-height: 100px;\\n}\\n.min-h-\\\\[180px\\\\] {\\n min-height: 180px;\\n}\\n.min-h-\\\\[200px\\\\] {\\n min-height: 200px;\\n}\\n.min-h-screen {\\n min-height: 100vh;\\n}\\n.w-1\\\\.5 {\\n width: 0.375rem;\\n}\\n.w-10 {\\n width: 2.5rem;\\n}\\n.w-12 {\\n width: 3rem;\\n}\\n.w-16 {\\n width: 4rem;\\n}\\n.w-2 {\\n width: 0.5rem;\\n}\\n.w-24 {\\n width: 6rem;\\n}\\n.w-3 {\\n width: 0.75rem;\\n}\\n.w-3\\\\.5 {\\n width: 0.875rem;\\n}\\n.w-32 {\\n width: 8rem;\\n}\\n.w-4 {\\n width: 1rem;\\n}\\n.w-48 {\\n width: 12rem;\\n}\\n.w-5 {\\n width: 1.25rem;\\n}\\n.w-56 {\\n width: 14rem;\\n}\\n.w-6 {\\n width: 1.5rem;\\n}\\n.w-64 {\\n width: 16rem;\\n}\\n.w-7 {\\n width: 1.75rem;\\n}\\n.w-8 {\\n width: 2rem;\\n}\\n.w-9 {\\n width: 2.25rem;\\n}\\n.w-\\\\[140px\\\\] {\\n width: 140px;\\n}\\n.w-\\\\[18px\\\\] {\\n width: 18px;\\n}\\n.w-\\\\[260px\\\\] {\\n width: 260px;\\n}\\n.w-\\\\[72px\\\\] {\\n width: 72px;\\n}\\n.w-auto {\\n width: auto;\\n}\\n.w-full {\\n width: 100%;\\n}\\n.w-px {\\n width: 1px;\\n}\\n.min-w-0 {\\n min-width: 0px;\\n}\\n.min-w-\\\\[1\\\\.25rem\\\\] {\\n min-width: 1.25rem;\\n}\\n.min-w-\\\\[6\\\\.5rem\\\\] {\\n min-width: 6.5rem;\\n}\\n.max-w-2xl {\\n max-width: 42rem;\\n}\\n.max-w-\\\\[120px\\\\] {\\n max-width: 120px;\\n}\\n.max-w-\\\\[240px\\\\] {\\n max-width: 240px;\\n}\\n.max-w-md {\\n max-width: 28rem;\\n}\\n.flex-1 {\\n flex: 1 1 0%;\\n}\\n.flex-shrink-0 {\\n flex-shrink: 0;\\n}\\n.shrink-0 {\\n flex-shrink: 0;\\n}\\n.-translate-x-1\\\\/2 {\\n --tw-translate-x: -50%;\\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\\n}\\n.-translate-y-1\\\\/2 {\\n --tw-translate-y: -50%;\\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\\n}\\n.-rotate-90 {\\n --tw-rotate: -90deg;\\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\\n}\\n.rotate-180 {\\n --tw-rotate: 180deg;\\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\\n}\\n.rotate-90 {\\n --tw-rotate: 90deg;\\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\\n}\\n@keyframes bounce {\\n 0%, 100% {\\n transform: translateY(-25%);\\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\\n }\\n 50% {\\n transform: none;\\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\\n }\\n}\\n.animate-bounce {\\n animation: bounce 1s infinite;\\n}\\n@keyframes pulse {\\n 50% {\\n opacity: .5;\\n }\\n}\\n.animate-pulse {\\n animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\\n}\\n@keyframes spin {\\n to {\\n transform: rotate(360deg);\\n }\\n}\\n.animate-spin {\\n animation: spin 1s linear infinite;\\n}\\n.cursor-default {\\n cursor: default;\\n}\\n.cursor-not-allowed {\\n cursor: not-allowed;\\n}\\n.cursor-pointer {\\n cursor: pointer;\\n}\\n.select-none {\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n user-select: none;\\n}\\n.select-all {\\n -webkit-user-select: all;\\n -moz-user-select: all;\\n user-select: all;\\n}\\n.grid-cols-2 {\\n grid-template-columns: repeat(2, minmax(0, 1fr));\\n}\\n.grid-cols-3 {\\n grid-template-columns: repeat(3, minmax(0, 1fr));\\n}\\n.flex-col {\\n flex-direction: column;\\n}\\n.flex-col-reverse {\\n flex-direction: column-reverse;\\n}\\n.flex-wrap {\\n flex-wrap: wrap;\\n}\\n.items-start {\\n align-items: flex-start;\\n}\\n.items-center {\\n align-items: center;\\n}\\n.justify-end {\\n justify-content: flex-end;\\n}\\n.justify-center {\\n justify-content: center;\\n}\\n.justify-between {\\n justify-content: space-between;\\n}\\n.gap-0 {\\n gap: 0px;\\n}\\n.gap-1 {\\n gap: 0.25rem;\\n}\\n.gap-1\\\\.5 {\\n gap: 0.375rem;\\n}\\n.gap-2 {\\n gap: 0.5rem;\\n}\\n.gap-2\\\\.5 {\\n gap: 0.625rem;\\n}\\n.gap-3 {\\n gap: 0.75rem;\\n}\\n.gap-4 {\\n gap: 1rem;\\n}\\n.gap-6 {\\n gap: 1.5rem;\\n}\\n.space-y-1 > :not([hidden]) ~ :not([hidden]) {\\n --tw-space-y-reverse: 0;\\n margin-top: calc(0.25rem * calc(1 - var(--tw-space-y-reverse)));\\n margin-bottom: calc(0.25rem * var(--tw-space-y-reverse));\\n}\\n.space-y-1\\\\.5 > :not([hidden]) ~ :not([hidden]) {\\n --tw-space-y-reverse: 0;\\n margin-top: calc(0.375rem * calc(1 - var(--tw-space-y-reverse)));\\n margin-bottom: calc(0.375rem * var(--tw-space-y-reverse));\\n}\\n.space-y-2 > :not([hidden]) ~ :not([hidden]) {\\n --tw-space-y-reverse: 0;\\n margin-top: calc(0.5rem * calc(1 - var(--tw-space-y-reverse)));\\n margin-bottom: calc(0.5rem * var(--tw-space-y-reverse));\\n}\\n.space-y-3 > :not([hidden]) ~ :not([hidden]) {\\n --tw-space-y-reverse: 0;\\n margin-top: calc(0.75rem * calc(1 - var(--tw-space-y-reverse)));\\n margin-bottom: calc(0.75rem * var(--tw-space-y-reverse));\\n}\\n.space-y-4 > :not([hidden]) ~ :not([hidden]) {\\n --tw-space-y-reverse: 0;\\n margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse)));\\n margin-bottom: calc(1rem * var(--tw-space-y-reverse));\\n}\\n.space-y-\\\\[2px\\\\] > :not([hidden]) ~ :not([hidden]) {\\n --tw-space-y-reverse: 0;\\n margin-top: calc(2px * calc(1 - var(--tw-space-y-reverse)));\\n margin-bottom: calc(2px * var(--tw-space-y-reverse));\\n}\\n.divide-y > :not([hidden]) ~ :not([hidden]) {\\n --tw-divide-y-reverse: 0;\\n border-top-width: calc(1px * calc(1 - var(--tw-divide-y-reverse)));\\n border-bottom-width: calc(1px * var(--tw-divide-y-reverse));\\n}\\n.divide-border > :not([hidden]) ~ :not([hidden]) {\\n border-color: hsl(var(--border));\\n}\\n.divide-border\\\\/60 > :not([hidden]) ~ :not([hidden]) {\\n border-color: hsl(var(--border) / 0.6);\\n}\\n.overflow-hidden {\\n overflow: hidden;\\n}\\n.overflow-x-auto {\\n overflow-x: auto;\\n}\\n.overflow-y-auto {\\n overflow-y: auto;\\n}\\n.truncate {\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n}\\n.whitespace-nowrap {\\n white-space: nowrap;\\n}\\n.whitespace-pre-wrap {\\n white-space: pre-wrap;\\n}\\n.break-all {\\n word-break: break-all;\\n}\\n.rounded {\\n border-radius: 0.25rem;\\n}\\n.rounded-2xl {\\n border-radius: 1rem;\\n}\\n.rounded-3xl {\\n border-radius: 1.5rem;\\n}\\n.rounded-\\\\[10px\\\\] {\\n border-radius: 10px;\\n}\\n.rounded-\\\\[12px\\\\] {\\n border-radius: 12px;\\n}\\n.rounded-full {\\n border-radius: 9999px;\\n}\\n.rounded-lg {\\n border-radius: var(--radius);\\n}\\n.rounded-md {\\n border-radius: calc(var(--radius) - 2px);\\n}\\n.rounded-xl {\\n border-radius: 0.75rem;\\n}\\n.border {\\n border-width: 1px;\\n}\\n.border-0 {\\n border-width: 0px;\\n}\\n.border-2 {\\n border-width: 2px;\\n}\\n.border-4 {\\n border-width: 4px;\\n}\\n.border-y {\\n border-top-width: 1px;\\n border-bottom-width: 1px;\\n}\\n.border-b {\\n border-bottom-width: 1px;\\n}\\n.border-l {\\n border-left-width: 1px;\\n}\\n.border-r {\\n border-right-width: 1px;\\n}\\n.border-t {\\n border-top-width: 1px;\\n}\\n.border-dashed {\\n border-style: dashed;\\n}\\n.border-\\\\[\\\\#E7E5E4\\\\] {\\n --tw-border-opacity: 1;\\n border-color: rgb(231 229 228 / var(--tw-border-opacity, 1));\\n}\\n.border-amber-500\\\\/30 {\\n border-color: rgb(245 158 11 / 0.3);\\n}\\n.border-blue-200 {\\n --tw-border-opacity: 1;\\n border-color: rgb(191 219 254 / var(--tw-border-opacity, 1));\\n}\\n.border-blue-600\\\\/30 {\\n border-color: rgb(37 99 235 / 0.3);\\n}\\n.border-border {\\n border-color: hsl(var(--border));\\n}\\n.border-border\\\\/60 {\\n border-color: hsl(var(--border) / 0.6);\\n}\\n.border-destructive {\\n border-color: hsl(var(--destructive));\\n}\\n.border-destructive\\\\/20 {\\n border-color: hsl(var(--destructive) / 0.2);\\n}\\n.border-destructive\\\\/30 {\\n border-color: hsl(var(--destructive) / 0.3);\\n}\\n.border-green-200 {\\n --tw-border-opacity: 1;\\n border-color: rgb(187 247 208 / var(--tw-border-opacity, 1));\\n}\\n.border-input {\\n border-color: hsl(var(--input));\\n}\\n.border-muted {\\n border-color: hsl(var(--muted));\\n}\\n.border-primary\\\\/20 {\\n border-color: hsl(var(--primary) / 0.2);\\n}\\n.border-primary\\\\/40 {\\n border-color: hsl(var(--primary) / 0.4);\\n}\\n.border-purple-200 {\\n --tw-border-opacity: 1;\\n border-color: rgb(233 213 255 / var(--tw-border-opacity, 1));\\n}\\n.border-red-200 {\\n --tw-border-opacity: 1;\\n border-color: rgb(254 202 202 / var(--tw-border-opacity, 1));\\n}\\n.border-secondary\\\\/20 {\\n border-color: hsl(var(--secondary) / 0.2);\\n}\\n.border-slate-200 {\\n --tw-border-opacity: 1;\\n border-color: rgb(226 232 240 / var(--tw-border-opacity, 1));\\n}\\n.border-slate-300 {\\n --tw-border-opacity: 1;\\n border-color: rgb(203 213 225 / var(--tw-border-opacity, 1));\\n}\\n.border-transparent {\\n border-color: transparent;\\n}\\n.border-yellow-200 {\\n --tw-border-opacity: 1;\\n border-color: rgb(254 240 138 / var(--tw-border-opacity, 1));\\n}\\n.border-r-blue-600 {\\n --tw-border-opacity: 1;\\n border-right-color: rgb(37 99 235 / var(--tw-border-opacity, 1));\\n}\\n.border-t-blue-600 {\\n --tw-border-opacity: 1;\\n border-top-color: rgb(37 99 235 / var(--tw-border-opacity, 1));\\n}\\n.bg-\\\\[\\\\#2563EB\\\\] {\\n --tw-bg-opacity: 1;\\n background-color: rgb(37 99 235 / var(--tw-bg-opacity, 1));\\n}\\n.bg-\\\\[\\\\#F1F1F1\\\\] {\\n --tw-bg-opacity: 1;\\n background-color: rgb(241 241 241 / var(--tw-bg-opacity, 1));\\n}\\n.bg-amber-100 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(254 243 199 / var(--tw-bg-opacity, 1));\\n}\\n.bg-amber-50 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(255 251 235 / var(--tw-bg-opacity, 1));\\n}\\n.bg-amber-500 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(245 158 11 / var(--tw-bg-opacity, 1));\\n}\\n.bg-background {\\n background-color: hsl(var(--background));\\n}\\n.bg-black\\\\/50 {\\n background-color: rgb(0 0 0 / 0.5);\\n}\\n.bg-blue-100 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(219 234 254 / var(--tw-bg-opacity, 1));\\n}\\n.bg-blue-50 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(239 246 255 / var(--tw-bg-opacity, 1));\\n}\\n.bg-blue-500 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(59 130 246 / var(--tw-bg-opacity, 1));\\n}\\n.bg-blue-600 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(37 99 235 / var(--tw-bg-opacity, 1));\\n}\\n.bg-border {\\n background-color: hsl(var(--border));\\n}\\n.bg-destructive {\\n background-color: hsl(var(--destructive));\\n}\\n.bg-destructive\\\\/10 {\\n background-color: hsl(var(--destructive) / 0.1);\\n}\\n.bg-emerald-100 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(209 250 229 / var(--tw-bg-opacity, 1));\\n}\\n.bg-emerald-50 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(236 253 245 / var(--tw-bg-opacity, 1));\\n}\\n.bg-emerald-500 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(16 185 129 / var(--tw-bg-opacity, 1));\\n}\\n.bg-gray-50 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(249 250 251 / var(--tw-bg-opacity, 1));\\n}\\n.bg-gray-500 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(107 114 128 / var(--tw-bg-opacity, 1));\\n}\\n.bg-gray-900 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(17 24 39 / var(--tw-bg-opacity, 1));\\n}\\n.bg-green-100 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(220 252 231 / var(--tw-bg-opacity, 1));\\n}\\n.bg-muted {\\n background-color: hsl(var(--muted));\\n}\\n.bg-muted-foreground\\\\/80 {\\n background-color: hsl(var(--muted-foreground) / 0.8);\\n}\\n.bg-muted\\\\/20 {\\n background-color: hsl(var(--muted) / 0.2);\\n}\\n.bg-muted\\\\/30 {\\n background-color: hsl(var(--muted) / 0.3);\\n}\\n.bg-muted\\\\/50 {\\n background-color: hsl(var(--muted) / 0.5);\\n}\\n.bg-muted\\\\/80 {\\n background-color: hsl(var(--muted) / 0.8);\\n}\\n.bg-primary {\\n background-color: hsl(var(--primary));\\n}\\n.bg-primary\\\\/10 {\\n background-color: hsl(var(--primary) / 0.1);\\n}\\n.bg-primary\\\\/5 {\\n background-color: hsl(var(--primary) / 0.05);\\n}\\n.bg-purple-100 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(243 232 255 / var(--tw-bg-opacity, 1));\\n}\\n.bg-red-100 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(254 226 226 / var(--tw-bg-opacity, 1));\\n}\\n.bg-red-50 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(254 242 242 / var(--tw-bg-opacity, 1));\\n}\\n.bg-red-500 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(239 68 68 / var(--tw-bg-opacity, 1));\\n}\\n.bg-secondary {\\n background-color: hsl(var(--secondary));\\n}\\n.bg-secondary\\\\/10 {\\n background-color: hsl(var(--secondary) / 0.1);\\n}\\n.bg-slate-800 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(30 41 59 / var(--tw-bg-opacity, 1));\\n}\\n.bg-transparent {\\n background-color: transparent;\\n}\\n.bg-white {\\n --tw-bg-opacity: 1;\\n background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1));\\n}\\n.bg-white\\\\/20 {\\n background-color: rgb(255 255 255 / 0.2);\\n}\\n.bg-yellow-100 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(254 249 195 / var(--tw-bg-opacity, 1));\\n}\\n.bg-gradient-to-br {\\n background-image: linear-gradient(to bottom right, var(--tw-gradient-stops));\\n}\\n.bg-gradient-to-r {\\n background-image: linear-gradient(to right, var(--tw-gradient-stops));\\n}\\n.from-\\\\[\\\\#2563EB\\\\] {\\n --tw-gradient-from: #2563EB var(--tw-gradient-from-position);\\n --tw-gradient-to: rgb(37 99 235 / 0) var(--tw-gradient-to-position);\\n --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);\\n}\\n.from-amber-500 {\\n --tw-gradient-from: #f59e0b var(--tw-gradient-from-position);\\n --tw-gradient-to: rgb(245 158 11 / 0) var(--tw-gradient-to-position);\\n --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);\\n}\\n.from-amber-500\\\\/20 {\\n --tw-gradient-from: rgb(245 158 11 / 0.2) var(--tw-gradient-from-position);\\n --tw-gradient-to: rgb(245 158 11 / 0) var(--tw-gradient-to-position);\\n --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);\\n}\\n.from-blue-600 {\\n --tw-gradient-from: #2563eb var(--tw-gradient-from-position);\\n --tw-gradient-to: rgb(37 99 235 / 0) var(--tw-gradient-to-position);\\n --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);\\n}\\n.from-blue-600\\\\/20 {\\n --tw-gradient-from: rgb(37 99 235 / 0.2) var(--tw-gradient-from-position);\\n --tw-gradient-to: rgb(37 99 235 / 0) var(--tw-gradient-to-position);\\n --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);\\n}\\n.via-blue-700 {\\n --tw-gradient-to: rgb(29 78 216 / 0) var(--tw-gradient-to-position);\\n --tw-gradient-stops:\\n var(--tw-gradient-from),\\n #1d4ed8 var(--tw-gradient-via-position),\\n var(--tw-gradient-to);\\n}\\n.via-blue-700\\\\/20 {\\n --tw-gradient-to: rgb(29 78 216 / 0) var(--tw-gradient-to-position);\\n --tw-gradient-stops:\\n var(--tw-gradient-from),\\n rgb(29 78 216 / 0.2) var(--tw-gradient-via-position),\\n var(--tw-gradient-to);\\n}\\n.via-orange-500 {\\n --tw-gradient-to: rgb(249 115 22 / 0) var(--tw-gradient-to-position);\\n --tw-gradient-stops:\\n var(--tw-gradient-from),\\n #f97316 var(--tw-gradient-via-position),\\n var(--tw-gradient-to);\\n}\\n.via-orange-500\\\\/20 {\\n --tw-gradient-to: rgb(249 115 22 / 0) var(--tw-gradient-to-position);\\n --tw-gradient-stops:\\n var(--tw-gradient-from),\\n rgb(249 115 22 / 0.2) var(--tw-gradient-via-position),\\n var(--tw-gradient-to);\\n}\\n.to-\\\\[\\\\#7C3AED\\\\] {\\n --tw-gradient-to: #7C3AED var(--tw-gradient-to-position);\\n}\\n.to-blue-700 {\\n --tw-gradient-to: #1d4ed8 var(--tw-gradient-to-position);\\n}\\n.to-indigo-800 {\\n --tw-gradient-to: #3730a3 var(--tw-gradient-to-position);\\n}\\n.to-indigo-800\\\\/20 {\\n --tw-gradient-to: rgb(55 48 163 / 0.2) var(--tw-gradient-to-position);\\n}\\n.to-red-600 {\\n --tw-gradient-to: #dc2626 var(--tw-gradient-to-position);\\n}\\n.to-red-600\\\\/20 {\\n --tw-gradient-to: rgb(220 38 38 / 0.2) var(--tw-gradient-to-position);\\n}\\n.bg-clip-text {\\n -webkit-background-clip: text;\\n background-clip: text;\\n}\\n.object-cover {\\n -o-object-fit: cover;\\n object-fit: cover;\\n}\\n.p-0\\\\.5 {\\n padding: 0.125rem;\\n}\\n.p-1 {\\n padding: 0.25rem;\\n}\\n.p-1\\\\.5 {\\n padding: 0.375rem;\\n}\\n.p-3 {\\n padding: 0.75rem;\\n}\\n.p-4 {\\n padding: 1rem;\\n}\\n.p-5 {\\n padding: 1.25rem;\\n}\\n.p-6 {\\n padding: 1.5rem;\\n}\\n.p-8 {\\n padding: 2rem;\\n}\\n.px-1 {\\n padding-left: 0.25rem;\\n padding-right: 0.25rem;\\n}\\n.px-1\\\\.5 {\\n padding-left: 0.375rem;\\n padding-right: 0.375rem;\\n}\\n.px-2 {\\n padding-left: 0.5rem;\\n padding-right: 0.5rem;\\n}\\n.px-2\\\\.5 {\\n padding-left: 0.625rem;\\n padding-right: 0.625rem;\\n}\\n.px-3 {\\n padding-left: 0.75rem;\\n padding-right: 0.75rem;\\n}\\n.px-4 {\\n padding-left: 1rem;\\n padding-right: 1rem;\\n}\\n.px-6 {\\n padding-left: 1.5rem;\\n padding-right: 1.5rem;\\n}\\n.py-0\\\\.5 {\\n padding-top: 0.125rem;\\n padding-bottom: 0.125rem;\\n}\\n.py-1 {\\n padding-top: 0.25rem;\\n padding-bottom: 0.25rem;\\n}\\n.py-1\\\\.5 {\\n padding-top: 0.375rem;\\n padding-bottom: 0.375rem;\\n}\\n.py-12 {\\n padding-top: 3rem;\\n padding-bottom: 3rem;\\n}\\n.py-2 {\\n padding-top: 0.5rem;\\n padding-bottom: 0.5rem;\\n}\\n.py-2\\\\.5 {\\n padding-top: 0.625rem;\\n padding-bottom: 0.625rem;\\n}\\n.py-3 {\\n padding-top: 0.75rem;\\n padding-bottom: 0.75rem;\\n}\\n.py-4 {\\n padding-top: 1rem;\\n padding-bottom: 1rem;\\n}\\n.py-8 {\\n padding-top: 2rem;\\n padding-bottom: 2rem;\\n}\\n.pl-10 {\\n padding-left: 2.5rem;\\n}\\n.pl-2 {\\n padding-left: 0.5rem;\\n}\\n.pl-4 {\\n padding-left: 1rem;\\n}\\n.pl-9 {\\n padding-left: 2.25rem;\\n}\\n.pr-10 {\\n padding-right: 2.5rem;\\n}\\n.pr-4 {\\n padding-right: 1rem;\\n}\\n.pt-0 {\\n padding-top: 0px;\\n}\\n.pt-1 {\\n padding-top: 0.25rem;\\n}\\n.pt-2 {\\n padding-top: 0.5rem;\\n}\\n.pt-3 {\\n padding-top: 0.75rem;\\n}\\n.pt-4 {\\n padding-top: 1rem;\\n}\\n.pt-\\\\[68px\\\\] {\\n padding-top: 68px;\\n}\\n.text-left {\\n text-align: left;\\n}\\n.text-center {\\n text-align: center;\\n}\\n.text-right {\\n text-align: right;\\n}\\n.align-middle {\\n vertical-align: middle;\\n}\\n.font-lego {\\n font-family: Fredoka, sans-serif;\\n}\\n.font-mono {\\n font-family:\\n ui-monospace,\\n SFMono-Regular,\\n Menlo,\\n Monaco,\\n Consolas,\\n \\\"Liberation Mono\\\",\\n \\\"Courier New\\\",\\n monospace;\\n}\\n.text-2xl {\\n font-size: 1.5rem;\\n line-height: 2rem;\\n}\\n.text-3xl {\\n font-size: 1.875rem;\\n line-height: 2.25rem;\\n}\\n.text-8xl {\\n font-size: 6rem;\\n line-height: 1;\\n}\\n.text-\\\\[15px\\\\] {\\n font-size: 15px;\\n}\\n.text-\\\\[24px\\\\] {\\n font-size: 24px;\\n}\\n.text-base {\\n font-size: 1rem;\\n line-height: 1.5rem;\\n}\\n.text-lg {\\n font-size: 1.125rem;\\n line-height: 1.75rem;\\n}\\n.text-sm {\\n font-size: 0.875rem;\\n line-height: 1.25rem;\\n}\\n.text-xl {\\n font-size: 1.25rem;\\n line-height: 1.75rem;\\n}\\n.text-xs {\\n font-size: 0.75rem;\\n line-height: 1rem;\\n}\\n.font-bold {\\n font-weight: 700;\\n}\\n.font-medium {\\n font-weight: 500;\\n}\\n.font-normal {\\n font-weight: 400;\\n}\\n.font-semibold {\\n font-weight: 600;\\n}\\n.uppercase {\\n text-transform: uppercase;\\n}\\n.lowercase {\\n text-transform: lowercase;\\n}\\n.italic {\\n font-style: italic;\\n}\\n.leading-none {\\n line-height: 1;\\n}\\n.tracking-tight {\\n letter-spacing: -0.025em;\\n}\\n.tracking-wider {\\n letter-spacing: 0.05em;\\n}\\n.text-\\\\[\\\\#0F172A\\\\] {\\n --tw-text-opacity: 1;\\n color: rgb(15 23 42 / var(--tw-text-opacity, 1));\\n}\\n.text-\\\\[\\\\#64748B\\\\] {\\n --tw-text-opacity: 1;\\n color: rgb(100 116 139 / var(--tw-text-opacity, 1));\\n}\\n.text-amber-500 {\\n --tw-text-opacity: 1;\\n color: rgb(245 158 11 / var(--tw-text-opacity, 1));\\n}\\n.text-amber-700 {\\n --tw-text-opacity: 1;\\n color: rgb(180 83 9 / var(--tw-text-opacity, 1));\\n}\\n.text-blue-100 {\\n --tw-text-opacity: 1;\\n color: rgb(219 234 254 / var(--tw-text-opacity, 1));\\n}\\n.text-blue-500 {\\n --tw-text-opacity: 1;\\n color: rgb(59 130 246 / var(--tw-text-opacity, 1));\\n}\\n.text-blue-600 {\\n --tw-text-opacity: 1;\\n color: rgb(37 99 235 / var(--tw-text-opacity, 1));\\n}\\n.text-blue-700 {\\n --tw-text-opacity: 1;\\n color: rgb(29 78 216 / var(--tw-text-opacity, 1));\\n}\\n.text-destructive {\\n color: hsl(var(--destructive));\\n}\\n.text-destructive-foreground {\\n color: hsl(var(--destructive-foreground));\\n}\\n.text-destructive\\\\/80 {\\n color: hsl(var(--destructive) / 0.8);\\n}\\n.text-emerald-500 {\\n --tw-text-opacity: 1;\\n color: rgb(16 185 129 / var(--tw-text-opacity, 1));\\n}\\n.text-emerald-700 {\\n --tw-text-opacity: 1;\\n color: rgb(4 120 87 / var(--tw-text-opacity, 1));\\n}\\n.text-foreground {\\n color: hsl(var(--foreground));\\n}\\n.text-gray-700 {\\n --tw-text-opacity: 1;\\n color: rgb(55 65 81 / var(--tw-text-opacity, 1));\\n}\\n.text-green-700 {\\n --tw-text-opacity: 1;\\n color: rgb(21 128 61 / var(--tw-text-opacity, 1));\\n}\\n.text-muted-foreground {\\n color: hsl(var(--muted-foreground));\\n}\\n.text-muted\\\\/30 {\\n color: hsl(var(--muted) / 0.3);\\n}\\n.text-primary {\\n color: hsl(var(--primary));\\n}\\n.text-primary-foreground {\\n color: hsl(var(--primary-foreground));\\n}\\n.text-purple-600 {\\n --tw-text-opacity: 1;\\n color: rgb(147 51 234 / var(--tw-text-opacity, 1));\\n}\\n.text-red-500 {\\n --tw-text-opacity: 1;\\n color: rgb(239 68 68 / var(--tw-text-opacity, 1));\\n}\\n.text-red-600 {\\n --tw-text-opacity: 1;\\n color: rgb(220 38 38 / var(--tw-text-opacity, 1));\\n}\\n.text-red-700 {\\n --tw-text-opacity: 1;\\n color: rgb(185 28 28 / var(--tw-text-opacity, 1));\\n}\\n.text-secondary {\\n color: hsl(var(--secondary));\\n}\\n.text-secondary-foreground {\\n color: hsl(var(--secondary-foreground));\\n}\\n.text-slate-600 {\\n --tw-text-opacity: 1;\\n color: rgb(71 85 105 / var(--tw-text-opacity, 1));\\n}\\n.text-slate-700 {\\n --tw-text-opacity: 1;\\n color: rgb(51 65 85 / var(--tw-text-opacity, 1));\\n}\\n.text-success {\\n color: hsl(var(--success));\\n}\\n.text-transparent {\\n color: transparent;\\n}\\n.text-warning {\\n color: hsl(var(--warning));\\n}\\n.text-white {\\n --tw-text-opacity: 1;\\n color: rgb(255 255 255 / var(--tw-text-opacity, 1));\\n}\\n.text-yellow-700 {\\n --tw-text-opacity: 1;\\n color: rgb(161 98 7 / var(--tw-text-opacity, 1));\\n}\\n.underline-offset-4 {\\n text-underline-offset: 4px;\\n}\\n.opacity-0 {\\n opacity: 0;\\n}\\n.opacity-20 {\\n opacity: 0.2;\\n}\\n.opacity-25 {\\n opacity: 0.25;\\n}\\n.opacity-50 {\\n opacity: 0.5;\\n}\\n.opacity-75 {\\n opacity: 0.75;\\n}\\n.opacity-80 {\\n opacity: 0.8;\\n}\\n.shadow {\\n --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);\\n --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);\\n box-shadow:\\n var(--tw-ring-offset-shadow, 0 0 #0000),\\n var(--tw-ring-shadow, 0 0 #0000),\\n var(--tw-shadow);\\n}\\n.shadow-2xl {\\n --tw-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25);\\n --tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);\\n box-shadow:\\n var(--tw-ring-offset-shadow, 0 0 #0000),\\n var(--tw-ring-shadow, 0 0 #0000),\\n var(--tw-shadow);\\n}\\n.shadow-lg {\\n --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);\\n --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);\\n box-shadow:\\n var(--tw-ring-offset-shadow, 0 0 #0000),\\n var(--tw-ring-shadow, 0 0 #0000),\\n var(--tw-shadow);\\n}\\n.shadow-md {\\n --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\\n --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);\\n box-shadow:\\n var(--tw-ring-offset-shadow, 0 0 #0000),\\n var(--tw-ring-shadow, 0 0 #0000),\\n var(--tw-shadow);\\n}\\n.shadow-sm {\\n --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\\n --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);\\n box-shadow:\\n var(--tw-ring-offset-shadow, 0 0 #0000),\\n var(--tw-ring-shadow, 0 0 #0000),\\n var(--tw-shadow);\\n}\\n.shadow-blue-600\\\\/25 {\\n --tw-shadow-color: rgb(37 99 235 / 0.25);\\n --tw-shadow: var(--tw-shadow-colored);\\n}\\n.outline {\\n outline-style: solid;\\n}\\n.blur {\\n --tw-blur: blur(8px);\\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\\n}\\n.blur-3xl {\\n --tw-blur: blur(64px);\\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\\n}\\n.filter {\\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\\n}\\n.backdrop-blur-sm {\\n --tw-backdrop-blur: blur(4px);\\n backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\\n}\\n.backdrop-blur-xl {\\n --tw-backdrop-blur: blur(24px);\\n backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\\n}\\n.transition-all {\\n transition-property: all;\\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\\n transition-duration: 150ms;\\n}\\n.transition-colors {\\n transition-property:\\n color,\\n background-color,\\n border-color,\\n text-decoration-color,\\n fill,\\n stroke;\\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\\n transition-duration: 150ms;\\n}\\n.transition-opacity {\\n transition-property: opacity;\\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\\n transition-duration: 150ms;\\n}\\n.transition-transform {\\n transition-property: transform;\\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\\n transition-duration: 150ms;\\n}\\n.duration-150 {\\n transition-duration: 150ms;\\n}\\n.duration-200 {\\n transition-duration: 200ms;\\n}\\n.duration-300 {\\n transition-duration: 300ms;\\n}\\n.duration-500 {\\n transition-duration: 500ms;\\n}\\n.ease-in-out {\\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\\n}\\n@keyframes enter {\\n from {\\n opacity: var(--tw-enter-opacity, 1);\\n transform: translate3d(var(--tw-enter-translate-x, 0), var(--tw-enter-translate-y, 0), 0) scale3d(var(--tw-enter-scale, 1), var(--tw-enter-scale, 1), var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0));\\n }\\n}\\n@keyframes exit {\\n to {\\n opacity: var(--tw-exit-opacity, 1);\\n transform: translate3d(var(--tw-exit-translate-x, 0), var(--tw-exit-translate-y, 0), 0) scale3d(var(--tw-exit-scale, 1), var(--tw-exit-scale, 1), var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0));\\n }\\n}\\n.animate-in {\\n animation-name: enter;\\n animation-duration: 150ms;\\n --tw-enter-opacity: initial;\\n --tw-enter-scale: initial;\\n --tw-enter-rotate: initial;\\n --tw-enter-translate-x: initial;\\n --tw-enter-translate-y: initial;\\n}\\n.fade-in {\\n --tw-enter-opacity: 0;\\n}\\n.zoom-in-95 {\\n --tw-enter-scale: .95;\\n}\\n.slide-in-from-bottom-2 {\\n --tw-enter-translate-y: 0.5rem;\\n}\\n.duration-150 {\\n animation-duration: 150ms;\\n}\\n.duration-200 {\\n animation-duration: 200ms;\\n}\\n.duration-300 {\\n animation-duration: 300ms;\\n}\\n.duration-500 {\\n animation-duration: 500ms;\\n}\\n.ease-in-out {\\n animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\\n}\\n.dialog-overlay {\\n position: fixed !important;\\n top: 0 !important;\\n left: 0 !important;\\n right: 0 !important;\\n bottom: 0 !important;\\n width: 100vw !important;\\n height: 100vh !important;\\n min-width: 100vw !important;\\n min-height: 100vh !important;\\n margin: 0 !important;\\n padding: 0 !important;\\n box-sizing: border-box !important;\\n overflow: hidden !important;\\n z-index: 9999 !important;\\n}\\n.glass {\\n background: hsl(var(--background) / 0.8);\\n backdrop-filter: blur(12px);\\n -webkit-backdrop-filter: blur(12px);\\n}\\n.font-lego {\\n font-family: \\\"Fredoka\\\", sans-serif;\\n font-weight: 700;\\n color: white;\\n -webkit-text-stroke: 3px black;\\n text-stroke: 3px black;\\n text-shadow: 2px 2px 0 #2563EB, -2px -2px 0 #2563EB;\\n paint-order: stroke fill;\\n}\\n.placeholder\\\\:text-muted-foreground::-moz-placeholder {\\n color: hsl(var(--muted-foreground));\\n}\\n.placeholder\\\\:text-muted-foreground::placeholder {\\n color: hsl(var(--muted-foreground));\\n}\\n.placeholder\\\\:text-slate-400::-moz-placeholder {\\n --tw-text-opacity: 1;\\n color: rgb(148 163 184 / var(--tw-text-opacity, 1));\\n}\\n.placeholder\\\\:text-slate-400::placeholder {\\n --tw-text-opacity: 1;\\n color: rgb(148 163 184 / var(--tw-text-opacity, 1));\\n}\\n.checked\\\\:border-primary:checked {\\n border-color: hsl(var(--primary));\\n}\\n.checked\\\\:bg-primary:checked {\\n background-color: hsl(var(--primary));\\n}\\n.hover\\\\:-translate-y-0\\\\.5:hover {\\n --tw-translate-y: -0.125rem;\\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\\n}\\n.hover\\\\:scale-\\\\[1\\\\.02\\\\]:hover {\\n --tw-scale-x: 1.02;\\n --tw-scale-y: 1.02;\\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\\n}\\n.hover\\\\:border-foreground\\\\/20:hover {\\n border-color: hsl(var(--foreground) / 0.2);\\n}\\n.hover\\\\:border-primary\\\\/30:hover {\\n border-color: hsl(var(--primary) / 0.3);\\n}\\n.hover\\\\:bg-\\\\[\\\\#1D4ED8\\\\]:hover {\\n --tw-bg-opacity: 1;\\n background-color: rgb(29 78 216 / var(--tw-bg-opacity, 1));\\n}\\n.hover\\\\:bg-\\\\[\\\\#E5E5E5\\\\]:hover {\\n --tw-bg-opacity: 1;\\n background-color: rgb(229 229 229 / var(--tw-bg-opacity, 1));\\n}\\n.hover\\\\:bg-\\\\[\\\\#F1F1F1\\\\]:hover {\\n --tw-bg-opacity: 1;\\n background-color: rgb(241 241 241 / var(--tw-bg-opacity, 1));\\n}\\n.hover\\\\:bg-accent:hover {\\n background-color: hsl(var(--accent));\\n}\\n.hover\\\\:bg-background\\\\/50:hover {\\n background-color: hsl(var(--background) / 0.5);\\n}\\n.hover\\\\:bg-destructive\\\\/10:hover {\\n background-color: hsl(var(--destructive) / 0.1);\\n}\\n.hover\\\\:bg-destructive\\\\/90:hover {\\n background-color: hsl(var(--destructive) / 0.9);\\n}\\n.hover\\\\:bg-emerald-600:hover {\\n --tw-bg-opacity: 1;\\n background-color: rgb(5 150 105 / var(--tw-bg-opacity, 1));\\n}\\n.hover\\\\:bg-muted:hover {\\n background-color: hsl(var(--muted));\\n}\\n.hover\\\\:bg-muted\\\\/30:hover {\\n background-color: hsl(var(--muted) / 0.3);\\n}\\n.hover\\\\:bg-muted\\\\/40:hover {\\n background-color: hsl(var(--muted) / 0.4);\\n}\\n.hover\\\\:bg-muted\\\\/50:hover {\\n background-color: hsl(var(--muted) / 0.5);\\n}\\n.hover\\\\:bg-muted\\\\/80:hover {\\n background-color: hsl(var(--muted) / 0.8);\\n}\\n.hover\\\\:bg-primary\\\\/90:hover {\\n background-color: hsl(var(--primary) / 0.9);\\n}\\n.hover\\\\:bg-red-50:hover {\\n --tw-bg-opacity: 1;\\n background-color: rgb(254 242 242 / var(--tw-bg-opacity, 1));\\n}\\n.hover\\\\:text-\\\\[\\\\#0F172A\\\\]:hover {\\n --tw-text-opacity: 1;\\n color: rgb(15 23 42 / var(--tw-text-opacity, 1));\\n}\\n.hover\\\\:text-accent-foreground:hover {\\n color: hsl(var(--accent-foreground));\\n}\\n.hover\\\\:text-destructive:hover {\\n color: hsl(var(--destructive));\\n}\\n.hover\\\\:text-foreground:hover {\\n color: hsl(var(--foreground));\\n}\\n.hover\\\\:text-slate-900:hover {\\n --tw-text-opacity: 1;\\n color: rgb(15 23 42 / var(--tw-text-opacity, 1));\\n}\\n.hover\\\\:underline:hover {\\n text-decoration-line: underline;\\n}\\n.hover\\\\:opacity-80:hover {\\n opacity: 0.8;\\n}\\n.hover\\\\:shadow-lg:hover {\\n --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);\\n --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);\\n box-shadow:\\n var(--tw-ring-offset-shadow, 0 0 #0000),\\n var(--tw-ring-shadow, 0 0 #0000),\\n var(--tw-shadow);\\n}\\n.hover\\\\:shadow-md:hover {\\n --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\\n --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);\\n box-shadow:\\n var(--tw-ring-offset-shadow, 0 0 #0000),\\n var(--tw-ring-shadow, 0 0 #0000),\\n var(--tw-shadow);\\n}\\n.hover\\\\:shadow-xl:hover {\\n --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);\\n --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);\\n box-shadow:\\n var(--tw-ring-offset-shadow, 0 0 #0000),\\n var(--tw-ring-shadow, 0 0 #0000),\\n var(--tw-shadow);\\n}\\n.hover\\\\:shadow-blue-600\\\\/30:hover {\\n --tw-shadow-color: rgb(37 99 235 / 0.3);\\n --tw-shadow: var(--tw-shadow-colored);\\n}\\n.focus\\\\:outline-none:focus {\\n outline: 2px solid transparent;\\n outline-offset: 2px;\\n}\\n.focus\\\\:ring-2:focus {\\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\\n box-shadow:\\n var(--tw-ring-offset-shadow),\\n var(--tw-ring-shadow),\\n var(--tw-shadow, 0 0 #0000);\\n}\\n.focus\\\\:ring-primary:focus {\\n --tw-ring-color: hsl(var(--primary));\\n}\\n.focus\\\\:ring-primary\\\\/20:focus {\\n --tw-ring-color: hsl(var(--primary) / 0.2);\\n}\\n.focus\\\\:ring-ring:focus {\\n --tw-ring-color: hsl(var(--ring));\\n}\\n.focus\\\\:ring-offset-2:focus {\\n --tw-ring-offset-width: 2px;\\n}\\n.focus-visible\\\\:border-primary:focus-visible {\\n border-color: hsl(var(--primary));\\n}\\n.focus-visible\\\\:outline-none:focus-visible {\\n outline: 2px solid transparent;\\n outline-offset: 2px;\\n}\\n.focus-visible\\\\:ring-2:focus-visible {\\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\\n box-shadow:\\n var(--tw-ring-offset-shadow),\\n var(--tw-ring-shadow),\\n var(--tw-shadow, 0 0 #0000);\\n}\\n.focus-visible\\\\:ring-inset:focus-visible {\\n --tw-ring-inset: inset;\\n}\\n.focus-visible\\\\:ring-primary\\\\/20:focus-visible {\\n --tw-ring-color: hsl(var(--primary) / 0.2);\\n}\\n.focus-visible\\\\:ring-primary\\\\/50:focus-visible {\\n --tw-ring-color: hsl(var(--primary) / 0.5);\\n}\\n.focus-visible\\\\:ring-ring:focus-visible {\\n --tw-ring-color: hsl(var(--ring));\\n}\\n.focus-visible\\\\:ring-offset-2:focus-visible {\\n --tw-ring-offset-width: 2px;\\n}\\n.active\\\\:translate-y-0:active {\\n --tw-translate-y: 0px;\\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\\n}\\n.active\\\\:translate-y-px:active {\\n --tw-translate-y: 1px;\\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\\n}\\n.active\\\\:shadow-sm:active {\\n --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\\n --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);\\n box-shadow:\\n var(--tw-ring-offset-shadow, 0 0 #0000),\\n var(--tw-ring-shadow, 0 0 #0000),\\n var(--tw-shadow);\\n}\\n.disabled\\\\:pointer-events-none:disabled {\\n pointer-events: none;\\n}\\n.disabled\\\\:cursor-not-allowed:disabled {\\n cursor: not-allowed;\\n}\\n.disabled\\\\:opacity-50:disabled {\\n opacity: 0.5;\\n}\\n.group\\\\/tooltip:hover .group-hover\\\\/tooltip\\\\:visible {\\n visibility: visible;\\n}\\n.group:hover .group-hover\\\\:bg-primary\\\\/10 {\\n background-color: hsl(var(--primary) / 0.1);\\n}\\n.group:hover .group-hover\\\\:text-primary {\\n color: hsl(var(--primary));\\n}\\n.group\\\\/tooltip:hover .group-hover\\\\/tooltip\\\\:opacity-100 {\\n opacity: 1;\\n}\\n.group:hover .group-hover\\\\:opacity-100 {\\n opacity: 1;\\n}\\n.peer:disabled ~ .peer-disabled\\\\:cursor-not-allowed {\\n cursor: not-allowed;\\n}\\n.peer:disabled ~ .peer-disabled\\\\:opacity-70 {\\n opacity: 0.7;\\n}\\n.dark\\\\:divide-slate-700:is(.dark *) > :not([hidden]) ~ :not([hidden]) {\\n --tw-divide-opacity: 1;\\n border-color: rgb(51 65 85 / var(--tw-divide-opacity, 1));\\n}\\n.dark\\\\:divide-slate-700\\\\/60:is(.dark *) > :not([hidden]) ~ :not([hidden]) {\\n border-color: rgb(51 65 85 / 0.6);\\n}\\n.dark\\\\:border-blue-800:is(.dark *) {\\n --tw-border-opacity: 1;\\n border-color: rgb(30 64 175 / var(--tw-border-opacity, 1));\\n}\\n.dark\\\\:border-blue-900\\\\/50:is(.dark *) {\\n border-color: rgb(30 58 138 / 0.5);\\n}\\n.dark\\\\:border-green-800:is(.dark *) {\\n --tw-border-opacity: 1;\\n border-color: rgb(22 101 52 / var(--tw-border-opacity, 1));\\n}\\n.dark\\\\:border-purple-900\\\\/50:is(.dark *) {\\n border-color: rgb(88 28 135 / 0.5);\\n}\\n.dark\\\\:border-red-900\\\\/50:is(.dark *) {\\n border-color: rgb(127 29 29 / 0.5);\\n}\\n.dark\\\\:border-slate-700:is(.dark *) {\\n --tw-border-opacity: 1;\\n border-color: rgb(51 65 85 / var(--tw-border-opacity, 1));\\n}\\n.dark\\\\:border-yellow-800:is(.dark *) {\\n --tw-border-opacity: 1;\\n border-color: rgb(133 77 14 / var(--tw-border-opacity, 1));\\n}\\n.dark\\\\:bg-amber-500\\\\/20:is(.dark *) {\\n background-color: rgb(245 158 11 / 0.2);\\n}\\n.dark\\\\:bg-amber-900\\\\/30:is(.dark *) {\\n background-color: rgb(120 53 15 / 0.3);\\n}\\n.dark\\\\:bg-blue-500\\\\/20:is(.dark *) {\\n background-color: rgb(59 130 246 / 0.2);\\n}\\n.dark\\\\:bg-blue-900\\\\/30:is(.dark *) {\\n background-color: rgb(30 58 138 / 0.3);\\n}\\n.dark\\\\:bg-emerald-500\\\\/20:is(.dark *) {\\n background-color: rgb(16 185 129 / 0.2);\\n}\\n.dark\\\\:bg-emerald-600:is(.dark *) {\\n --tw-bg-opacity: 1;\\n background-color: rgb(5 150 105 / var(--tw-bg-opacity, 1));\\n}\\n.dark\\\\:bg-emerald-900\\\\/30:is(.dark *) {\\n background-color: rgb(6 78 59 / 0.3);\\n}\\n.dark\\\\:bg-gray-800:is(.dark *) {\\n --tw-bg-opacity: 1;\\n background-color: rgb(31 41 55 / var(--tw-bg-opacity, 1));\\n}\\n.dark\\\\:bg-green-900\\\\/30:is(.dark *) {\\n background-color: rgb(20 83 45 / 0.3);\\n}\\n.dark\\\\:bg-primary\\\\/15:is(.dark *) {\\n background-color: hsl(var(--primary) / 0.15);\\n}\\n.dark\\\\:bg-primary\\\\/20:is(.dark *) {\\n background-color: hsl(var(--primary) / 0.2);\\n}\\n.dark\\\\:bg-purple-900\\\\/30:is(.dark *) {\\n background-color: rgb(88 28 135 / 0.3);\\n}\\n.dark\\\\:bg-red-500\\\\/20:is(.dark *) {\\n background-color: rgb(239 68 68 / 0.2);\\n}\\n.dark\\\\:bg-red-900\\\\/30:is(.dark *) {\\n background-color: rgb(127 29 29 / 0.3);\\n}\\n.dark\\\\:bg-slate-600:is(.dark *) {\\n --tw-bg-opacity: 1;\\n background-color: rgb(71 85 105 / var(--tw-bg-opacity, 1));\\n}\\n.dark\\\\:bg-slate-700\\\\/80:is(.dark *) {\\n background-color: rgb(51 65 85 / 0.8);\\n}\\n.dark\\\\:bg-slate-800:is(.dark *) {\\n --tw-bg-opacity: 1;\\n background-color: rgb(30 41 59 / var(--tw-bg-opacity, 1));\\n}\\n.dark\\\\:bg-slate-800\\\\/50:is(.dark *) {\\n background-color: rgb(30 41 59 / 0.5);\\n}\\n.dark\\\\:bg-slate-800\\\\/70:is(.dark *) {\\n background-color: rgb(30 41 59 / 0.7);\\n}\\n.dark\\\\:bg-slate-800\\\\/80:is(.dark *) {\\n background-color: rgb(30 41 59 / 0.8);\\n}\\n.dark\\\\:bg-slate-900:is(.dark *) {\\n --tw-bg-opacity: 1;\\n background-color: rgb(15 23 42 / var(--tw-bg-opacity, 1));\\n}\\n.dark\\\\:bg-yellow-900\\\\/30:is(.dark *) {\\n background-color: rgb(113 63 18 / 0.3);\\n}\\n.dark\\\\:text-amber-400:is(.dark *) {\\n --tw-text-opacity: 1;\\n color: rgb(251 191 36 / var(--tw-text-opacity, 1));\\n}\\n.dark\\\\:text-blue-400:is(.dark *) {\\n --tw-text-opacity: 1;\\n color: rgb(96 165 250 / var(--tw-text-opacity, 1));\\n}\\n.dark\\\\:text-emerald-400:is(.dark *) {\\n --tw-text-opacity: 1;\\n color: rgb(52 211 153 / var(--tw-text-opacity, 1));\\n}\\n.dark\\\\:text-gray-400:is(.dark *) {\\n --tw-text-opacity: 1;\\n color: rgb(156 163 175 / var(--tw-text-opacity, 1));\\n}\\n.dark\\\\:text-green-400:is(.dark *) {\\n --tw-text-opacity: 1;\\n color: rgb(74 222 128 / var(--tw-text-opacity, 1));\\n}\\n.dark\\\\:text-primary:is(.dark *) {\\n color: hsl(var(--primary));\\n}\\n.dark\\\\:text-purple-400:is(.dark *) {\\n --tw-text-opacity: 1;\\n color: rgb(192 132 252 / var(--tw-text-opacity, 1));\\n}\\n.dark\\\\:text-red-400:is(.dark *) {\\n --tw-text-opacity: 1;\\n color: rgb(248 113 113 / var(--tw-text-opacity, 1));\\n}\\n.dark\\\\:text-slate-200:is(.dark *) {\\n --tw-text-opacity: 1;\\n color: rgb(226 232 240 / var(--tw-text-opacity, 1));\\n}\\n.dark\\\\:text-yellow-400:is(.dark *) {\\n --tw-text-opacity: 1;\\n color: rgb(250 204 21 / var(--tw-text-opacity, 1));\\n}\\n.dark\\\\:hover\\\\:bg-emerald-700:hover:is(.dark *) {\\n --tw-bg-opacity: 1;\\n background-color: rgb(4 120 87 / var(--tw-bg-opacity, 1));\\n}\\n.dark\\\\:hover\\\\:bg-slate-700\\\\/30:hover:is(.dark *) {\\n background-color: rgb(51 65 85 / 0.3);\\n}\\n.dark\\\\:hover\\\\:bg-slate-800:hover:is(.dark *) {\\n --tw-bg-opacity: 1;\\n background-color: rgb(30 41 59 / var(--tw-bg-opacity, 1));\\n}\\n.dark\\\\:hover\\\\:bg-slate-800\\\\/50:hover:is(.dark *) {\\n background-color: rgb(30 41 59 / 0.5);\\n}\\n@media (min-width: 640px) {\\n .sm\\\\:ml-2 {\\n margin-left: 0.5rem;\\n }\\n .sm\\\\:block {\\n display: block;\\n }\\n .sm\\\\:flex {\\n display: flex;\\n }\\n .sm\\\\:w-56 {\\n width: 14rem;\\n }\\n .sm\\\\:flex-row {\\n flex-direction: row;\\n }\\n .sm\\\\:items-center {\\n align-items: center;\\n }\\n .sm\\\\:justify-between {\\n justify-content: space-between;\\n }\\n .sm\\\\:gap-2 {\\n gap: 0.5rem;\\n }\\n .sm\\\\:pl-3 {\\n padding-left: 0.75rem;\\n }\\n}\\n@media (min-width: 768px) {\\n .md\\\\:block {\\n display: block;\\n }\\n .md\\\\:flex {\\n display: flex;\\n }\\n .md\\\\:hidden {\\n display: none;\\n }\\n .md\\\\:h-16 {\\n height: 4rem;\\n }\\n .md\\\\:h-32 {\\n height: 8rem;\\n }\\n .md\\\\:w-16 {\\n width: 4rem;\\n }\\n .md\\\\:w-32 {\\n width: 8rem;\\n }\\n .md\\\\:text-4xl {\\n font-size: 2.25rem;\\n line-height: 2.5rem;\\n }\\n .md\\\\:text-9xl {\\n font-size: 8rem;\\n line-height: 1;\\n }\\n}\\n@media (min-width: 1024px) {\\n .lg\\\\:block {\\n display: block;\\n }\\n .lg\\\\:flex {\\n display: flex;\\n }\\n .lg\\\\:hidden {\\n display: none;\\n }\\n .lg\\\\:flex-row {\\n flex-direction: row;\\n }\\n .lg\\\\:p-12 {\\n padding: 3rem;\\n }\\n .lg\\\\:p-8 {\\n padding: 2rem;\\n }\\n .lg\\\\:px-6 {\\n padding-left: 1.5rem;\\n padding-right: 1.5rem;\\n }\\n .lg\\\\:pl-\\\\[260px\\\\] {\\n padding-left: 260px;\\n }\\n .lg\\\\:pl-\\\\[72px\\\\] {\\n padding-left: 72px;\\n }\\n .lg\\\\:text-4xl {\\n font-size: 2.25rem;\\n line-height: 2.5rem;\\n }\\n .lg\\\\:text-\\\\[28px\\\\] {\\n font-size: 28px;\\n }\\n}\\n\")"],"mappings":"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","names":["React","jsx","React","jsx","React","jsx","React","jsx","jsxs","React","jsx","React","jsx","jsxs","React","jsx","jsxs","React","cva","jsx","cva","React","jsx","jsxs","jsx","jsxs","React","jsx","jsxs","React","jsx","jsxs","React","jsx","jsxs","React","jsx","jsxs","status","Fragment","jsx","jsxs","React","jsx","jsxs","React","jsx","jsxs","React","React","jsx","jsxs","Fragment","jsx","jsxs","React","jsx","jsxs","React","Fragment","jsx","jsxs","React","jsx","jsxs","React","Fragment","jsx","jsxs","React","Shuffle","jsx","jsxs","jsx","jsxs","React","jsx","jsxs","React","React","jsx","jsxs","Fragment","jsx","jsx","jsxs","jsx","jsxs","React","jsx","jsxs","React","jsx","jsxs","React","jsx","jsxs","React","React","React","Fragment","jsx","jsxs","React","jsx","Fragment","jsx","jsxs","React","Fragment","jsx","jsxs","Fragment","jsx","jsxs","React","jsx","jsxs","React","jsx","jsxs","React","jsx","jsxs","variantStyles","React","jsx","jsxs","React","jsx","jsxs","React","jsx","jsxs"]}