@infuro/cms-core 1.0.5 → 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/admin.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/admin/pages/AdminLayout.tsx","../src/components/Admin/Header.tsx","../src/components/ui/button.tsx","../src/lib/utils.ts","../src/components/ui/dropdown-menu.tsx","../src/components/Admin/Sidebar.tsx","../src/admin/admin-config-context.tsx","../src/lib/infuro-favicon.ts","../src/admin/admin-theme.ts","../src/admin/AdminShell.tsx","../src/components/Admin/CRUD.tsx","../src/components/Admin/CreateEditForm.tsx","../src/components/ui/input.tsx","../src/components/ui/textarea.tsx","../src/components/ui/select.tsx","../src/components/ui/switch.tsx","../src/components/ui/label.tsx","../src/components/ui/file-upload.tsx","../src/components/ui/progress.tsx","../src/components/Admin/RelationAutocomplete.tsx","../src/components/ui/table.tsx","../src/components/ui/pagination.tsx","../src/components/ui/tooltip.tsx","../src/components/ui/dialog.tsx","../src/components/Admin/BulkUploadDialog.tsx","../src/components/Admin/FormBuilder.tsx","../src/components/ui/badge.tsx","../src/components/Admin/FormBuilder/FieldConfiguration.tsx","../src/components/Admin/BlogEditorPage.tsx","../src/components/ui/image-upload.tsx","../src/components/Admin/TagAutocomplete.tsx","../src/components/Admin/CategoryAutocomplete.tsx","../src/components/Admin/UserAutocomplete.tsx","../src/components/Admin/AnalyticsChart.tsx","../src/components/Admin/DailyUserChart.tsx","../src/components/Admin/GeographicMap.tsx","../src/components/Admin/AnalyticsCard.tsx","../src/components/Admin/AnalyticsExclusion.tsx","../src/hooks/use-analytics.ts","../src/components/Admin/ComponentSettings.tsx","../src/components/Admin/NavbarEditor.tsx","../src/admin/pages/SignInPage.tsx","../src/admin/pages/ForgotPasswordPage.tsx","../src/admin/pages/ResetPasswordPage.tsx","../src/admin/pages/InvitePage.tsx","../src/admin/pages/DashboardPage.tsx","../src/admin/pages/AdminPageResolver.tsx","../src/components/Admin/PolicyEditorPage.tsx","../src/admin/pages/SubmissionDetailPage.tsx","../src/admin/pages/OrderDetailPage.tsx","../src/components/Admin/DetailPageLayout.tsx","../src/admin/pages/PaymentDetailPage.tsx","../src/admin/pages/ContactDetailPage.tsx","../src/admin/pages/SettingsPage.tsx","../src/admin/pages/MediaLibraryPage.tsx","../src/admin/pages/PageBuilderPage.tsx","../src/theme/registry.ts","../src/admin/pages/PluginsPage.tsx","../src/admin/pages/BrandEditPage.tsx","../src/components/Admin/SeoSection.tsx","../src/admin/store-crud-configs.ts","../src/admin/pages/LayoutSettingsPage.tsx","../src/admin/config.ts","../src/admin/CmsProviders.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useEffect, useState } from \"react\";\nimport { SessionProvider, useSession } from \"next-auth/react\";\nimport { useRouter, usePathname } from \"next/navigation\";\nimport { Toaster } from \"sonner\";\nimport AdminHeader from \"../../components/Admin/Header\";\nimport AdminSidebar from \"../../components/Admin/Sidebar\";\nimport { ADMIN_THEME_CSS } from \"../admin-theme\";\nimport { AdminConfigContext, type CustomNavItem, type CustomNavSection, type CustomCrudConfig, type ThemeRegistryItem } from \"../admin-config-context\";\nimport type { ThemeConfig } from \"../../theme/types\";\n\nconst PUBLIC_ADMIN_PATHS = [\"/admin/signin\", \"/admin/forgot-password\", \"/admin/reset-password\", \"/admin/invite\"];\nconst AdminStyle = () => <style dangerouslySetInnerHTML={{ __html: ADMIN_THEME_CSS }} />;\n\nfunction useAdminViewSettings() {\n useEffect(() => {\n fetch('/api/settings/admin_view')\n .then((r) => (r.ok ? r.json() : null))\n .then((data: Record<string, string> | null) => {\n if (!data) return;\n const root = document.getElementById('admin-root');\n if (data.compactView === 'false' && root) root.classList.remove('admin-app');\n else if (root) root.classList.add('admin-app');\n })\n .catch(() => {});\n }, []);\n}\n\nfunction AdminLayoutInner({ children }: { children: React.ReactNode }) {\n const { data: session, status } = useSession();\n const router = useRouter();\n const pathname = usePathname();\n const [loadingTimeout, setLoadingTimeout] = useState(false);\n useAdminViewSettings();\n\n const isPublicPath = PUBLIC_ADMIN_PATHS.includes(pathname);\n\n useEffect(() => {\n if (isPublicPath) return;\n \n if (status === \"loading\") {\n const timeout = setTimeout(() => setLoadingTimeout(true), 10000);\n return () => clearTimeout(timeout);\n }\n \n if (!session) {\n router.push(\"/admin/signin\");\n } else {\n setLoadingTimeout(false);\n }\n }, [session, status, router, pathname, isPublicPath]);\n\n if (isPublicPath) {\n return <><AdminStyle />{children}</>;\n }\n\n if (status === \"loading\") {\n return (\n <div className=\"flex items-center justify-center min-h-screen\">\n <AdminStyle />\n <div className=\"text-center\">\n <div className=\"animate-spin rounded-full h-32 w-32 border-2 border-gray-300 border-t-gray-700 mx-auto\"></div>\n <p className=\"mt-4 text-gray-600 text-sm\">Loading admin panel...</p>\n {loadingTimeout && (\n <div className=\"mt-4 p-4 bg-amber-50 border border-amber-300 rounded text-sm\">\n <p className=\"text-amber-800\">\n Loading timeout.\n <button onClick={() => window.location.reload()} className=\"ml-2 text-gray-700 hover:underline font-medium\">\n Refresh\n </button>\n </p>\n </div>\n )}\n </div>\n </div>\n );\n }\n\n if (!session) {\n return null;\n }\n\n return (\n <div id=\"admin-root\" className=\"admin-app h-screen bg-gray-100 flex flex-col overflow-hidden\">\n <AdminStyle />\n <AdminHeader />\n <div className=\"flex flex-1 min-h-0\">\n <AdminSidebar />\n <main className=\"admin-scroll flex-1 p-4 bg-gray-100 overflow-auto\">{children}</main>\n </div>\n <Toaster position=\"top-right\" />\n </div>\n );\n}\n\nexport interface AdminLayoutProps {\n children: React.ReactNode;\n customNavItems?: CustomNavItem[];\n customNavSections?: CustomNavSection[];\n customCrudConfigs?: Record<string, CustomCrudConfig>;\n theme?: ThemeConfig;\n themeRegistry?: ThemeRegistryItem[];\n pluginDescriptors?: import(\"../admin-config-context\").PluginDescriptor[];\n}\n\nfunction useResolvedTheme(\n theme: ThemeConfig | undefined,\n themeRegistry: ThemeRegistryItem[] | undefined\n): ThemeConfig | undefined {\n const [activeThemeId, setActiveThemeId] = useState<string | null>(null);\n\n useEffect(() => {\n if (!themeRegistry || themeRegistry.length === 0) return;\n fetch(\"/api/settings/theme\")\n .then((r) => (r.ok ? r.json() : {}))\n .then((data: Record<string, string>) => {\n const id = data?.activeThemeId?.trim();\n setActiveThemeId(id || null);\n })\n .catch(() => {});\n }, [themeRegistry]);\n\n if (!themeRegistry || themeRegistry.length === 0) return theme;\n const id = activeThemeId || themeRegistry[0]?.id;\n const found = themeRegistry.find((t) => t.id === id);\n return found?.config ?? theme ?? themeRegistry[0]?.config;\n}\n\nfunction useStoreEnabled(): boolean {\n const [storeEnabled, setStoreEnabled] = useState(false);\n\n useEffect(() => {\n fetch(\"/api/settings/store\")\n .then((r) => (r.ok ? r.json() : {}))\n .then((data: Record<string, string>) => {\n setStoreEnabled(data?.enabled === 'true');\n })\n .catch(() => {});\n }, []);\n\n return storeEnabled;\n}\n\nexport default function AdminLayout({ children, customNavItems = [], customNavSections = [], customCrudConfigs = {}, theme, themeRegistry, pluginDescriptors = [] }: AdminLayoutProps) {\n const resolvedTheme = useResolvedTheme(theme, themeRegistry);\n const storeEnabled = useStoreEnabled();\n const configValue = React.useMemo(\n () => ({\n customNavItems,\n customNavSections,\n customCrudConfigs,\n theme: resolvedTheme,\n themeRegistry,\n pluginDescriptors,\n storeEnabled,\n }),\n [customNavItems, customNavSections, customCrudConfigs, resolvedTheme, themeRegistry, pluginDescriptors, storeEnabled]\n );\n return (\n <SessionProvider>\n <AdminConfigContext.Provider value={configValue}>\n <AdminLayoutInner>{children}</AdminLayoutInner>\n </AdminConfigContext.Provider>\n </SessionProvider>\n );\n}\n","\"use client\";\n\nimport { signOut, useSession } from \"next-auth/react\";\nimport { Button } from \"@/components/ui/button\";\nimport { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem } from \"@/components/ui/dropdown-menu\";\nimport Image from \"next/image\";\nimport { LogOut, Settings, User, ChevronDown } from \"lucide-react\";\nimport Link from \"next/link\";\n\nexport default function AdminHeader() {\n const { data: session } = useSession();\n\n const handleLogout = () => {\n signOut({ callbackUrl: \"/admin/signin\" });\n };\n\n return (\n <header className=\"bg-white border-b border-gray-200 px-4 py-2\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center max-h-9 shrink-0\">\n <Image\n src={process.env.NEXT_PUBLIC_ADMIN_LOGO_URL || \"/images/logo/logo.png\"}\n alt=\"Admin\"\n width={120}\n height={34}\n className=\"max-h-9 w-auto object-contain object-left\"\n />\n </div>\n <div className=\"flex items-center space-x-3\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button \n variant=\"ghost\" \n className=\"flex items-center space-x-2 px-2 py-1.5 hover:bg-gray-100 rounded-md transition-colors text-gray-700\"\n >\n <div className=\"h-7 w-7 rounded-full bg-gray-700 flex items-center justify-center overflow-hidden relative\">\n {session?.user?.image ? (\n <Image \n src={session.user.image} \n alt={session?.user?.name || \"User\"} \n fill\n className=\"object-cover\"\n />\n ) : (\n <span className=\"text-xs font-medium text-gray-100\">\n {session?.user?.name?.charAt(0).toUpperCase() || session?.user?.email?.charAt(0).toUpperCase() || \"A\"}\n </span>\n )}\n </div>\n <div className=\"flex flex-col items-start\">\n <span className=\"text-[13px] font-medium text-gray-900\">\n {session?.user?.name || session?.user?.email || \"Admin\"}\n </span>\n <span className=\"text-[11px] text-gray-500\">Administrator</span>\n </div>\n <ChevronDown className=\"h-3.5 w-3.5 text-gray-400\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-56\">\n <DropdownMenuItem asChild>\n <Link href=\"/admin/profile\" className=\"flex items-center text-gray-600\">\n <User className=\"mr-2 h-4 w-4\" />\n Profile\n </Link>\n </DropdownMenuItem>\n <DropdownMenuItem asChild>\n <Link href=\"/admin/settings\" className=\"flex items-center text-gray-600\">\n <Settings className=\"mr-2 h-4 w-4\" />\n Settings\n </Link>\n </DropdownMenuItem>\n <DropdownMenuItem onClick={handleLogout} className=\"text-red-600\">\n <LogOut className=\"mr-2 h-4 w-4\" />\n Sign Out\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n </header>\n );\n}\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground shadow hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2\",\n sm: \"h-8 rounded-md px-3 text-xs\",\n lg: \"h-10 rounded-md px-8\",\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}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\"\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n )\n }\n)\nButton.displayName = \"Button\"\n\nexport { Button, buttonVariants }\n","import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\nexport function generateSlug(title: string): string {\n return title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/(^-|-$)/g, '');\n}\n\nexport function validateSlug(slug: string): boolean {\n const slugRegex = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\n return slugRegex.test(slug) && slug.length >= 3 && slug.length <= 50;\n}\n\nexport function formatDate(date: Date | string): string {\n const d = new Date(date);\n return d.toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' });\n}\n\nexport function formatDateTime(date: Date | string): string {\n const d = new Date(date);\n return d.toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n}\n\nexport function formatDateOnly(date: Date | string): string {\n const d = new Date(date);\n return d.toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' });\n}\n\nexport function truncateText(text: string, maxLength: number): string {\n if (text.length <= maxLength) return text;\n return text.substring(0, maxLength).trim() + '...';\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\"\nimport { Check, ChevronRight, Circle } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst DropdownMenu = DropdownMenuPrimitive.Root\n\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger\n\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group\n\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal\n\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub\n\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n \"flex cursor-default gap-2 select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ml-auto\" />\n </DropdownMenuPrimitive.SubTrigger>\n))\nDropdownMenuSubTrigger.displayName =\n DropdownMenuPrimitive.SubTrigger.displayName\n\nconst DropdownMenuSubContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.SubContent\n ref={ref}\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className\n )}\n {...props}\n />\n))\nDropdownMenuSubContent.displayName =\n DropdownMenuPrimitive.SubContent.displayName\n\nconst DropdownMenuContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md\",\n \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n))\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName\n\nconst DropdownMenuItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&>svg]:size-4 [&>svg]:shrink-0\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n />\n))\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName\n\nconst DropdownMenuCheckboxItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <DropdownMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n))\nDropdownMenuCheckboxItem.displayName =\n DropdownMenuPrimitive.CheckboxItem.displayName\n\nconst DropdownMenuRadioItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.RadioItem\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Circle className=\"h-2 w-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n))\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName\n\nconst DropdownMenuLabel = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Label\n ref={ref}\n className={cn(\n \"px-2 py-1.5 text-sm font-semibold\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n />\n))\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName\n\nconst DropdownMenuSeparator = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n {...props}\n />\n))\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName\n\nconst DropdownMenuShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span\n className={cn(\"ml-auto text-xs tracking-widest opacity-60\", className)}\n {...props}\n />\n )\n}\nDropdownMenuShortcut.displayName = \"DropdownMenuShortcut\"\n\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuRadioGroup,\n}\n","\"use client\";\n\nimport Link from \"next/link\";\nimport Image from \"next/image\";\nimport { usePathname } from \"next/navigation\";\nimport { useContext } from \"react\";\nimport {\n File,\n Users,\n Inbox,\n LinkIcon,\n LayoutDashboard,\n ClipboardList,\n MessageSquare,\n Settings,\n Image as ImageIcon,\n Car,\n MapPin,\n Building2,\n Package,\n Puzzle,\n ShoppingBag,\n Layers,\n ShoppingCart,\n CreditCard,\n Receipt,\n FolderTree,\n} from \"lucide-react\";\nimport { AdminConfigContext } from \"../../admin/admin-config-context\";\nimport { INFURO_FAVICON_BASE64 } from \"../../lib/infuro-favicon\";\n\nconst INFURO_FOOTER_LABEL = \"Infuro Tech Solutions LLP\";\nconst INFURO_FOOTER_URL = \"https://infurotech.com\";\n\nconst CUSTOM_ICON_MAP: Record<string, React.ComponentType<{ className?: string }>> = {\n car: Car,\n map: MapPin,\n building: Building2,\n package: Package,\n file: File,\n};\n\nfunction getIconForItem(iconName?: string) {\n if (!iconName) return File;\n const Icon = CUSTOM_ICON_MAP[iconName.toLowerCase()];\n return Icon ?? File;\n}\n\nexport default function AdminSidebar() {\n const pathname = usePathname();\n const { customNavItems, customNavSections = [], storeEnabled } = useContext(AdminConfigContext);\n\n const isActive = (path: string) => {\n if (path === \"/admin/dashboard\") {\n return pathname === path;\n }\n return pathname.startsWith(path);\n };\n\n const linkActive = 'bg-gray-200 text-gray-900';\n const linkInactive = 'text-gray-600 hover:bg-gray-100 hover:text-gray-900';\n const iconActive = 'text-gray-700';\n const iconInactive = 'text-gray-400';\n const linkCls = 'flex items-center px-2.5 py-[7px] text-[13px] font-medium rounded-md transition-colors';\n const sectionCls = 'mb-5';\n const headingCls = 'text-[11px] font-semibold text-gray-400 uppercase tracking-wider px-2.5 mb-1.5';\n\n return (\n <aside className=\"w-52 h-full min-h-0 bg-white border-r border-gray-200 flex-shrink-0 flex flex-col overflow-hidden\">\n <div className=\"flex flex-col flex-1 min-h-0 overflow-hidden\">\n <nav className=\"admin-scroll flex-1 min-h-0 px-3 py-4 pb-4 overflow-y-auto overscroll-contain\">\n <div className={sectionCls}>\n <h3 className={headingCls}>Main</h3>\n <ul className=\"space-y-0.5\">\n <li>\n <Link\n href=\"/admin/dashboard\"\n className={`${linkCls} ${isActive(\"/admin/dashboard\") ? linkActive : linkInactive}`}\n >\n <LayoutDashboard className={`h-4 w-4 mr-2 ${isActive(\"/admin/dashboard\") ? iconActive : iconInactive}`} />\n Dashboard\n </Link>\n </li>\n </ul>\n </div>\n {customNavSections.length > 0 && customNavSections.map((section) => (\n <div key={section.title} className={sectionCls}>\n <h3 className={headingCls}>{section.title}</h3>\n <ul className=\"space-y-0.5\">\n {section.items.map((item) => {\n const Icon = getIconForItem(item.icon);\n return (\n <li key={item.href}>\n <Link href={item.href} className={`${linkCls} ${isActive(item.href) ? linkActive : linkInactive}`}>\n <Icon className={`h-4 w-4 mr-2 ${isActive(item.href) ? iconActive : iconInactive}`} />\n {item.label}\n </Link>\n </li>\n );\n })}\n </ul>\n </div>\n ))}\n {customNavSections.length === 0 && customNavItems.length > 0 && (\n <div className={sectionCls}>\n <h3 className={headingCls}>Custom</h3>\n <ul className=\"space-y-0.5\">\n {customNavItems.map((item) => {\n const Icon = getIconForItem(item.icon);\n return (\n <li key={item.href}>\n <Link href={item.href} className={`${linkCls} ${isActive(item.href) ? linkActive : linkInactive}`}>\n <Icon className={`h-4 w-4 mr-2 ${isActive(item.href) ? iconActive : iconInactive}`} />\n {item.label}\n </Link>\n </li>\n );\n })}\n </ul>\n </div>\n )}\n {storeEnabled && (\n <div className={sectionCls}>\n <h3 className={headingCls}>Store</h3>\n <ul className=\"space-y-0.5\">\n <li><Link href=\"/admin/products\" className={`${linkCls} ${isActive(\"/admin/products\") ? linkActive : linkInactive}`}><ShoppingBag className={`h-4 w-4 mr-2 ${isActive(\"/admin/products\") ? iconActive : iconInactive}`} />Products</Link></li>\n <li><Link href=\"/admin/collections\" className={`${linkCls} ${isActive(\"/admin/collections\") ? linkActive : linkInactive}`}><Layers className={`h-4 w-4 mr-2 ${isActive(\"/admin/collections\") ? iconActive : iconInactive}`} />Collections</Link></li>\n <li><Link href=\"/admin/orders\" className={`${linkCls} ${isActive(\"/admin/orders\") ? linkActive : linkInactive}`}><ShoppingCart className={`h-4 w-4 mr-2 ${isActive(\"/admin/orders\") ? iconActive : iconInactive}`} />Orders</Link></li>\n <li><Link href=\"/admin/payments\" className={`${linkCls} ${isActive(\"/admin/payments\") ? linkActive : linkInactive}`}><CreditCard className={`h-4 w-4 mr-2 ${isActive(\"/admin/payments\") ? iconActive : iconInactive}`} />Payments</Link></li>\n <li><Link href=\"/admin/taxes\" className={`${linkCls} ${isActive(\"/admin/taxes\") ? linkActive : linkInactive}`}><Receipt className={`h-4 w-4 mr-2 ${isActive(\"/admin/taxes\") ? iconActive : iconInactive}`} />Taxes</Link></li>\n <li><Link href=\"/admin/brands\" className={`${linkCls} ${isActive(\"/admin/brands\") ? linkActive : linkInactive}`}><Building2 className={`h-4 w-4 mr-2 ${isActive(\"/admin/brands\") ? iconActive : iconInactive}`} />Brands</Link></li>\n <li><Link href=\"/admin/product_categories\" className={`${linkCls} ${isActive(\"/admin/product_categories\") ? linkActive : linkInactive}`}><FolderTree className={`h-4 w-4 mr-2 ${isActive(\"/admin/product_categories\") ? iconActive : iconInactive}`} />Categories</Link></li>\n </ul>\n </div>\n )}\n <div className={sectionCls}>\n <h3 className={headingCls}>Management</h3>\n <ul className=\"space-y-0.5\">\n <li><Link href=\"/admin/contacts\" className={`${linkCls} ${isActive(\"/admin/contacts\") ? linkActive : linkInactive}`}><Inbox className={`h-4 w-4 mr-2 ${isActive(\"/admin/contacts\") ? iconActive : iconInactive}`} />Contacts</Link></li>\n <li><Link href=\"/admin/blogs\" className={`${linkCls} ${isActive(\"/admin/blogs\") ? linkActive : linkInactive}`}><File className={`h-4 w-4 mr-2 ${isActive(\"/admin/blogs\") ? iconActive : iconInactive}`} />Blogs</Link></li>\n <li><Link href=\"/admin/pages\" className={`${linkCls} ${isActive(\"/admin/pages\") ? linkActive : linkInactive}`}><LinkIcon className={`h-4 w-4 mr-2 ${isActive(\"/admin/pages\") ? iconActive : iconInactive}`} />Pages</Link></li>\n <li><Link href=\"/admin/forms\" className={`${linkCls} ${isActive(\"/admin/forms\") ? linkActive : linkInactive}`}><ClipboardList className={`h-4 w-4 mr-2 ${isActive(\"/admin/forms\") ? iconActive : iconInactive}`} />Forms</Link></li>\n <li><Link href=\"/admin/submissions\" className={`${linkCls} ${isActive(\"/admin/submissions\") ? linkActive : linkInactive}`}><MessageSquare className={`h-4 w-4 mr-2 ${isActive(\"/admin/submissions\") ? iconActive : iconInactive}`} />Submissions</Link></li>\n <li><Link href=\"/admin/media\" className={`${linkCls} ${isActive(\"/admin/media\") ? linkActive : linkInactive}`}><ImageIcon className={`h-4 w-4 mr-2 ${isActive(\"/admin/media\") ? iconActive : iconInactive}`} />Media</Link></li>\n </ul>\n </div>\n <div className={sectionCls}>\n <h3 className={headingCls}>System</h3>\n <ul className=\"space-y-0.5\">\n <li><Link href=\"/admin/users\" className={`${linkCls} ${isActive(\"/admin/users\") ? linkActive : linkInactive}`}><Users className={`h-4 w-4 mr-2 ${isActive(\"/admin/users\") ? iconActive : iconInactive}`} />Users</Link></li>\n <li><Link href=\"/admin/plugins\" className={`${linkCls} ${isActive(\"/admin/plugins\") ? linkActive : linkInactive}`}><Puzzle className={`h-4 w-4 mr-2 ${isActive(\"/admin/plugins\") ? iconActive : iconInactive}`} />Plugins</Link></li>\n <li><Link href=\"/admin/settings\" className={`${linkCls} ${isActive(\"/admin/settings\") ? linkActive : linkInactive}`}><Settings className={`h-4 w-4 mr-2 ${isActive(\"/admin/settings\") ? iconActive : iconInactive}`} />Settings</Link></li>\n </ul>\n </div>\n </nav>\n <footer className=\"flex-shrink-0 px-3 py-3 border-t border-gray-200 bg-white\">\n <a\n href={INFURO_FOOTER_URL}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center gap-2 text-gray-500 hover:text-gray-700 transition-colors\"\n >\n <Image src={INFURO_FAVICON_BASE64} alt={INFURO_FOOTER_LABEL} width={32} height={32} className=\"rounded object-contain\" unoptimized />\n <span className=\"text-[11px] font-medium leading-tight\">{INFURO_FOOTER_LABEL}</span>\n </a>\n </footer>\n </div>\n </aside>\n );\n}\n","'use client';\n\nimport React, { createContext } from 'react';\nimport type { ThemeConfig } from '../theme/types';\n\nexport interface ThemeRegistryItem {\n id: string;\n label: string;\n config: ThemeConfig;\n /** Optional image URL for theme card */\n image?: string;\n /** Optional short description for theme card */\n description?: string;\n}\n\nexport interface PluginDescriptor {\n name: string;\n label: string;\n version: string;\n description?: string;\n enabled?: boolean;\n /** Icon name for card display (e.g. 'storage', 'email', 'payment') */\n icon?: string;\n}\n\nexport interface CustomNavItem {\n href: string;\n label: string;\n icon?: string;\n}\n\nexport interface CustomNavSection {\n title: string;\n items: CustomNavItem[];\n}\n\nexport interface CustomCrudColumn {\n field: string;\n displayName: string;\n type?: string;\n /** When set, form renders an async searchable relation dropdown instead of a plain input. */\n relationApi?: string;\n /** Field on the relation entity to show in the list (default: 'name'). */\n relationLabelField?: string;\n /** Field on the relation entity to use as value (default: 'id'). */\n relationValueField?: string;\n}\n\n/** Single filter: select (status, method, inventory) or dateRange or text (paymentRef, orderNumber). */\nexport interface CrudFilterSelectOption {\n value: string;\n label: string;\n}\n\nexport interface CrudFilter {\n /** Query param name (e.g. status, dateFrom, paymentRef). */\n param: string;\n label: string;\n type: 'select' | 'dateRange' | 'text';\n /** For type select: options. For dateRange: param is base; API expects param+From and param+To (e.g. dateFrom, dateTo). */\n options?: CrudFilterSelectOption[];\n}\n\nexport interface CustomCrudConfig {\n title: string;\n apiEndpoint: string;\n columns: CustomCrudColumn[];\n addEditPageUrl: string;\n /** Default sort order for list (e.g. 'desc' for newest first). */\n defaultSortOrder?: 'asc' | 'desc';\n /** Default sort field for list (e.g. 'createdAt'). */\n defaultSortField?: string;\n /** Optional list filters (status, date range, paymentRef, orderNumber, etc.). */\n filters?: CrudFilter[];\n}\n\nexport interface AdminConfigValue {\n customNavItems: CustomNavItem[];\n customNavSections?: CustomNavSection[];\n customCrudConfigs: Record<string, CustomCrudConfig>;\n theme?: ThemeConfig;\n themeRegistry?: ThemeRegistryItem[];\n activeThemeId?: string;\n pluginDescriptors?: PluginDescriptor[];\n storeEnabled?: boolean;\n}\n\nconst defaultValue: AdminConfigValue = {\n customNavItems: [],\n customNavSections: [],\n customCrudConfigs: {},\n};\n\nexport const AdminConfigContext = createContext<AdminConfigValue>(defaultValue);\n","export const INFURO_FAVICON_BASE64 = \"data:image/x-icon;base64,AAABAAMAEBAAAAEAIABoBAAANgAAACAgAAABACAAKBEAAJ4EAAAwMAAAAQAgAGgmAADGFQAAKAAAABAAAAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8V////bv///7D////R////0f///7D///9u////FQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wL///9s0qun7q9qYv/DkYv/6tfV///+/v///////////////+7///9r////AgAAAAAAAAAAAAAAAP///wL///+Q/////sqcl/+WOzH/ljsx/5c9M//AiYP/+/j4/////////////////v///5D///8CAAAAAAAAAAD///9s/////v/////Oo5//lz00/5Y7Mf+WOzH/ljsx/7Z3cP/9+/v////////////////+////bAAAAAD///8V////7v///////////v39//Tq6f/QqKP/m0U8/5Y7Mf+WOzH/z6ah/////////////////////+7///8V////bv///////////////////////////////+XOy/+ZQTf/ljsx/59MQ//69fX/////////////////////bv///7D/////////////////////////////////////wYyG/5Y7Mf+WOzH/4MTC/////////////////////7D////R//////////////////7+//79/f/+/f3//v39/+DGw/+WOzH/ljsx/82inf/////////////////////R////0f///////////////9Svq/+mWVH/pllR/6ZZUf+iUUj/ljsx/5Y7Mf/KnJf/////////////////////0f///7D////////////////KnJf/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/062p/////////////////////7D///9u////////////////0amk/6FQSP+hUEj/oVBI/6JRSP+mWVH/plpS/+7g3v////////////////////9u////Ff///+7///////////7+/v/9/Pz/9u7t/8SSjP/Dj4r/9ezr//79/f/////////////////////u////FQAAAAD///9s/////v///////////////8OPif+WOzH/ljsx/7+Jgv/////////////////////+////bAAAAAAAAAAA////Av///5D////+//////////+9hH7/ljsx/5Y7Mf+8g3z////////////////+////kP///wIAAAAAAAAAAAAAAAD///8C////bP///+7/////8OTi/7R0bP+zcmr/8OLh///////////u////bP///wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8V////bv///7D////R////0f///7D///9u////FQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAAAABAAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8C////Hf///0n///95////mf///67///+u////mf///3n///9J////Hf///wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8I////Tf///7D////p/////v////////////////////////////////////7////p////sP///03///8IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8C////Pfjz8r7HlpH7wY2H/86lof/iysf/9e3s///+/v//////////////////////////////////////////+////77///89////AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Cf///37////z9Ovq/6BORf+WOzH/ljsx/5Y8Mv+hUEf/v4iC/+rY1v/+/f3///////////////////////////////////////////H///99////CQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wr///+d/////P/////06+r/oE5F/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/m0Q7/8WTjf/38PD///////////////////////////////////////////z///+d////CgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8J////nf////3///////////Tr6v+gTkX/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/61mX//w4+L///////////////////////////////////////////3///+d////CQAAAAAAAAAAAAAAAAAAAAAAAAAA////Av///37////8////////////////9Ovq/6BORf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/6daUv/v4uD///////////////////////////////////////////z///9+////AgAAAAAAAAAAAAAAAAAAAAD///89////8//////////////////////48fD/rGRc/5pCOf+YPjT/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/6xkXf/37+////////////////////////////////////////////P///89AAAAAAAAAAAAAAAA////CP///77////////////////////////////////7+Pf/8eXj/+DGw/++hn//m0U8/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/8GLhf/9/Pz//////////////////////////////////////////77///8IAAAAAAAAAAD///9N////+/////////////////////////////////////////////////7+/v/p1tP/rGRd/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/mkI4/+XPzf//////////////////////////////////////////+////00AAAAA////Av///7D////////////////////////////////////////////////////////////////06+r/r2pi/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/tndw//38+///////////////////////////////////////////sP///wL///8d////6f/////////////////////////////////////////////////////////////////////x5eP/olJJ/5Y7Mf+WOzH/ljsx/5Y7Mf+aQjn/7dza///////////////////////////////////////////p////Hf///0n////+///////////////////////////////////////////////////////////////////////////Ur6v/ljwy/5Y7Mf+WOzH/ljsx/5Y7Mf/Oo5////////////////////////////////////////////7///9J////ef////////////////////////////////////////////////////////////////////////////////fw7/+jVEv/ljsx/5Y7Mf+WOzH/ljsx/7Nxav///////////////////////////////////////////////3n///+Z/////////////////////////////////////////////////////////////////////////////////////7yCfP+WOzH/ljsx/5Y7Mf+WOzH/pllQ//r29f//////////////////////////////////////////mf///67///////////////////////////////////////////79/f/9/Pz//fz8//38/P/9/Pz//fz8//38/P/9/Pz/yZuW/5Y7Mf+WOzH/ljsx/5Y7Mf+gT0b/9evr//////////////////////////////////////////+u////rv/////////////////////////////////////69vb/wo2I/7Z3cf+2d3H/tndx/7Z3cf+2d3H/tndx/7Z3cf+lV0//ljsx/5Y7Mf+WOzH/ljsx/6BORf/06+r//////////////////////////////////////////67///+Z//////////////////////////////////////Tr6v+gTkX/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/oE5F//Tr6v//////////////////////////////////////////mf///3n/////////////////////////////////////9Ovq/6BORf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+lVk7/+fPz//////////////////////////////////////////95////Sf////7////////////////////////////////06+r/oE5F/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/7FuZ////v7//////////////////////////////////////v///0n///8d////6f////////////////////////////////Tr6v+gTkX/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/zKCb///////////////////////////////////////////p////Hf///wL///+w////////////////////////////////+PLx/7d4cf+tZl//rWZf/61mX/+tZl//rWZf/61mX/+tZl//rmdg/7Z3cP+2d3H/tndx/7h7df/w4uH//////////////////////////////////////////7D///8CAAAAAP///03////7/////////////////////////////////Pv6//z6+f/8+vn//Pr5//z6+f/z6un/48zJ/+LKx//y5+b//fz8//38/P/9/Pz//fz8///////////////////////////////////////////7////TQAAAAAAAAAA////CP///77/////////////////////////////////////////////////////4MXC/6VXTv+WPDL/ljwy/6JRSP/aubb///7+/////////////////////////////////////////////////////77///8IAAAAAAAAAAAAAAAA////Pf////P///////////////////////////////////////////Xs6/+jU0r/ljsx/5Y7Mf+WOzH/ljsx/59MQv/w5OL////////////////////////////////////////////////z////PQAAAAAAAAAAAAAAAAAAAAD///8C////fv////z/////////////////////////////////////3sK//5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/9m5tf///////////////////////////////////////////P///37///8CAAAAAAAAAAAAAAAAAAAAAAAAAAD///8J////nf////3////////////////////////////////ZuLX/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/17Sw//////////////////////////////////////3///+d////CQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8K////nf////z//////////////////////////+zc2v+aQzn/ljsx/5Y7Mf+WOzH/ljsx/5pDOf/r2tj////////////////////////////////8////nf///woAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8J////fv////P//////////////////////v39/8eYkv+YPjT/ljsx/5Y7Mf+YPjT/xpSP//79/f//////////////////////////8////37///8JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8C////Pf///77////7/////////////////fv6/+DEwf/Ekoz/wY2H/97Bvv/8+vr/////////////////////+////77///89////AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////CP///03///+w////6f////7////////////////////////////////////+////6f///7D///9N////CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wL///8d////Sf///3n///+Z////rv///67///+Z////ef///0n///8d////AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAADAAAABgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8E////DP///xr///80////Rv///1n///9q////gP///4D///9q////Wf///0b///80////Gv///wz///8EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////CP///y7///9g////lP///7v////V////6P////r////8/////P////z////8////+v///+j////V////u////5T///9g////Lv///wgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wf///81////k////8/////v////+v////////////////////////////////////////////////////////////////////r////v////z////5P///81////BwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8G////Kv37+3zt3Nrd27y5/Nm6t//fxMH/59LQ//Dk4v/48vH//fv6//////////////////////////////////////////////////////////////////////z////d////fP///yr///8GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///xH///9g////wvz5+ffNop3+m0U8/5c+NP+cRz7/pFVN/65oYP+8gnv/0qun/+jU0v/59fT//v7+///////////////////////////////////////////////////////////+////9////8L///9f////EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////GP///4n////m/////fv4+P/KnJf/mUE4/5Y7Mf+WOzH/ljsx/5Y7Mf+XPTT/m0Q6/6ZaUf/BjIX/6NXT//z5+f////////////////////////////////////////////////////////////////3////k////if///xgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wH///8i////pP////f///////////v4+P/KnJf/mUE4/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+XPjT/oVFI/8yhnP/x5OP//vz8////////////////////////////////////////////////////////////////9////6T///8i////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///yL///+d////8/////////////////v4+P/KnJf/mUE4/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5tEOv+3eHL/48rH//37+/////////////////////////////////////////////////////////////////P///+d////IgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////GP///6T////z//////////////////////v4+P/KnJf/mUE4/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+YPjT/qFxT/9y+uv/9+vr////////////////////////////////////////////////////////////////z////pP///xgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8R////if////f///////////////////////////v4+P/KnJf/mUE4/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsy/6NUS//Yt7P//Pn4////////////////////////////////////////////////////////////////9////4n///8RAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wb///9g////5v////////////////////////////////v4+P/KnZj/mUI4/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5c8Mv+pXlb/38PA//38/P///////////////////////////////////////////////////////////////+b///9g////BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///yr////C/////f////////////////////////////////38+//dwLz/qF1V/51JP/+bRDv/mD40/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+XPTP/qWBY/+vZ2P///v7///////////////////////////////////////////////////////////3////C////KgAAAAAAAAAAAAAAAAAAAAAAAAAA////B////3z////3///////////////////////////////////////////9+/r/9/Dv/+zc2f/dwLz/x5iT/7BrY/+eS0H/lz0z/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/lzwy/7d6c//06un////////////////////////////////////////////////////////////////3////fP///wcAAAAAAAAAAAAAAAAAAAAA////Nf///93////+//////////////////////////////////////////////////////7+/v/+/v7//fz8//Hm5f/XtLH/s3Fq/5lCOP+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/51JP//Sq6b//Pn5///////////////////////////////////////////////////////////+////3f///zUAAAAAAAAAAAAAAAD///8I////k/////z////////////////////////////////////////////////////////////////////////////////9+/v/8eTj/8aVkP+dRz7/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5c8Mv+vamL/7uDf/////////////////////////////////////////////////////////////////P///5P///8IAAAAAAAAAAD///8u////z/////////////////////////////////////////////////////////////////////////////////////////////////fx8P/ImZP/nUg//5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+ZQTj/0qyo//38/P///////////////////////////////////////////////////////////////8////8uAAAAAP///wT///9g////7//////////////////////////////////////////////////////////////////////////////////////////////////////07Or/xJGL/5hAN/+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/rGRd//Tq6P///////////////////////////////////////////////////////////////+////9g////BP///wz///+U////+v////////////////////////////////////////////////////////////////////////////////////////////////////////7/8+jm/7Nya/+WPDP/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/mkQ7/9m3s////v7///////////////////////////////////////////////////////////r///+U////DP///xr///+7/////////////////////////////////////////////////////////////////////////////////////////////////////////////////v7+/+HHxP+hUEf/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljwy/7yBe//69/f///////////////////////////////////////////////////////////////+7////Gv///zT////V//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////bu7f+7gHr/mD40/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/6xkXP/u4N/////////////////////////////////////////////////////////////////V////NP///0b////o//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////38/P/XtK//nEY9/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/6BNRP/iycb////////////////////////////////////////////////////////////////o////Rv///1n////6///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////o1NL/pVhQ/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5xGPP/Yt7L//v39///////////////////////////////////////////////////////////6////Wf///2r////8///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////06un/sW1m/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5pDOf/PpKD//Pr5///////////////////////////////////////////////////////////8////av///4D////8/////////////////////////////////////////////////////////////v7//fv7//37+v/9+/r//fv6//37+v/9+/r//fv6//37+v/9+/r//fv6//37+v/06un/snBp/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5lBOP/KnJj/+/j4///////////////////////////////////////////////////////////8////gP///4D////8//////////////////////////////////////////////////////79/f/s3Nr/z6ej/8uemv/Lnpr/y56a/8uemv/Lnpr/y56a/8uemv/Lnpr/y56a/8uemv/GlI//o1VM/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5lBOP/KnJf/+/j4///////////////////////////////////////////////////////////8////gP///2r////8//////////////////////////////////////////////////////z5+f/Nop3/m0Q7/5Y8Mv+WPDL/ljwy/5Y8Mv+WPDL/ljwy/5Y8Mv+WPDL/ljwy/5Y8Mv+WPDL/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5lBOP/KnJf/+/j4///////////////////////////////////////////////////////////8////av///1n////6//////////////////////////////////////////////////////v4+P/KnJf/mUE4/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5lCOP/KnZj/+/j4///////////////////////////////////////////////////////////6////Wf///0b////o//////////////////////////////////////////////////////v4+P/KnJf/mUE4/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5pDOv/Qp6P//Pr6///////////////////////////////////////////////////////////o////Rv///zT////V//////////////////////////////////////////////////////v4+P/KnJf/mUE4/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/51IP//bvbr//v7+///////////////////////////////////////////////////////////V////NP///xr///+7//////////////////////////////////////////////////////v4+P/KnJf/mUE4/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/6RVTf/n0c////////////////////////////////////////////////////////////////+7////Gv///wz///+U////+v////////////////////////////////////////////////v4+P/KnJf/mUE4/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/7FuZ//z6ej///////////////////////////////////////////////////////////r///+U////DP///wT///9g////7/////////////////////////////////////////////////z4+P/LnZj/mkI5/5Y8Mv+WPDL/ljwy/5Y8Mv+WPDL/ljwy/5Y8Mv+WPDL/ljwy/5Y8Mv+WPDL/ljwy/5Y8Mv+WPDL/ljwy/5Y8Mv+WPDL/mUE3/8mblf/9+/r//////////////////////////////////////////////////////////+////9g////BAAAAAD///8u////z/////////////////////////////////////////////////38/P/iycb/v4iC/7yCfP+8gnz/vIJ8/7yCfP+8gnz/vIJ8/7yCfP+8gnz/vIJ8/7yCfP+8gnz/voR+/8qcl//Lnpr/y56a/8uemv/Lnpr/zqOf//Hl5P///v7//////////////////////////////////////////////////////////8////8uAAAAAAAAAAD///8I////k/////z////////////////////////////////////////////////9/Pz/+vf2//r39v/69/b/+vf2//r39v/69/b/+vf2//j08//07Ov/7+Df/+7f3v/z6+n/+PPy//z6+v/9+/r//fv6//37+v/9+/r//fv7///+/v///////////////////////////////////////////////////////////P///5P///8IAAAAAAAAAAAAAAAA////Nf///93////+/////////////////////////////////////////////////////////////////////////////v7/9u7t/9i3s/++hn//sW1m/7BsZf+7gnv/066q//Ln5v/+/v7////////////////////////////////////////////////////////////////////////////////+////3f///zUAAAAAAAAAAAAAAAAAAAAA////B////3z////3///////////////////////////////////////////////////////////////////////////17Ov/wo6I/55KQf+XPjT/ljsx/5Y7Mf+XPTP/nEY9/7uBe//x5eP////////////////////////////////////////////////////////////////////////////////3////fP///wcAAAAAAAAAAAAAAAAAAAAAAAAAAP///yr////C/////f////////////////////////////////////////////////////////////////37+//UsKz/nUg//5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5tEO//No57/+/j4//////////////////////////////////////////////////////////////////////3////C////KgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wb///9g////5v////////////////////////////////////////////////////////////////bv7/+5fHb/lz0z/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y8Mv+ycGj/8ujm/////////////////////////////////////////////////////////////////////+b///9g////BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8R////if////f//////////////////////////////////////////////////////////+3e3P+qYlr/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+oXVT/6tnX////////////////////////////////////////////////////////////////9////4n///8RAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////GP///6T////z/////////////////////////////////////////////////////+vZ1/+oXVT/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+nWlL/6dbU///////////////////////////////////////////////////////////z////pP///xgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///yL///+d////8/////////////////////////////////////////////////Hm5f+wa2T/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+uaGD/8OPh//////////////////////////////////////////////////////P///+d////IgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wH///8i////pP////f///////////////////////////////////////////r19P/CjYf/mD81/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5g/Nf/BjIb/+fTz////////////////////////////////////////////////9////6T///8i////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////GP///4n////m/////f////////////////////////////////7+/v/m0M7/qmFZ/5c9M/+WOzH/ljsx/5Y7Mf+WOzH/lz0z/6leV//lz8z//v7+//////////////////////////////////////3////m////if///xgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///xH///9g////wv////f////+///////////////////////////8+vr/4snG/7d4cf+iUUj/mUA3/5c+NP+gTkT/tXVu/+DFw//8+fn////////////////////////////////+////9////8L///9g////EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8G////Kv///3z////d/////P///////////////////////////v38//Tr6v/kzcv/2726/9m6t//jysf/8uno//78/P////////////////////////////////z////d////fP///yr///8GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wf///81////k////8/////v////+v////////////////////////////////////////////////////////////////////r////v////z////5P///81////BwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////CP///y7///9g////lP///7v////V////6P////r////8/////P////z////8////+v///+j////V////u////5T///9g////Lv///wgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8E////DP///xr///80////Rv///1n///9q////gP///4D///9q////Wf///0b///80////Gv///wz///8EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==\";\n","export const ADMIN_THEME_CSS = `\n@import url(\"https://fonts.googleapis.com/css2?family=Inter:wght@100;200;300;400;500;600;700;800;900&display=swap\");\n:root{--background:0 0% 100%;--foreground:0 0% 9%;--card:0 0% 100%;--card-foreground:0 0% 9%;--popover:0 0% 100%;--popover-foreground:0 0% 9%;--primary:0 0% 9%;--primary-foreground:0 0% 98%;--secondary:0 0% 96.1%;--secondary-foreground:0 0% 9%;--muted:0 0% 96.1%;--muted-foreground:0 0% 45.1%;--accent:0 0% 96.1%;--accent-foreground:0 0% 9%;--destructive:0 84.2% 60.2%;--destructive-foreground:0 0% 98%;--border:0 0% 89.8%;--input:0 0% 89.8%;--ring:0 0% 3.9%;--chart-1:0 0% 40%;--chart-2:0 0% 55%;--chart-3:0 0% 70%;--chart-4:0 0% 45%;--chart-5:0 0% 60%;--radius:0.375rem;--sidebar-background:0 0% 100%;--sidebar-foreground:0 0% 9%;--sidebar-primary:0 0% 9%;--sidebar-primary-foreground:0 0% 98%;--sidebar-accent:0 0% 96.1%;--sidebar-accent-foreground:0 0% 9%;--sidebar-border:0 0% 89.8%;--sidebar-ring:0 0% 9%}\n.dark{--background:0 0% 3.9%;--foreground:0 0% 98%;--card:0 0% 3.9%;--card-foreground:0 0% 98%;--primary:0 0% 98%;--primary-foreground:0 0% 9%;--secondary:0 0% 14.9%;--secondary-foreground:0 0% 98%;--muted:0 0% 14.9%;--muted-foreground:0 0% 63.9%;--border:0 0% 14.9%;--input:0 0% 14.9%;--ring:0 0% 83.1%;--sidebar-background:0 0% 9%;--sidebar-foreground:0 0% 98%;--sidebar-primary:0 0% 98%;--sidebar-primary-foreground:0 0% 9%;--sidebar-accent:0 0% 14.9%;--sidebar-accent-foreground:0 0% 98%;--sidebar-border:0 0% 14.9%;--sidebar-ring:0 0% 83.1%}\n*,*::before,*::after{border-color:hsl(var(--border))}\nbody{font-family:\"Inter\",ui-sans-serif,system-ui,sans-serif;font-size:14px}\n.admin-app{font-size:13.5px}\n.admin-app main{padding:0.85rem 1.15rem}\n.admin-app .rounded-lg .p-6,.admin-app [class*=\"p-6\"]{padding:0.85rem 1.15rem}\n.admin-app .px-6{padding-left:1.15rem;padding-right:1.15rem}\n.admin-app .py-4{padding-top:0.6rem;padding-bottom:0.6rem}\n.admin-app .py-6{padding-top:0.85rem;padding-bottom:0.85rem}\n.admin-app .text-xl{font-size:1.0625rem}\n.admin-app .text-lg{font-size:1rem}\n.admin-app .text-sm{font-size:0.8375rem}\n.admin-app .text-xs{font-size:0.775rem}\n.admin-app table td,.admin-app table th{padding:0.3rem 0.6rem;font-size:0.8375rem}\n.admin-app h1{font-size:1.0625rem;font-weight:600}\n.admin-app h2{font-size:1rem;font-weight:600}\n.admin-app h3{font-size:0.8375rem;font-weight:600}\n.admin-app .space-y-8 > * + *{margin-top:0.6rem}\n.admin-app .gap-4{gap:0.625rem}\n.admin-app .gap-6{gap:0.875rem}\n.admin-app .mb-6{margin-bottom:0.875rem}\n.admin-app .mb-8{margin-bottom:1.125rem}\n\n/* Sleek scrollbar: thin, rounded; visible on hover/scroll */\n#admin-root .admin-scroll,.admin-scroll{scrollbar-width:thin;scrollbar-color:transparent transparent;transition:scrollbar-color 0.2s ease}\n#admin-root .admin-scroll:hover,.admin-scroll:hover{scrollbar-color:rgba(0,0,0,.18) transparent}\n#admin-root .admin-scroll::-webkit-scrollbar,.admin-scroll::-webkit-scrollbar{width:5px;height:5px}\n#admin-root .admin-scroll::-webkit-scrollbar-track,.admin-scroll::-webkit-scrollbar-track{background:transparent}\n#admin-root .admin-scroll::-webkit-scrollbar-thumb,.admin-scroll::-webkit-scrollbar-thumb{background:transparent;border-radius:2.5px;transition:background 0.2s ease}\n#admin-root .admin-scroll:hover::-webkit-scrollbar-thumb,.admin-scroll:hover::-webkit-scrollbar-thumb{background:rgba(0,0,0,.18)}\n#admin-root .admin-scroll::-webkit-scrollbar-thumb:hover,.admin-scroll::-webkit-scrollbar-thumb:hover{background:rgba(0,0,0,.28)}\n#admin-root .admin-scroll::-webkit-scrollbar-thumb:active,.admin-scroll::-webkit-scrollbar-thumb:active{background:rgba(0,0,0,.35)}\n`;\n","'use client';\n\nimport { Toaster } from 'sonner';\nimport AdminHeader from '../components/Admin/Header';\nimport AdminSidebar from '../components/Admin/Sidebar';\n\nexport function AdminShell({ children }: { children: React.ReactNode }) {\n return (\n <div className=\"min-h-screen bg-[rgb(240,242,249)] flex flex-col\">\n <AdminHeader />\n <div className=\"flex flex-1\">\n <AdminSidebar />\n <main className=\"admin-scroll flex-1 p-6 bg-[rgb(240,242,249)] overflow-auto\">{children}</main>\n </div>\n <Toaster position=\"top-right\" />\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport CreateEditForm from \"./CreateEditForm\";\nimport {\n Table,\n TableHeader,\n TableRow,\n TableHead,\n TableBody,\n TableCell,\n} from \"@/components/ui/table\";\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport {\n Pagination,\n PaginationContent,\n PaginationItem,\n PaginationPrevious,\n PaginationNext,\n PaginationLink,\n} from \"@/components/ui/pagination\";\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from \"@/components/ui/tooltip\";\nimport { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from \"@/components/ui/dialog\";\nimport { formatDate, formatDateTime } from \"@/lib/utils\";\nimport { Edit, Trash2, Eye, Plus, Search, Check, X, RefreshCw, Upload, Download } from \"lucide-react\";\nimport Link from \"next/link\";\nimport BulkUploadDialog from \"./BulkUploadDialog\";\n\nexport type CrudFilterOption = { value: string; label: string };\nexport type CrudFilterItem = {\n param: string;\n label: string;\n type: 'select' | 'dateRange' | 'text';\n options?: CrudFilterOption[];\n};\n\nexport default function AdminCRUD({\n title,\n apiEndpoint,\n columns,\n addEditPageUrl,\n customViewPageUrl,\n defaultSortField = '',\n defaultSortOrder = 'asc',\n filters = [],\n extraListParams,\n}: {\n title: string;\n apiEndpoint: string;\n columns: any[];\n addEditPageUrl: string;\n customViewPageUrl?: string;\n defaultSortField?: string;\n defaultSortOrder?: 'asc' | 'desc';\n filters?: CrudFilterItem[];\n extraListParams?: Record<string, string>;\n}) {\n const [data, setData] = useState<Record<string, unknown>[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [page, setPage] = useState(1);\n const [totalPages, setTotalPages] = useState(1);\n const [sortField, setSortField] = useState(defaultSortField);\n const [sortOrder, setSortOrder] = useState(defaultSortOrder);\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [filterValues, setFilterValues] = useState<Record<string, string>>({});\n const [filterApplyKey, setFilterApplyKey] = useState(0);\n const [isFormOpen, setIsFormOpen] = useState(false);\n const [editingItem, setEditingItem] = useState<Record<string, unknown> | null>(null);\n const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);\n const [itemToDelete, setItemToDelete] = useState<Record<string, unknown> | null>(null);\n const [deleteLoading, setDeleteLoading] = useState(false);\n const [refreshKey, setRefreshKey] = useState(0);\n const [bulkDialogOpen, setBulkDialogOpen] = useState(false);\n\n useEffect(() => {\n async function loadData() {\n try {\n setLoading(true);\n setError(null);\n \n const params = new URLSearchParams({\n page: page.toString(),\n limit: \"10\",\n sortField,\n sortOrder,\n search: searchQuery,\n });\n filters.forEach((f) => {\n if (f.type === 'dateRange') {\n const from = filterValues.dateFrom ?? '';\n const to = filterValues.dateTo ?? '';\n if (from) params.set('dateFrom', from);\n if (to) params.set('dateTo', to);\n } else {\n const v = filterValues[f.param] ?? '';\n if (v) params.set(f.param, v);\n }\n });\n if (extraListParams) {\n Object.entries(extraListParams).forEach(([k, v]) => {\n if (v) params.set(k, v);\n });\n }\n \n const res = await fetch(`${apiEndpoint}?${params.toString()}`);\n \n if (!res.ok) {\n throw new Error(`HTTP error! status: ${res.status}`);\n }\n \n const result = await res.json();\n \n // Ensure data is always an array\n const safeData = Array.isArray(result.data) ? result.data : [];\n setData(safeData);\n setTotalPages(result.totalPages || 1);\n } catch (err) {\n console.error('Error loading data:', err);\n setError(err instanceof Error ? err.message : 'Failed to load');\n setData([]);\n setTotalPages(1);\n } finally {\n setLoading(false);\n }\n }\n \n loadData();\n }, [page, sortField, sortOrder, searchQuery, apiEndpoint, refreshKey, filterApplyKey, extraListParams]);\n\n const handleSort = (field: string) => {\n setSortField(field);\n setSortOrder(sortOrder === \"asc\" ? \"desc\" : \"asc\");\n };\n\n const handleSearch = () => {\n setPage(1);\n };\n\n const handleApplyFilters = () => {\n setPage(1);\n setFilterApplyKey((k) => k + 1);\n };\n\n const handleDeleteClick = (item: Record<string, unknown> & { id?: unknown }) => {\n setItemToDelete(item);\n setDeleteDialogOpen(true);\n };\n\n const handleDelete = async () => {\n if (!itemToDelete) return;\n \n setDeleteLoading(true);\n try {\n const res = await fetch(`${apiEndpoint}/${itemToDelete.id}`, { method: \"DELETE\" });\n if (res.ok) {\n setRefreshKey((k) => k + 1);\n setDeleteDialogOpen(false);\n setItemToDelete(null);\n } else {\n console.error('Failed to delete item');\n }\n } catch (err: unknown) {\n console.error('Error deleting item:', err);\n } finally {\n setDeleteLoading(false);\n }\n };\n\n const handleEdit = (item: Record<string, unknown> & { id?: unknown }) => {\n setEditingItem(item);\n setIsFormOpen(true);\n };\n\n const handleRegenerateInvite = async (userId: number) => {\n try {\n const res = await fetch(`/api/users/${userId}/regenerate-invite`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n });\n \n if (!res.ok) {\n const error = await res.json();\n throw new Error(error.error || \"Failed to regenerate invite\");\n }\n \n const result = await res.json();\n \n if (result.inviteLink) {\n alert(`New invite link generated: ${result.inviteLink}\\n\\nNote: ${result.note}`);\n }\n } catch (error: unknown) {\n console.error(\"Error regenerating invite:\", error);\n alert(error instanceof Error ? error.message : \"Failed to regenerate invite\");\n }\n };\n\n const addEditPage = addEditPageUrl && addEditPageUrl.length > 0;\n const hasCustomView = customViewPageUrl && customViewPageUrl.length > 0;\n \n // Extract resource name from API endpoint\n const resourceName = apiEndpoint.replace('/api/', '');\n\n const handleExport = async () => {\n try {\n const res = await fetch(`${apiEndpoint}/export?format=csv`);\n if (!res.ok) throw new Error(\"Export failed\");\n const blob = await res.blob();\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = `${resourceName}.csv`;\n a.click();\n URL.revokeObjectURL(url);\n } catch (err) {\n console.error(\"Export error:\", err);\n alert(\"Failed to export data\");\n }\n };\n\n if (loading) {\n return (\n <div className=\"rounded-lg bg-white p-6 shadow-md\">\n <div className=\"flex items-center justify-center py-8\">\n <div className=\"animate-spin rounded-full h-6 w-6 border-2 border-gray-300 border-t-gray-600\"></div>\n <span className=\"ml-2\">Loading...</span>\n </div>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"rounded-lg bg-white p-6 shadow-md\">\n <div className=\"text-center py-8\">\n <p className=\"text-red-600 mb-4\">Error loading data: {error}</p>\n <Button onClick={() => window.location.reload()}>Retry</Button>\n </div>\n </div>\n );\n }\n\n return (\n <>\n <div className=\"rounded-lg bg-white shadow-md\">\n {/* Header with loader color gradient background */}\n <div className=\"bg-gray-800 border-b border-gray-700 px-4 py-2.5 rounded-t-lg\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-base font-semibold text-white\">{title}</h1>\n <p className=\"text-xs text-gray-300 mt-0.5\">Manage and view all records</p>\n </div>\n <div className=\"flex items-center space-x-2\">\n <Button\n onClick={() => setBulkDialogOpen(true)}\n variant=\"outline\"\n className=\"bg-transparent text-white border-gray-600 hover:bg-gray-700 text-xs h-8\"\n >\n <Upload className=\"h-3.5 w-3.5 mr-1\" />\n Import\n </Button>\n <Button\n onClick={handleExport}\n variant=\"outline\"\n className=\"bg-transparent text-white border-gray-600 hover:bg-gray-700 text-xs h-8\"\n >\n <Download className=\"h-3.5 w-3.5 mr-1\" />\n Export\n </Button>\n {!addEditPage && (\n <Button\n onClick={() => {\n setEditingItem(null);\n setIsFormOpen(true);\n }}\n className=\"bg-white text-gray-800 hover:bg-gray-100 border-0 text-xs h-8\"\n >\n <Plus className=\"h-3.5 w-3.5\" />\n Add\n </Button>\n )}\n {addEditPage && (\n <Link\n href={addEditPageUrl + \"/create\"}\n className=\"inline-flex items-center gap-1 bg-white text-gray-800 hover:bg-gray-100 border-0 text-xs h-8 px-3 rounded-md font-medium\"\n >\n <Plus className=\"h-3.5 w-3.5\" />\n Add\n </Link>\n )}\n </div>\n </div>\n </div>\n \n <div className=\"p-4\">\n \n {/* Search Box */}\n <div className=\"mb-4 flex items-center gap-4\">\n <Input\n type=\"text\"\n placeholder=\"Search...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n />\n <Button onClick={handleSearch}>\n <Search className=\"h-4 w-4 mr-2\" />\n Search\n </Button>\n </div>\n\n {/* Filters */}\n {filters && filters.length > 0 && (\n <div className=\"mb-4 flex flex-wrap items-end gap-3 rounded border border-gray-200 bg-gray-50/50 p-3\">\n {filters.map((f) => {\n if (f.type === 'select') {\n return (\n <div key={f.param} className=\"flex flex-col gap-1\">\n <label className=\"text-xs font-medium text-gray-600\">{f.label}</label>\n <select\n className=\"rounded border border-gray-300 px-2 py-1.5 text-sm min-w-[120px]\"\n value={filterValues[f.param] ?? ''}\n onChange={(e) => setFilterValues((prev) => ({ ...prev, [f.param]: e.target.value }))}\n >\n {(f.options ?? []).map((opt) => (\n <option key={opt.value} value={opt.value}>{opt.label}</option>\n ))}\n </select>\n </div>\n );\n }\n if (f.type === 'dateRange') {\n return (\n <div key={f.param} className=\"flex flex-col gap-1\">\n <label className=\"text-xs font-medium text-gray-600\">{f.label}</label>\n <div className=\"flex items-center gap-2\">\n <input\n type=\"date\"\n className=\"rounded border border-gray-300 px-2 py-1.5 text-sm\"\n value={filterValues.dateFrom ?? ''}\n onChange={(e) => setFilterValues((prev) => ({ ...prev, dateFrom: e.target.value }))}\n />\n <span className=\"text-gray-400\">–</span>\n <input\n type=\"date\"\n className=\"rounded border border-gray-300 px-2 py-1.5 text-sm\"\n value={filterValues.dateTo ?? ''}\n onChange={(e) => setFilterValues((prev) => ({ ...prev, dateTo: e.target.value }))}\n />\n </div>\n </div>\n );\n }\n return (\n <div key={f.param} className=\"flex flex-col gap-1\">\n <label className=\"text-xs font-medium text-gray-600\">{f.label}</label>\n <Input\n type=\"text\"\n placeholder={f.label}\n className=\"h-8 w-40\"\n value={filterValues[f.param] ?? ''}\n onChange={(e) => setFilterValues((prev) => ({ ...prev, [f.param]: e.target.value }))}\n />\n </div>\n );\n })}\n <Button variant=\"outline\" size=\"sm\" className=\"h-8\" onClick={handleApplyFilters}>\n Apply filters\n </Button>\n </div>\n )}\n\n {/* Table */}\n <Table>\n <TableHeader>\n <TableRow>\n {columns && columns.map((col) => (\n <TableHead\n key={col.field}\n className=\"cursor-pointer\"\n onClick={() => handleSort(col.field)}\n >\n {col.displayName}{\" \"}\n {sortField === col.field\n ? sortOrder === \"asc\"\n ? \"▲\"\n : \"▼\"\n : \"\"}\n </TableHead>\n ))}\n <TableHead className=\"text-center\">Actions</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {data && data.length > 0 ? (\n data.map((item: Record<string, unknown> & { id?: unknown }, index: number) => (\n <TableRow key={String(item.id ?? index)}>\n {columns && columns.map((col, colIndex) => {\n // Handle nested field access (e.g., \"author.name\")\n const getNestedValue = (obj: Record<string, unknown> | null, path: string): unknown => {\n return path.split('.').reduce((current: Record<string, unknown> | null, key: string) => {\n return current && current[key] !== undefined ? (current[key] as Record<string, unknown> | null) : null;\n }, obj);\n };\n \n const fieldKey = col.field || col.key;\n const value = getNestedValue(item, fieldKey);\n \n return (\n <TableCell key={`${item.id}-${colIndex}-${fieldKey}`}>\n {col.type === \"boolean\"\n ? value\n ? <Check className=\"h-4 w-4 text-green-600\" />\n : <X className=\"h-4 w-4 text-red-600\" />\n : col.type === \"date\"\n ? formatDate(value as string | Date)\n : col.type === \"datetime\"\n ? formatDateTime(value as string | Date)\n : (value != null ? String(value) : '-')}\n </TableCell>\n );\n })}\n <TableCell className=\"text-center\">\n <TooltipProvider>\n <div className=\"flex items-center justify-center gap-2\">\n {/* View button - show for all resources */}\n <Tooltip key=\"view\">\n <TooltipTrigger asChild>\n <Link\n href={hasCustomView\n ? `${customViewPageUrl}/${item.id}`\n : `/admin/${resourceName}/${item.id}/view`}\n className=\"inline-flex h-8 w-8 items-center justify-center rounded-md border border-input bg-background hover:bg-accent hover:text-accent-foreground\"\n >\n <Eye className=\"h-4 w-4\" />\n </Link>\n </TooltipTrigger>\n <TooltipContent>\n <p>View</p>\n </TooltipContent>\n </Tooltip>\n \n {!addEditPage && (\n <Tooltip key=\"edit-modal\">\n <TooltipTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => handleEdit(item)}\n className=\"h-8 w-8 p-0\"\n >\n <Edit className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>Edit</p>\n </TooltipContent>\n </Tooltip>\n )}\n {addEditPage && (\n <Tooltip key=\"edit-page\">\n <TooltipTrigger asChild>\n <Link\n href={addEditPageUrl + \"/\" + item.id}\n className=\"inline-flex h-8 w-8 items-center justify-center rounded-md border border-input bg-background hover:bg-accent hover:text-accent-foreground\"\n >\n <Edit className=\"h-4 w-4\" />\n </Link>\n </TooltipTrigger>\n <TooltipContent>\n <p>Edit</p>\n </TooltipContent>\n </Tooltip>\n )}\n \n {/* Regenerate invite button - only for users */}\n {resourceName === 'users' && (\n <Tooltip key=\"regenerate-invite\">\n <TooltipTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => handleRegenerateInvite(Number(item.id))}\n className=\"h-8 w-8 p-0\"\n >\n <RefreshCw className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>Regenerate Invite</p>\n </TooltipContent>\n </Tooltip>\n )}\n \n <Tooltip key=\"delete\">\n <TooltipTrigger asChild>\n <Button\n variant=\"destructive\"\n size=\"sm\"\n onClick={() => handleDeleteClick(item)}\n className=\"h-8 w-8 p-0\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>Delete</p>\n </TooltipContent>\n </Tooltip>\n </div>\n </TooltipProvider>\n </TableCell>\n </TableRow>\n ))\n ) : (\n <TableRow>\n <TableCell colSpan={columns ? columns.length + 1 : 1} className=\"text-center py-8\">\n No data found\n </TableCell>\n </TableRow>\n )}\n </TableBody>\n </Table>\n\n {/* Pagination */}\n {totalPages > 1 && (\n <Pagination className=\"mt-6\">\n <PaginationContent>\n <PaginationItem>\n <PaginationPrevious\n onClick={() => page > 1 && setPage(page - 1)}\n className={\n page <= 1\n ? \"pointer-events-none opacity-50\"\n : \"cursor-pointer\"\n }\n />\n </PaginationItem>\n {[...Array(totalPages)].map((_, index) => (\n <PaginationItem key={index}>\n <PaginationLink\n onClick={() => setPage(index + 1)}\n isActive={page === index + 1}\n >\n {index + 1}\n </PaginationLink>\n </PaginationItem>\n ))}\n <PaginationItem>\n <PaginationNext\n onClick={() => page < totalPages && setPage(page + 1)}\n className={\n page >= totalPages\n ? \"pointer-events-none opacity-50\"\n : \"cursor-pointer\"\n }\n />\n </PaginationItem>\n </PaginationContent>\n </Pagination>\n )}\n\n {/* Form Modal */}\n {isFormOpen && (\n <CreateEditForm\n isOpen={isFormOpen}\n onClose={() => {\n setIsFormOpen(false);\n setRefreshKey((k) => k + 1);\n }}\n apiEndpoint={apiEndpoint}\n columns={columns}\n existingData={editingItem}\n />\n )}\n\n {/* Delete Confirmation Dialog */}\n <Dialog open={deleteDialogOpen} onOpenChange={setDeleteDialogOpen}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Confirm Delete</DialogTitle>\n <DialogDescription>\n Are you sure you want to delete this item? This action cannot be undone.\n </DialogDescription>\n {itemToDelete && (\n <div className=\"mt-2 p-2 bg-gray-50 rounded\">\n <strong>Item:</strong> {String(itemToDelete.name ?? itemToDelete.title ?? itemToDelete.id ?? '')}\n </div>\n )}\n </DialogHeader>\n <DialogFooter>\n <Button variant=\"outline\" onClick={() => setDeleteDialogOpen(false)} disabled={deleteLoading}>\n Cancel\n </Button>\n <Button variant=\"destructive\" onClick={handleDelete} disabled={deleteLoading}>\n {deleteLoading ? \"Deleting...\" : \"Delete\"}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n\n {/* Bulk Upload Dialog */}\n {bulkDialogOpen && (\n <BulkUploadDialog\n apiEndpoint={apiEndpoint}\n onClose={() => {\n setBulkDialogOpen(false);\n setRefreshKey((k) => k + 1);\n }}\n />\n )}\n </div>\n </div>\n </>\n );\n}\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport { Input } from \"@/components/ui/input\";\nimport { Textarea } from \"@/components/ui/textarea\";\nimport { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from \"@/components/ui/select\";\nimport { Button } from \"@/components/ui/button\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { Label } from \"@/components/ui/label\";\nimport FileUpload from \"@/components/ui/file-upload\";\nimport RelationAutocomplete from \"@/components/Admin/RelationAutocomplete\";\nimport { toast } from \"sonner\";\n\nexport default function CreateEditForm({ isOpen, onClose, apiEndpoint, columns, existingData }) {\n const [formData, setFormData] = useState({});\n const [errors, setErrors] = useState({});\n\n useEffect(() => {\n if (existingData) {\n setFormData(existingData);\n } else {\n setFormData(columns.reduce((acc, col) => ({ ...acc, [col.field]: col.defaultValue || \"\" }), {}));\n }\n }, [existingData, columns]);\n\n const handleChange = (e, field) => {\n setFormData({ ...formData, [field]: e.target.value });\n };\n\n const handleFileUpload = (field, url) => {\n setFormData({ ...formData, [field]: url });\n };\n\n const handleToggleChange = (field) => {\n setFormData({ ...formData, [field]: !formData[field] });\n };\n\n const validateForm = () => {\n let newErrors = {};\n columns.forEach(col => {\n if (col.validation?.required && !formData[col.field]) {\n newErrors[col.field] = `${col.displayName} is required`;\n }\n });\n setErrors(newErrors);\n return Object.keys(newErrors).length === 0;\n };\n\n const handleSubmit = async (e) => {\n e.preventDefault();\n if (!validateForm()) return;\n\n const method = existingData ? \"PUT\" : \"POST\";\n const url = existingData ? `${apiEndpoint}/${existingData.id}` : apiEndpoint;\n\n try {\n const res = await fetch(url, {\n method,\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(formData),\n });\n \n if (!res.ok) throw new Error(\"Failed to save data\");\n \n const result = await res.json();\n \n // Handle invite link response for users\n if (result.inviteLink) {\n toast.success(`User invite created! Invite link: ${result.inviteLink}\\n\\nNote: ${result.note}`);\n }\n \n onClose();\n } catch (error) {\n console.error(\"Error saving data:\", error);\n }\n };\n\n return isOpen ? (\n <div className=\"fixed inset-0 bg-black bg-opacity-50 flex justify-end\">\n <div className=\"w-1/3 bg-white h-full p-6 shadow-lg rounded-lg\">\n <h2 className=\"text-xl font-semibold mb-4\">{existingData ? \"Edit\" : \"Create\"} Entry</h2>\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n {columns.map((col) => (\n <div key={col.field}>\n <Label className=\"block text-sm font-medium mb-1\">{col.displayName}</Label>\n {col.relationApi ? (\n <RelationAutocomplete\n apiEndpoint={col.relationApi}\n value={formData[col.field] ?? \"\"}\n onChange={(v) => setFormData({ ...formData, [col.field]: v })}\n labelField={col.relationLabelField ?? \"name\"}\n valueField={col.relationValueField ?? \"id\"}\n placeholder={`Select ${col.displayName}`}\n />\n ) : col.type === \"textarea\" ? (\n <Textarea value={formData[col.field] || \"\"} onChange={(e) => handleChange(e, col.field)} />\n ) : col.type === \"select\" ? (\n <Select onValueChange={(value) => setFormData({ ...formData, [col.field]: value })}>\n <SelectTrigger>\n <SelectValue placeholder={formData[col.field] || \"Select an option\"} />\n </SelectTrigger>\n <SelectContent>\n {col.options?.map((option) => (\n <SelectItem key={option.value} value={option.value}>{option.label}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : col.type === \"boolean\" ? (\n <Switch checked={formData[col.field] || false} onCheckedChange={() => handleToggleChange(col.field)} />\n ) : col.type === \"date\" ? (\n <Input type=\"date\" value={formData[col.field] || \"\"} onChange={(e) => handleChange(e, col.field)} />\n ) : col.type === \"password\" ? (\n <Input type=\"password\" value={formData[col.field] || \"\"} onChange={(e) => handleChange(e, col.field)} />\n ) : col.type === \"number\" ? (\n <Input type=\"number\" value={formData[col.field] || \"\"} onChange={(e) => handleChange(e, col.field)} />\n ) : col.type === \"file\" ? (\n <FileUpload onUploadSuccess={(url) => handleFileUpload(col.field, url)} />\n ) : (\n <Input type={col.type || \"text\"} value={formData[col.field] || \"\"} onChange={(e) => handleChange(e, col.field)} />\n )}\n {errors[col.field] && <p className=\"text-red-500 text-sm mt-1\">{errors[col.field]}</p>}\n </div>\n ))}\n <div className=\"flex gap-2\">\n <Button type=\"submit\" className=\"flex-1\">Save</Button>\n <Button type=\"button\" variant=\"outline\" onClick={onClose} className=\"flex-1\">Cancel</Button>\n </div>\n </form>\n </div>\n </div>\n ) : null;\n}\n","import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Input = React.forwardRef<HTMLInputElement, React.ComponentProps<\"input\">>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n \"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n className\n )}\n ref={ref}\n {...props}\n />\n )\n }\n)\nInput.displayName = \"Input\"\n\nexport { Input }\n","import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Textarea = React.forwardRef<\n HTMLTextAreaElement,\n React.ComponentProps<\"textarea\">\n>(({ className, ...props }, ref) => {\n return (\n <textarea\n className={cn(\n \"flex min-h-[60px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n className\n )}\n ref={ref}\n {...props}\n />\n )\n})\nTextarea.displayName = \"Textarea\"\n\nexport { Textarea }\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as SelectPrimitive from \"@radix-ui/react-select\"\nimport { Check, ChevronDown, ChevronUp } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Select = SelectPrimitive.Root\n\nconst SelectGroup = SelectPrimitive.Group\n\nconst SelectValue = SelectPrimitive.Value\n\nconst SelectTrigger = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n \"flex h-9 w-full items-center justify-between whitespace-nowrap rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm ring-offset-background data-[placeholder]:text-muted-foreground focus:outline-none focus:ring-1 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"h-4 w-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n))\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName\n\nconst SelectScrollUpButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollUpButton\n ref={ref}\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronUp className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollUpButton>\n))\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName\n\nconst SelectScrollDownButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollDownButton\n ref={ref}\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronDown className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollDownButton>\n))\nSelectScrollDownButton.displayName =\n SelectPrimitive.ScrollDownButton.displayName\n\nconst SelectContent = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = \"popper\", ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n \"relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n \"p-1\",\n position === \"popper\" &&\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n))\nSelectContent.displayName = SelectPrimitive.Content.displayName\n\nconst SelectLabel = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label\n ref={ref}\n className={cn(\"px-2 py-1.5 text-sm font-semibold\", className)}\n {...props}\n />\n))\nSelectLabel.displayName = SelectPrimitive.Label.displayName\n\nconst SelectItem = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-2 pr-8 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n {...props}\n >\n <span className=\"absolute right-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n))\nSelectItem.displayName = SelectPrimitive.Item.displayName\n\nconst SelectSeparator = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n {...props}\n />\n))\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectLabel,\n SelectItem,\n SelectSeparator,\n SelectScrollUpButton,\n SelectScrollDownButton,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as SwitchPrimitives from \"@radix-ui/react-switch\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Switch = React.forwardRef<\n React.ElementRef<typeof SwitchPrimitives.Root>,\n React.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root>\n>(({ className, ...props }, ref) => (\n <SwitchPrimitives.Root\n className={cn(\n \"peer inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input\",\n className\n )}\n {...props}\n ref={ref}\n >\n <SwitchPrimitives.Thumb\n className={cn(\n \"pointer-events-none block h-4 w-4 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0\"\n )}\n />\n </SwitchPrimitives.Root>\n))\nSwitch.displayName = SwitchPrimitives.Root.displayName\n\nexport { Switch }\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as LabelPrimitive from \"@radix-ui/react-label\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst labelVariants = cva(\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n)\n\nconst Label = React.forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> &\n VariantProps<typeof labelVariants>\n>(({ className, ...props }, ref) => (\n <LabelPrimitive.Root\n ref={ref}\n className={cn(labelVariants(), className)}\n {...props}\n />\n))\nLabel.displayName = LabelPrimitive.Root.displayName\n\nexport { Label }\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport { Progress } from \"@/components/ui/progress\";\nimport { cn } from \"@/lib/utils\";\n\nexport default function FileUpload({ onUploadSuccess }) {\n const [selectedFile, setSelectedFile] = useState(null);\n const [uploading, setUploading] = useState(false);\n const [progress, setProgress] = useState(0);\n const [fileUrl, setFileUrl] = useState(\"\");\n\n const handleFileChange = (event) => {\n setSelectedFile(event.target.files[0]);\n };\n\n const handleUpload = async () => {\n if (!selectedFile) return;\n setUploading(true);\n setProgress(10);\n\n const formData = new FormData();\n formData.append(\"file\", selectedFile);\n\n try {\n const response = await fetch(\"/api/upload\", {\n method: \"POST\",\n body: formData,\n });\n setProgress(60);\n\n const data = await response.json();\n if (response.ok) {\n setFileUrl(data.url);\n setProgress(100);\n onUploadSuccess(data.url);\n } else {\n console.error(\"Upload failed:\", data.error);\n }\n } catch (error) {\n console.error(\"Upload error:\", error);\n }\n setUploading(false);\n };\n\n return (\n <div className=\"space-y-4 border p-4 rounded-lg bg-white shadow-md\">\n <Input type=\"file\" onChange={handleFileChange} className=\"block w-full\" />\n {uploading && <Progress value={progress} className=\"h-2\" />}\n <Button onClick={handleUpload} disabled={!selectedFile || uploading} className={cn(\"w-full\", uploading && \"opacity-50\")}>Upload</Button>\n {fileUrl && (\n <div className=\"mt-2\">\n <span className=\"text-sm text-gray-600\">Uploaded File:</span>\n <a href={fileUrl} target=\"_blank\" rel=\"noopener noreferrer\" className=\"block text-gray-700 underline\">{fileUrl}</a>\n </div>\n )}\n </div>\n );\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as ProgressPrimitive from \"@radix-ui/react-progress\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Progress = React.forwardRef<\n React.ElementRef<typeof ProgressPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof ProgressPrimitive.Root>\n>(({ className, value, ...props }, ref) => (\n <ProgressPrimitive.Root\n ref={ref}\n className={cn(\n \"relative h-2 w-full overflow-hidden rounded-full bg-primary/20\",\n className\n )}\n {...props}\n >\n <ProgressPrimitive.Indicator\n className=\"h-full w-full flex-1 bg-primary transition-all\"\n style={{ transform: `translateX(-${100 - (value || 0)}%)` }}\n />\n </ProgressPrimitive.Root>\n))\nProgress.displayName = ProgressPrimitive.Root.displayName\n\nexport { Progress }\n","\"use client\";\n\nimport { useState, useEffect, useRef, useCallback } from \"react\";\nimport { Input } from \"@/components/ui/input\";\nimport { ChevronDown } from \"lucide-react\";\nimport { cn } from \"@/lib/utils\";\n\nconst DEBOUNCE_MS = 300;\nconst PAGE_SIZE = 20;\n\ninterface RelationAutocompleteProps {\n apiEndpoint: string;\n value: number | string | null | undefined;\n onChange: (value: number | string) => void;\n labelField?: string;\n valueField?: string;\n placeholder?: string;\n disabled?: boolean;\n}\n\nexport default function RelationAutocomplete({\n apiEndpoint,\n value,\n onChange,\n labelField = \"name\",\n valueField = \"id\",\n placeholder = \"Select…\",\n disabled = false,\n}: RelationAutocompleteProps) {\n const [open, setOpen] = useState(false);\n const [search, setSearch] = useState(\"\");\n const [searchInput, setSearchInput] = useState(\"\");\n const [items, setItems] = useState<Record<string, unknown>[]>([]);\n const [total, setTotal] = useState(0);\n const [page, setPage] = useState(1);\n const [loading, setLoading] = useState(false);\n const [loadingMore, setLoadingMore] = useState(false);\n const [selectedLabel, setSelectedLabel] = useState<string | null>(null);\n const [initialLabelLoaded, setInitialLabelLoaded] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const hasMore = items.length < total;\n\n const fetchPage = useCallback(\n async (pageNum: number, searchQ: string, append: boolean) => {\n const params = new URLSearchParams({\n page: String(pageNum),\n limit: String(PAGE_SIZE),\n ...(searchQ && { search: searchQ }),\n });\n const res = await fetch(`${apiEndpoint}?${params}`);\n if (!res.ok) return;\n const json = await res.json();\n const data = json.data ?? [];\n const totalCount = json.total ?? 0;\n if (append) {\n setItems((prev) => [...prev, ...data]);\n } else {\n setItems(data);\n }\n setTotal(totalCount);\n },\n [apiEndpoint]\n );\n\n useEffect(() => {\n if (!open) return;\n setPage(1);\n setLoading(true);\n fetchPage(1, search, false).finally(() => setLoading(false));\n }, [open, search, fetchPage]);\n\n useEffect(() => {\n if (!open) return;\n const onSearchInput = () => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n debounceRef.current = setTimeout(() => {\n setSearch(searchInput);\n setPage(1);\n debounceRef.current = null;\n }, DEBOUNCE_MS);\n };\n onSearchInput();\n return () => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n };\n }, [searchInput, open]);\n\n const loadInitialLabel = useCallback(() => {\n if (initialLabelLoaded || value == null || value === \"\") return;\n setInitialLabelLoaded(true);\n fetch(`${apiEndpoint}/${value}`)\n .then((r) => (r.ok ? r.json() : null))\n .then((item) => {\n if (item && typeof item[labelField] === \"string\") {\n setSelectedLabel(item[labelField]);\n }\n })\n .catch(() => {});\n }, [apiEndpoint, value, labelField, initialLabelLoaded]);\n\n useEffect(() => {\n if (value != null && value !== \"\") loadInitialLabel();\n else {\n setSelectedLabel(null);\n setInitialLabelLoaded(false);\n }\n }, [value, loadInitialLabel]);\n\n useEffect(() => {\n if (!open) return;\n const el = listRef.current;\n if (!el) return;\n const onScroll = () => {\n const { scrollTop, scrollHeight, clientHeight } = el;\n if (scrollTop + clientHeight >= scrollHeight - 50 && hasMore && !loadingMore) {\n setLoadingMore(true);\n const nextPage = page + 1;\n setPage(nextPage);\n fetchPage(nextPage, search, true).finally(() => setLoadingMore(false));\n }\n };\n el.addEventListener(\"scroll\", onScroll);\n return () => el.removeEventListener(\"scroll\", onScroll);\n }, [open, hasMore, page, search, loadingMore, fetchPage]);\n\n useEffect(() => {\n if (!open) return;\n const onPointerDown = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setOpen(false);\n }\n };\n document.addEventListener(\"pointerdown\", onPointerDown);\n return () => document.removeEventListener(\"pointerdown\", onPointerDown);\n }, [open]);\n\n const handleSelect = (item: Record<string, unknown>) => {\n const val = item[valueField];\n if (val !== undefined && val !== null) {\n onChange(typeof val === \"number\" ? val : String(val));\n setSelectedLabel(String(item[labelField] ?? \"\"));\n }\n setOpen(false);\n };\n\n const displayValue = selectedLabel ?? (value != null && value !== \"\" ? `#${value}` : \"\");\n\n return (\n <div ref={containerRef} className=\"relative w-full\">\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => !disabled && setOpen((o) => !o)}\n className={cn(\n \"flex h-9 w-full items-center justify-between gap-2 rounded-md border border-input bg-transparent px-3 py-2 text-sm text-left\",\n \"focus:outline-none focus:ring-1 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50\",\n !displayValue && \"text-muted-foreground\"\n )}\n >\n <span className=\"min-w-0 truncate\">{displayValue || placeholder}</span>\n <ChevronDown className=\"h-4 w-4 shrink-0 opacity-50\" />\n </button>\n {open && (\n <div\n className=\"absolute top-full left-0 z-50 mt-1 w-full min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md\"\n style={{ width: containerRef.current?.offsetWidth }}\n >\n <div className=\"border-b p-1\">\n <Input\n placeholder=\"Search…\"\n value={searchInput}\n onChange={(e) => setSearchInput(e.target.value)}\n className=\"h-8 text-sm\"\n autoFocus\n onKeyDown={(e) => e.stopPropagation()}\n />\n </div>\n <div\n ref={listRef}\n className=\"max-h-60 overflow-y-auto p-1\"\n >\n {loading && items.length === 0 ? (\n <div className=\"py-4 text-center text-sm text-muted-foreground\">Loading…</div>\n ) : items.length === 0 ? (\n <div className=\"py-4 text-center text-sm text-muted-foreground\">No results</div>\n ) : (\n items.map((item) => {\n const val = item[valueField];\n const key = val !== undefined && val !== null ? String(val) : Math.random();\n const label = String(item[labelField] ?? \"\");\n const isSelected = value != null && (val === value || String(val) === String(value));\n return (\n <button\n key={key}\n type=\"button\"\n className={cn(\n \"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-2 pr-8 text-sm outline-none hover:bg-accent hover:text-accent-foreground\",\n isSelected && \"bg-accent\"\n )}\n onClick={() => handleSelect(item)}\n >\n {label}\n </button>\n );\n })\n )}\n {loadingMore && (\n <div className=\"py-2 text-center text-xs text-muted-foreground\">Loading more…</div>\n )}\n </div>\n </div>\n )}\n </div>\n );\n}\n","import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Table = React.forwardRef<\n HTMLTableElement,\n React.HTMLAttributes<HTMLTableElement>\n>(({ className, ...props }, ref) => (\n <div className=\"relative w-full overflow-auto\">\n <table\n ref={ref}\n className={cn(\"w-full caption-bottom text-sm\", className)}\n {...props}\n />\n </div>\n))\nTable.displayName = \"Table\"\n\nconst TableHeader = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <thead ref={ref} className={cn(\"[&_tr]:border-b\", className)} {...props} />\n))\nTableHeader.displayName = \"TableHeader\"\n\nconst TableBody = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tbody\n ref={ref}\n className={cn(\"[&_tr:last-child]:border-0\", className)}\n {...props}\n />\n))\nTableBody.displayName = \"TableBody\"\n\nconst TableFooter = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tfoot\n ref={ref}\n className={cn(\n \"border-t bg-muted/50 font-medium [&>tr]:last:border-b-0\",\n className\n )}\n {...props}\n />\n))\nTableFooter.displayName = \"TableFooter\"\n\nconst TableRow = React.forwardRef<\n HTMLTableRowElement,\n React.HTMLAttributes<HTMLTableRowElement>\n>(({ className, ...props }, ref) => (\n <tr\n ref={ref}\n className={cn(\n \"border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted\",\n className\n )}\n {...props}\n />\n))\nTableRow.displayName = \"TableRow\"\n\nconst TableHead = React.forwardRef<\n HTMLTableCellElement,\n React.ThHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n <th\n ref={ref}\n className={cn(\n \"h-10 px-2 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]\",\n className\n )}\n {...props}\n />\n))\nTableHead.displayName = \"TableHead\"\n\nconst TableCell = React.forwardRef<\n HTMLTableCellElement,\n React.TdHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n <td\n ref={ref}\n className={cn(\n \"p-2 align-middle [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]\",\n className\n )}\n {...props}\n />\n))\nTableCell.displayName = \"TableCell\"\n\nconst TableCaption = React.forwardRef<\n HTMLTableCaptionElement,\n React.HTMLAttributes<HTMLTableCaptionElement>\n>(({ className, ...props }, ref) => (\n <caption\n ref={ref}\n className={cn(\"mt-4 text-sm text-muted-foreground\", className)}\n {...props}\n />\n))\nTableCaption.displayName = \"TableCaption\"\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n}\n","import * as React from \"react\"\nimport { ChevronLeft, ChevronRight, MoreHorizontal } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { ButtonProps, buttonVariants } from \"@/components/ui/button\"\n\nconst Pagination = ({ className, ...props }: React.ComponentProps<\"nav\">) => (\n <nav\n role=\"navigation\"\n aria-label=\"pagination\"\n className={cn(\"mx-auto flex w-full justify-center\", className)}\n {...props}\n />\n)\nPagination.displayName = \"Pagination\"\n\nconst PaginationContent = React.forwardRef<\n HTMLUListElement,\n React.ComponentProps<\"ul\">\n>(({ className, ...props }, ref) => (\n <ul\n ref={ref}\n className={cn(\"flex flex-row items-center gap-1\", className)}\n {...props}\n />\n))\nPaginationContent.displayName = \"PaginationContent\"\n\nconst PaginationItem = React.forwardRef<\n HTMLLIElement,\n React.ComponentProps<\"li\">\n>(({ className, ...props }, ref) => (\n <li ref={ref} className={cn(\"\", className)} {...props} />\n))\nPaginationItem.displayName = \"PaginationItem\"\n\ntype PaginationLinkProps = {\n isActive?: boolean\n} & Pick<ButtonProps, \"size\"> &\n React.ComponentProps<\"a\">\n\nconst PaginationLink = ({\n className,\n isActive,\n size = \"icon\",\n ...props\n}: PaginationLinkProps) => (\n <a\n aria-current={isActive ? \"page\" : undefined}\n className={cn(\n buttonVariants({\n variant: isActive ? \"outline\" : \"ghost\",\n size,\n }),\n className\n )}\n {...props}\n />\n)\nPaginationLink.displayName = \"PaginationLink\"\n\nconst PaginationPrevious = ({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) => (\n <PaginationLink\n aria-label=\"Go to previous page\"\n size=\"default\"\n className={cn(\"gap-1 pl-2.5\", className)}\n {...props}\n >\n <ChevronLeft className=\"h-4 w-4\" />\n <span>Previous</span>\n </PaginationLink>\n)\nPaginationPrevious.displayName = \"PaginationPrevious\"\n\nconst PaginationNext = ({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) => (\n <PaginationLink\n aria-label=\"Go to next page\"\n size=\"default\"\n className={cn(\"gap-1 pr-2.5\", className)}\n {...props}\n >\n <span>Next</span>\n <ChevronRight className=\"h-4 w-4\" />\n </PaginationLink>\n)\nPaginationNext.displayName = \"PaginationNext\"\n\nconst PaginationEllipsis = ({\n className,\n ...props\n}: React.ComponentProps<\"span\">) => (\n <span\n aria-hidden\n className={cn(\"flex h-9 w-9 items-center justify-center\", className)}\n {...props}\n >\n <MoreHorizontal className=\"h-4 w-4\" />\n <span className=\"sr-only\">More pages</span>\n </span>\n)\nPaginationEllipsis.displayName = \"PaginationEllipsis\"\n\nexport {\n Pagination,\n PaginationContent,\n PaginationLink,\n PaginationItem,\n PaginationPrevious,\n PaginationNext,\n PaginationEllipsis,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst TooltipProvider = TooltipPrimitive.Provider\n\nconst Tooltip = TooltipPrimitive.Root\n\nconst TooltipTrigger = TooltipPrimitive.Trigger\n\nconst TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className\n )}\n {...props}\n />\n </TooltipPrimitive.Portal>\n))\nTooltipContent.displayName = TooltipPrimitive.Content.displayName\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\nimport { X } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Dialog = DialogPrimitive.Root\n\nconst DialogTrigger = DialogPrimitive.Trigger\n\nconst DialogPortal = DialogPrimitive.Portal\n\nconst DialogClose = DialogPrimitive.Close\n\nconst DialogOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n />\n))\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName\n\nconst DialogContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg\",\n className\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPortal>\n))\nDialogContent.displayName = DialogPrimitive.Content.displayName\n\nconst DialogHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-1.5 text-center sm:text-left\",\n className\n )}\n {...props}\n />\n)\nDialogHeader.displayName = \"DialogHeader\"\n\nconst DialogFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className\n )}\n {...props}\n />\n)\nDialogFooter.displayName = \"DialogFooter\"\n\nconst DialogTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn(\n \"text-lg font-semibold leading-none tracking-tight\",\n className\n )}\n {...props}\n />\n))\nDialogTitle.displayName = DialogPrimitive.Title.displayName\n\nconst DialogDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n))\nDialogDescription.displayName = DialogPrimitive.Description.displayName\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogTrigger,\n DialogClose,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n}\n","\"use client\";\n\nimport { useState, useEffect, useRef } from \"react\";\nimport { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter } from \"@/components/ui/dialog\";\nimport { Button } from \"@/components/ui/button\";\nimport { Table, TableHeader, TableRow, TableHead, TableBody, TableCell } from \"@/components/ui/table\";\nimport { Download, Upload, AlertCircle, CheckCircle2, X } from \"lucide-react\";\nimport Papa from \"papaparse\";\n\ninterface ColumnMeta {\n name: string;\n type: string;\n nullable: boolean;\n isUnique: boolean;\n isPrimary: boolean;\n}\n\ninterface BulkUploadDialogProps {\n apiEndpoint: string;\n onClose: () => void;\n}\n\nconst AUTO_GENERATED_COLS = new Set([\n \"id\", \"createdAt\", \"updatedAt\", \"deletedAt\", \"createdBy\", \"updatedBy\", \"deletedBy\", \"deleted\"\n]);\n\nexport default function BulkUploadDialog({ apiEndpoint, onClose }: BulkUploadDialogProps) {\n const [columns, setColumns] = useState<ColumnMeta[]>([]);\n const [uniqueColumns, setUniqueColumns] = useState<string[]>([]);\n const [loading, setLoading] = useState(true);\n const [importing, setImporting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [success, setSuccess] = useState<string | null>(null);\n\n const [parsedData, setParsedData] = useState<Record<string, unknown>[]>([]);\n const [parseErrors, setParseErrors] = useState<string[]>([]);\n const [upsertKey, setUpsertKey] = useState<string>(\"id\");\n const [fileName, setFileName] = useState<string>(\"\");\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n fetchMetadata();\n }, [apiEndpoint]);\n\n const fetchMetadata = async () => {\n try {\n setLoading(true);\n const res = await fetch(`${apiEndpoint}/metadata`);\n if (!res.ok) throw new Error(\"Failed to fetch metadata\");\n const data = await res.json();\n setColumns(data.columns || []);\n setUniqueColumns(data.uniqueColumns || []);\n \n // Default upsert key: prefer slug, email, name if available\n const preferred = [\"slug\", \"email\", \"name\"];\n for (const key of preferred) {\n if (data.uniqueColumns?.includes(key)) {\n setUpsertKey(key);\n break;\n }\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to load metadata\");\n } finally {\n setLoading(false);\n }\n };\n\n const getTemplateColumns = () => {\n return columns.filter((c) => !AUTO_GENERATED_COLS.has(c.name));\n };\n\n const handleDownloadTemplate = () => {\n const templateCols = getTemplateColumns();\n const headers = templateCols.map((c) => c.name);\n const typeHints = templateCols.map((c) => `# ${c.type}${c.nullable ? \" (optional)\" : \"\"}`);\n \n const csv = [headers.join(\",\"), typeHints.join(\",\")].join(\"\\n\");\n const blob = new Blob([csv], { type: \"text/csv;charset=utf-8;\" });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n const resourceName = apiEndpoint.split(\"/\").pop() || \"data\";\n a.download = `${resourceName}_template.csv`;\n a.click();\n URL.revokeObjectURL(url);\n };\n\n const handleFileSelect = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n\n setFileName(file.name);\n setError(null);\n setSuccess(null);\n setParseErrors([]);\n\n Papa.parse(file, {\n header: true,\n skipEmptyLines: true,\n complete: (results) => {\n const errors: string[] = [];\n const data: Record<string, unknown>[] = [];\n\n results.data.forEach((row, idx) => {\n const record = row as Record<string, unknown>;\n \n // Skip comment rows (type hints)\n const firstVal = Object.values(record)[0];\n if (typeof firstVal === \"string\" && firstVal.startsWith(\"#\")) {\n return;\n }\n\n // Validate required fields\n const templateCols = getTemplateColumns();\n for (const col of templateCols) {\n if (!col.nullable && !record[col.name]) {\n errors.push(`Row ${idx + 1}: Missing required field \"${col.name}\"`);\n }\n }\n\n data.push(record);\n });\n\n if (results.errors.length > 0) {\n errors.push(...results.errors.map((e) => `Parse error: ${e.message}`));\n }\n\n setParsedData(data);\n setParseErrors(errors.slice(0, 10)); // Show first 10 errors\n },\n error: (err) => {\n setError(`Failed to parse CSV: ${err.message}`);\n },\n });\n };\n\n const handleImport = async () => {\n if (parsedData.length === 0) {\n setError(\"No data to import\");\n return;\n }\n\n setImporting(true);\n setError(null);\n setSuccess(null);\n\n try {\n const res = await fetch(`${apiEndpoint}/bulk`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n records: parsedData,\n upsertKey,\n }),\n });\n\n const result = await res.json();\n\n if (!res.ok) {\n setError(result.error || \"Import failed\");\n return;\n }\n\n setSuccess(`Successfully imported ${result.imported} records`);\n setParsedData([]);\n setFileName(\"\");\n if (fileInputRef.current) {\n fileInputRef.current.value = \"\";\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Import failed\");\n } finally {\n setImporting(false);\n }\n };\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault();\n const file = e.dataTransfer.files?.[0];\n if (file && file.type === \"text/csv\") {\n const input = fileInputRef.current;\n if (input) {\n const dt = new DataTransfer();\n dt.items.add(file);\n input.files = dt.files;\n handleFileSelect({ target: input } as React.ChangeEvent<HTMLInputElement>);\n }\n }\n };\n\n const previewColumns = parsedData.length > 0 ? Object.keys(parsedData[0]).slice(0, 6) : [];\n\n return (\n <Dialog open onOpenChange={() => onClose()}>\n <DialogContent className=\"max-w-3xl max-h-[90vh] overflow-y-auto\">\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2\">\n <Upload className=\"h-5 w-5\" />\n Bulk Import\n </DialogTitle>\n </DialogHeader>\n\n {loading ? (\n <div className=\"flex items-center justify-center py-8\">\n <div className=\"animate-spin rounded-full h-6 w-6 border-2 border-gray-300 border-t-gray-600\" />\n <span className=\"ml-2\">Loading...</span>\n </div>\n ) : (\n <div className=\"space-y-4\">\n {/* Download Template */}\n <div className=\"flex items-center justify-between p-3 bg-gray-50 rounded-lg\">\n <div>\n <p className=\"text-sm font-medium\">Step 1: Download Template</p>\n <p className=\"text-xs text-gray-500\">Get a CSV template with all required columns</p>\n </div>\n <Button variant=\"outline\" size=\"sm\" onClick={handleDownloadTemplate}>\n <Download className=\"h-4 w-4 mr-1\" /> Download\n </Button>\n </div>\n\n {/* Upload File */}\n <div\n className=\"border-2 border-dashed border-gray-300 rounded-lg p-6 text-center hover:border-gray-400 transition-colors\"\n onDragOver={(e) => e.preventDefault()}\n onDrop={handleDrop}\n >\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".csv\"\n onChange={handleFileSelect}\n className=\"hidden\"\n id=\"csv-upload\"\n />\n <label htmlFor=\"csv-upload\" className=\"cursor-pointer\">\n <Upload className=\"h-8 w-8 mx-auto text-gray-400 mb-2\" />\n <p className=\"text-sm text-gray-600\">\n {fileName ? fileName : \"Drop CSV file here or click to select\"}\n </p>\n <p className=\"text-xs text-gray-400 mt-1\">Step 2: Upload your filled CSV</p>\n </label>\n </div>\n\n {/* Upsert Key Selection */}\n {uniqueColumns.length > 0 && (\n <div className=\"flex items-center gap-3\">\n <label className=\"text-sm font-medium\">Upsert Key:</label>\n <select\n value={upsertKey}\n onChange={(e) => setUpsertKey(e.target.value)}\n className=\"rounded-md border border-gray-300 px-2 py-1 text-sm\"\n >\n <option value=\"id\">id (update only)</option>\n {uniqueColumns\n .filter((k) => k !== \"id\")\n .map((key) => (\n <option key={key} value={key}>\n {key}\n </option>\n ))}\n </select>\n <span className=\"text-xs text-gray-500\">\n Records with matching {upsertKey} will be updated\n </span>\n </div>\n )}\n\n {/* Parse Errors */}\n {parseErrors.length > 0 && (\n <div className=\"bg-yellow-50 border border-yellow-200 rounded-lg p-3\">\n <div className=\"flex items-start gap-2\">\n <AlertCircle className=\"h-4 w-4 text-yellow-600 mt-0.5\" />\n <div>\n <p className=\"text-sm font-medium text-yellow-800\">Validation Warnings</p>\n <ul className=\"text-xs text-yellow-700 mt-1 space-y-0.5\">\n {parseErrors.map((err, i) => (\n <li key={i}>{err}</li>\n ))}\n </ul>\n </div>\n </div>\n </div>\n )}\n\n {/* Preview Table */}\n {parsedData.length > 0 && (\n <div>\n <p className=\"text-sm font-medium mb-2\">\n Preview ({Math.min(parsedData.length, 5)} of {parsedData.length} rows)\n </p>\n <div className=\"border rounded-lg overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n {previewColumns.map((col) => (\n <TableHead key={col} className=\"text-xs\">\n {col}\n </TableHead>\n ))}\n {previewColumns.length < Object.keys(parsedData[0]).length && (\n <TableHead className=\"text-xs\">...</TableHead>\n )}\n </TableRow>\n </TableHeader>\n <TableBody>\n {parsedData.slice(0, 5).map((row, i) => (\n <TableRow key={i}>\n {previewColumns.map((col) => (\n <TableCell key={col} className=\"text-xs py-1\">\n {String(row[col] ?? \"\")}\n </TableCell>\n ))}\n {previewColumns.length < Object.keys(row).length && (\n <TableCell className=\"text-xs py-1\">...</TableCell>\n )}\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n </div>\n )}\n\n {/* Error/Success Messages */}\n {error && (\n <div className=\"bg-red-50 border border-red-200 rounded-lg p-3 flex items-center gap-2\">\n <X className=\"h-4 w-4 text-red-600\" />\n <span className=\"text-sm text-red-700\">{error}</span>\n </div>\n )}\n\n {success && (\n <div className=\"bg-green-50 border border-green-200 rounded-lg p-3 flex items-center gap-2\">\n <CheckCircle2 className=\"h-4 w-4 text-green-600\" />\n <span className=\"text-sm text-green-700\">{success}</span>\n </div>\n )}\n </div>\n )}\n\n <DialogFooter>\n <Button variant=\"outline\" onClick={onClose}>\n Cancel\n </Button>\n <Button\n onClick={handleImport}\n disabled={parsedData.length === 0 || importing}\n >\n {importing ? \"Importing...\" : `Import ${parsedData.length} Records`}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","\"use client\";\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport { Input } from \"@/components/ui/input\";\nimport { Button } from \"@/components/ui/button\";\nimport { Textarea } from \"@/components/ui/textarea\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { X, ArrowLeft, Save, Plus, Trash2 } from \"lucide-react\";\nimport { useRouter } from \"next/navigation\";\nimport Link from \"next/link\";\nimport FieldConfiguration from \"./FormBuilder/FieldConfiguration\";\n\ninterface FormField {\n id: string;\n label: string;\n type: string;\n placeholder?: string;\n options?: string[];\n required: boolean;\n validation?: any;\n order: number;\n groupId: number;\n columnWidth: number;\n}\n\ninterface FormData {\n id?: number;\n name: string;\n description?: string;\n campaign?: string;\n slug: string;\n published: boolean;\n fields: FormField[];\n}\n\nexport default function FormBuilder({ formId }: { formId?: string }) {\n const [formData, setFormData] = useState<FormData>({\n name: \"\",\n description: \"\",\n campaign: \"\",\n slug: \"\",\n published: false,\n fields: [],\n });\n const [errors, setErrors] = useState<string[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [isSaving, setIsSaving] = useState(false);\n const [selectedField, setSelectedField] = useState<FormField | null>(null);\n const router = useRouter();\n\n const loadFormData = useCallback(async () => {\n try {\n setIsLoading(true);\n const response = await fetch(`/api/forms/${formId}`);\n if (response.ok) {\n const data = await response.json();\n setFormData({\n id: data.id,\n name: data.name,\n description: data.description || \"\",\n campaign: data.campaign || \"\",\n slug: data.slug,\n published: data.published,\n fields: (data.fields ?? []).map((field: any) => ({\n ...field,\n id: field.id.toString(),\n options: field.options ? JSON.parse(field.options) : undefined,\n validation: field.validation ? JSON.parse(field.validation) : undefined,\n })),\n });\n }\n } catch (error) {\n console.error(\"Error loading form:\", error);\n setErrors([\"Failed to load form data\"]);\n } finally {\n setIsLoading(false);\n }\n }, [formId]);\n\n // Load existing form data if editing\n useEffect(() => {\n if (formId) {\n loadFormData();\n }\n }, [formId, loadFormData]);\n\n // Auto-generate slug from name\n useEffect(() => {\n if (formData.name && !formData.slug) {\n const generatedSlug = formData.name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/(^-|-$)/g, '');\n setFormData(prev => ({ ...prev, slug: generatedSlug }));\n }\n }, [formData.name, formData.slug]);\n\n const addField = () => {\n const newField: FormField = {\n id: `field_${Date.now()}`,\n label: \"New Field\",\n type: \"text\",\n placeholder: \"\",\n required: false,\n order: formData.fields.length + 1,\n groupId: 1,\n columnWidth: 12,\n };\n setFormData(prev => ({\n ...prev,\n fields: [...prev.fields, newField],\n }));\n setSelectedField(newField);\n };\n\n const updateField = (fieldId: string, updates: Partial<FormField>) => {\n setFormData(prev => ({\n ...prev,\n fields: prev.fields.map(field => {\n if (field.id === fieldId) {\n const updatedField = { ...field, ...updates };\n \n // Initialize options array when field type changes to select/checkbox/radio\n if (updates.type && [\"select\", \"checkbox\", \"radio\"].includes(updates.type) && !updatedField.options) {\n updatedField.options = [];\n }\n \n return updatedField;\n }\n return field;\n }),\n }));\n \n if (selectedField?.id === fieldId) {\n const updatedSelectedField = selectedField ? { ...selectedField, ...updates } : null;\n \n // Initialize options array when field type changes to select/checkbox/radio\n if (updatedSelectedField && updates.type && [\"select\", \"checkbox\", \"radio\"].includes(updates.type) && !updatedSelectedField.options) {\n updatedSelectedField.options = [];\n }\n \n setSelectedField(updatedSelectedField);\n }\n };\n\n const removeField = (fieldId: string) => {\n setFormData(prev => ({\n ...prev,\n fields: prev.fields.filter(field => field.id !== fieldId),\n }));\n \n if (selectedField?.id === fieldId) {\n setSelectedField(null);\n }\n };\n\n const moveField = (fromIndex: number, toIndex: number) => {\n const fields = Array.from(formData.fields);\n const [movedField] = fields.splice(fromIndex, 1);\n fields.splice(toIndex, 0, movedField);\n\n // Update order numbers\n const updatedFields = fields.map((field, index) => ({\n ...field,\n order: index + 1,\n }));\n\n setFormData(prev => ({ ...prev, fields: updatedFields }));\n };\n\n const validateForm = () => {\n const newErrors: string[] = [];\n\n if (!formData.name.trim()) {\n newErrors.push(\"Form name is required\");\n }\n\n if (!formData.slug.trim()) {\n newErrors.push(\"Form slug is required\");\n }\n\n if (formData.fields.length === 0) {\n newErrors.push(\"At least one field is required\");\n }\n\n // Validate fields\n formData.fields.forEach((field, index) => {\n if (!field.label.trim()) {\n newErrors.push(`Field ${index + 1}: Label is required`);\n }\n });\n\n setErrors(newErrors);\n return newErrors.length === 0;\n };\n\n const handleSave = async (isPublishing: boolean = false) => {\n if (!validateForm()) return;\n\n try {\n setIsSaving(true);\n setErrors([]);\n\n const payload = {\n ...formData,\n published: isPublishing ? true : formData.published,\n fields: formData.fields.map((field) => {\n const numericId = typeof field.id === 'number' ? field.id : /^\\d+$/.test(String(field.id)) ? parseInt(String(field.id), 10) : undefined;\n const { id: _id, ...rest } = field;\n return {\n ...rest,\n ...(numericId !== undefined && { id: numericId }),\n options: field.options != null ? (Array.isArray(field.options) ? JSON.stringify(field.options) : field.options) : null,\n validation: field.validation != null ? (typeof field.validation === 'object' ? JSON.stringify(field.validation) : field.validation) : null,\n };\n }),\n };\n\n const url = formId ? `/api/forms/${formId}` : '/api/forms';\n const method = formId ? 'PUT' : 'POST';\n\n const response = await fetch(url, {\n method,\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n const errorData = await response.json();\n throw new Error(errorData.error || 'Failed to save form');\n }\n\n const savedForm = await response.json();\n router.push('/admin/forms');\n } catch (error: unknown) {\n console.error(\"Save error:\", error);\n setErrors([error instanceof Error ? error.message : \"Failed to save form\"]);\n } finally {\n setIsSaving(false);\n }\n };\n\n if (isLoading) {\n return <div className=\"flex items-center justify-center h-64\">Loading...</div>;\n }\n\n return (\n <div className=\"rounded-lg bg-white shadow-md\">\n {/* Header with loader color gradient background */}\n <div className=\"bg-gray-800 border-b border-gray-700 px-4 py-2.5 rounded-t-lg\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-xl font-bold text-white\">\n {formId ? 'Edit Form' : 'Create New Form'}\n </h1>\n <p className=\"text-xs text-gray-300 mt-0.5\">Design your form with drag-and-drop fields</p>\n </div>\n <div className=\"flex items-center space-x-3\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"bg-white text-gray-800 hover:bg-gray-100 border-0 text-xs\"\n onClick={() => router.push('/admin/forms')}\n >\n <X className=\"h-4 w-4 mr-2\" />\n Close\n </Button>\n </div>\n </div>\n </div>\n\n {/* Error Messages */}\n {errors.length > 0 && (\n <div className=\"bg-red-50 border-l-4 border-red-400 p-4 mx-6 mt-4\">\n <div className=\"flex\">\n <div className=\"ml-3\">\n <h3 className=\"text-sm font-medium text-red-800\">\n Please fix the following errors:\n </h3>\n <div className=\"mt-2 text-sm text-red-700\">\n <ul className=\"list-disc pl-5 space-y-1\">\n {errors.map((error, index) => (\n <li key={index}>{error}</li>\n ))}\n </ul>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* Content */}\n <div className=\"p-6\">\n\n {/* Error Messages */}\n {errors.length > 0 && (\n <div className=\"mb-6 p-4 bg-red-50 border border-red-200 rounded-md\">\n <div className=\"flex\">\n <div className=\"flex-shrink-0\">\n <X className=\"h-5 w-5 text-red-400\" />\n </div>\n <div className=\"ml-3\">\n <h3 className=\"text-sm font-medium text-red-800\">\n There were errors with your submission\n </h3>\n <div className=\"mt-2 text-sm text-red-700\">\n <ul className=\"list-disc pl-5 space-y-1\">\n {errors.map((error, index) => (\n <li key={index}>{error}</li>\n ))}\n </ul>\n </div>\n </div>\n </div>\n </div>\n )}\n\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-8\">\n {/* Form Settings Panel */}\n <div className=\"lg:col-span-1\">\n <div className=\"bg-white rounded-lg shadow p-6\">\n <h2 className=\"text-lg font-semibold mb-4\">Form Settings</h2>\n \n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n Form Name *\n </label>\n <Input\n value={formData.name}\n onChange={(e) => setFormData(prev => ({ ...prev, name: e.target.value }))}\n placeholder=\"Enter form name\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n Slug *\n </label>\n <Input\n value={formData.slug}\n onChange={(e) => setFormData(prev => ({ ...prev, slug: e.target.value }))}\n placeholder=\"form-slug\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n Description\n </label>\n <Textarea\n value={formData.description}\n onChange={(e) => setFormData(prev => ({ ...prev, description: e.target.value }))}\n placeholder=\"Form description\"\n rows={3}\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n Campaign\n </label>\n <Input\n value={formData.campaign}\n onChange={(e) => setFormData(prev => ({ ...prev, campaign: e.target.value }))}\n placeholder=\"Campaign name\"\n />\n </div>\n\n <div className=\"flex items-center space-x-2\">\n <Switch\n checked={formData.published}\n onCheckedChange={(checked) => setFormData(prev => ({ ...prev, published: checked }))}\n />\n <label className=\"text-sm font-medium text-gray-700\">\n Published\n </label>\n </div>\n </div>\n </div>\n </div>\n\n {/* Form Builder */}\n <div className=\"lg:col-span-2\">\n <div className=\"bg-white rounded-lg shadow\">\n {/* Toolbar */}\n <div className=\"border-b border-gray-200 p-4\">\n <div className=\"flex items-center justify-between\">\n <h2 className=\"text-lg font-semibold\">Form Fields</h2>\n <Button onClick={addField} size=\"sm\">\n <Plus className=\"h-4 w-4 mr-2\" />\n Add Field\n </Button>\n </div>\n </div>\n\n {/* Fields List */}\n <div className=\"p-4\">\n {formData.fields.length === 0 ? (\n <div className=\"text-center py-12\">\n <p className=\"text-gray-500 mb-4\">No fields added yet</p>\n <Button onClick={addField}>\n <Plus className=\"h-4 w-4 mr-2\" />\n Add Your First Field\n </Button>\n </div>\n ) : (\n <div className=\"space-y-3\">\n {formData.fields.map((field, index) => (\n <div\n key={field.id}\n className={`border rounded-lg p-4 ${\n selectedField?.id === field.id\n ? 'border-gray-500 bg-gray-100'\n : 'border-gray-200 bg-white'\n }`}\n >\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center space-x-3\">\n <div className=\"flex flex-col space-y-1\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => moveField(index, Math.max(0, index - 1))}\n disabled={index === 0}\n className=\"h-6 w-6 p-0\"\n >\n ↑\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => moveField(index, Math.min(formData.fields.length - 1, index + 1))}\n disabled={index === formData.fields.length - 1}\n className=\"h-6 w-6 p-0\"\n >\n ↓\n </Button>\n </div>\n <div className=\"flex items-center space-x-2\">\n <Badge variant=\"outline\">{field.type}</Badge>\n <span className=\"font-medium\">{field.label}</span>\n {field.required && (\n <Badge variant=\"destructive\" className=\"text-xs\">Required</Badge>\n )}\n </div>\n </div>\n <div className=\"flex items-center space-x-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setSelectedField(field)}\n >\n Configure\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => removeField(field.id)}\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n\n {/* Field Configuration Panel */}\n {selectedField && (\n <div className=\"mt-6 bg-white rounded-lg shadow p-6\">\n <div className=\"flex items-center justify-between mb-4\">\n <h3 className=\"text-lg font-semibold\">Configure Field</h3>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setSelectedField(null)}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n <FieldConfiguration\n field={selectedField}\n onUpdate={(updates) => updateField(selectedField.id, updates)}\n />\n </div>\n )}\n </div>\n </div>\n\n </div>\n \n {/* Footer with Action Buttons */}\n <div className=\"bg-gray-50 border-t border-gray-200 px-6 py-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"text-sm text-gray-600\">\n {formId ? \"Editing existing form\" : \"Creating new form\"}\n </div>\n <div className=\"flex items-center space-x-3\">\n <Button \n variant=\"outline\"\n className=\"bg-white text-gray-800 hover:bg-gray-100 border-0 text-xs\"\n onClick={() => router.push('/admin/forms')}\n >\n Close\n </Button>\n <Button \n onClick={() => handleSave(false)} \n disabled={isSaving}\n className=\"bg-white text-gray-800 hover:bg-gray-100 border-0 text-xs\"\n >\n <Save className=\"h-4 w-4 mr-2\" />\n {isSaving ? \"Saving...\" : \"Save\"}\n </Button>\n <Button \n onClick={() => handleSave(true)}\n disabled={isSaving}\n className=\"bg-gray-800 text-white hover:bg-gray-700 text-xs\"\n >\n {isSaving ? \"Publishing...\" : \"Publish\"}\n </Button>\n </div>\n </div>\n </div>\n </div>\n );\n} ","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst badgeVariants = cva(\n \"inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\",\n {\n variants: {\n variant: {\n default:\n \"border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80\",\n secondary:\n \"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n destructive:\n \"border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80\",\n outline: \"text-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\nfunction Badge({ className, variant, ...props }: BadgeProps) {\n return (\n <div className={cn(badgeVariants({ variant }), className)} {...props} />\n )\n}\n\nexport { Badge, badgeVariants }\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { Input } from \"@/components/ui/input\";\nimport { Button } from \"@/components/ui/button\";\nimport { Textarea } from \"@/components/ui/textarea\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"@/components/ui/select\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Plus, X } from \"lucide-react\";\n\ninterface FormField {\n id: string;\n label: string;\n type: string;\n placeholder?: string;\n options?: string[];\n required: boolean;\n validation?: any;\n order: number;\n groupId: number;\n columnWidth: number;\n}\n\ninterface FieldConfigurationProps {\n field: FormField;\n onUpdate: (updates: Partial<FormField>) => void;\n}\n\nconst FIELD_TYPES = [\n { value: \"text\", label: \"Text Input\" },\n { value: \"email\", label: \"Email\" },\n { value: \"textarea\", label: \"Text Area\" },\n { value: \"select\", label: \"Dropdown\" },\n { value: \"checkbox\", label: \"Checkbox\" },\n { value: \"radio\", label: \"Radio Buttons\" },\n { value: \"file\", label: \"File Upload\" },\n { value: \"date\", label: \"Date\" },\n { value: \"number\", label: \"Number\" },\n { value: \"phone\", label: \"Phone\" },\n];\n\nconst COLUMN_WIDTHS = [\n { value: 4, label: \"1/3 Width (4 cols)\" },\n { value: 6, label: \"1/2 Width (6 cols)\" },\n { value: 12, label: \"Full Width (12 cols)\" },\n];\n\nexport default function FieldConfiguration({ field, onUpdate }: FieldConfigurationProps) {\n const [newOption, setNewOption] = useState(\"\");\n\n const addOption = () => {\n if (newOption.trim()) {\n const currentOptions = field.options || [];\n onUpdate({\n options: [...currentOptions, newOption.trim()]\n });\n setNewOption(\"\");\n }\n };\n\n const removeOption = (index: number) => {\n const currentOptions = field.options || [];\n onUpdate({\n options: currentOptions.filter((_, i) => i !== index)\n });\n };\n\n const needsOptions = [\"select\", \"checkbox\", \"radio\"].includes(field.type);\n\n return (\n <div className=\"space-y-6\">\n {/* Basic Settings */}\n <div className=\"space-y-4\">\n <h4 className=\"font-medium text-gray-900\">Basic Settings</h4>\n \n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n Field Type\n </label>\n <Select\n value={field.type}\n onValueChange={(value) => onUpdate({ type: value })}\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {FIELD_TYPES.map((type) => (\n <SelectItem key={type.value} value={type.value}>\n {type.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n Label *\n </label>\n <Input\n value={field.label}\n onChange={(e) => onUpdate({ label: e.target.value })}\n placeholder=\"Field label\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n Placeholder\n </label>\n <Input\n value={field.placeholder || \"\"}\n onChange={(e) => onUpdate({ placeholder: e.target.value })}\n placeholder=\"Placeholder text\"\n />\n </div>\n\n <div className=\"flex items-center space-x-2\">\n <Switch\n checked={field.required}\n onCheckedChange={(checked) => onUpdate({ required: checked })}\n />\n <label className=\"text-sm font-medium text-gray-700\">\n Required field\n </label>\n </div>\n </div>\n\n {/* Layout Settings */}\n <div className=\"space-y-4\">\n <h4 className=\"font-medium text-gray-900\">Layout Settings</h4>\n \n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n Column Width\n </label>\n <Select\n value={field.columnWidth.toString()}\n onValueChange={(value) => onUpdate({ columnWidth: parseInt(value) })}\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {COLUMN_WIDTHS.map((width) => (\n <SelectItem key={width.value} value={width.value.toString()}>\n {width.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n Group ID\n </label>\n <Input\n type=\"number\"\n value={field.groupId}\n onChange={(e) => onUpdate({ groupId: parseInt(e.target.value) || 1 })}\n placeholder=\"Group ID\"\n min=\"1\"\n />\n <p className=\"text-xs text-gray-500 mt-1\">\n Fields with the same group ID will be placed in the same row\n </p>\n </div>\n </div>\n\n {/* Options for select/checkbox/radio */}\n {needsOptions && (\n <div className=\"space-y-4\">\n <h4 className=\"font-medium text-gray-900\">Options</h4>\n \n <div className=\"space-y-2\">\n {(field.options || []).length === 0 && (\n <p className=\"text-sm text-gray-500 italic\">No options added yet. Add options below.</p>\n )}\n \n {(field.options || []).map((option, index) => (\n <div key={index} className=\"flex items-center space-x-2\">\n <Input\n value={option}\n onChange={(e) => {\n const newOptions = [...(field.options || [])];\n newOptions[index] = e.target.value;\n onUpdate({ options: newOptions });\n }}\n placeholder=\"Option text\"\n />\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => removeOption(index)}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n ))}\n \n <div className=\"flex items-center space-x-2\">\n <Input\n value={newOption}\n onChange={(e) => setNewOption(e.target.value)}\n placeholder=\"Add new option\"\n onKeyPress={(e) => e.key === 'Enter' && addOption()}\n />\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={addOption}\n disabled={!newOption.trim()}\n >\n <Plus className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n </div>\n )}\n\n {/* Validation Settings */}\n <div className=\"space-y-4\">\n <h4 className=\"font-medium text-gray-900\">Validation</h4>\n \n {field.type === \"text\" && (\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n Min Length\n </label>\n <Input\n type=\"number\"\n value={field.validation?.minLength || \"\"}\n onChange={(e) => onUpdate({\n validation: {\n ...field.validation,\n minLength: e.target.value ? parseInt(e.target.value) : undefined\n }\n })}\n placeholder=\"Minimum characters\"\n min=\"0\"\n />\n </div>\n )}\n\n {field.type === \"text\" && (\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n Max Length\n </label>\n <Input\n type=\"number\"\n value={field.validation?.maxLength || \"\"}\n onChange={(e) => onUpdate({\n validation: {\n ...field.validation,\n maxLength: e.target.value ? parseInt(e.target.value) : undefined\n }\n })}\n placeholder=\"Maximum characters\"\n min=\"0\"\n />\n </div>\n )}\n\n {field.type === \"number\" && (\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n Min Value\n </label>\n <Input\n type=\"number\"\n value={field.validation?.min || \"\"}\n onChange={(e) => onUpdate({\n validation: {\n ...field.validation,\n min: e.target.value ? parseFloat(e.target.value) : undefined\n }\n })}\n placeholder=\"Minimum value\"\n />\n </div>\n )}\n\n {field.type === \"number\" && (\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n Max Value\n </label>\n <Input\n type=\"number\"\n value={field.validation?.max || \"\"}\n onChange={(e) => onUpdate({\n validation: {\n ...field.validation,\n max: e.target.value ? parseFloat(e.target.value) : undefined\n }\n })}\n placeholder=\"Maximum value\"\n />\n </div>\n )}\n\n {field.type === \"file\" && (\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n Allowed File Types\n </label>\n <Input\n value={field.validation?.allowedTypes || \"\"}\n onChange={(e) => onUpdate({\n validation: {\n ...field.validation,\n allowedTypes: e.target.value\n }\n })}\n placeholder=\"e.g., .pdf,.doc,.jpg,.png\"\n />\n <p className=\"text-xs text-gray-500 mt-1\">\n Comma-separated file extensions (e.g., .pdf,.doc,.jpg,.png)\n </p>\n </div>\n )}\n </div>\n\n {/* Field Preview */}\n <div className=\"space-y-4\">\n <h4 className=\"font-medium text-gray-900\">Preview</h4>\n <div className=\"border rounded-lg p-4 bg-gray-50\">\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n {field.label} {field.required && <span className=\"text-red-500\">*</span>}\n </label>\n \n {field.type === \"text\" && (\n <Input placeholder={field.placeholder} disabled />\n )}\n \n {field.type === \"email\" && (\n <Input type=\"email\" placeholder={field.placeholder} disabled />\n )}\n \n {field.type === \"textarea\" && (\n <Textarea placeholder={field.placeholder} disabled />\n )}\n \n {field.type === \"select\" && (\n <div>\n {(field.options || []).length === 0 ? (\n <p className=\"text-sm text-gray-400 italic\">No options configured</p>\n ) : (\n <Select disabled>\n <SelectTrigger>\n <SelectValue placeholder={field.placeholder || \"Select an option\"} />\n </SelectTrigger>\n <SelectContent>\n {(field.options || []).map((option, index) => (\n <SelectItem key={index} value={option}>\n {option}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n </div>\n )}\n \n {field.type === \"checkbox\" && (\n <div className=\"space-y-2\">\n {(field.options || []).length === 0 ? (\n <p className=\"text-sm text-gray-400 italic\">No options configured</p>\n ) : (\n (field.options || []).map((option, index) => (\n <div key={index} className=\"flex items-center space-x-2\">\n <input type=\"checkbox\" disabled />\n <label className=\"text-sm\">{option}</label>\n </div>\n ))\n )}\n </div>\n )}\n \n {field.type === \"radio\" && (\n <div className=\"space-y-2\">\n {(field.options || []).length === 0 ? (\n <p className=\"text-sm text-gray-400 italic\">No options configured</p>\n ) : (\n (field.options || []).map((option, index) => (\n <div key={index} className=\"flex items-center space-x-2\">\n <input type=\"radio\" name=\"preview\" disabled />\n <label className=\"text-sm\">{option}</label>\n </div>\n ))\n )}\n </div>\n )}\n \n {field.type === \"file\" && (\n <Input type=\"file\" disabled />\n )}\n \n {field.type === \"date\" && (\n <Input type=\"date\" disabled />\n )}\n \n {field.type === \"number\" && (\n <Input type=\"number\" placeholder={field.placeholder} disabled />\n )}\n \n {field.type === \"phone\" && (\n <Input type=\"tel\" placeholder={field.placeholder} disabled />\n )}\n </div>\n </div>\n </div>\n );\n} ","\"use client\";\n\nimport Image from \"next/image\";\nimport { useState, useEffect } from \"react\";\nimport { Input } from \"@/components/ui/input\";\nimport { Button } from \"@/components/ui/button\";\nimport { Textarea } from \"@/components/ui/textarea\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { Badge } from \"@/components/ui/badge\";\nimport FileUpload from \"@/components/ui/file-upload\";\nimport ImageUpload from \"@/components/ui/image-upload\";\nimport { X, ArrowLeft, Save, Eye, AlertCircle } from \"lucide-react\";\nimport { useRouter } from \"next/navigation\";\nimport Link from \"next/link\";\nimport dynamic from \"next/dynamic\";\nimport TagAutocomplete from \"./TagAutocomplete\";\nimport CategoryAutocomplete from \"./CategoryAutocomplete\";\nimport UserAutocomplete from \"./UserAutocomplete\";\n\n\n// Custom styles for Quill editor to match form inputs\nconst quillStyles = `\n .ql-container {\n border: none !important;\n font-size: 14px;\n font-family: inherit;\n border-radius: 0 0 6px 6px;\n }\n .ql-toolbar {\n border: none !important;\n border-bottom: 1px solid #e5e7eb !important;\n background: #f9fafb;\n border-radius: 6px 6px 0 0;\n padding: 8px 12px;\n }\n .ql-toolbar button {\n border-radius: 4px;\n margin: 0 1px;\n }\n .ql-toolbar button:hover {\n background-color: #e5e7eb !important;\n }\n .ql-editor {\n min-height: 800px;\n padding: 16px;\n border: none !important;\n outline: none !important;\n font-family: inherit;\n line-height: 1.6;\n color: #374151;\n }\n .ql-editor:focus {\n outline: none !important;\n }\n .ql-editor.ql-blank::before {\n color: #9ca3af;\n font-style: normal;\n font-size: 14px;\n }\n .ql-editor p {\n margin-bottom: 12px;\n }\n .ql-editor h1, .ql-editor h2, .ql-editor h3 {\n margin-top: 16px;\n margin-bottom: 8px;\n font-weight: 600;\n }\n`;\n\n// Dynamically import Quill to prevent SSR issues\nconst ReactQuill = dynamic(() => import(\"react-quill-new\"), { ssr: false });\n\nexport default function BlogEditor({ existingBlog }: { existingBlog?: any }) {\n const [title, setTitle] = useState(existingBlog?.title || \"\");\n const [slug, setSlug] = useState(existingBlog?.slug || \"\");\n const [coverImage, setCoverImage] = useState<string | null>(\n existingBlog?.coverImage || null,\n );\n const [ogImage, setOgImage] = useState<string | null>(\n existingBlog?.seo?.ogImage || existingBlog?.ogImage || null,\n );\n\n // Debug OG image\n useEffect(() => {\n if (existingBlog) {\n console.log(\"Existing blog data:\", {\n seoOgImage: existingBlog?.seo?.ogImage,\n directOgImage: existingBlog?.ogImage,\n finalOgImage: existingBlog?.seo?.ogImage || existingBlog?.ogImage || null\n });\n }\n }, [existingBlog]);\n const [metaTitle, setMetaTitle] = useState(existingBlog?.seo?.title || \"\");\n const [metaDescription, setMetaDescription] = useState(\n existingBlog?.seo?.description || \"\",\n );\n const [metaKeywords, setMetaKeywords] = useState(\n existingBlog?.seo?.keywords || \"\",\n );\n const [published, setPublished] = useState(existingBlog?.published || false);\n const [tags, setTags] = useState<string[]>(\n existingBlog?.tags?.map((tag: any) => tag.name) || []\n );\n const [category, setCategory] = useState<string | null>(\n existingBlog?.category?.name || null\n );\n const [authorId, setAuthorId] = useState<number | null>(\n existingBlog?.authorId || null\n );\n const [content, setContent] = useState(existingBlog?.content || \"\");\n const [createdAt, setCreatedAt] = useState(\n existingBlog?.createdAt \n ? new Date(existingBlog.createdAt).toISOString().slice(0, 16)\n : new Date().toISOString().slice(0, 16)\n );\n const [errors, setErrors] = useState<string[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [isSaving, setIsSaving] = useState(false);\n const router = useRouter();\n\n // Auto-generate slug from title\n useEffect(() => {\n if (title && !slug) {\n const generatedSlug = title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/(^-|-$)/g, '');\n setSlug(generatedSlug);\n }\n }, [title, slug]);\n\n // Handle image upload\n const handleUpload = async (\n event: React.ChangeEvent<HTMLInputElement>,\n setImage: (url: string) => void,\n ) => {\n if (!event.target.files) return;\n\n const formData = new FormData();\n formData.append(\"file\", event.target.files[0]);\n\n try {\n const res = await fetch(\"/api/upload\", {\n method: \"POST\",\n body: formData,\n });\n\n const data = await res.json();\n\n if (!res.ok) {\n throw new Error(data.error || data.details || \"Upload failed\");\n }\n\n console.log(\"Upload successful:\", data.filePath);\n setImage(data.filePath);\n } catch (error) {\n console.error(\"Upload error:\", error);\n const errorMessage = error instanceof Error ? error.message : \"Failed to upload image\";\n setErrors([errorMessage]);\n }\n };\n\n\n\n // Validate form\n const validateForm = (isPublishing: boolean = false) => {\n const newErrors: string[] = [];\n\n if (!title.trim()) {\n newErrors.push(\"Title is required\");\n }\n\n if (!authorId) {\n newErrors.push(\"Author is required\");\n }\n\n if (!content.trim()) {\n newErrors.push(\"Content is required\");\n }\n\n if (isPublishing) {\n if (!slug.trim()) {\n newErrors.push(\"Slug is required for publishing\");\n }\n \n if (!metaTitle.trim()) {\n newErrors.push(\"Meta title is required for publishing\");\n }\n \n if (!metaDescription.trim()) {\n newErrors.push(\"Meta description is required for publishing\");\n }\n \n if (!coverImage) {\n newErrors.push(\"Cover image is required for publishing\");\n }\n }\n\n setErrors(newErrors);\n return newErrors.length === 0;\n };\n\n // Save the blog post (partial save)\n const handleSave = async (isPublishing: boolean = false) => {\n setIsSaving(true);\n setErrors([]);\n\n // Validate form\n if (!validateForm(isPublishing)) {\n setIsSaving(false);\n return;\n }\n\n const body = {\n title,\n slug,\n content,\n published: isPublishing,\n tags,\n category,\n authorId,\n metaTitle,\n metaDescription,\n metaKeywords,\n coverImage,\n ogImage,\n createdAt,\n };\n\n const method = existingBlog ? \"PUT\" : \"POST\";\n const url = existingBlog ? `/api/blogs/${existingBlog.id}` : \"/api/blogs\";\n\n try {\n const response = await fetch(url, {\n method,\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n\n const data = await response.json();\n\n if (!response.ok) {\n if (data.details && Array.isArray(data.details)) {\n setErrors(data.details);\n } else {\n setErrors([data.error || \"Failed to save blog\"]);\n }\n return;\n }\n\n // Success\n if (isPublishing) {\n router.push(\"/admin/blogs\");\n } else {\n // For partial save, update the existing blog ID if it's a new blog\n if (!existingBlog && data.id) {\n router.replace(`/admin/blogs/${data.id}`);\n }\n }\n } catch (error) {\n console.error(\"Save error:\", error);\n setErrors([\"Failed to save blog\"]);\n } finally {\n setIsSaving(false);\n }\n };\n\n // Quill Modules (Toolbar Configuration)\n const quillModules = {\n toolbar: [\n [{ header: [1, 2, false] }],\n [\"bold\", \"italic\", \"underline\", \"strike\"],\n [{ list: \"ordered\" }, { list: \"bullet\" }],\n [\"blockquote\", \"code-block\"],\n [\"link\", \"image\", \"video\"],\n [{ align: [] }],\n [{ color: [] }, { background: [] }],\n [\"clean\"], // Remove formatting\n [{ table: true }], // Table Button\n ],\n table: {\n operationMenu: {\n items: {\n insertColumnRight: { text: \"Insert Column Right\" },\n insertColumnLeft: { text: \"Insert Column Left\" },\n insertRowUp: { text: \"Insert Row Above\" },\n insertRowDown: { text: \"Insert Row Below\" },\n deleteColumn: { text: \"Delete Column\" },\n deleteRow: { text: \"Delete Row\" },\n deleteTable: { text: \"Delete Table\" },\n },\n },\n },\n };\n\n return (\n <div className=\"rounded-lg bg-white shadow-md\">\n {/* Header with loader color gradient background */}\n <div className=\"bg-gray-800 border-b border-gray-700 px-4 py-2.5 rounded-t-lg\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-xl font-bold text-white\">\n {existingBlog ? \"Edit Blog\" : \"Create New Blog\"}\n </h1>\n <p className=\"text-xs text-gray-300 mt-0.5\">\n {existingBlog ? \"Update blog details\" : \"Add a new blog post\"}\n </p>\n </div>\n <div className=\"flex items-center space-x-3\">\n <div className=\"flex items-center gap-2\">\n <Switch\n checked={published}\n onCheckedChange={(checked) => setPublished(checked as boolean)}\n className=\"data-[state=checked]:bg-green-500\"\n />\n <span className=\"text-xs text-gray-300\">Published</span>\n </div>\n <Button\n size=\"sm\"\n className=\"flex items-center bg-white text-gray-800 hover:bg-gray-100 border-0 text-xs\"\n onClick={() => handleSave(published)}\n disabled={isSaving}\n >\n <Save className=\"h-4 w-4 mr-1\" />\n {isSaving ? \"Saving...\" : \"Save\"}\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"flex items-center bg-white text-gray-800 hover:bg-gray-100 border-0 text-xs\"\n onClick={() => router.back()}\n >\n <X className=\"h-4 w-4 mr-1\" /> Close\n </Button>\n </div>\n </div>\n </div>\n \n {/* Error Messages */}\n {errors.length > 0 && (\n <div className=\"bg-red-50 border-l-4 border-red-400 p-4 mx-6 mt-4\">\n <div className=\"flex\">\n <AlertCircle className=\"h-5 w-5 text-red-400\" />\n <div className=\"ml-3\">\n <h3 className=\"text-sm font-medium text-red-800\">\n Please fix the following errors:\n </h3>\n <div className=\"mt-2 text-sm text-red-700\">\n <ul className=\"list-disc pl-5 space-y-1\">\n {errors.map((error, index) => (\n <li key={index}>{error}</li>\n ))}\n </ul>\n </div>\n </div>\n </div>\n </div>\n )}\n \n {/* Content */}\n <div className=\"p-6\">\n <div className=\"flex w-full gap-6\">\n {/* LEFT COLUMN - 80% */}\n <div className=\"flex w-3/4 flex-col gap-4\">\n {/* Quill Editor with Table Support */}\n <div className=\"mb-6\">\n <label className=\"block text-sm font-semibold text-gray-700 mb-2\">\n Content *\n </label>\n <div className=\"border border-gray-300 rounded-md bg-white overflow-hidden focus-within:border-gray-500 focus-within:ring-1 focus-within:ring-gray-500 transition-colors\">\n <style dangerouslySetInnerHTML={{ __html: quillStyles }} />\n <ReactQuill\n value={content}\n onChange={setContent}\n theme=\"snow\"\n modules={quillModules}\n placeholder=\"Write your blog content here...\"\n />\n </div>\n </div>\n </div>\n\n {/* RIGHT COLUMN - 20% */}\n <div className=\"flex w-1/4 flex-col gap-4 rounded-lg bg-gray-50 border overflow-hidden\">\n <div className=\"p-3 bg-white border-b\">\n <div className=\"text-xs font-semibold text-gray-500 uppercase tracking-wide mb-2\">Blog</div>\n <div className=\"space-y-2\">\n <div>\n <label className=\"block text-xs font-medium text-gray-600 mb-1\">Title *</label>\n <Input\n type=\"text\"\n placeholder=\"Blog Title\"\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n className=\"h-8 text-sm\"\n />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-gray-600 mb-1\">Slug *</label>\n <Input\n type=\"text\"\n placeholder=\"blog-post-url\"\n value={slug}\n onChange={(e) => setSlug(e.target.value)}\n className=\"h-8 text-sm\"\n />\n <p className=\"text-xs text-gray-500 mt-1\">yourdomain.com/blog/{slug || \"...\"}</p>\n </div>\n </div>\n </div>\n <div className=\"p-4 flex flex-col gap-4\">\n {/* Author Selection */}\n <div>\n <p className=\"text-sm font-semibold\">Author *</p>\n <UserAutocomplete\n selectedUserId={authorId}\n onUserChange={setAuthorId}\n placeholder=\"Select author...\"\n className=\"w-full\"\n />\n </div>\n\n {/* Cover Image Upload */}\n <div>\n <ImageUpload\n value={coverImage}\n onChange={setCoverImage}\n label=\"Cover Image\"\n required={true}\n className=\"w-full\"\n />\n </div>\n\n {/* Open Graph Image Upload */}\n <div>\n <ImageUpload\n value={ogImage}\n onChange={setOgImage}\n label=\"OG Image (for social sharing)\"\n required={false}\n className=\"w-full\"\n />\n </div>\n\n {/* Tags Input */}\n <div>\n <p className=\"text-sm font-semibold\">Tags</p>\n <TagAutocomplete\n selectedTags={tags}\n onTagsChange={setTags}\n placeholder=\"Search or create tags...\"\n className=\"w-full\"\n />\n </div>\n\n {/* Category Input */}\n <div>\n <p className=\"text-sm font-semibold\">Category</p>\n <CategoryAutocomplete\n selectedCategory={category}\n onCategoryChange={setCategory}\n placeholder=\"Search or create category...\"\n className=\"w-full\"\n />\n </div>\n\n {/* Meta Title */}\n <div>\n <p className=\"text-sm font-semibold\">Meta Title *</p>\n <Input\n type=\"text\"\n placeholder=\"Meta Title\"\n value={metaTitle}\n onChange={(e) => setMetaTitle(e.target.value)}\n className=\"w-full\"\n />\n </div>\n\n {/* Meta Description */}\n <div>\n <p className=\"text-sm font-semibold\">Meta Description *</p>\n <Textarea\n placeholder=\"Meta Description\"\n value={metaDescription}\n onChange={(e) => setMetaDescription(e.target.value)}\n className=\"w-full\"\n rows={3}\n />\n </div>\n\n {/* Meta Keywords */}\n <div>\n <p className=\"text-sm font-semibold\">Meta Keywords</p>\n <Input\n type=\"text\"\n placeholder=\"Comma-separated keywords\"\n value={metaKeywords}\n onChange={(e) => setMetaKeywords(e.target.value)}\n className=\"w-full\"\n />\n </div>\n\n {/* Created Date */}\n <div>\n <p className=\"text-sm font-semibold\">Created Date</p>\n <Input\n type=\"datetime-local\"\n value={createdAt}\n onChange={(e) => setCreatedAt(e.target.value)}\n className=\"w-full\"\n />\n <p className=\"text-xs text-gray-500 mt-1\">\n Set the creation date for backdated posts\n </p>\n </div>\n\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useState, useRef, useCallback } from 'react';\nimport { Upload, X, ImageIcon, AlertCircle, CheckCircle } from 'lucide-react';\nimport { Button } from './button';\nimport { cn } from '@/lib/utils';\nimport Image from 'next/image';\n\ninterface ImageUploadProps {\n value?: string | null;\n onChange: (url: string) => void;\n onRemove?: () => void;\n label: string;\n required?: boolean;\n className?: string;\n maxSize?: number; // in MB\n acceptedTypes?: string[];\n}\n\nexport default function ImageUpload({\n value,\n onChange,\n onRemove,\n label,\n required = false,\n className,\n maxSize = 10, // 10MB default\n acceptedTypes = ['image/jpeg', 'image/png', 'image/gif', 'image/webp']\n}: ImageUploadProps) {\n const [isDragOver, setIsDragOver] = useState(false);\n const [isUploading, setIsUploading] = useState(false);\n const [uploadProgress, setUploadProgress] = useState(0);\n const [error, setError] = useState<string | null>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const handleFileSelect = useCallback(async (file: File) => {\n // Reset states\n setError(null);\n setUploadProgress(0);\n\n // Validate file type\n if (!acceptedTypes.includes(file.type)) {\n setError(`File type not supported. Please use: ${acceptedTypes.join(', ')}`);\n return;\n }\n\n // Validate file size\n if (file.size > maxSize * 1024 * 1024) {\n setError(`File size must be less than ${maxSize}MB`);\n return;\n }\n\n setIsUploading(true);\n\n try {\n const formData = new FormData();\n formData.append(\"file\", file);\n\n const response = await fetch(\"/api/upload\", {\n method: \"POST\",\n body: formData,\n });\n\n const data = await response.json();\n\n if (!response.ok) {\n throw new Error(data.error || data.details || \"Upload failed\");\n }\n\n onChange(data.filePath);\n setUploadProgress(100);\n } catch (error) {\n console.error(\"Upload error:\", error);\n setError(error instanceof Error ? error.message : \"Failed to upload image\");\n } finally {\n setIsUploading(false);\n }\n }, [onChange, acceptedTypes, maxSize]);\n\n const handleDrop = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n setIsDragOver(false);\n\n const files = Array.from(e.dataTransfer.files);\n if (files.length > 0) {\n handleFileSelect(files[0]);\n }\n }, [handleFileSelect]);\n\n const handleDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n setIsDragOver(true);\n }, []);\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n setIsDragOver(false);\n }, []);\n\n const handleFileInputChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files;\n if (files && files.length > 0) {\n handleFileSelect(files[0]);\n }\n }, [handleFileSelect]);\n\n const handleRemove = useCallback(() => {\n if (onRemove) {\n onRemove();\n } else {\n onChange('');\n }\n setError(null);\n setUploadProgress(0);\n }, [onChange, onRemove]);\n\n const openFileDialog = useCallback(() => {\n fileInputRef.current?.click();\n }, []);\n\n return (\n <div className={cn(\"space-y-3\", className)}>\n <div className=\"flex items-center justify-between\">\n <label className=\"text-sm font-semibold\">\n {label}\n {required && <span className=\"text-red-500 ml-1\">*</span>}\n </label>\n {value && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={handleRemove}\n className=\"h-8 px-2 text-xs\"\n >\n <X className=\"h-3 w-3 mr-1\" />\n Remove\n </Button>\n )}\n </div>\n\n {!value ? (\n <div\n className={cn(\n \"border-2 border-dashed rounded-lg p-6 text-center transition-colors cursor-pointer\",\n isDragOver\n ? \"border-primary bg-primary/5\"\n : \"border-gray-300 hover:border-primary/50 hover:bg-gray-50\",\n error && \"border-red-300 bg-red-50\"\n )}\n onDrop={handleDrop}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onClick={openFileDialog}\n >\n <input\n ref={fileInputRef}\n type=\"file\"\n accept={acceptedTypes.join(',')}\n onChange={handleFileInputChange}\n className=\"hidden\"\n disabled={isUploading}\n />\n\n {isUploading ? (\n <div className=\"space-y-3\">\n <div className=\"animate-spin rounded-full h-8 w-8 border-b-2 border-primary mx-auto\"></div>\n <div className=\"space-y-1\">\n <p className=\"text-sm font-medium\">Uploading...</p>\n <div className=\"w-full bg-gray-200 rounded-full h-2\">\n <div\n className=\"bg-primary h-2 rounded-full transition-all duration-300\"\n style={{ width: `${uploadProgress}%` }}\n ></div>\n </div>\n <p className=\"text-xs text-gray-500\">{uploadProgress}%</p>\n </div>\n </div>\n ) : (\n <div className=\"space-y-3\">\n <div className=\"mx-auto w-12 h-12 bg-gray-100 rounded-full flex items-center justify-center\">\n {error ? (\n <AlertCircle className=\"h-6 w-6 text-red-500\" />\n ) : (\n <Upload className=\"h-6 w-6 text-gray-400\" />\n )}\n </div>\n <div className=\"space-y-1\">\n <p className=\"text-sm font-medium\">\n {error ? \"Upload failed\" : \"Click to upload or drag and drop\"}\n </p>\n <p className=\"text-xs text-gray-500\">\n {error || `PNG, JPG, GIF, WEBP up to ${maxSize}MB`}\n </p>\n </div>\n </div>\n )}\n </div>\n ) : (\n <div className=\"space-y-3\">\n <div className=\"relative group\">\n <div className=\"aspect-video w-full rounded-lg overflow-hidden bg-gray-100\">\n <Image\n src={value}\n alt={label}\n width={800}\n height={450}\n className=\"w-full h-full object-cover\"\n onError={(e) => {\n console.error(\"Image failed to load:\", value);\n e.currentTarget.style.display = 'none';\n }}\n />\n </div>\n <div className=\"absolute inset-0 bg-black/50 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center\">\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n onClick={openFileDialog}\n className=\"bg-white/90 hover:bg-white\"\n >\n <ImageIcon className=\"h-4 w-4 mr-1\" />\n Replace\n </Button>\n </div>\n </div>\n <div className=\"flex items-center justify-between text-xs text-gray-500\">\n <span>Current image</span>\n <span className=\"truncate max-w-[200px]\">{value}</span>\n </div>\n </div>\n )}\n\n {error && (\n <div className=\"flex items-center space-x-2 text-sm text-red-600\">\n <AlertCircle className=\"h-4 w-4\" />\n <span>{error}</span>\n </div>\n )}\n </div>\n );\n} ","\"use client\";\n\nimport { useState, useEffect, useRef, useCallback } from \"react\";\nimport { Input } from \"@/components/ui/input\";\nimport { Button } from \"@/components/ui/button\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { X, Plus, Search } from \"lucide-react\";\n\ninterface Tag {\n id: number;\n name: string;\n}\n\ninterface TagAutocompleteProps {\n selectedTags: string[];\n onTagsChange: (tags: string[]) => void;\n placeholder?: string;\n className?: string;\n}\n\nexport default function TagAutocomplete({\n selectedTags,\n onTagsChange,\n placeholder = \"Search or create tags...\",\n className = \"\"\n}: TagAutocompleteProps) {\n const [inputValue, setInputValue] = useState(\"\");\n const [suggestions, setSuggestions] = useState<Tag[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [showSuggestions, setShowSuggestions] = useState(false);\n const [isCreating, setIsCreating] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const suggestionsRef = useRef<HTMLDivElement>(null);\n\n // Fetch tag suggestions\n const fetchSuggestions = useCallback(async (query: string) => {\n if (!query.trim()) {\n setSuggestions([]);\n return;\n }\n\n setIsLoading(true);\n try {\n const response = await fetch(`/api/tags?search=${encodeURIComponent(query)}`);\n if (response.ok) {\n const tags = await response.json();\n // Filter out already selected tags\n const filteredTags = tags.filter((tag: Tag) => \n !selectedTags.includes(tag.name)\n );\n setSuggestions(filteredTags);\n }\n } catch (error) {\n console.error(\"Error fetching tags:\", error);\n } finally {\n setIsLoading(false);\n }\n }, [selectedTags]);\n\n // Debounced search\n useEffect(() => {\n const timeoutId = setTimeout(() => {\n fetchSuggestions(inputValue);\n }, 300);\n\n return () => clearTimeout(timeoutId);\n }, [inputValue, fetchSuggestions]);\n\n // Handle input change\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n setInputValue(value);\n setShowSuggestions(true);\n };\n\n // Handle suggestion selection\n const handleSuggestionSelect = (tag: Tag) => {\n if (!selectedTags.includes(tag.name)) {\n onTagsChange([...selectedTags, tag.name]);\n }\n setInputValue(\"\");\n setShowSuggestions(false);\n setSuggestions([]);\n };\n\n // Handle creating new tag\n const handleCreateTag = async () => {\n if (!inputValue.trim() || selectedTags.includes(inputValue.trim())) {\n return;\n }\n\n setIsCreating(true);\n try {\n const response = await fetch(\"/api/tags\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ name: inputValue.trim() }),\n });\n\n if (response.ok) {\n const newTag = await response.json();\n onTagsChange([...selectedTags, newTag.name]);\n setInputValue(\"\");\n setShowSuggestions(false);\n setSuggestions([]);\n } else {\n const error = await response.json();\n console.error(\"Error creating tag:\", error);\n }\n } catch (error) {\n console.error(\"Error creating tag:\", error);\n } finally {\n setIsCreating(false);\n }\n };\n\n // Handle removing tag\n const handleRemoveTag = (tagToRemove: string) => {\n onTagsChange(selectedTags.filter(tag => tag !== tagToRemove));\n };\n\n // Handle key press\n const handleKeyPress = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n if (suggestions.length > 0) {\n handleSuggestionSelect(suggestions[0]);\n } else if (inputValue.trim()) {\n handleCreateTag();\n }\n } else if (e.key === \"Escape\") {\n setShowSuggestions(false);\n inputRef.current?.blur();\n }\n };\n\n // Handle click outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n suggestionsRef.current &&\n !suggestionsRef.current.contains(event.target as Node) &&\n inputRef.current &&\n !inputRef.current.contains(event.target as Node)\n ) {\n setShowSuggestions(false);\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, []);\n\n return (\n <div className={`relative ${className}`}>\n {/* Selected Tags */}\n {selectedTags.length > 0 && (\n <div className=\"mb-2 flex flex-wrap gap-2\">\n {selectedTags.map((tag) => (\n <Badge key={tag} className=\"flex items-center gap-1\">\n {tag}\n <X\n size={12}\n className=\"cursor-pointer hover:text-red-500\"\n onClick={() => handleRemoveTag(tag)}\n />\n </Badge>\n ))}\n </div>\n )}\n\n {/* Input Field */}\n <div className=\"relative\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-gray-400\" />\n <Input\n ref={inputRef}\n type=\"text\"\n placeholder={placeholder}\n value={inputValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyPress}\n onFocus={() => setShowSuggestions(true)}\n className=\"pl-10 pr-20\"\n />\n {inputValue.trim() && (\n <Button\n size=\"sm\"\n onClick={handleCreateTag}\n disabled={isCreating || selectedTags.includes(inputValue.trim())}\n className=\"absolute right-1 top-1/2 -translate-y-1/2 h-7 px-2\"\n >\n {isCreating ? (\n \"Creating...\"\n ) : (\n <>\n <Plus className=\"h-3 w-3 mr-1\" />\n Create\n </>\n )}\n </Button>\n )}\n </div>\n\n {/* Suggestions Dropdown */}\n {showSuggestions && (suggestions.length > 0 || isLoading) && (\n <div\n ref={suggestionsRef}\n className=\"absolute z-50 w-full mt-1 bg-white border border-gray-200 rounded-md shadow-lg max-h-60 overflow-auto\"\n >\n {isLoading ? (\n <div className=\"px-4 py-2 text-sm text-gray-500\">Loading...</div>\n ) : (\n suggestions.map((tag) => (\n <div\n key={tag.id}\n className=\"px-4 py-2 hover:bg-gray-100 cursor-pointer text-sm\"\n onClick={() => handleSuggestionSelect(tag)}\n >\n {tag.name}\n </div>\n ))\n )}\n </div>\n )}\n\n {/* Create New Tag Option */}\n {showSuggestions && \n inputValue.trim() && \n !isLoading && \n suggestions.length === 0 && \n !selectedTags.includes(inputValue.trim()) && (\n <div\n ref={suggestionsRef}\n className=\"absolute z-50 w-full mt-1 bg-white border border-gray-200 rounded-md shadow-lg\"\n >\n <div\n className=\"px-4 py-2 hover:bg-gray-100 cursor-pointer text-sm text-gray-700 flex items-center\"\n onClick={handleCreateTag}\n >\n <Plus className=\"h-3 w-3 mr-2\" />\n Create &quot;{inputValue.trim()}&quot;\n </div>\n </div>\n )}\n </div>\n );\n} ","\"use client\";\n\nimport { useState, useEffect, useRef } from \"react\";\nimport { Input } from \"@/components/ui/input\";\nimport { Button } from \"@/components/ui/button\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { X, Plus, Search, Check } from \"lucide-react\";\n\ninterface Category {\n id: number;\n name: string;\n}\n\ninterface CategoryAutocompleteProps {\n selectedCategory: string | null;\n onCategoryChange: (category: string | null) => void;\n placeholder?: string;\n className?: string;\n}\n\nexport default function CategoryAutocomplete({\n selectedCategory,\n onCategoryChange,\n placeholder = \"Search or create category...\",\n className = \"\"\n}: CategoryAutocompleteProps) {\n const [inputValue, setInputValue] = useState(\"\");\n const [suggestions, setSuggestions] = useState<Category[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [showSuggestions, setShowSuggestions] = useState(false);\n const [isCreating, setIsCreating] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const suggestionsRef = useRef<HTMLDivElement>(null);\n\n // Fetch category suggestions\n const fetchSuggestions = async (query: string) => {\n if (!query.trim()) {\n setSuggestions([]);\n return;\n }\n\n setIsLoading(true);\n try {\n const response = await fetch(`/api/categories?search=${encodeURIComponent(query)}`);\n if (response.ok) {\n const categories = await response.json();\n setSuggestions(categories);\n }\n } catch (error) {\n console.error(\"Error fetching categories:\", error);\n } finally {\n setIsLoading(false);\n }\n };\n\n // Debounced search\n useEffect(() => {\n const timeoutId = setTimeout(() => {\n fetchSuggestions(inputValue);\n }, 300);\n\n return () => clearTimeout(timeoutId);\n }, [inputValue]);\n\n // Handle input change\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n setInputValue(value);\n setShowSuggestions(true);\n };\n\n // Handle suggestion selection\n const handleSuggestionSelect = (category: Category) => {\n onCategoryChange(category.name);\n setInputValue(\"\");\n setShowSuggestions(false);\n setSuggestions([]);\n };\n\n // Handle creating new category\n const handleCreateCategory = async () => {\n if (!inputValue.trim()) {\n return;\n }\n\n setIsCreating(true);\n try {\n const response = await fetch(\"/api/categories\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ name: inputValue.trim() }),\n });\n\n if (response.ok) {\n const newCategory = await response.json();\n onCategoryChange(newCategory.name);\n setInputValue(\"\");\n setShowSuggestions(false);\n setSuggestions([]);\n } else {\n const error = await response.json();\n console.error(\"Error creating category:\", error);\n }\n } catch (error) {\n console.error(\"Error creating category:\", error);\n } finally {\n setIsCreating(false);\n }\n };\n\n // Handle removing category\n const handleRemoveCategory = () => {\n onCategoryChange(null);\n };\n\n // Handle key press\n const handleKeyPress = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n if (suggestions.length > 0) {\n handleSuggestionSelect(suggestions[0]);\n } else if (inputValue.trim()) {\n handleCreateCategory();\n }\n } else if (e.key === \"Escape\") {\n setShowSuggestions(false);\n inputRef.current?.blur();\n }\n };\n\n // Handle click outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n suggestionsRef.current &&\n !suggestionsRef.current.contains(event.target as Node) &&\n inputRef.current &&\n !inputRef.current.contains(event.target as Node)\n ) {\n setShowSuggestions(false);\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, []);\n\n return (\n <div className={`relative ${className}`}>\n {/* Selected Category */}\n {selectedCategory && (\n <div className=\"mb-2\">\n <Badge className=\"flex items-center gap-1\">\n {selectedCategory}\n <X\n size={12}\n className=\"cursor-pointer hover:text-red-500\"\n onClick={handleRemoveCategory}\n />\n </Badge>\n </div>\n )}\n\n {/* Input Field */}\n <div className=\"relative\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-gray-400\" />\n <Input\n ref={inputRef}\n type=\"text\"\n placeholder={placeholder}\n value={inputValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyPress}\n onFocus={() => setShowSuggestions(true)}\n className=\"pl-10 pr-20\"\n />\n {inputValue.trim() && (\n <Button\n size=\"sm\"\n onClick={handleCreateCategory}\n disabled={isCreating}\n className=\"absolute right-1 top-1/2 -translate-y-1/2 h-7 px-2\"\n >\n {isCreating ? (\n \"Creating...\"\n ) : (\n <>\n <Plus className=\"h-3 w-3 mr-1\" />\n Create\n </>\n )}\n </Button>\n )}\n </div>\n\n {/* Suggestions Dropdown */}\n {showSuggestions && (suggestions.length > 0 || isLoading) && (\n <div\n ref={suggestionsRef}\n className=\"absolute z-50 w-full mt-1 bg-white border border-gray-200 rounded-md shadow-lg max-h-60 overflow-auto\"\n >\n {isLoading ? (\n <div className=\"px-4 py-2 text-sm text-gray-500\">Loading...</div>\n ) : (\n suggestions.map((category) => (\n <div\n key={category.id}\n className=\"px-4 py-2 hover:bg-gray-100 cursor-pointer text-sm flex items-center justify-between\"\n onClick={() => handleSuggestionSelect(category)}\n >\n {category.name}\n {selectedCategory === category.name && (\n <Check className=\"h-4 w-4 text-green-500\" />\n )}\n </div>\n ))\n )}\n </div>\n )}\n\n {/* Create New Category Option */}\n {showSuggestions && \n inputValue.trim() && \n !isLoading && \n suggestions.length === 0 && (\n <div\n ref={suggestionsRef}\n className=\"absolute z-50 w-full mt-1 bg-white border border-gray-200 rounded-md shadow-lg\"\n >\n <div\n className=\"px-4 py-2 hover:bg-gray-100 cursor-pointer text-sm text-gray-700 flex items-center\"\n onClick={handleCreateCategory}\n >\n <Plus className=\"h-3 w-3 mr-2\" />\n Create &quot;{inputValue.trim()}&quot;\n </div>\n </div>\n )}\n </div>\n );\n} ","\"use client\";\n\nimport { useState, useEffect, useRef } from \"react\";\nimport { Input } from \"@/components/ui/input\";\nimport { Button } from \"@/components/ui/button\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { X, Search, Check } from \"lucide-react\";\n\ninterface User {\n id: number;\n name: string;\n email: string;\n}\n\ninterface UserAutocompleteProps {\n selectedUserId: number | null;\n onUserChange: (userId: number | null) => void;\n placeholder?: string;\n className?: string;\n}\n\nexport default function UserAutocomplete({\n selectedUserId,\n onUserChange,\n placeholder = \"Select author...\",\n className = \"\"\n}: UserAutocompleteProps) {\n const [inputValue, setInputValue] = useState(\"\");\n const [suggestions, setSuggestions] = useState<User[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [showSuggestions, setShowSuggestions] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const suggestionsRef = useRef<HTMLDivElement>(null);\n\n // Fetch user suggestions\n const fetchSuggestions = async (query: string) => {\n setIsLoading(true);\n try {\n const params = new URLSearchParams();\n if (query.trim()) {\n params.append(\"search\", query);\n }\n params.append(\"limit\", \"50\");\n\n const response = await fetch(`/api/users?${params}`);\n if (response.ok) {\n const data = await response.json();\n setSuggestions(data.data || []);\n }\n } catch (error) {\n console.error(\"Error fetching users:\", error);\n } finally {\n setIsLoading(false);\n }\n };\n\n // Debounced search\n useEffect(() => {\n const timeoutId = setTimeout(() => {\n fetchSuggestions(inputValue);\n }, 300);\n\n return () => clearTimeout(timeoutId);\n }, [inputValue]);\n\n // Handle input change\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n setInputValue(value);\n setShowSuggestions(true);\n };\n\n // Handle suggestion selection\n const handleSuggestionSelect = (user: User) => {\n onUserChange(user.id);\n setInputValue(\"\");\n setShowSuggestions(false);\n setSuggestions([]);\n };\n\n // Handle removing user\n const handleRemoveUser = () => {\n onUserChange(null);\n };\n\n // Handle key press\n const handleKeyPress = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n if (suggestions.length > 0) {\n handleSuggestionSelect(suggestions[0]);\n }\n } else if (e.key === \"Escape\") {\n setShowSuggestions(false);\n inputRef.current?.blur();\n }\n };\n\n // Handle click outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n suggestionsRef.current &&\n !suggestionsRef.current.contains(event.target as Node) &&\n inputRef.current &&\n !inputRef.current.contains(event.target as Node)\n ) {\n setShowSuggestions(false);\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, []);\n\n const selectedUser = suggestions.find(user => user.id === selectedUserId);\n\n return (\n <div className={`relative ${className}`}>\n {/* Selected User */}\n {selectedUser && (\n <div className=\"mb-2\">\n <Badge className=\"flex items-center gap-1\">\n {selectedUser.name}\n <X\n size={12}\n className=\"cursor-pointer hover:text-red-500\"\n onClick={handleRemoveUser}\n />\n </Badge>\n </div>\n )}\n\n {/* Input Field */}\n <div className=\"relative\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-gray-400\" />\n <Input\n ref={inputRef}\n type=\"text\"\n placeholder={placeholder}\n value={inputValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyPress}\n onFocus={() => setShowSuggestions(true)}\n className=\"pl-10\"\n />\n </div>\n\n {/* Suggestions Dropdown */}\n {showSuggestions && (suggestions.length > 0 || isLoading) && (\n <div\n ref={suggestionsRef}\n className=\"absolute z-50 w-full mt-1 bg-white border border-gray-200 rounded-md shadow-lg max-h-60 overflow-auto\"\n >\n {isLoading ? (\n <div className=\"px-4 py-2 text-sm text-gray-500\">Loading...</div>\n ) : (\n suggestions.map((user) => (\n <div\n key={user.id}\n className=\"px-4 py-2 hover:bg-gray-100 cursor-pointer text-sm flex items-center justify-between\"\n onClick={() => handleSuggestionSelect(user)}\n >\n <div className=\"flex flex-col\">\n <span className=\"font-medium\">{user.name}</span>\n <span className=\"text-xs text-gray-500\">{user.email}</span>\n </div>\n {selectedUserId === user.id && (\n <Check className=\"h-4 w-4 text-green-500\" />\n )}\n </div>\n ))\n )}\n </div>\n )}\n </div>\n );\n} ","\"use client\";\n\nimport { useEffect, useRef } from 'react';\n\ninterface AnalyticsChartProps {\n data: Array<{ label: string; value: number }>;\n title: string;\n type: 'bar' | 'line' | 'doughnut';\n}\n\nexport default function AnalyticsChart({ data, title, type }: AnalyticsChartProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n\n useEffect(() => {\n if (!canvasRef.current || !data.length) return;\n\n const ctx = canvasRef.current.getContext('2d');\n if (!ctx) return;\n\n // Simple chart implementation - you can enhance this with Chart.js or similar\n const maxValue = Math.max(...data.map(d => d.value));\n const barWidth = 40;\n const barSpacing = 20;\n const chartHeight = 200;\n\n ctx.clearRect(0, 0, canvasRef.current.width, canvasRef.current.height);\n\n data.forEach((item, index) => {\n const x = index * (barWidth + barSpacing) + 50;\n const height = (item.value / maxValue) * chartHeight;\n const y = chartHeight - height + 50;\n\n ctx.fillStyle = '#3b82f6';\n ctx.fillRect(x, y, barWidth, height);\n\n ctx.fillStyle = '#374151';\n ctx.font = '12px Arial';\n ctx.textAlign = 'center';\n ctx.fillText(item.label, x + barWidth / 2, chartHeight + 70);\n });\n }, [data]);\n\n return (\n <div className=\"bg-white dark:bg-gray-800 p-6 rounded-lg shadow\">\n <h3 className=\"text-lg font-semibold mb-4\">{title}</h3>\n <canvas ref={canvasRef} width={600} height={300} className=\"w-full\" />\n </div>\n );\n} ","\"use client\";\n\nimport {\n Chart as ChartJS,\n CategoryScale,\n LinearScale,\n PointElement,\n LineElement,\n Title,\n Tooltip,\n Legend,\n Filler,\n} from 'chart.js';\nimport { Line } from 'react-chartjs-2';\n\nChartJS.register(\n CategoryScale,\n LinearScale,\n PointElement,\n LineElement,\n Title,\n Tooltip,\n Legend,\n Filler\n);\n\ninterface DailyUserChartProps {\n data: Array<{ date: string; users: number }>;\n title?: string;\n}\n\nexport default function DailyUserChart({ data, title = \"Daily User Activity\" }: DailyUserChartProps) {\n const chartData = {\n labels: data.map(item => item.date),\n datasets: [\n {\n label: 'Daily Users',\n data: data.map(item => item.users),\n borderColor: 'rgb(59, 130, 246)',\n backgroundColor: 'rgba(59, 130, 246, 0.1)',\n borderWidth: 2,\n fill: true,\n tension: 0.4,\n pointBackgroundColor: 'rgb(59, 130, 246)',\n pointBorderColor: '#fff',\n pointBorderWidth: 2,\n pointRadius: 3,\n pointHoverRadius: 5,\n },\n ],\n };\n\n const options = {\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n legend: {\n display: false,\n },\n title: {\n display: false,\n },\n tooltip: {\n backgroundColor: 'rgba(0, 0, 0, 0.8)',\n titleColor: '#fff',\n bodyColor: '#fff',\n borderColor: 'rgba(59, 130, 246, 0.5)',\n borderWidth: 1,\n cornerRadius: 8,\n displayColors: false,\n callbacks: {\n title: (context: any) => `Date: ${context[0].label}`,\n label: (context: any) => `Users: ${context.parsed.y.toLocaleString()}`,\n },\n },\n },\n scales: {\n x: {\n grid: {\n display: false,\n },\n ticks: {\n color: '#6b7280',\n font: {\n size: 11,\n },\n },\n },\n y: {\n grid: {\n color: 'rgba(0, 0, 0, 0.05)',\n },\n ticks: {\n color: '#6b7280',\n font: {\n size: 11,\n },\n callback: (value: any) => value.toLocaleString(),\n },\n },\n },\n elements: {\n point: {\n hoverBackgroundColor: 'rgb(59, 130, 246)',\n },\n },\n };\n\n return (\n <div className=\"bg-white rounded-lg border border-gray-100 p-4 shadow-sm\">\n <h3 className=\"text-base font-semibold text-gray-800 mb-3\">{title}</h3>\n <div className=\"h-48\">\n <Line data={chartData} options={options} />\n </div>\n </div>\n );\n} ","\"use client\";\n\nimport { MapPin, Users } from \"lucide-react\";\n\ninterface GeographicData {\n country: string;\n sessions: number;\n}\n\ninterface GeographicMapProps {\n data: GeographicData[];\n title?: string;\n}\n\nexport default function GeographicMap({ data, title = \"Geographic Distribution\" }: GeographicMapProps) {\n const totalSessions = data.reduce((sum, item) => sum + item.sessions, 0);\n \n return (\n <div className=\"bg-white rounded-lg border border-gray-100 p-4 shadow-sm\">\n <div className=\"flex items-center mb-4\">\n <MapPin className=\"w-4 h-4 text-gray-600 mr-2\" />\n <h3 className=\"text-base font-semibold text-gray-800\">{title}</h3>\n </div>\n \n <div className=\"space-y-3\">\n {data.map((item, index) => {\n const percentage = totalSessions > 0 ? (item.sessions / totalSessions) * 100 : 0;\n \n return (\n <div key={index} className=\"flex items-center justify-between p-3 bg-gray-50 rounded-lg hover:bg-gray-100 transition-colors duration-200\">\n <div className=\"flex items-center flex-1\">\n <div className=\"w-6 h-6 bg-gray-200 rounded-full flex items-center justify-center mr-2\">\n <Users className=\"w-3 h-3 text-gray-600\" />\n </div>\n <div className=\"flex-1\">\n <p className=\"text-xs font-medium text-gray-700\">{item.country}</p>\n <div className=\"flex items-center mt-1\">\n <div className=\"flex-1 bg-gray-200 rounded-full h-1.5 mr-2\">\n <div \n className=\"bg-gray-600 h-1.5 rounded-full transition-all duration-300\"\n style={{ width: `${percentage}%` }}\n ></div>\n </div>\n <span className=\"text-xs text-gray-500\">{percentage.toFixed(1)}%</span>\n </div>\n </div>\n </div>\n <div className=\"text-right\">\n <p className=\"text-xs font-semibold text-gray-900\">{item.sessions.toLocaleString()}</p>\n <p className=\"text-xs text-gray-500\">sessions</p>\n </div>\n </div>\n );\n })}\n </div>\n \n <div className=\"mt-4 pt-3 border-t border-gray-200\">\n <div className=\"flex items-center justify-between text-xs\">\n <span className=\"text-gray-600\">Total Sessions</span>\n <span className=\"font-semibold text-gray-900\">{totalSessions.toLocaleString()}</span>\n </div>\n </div>\n </div>\n );\n} ","interface AnalyticsCardProps {\n title: string;\n value: string | number;\n subtitle: string;\n icon?: React.ReactNode;\n trend?: {\n value: number;\n isPositive: boolean;\n };\n}\n\nexport default function AnalyticsCard({ title, value, subtitle, icon, trend }: AnalyticsCardProps) {\n return (\n <div className=\"bg-white rounded border border-gray-200 p-2.5 shadow-sm\">\n <div className=\"flex items-center justify-between mb-1.5\">\n <p className=\"text-xs font-medium text-gray-600\">{title}</p>\n <div className=\"p-1 bg-gray-200 rounded\">\n {icon}\n </div>\n </div>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center\">\n <p className=\"text-base font-semibold text-gray-900\">{value}</p>\n {trend && (\n <div className={`flex items-center ml-1 ${trend.isPositive ? 'text-green-500' : 'text-red-500'}`}>\n <span className=\"text-xs\">{trend.isPositive ? '↗' : '↘'}</span>\n <span className=\"text-xs ml-0.5\">{trend.value}%</span>\n </div>\n )}\n </div>\n <p className=\"text-xs text-gray-500\">{subtitle}</p>\n </div>\n </div>\n );\n} ","'use client';\n\nimport { usePathname } from 'next/navigation';\nimport { useAnalytics } from '../../hooks/use-analytics';\n\nexport default function AnalyticsExclusion() {\n const pathname = usePathname();\n const { isAdminRoute, shouldTrack } = useAnalytics(pathname);\n\n if (!isAdminRoute) return null;\n\n return (\n <div className=\"fixed bottom-4 right-4 bg-green-100 border border-green-400 text-green-700 px-4 py-2 rounded text-sm z-50\">\n <strong>Analytics Disabled:</strong> Admin pages are excluded from tracking\n </div>\n );\n} ","import { useEffect } from 'react';\n\n/**\n * Call from app with pathname from usePathname() (next/navigation).\n * Disables tracking on admin routes when pathname starts with /admin.\n */\nexport function useAnalytics(pathname: string | null): { isAdminRoute: boolean; shouldTrack: boolean } {\n const isAdminRoute = pathname != null && pathname.startsWith('/admin');\n\n useEffect(() => {\n if (isAdminRoute && typeof window !== 'undefined') {\n if (typeof (window as unknown as { gtag?: () => void }).gtag === 'function') {\n (window as unknown as { gtag: () => void }).gtag = () => {};\n }\n if (Array.isArray((window as unknown as { dataLayer?: unknown[] }).dataLayer)) {\n (window as unknown as { dataLayer: unknown[] }).dataLayer = [];\n }\n }\n }, [isAdminRoute]);\n\n return { isAdminRoute, shouldTrack: !isAdminRoute };\n}\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport { Input } from \"@/components/ui/input\";\nimport { Textarea } from \"@/components/ui/textarea\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { Label } from \"@/components/ui/label\";\nimport type { PropDefinition, ComponentMeta } from \"../../theme/types\";\n\ninterface EntityOption {\n id: number | string;\n [key: string]: any;\n}\n\nfunction EntitySelect({\n prop,\n value,\n onChange,\n}: {\n prop: PropDefinition;\n value: string;\n onChange: (val: string) => void;\n}) {\n const [options, setOptions] = useState<EntityOption[]>([]);\n\n useEffect(() => {\n if (!prop.entity) return;\n fetch(`/api/${prop.entity}`)\n .then((r) => (r.ok ? r.json() : { data: [] }))\n .then((res) => setOptions(res.data || res || []))\n .catch(() => {});\n }, [prop.entity]);\n\n const displayField = prop.displayField || \"name\";\n\n return (\n <select\n className=\"h-7 w-full rounded border border-input bg-background px-2 text-xs\"\n value={value || \"\"}\n onChange={(e) => onChange(e.target.value)}\n >\n <option value=\"\">Select...</option>\n {options.map((opt) => (\n <option key={opt.id} value={opt.slug || opt.id}>\n {opt[displayField] || opt.id}\n </option>\n ))}\n </select>\n );\n}\n\nfunction SelectInput({\n prop,\n value,\n onChange,\n}: {\n prop: PropDefinition;\n value: string;\n onChange: (val: string) => void;\n}) {\n return (\n <select\n className=\"h-7 w-full rounded border border-input bg-background px-2 text-xs\"\n value={value || \"\"}\n onChange={(e) => onChange(e.target.value)}\n >\n <option value=\"\">Select...</option>\n {prop.options?.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n );\n}\n\ninterface PropFieldProps {\n prop: PropDefinition;\n value: any;\n onChange: (val: any) => void;\n}\n\nconst compactInputCls = \"h-7 text-xs rounded border border-input bg-background px-2\";\n\nfunction PropField({ prop, value, onChange }: PropFieldProps) {\n switch (prop.type) {\n case \"text\":\n case \"url\":\n return (\n <Input\n type={prop.type === \"url\" ? \"url\" : \"text\"}\n value={value || \"\"}\n onChange={(e) => onChange(e.target.value)}\n placeholder={prop.label}\n className={compactInputCls}\n />\n );\n\n case \"number\":\n return (\n <Input\n type=\"number\"\n value={value ?? \"\"}\n onChange={(e) => onChange(Number(e.target.value))}\n placeholder={prop.label}\n className={compactInputCls}\n />\n );\n\n case \"textarea\":\n return (\n <Textarea\n value={value || \"\"}\n onChange={(e) => onChange(e.target.value)}\n placeholder={prop.label}\n rows={2}\n className=\"text-xs rounded border border-input px-2 py-1.5 min-h-[52px]\"\n />\n );\n\n case \"boolean\":\n return (\n <Switch\n checked={!!value}\n onCheckedChange={(checked) => onChange(checked)}\n className=\"scale-75 origin-left\"\n />\n );\n\n case \"color\":\n return (\n <div className=\"flex items-center gap-1.5\">\n <input\n type=\"color\"\n value={value || \"#000000\"}\n onChange={(e) => onChange(e.target.value)}\n className=\"h-7 w-9 rounded border border-input cursor-pointer shrink-0\"\n />\n <Input value={value || \"\"} onChange={(e) => onChange(e.target.value)} placeholder=\"#000000\" className={`${compactInputCls} flex-1 min-w-0`} />\n </div>\n );\n\n case \"image\":\n return (\n <div className=\"space-y-1.5\">\n {value && <img src={value} alt=\"\" className=\"h-14 w-14 rounded object-cover border border-input\" />}\n <Input value={value || \"\"} onChange={(e) => onChange(e.target.value)} placeholder=\"URL\" className={compactInputCls} />\n </div>\n );\n\n case \"richtext\":\n return (\n <Textarea\n value={value || \"\"}\n onChange={(e) => onChange(e.target.value)}\n placeholder={prop.label}\n rows={4}\n className=\"text-xs rounded border border-input px-2 py-1.5 min-h-[80px]\"\n />\n );\n\n case \"select\":\n return <SelectInput prop={prop} value={value} onChange={onChange} />;\n\n case \"entity\":\n return <EntitySelect prop={prop} value={value} onChange={onChange} />;\n\n default:\n return (\n <Input value={value || \"\"} onChange={(e) => onChange(e.target.value)} placeholder={prop.label} className={compactInputCls} />\n );\n }\n}\n\ninterface ComponentSettingsProps {\n meta: ComponentMeta;\n values: Record<string, any>;\n onChange: (name: string, value: any) => void;\n}\n\nexport default function ComponentSettings({\n meta,\n values,\n onChange,\n}: ComponentSettingsProps) {\n if (!meta.props || meta.props.length === 0) {\n return <p className=\"text-[11px] text-gray-500 py-2\">No configurable properties.</p>;\n }\n\n return (\n <div className=\"space-y-3\">\n {meta.props.map((prop) => (\n <div key={prop.name} className=\"flex flex-col gap-1\">\n <Label className=\"text-[11px] font-medium text-gray-500\">\n {prop.label}\n {prop.required && <span className=\"text-red-500 ml-0.5\">*</span>}\n </Label>\n <PropField prop={prop} value={values[prop.name]} onChange={(val) => onChange(prop.name, val)} />\n </div>\n ))}\n </div>\n );\n}\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport { Input } from \"@/components/ui/input\";\nimport { Button } from \"@/components/ui/button\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { Label } from \"@/components/ui/label\";\nimport { Plus, Trash2, GripVertical, ChevronDown, ChevronRight, ArrowRight, ArrowLeft } from \"lucide-react\";\nimport type { NavItem, NavbarConfig } from \"../../theme/types\";\n\nfunction generateId() {\n return `nav_${Date.now()}_${Math.random().toString(36).slice(2, 7)}`;\n}\n\ninterface NavItemEditorProps {\n item: NavItem;\n depth: number;\n onUpdate: (id: string, updates: Partial<NavItem>) => void;\n onRemove: (id: string) => void;\n onIndent: (id: string) => void;\n onOutdent: (id: string) => void;\n onMoveUp: (id: string) => void;\n onMoveDown: (id: string) => void;\n canIndent: boolean;\n canOutdent: boolean;\n canMoveUp: boolean;\n canMoveDown: boolean;\n}\n\nfunction NavItemEditor({\n item,\n depth,\n onUpdate,\n onRemove,\n onIndent,\n onOutdent,\n onMoveUp,\n onMoveDown,\n canIndent,\n canOutdent,\n canMoveUp,\n canMoveDown,\n}: NavItemEditorProps) {\n const [expanded, setExpanded] = useState(false);\n const [pages, setPages] = useState<{ id: number; title: string; slug: string }[]>([]);\n\n useEffect(() => {\n if (!expanded) return;\n fetch(\"/api/pages\")\n .then((r) => (r.ok ? r.json() : []))\n .then((data: unknown) => {\n const res = data as { data?: unknown[] } | unknown[];\n const list = Array.isArray(res) ? res : (res && typeof res === 'object' && 'data' in res ? (res as { data: unknown[] }).data : []) ?? [];\n setPages((list as { id: number; title?: string; slug?: string }[]).map((p) => ({ id: p.id, title: p.title || \"\", slug: p.slug || \"\" })));\n })\n .catch(() => {});\n }, [expanded]);\n\n const handleLinkPage = (pageId: string) => {\n if (!pageId) {\n onUpdate(item.id, { pageId: undefined, url: item.url || \"\" });\n return;\n }\n const id = Number(pageId);\n const p = pages.find((x) => x.id === id);\n if (p) onUpdate(item.id, { pageId: id, url: `/${p.slug}`, label: item.label || p.title });\n };\n\n return (\n <div>\n <div\n className=\"flex items-center gap-2 p-2 bg-white border rounded-md hover:bg-gray-50\"\n style={{ marginLeft: depth * 24 }}\n >\n <GripVertical className=\"h-4 w-4 text-gray-400 flex-shrink-0 cursor-grab\" />\n <button\n onClick={() => setExpanded(!expanded)}\n className=\"flex-shrink-0 p-0.5\"\n >\n {expanded ? (\n <ChevronDown className=\"h-3.5 w-3.5 text-gray-500\" />\n ) : (\n <ChevronRight className=\"h-3.5 w-3.5 text-gray-500\" />\n )}\n </button>\n <span className=\"text-sm font-medium flex-1 truncate\">{item.label || \"Untitled\"}</span>\n <span className=\"text-xs text-gray-400 truncate max-w-[120px]\">{item.url}</span>\n <div className=\"flex items-center gap-0.5\">\n <Button variant=\"ghost\" size=\"sm\" className=\"h-6 w-6 p-0\" onClick={() => onMoveUp(item.id)} disabled={!canMoveUp}>↑</Button>\n <Button variant=\"ghost\" size=\"sm\" className=\"h-6 w-6 p-0\" onClick={() => onMoveDown(item.id)} disabled={!canMoveDown}>↓</Button>\n <Button variant=\"ghost\" size=\"sm\" className=\"h-6 w-6 p-0\" onClick={() => onOutdent(item.id)} disabled={!canOutdent} title=\"Move left\">\n <ArrowLeft className=\"h-3 w-3\" />\n </Button>\n <Button variant=\"ghost\" size=\"sm\" className=\"h-6 w-6 p-0\" onClick={() => onIndent(item.id)} disabled={!canIndent} title=\"Nest under above item\">\n <ArrowRight className=\"h-3 w-3\" />\n </Button>\n <Button variant=\"ghost\" size=\"sm\" className=\"h-6 w-6 p-0 text-red-500 hover:text-red-700\" onClick={() => onRemove(item.id)}>\n <Trash2 className=\"h-3.5 w-3.5\" />\n </Button>\n </div>\n </div>\n {expanded && (\n <div className=\"border border-t-0 rounded-b-md p-3 bg-gray-50 space-y-3\" style={{ marginLeft: depth * 24 }}>\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs\">Label</Label>\n <Input\n value={item.label}\n onChange={(e) => onUpdate(item.id, { label: e.target.value })}\n placeholder=\"Menu item label\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs\">Link to page</Label>\n <select\n value={item.pageId ?? \"\"}\n onChange={(e) => handleLinkPage(e.target.value)}\n className=\"h-9 w-full rounded border border-input bg-background px-2 text-sm\"\n >\n <option value=\"\">— Custom / external —</option>\n {pages.map((p) => (\n <option key={p.id} value={p.id}>{p.title} (/{p.slug})</option>\n ))}\n </select>\n </div>\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs\">URL</Label>\n <Input\n value={item.url}\n onChange={(e) => onUpdate(item.id, { url: e.target.value })}\n placeholder=\"/page-slug or https://...\"\n />\n </div>\n <div className=\"flex items-center gap-2\">\n <Switch\n checked={item.openInNewTab || false}\n onCheckedChange={(checked) => onUpdate(item.id, { openInNewTab: checked })}\n />\n <Label className=\"text-xs\">Open in new tab</Label>\n </div>\n </div>\n )}\n {item.children?.map((child, ci) => (\n <NavItemEditor\n key={child.id}\n item={child}\n depth={depth + 1}\n onUpdate={onUpdate}\n onRemove={onRemove}\n onIndent={onIndent}\n onOutdent={onOutdent}\n onMoveUp={onMoveUp}\n onMoveDown={onMoveDown}\n canIndent={ci > 0}\n canOutdent={true}\n canMoveUp={ci > 0}\n canMoveDown={ci < (item.children?.length || 0) - 1}\n />\n ))}\n </div>\n );\n}\n\nfunction flattenWithDepth(\n items: NavItem[],\n depth = 0\n): { item: NavItem; depth: number; parentId: string | null; index: number }[] {\n const result: { item: NavItem; depth: number; parentId: string | null; index: number }[] = [];\n items.forEach((item, index) => {\n result.push({ item, depth, parentId: null, index });\n if (item.children) {\n item.children.forEach((child, ci) => {\n result.push({ item: child, depth: depth + 1, parentId: item.id, index: ci });\n if (child.children) {\n child.children.forEach((gc, gci) => {\n result.push({ item: gc, depth: depth + 2, parentId: child.id, index: gci });\n });\n }\n });\n }\n });\n return result;\n}\n\nfunction updateItemInTree(items: NavItem[], id: string, updates: Partial<NavItem>): NavItem[] {\n return items.map((item) => {\n if (item.id === id) return { ...item, ...updates };\n if (item.children) {\n return { ...item, children: updateItemInTree(item.children, id, updates) };\n }\n return item;\n });\n}\n\nfunction removeItemFromTree(items: NavItem[], id: string): NavItem[] {\n return items\n .filter((item) => item.id !== id)\n .map((item) => {\n if (item.children) {\n return { ...item, children: removeItemFromTree(item.children, id) };\n }\n return item;\n });\n}\n\nfunction moveItem(items: NavItem[], id: string, direction: \"up\" | \"down\"): NavItem[] {\n const index = items.findIndex((i) => i.id === id);\n if (index === -1) {\n return items.map((item) => {\n if (item.children) {\n return { ...item, children: moveItem(item.children, id, direction) };\n }\n return item;\n });\n }\n const newIndex = direction === \"up\" ? index - 1 : index + 1;\n if (newIndex < 0 || newIndex >= items.length) return items;\n const result = [...items];\n [result[index], result[newIndex]] = [result[newIndex], result[index]];\n return result;\n}\n\nfunction findItemAndParent(\n items: NavItem[],\n id: string,\n parent: NavItem[] | null = null,\n parentItem: NavItem | null = null\n): { item: NavItem; siblings: NavItem[]; parentItem: NavItem | null; index: number } | null {\n for (let i = 0; i < items.length; i++) {\n if (items[i].id === id) {\n return { item: items[i], siblings: items, parentItem, index: i };\n }\n if (items[i].children) {\n const found = findItemAndParent(items[i].children!, id, items, items[i]);\n if (found) return found;\n }\n }\n return null;\n}\n\ninterface NavbarEditorProps {\n config: NavbarConfig;\n onChange: (config: NavbarConfig) => void;\n}\n\nexport default function NavbarEditor({ config, onChange }: NavbarEditorProps) {\n const items = config.items || [];\n\n const setItems = (newItems: NavItem[]) => {\n onChange({ ...config, items: newItems });\n };\n\n const addItem = () => {\n setItems([\n ...items,\n { id: generateId(), label: \"New Item\", url: \"/\", children: [] },\n ]);\n };\n\n const handleUpdate = (id: string, updates: Partial<NavItem>) => {\n setItems(updateItemInTree(items, id, updates));\n };\n\n const handleRemove = (id: string) => {\n setItems(removeItemFromTree(items, id));\n };\n\n const handleMoveUp = (id: string) => setItems(moveItem(items, id, \"up\"));\n const handleMoveDown = (id: string) => setItems(moveItem(items, id, \"down\"));\n\n const handleIndent = (id: string) => {\n const found = findItemAndParent(items, id);\n if (!found || found.index === 0) return;\n const prevSibling = found.siblings[found.index - 1];\n const item = found.item;\n const newSiblings = found.siblings.filter((_, i) => i !== found.index);\n const updatedPrev = {\n ...prevSibling,\n children: [...(prevSibling.children || []), item],\n };\n const result = newSiblings.map((s) =>\n s.id === prevSibling.id ? updatedPrev : s\n );\n if (found.parentItem) {\n setItems(updateItemInTree(items, found.parentItem.id, { children: result }));\n } else {\n setItems(result);\n }\n };\n\n const handleOutdent = (id: string) => {\n const found = findItemAndParent(items, id);\n if (!found || !found.parentItem) return;\n const parentFound = findItemAndParent(items, found.parentItem.id);\n if (!parentFound) return;\n\n const item = found.item;\n const newParentChildren = found.parentItem.children!.filter((c) => c.id !== id);\n const updatedParent = { ...found.parentItem, children: newParentChildren };\n\n const parentIndex = parentFound.index;\n const newSiblings = [...parentFound.siblings];\n newSiblings[parentIndex] = updatedParent;\n newSiblings.splice(parentIndex + 1, 0, item);\n\n if (parentFound.parentItem) {\n setItems(updateItemInTree(items, parentFound.parentItem.id, { children: newSiblings }));\n } else {\n setItems(newSiblings);\n }\n };\n\n return (\n <div className=\"space-y-6\">\n <div className=\"space-y-3\">\n <Label className=\"text-sm font-medium\">Logo</Label>\n <div className=\"flex items-center gap-3\">\n {config.logo && (\n <img src={config.logo} alt=\"Logo\" className=\"h-10 rounded border object-contain\" />\n )}\n <Input\n value={config.logo || \"\"}\n onChange={(e) => onChange({ ...config, logo: e.target.value })}\n placeholder=\"Logo image URL\"\n />\n </div>\n </div>\n\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <Label className=\"text-sm font-medium\">Menu Items</Label>\n <Button variant=\"outline\" size=\"sm\" onClick={addItem}>\n <Plus className=\"h-3.5 w-3.5 mr-1\" /> Add Item\n </Button>\n </div>\n {items.length === 0 ? (\n <p className=\"text-sm text-gray-400 text-center py-4\">No menu items yet.</p>\n ) : (\n <div className=\"space-y-1\">\n {items.map((item, index) => (\n <NavItemEditor\n key={item.id}\n item={item}\n depth={0}\n onUpdate={handleUpdate}\n onRemove={handleRemove}\n onIndent={handleIndent}\n onOutdent={handleOutdent}\n onMoveUp={handleMoveUp}\n onMoveDown={handleMoveDown}\n canIndent={index > 0}\n canOutdent={false}\n canMoveUp={index > 0}\n canMoveDown={index < items.length - 1}\n />\n ))}\n </div>\n )}\n </div>\n\n </div>\n );\n}\n","\"use client\";\n\nimport Link from \"next/link\";\nimport { useState, useEffect } from \"react\";\nimport { signIn, getSession } from \"next-auth/react\";\nimport { useRouter } from \"next/navigation\";\n\nconst SigninPage = () => {\n const [email, setEmail] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const [error, setError] = useState(\"\");\n const [loading, setLoading] = useState(false);\n const router = useRouter();\n\n useEffect(() => {\n // Check if user is already signed in\n getSession().then((session) => {\n if (session) {\n router.push(\"/admin/dashboard\");\n }\n });\n }, [router]);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setLoading(true);\n setError(\"\");\n\n try {\n const result = await signIn(\"credentials\", {\n email,\n password,\n redirect: false,\n });\n\n if (result?.error) {\n setError(\"Invalid email or password\");\n } else {\n router.push(\"/admin/dashboard\");\n }\n } catch (error) {\n setError(\"An error occurred. Please try again.\");\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <>\n <section className=\"relative z-10 overflow-hidden pb-16 pt-16 md:pb-20 lg:pb-28 lg:pt-[100px]\">\n <div className=\"container\">\n <div className=\"-mx-4 flex flex-wrap\">\n <div className=\"w-full px-4\">\n <div className=\"shadow-three mx-auto max-w-[500px] rounded bg-white px-6 py-10 dark:bg-dark sm:p-[60px]\">\n <h3 className=\"mb-3 text-center text-2xl font-bold text-black dark:text-white sm:text-3xl\">\n Sign in to your account\n </h3>\n <p className=\"mb-11 text-center text-base font-medium text-body-color\">\n Login to your account to manage website\n </p>\n \n {error && (\n <div className=\"mb-6 rounded-md bg-red-50 p-4 text-red-600 dark:bg-red-900/20 dark:text-red-400\">\n {error}\n </div>\n )}\n\n <form onSubmit={handleSubmit}>\n <div className=\"mb-8\">\n <label\n htmlFor=\"email\"\n className=\"mb-3 block text-sm text-dark dark:text-white\"\n >\n Your Email\n </label>\n <input\n type=\"email\"\n name=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"Enter your Email\"\n required\n className=\"border border-gray-300 w-full rounded border-gray-200 bg-gray-50 px-3 py-2 text-sm text-gray-900 outline-none focus:border-gray-500 focus:ring-1 focus:ring-gray-500\"\n />\n </div>\n <div className=\"mb-8\">\n <label\n htmlFor=\"password\"\n className=\"mb-3 block text-sm text-dark dark:text-white\"\n >\n Your Password\n </label>\n <input\n type=\"password\"\n name=\"password\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"Enter your Password\"\n required\n className=\"border border-gray-300 w-full rounded border-gray-200 bg-gray-50 px-3 py-2 text-sm text-gray-900 outline-none focus:border-gray-500 focus:ring-1 focus:ring-gray-500\"\n />\n </div>\n <div className=\"mb-8 flex flex-col justify-between sm:flex-row sm:items-center\">\n <div className=\"mb-4 sm:mb-0\">\n <label\n htmlFor=\"checkboxLabel\"\n className=\"flex cursor-pointer select-none items-center text-sm font-medium text-body-color\"\n >\n <div className=\"relative\">\n <input\n type=\"checkbox\"\n id=\"checkboxLabel\"\n className=\"sr-only\"\n />\n <div className=\"box mr-4 flex h-5 w-5 items-center justify-center rounded border border-body-color border-opacity-20 dark:border-white dark:border-opacity-10\">\n <span className=\"opacity-0\">\n <svg\n width=\"11\"\n height=\"8\"\n viewBox=\"0 0 11 8\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M10.0915 0.951972L10.0867 0.946075L10.0813 0.940568C9.90076 0.753564 9.61034 0.753146 9.42927 0.939309L4.16201 6.22962L1.58507 3.63469C1.40401 3.44841 1.11351 3.44879 0.932892 3.63584C0.755703 3.81933 0.755703 4.10875 0.932892 4.29224L0.932878 4.29225L0.934851 4.29424L3.58046 6.95832C3.73676 7.11955 3.94983 7.2 4.1473 7.2C4.36196 7.2 4.55963 7.11773 4.71406 6.9584L10.0468 1.60234C10.2436 1.4199 10.2421 1.1339 10.0915 0.951972ZM4.2327 6.30081L4.2317 6.2998C4.23206 6.30015 4.23237 6.30049 4.23269 6.30082L4.2327 6.30081Z\"\n fill=\"#3056D3\"\n stroke=\"#3056D3\"\n strokeWidth=\"0.4\"\n />\n </svg>\n </span>\n </div>\n </div>\n Keep me signed in\n </label>\n </div>\n <div>\n <Link\n href=\"/admin/forgot-password\"\n className=\"text-xs font-medium text-gray-700 hover:underline\"\n >\n Forgot Password?\n </Link>\n </div>\n </div>\n <div className=\"mb-6\">\n <button \n type=\"submit\"\n disabled={loading}\n className=\"flex w-full items-center justify-center rounded bg-gray-900 px-4 py-2.5 text-sm font-medium text-white hover:bg-gray-800 disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n {loading ? \"Signing in...\" : \"Sign in\"}\n </button>\n </div>\n </form>\n </div>\n </div>\n </div>\n </div>\n <div className=\"absolute left-0 top-0 z-[-1]\">\n <svg\n width=\"1440\"\n height=\"969\"\n viewBox=\"0 0 1440 969\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <mask\n id=\"mask0_95:1005\"\n style={{ maskType: \"alpha\" }}\n maskUnits=\"userSpaceOnUse\"\n x=\"0\"\n y=\"0\"\n width=\"1440\"\n height=\"969\"\n >\n <rect width=\"1440\" height=\"969\" fill=\"#090E34\" />\n </mask>\n <g mask=\"url(#mask0_95:1005)\">\n <path\n opacity=\"0.1\"\n d=\"M1086.96 297.978L632.959 554.978L935.625 535.926L1086.96 297.978Z\"\n fill=\"url(#paint0_linear_95:1005)\"\n />\n <path\n opacity=\"0.1\"\n d=\"M1324.5 755.5L1450 687V886.5L1324.5 967.5L-10 288L1324.5 755.5Z\"\n fill=\"url(#paint1_linear_95:1005)\"\n />\n </g>\n <defs>\n <linearGradient\n id=\"paint0_linear_95:1005\"\n x1=\"1178.4\"\n y1=\"151.853\"\n x2=\"780.959\"\n y2=\"453.581\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#4A6CF7\" />\n <stop offset=\"1\" stopColor=\"#4A6CF7\" stopOpacity=\"0\" />\n </linearGradient>\n <linearGradient\n id=\"paint1_linear_95:1005\"\n x1=\"160.5\"\n y1=\"220\"\n x2=\"1099.45\"\n y2=\"1192.04\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#4A6CF7\" />\n <stop offset=\"1\" stopColor=\"#4A6CF7\" stopOpacity=\"0\" />\n </linearGradient>\n </defs>\n </svg>\n </div>\n </section>\n </>\n );\n};\n\nexport default SigninPage;\n","\"use client\";\n\nimport { useState } from \"react\";\nimport Link from \"next/link\";\nimport { Input } from \"../../components/ui/input\";\nimport { Button } from \"../../components/ui/button\";\nimport { Label } from \"../../components/ui/label\";\n\nexport default function ForgotPasswordPage() {\n const [email, setEmail] = useState(\"\");\n const [loading, setLoading] = useState(false);\n const [message, setMessage] = useState(\"\");\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n if (!email.trim()) return;\n setLoading(true);\n setMessage(\"\");\n try {\n const res = await fetch(\"/api/users/forgot-password\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ email: email.trim() }),\n });\n const data = await res.json();\n if (res.ok) {\n setMessage(data.message || \"If an account exists with this email, you will receive a reset link shortly.\");\n } else {\n setMessage(data.error || \"Something went wrong.\");\n }\n } catch {\n setMessage(\"Something went wrong. Please try again.\");\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <div className=\"min-h-screen flex items-center justify-center bg-gray-50 dark:bg-dark px-4\">\n <div className=\"max-w-md w-full space-y-6 p-8 bg-white dark:bg-[#2C303B] rounded-lg shadow-md\">\n <div className=\"text-center\">\n <h2 className=\"text-2xl font-bold text-gray-900 dark:text-white\">Forgot password</h2>\n <p className=\"mt-2 text-sm text-body-color\">\n Enter your email and we&apos;ll send you a link to reset your password.\n </p>\n </div>\n\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n <div>\n <Label htmlFor=\"email\">Email</Label>\n <Input\n id=\"email\"\n type=\"email\"\n required\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"you@example.com\"\n className=\"mt-1\"\n />\n </div>\n\n {message && (\n <div\n className={`p-3 rounded-md text-sm ${\n message.includes(\"receive\") ? \"bg-green-50 dark:bg-green-900/20 text-green-700 dark:text-green-400\" : \"bg-red-50 dark:bg-red-900/20 text-red-700 dark:text-red-400\"\n }`}\n >\n {message}\n </div>\n )}\n\n <Button type=\"submit\" disabled={loading} className=\"w-full\">\n {loading ? \"Sending...\" : \"Send reset link\"}\n </Button>\n </form>\n\n <p className=\"text-center text-sm text-body-color\">\n <Link href=\"/admin/signin\" className=\"text-sm text-gray-700 hover:underline\">\n Back to sign in\n </Link>\n </p>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { useState, useEffect, Suspense } from \"react\";\nimport { useSearchParams } from \"next/navigation\";\nimport Link from \"next/link\";\nimport { Input } from \"../../components/ui/input\";\nimport { Button } from \"../../components/ui/button\";\nimport { Label } from \"../../components/ui/label\";\n\nfunction ResetPasswordPageContent() {\n const searchParams = useSearchParams();\n const token = searchParams.get(\"token\");\n const [formData, setFormData] = useState({ password: \"\", confirmPassword: \"\" });\n const [loading, setLoading] = useState(false);\n const [message, setMessage] = useState(\"\");\n\n useEffect(() => {\n if (!token) setMessage(\"Invalid reset link. Token is missing.\");\n }, [token]);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n if (formData.password !== formData.confirmPassword) {\n setMessage(\"Passwords do not match\");\n return;\n }\n if (formData.password.length < 6) {\n setMessage(\"Password must be at least 6 characters\");\n return;\n }\n setLoading(true);\n setMessage(\"\");\n try {\n const res = await fetch(\"/api/users/set-password\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ token, newPassword: formData.password }),\n });\n const data = await res.json();\n if (res.ok) {\n setMessage(data.message || \"Password updated. You can now sign in.\");\n setFormData({ password: \"\", confirmPassword: \"\" });\n } else {\n setMessage(data.error || \"Failed to reset password\");\n }\n } catch {\n setMessage(\"Something went wrong. Please try again.\");\n } finally {\n setLoading(false);\n }\n };\n\n if (!token) {\n return (\n <div className=\"min-h-screen flex items-center justify-center bg-gray-50 dark:bg-dark px-4\">\n <div className=\"max-w-md w-full space-y-8 p-8 bg-white dark:bg-[#2C303B] rounded-lg shadow-md text-center\">\n <h2 className=\"text-2xl font-bold text-gray-900 dark:text-white\">Invalid reset link</h2>\n <p className=\"text-body-color\">{message}</p>\n <Link href=\"/admin/forgot-password\" className=\"text-sm text-gray-700 hover:underline\">\n Request a new link\n </Link>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"min-h-screen flex items-center justify-center bg-gray-50 dark:bg-dark px-4\">\n <div className=\"max-w-md w-full space-y-6 p-8 bg-white dark:bg-[#2C303B] rounded-lg shadow-md\">\n <div className=\"text-center\">\n <h2 className=\"text-2xl font-bold text-gray-900 dark:text-white\">Set new password</h2>\n <p className=\"mt-2 text-sm text-body-color\">Enter your new password below.</p>\n </div>\n\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n <div>\n <Label htmlFor=\"password\">New password</Label>\n <Input\n id=\"password\"\n type=\"password\"\n required\n minLength={6}\n value={formData.password}\n onChange={(e) => setFormData({ ...formData, password: e.target.value })}\n className=\"mt-1\"\n />\n </div>\n <div>\n <Label htmlFor=\"confirmPassword\">Confirm password</Label>\n <Input\n id=\"confirmPassword\"\n type=\"password\"\n required\n minLength={6}\n value={formData.confirmPassword}\n onChange={(e) => setFormData({ ...formData, confirmPassword: e.target.value })}\n className=\"mt-1\"\n />\n </div>\n\n {message && (\n <div\n className={`p-3 rounded-md text-sm ${\n message.includes(\"successfully\") || message.includes(\"now sign in\")\n ? \"bg-green-50 dark:bg-green-900/20 text-green-700 dark:text-green-400\"\n : \"bg-red-50 dark:bg-red-900/20 text-red-700 dark:text-red-400\"\n }`}\n >\n {message}\n </div>\n )}\n\n <Button type=\"submit\" disabled={loading} className=\"w-full\">\n {loading ? \"Updating...\" : \"Update password\"}\n </Button>\n </form>\n\n <p className=\"text-center text-sm text-body-color\">\n <Link href=\"/admin/signin\" className=\"text-sm text-gray-700 hover:underline\">\n Back to sign in\n </Link>\n </p>\n </div>\n </div>\n );\n}\n\nexport default function ResetPasswordPage() {\n return (\n <Suspense fallback={\n <div className=\"min-h-screen flex items-center justify-center bg-gray-50 dark:bg-dark\">\n <div className=\"max-w-md w-full p-8 text-center\">\n <div className=\"animate-spin rounded-full h-6 w-6 border-2 border-gray-300 border-t-gray-600 mx-auto\"></div>\n <p className=\"mt-4 text-body-color\">Loading...</p>\n </div>\n </div>\n }>\n <ResetPasswordPageContent />\n </Suspense>\n );\n}\n","\"use client\";\n\nimport React, { useState, useEffect, Suspense } from \"react\";\nimport { useSearchParams } from \"next/navigation\";\nimport { Input } from \"../../components/ui/input\";\nimport { Button } from \"../../components/ui/button\";\nimport { Label } from \"../../components/ui/label\";\n\nfunction InvitePageContent() {\n const searchParams = useSearchParams();\n const token = searchParams.get(\"token\");\n const [formData, setFormData] = useState({\n password: \"\",\n confirmPassword: \"\"\n });\n const [loading, setLoading] = useState(false);\n const [message, setMessage] = useState(\"\");\n\n useEffect(() => {\n if (!token) {\n setMessage(\"Invalid invite link. Token is missing.\");\n }\n }, [token]);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n \n if (formData.password !== formData.confirmPassword) {\n setMessage(\"Passwords do not match\");\n return;\n }\n\n if (formData.password.length < 6) {\n setMessage(\"Password must be at least 6 characters long\");\n return;\n }\n\n setLoading(true);\n setMessage(\"\");\n\n try {\n const res = await fetch(\"/api/users/invite\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n token,\n password: formData.password\n }),\n });\n\n const result = await res.json();\n\n if (res.ok) {\n setMessage(\"Account activated successfully! You can now log in.\");\n setFormData({ password: \"\", confirmPassword: \"\" });\n } else {\n setMessage(result.error || \"Failed to activate account\");\n }\n } catch (error) {\n setMessage(\"An error occurred. Please try again.\");\n } finally {\n setLoading(false);\n }\n };\n\n if (!token) {\n return (\n <div className=\"min-h-screen flex items-center justify-center bg-gray-50\">\n <div className=\"max-w-md w-full space-y-8 p-8 bg-white rounded-lg shadow-md\">\n <div className=\"text-center\">\n <h2 className=\"text-2xl font-bold text-gray-900\">Invalid Invite</h2>\n <p className=\"mt-2 text-gray-600\">{message}</p>\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"min-h-screen flex items-center justify-center bg-gray-50\">\n <div className=\"max-w-md w-full space-y-8 p-8 bg-white rounded-lg shadow-md\">\n <div className=\"text-center\">\n <h2 className=\"text-2xl font-bold text-gray-900\">Set Your Password</h2>\n <p className=\"mt-2 text-gray-600\">Please set a password to activate your account</p>\n </div>\n\n <form onSubmit={handleSubmit} className=\"space-y-6\">\n <div>\n <Label htmlFor=\"password\">Password</Label>\n <Input\n id=\"password\"\n type=\"password\"\n required\n value={formData.password}\n onChange={(e) => setFormData({ ...formData, password: e.target.value })}\n className=\"mt-1\"\n />\n </div>\n\n <div>\n <Label htmlFor=\"confirmPassword\">Confirm Password</Label>\n <Input\n id=\"confirmPassword\"\n type=\"password\"\n required\n value={formData.confirmPassword}\n onChange={(e) => setFormData({ ...formData, confirmPassword: e.target.value })}\n className=\"mt-1\"\n />\n </div>\n\n {message && (\n <div className={`p-3 rounded-md text-sm ${\n message.includes(\"successfully\") \n ? \"bg-green-50 text-green-700\" \n : \"bg-red-50 text-red-700\"\n }`}>\n {message}\n </div>\n )}\n\n <Button\n type=\"submit\"\n disabled={loading}\n className=\"w-full\"\n >\n {loading ? \"Activating...\" : \"Activate Account\"}\n </Button>\n </form>\n </div>\n </div>\n );\n}\n\nexport default function InvitePage() {\n return (\n <Suspense fallback={\n <div className=\"min-h-screen flex items-center justify-center bg-gray-50\">\n <div className=\"max-w-md w-full p-8 text-center\">\n <div className=\"animate-spin rounded-full h-6 w-6 border-2 border-gray-300 border-t-gray-600 mx-auto\"></div>\n <p className=\"mt-4 text-gray-600\">Loading...</p>\n </div>\n </div>\n }>\n <InvitePageContent />\n </Suspense>\n );\n} ","\"use client\";\n\nimport { useSession } from \"next-auth/react\";\nimport { useEffect, useState } from \"react\";\nimport AnalyticsCard from \"../../components/Admin/AnalyticsCard\";\nimport DailyUserChart from \"../../components/Admin/DailyUserChart\";\nimport GeographicMap from \"../../components/Admin/GeographicMap\";\nimport { Users, Eye, MousePointer, Globe, FileText, ClipboardList, UserCheck, TrendingUp, MapPin, BarChart3, Activity } from \"lucide-react\";\n\ninterface AnalyticsData {\n visitors: number;\n pageViews: number;\n bounceRate: number;\n avgSessionDuration: number;\n topPages: Array<{ page: string; views: number }>;\n trafficSources: Array<{ source: string; sessions: number }>;\n geographicData: Array<{ country: string; sessions: number }>;\n dailyUsers: Array<{ date: string; users: number }>;\n}\n\ninterface DashboardStats {\n contacts: {\n total: number;\n recent: number;\n };\n forms: {\n total: number;\n submissions: number;\n recentSubmissions: number;\n };\n users: number;\n blogs: number;\n}\n\ninterface LoadingState {\n analytics: boolean;\n stats: boolean;\n}\n\nexport default function DashboardPage() {\n const { data: session } = useSession();\n const [analyticsData, setAnalyticsData] = useState<AnalyticsData | null>(null);\n const [dashboardStats, setDashboardStats] = useState<DashboardStats | null>(null);\n const [loading, setLoading] = useState<LoadingState>({ analytics: true, stats: true });\n const [analyticsEnabled, setAnalyticsEnabled] = useState(false);\n\n useEffect(() => {\n const fetchData = async () => {\n // Fork: Start both API calls simultaneously\n const analyticsPromise = fetch('/api/analytics?days=30');\n const statsPromise = fetch('/api/dashboard/stats');\n\n try {\n // Join: Wait for both promises to resolve\n const [analyticsResponse, statsResponse] = await Promise.all([analyticsPromise, statsPromise]);\n\n // Handle analytics response\n if (analyticsResponse.ok) {\n const data = await analyticsResponse.json();\n setAnalyticsData(data);\n setAnalyticsEnabled(true);\n } else if (analyticsResponse.status === 404) {\n setAnalyticsEnabled(false);\n } else if (analyticsResponse.status === 401) {\n setAnalyticsEnabled(false);\n } else if (analyticsResponse.status === 403) {\n setAnalyticsEnabled(false);\n } else {\n setAnalyticsEnabled(false);\n }\n\n // Handle stats response\n if (statsResponse.ok) {\n const stats = await statsResponse.json();\n setDashboardStats(stats);\n }\n\n } catch (error) {\n setAnalyticsEnabled(false);\n } finally {\n // Set both loading states to false\n setLoading({ analytics: false, stats: false });\n }\n };\n\n fetchData();\n }, []);\n\n const isLoading = loading.analytics || loading.stats;\n\n return (\n <div className=\"rounded-lg bg-white shadow-md\">\n {/* Header with loader color gradient background */}\n <div className=\"bg-gray-800 border-b border-gray-700 px-4 py-2.5 rounded-t-lg\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-base font-semibold text-white\">Dashboard</h1>\n <p className=\"text-xs text-gray-300 mt-0.5\">Welcome back, {session?.user?.email}</p>\n </div>\n <div className=\"flex items-center space-x-3\">\n <div className=\"text-right text-gray-200\">\n <p className=\"text-xs text-gray-400\">Last updated</p>\n <p className=\"text-sm font-medium\">{new Date().toLocaleDateString()}</p>\n </div>\n </div>\n </div>\n </div>\n <div className=\"p-4 bg-gray-50\">\n <div className=\"mb-4\">\n <div className=\"flex items-center mb-2\">\n <BarChart3 className=\"w-4 h-4 text-gray-600 mr-2\" />\n <h2 className=\"text-sm font-semibold text-gray-800\">Overview</h2>\n </div>\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-3\">\n <div className=\"bg-white rounded border border-gray-200 p-2.5 shadow-sm\">\n <div className=\"flex items-center justify-between mb-1.5\">\n <p className=\"text-xs font-medium text-gray-600\">Total Contacts</p>\n <div className=\"p-1 bg-gray-200 rounded\">\n <Users className=\"w-3.5 h-3.5 text-gray-600\" />\n </div>\n </div>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center\">\n <p className=\"text-xl font-bold text-gray-900\">{dashboardStats?.contacts.total || 0}</p>\n <TrendingUp className=\"w-3 h-3 text-green-500 ml-1\" />\n </div>\n <p className=\"text-xs text-green-600\">+{dashboardStats?.contacts.recent || 0}</p>\n </div>\n </div>\n \n <div className=\"bg-white rounded border border-gray-200 p-2.5 shadow-sm\">\n <div className=\"flex items-center justify-between mb-1.5\">\n <p className=\"text-xs font-medium text-gray-600\">Form Submissions</p>\n <div className=\"p-1 bg-gray-200 rounded\">\n <FileText className=\"w-3.5 h-3.5 text-gray-600\" />\n </div>\n </div>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center\">\n <p className=\"text-xl font-bold text-gray-900\">{dashboardStats?.forms.submissions || 0}</p>\n <TrendingUp className=\"w-3 h-3 text-green-500 ml-1\" />\n </div>\n <p className=\"text-xs text-green-600\">+{dashboardStats?.forms.recentSubmissions || 0}</p>\n </div>\n </div>\n \n <div className=\"bg-white rounded border border-gray-200 p-2.5 shadow-sm\">\n <div className=\"flex items-center justify-between mb-1.5\">\n <p className=\"text-xs font-medium text-gray-600\">Active Forms</p>\n <div className=\"p-1 bg-gray-200 rounded\">\n <ClipboardList className=\"w-3.5 h-3.5 text-gray-600\" />\n </div>\n </div>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center\">\n <p className=\"text-xl font-bold text-gray-900\">{dashboardStats?.forms.total || 0}</p>\n </div>\n <p className=\"text-xs text-gray-500\">Total</p>\n </div>\n </div>\n \n <div className=\"bg-white rounded border border-gray-200 p-2.5 shadow-sm\">\n <div className=\"flex items-center justify-between mb-1.5\">\n <p className=\"text-xs font-medium text-gray-600\">Registered Users</p>\n <div className=\"p-1 bg-gray-200 rounded\">\n <UserCheck className=\"w-3.5 h-3.5 text-gray-600\" />\n </div>\n </div>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center\">\n <p className=\"text-xl font-bold text-gray-900\">{dashboardStats?.users || 0}</p>\n </div>\n <p className=\"text-xs text-gray-500\">Total</p>\n </div>\n </div>\n </div>\n </div>\n\n {/* Dotted Line Separator */}\n <div className=\"border-t-2 border-dotted border-gray-200 my-6\"></div>\n \n {/* Analytics Section - Only show if enabled */}\n {analyticsEnabled && !isLoading && analyticsData && (\n <>\n {/* Analytics Overview */}\n <div className=\"mb-4\">\n <div className=\"flex items-center mb-2\">\n <Globe className=\"w-4 h-4 text-gray-600 mr-2\" />\n <h2 className=\"text-sm font-semibold text-gray-800\">Website Analytics</h2>\n </div>\n \n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4\">\n <AnalyticsCard\n title=\"Total Visitors\"\n value={analyticsData.visitors.toLocaleString()}\n subtitle=\"Last 30 days\"\n icon={<Users className=\"w-5 h-5\" />}\n trend={{ value: 12.5, isPositive: true }}\n />\n \n <AnalyticsCard\n title=\"Page Views\"\n value={analyticsData.pageViews.toLocaleString()}\n subtitle=\"Last 30 days\"\n icon={<Eye className=\"w-5 h-5\" />}\n trend={{ value: 8.2, isPositive: true }}\n />\n \n <AnalyticsCard\n title=\"Bounce Rate\"\n value={`${analyticsData.bounceRate.toFixed(1)}%`}\n subtitle=\"Last 30 days\"\n icon={<MousePointer className=\"w-5 h-5\" />}\n trend={{ value: 3.1, isPositive: false }}\n />\n \n <AnalyticsCard\n title=\"Avg Session\"\n value={`${Math.round(analyticsData.avgSessionDuration / 60)}m`}\n subtitle=\"Last 30 days\"\n icon={<Globe className=\"w-5 h-5\" />}\n trend={{ value: 15.7, isPositive: true }}\n />\n </div>\n </div>\n\n {/* Dotted Line Separator */}\n <div className=\"border-t-2 border-dotted border-gray-200 my-6\"></div>\n\n {/* Daily User Activity Chart */}\n <div className=\"mb-6\">\n <div className=\"flex items-center mb-4\">\n <Activity className=\"w-5 h-5 text-gray-600 mr-2\" />\n <h2 className=\"text-xl font-semibold text-gray-800\">Daily User Activity</h2>\n </div>\n \n <DailyUserChart \n data={analyticsData.dailyUsers} \n title=\"Daily User Trends (Last 30 Days)\"\n />\n </div>\n\n {/* Dotted Line Separator */}\n <div className=\"border-t-2 border-dotted border-gray-200 my-6\"></div>\n\n {/* Analytics Details */}\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6 mb-6\">\n {/* Top Pages */}\n <div className=\"bg-white rounded-lg border border-gray-100 p-4 shadow-sm\">\n <h3 className=\"text-base font-semibold text-gray-800 mb-3\">Top Pages</h3>\n <div className=\"space-y-2\">\n {analyticsData.topPages.map((page, index) => (\n <div key={index} className=\"flex items-center justify-between p-2 bg-gray-50 rounded-lg\">\n <div className=\"flex items-center\">\n <span className=\"text-xs font-medium text-gray-500 w-4\">{index + 1}</span>\n <span className=\"text-xs text-gray-700 truncate max-w-xs\">{page.page}</span>\n </div>\n <span className=\"text-xs font-semibold text-gray-900\">{page.views.toLocaleString()}</span>\n </div>\n ))}\n </div>\n </div>\n \n {/* Traffic Sources */}\n <div className=\"bg-white rounded-lg border border-gray-100 p-4 shadow-sm\">\n <h3 className=\"text-base font-semibold text-gray-800 mb-3\">Traffic Sources</h3>\n <div className=\"space-y-2\">\n {analyticsData.trafficSources.map((source, index) => (\n <div key={index} className=\"flex items-center justify-between p-2 bg-gray-50 rounded-lg\">\n <span className=\"text-xs text-gray-700\">{source.source}</span>\n <span className=\"text-xs font-semibold text-gray-900\">{source.sessions.toLocaleString()}</span>\n </div>\n ))}\n </div>\n </div>\n </div>\n\n {/* Dotted Line Separator */}\n <div className=\"border-t-2 border-dotted border-gray-200 my-6\"></div>\n\n {/* Geographic Distribution */}\n <div className=\"mb-6\">\n <GeographicMap data={analyticsData.geographicData} />\n </div>\n </>\n )}\n\n {/* Loading State */}\n {isLoading && (\n <div className=\"flex items-center justify-center py-8\">\n <div className=\"animate-spin rounded-full h-5 w-5 border-2 border-gray-300 border-t-gray-600\"></div>\n <span className=\"ml-2 text-sm text-gray-600\">Loading dashboard data...</span>\n </div>\n )}\n\n {/* No Analytics State */}\n {!isLoading && !analyticsEnabled && (\n <div className=\"text-center py-8\">\n <Globe className=\"w-10 h-10 text-gray-400 mx-auto mb-3\" />\n <h3 className=\"text-base font-medium text-gray-600 mb-1\">Analytics Not Configured</h3>\n <p className=\"text-xs text-gray-500\">Google Analytics integration is required to view website analytics.</p>\n </div>\n )}\n </div>\n </div>\n );\n}\n","'use client';\n\nimport React, { useState, useEffect, useContext, useMemo } from 'react';\nimport { useRouter } from 'next/navigation';\nimport DashboardPage from './DashboardPage';\nimport SignInPage from './SignInPage';\nimport ForgotPasswordPage from './ForgotPasswordPage';\nimport ResetPasswordPage from './ResetPasswordPage';\nimport InvitePage from './InvitePage';\nimport AdminCRUD, { type CrudFilterItem } from '../../components/Admin/CRUD';\nimport BlogEditorPage from '../../components/Admin/BlogEditorPage';\nimport PolicyEditorPage from '../../components/Admin/PolicyEditorPage';\nimport FormBuilder from '../../components/Admin/FormBuilder';\nimport SubmissionDetailPage from './SubmissionDetailPage';\nimport OrderDetailPage from './OrderDetailPage';\nimport PaymentDetailPage from './PaymentDetailPage';\nimport ContactDetailPage from './ContactDetailPage';\nimport SettingsPage from './SettingsPage';\nimport MediaLibraryPage from './MediaLibraryPage';\nimport PageBuilderPage from './PageBuilderPage';\nimport PluginsPage from './PluginsPage';\nimport BrandEditPage from './BrandEditPage';\nimport { AdminConfigContext } from '../admin-config-context';\nimport { STORE_CRUD_CONFIGS } from '../store-crud-configs';\n\nconst PAGE_MAP: Record<string, React.ComponentType> = {\n dashboard: DashboardPage,\n signin: SignInPage,\n 'forgot-password': ForgotPasswordPage,\n 'reset-password': ResetPasswordPage,\n invite: InvitePage,\n settings: SettingsPage,\n plugins: PluginsPage,\n};\n\ninterface CrudColumn {\n field: string;\n displayName: string;\n type?: string;\n}\n\ninterface CrudConfig {\n title: string;\n apiEndpoint: string;\n columns: CrudColumn[];\n addEditPageUrl: string;\n filters?: CrudFilterItem[];\n}\n\nconst CRUD_CONFIGS: Record<string, CrudConfig> = {\n contacts: {\n title: 'Contacts',\n apiEndpoint: '/api/contacts',\n columns: [\n { field: 'name', displayName: 'Name' },\n { field: 'email', displayName: 'Email' },\n { field: 'phone', displayName: 'Phone' },\n { field: 'type', displayName: 'Type' },\n { field: 'createdAt', displayName: 'Created', type: 'date' },\n ],\n addEditPageUrl: '',\n filters: [\n { param: 'type', label: 'Type', type: 'select', options: [\n { value: '', label: 'All' },\n { value: 'customer', label: 'Customer' },\n { value: 'lead', label: 'Lead' },\n { value: 'vendor', label: 'Vendor' },\n ]},\n { param: 'orderId', label: 'Order ID', type: 'text' },\n ],\n },\n blogs: {\n title: 'Blogs',\n apiEndpoint: '/api/blogs',\n columns: [\n { field: 'title', displayName: 'Title' },\n { field: 'slug', displayName: 'Slug' },\n { field: 'published', displayName: 'Published', type: 'boolean' },\n { field: 'createdAt', displayName: 'Created', type: 'date' },\n ],\n addEditPageUrl: '/admin/blogs',\n },\n users: {\n title: 'Users',\n apiEndpoint: '/api/users',\n columns: [\n { field: 'name', displayName: 'Name' },\n { field: 'email', displayName: 'Email' },\n { field: 'blocked', displayName: 'Blocked', type: 'boolean' },\n { field: 'createdAt', displayName: 'Created', type: 'date' },\n ],\n addEditPageUrl: '',\n },\n forms: {\n title: 'Forms',\n apiEndpoint: '/api/forms',\n columns: [\n { field: 'name', displayName: 'Name' },\n { field: 'slug', displayName: 'Slug' },\n { field: 'published', displayName: 'Published', type: 'boolean' },\n { field: 'createdAt', displayName: 'Created', type: 'date' },\n ],\n addEditPageUrl: '/admin/forms',\n },\n submissions: {\n title: 'Submissions',\n apiEndpoint: '/api/form-submissions',\n columns: [\n { field: 'form.name', displayName: 'Form' },\n { field: 'contact.email', displayName: 'Contact' },\n { field: 'createdAt', displayName: 'Created', type: 'date' },\n ],\n addEditPageUrl: '',\n },\n pages: {\n title: 'Pages',\n apiEndpoint: '/api/pages',\n columns: [\n { field: 'title', displayName: 'Title' },\n { field: 'slug', displayName: 'Slug' },\n { field: 'published', displayName: 'Published', type: 'boolean' },\n { field: 'createdAt', displayName: 'Created', type: 'date' },\n ],\n addEditPageUrl: '/admin/pages',\n },\n categories: {\n title: 'Categories',\n apiEndpoint: '/api/categories',\n columns: [\n { field: 'name', displayName: 'Name' },\n { field: 'createdAt', displayName: 'Created', type: 'date' },\n ],\n addEditPageUrl: '',\n },\n tags: {\n title: 'Tags',\n apiEndpoint: '/api/tags',\n columns: [\n { field: 'name', displayName: 'Name' },\n { field: 'createdAt', displayName: 'Created', type: 'date' },\n ],\n addEditPageUrl: '',\n },\n media: {\n title: 'Media',\n apiEndpoint: '/api/media',\n columns: [\n { field: 'filename', displayName: 'Filename' },\n { field: 'mimeType', displayName: 'Type' },\n { field: 'isPublic', displayName: 'Public', type: 'boolean' },\n { field: 'createdAt', displayName: 'Created', type: 'date' },\n ],\n addEditPageUrl: '',\n },\n policies: {\n title: 'Policies',\n apiEndpoint: '/api/policies',\n columns: [\n { field: 'title', displayName: 'Title' },\n { field: 'version', displayName: 'Version' },\n { field: 'published', displayName: 'Published', type: 'boolean' },\n { field: 'publishedAt', displayName: 'Published Date', type: 'date' },\n { field: 'createdAt', displayName: 'Created', type: 'date' },\n ],\n addEditPageUrl: '/admin/policies',\n },\n};\n\nfunction BlogEditorWrapper({ blogId }: { blogId?: string }) {\n const [blog, setBlog] = useState<Record<string, unknown> | null>(null);\n const [loading, setLoading] = useState(!!blogId);\n\n useEffect(() => {\n if (!blogId) return;\n fetch(`/api/blogs/${blogId}`)\n .then((res) => (res.ok ? res.json() : null))\n .then((data) => setBlog(data))\n .finally(() => setLoading(false));\n }, [blogId]);\n\n if (loading) {\n return (\n <div className=\"flex items-center justify-center py-8\">\n <div className=\"animate-spin rounded-full h-6 w-6 border-2 border-gray-300 border-t-gray-600\" />\n <span className=\"ml-2\">Loading...</span>\n </div>\n );\n }\n\n return <BlogEditorPage existingBlog={blog} />;\n}\n\nfunction PolicyEditorWrapper({ policyId }: { policyId?: string }) {\n const [policy, setPolicy] = useState<Record<string, unknown> | null>(null);\n const [loading, setLoading] = useState(!!policyId);\n\n useEffect(() => {\n if (!policyId) return;\n fetch(`/api/policies/${policyId}`)\n .then((res) => (res.ok ? res.json() : null))\n .then((data) => setPolicy(data))\n .finally(() => setLoading(false));\n }, [policyId]);\n\n if (loading) {\n return (\n <div className=\"flex items-center justify-center py-8\">\n <div className=\"animate-spin rounded-full h-6 w-6 border-2 border-gray-300 border-t-gray-600\" />\n <span className=\"ml-2\">Loading...</span>\n </div>\n );\n }\n\n return <PolicyEditorPage existingPolicy={policy} />;\n}\n\nexport default function AdminPageResolver({ slug }: { slug?: string[] }) {\n const router = useRouter();\n const { customCrudConfigs, storeEnabled } = useContext(AdminConfigContext);\n const key = slug?.[0] || 'dashboard';\n\n useEffect(() => {\n if (key === 'layout-settings') {\n router.replace('/admin/settings?tab=navbar');\n }\n }, [key, router]);\n\n if (key === 'layout-settings') {\n return (\n <div className=\"flex justify-center py-8\">\n <div className=\"animate-spin rounded-full h-6 w-6 border-2 border-gray-300 border-t-gray-600\" />\n <span className=\"ml-2\">Redirecting...</span>\n </div>\n );\n }\n\n const Page = PAGE_MAP[key];\n\n if (Page) {\n return <Page />;\n }\n\n if (key === 'form-submissions' && slug && slug.length === 3 && slug[2] === 'view') {\n return <SubmissionDetailPage submissionId={slug[1]} />;\n }\n if (key === 'orders' && slug && slug.length === 3 && slug[2] === 'view') {\n return <OrderDetailPage orderId={slug[1]} />;\n }\n if (key === 'payments' && slug && slug.length === 3 && slug[2] === 'view') {\n return <PaymentDetailPage paymentId={slug[1]} />;\n }\n if (key === 'contacts' && slug && slug.length === 3 && slug[2] === 'view') {\n return <ContactDetailPage contactId={slug[1]} />;\n }\n\n const crud = { ...CRUD_CONFIGS, ...STORE_CRUD_CONFIGS, ...customCrudConfigs }[key];\n\n if (crud && slug && slug.length >= 2) {\n const subPath = slug[1];\n const isCreate = subPath === 'create';\n\n if (key === 'blogs') {\n return <BlogEditorWrapper blogId={isCreate ? undefined : subPath} />;\n }\n if (key === 'policies') {\n return <PolicyEditorWrapper policyId={isCreate ? undefined : subPath} />;\n }\n if (key === 'forms') {\n return <FormBuilder formId={isCreate ? undefined : subPath} />;\n }\n if (key === 'pages') {\n return <PageBuilderPage pageId={isCreate ? undefined : subPath} />;\n }\n if (key === 'brands') {\n return <BrandEditPage brandId={subPath} />;\n }\n }\n\n if (crud) {\n if (key === 'media') {\n return <MediaLibraryPage />;\n }\n const isContactsWithStore = key === 'contacts' && storeEnabled;\n const columns = isContactsWithStore\n ? [\n ...crud.columns,\n { field: 'orderCount', displayName: 'Orders' },\n { field: 'totalPaid', displayName: 'Total paid' },\n ]\n : crud.columns;\n const extraListParams = useMemo(\n () => (isContactsWithStore ? { includeSummary: '1' } : undefined),\n [isContactsWithStore]\n );\n return (\n <AdminCRUD\n title={crud.title}\n apiEndpoint={crud.apiEndpoint}\n columns={columns}\n addEditPageUrl={crud.addEditPageUrl}\n defaultSortField={(crud as { defaultSortField?: string }).defaultSortField}\n defaultSortOrder={(crud as { defaultSortOrder?: 'asc' | 'desc' }).defaultSortOrder}\n filters={crud.filters ?? (STORE_CRUD_CONFIGS[key]?.filters as CrudFilterItem[] | undefined)}\n extraListParams={extraListParams}\n />\n );\n }\n\n return (\n <div className=\"flex items-center justify-center min-h-[50vh]\">\n <p className=\"text-gray-500\">Page not found</p>\n </div>\n );\n}\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport { Input } from \"@/components/ui/input\";\nimport { Button } from \"@/components/ui/button\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { X, Save, AlertCircle } from \"lucide-react\";\nimport { useRouter } from \"next/navigation\";\nimport dynamic from \"next/dynamic\";\n\nconst quillStyles = `\n .ql-container {\n border: none !important;\n font-size: 14px;\n font-family: inherit;\n border-radius: 0 0 6px 6px;\n }\n .ql-toolbar {\n border: none !important;\n border-bottom: 1px solid #e5e7eb !important;\n background: #f9fafb;\n border-radius: 6px 6px 0 0;\n padding: 8px 12px;\n }\n .ql-toolbar button {\n border-radius: 4px;\n margin: 0 1px;\n }\n .ql-toolbar button:hover {\n background-color: #e5e7eb !important;\n }\n .ql-editor {\n min-height: 400px;\n padding: 16px;\n border: none !important;\n outline: none !important;\n font-family: inherit;\n line-height: 1.6;\n color: #374151;\n }\n .ql-editor:focus {\n outline: none !important;\n }\n .ql-editor.ql-blank::before {\n color: #9ca3af;\n font-style: normal;\n font-size: 14px;\n }\n .ql-editor p {\n margin-bottom: 12px;\n }\n .ql-editor h1, .ql-editor h2, .ql-editor h3 {\n margin-top: 16px;\n margin-bottom: 8px;\n font-weight: 600;\n }\n`;\n\nconst ReactQuill = dynamic(() => import(\"react-quill-new\"), { ssr: false });\n\nconst quillModules = {\n toolbar: [\n [{ header: [1, 2, false] }],\n [\"bold\", \"italic\", \"underline\", \"strike\"],\n [{ list: \"ordered\" }, { list: \"bullet\" }],\n [\"blockquote\", \"code-block\"],\n [\"link\", \"image\"],\n [{ align: [] }],\n [\"clean\"],\n ],\n};\n\ninterface PolicyEditorPageProps {\n existingPolicy?: Record<string, unknown> | null;\n}\n\nexport default function PolicyEditorPage({ existingPolicy }: PolicyEditorPageProps) {\n const [title, setTitle] = useState((existingPolicy?.title as string) || \"\");\n const [slug, setSlug] = useState((existingPolicy?.slug as string) || \"\");\n const [content, setContent] = useState((existingPolicy?.content as string) || \"\");\n const [version, setVersion] = useState((existingPolicy?.version as string) || \"\");\n const [published, setPublished] = useState((existingPolicy?.published as boolean) ?? false);\n const [publishedAt, setPublishedAt] = useState(\n existingPolicy?.publishedAt\n ? new Date(existingPolicy.publishedAt as string).toISOString().slice(0, 16)\n : \"\"\n );\n const [errors, setErrors] = useState<string[]>([]);\n const [isSaving, setIsSaving] = useState(false);\n const router = useRouter();\n\n useEffect(() => {\n if (title && !slug) {\n const generated = title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/(^-|-$)/g, \"\");\n setSlug(generated);\n }\n }, [title, slug]);\n\n const validate = () => {\n const next: string[] = [];\n if (!title.trim()) next.push(\"Title is required\");\n if (!slug.trim()) next.push(\"Slug is required\");\n setErrors(next);\n return next.length === 0;\n };\n\n const handleSave = async () => {\n setIsSaving(true);\n setErrors([]);\n if (!validate()) {\n setIsSaving(false);\n return;\n }\n const body = {\n title: title.trim(),\n slug: slug.trim(),\n content,\n version: version.trim() || null,\n published,\n publishedAt: publishedAt ? new Date(publishedAt).toISOString() : null,\n };\n const method = existingPolicy ? \"PUT\" : \"POST\";\n const url = existingPolicy ? `/api/policies/${existingPolicy.id}` : \"/api/policies\";\n try {\n const res = await fetch(url, {\n method,\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n const data = await res.json();\n if (!res.ok) {\n setErrors(Array.isArray(data.details) ? data.details : [data.error || \"Failed to save\"]);\n return;\n }\n if (!existingPolicy && data.id) {\n router.replace(`/admin/policies/${data.id}`);\n }\n } catch {\n setErrors([\"Failed to save policy\"]);\n } finally {\n setIsSaving(false);\n }\n };\n\n return (\n <div className=\"rounded-lg bg-white shadow-md\">\n <div className=\"bg-gray-800 border-b border-gray-700 px-4 py-2.5 rounded-t-lg\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-xl font-bold text-white\">\n {existingPolicy ? \"Edit Policy\" : \"Create Policy\"}\n </h1>\n <p className=\"text-xs text-gray-300 mt-0.5\">\n {existingPolicy ? \"Update policy\" : \"Add a new policy\"}\n </p>\n </div>\n <div className=\"flex items-center gap-3\">\n <div className=\"flex items-center gap-2\">\n <Switch\n checked={published}\n onCheckedChange={(c) => setPublished(c as boolean)}\n className=\"data-[state=checked]:bg-green-500\"\n />\n <span className=\"text-xs text-gray-300\">Published</span>\n </div>\n <Button\n size=\"sm\"\n className=\"flex items-center bg-white text-gray-800 hover:bg-gray-100 border-0 text-xs\"\n onClick={handleSave}\n disabled={isSaving}\n >\n <Save className=\"h-4 w-4 mr-1\" />\n {isSaving ? \"Saving...\" : \"Save\"}\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"flex items-center bg-white text-gray-800 hover:bg-gray-100 border-0 text-xs\"\n onClick={() => router.back()}\n >\n <X className=\"h-4 w-4 mr-1\" /> Close\n </Button>\n </div>\n </div>\n </div>\n {errors.length > 0 && (\n <div className=\"bg-red-50 border-l-4 border-red-400 p-4 mx-6 mt-4\">\n <div className=\"flex\">\n <AlertCircle className=\"h-5 w-5 text-red-400\" />\n <div className=\"ml-3\">\n <h3 className=\"text-sm font-medium text-red-800\">Please fix the following errors:</h3>\n <ul className=\"mt-2 text-sm text-red-700 list-disc pl-5 space-y-1\">\n {errors.map((e, i) => (\n <li key={i}>{e}</li>\n ))}\n </ul>\n </div>\n </div>\n </div>\n )}\n <div className=\"p-6 flex w-full gap-6\">\n <div className=\"flex w-3/4 flex-col gap-4\">\n <div>\n <label className=\"block text-sm font-semibold text-gray-700 mb-2\">Content *</label>\n <div className=\"border border-gray-300 rounded-md bg-white overflow-hidden focus-within:border-gray-500 focus-within:ring-1 focus-within:ring-gray-500\">\n <style dangerouslySetInnerHTML={{ __html: quillStyles }} />\n <ReactQuill\n value={content}\n onChange={setContent}\n theme=\"snow\"\n modules={quillModules}\n placeholder=\"Policy content (HTML)...\"\n />\n </div>\n </div>\n </div>\n <div className=\"flex w-1/4 flex-col gap-4 rounded-lg bg-gray-50 border overflow-hidden p-4\">\n <div>\n <label className=\"block text-xs font-medium text-gray-600 mb-1\">Title *</label>\n <Input\n type=\"text\"\n placeholder=\"Policy Title\"\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n className=\"h-8 text-sm\"\n />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-gray-600 mb-1\">Slug *</label>\n <Input\n type=\"text\"\n placeholder=\"policy-slug\"\n value={slug}\n onChange={(e) => setSlug(e.target.value)}\n className=\"h-8 text-sm\"\n />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-gray-600 mb-1\">Version</label>\n <Input\n type=\"text\"\n placeholder=\"e.g. 1.0\"\n value={version}\n onChange={(e) => setVersion(e.target.value)}\n className=\"h-8 text-sm\"\n />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-gray-600 mb-1\">Published Date</label>\n <Input\n type=\"datetime-local\"\n value={publishedAt}\n onChange={(e) => setPublishedAt(e.target.value)}\n className=\"h-8 text-sm\"\n />\n </div>\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport Link from \"next/link\";\nimport { ArrowLeft } from \"lucide-react\";\nimport { Button } from \"@/components/ui/button\";\nimport { formatDateTime } from \"@/lib/utils\";\n\ninterface FormFieldRef {\n id: number;\n label: string;\n type: string;\n}\n\ninterface FormRef {\n id: number;\n name: string;\n slug: string;\n fields?: FormFieldRef[];\n}\n\ninterface ContactRef {\n id: number;\n name: string;\n email: string;\n phone: string | null;\n}\n\ninterface Submission {\n id: number;\n formId: number;\n contactId: number | null;\n data: Record<string, unknown>;\n ipAddress: string | null;\n userAgent: string | null;\n createdAt: string;\n updatedAt: string;\n form?: FormRef;\n contact?: ContactRef | null;\n}\n\nexport default function SubmissionDetailPage({ submissionId }: { submissionId: string }) {\n const [submission, setSubmission] = useState<Submission | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n async function load() {\n try {\n setLoading(true);\n setError(null);\n const res = await fetch(`/api/form-submissions/${submissionId}`);\n if (!res.ok) {\n if (res.status === 404) setError(\"Submission not found\");\n else setError(\"Failed to load\");\n setSubmission(null);\n return;\n }\n const data = await res.json();\n setSubmission(data);\n } catch {\n setError(\"Failed to load\");\n setSubmission(null);\n } finally {\n setLoading(false);\n }\n }\n load();\n }, [submissionId]);\n\n if (loading) {\n return (\n <div className=\"rounded-lg bg-white p-6 shadow-md\">\n <div className=\"flex justify-center py-12\">\n <span className=\"text-gray-500\">Loading...</span>\n </div>\n </div>\n );\n }\n\n if (error || !submission) {\n return (\n <div className=\"rounded-lg bg-white p-6 shadow-md\">\n <p className=\"text-red-600\">{error ?? \"Not found\"}</p>\n <Link href=\"/admin/submissions\">\n <Button variant=\"outline\" className=\"mt-4\">\n <ArrowLeft className=\"h-4 w-4 mr-2\" />\n Back to Submissions\n </Button>\n </Link>\n </div>\n );\n }\n\n const formName = submission.form?.name ?? `Form #${submission.formId}`;\n const contact = submission.contact;\n const fieldLabel = (key: string) => {\n const field = submission.form?.fields?.find((f) => String(f.id) === key);\n return field?.label ?? key;\n };\n\n return (\n <div className=\"rounded-lg bg-white shadow-md\">\n <div className=\"bg-gray-800 border-b border-gray-700 px-4 py-2.5 rounded-t-lg flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <Link\n href=\"/admin/submissions\"\n className=\"inline-flex items-center gap-1 text-gray-300 hover:text-white text-sm\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n Back\n </Link>\n <h1 className=\"text-base font-semibold text-white\">Submission #{submission.id}</h1>\n </div>\n </div>\n <div className=\"p-6 space-y-6\">\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">Form</h2>\n <p className=\"text-gray-900 font-medium\">{formName}</p>\n </section>\n\n {contact && (\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">Contact</h2>\n <dl className=\"grid grid-cols-1 sm:grid-cols-3 gap-2 text-sm\">\n <div>\n <dt className=\"text-gray-500\">Name</dt>\n <dd className=\"font-medium text-gray-900\">{contact.name}</dd>\n </div>\n <div>\n <dt className=\"text-gray-500\">Email</dt>\n <dd className=\"font-medium text-gray-900\">{contact.email}</dd>\n </div>\n <div>\n <dt className=\"text-gray-500\">Phone</dt>\n <dd className=\"font-medium text-gray-900\">{contact.phone ?? \"—\"}</dd>\n </div>\n </dl>\n </section>\n )}\n\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">Submission data</h2>\n <div className=\"border border-gray-200 rounded-md overflow-hidden\">\n <table className=\"w-full text-sm\">\n <thead className=\"bg-gray-50\">\n <tr>\n <th className=\"text-left py-2 px-3 font-medium text-gray-600\">Field</th>\n <th className=\"text-left py-2 px-3 font-medium text-gray-600\">Value</th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-gray-200\">\n {Object.entries(submission.data ?? {}).length === 0 ? (\n <tr>\n <td colSpan={2} className=\"py-4 px-3 text-gray-500\">\n No data\n </td>\n </tr>\n ) : (\n Object.entries(submission.data ?? {}).map(([key, value]) => (\n <tr key={key}>\n <td className=\"py-2 px-3 text-gray-600 font-medium\">{fieldLabel(key)}</td>\n <td className=\"py-2 px-3 text-gray-900\">\n {value === null || value === undefined\n ? \"—\"\n : typeof value === \"object\"\n ? JSON.stringify(value)\n : String(value)}\n </td>\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n </section>\n\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">Audit</h2>\n <dl className=\"grid grid-cols-1 gap-2 text-sm\">\n <div>\n <dt className=\"text-gray-500\">Submitted at</dt>\n <dd className=\"font-medium text-gray-900\">{formatDateTime(submission.createdAt)}</dd>\n </div>\n {submission.ipAddress && (\n <div>\n <dt className=\"text-gray-500\">IP address</dt>\n <dd className=\"font-mono text-gray-900\">{submission.ipAddress}</dd>\n </div>\n )}\n {submission.userAgent && (\n <div>\n <dt className=\"text-gray-500\">User agent</dt>\n <dd className=\"text-gray-900 break-all\">{submission.userAgent}</dd>\n </div>\n )}\n </dl>\n </section>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport Link from \"next/link\";\nimport { useRouter } from \"next/navigation\";\nimport { X } from \"lucide-react\";\nimport { Button } from \"@/components/ui/button\";\nimport { formatDateTime, formatDate } from \"@/lib/utils\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"@/components/ui/table\";\nimport DetailPageLayout from \"../../components/Admin/DetailPageLayout\";\n\ninterface ContactRef {\n id: number;\n name: string;\n email: string;\n phone: string | null;\n}\n\ninterface AddressRef {\n id: number;\n tag: string | null;\n line1: string | null;\n line2: string | null;\n city: string | null;\n state: string | null;\n postalCode: string | null;\n country: string | null;\n}\n\ninterface ProductRef {\n id: number;\n name: string;\n sku?: string;\n collection?: { name: string } | null;\n}\n\ninterface OrderItemRef {\n id: number;\n productId: number;\n quantity: number;\n unitPrice: number;\n tax: number;\n total: number;\n product?: ProductRef;\n}\n\ninterface PaymentRef {\n id: number;\n orderId: number;\n amount: number;\n currency: string;\n status: string;\n method: string | null;\n externalReference: string | null;\n paidAt: string | null;\n createdAt: string;\n metadata?: Record<string, unknown> | null;\n}\n\ninterface Order {\n id: number;\n orderNumber: string;\n contactId: number;\n status: string;\n subtotal: number;\n tax: number;\n discount: number;\n total: number;\n currency: string;\n createdAt: string;\n updatedAt: string;\n contact?: ContactRef;\n billingAddress?: AddressRef | null;\n shippingAddress?: AddressRef | null;\n items?: OrderItemRef[];\n payments?: PaymentRef[];\n}\n\nfunction formatMoney(amount: number, currency: string = \"INR\"): string {\n return new Intl.NumberFormat(\"en-IN\", {\n style: \"currency\",\n currency,\n minimumFractionDigits: 2,\n }).format(Number(amount));\n}\n\nfunction statusBadge(status: string): string {\n const map: Record<string, string> = {\n pending: \"bg-amber-100 text-amber-800\",\n confirmed: \"bg-blue-100 text-blue-800\",\n processing: \"bg-sky-100 text-sky-800\",\n completed: \"bg-green-100 text-green-800\",\n cancelled: \"bg-gray-100 text-gray-600\",\n };\n return map[status] ?? \"bg-gray-100 text-gray-700\";\n}\n\nfunction formatAddress(a: AddressRef): string {\n const parts = [a.line1, a.line2, a.city, a.state, a.postalCode, a.country].filter(Boolean);\n return parts.join(\", \") || \"—\";\n}\n\nexport default function OrderDetailPage({ orderId }: { orderId: string }) {\n const router = useRouter();\n const [order, setOrder] = useState<Order | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n async function load() {\n try {\n setLoading(true);\n setError(null);\n const res = await fetch(`/api/orders/${orderId}`);\n if (!res.ok) {\n if (res.status === 404) setError(\"Order not found\");\n else setError(\"Failed to load\");\n setOrder(null);\n return;\n }\n const data = await res.json();\n setOrder(data);\n } catch {\n setError(\"Failed to load\");\n setOrder(null);\n } finally {\n setLoading(false);\n }\n }\n load();\n }, [orderId]);\n\n if (loading) {\n return (\n <div className=\"rounded-lg bg-white p-6 shadow-md\">\n <div className=\"flex justify-center py-12\">\n <span className=\"text-gray-500\">Loading...</span>\n </div>\n </div>\n );\n }\n\n if (error || !order) {\n return (\n <div className=\"rounded-lg bg-white p-6 shadow-md\">\n <p className=\"text-red-600\">{error ?? \"Not found\"}</p>\n <Link href=\"/admin/orders\">\n <Button variant=\"outline\" className=\"mt-4\">\n <X className=\"h-4 w-4 mr-2\" />\n Close\n </Button>\n </Link>\n </div>\n );\n }\n\n const contact = order.contact;\n const items = order.items ?? [];\n const payments = order.payments ?? [];\n const currency = order.currency ?? \"INR\";\n\n return (\n <div className=\"rounded-lg bg-white shadow-md\">\n <div className=\"bg-gray-800 border-b border-gray-700 px-4 py-2.5 rounded-t-lg\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <h1 className=\"text-base font-semibold text-white\">\n Order {order.orderNumber}\n </h1>\n <span\n className={`inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium capitalize ${statusBadge(\n order.status\n )}`}\n >\n {order.status}\n </span>\n <span className=\"text-sm text-gray-400\">\n {formatDateTime(order.createdAt)}\n </span>\n </div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"inline-flex items-center rounded-md border border-gray-600 bg-transparent px-3 py-1.5 text-xs font-medium text-white hover:bg-gray-700\"\n onClick={() => router.push(\"/admin/orders\")}\n >\n <X className=\"h-4 w-4 mr-1\" /> Close\n </Button>\n </div>\n </div>\n\n <DetailPageLayout\n main={\n <>\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">\n Order details\n </h2>\n <div className=\"border border-gray-200 rounded-lg p-4 bg-gray-50/50\">\n <dl className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-3 text-sm\">\n <div>\n <dt className=\"text-gray-500\">Order ID</dt>\n <dd className=\"font-medium text-gray-900\">{order.id}</dd>\n </div>\n <div>\n <dt className=\"text-gray-500\">Created</dt>\n <dd className=\"font-medium text-gray-900\">{formatDateTime(order.createdAt)}</dd>\n </div>\n <div>\n <dt className=\"text-gray-500\">Last updated</dt>\n <dd className=\"font-medium text-gray-900\">{formatDate(order.updatedAt)}</dd>\n </div>\n <div>\n <dt className=\"text-gray-500\">Total</dt>\n <dd className=\"font-medium text-gray-900\">{formatMoney(Number(order.total), currency)}</dd>\n </div>\n </dl>\n </div>\n </section>\n\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">\n Line items\n </h2>\n <div className=\"border border-gray-200 rounded-lg overflow-hidden\">\n <Table>\n <TableHeader>\n <TableRow className=\"bg-gray-50\">\n <TableHead className=\"font-medium\">Product / Model</TableHead>\n <TableHead className=\"font-medium\">SKU</TableHead>\n <TableHead className=\"font-medium text-right\">Qty</TableHead>\n <TableHead className=\"font-medium text-right\">Unit price</TableHead>\n <TableHead className=\"font-medium text-right\">Total</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {items.length === 0 ? (\n <TableRow>\n <TableCell colSpan={5} className=\"py-6 text-center text-gray-500\">\n No items\n </TableCell>\n </TableRow>\n ) : (\n items.map((item) => {\n const label =\n item.product?.collection?.name ?? item.product?.name ?? `Product #${item.productId}`;\n return (\n <TableRow key={item.id}>\n <TableCell className=\"font-medium\">{label}</TableCell>\n <TableCell className=\"text-gray-600\">\n {item.product?.sku ?? \"—\"}\n </TableCell>\n <TableCell className=\"text-right\">{item.quantity}</TableCell>\n <TableCell className=\"text-right\">\n {formatMoney(Number(item.unitPrice), currency)}\n </TableCell>\n <TableCell className=\"text-right font-medium\">\n {formatMoney(Number(item.total), currency)}\n </TableCell>\n </TableRow>\n );\n })\n )}\n </TableBody>\n </Table>\n </div>\n </section>\n\n <section className=\"flex justify-end\">\n <div className=\"border border-gray-200 rounded-lg p-4 w-full max-w-xs space-y-2 text-sm\">\n <div className=\"flex justify-between text-gray-600\">\n <span>Subtotal</span>\n <span>{formatMoney(Number(order.subtotal), currency)}</span>\n </div>\n {Number(order.tax) > 0 && (\n <div className=\"flex justify-between text-gray-600\">\n <span>Tax</span>\n <span>{formatMoney(Number(order.tax), currency)}</span>\n </div>\n )}\n {Number(order.discount) > 0 && (\n <div className=\"flex justify-between text-gray-600\">\n <span>Discount</span>\n <span>-{formatMoney(Number(order.discount), currency)}</span>\n </div>\n )}\n <div className=\"flex justify-between font-semibold text-gray-900 pt-2 border-t border-gray-200\">\n <span>Total</span>\n <span>{formatMoney(Number(order.total), currency)}</span>\n </div>\n </div>\n </section>\n </>\n }\n sidebar={\n <>\n {contact && (\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">\n Customer\n </h2>\n <div className=\"border border-gray-200 rounded-lg p-4 bg-gray-50/50\">\n <dl className=\"grid grid-cols-1 sm:grid-cols-3 gap-3 text-sm\">\n <div>\n <dt className=\"text-gray-500\">Name</dt>\n <dd className=\"font-medium text-gray-900\">{contact.name}</dd>\n </div>\n <div>\n <dt className=\"text-gray-500\">Email</dt>\n <dd className=\"font-medium text-gray-900\">\n <a href={`mailto:${contact.email}`} className=\"text-blue-600 hover:underline\">\n {contact.email}\n </a>\n </dd>\n </div>\n <div>\n <dt className=\"text-gray-500\">Phone</dt>\n <dd className=\"font-medium text-gray-900\">\n {contact.phone ? (\n <a href={`tel:${contact.phone}`} className=\"text-blue-600 hover:underline\">\n {contact.phone}\n </a>\n ) : (\n \"—\"\n )}\n </dd>\n </div>\n </dl>\n </div>\n </section>\n )}\n\n {(order.billingAddress || order.shippingAddress) && (\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">\n Customer addresses\n </h2>\n <div className=\"border border-gray-200 rounded-lg p-4 bg-gray-50/50 space-y-4\">\n {order.billingAddress && (\n <div>\n <dt className=\"text-gray-500 text-xs font-medium uppercase tracking-wider mb-1\">Billing</dt>\n <dd className=\"text-gray-900 text-sm\">{formatAddress(order.billingAddress)}</dd>\n </div>\n )}\n {order.shippingAddress && (\n <div>\n <dt className=\"text-gray-500 text-xs font-medium uppercase tracking-wider mb-1\">Shipping</dt>\n <dd className=\"text-gray-900 text-sm\">{formatAddress(order.shippingAddress)}</dd>\n </div>\n )}\n </div>\n </section>\n )}\n\n {payments.length > 0 && (\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">\n Payments\n </h2>\n <div className=\"border border-gray-200 rounded-lg overflow-hidden\">\n <Table>\n <TableHeader>\n <TableRow className=\"bg-gray-50\">\n <TableHead className=\"font-medium\">Amount</TableHead>\n <TableHead className=\"font-medium\">Status</TableHead>\n <TableHead className=\"font-medium\">Method</TableHead>\n <TableHead className=\"font-medium\">Paid at</TableHead>\n <TableHead className=\"font-medium\">Gateway reference</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {payments.map((p) => (\n <TableRow key={p.id}>\n <TableCell className=\"font-medium\">\n {formatMoney(Number(p.amount), p.currency)}\n </TableCell>\n <TableCell>\n <span\n className={`inline-flex rounded-full px-2 py-0.5 text-xs font-medium ${\n p.status === \"completed\"\n ? \"bg-green-100 text-green-800\"\n : p.status === \"failed\"\n ? \"bg-red-100 text-red-800\"\n : \"bg-gray-100 text-gray-700\"\n }`}\n >\n {p.status}\n </span>\n </TableCell>\n <TableCell className=\"text-gray-600\">{p.method ?? \"—\"}</TableCell>\n <TableCell className=\"text-gray-600\">\n {p.paidAt ? formatDateTime(p.paidAt) : \"—\"}\n </TableCell>\n <TableCell className=\"text-gray-600 font-mono text-xs\">\n {p.externalReference ?? \"—\"}\n {(p.metadata as Record<string, string> | undefined)?.razorpayPaymentId && (\n <span className=\"block mt-0.5\">\n {String((p.metadata as Record<string, string>).razorpayPaymentId)}\n </span>\n )}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n </section>\n )}\n </>\n }\n />\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\n\nexport default function DetailPageLayout({\n main,\n sidebar,\n}: {\n main: React.ReactNode;\n sidebar: React.ReactNode;\n}) {\n return (\n <div className=\"p-6 grid grid-cols-1 lg:grid-cols-3 gap-6\">\n <div className=\"lg:col-span-2 space-y-6\">{main}</div>\n <div className=\"lg:col-span-1 space-y-6\">{sidebar}</div>\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport Link from \"next/link\";\nimport { useRouter } from \"next/navigation\";\nimport { X } from \"lucide-react\";\nimport { Button } from \"@/components/ui/button\";\nimport { formatDateTime } from \"@/lib/utils\";\nimport DetailPageLayout from \"../../components/Admin/DetailPageLayout\";\n\ninterface ContactRef {\n id: number;\n name: string;\n email: string;\n phone?: string | null;\n}\n\ninterface OrderRef {\n id: number;\n orderNumber: string;\n contact?: ContactRef;\n}\n\ninterface Payment {\n id: number;\n orderId: number;\n contactId: number | null;\n amount: number;\n currency: string;\n status: string;\n method: string | null;\n externalReference: string | null;\n paidAt: string | null;\n createdAt: string;\n updatedAt: string;\n metadata?: Record<string, unknown> | null;\n order?: OrderRef;\n contact?: ContactRef | null;\n}\n\nfunction formatMoney(amount: number, currency: string = \"INR\"): string {\n return new Intl.NumberFormat(\"en-IN\", {\n style: \"currency\",\n currency,\n minimumFractionDigits: 2,\n }).format(Number(amount));\n}\n\nexport default function PaymentDetailPage({ paymentId }: { paymentId: string }) {\n const router = useRouter();\n const [payment, setPayment] = useState<Payment | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n async function load() {\n try {\n setLoading(true);\n setError(null);\n const res = await fetch(`/api/payments/${paymentId}`);\n if (!res.ok) {\n if (res.status === 404) setError(\"Payment not found\");\n else setError(\"Failed to load\");\n setPayment(null);\n return;\n }\n const data = await res.json();\n setPayment(data);\n } catch {\n setError(\"Failed to load\");\n setPayment(null);\n } finally {\n setLoading(false);\n }\n }\n load();\n }, [paymentId]);\n\n if (loading) {\n return (\n <div className=\"rounded-lg bg-white p-6 shadow-md\">\n <div className=\"flex justify-center py-12\">\n <span className=\"text-gray-500\">Loading...</span>\n </div>\n </div>\n );\n }\n\n if (error || !payment) {\n return (\n <div className=\"rounded-lg bg-white p-6 shadow-md\">\n <p className=\"text-red-600\">{error ?? \"Not found\"}</p>\n <Link href=\"/admin/payments\">\n <Button variant=\"outline\" className=\"mt-4\">\n <X className=\"h-4 w-4 mr-2\" />\n Close\n </Button>\n </Link>\n </div>\n );\n }\n\n const customer = payment.order?.contact ?? payment.contact;\n const meta = (payment.metadata ?? {}) as Record<string, string>;\n\n return (\n <div className=\"rounded-lg bg-white shadow-md\">\n <div className=\"bg-gray-800 border-b border-gray-700 px-4 py-2.5 rounded-t-lg\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <h1 className=\"text-base font-semibold text-white\">\n Payment #{payment.id}\n </h1>\n <span\n className={`inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium ${\n payment.status === \"completed\"\n ? \"bg-green-100 text-green-800\"\n : payment.status === \"failed\"\n ? \"bg-red-100 text-red-800\"\n : \"bg-amber-100 text-amber-800\"\n }`}\n >\n {payment.status}\n </span>\n <span className=\"text-sm text-gray-400\">\n {formatDateTime(payment.createdAt)}\n </span>\n </div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"inline-flex items-center rounded-md border border-gray-600 bg-transparent px-3 py-1.5 text-xs font-medium text-white hover:bg-gray-700\"\n onClick={() => router.push(\"/admin/payments\")}\n >\n <X className=\"h-4 w-4 mr-1\" /> Close\n </Button>\n </div>\n </div>\n\n <DetailPageLayout\n main={\n <>\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">\n Payment details\n </h2>\n <div className=\"border border-gray-200 rounded-lg p-4 bg-gray-50/50\">\n <dl className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-3 text-sm\">\n <div>\n <dt className=\"text-gray-500\">Payment ID</dt>\n <dd className=\"font-medium text-gray-900\">{payment.id}</dd>\n </div>\n <div>\n <dt className=\"text-gray-500\">Amount</dt>\n <dd className=\"font-medium text-gray-900\">{formatMoney(Number(payment.amount), payment.currency)}</dd>\n </div>\n <div>\n <dt className=\"text-gray-500\">Method</dt>\n <dd className=\"font-medium text-gray-900\">{payment.method ?? \"—\"}</dd>\n </div>\n <div>\n <dt className=\"text-gray-500\">Created</dt>\n <dd className=\"font-medium text-gray-900\">{formatDateTime(payment.createdAt)}</dd>\n </div>\n <div>\n <dt className=\"text-gray-500\">Last updated</dt>\n <dd className=\"font-medium text-gray-900\">{formatDateTime(payment.updatedAt)}</dd>\n </div>\n {payment.paidAt && (\n <div>\n <dt className=\"text-gray-500\">Paid at</dt>\n <dd className=\"font-medium text-gray-900\">{formatDateTime(payment.paidAt)}</dd>\n </div>\n )}\n {payment.externalReference && (\n <div className=\"sm:col-span-2\">\n <dt className=\"text-gray-500\">Razorpay Order ID</dt>\n <dd className=\"font-mono text-gray-900 text-xs mt-0.5 break-all\">{payment.externalReference}</dd>\n </div>\n )}\n {meta.razorpayPaymentId && (\n <div className=\"sm:col-span-2\">\n <dt className=\"text-gray-500\">Razorpay Payment ID</dt>\n <dd className=\"font-mono text-gray-900 text-xs mt-0.5 break-all\">{meta.razorpayPaymentId}</dd>\n </div>\n )}\n </dl>\n </div>\n </section>\n\n {payment.order && (\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">\n Order\n </h2>\n <div className=\"border border-gray-200 rounded-lg p-4 bg-gray-50/50\">\n <Link\n href={`/admin/orders/${payment.order.id}/view`}\n className=\"text-blue-600 hover:underline font-medium\"\n >\n {payment.order.orderNumber}\n </Link>\n <p className=\"text-xs text-gray-500 mt-1\">\n View full order details\n </p>\n </div>\n </section>\n )}\n </>\n }\n sidebar={\n <>\n {customer && (\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">\n Customer\n </h2>\n <div className=\"border border-gray-200 rounded-lg p-4 bg-gray-50/50\">\n <dl className=\"grid grid-cols-1 sm:grid-cols-3 gap-3 text-sm\">\n <div>\n <dt className=\"text-gray-500\">Name</dt>\n <dd className=\"font-medium text-gray-900\">{customer.name}</dd>\n </div>\n <div>\n <dt className=\"text-gray-500\">Email</dt>\n <dd className=\"font-medium text-gray-900\">\n <a\n href={`mailto:${customer.email}`}\n className=\"text-blue-600 hover:underline\"\n >\n {customer.email}\n </a>\n </dd>\n </div>\n <div>\n <dt className=\"text-gray-500\">Phone</dt>\n <dd className=\"font-medium text-gray-900\">{customer.phone ?? \"—\"}</dd>\n </div>\n </dl>\n </div>\n </section>\n )}\n </>\n }\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport Link from \"next/link\";\nimport { useRouter } from \"next/navigation\";\nimport { X, Plus } from \"lucide-react\";\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport { formatDateTime, formatDate } from \"@/lib/utils\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"@/components/ui/table\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n} from \"@/components/ui/dialog\";\nimport DetailPageLayout from \"../../components/Admin/DetailPageLayout\";\n\ninterface AddressRef {\n id: number;\n tag: string | null;\n line1: string | null;\n line2: string | null;\n city: string | null;\n state: string | null;\n postalCode: string | null;\n country: string | null;\n}\n\ninterface FormRef {\n id: number;\n name: string;\n}\n\ninterface SubmissionRef {\n id: number;\n formId: number;\n form?: FormRef;\n createdAt: string;\n}\n\ninterface OrderRef {\n id: number;\n orderNumber: string;\n status: string;\n total: number;\n currency: string;\n createdAt: string;\n}\n\ninterface PaymentRef {\n id: number;\n amount: number;\n currency: string;\n status: string;\n createdAt: string;\n}\n\ninterface ContactDetail {\n id: number;\n name: string;\n email: string;\n phone: string | null;\n type: string | null;\n company: string | null;\n taxId: string | null;\n notes: string | null;\n createdAt: string;\n form_submissions?: SubmissionRef[];\n orders?: OrderRef[];\n payments?: PaymentRef[];\n addresses?: AddressRef[];\n summary?: {\n totalOrders: number;\n totalPaid: number;\n lastOrderAt: string | null;\n };\n}\n\nfunction formatMoney(amount: number, currency: string = \"INR\"): string {\n return new Intl.NumberFormat(\"en-IN\", {\n style: \"currency\",\n currency,\n minimumFractionDigits: 2,\n }).format(Number(amount));\n}\n\nfunction formatAddress(a: AddressRef): string {\n const parts = [a.line1, a.line2, a.city, a.state, a.postalCode, a.country].filter(Boolean);\n return parts.join(\", \") || \"—\";\n}\n\nconst ADDRESS_TAGS = [{ value: \"\", label: \"—\" }, { value: \"default\", label: \"Default\" }, { value: \"billing\", label: \"Billing\" }, { value: \"shipping\", label: \"Shipping\" }];\n\nexport default function ContactDetailPage({ contactId }: { contactId: string }) {\n const router = useRouter();\n const [contact, setContact] = useState<ContactDetail | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [addAddressOpen, setAddAddressOpen] = useState(false);\n const [addAddressSaving, setAddAddressSaving] = useState(false);\n const [addAddressForm, setAddAddressForm] = useState({\n tag: \"\",\n line1: \"\",\n line2: \"\",\n city: \"\",\n state: \"\",\n postalCode: \"\",\n country: \"\",\n });\n\n const loadContact = () => {\n fetch(`/api/contacts/${contactId}`)\n .then((res) => (res.ok ? res.json() : null))\n .then((data) => setContact(data))\n .catch(() => setContact(null));\n };\n\n useEffect(() => {\n async function load() {\n try {\n setLoading(true);\n setError(null);\n const res = await fetch(`/api/contacts/${contactId}`);\n if (!res.ok) {\n if (res.status === 404) setError(\"Contact not found\");\n else setError(\"Failed to load\");\n setContact(null);\n return;\n }\n const data = await res.json();\n setContact(data);\n } catch {\n setError(\"Failed to load\");\n setContact(null);\n } finally {\n setLoading(false);\n }\n }\n load();\n }, [contactId]);\n\n const handleAddAddress = async (e: React.FormEvent) => {\n e.preventDefault();\n if (!contactId) return;\n setAddAddressSaving(true);\n try {\n const res = await fetch(\"/api/addresses\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n contactId: Number(contactId),\n tag: addAddressForm.tag || null,\n line1: addAddressForm.line1 || null,\n line2: addAddressForm.line2 || null,\n city: addAddressForm.city || null,\n state: addAddressForm.state || null,\n postalCode: addAddressForm.postalCode || null,\n country: addAddressForm.country || null,\n }),\n });\n if (res.ok) {\n setAddAddressOpen(false);\n setAddAddressForm({ tag: \"\", line1: \"\", line2: \"\", city: \"\", state: \"\", postalCode: \"\", country: \"\" });\n loadContact();\n }\n } finally {\n setAddAddressSaving(false);\n }\n };\n\n if (loading) {\n return (\n <div className=\"rounded-lg bg-white p-6 shadow-md\">\n <div className=\"flex justify-center py-12\">\n <span className=\"text-gray-500\">Loading...</span>\n </div>\n </div>\n );\n }\n\n if (error || !contact) {\n return (\n <div className=\"rounded-lg bg-white p-6 shadow-md\">\n <p className=\"text-red-600\">{error ?? \"Not found\"}</p>\n <Link href=\"/admin/contacts\">\n <Button variant=\"outline\" className=\"mt-4\">\n <X className=\"h-4 w-4 mr-2\" />\n Close\n </Button>\n </Link>\n </div>\n );\n }\n\n const submissions = contact.form_submissions ?? [];\n const orders = contact.orders ?? [];\n const payments = contact.payments ?? [];\n const addresses = contact.addresses ?? [];\n const summary = contact.summary ?? { totalOrders: 0, totalPaid: 0, lastOrderAt: null };\n\n return (\n <div className=\"rounded-lg bg-white shadow-md\">\n <div className=\"bg-gray-800 border-b border-gray-700 px-4 py-2.5 rounded-t-lg\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <h1 className=\"text-base font-semibold text-white\">\n {contact.name}\n </h1>\n <span className=\"text-sm text-gray-400\">{contact.email}</span>\n </div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"inline-flex items-center rounded-md border border-gray-600 bg-transparent px-3 py-1.5 text-xs font-medium text-white hover:bg-gray-700\"\n onClick={() => router.push(\"/admin/contacts\")}\n >\n <X className=\"h-4 w-4 mr-1\" /> Close\n </Button>\n </div>\n </div>\n\n <DetailPageLayout\n main={\n <>\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">\n Contact details\n </h2>\n <div className=\"border border-gray-200 rounded-lg p-4 bg-gray-50/50\">\n <dl className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-3 text-sm\">\n <div>\n <dt className=\"text-gray-500\">Name</dt>\n <dd className=\"font-medium text-gray-900\">{contact.name}</dd>\n </div>\n <div>\n <dt className=\"text-gray-500\">Email</dt>\n <dd className=\"font-medium text-gray-900\">\n <a href={`mailto:${contact.email}`} className=\"text-blue-600 hover:underline\">\n {contact.email}\n </a>\n </dd>\n </div>\n <div>\n <dt className=\"text-gray-500\">Phone</dt>\n <dd className=\"font-medium text-gray-900\">{contact.phone ?? \"—\"}</dd>\n </div>\n {(contact.type ?? contact.company ?? contact.taxId) && (\n <>\n {contact.type && (\n <div>\n <dt className=\"text-gray-500\">Type</dt>\n <dd className=\"font-medium text-gray-900\">{contact.type}</dd>\n </div>\n )}\n {contact.company && (\n <div>\n <dt className=\"text-gray-500\">Company</dt>\n <dd className=\"font-medium text-gray-900\">{contact.company}</dd>\n </div>\n )}\n {contact.taxId && (\n <div>\n <dt className=\"text-gray-500\">Tax ID</dt>\n <dd className=\"font-medium text-gray-900\">{contact.taxId}</dd>\n </div>\n )}\n </>\n )}\n <div>\n <dt className=\"text-gray-500\">Created</dt>\n <dd className=\"font-medium text-gray-900\">{formatDateTime(contact.createdAt)}</dd>\n </div>\n {contact.notes && (\n <div className=\"sm:col-span-2 lg:col-span-4\">\n <dt className=\"text-gray-500\">Notes</dt>\n <dd className=\"font-medium text-gray-900 mt-0.5 whitespace-pre-wrap\">{contact.notes}</dd>\n </div>\n )}\n </dl>\n </div>\n </section>\n\n <section>\n <div className=\"flex items-center justify-between mb-2\">\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider\">\n Addresses\n </h2>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setAddAddressOpen(true)}\n className=\"inline-flex items-center gap-1\"\n >\n <Plus className=\"h-3.5 w-3.5\" /> Add address\n </Button>\n </div>\n <div className=\"border border-gray-200 rounded-lg overflow-hidden\">\n <Table>\n <TableHeader>\n <TableRow className=\"bg-gray-50\">\n <TableHead className=\"font-medium\">Tag</TableHead>\n <TableHead className=\"font-medium\">Address</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {addresses.length === 0 ? (\n <TableRow>\n <TableCell colSpan={2} className=\"py-6 text-center text-gray-500\">\n No addresses. Add one to manage billing and shipping for this contact.\n </TableCell>\n </TableRow>\n ) : (\n addresses.map((a) => (\n <TableRow key={a.id}>\n <TableCell className=\"font-medium\">{a.tag ?? \"—\"}</TableCell>\n <TableCell className=\"text-gray-700\">{formatAddress(a)}</TableCell>\n </TableRow>\n ))\n )}\n </TableBody>\n </Table>\n </div>\n </section>\n </>\n }\n sidebar={\n <>\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">\n Summary\n </h2>\n <div className=\"border border-gray-200 rounded-lg p-4 bg-gray-50/50\">\n <dl className=\"grid grid-cols-1 sm:grid-cols-3 gap-3 text-sm\">\n <div>\n <dt className=\"text-gray-500\">Total orders</dt>\n <dd className=\"font-medium text-gray-900\">{summary.totalOrders}</dd>\n </div>\n <div>\n <dt className=\"text-gray-500\">Total paid</dt>\n <dd className=\"font-medium text-gray-900\">{formatMoney(summary.totalPaid, \"INR\")}</dd>\n </div>\n <div>\n <dt className=\"text-gray-500\">Last order</dt>\n <dd className=\"font-medium text-gray-900\">\n {summary.lastOrderAt ? formatDate(summary.lastOrderAt) : \"—\"}\n </dd>\n </div>\n </dl>\n </div>\n </section>\n\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">\n Submissions\n </h2>\n <div className=\"border border-gray-200 rounded-lg overflow-hidden\">\n <Table>\n <TableHeader>\n <TableRow className=\"bg-gray-50\">\n <TableHead className=\"font-medium\">Form</TableHead>\n <TableHead className=\"font-medium\">Submitted</TableHead>\n <TableHead className=\"font-medium w-20\"></TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {submissions.length === 0 ? (\n <TableRow>\n <TableCell colSpan={3} className=\"py-6 text-center text-gray-500\">\n No submissions\n </TableCell>\n </TableRow>\n ) : (\n submissions.map((s) => (\n <TableRow key={s.id}>\n <TableCell className=\"font-medium\">{s.form?.name ?? `Form #${s.formId}`}</TableCell>\n <TableCell className=\"text-gray-600\">{formatDateTime(s.createdAt)}</TableCell>\n <TableCell>\n <Link\n href={`/admin/form-submissions/${s.id}/view`}\n className=\"text-blue-600 hover:underline text-sm\"\n >\n View\n </Link>\n </TableCell>\n </TableRow>\n ))\n )}\n </TableBody>\n </Table>\n </div>\n </section>\n\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">\n Orders\n </h2>\n <div className=\"border border-gray-200 rounded-lg overflow-hidden\">\n <Table>\n <TableHeader>\n <TableRow className=\"bg-gray-50\">\n <TableHead className=\"font-medium\">Order #</TableHead>\n <TableHead className=\"font-medium\">Total</TableHead>\n <TableHead className=\"font-medium\">Date</TableHead>\n <TableHead className=\"font-medium w-20\"></TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {orders.length === 0 ? (\n <TableRow>\n <TableCell colSpan={4} className=\"py-6 text-center text-gray-500\">\n No orders\n </TableCell>\n </TableRow>\n ) : (\n orders.map((o) => (\n <TableRow key={o.id}>\n <TableCell className=\"font-medium\">{o.orderNumber ?? `#${o.id}`}</TableCell>\n <TableCell className=\"text-gray-600\">{formatMoney(Number(o.total), o.currency)}</TableCell>\n <TableCell className=\"text-gray-600\">{formatDateTime(o.createdAt)}</TableCell>\n <TableCell>\n <Link\n href={`/admin/orders/${o.id}/view`}\n className=\"text-blue-600 hover:underline text-sm\"\n >\n View\n </Link>\n </TableCell>\n </TableRow>\n ))\n )}\n </TableBody>\n </Table>\n </div>\n </section>\n\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">\n Payments\n </h2>\n <div className=\"border border-gray-200 rounded-lg overflow-hidden\">\n <Table>\n <TableHeader>\n <TableRow className=\"bg-gray-50\">\n <TableHead className=\"font-medium\">Amount</TableHead>\n <TableHead className=\"font-medium\">Status</TableHead>\n <TableHead className=\"font-medium\">Date</TableHead>\n <TableHead className=\"font-medium w-20\"></TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {payments.length === 0 ? (\n <TableRow>\n <TableCell colSpan={4} className=\"py-6 text-center text-gray-500\">\n No payments\n </TableCell>\n </TableRow>\n ) : (\n payments.map((p) => (\n <TableRow key={p.id}>\n <TableCell className=\"font-medium\">{formatMoney(Number(p.amount), p.currency)}</TableCell>\n <TableCell className=\"capitalize text-gray-600\">{p.status}</TableCell>\n <TableCell className=\"text-gray-600\">{formatDateTime(p.createdAt)}</TableCell>\n <TableCell>\n <Link\n href={`/admin/payments/${p.id}/view`}\n className=\"text-blue-600 hover:underline text-sm\"\n >\n View\n </Link>\n </TableCell>\n </TableRow>\n ))\n )}\n </TableBody>\n </Table>\n </div>\n </section>\n </>\n }\n />\n\n <Dialog open={addAddressOpen} onOpenChange={setAddAddressOpen}>\n <DialogContent className=\"max-w-md\">\n <DialogHeader>\n <DialogTitle>Add address</DialogTitle>\n </DialogHeader>\n <form onSubmit={handleAddAddress} className=\"space-y-3\">\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">Tag</label>\n <select\n value={addAddressForm.tag}\n onChange={(e) => setAddAddressForm((f) => ({ ...f, tag: e.target.value }))}\n className=\"w-full rounded border border-gray-300 px-3 py-2 text-sm\"\n >\n {ADDRESS_TAGS.map((o) => (\n <option key={o.value || \"empty\"} value={o.value}>{o.label}</option>\n ))}\n </select>\n </div>\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">Line 1</label>\n <Input\n value={addAddressForm.line1}\n onChange={(e) => setAddAddressForm((f) => ({ ...f, line1: e.target.value }))}\n className=\"w-full\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">Line 2</label>\n <Input\n value={addAddressForm.line2}\n onChange={(e) => setAddAddressForm((f) => ({ ...f, line2: e.target.value }))}\n className=\"w-full\"\n />\n </div>\n <div className=\"grid grid-cols-2 gap-2\">\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">City</label>\n <Input\n value={addAddressForm.city}\n onChange={(e) => setAddAddressForm((f) => ({ ...f, city: e.target.value }))}\n className=\"w-full\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">State</label>\n <Input\n value={addAddressForm.state}\n onChange={(e) => setAddAddressForm((f) => ({ ...f, state: e.target.value }))}\n className=\"w-full\"\n />\n </div>\n </div>\n <div className=\"grid grid-cols-2 gap-2\">\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">Postal code</label>\n <Input\n value={addAddressForm.postalCode}\n onChange={(e) => setAddAddressForm((f) => ({ ...f, postalCode: e.target.value }))}\n className=\"w-full\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">Country</label>\n <Input\n value={addAddressForm.country}\n onChange={(e) => setAddAddressForm((f) => ({ ...f, country: e.target.value }))}\n className=\"w-full\"\n />\n </div>\n </div>\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={() => setAddAddressOpen(false)}>\n Cancel\n </Button>\n <Button type=\"submit\" disabled={addAddressSaving}>\n {addAddressSaving ? \"Saving…\" : \"Add address\"}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n </div>\n );\n}\n","'use client';\n\nimport { useState, useEffect, useContext } from 'react';\nimport { useSearchParams } from 'next/navigation';\nimport { Button } from '@/components/ui/button';\nimport { Input } from '@/components/ui/input';\nimport { Switch } from '@/components/ui/switch';\nimport { Label } from '@/components/ui/label';\nimport { toast } from 'sonner';\nimport { Save, RotateCcw } from 'lucide-react';\nimport { AdminConfigContext } from '../admin-config-context';\nimport NavbarEditor from '../../components/Admin/NavbarEditor';\nimport type { NavbarConfig } from '../../theme/types';\n\ntype SettingsTab = 'appearance' | 'navbar' | 'store';\n\ninterface AdminViewSettings {\n primaryColor: string;\n secondaryColor: string;\n compactView: string;\n}\n\nconst DEFAULTS: AdminViewSettings = {\n primaryColor: '#313996',\n secondaryColor: '#6366f1',\n compactView: 'false',\n};\n\nfunction hexToHsl(hex: string): string {\n const r = parseInt(hex.slice(1, 3), 16) / 255;\n const g = parseInt(hex.slice(3, 5), 16) / 255;\n const b = parseInt(hex.slice(5, 7), 16) / 255;\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n const l = (max + min) / 2;\n if (max === min) return `0 0% ${Math.round(l * 100)}%`;\n const d = max - min;\n const s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n let h = 0;\n if (max === r) h = ((g - b) / d + (g < b ? 6 : 0)) / 6;\n else if (max === g) h = ((b - r) / d + 2) / 6;\n else h = ((r - g) / d + 4) / 6;\n return `${Math.round(h * 360)} ${Math.round(s * 100)}% ${Math.round(l * 100)}%`;\n}\n\nexport default function SettingsPage() {\n const searchParams = useSearchParams();\n const tabParam = searchParams.get('tab') as SettingsTab | null;\n const { theme, themeRegistry } = useContext(AdminConfigContext);\n const [tab, setTab] = useState<SettingsTab>(\n tabParam === 'navbar' ? 'navbar' : tabParam === 'store' ? 'store' : 'appearance'\n );\n useEffect(() => {\n if (tabParam === 'navbar') setTab('navbar');\n else if (tabParam === 'store') setTab('store');\n }, [tabParam]);\n\n const [settings, setSettings] = useState<AdminViewSettings>(DEFAULTS);\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n\n const [activeThemeId, setActiveThemeId] = useState('');\n const [navbarConfig, setNavbarConfig] = useState<NavbarConfig>({ logo: '', items: [], ctaLabel: '', ctaUrl: '' });\n const [themeSettingsLoading, setThemeSettingsLoading] = useState(true);\n\n const [storeEnabled, setStoreEnabled] = useState(false);\n const [storeSettingsLoading, setStoreSettingsLoading] = useState(true);\n\n useEffect(() => {\n fetch('/api/settings/admin_view')\n .then((r) => (r.ok ? r.json() : {}))\n .then((data: Record<string, string>) => {\n setSettings({\n primaryColor: data.primaryColor || DEFAULTS.primaryColor,\n secondaryColor: data.secondaryColor || DEFAULTS.secondaryColor,\n compactView: data.compactView || DEFAULTS.compactView,\n });\n })\n .finally(() => setLoading(false));\n }, []);\n\n useEffect(() => {\n fetch('/api/settings/theme')\n .then((r) => (r.ok ? r.json() : null))\n .then((data: Record<string, string> | null) => {\n if (!data) return;\n setActiveThemeId((data.activeThemeId || '').trim());\n if (data.navbar) {\n try { setNavbarConfig(JSON.parse(data.navbar)); } catch {}\n }\n })\n .finally(() => setThemeSettingsLoading(false));\n }, []);\n\n useEffect(() => {\n fetch('/api/settings/store')\n .then((r) => (r.ok ? r.json() : {}))\n .then((data: Record<string, string>) => {\n setStoreEnabled(data.enabled === 'true');\n })\n .finally(() => setStoreSettingsLoading(false));\n }, []);\n\n const handleSaveAppearance = async () => {\n setSaving(true);\n try {\n const body: Record<string, { value: string; type: 'public' | 'private' }> = {\n primaryColor: { value: settings.primaryColor, type: 'public' },\n secondaryColor: { value: settings.secondaryColor, type: 'public' },\n compactView: { value: settings.compactView, type: 'public' },\n };\n const res = await fetch('/api/settings/admin_view', {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n if (!res.ok) throw new Error();\n document.documentElement.style.setProperty('--primary', hexToHsl(settings.primaryColor));\n document.documentElement.style.setProperty('--primary-foreground', '0 0% 100%');\n document.documentElement.style.setProperty('--secondary', hexToHsl(settings.secondaryColor));\n if (settings.compactView === 'true') document.documentElement.classList.add('compact');\n else document.documentElement.classList.remove('compact');\n toast.success('Settings saved');\n } catch {\n toast.error('Failed to save settings');\n } finally {\n setSaving(false);\n }\n };\n\n const handleSelectTheme = async (id: string) => {\n setActiveThemeId(id);\n setSaving(true);\n try {\n await fetch('/api/settings/theme', {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ activeThemeId: { value: id, type: 'public' as const } }),\n });\n toast.success('Theme updated');\n window.location.reload();\n } catch {\n toast.error('Failed to save theme');\n } finally {\n setSaving(false);\n }\n };\n\n const handleSaveNavbar = async () => {\n setSaving(true);\n try {\n await fetch('/api/settings/theme', {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ navbar: { value: JSON.stringify(navbarConfig), type: 'public' } }),\n });\n toast.success('Navbar saved');\n } catch {\n toast.error('Failed to save');\n } finally {\n setSaving(false);\n }\n };\n\n const handleSaveStore = async () => {\n setSaving(true);\n try {\n await fetch('/api/settings/store', {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ enabled: { value: storeEnabled ? 'true' : 'false', type: 'public' } }),\n });\n toast.success('Store settings saved');\n window.location.reload();\n } catch {\n toast.error('Failed to save store settings');\n } finally {\n setSaving(false);\n }\n };\n\n const handleReset = () => setSettings(DEFAULTS);\n\n const tabs: { id: SettingsTab; label: string }[] = [\n { id: 'appearance', label: 'Appearance' },\n { id: 'navbar', label: 'Navbar & pages' },\n { id: 'store', label: 'Store' },\n ];\n\n if (loading) {\n return (\n <div className=\"flex justify-center py-8\">\n <div className=\"animate-spin rounded-full h-6 w-6 border-2 border-gray-300 border-t-gray-600\" />\n <span className=\"ml-2\">Loading...</span>\n </div>\n );\n }\n\n return (\n <div className=\"rounded-lg bg-white shadow-md\">\n <div className=\"bg-gray-800 border-b border-gray-700 px-4 py-2.5 rounded-t-lg\">\n <h1 className=\"text-base font-semibold text-white\">Settings</h1>\n <p className=\"text-xs text-gray-300 mt-0.5\">Appearance, navbar, and store configuration</p>\n </div>\n\n <div className=\"border-b flex\">\n {tabs.map((t) => (\n <button\n key={t.id}\n className={`px-4 py-2.5 text-sm font-medium border-b-2 ${tab === t.id ? 'border-gray-800 text-gray-800 bg-white' : 'border-transparent text-gray-500 hover:text-gray-700'}`}\n onClick={() => setTab(t.id)}\n >\n {t.label}\n </button>\n ))}\n </div>\n\n <div className=\"p-6\">\n {tab === 'appearance' && (\n <div className=\"space-y-10\">\n {/* Site theme – compact cards */}\n {themeRegistry && themeRegistry.length > 0 && (\n <div>\n <h2 className=\"text-xs font-semibold text-gray-500 uppercase tracking-wider mb-3\">Site theme</h2>\n <div className=\"grid grid-cols-4 sm:grid-cols-6 lg:grid-cols-8 gap-2\">\n {themeRegistry.map((t) => {\n const isActive = (activeThemeId || themeRegistry[0]?.id) === t.id;\n return (\n <button\n key={t.id}\n type=\"button\"\n onClick={() => handleSelectTheme(t.id)}\n disabled={saving}\n className={`text-left rounded border p-1.5 transition-colors ${isActive ? 'border-blue-500 bg-blue-50/60 ring-1 ring-blue-500/30' : 'border-gray-200 hover:border-gray-300 bg-white'}`}\n >\n {t.image ? (\n <div className=\"aspect-[4/3] rounded bg-gray-100 mb-1 overflow-hidden\">\n <img src={t.image} alt=\"\" className=\"w-full h-full object-cover\" />\n </div>\n ) : (\n <div className=\"aspect-[4/3] rounded bg-gray-100 mb-1 flex items-center justify-center text-gray-300 text-[10px]\">—</div>\n )}\n <p className=\"font-medium text-gray-900 text-[11px] truncate leading-tight\">{t.label}</p>\n {t.description && <p className=\"text-[10px] text-gray-500 truncate leading-tight mt-0.5\" title={t.description}>{t.description}</p>}\n {isActive && <span className=\"text-[9px] font-medium text-blue-600 uppercase tracking-wide\">Active</span>}\n </button>\n );\n })}\n </div>\n </div>\n )}\n\n {/* Admin appearance – compact */}\n <div className=\"border-t border-gray-100 pt-6\">\n <h2 className=\"text-xs font-semibold text-gray-500 uppercase tracking-wider mb-2\">Admin theme colors</h2>\n <div className=\"flex flex-wrap items-center gap-4\">\n <div className=\"flex items-center gap-2\">\n <Label className=\"text-[11px] text-gray-500 w-14 shrink-0\">Primary</Label>\n <input type=\"color\" value={settings.primaryColor} onChange={(e) => setSettings({ ...settings, primaryColor: e.target.value })} className=\"h-6 w-8 rounded border border-gray-300 cursor-pointer shrink-0\" />\n <Input value={settings.primaryColor} onChange={(e) => setSettings({ ...settings, primaryColor: e.target.value })} className=\"h-7 w-20 font-mono text-[11px]\" maxLength={7} />\n </div>\n <div className=\"flex items-center gap-2\">\n <Label className=\"text-[11px] text-gray-500 w-14 shrink-0\">Secondary</Label>\n <input type=\"color\" value={settings.secondaryColor} onChange={(e) => setSettings({ ...settings, secondaryColor: e.target.value })} className=\"h-6 w-8 rounded border border-gray-300 cursor-pointer shrink-0\" />\n <Input value={settings.secondaryColor} onChange={(e) => setSettings({ ...settings, secondaryColor: e.target.value })} className=\"h-7 w-20 font-mono text-[11px]\" maxLength={7} />\n </div>\n </div>\n </div>\n\n <div className=\"border-t border-gray-100 pt-4\">\n <div className=\"flex items-center gap-2\">\n <Switch checked={settings.compactView === 'true'} onCheckedChange={(c) => setSettings({ ...settings, compactView: c ? 'true' : 'false' })} className=\"scale-90\" />\n <Label className=\"text-[11px] text-gray-600\">Compact view</Label>\n <span className=\"text-[11px] text-gray-400\">Smaller spacing in admin</span>\n </div>\n </div>\n </div>\n )}\n\n {tab === 'navbar' && (\n <div className=\"space-y-6\">\n {themeSettingsLoading ? (\n <div className=\"flex items-center gap-2 text-gray-500\">Loading...</div>\n ) : (\n <>\n <div>\n <h2 className=\"text-lg font-semibold text-gray-900 mb-2\">Navbar & pages</h2>\n <p className=\"text-sm text-gray-500 mb-4\">Set logo and menu items. Use parent/child (indent/outdent) for hierarchy. Each item can link to a page or a custom URL.</p>\n <NavbarEditor config={navbarConfig} onChange={setNavbarConfig} />\n </div>\n <Button onClick={handleSaveNavbar} disabled={saving}>{saving ? 'Saving...' : 'Save navbar'}</Button>\n </>\n )}\n </div>\n )}\n\n {tab === 'store' && (\n <div className=\"space-y-6\">\n {storeSettingsLoading ? (\n <div className=\"flex items-center gap-2 text-gray-500\">Loading...</div>\n ) : (\n <>\n <div>\n <h2 className=\"text-lg font-semibold text-gray-900 mb-2\">Store / E-commerce</h2>\n <p className=\"text-sm text-gray-500 mb-4\">Enable e-commerce functionality to manage products, orders, payments, and more.</p>\n <div className=\"flex items-center gap-3 p-4 bg-gray-50 rounded-lg border border-gray-200\">\n <Switch checked={storeEnabled} onCheckedChange={setStoreEnabled} />\n <div>\n <Label className=\"text-sm font-medium text-gray-700\">Enable Store</Label>\n <p className=\"text-xs text-gray-500\">Shows Store section in sidebar with Products, Orders, Payments, etc.</p>\n </div>\n </div>\n </div>\n <Button onClick={handleSaveStore} disabled={saving}><Save className=\"h-4 w-4 mr-2\" />{saving ? 'Saving...' : 'Save'}</Button>\n </>\n )}\n </div>\n )}\n </div>\n\n {tab === 'appearance' && (\n <div className=\"bg-gray-50 border-t px-6 py-4 flex justify-between rounded-b-lg\">\n <Button variant=\"outline\" onClick={handleReset}><RotateCcw className=\"h-4 w-4 mr-2\" />Reset to defaults</Button>\n <Button onClick={handleSaveAppearance} disabled={saving}><Save className=\"h-4 w-4 mr-2\" />{saving ? 'Saving...' : 'Save'}</Button>\n </div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport React, { useState, useEffect, useCallback, useRef } from 'react';\nimport { Button } from '@/components/ui/button';\nimport { Input } from '@/components/ui/input';\nimport {\n Pagination,\n PaginationContent,\n PaginationItem,\n PaginationPrevious,\n PaginationNext,\n PaginationLink,\n} from '@/components/ui/pagination';\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n} from '@/components/ui/dialog';\nimport { formatDate } from '@/lib/utils';\nimport { Upload, Search, Image as ImageIcon, FileText, Film, File, Copy, Trash2, Edit2 } from 'lucide-react';\nimport { toast } from 'sonner';\n\ninterface MediaItem {\n id: number;\n filename: string;\n url: string;\n mimeType: string;\n size: number;\n alt: string | null;\n isPublic: boolean;\n createdAt: string;\n}\n\nfunction getTypeCategory(mime: string): string {\n if (!mime) return 'other';\n if (mime.startsWith('image/')) return 'image';\n if (mime.startsWith('video/')) return 'video';\n if (mime.startsWith('audio/')) return 'audio';\n if (mime === 'application/pdf' || mime.startsWith('application/')) return 'document';\n return 'other';\n}\n\nfunction getTypeLabel(mime: string): string {\n const c = getTypeCategory(mime);\n const labels: Record<string, string> = {\n image: 'Image',\n video: 'Video',\n audio: 'Audio',\n document: 'Document',\n other: 'Other',\n };\n return labels[c] || 'Other';\n}\n\nfunction TypeIcon({ mimeType }: { mimeType: string }) {\n const c = getTypeCategory(mimeType);\n if (c === 'image') return <ImageIcon className=\"h-8 w-8 text-gray-400\" />;\n if (c === 'video') return <Film className=\"h-8 w-8 text-gray-400\" />;\n if (c === 'document') return <FileText className=\"h-8 w-8 text-gray-400\" />;\n return <File className=\"h-8 w-8 text-gray-400\" />;\n}\n\nfunction groupByMonth(items: MediaItem[]): Record<string, MediaItem[]> {\n const groups: Record<string, MediaItem[]> = {};\n items.forEach((item) => {\n const d = new Date(item.createdAt);\n const key = `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}`;\n const label = d.toLocaleDateString('en-US', { year: 'numeric', month: 'long' });\n if (!groups[label]) groups[label] = [];\n groups[label].push(item);\n });\n return groups;\n}\n\nexport default function MediaLibraryPage() {\n const [data, setData] = useState<MediaItem[]>([]);\n const [loading, setLoading] = useState(true);\n const [page, setPage] = useState(1);\n const [totalPages, setTotalPages] = useState(1);\n const [search, setSearch] = useState('');\n const [searchInput, setSearchInput] = useState('');\n const [typeFilter, setTypeFilter] = useState<string>('');\n const [uploading, setUploading] = useState(false);\n const [editModal, setEditModal] = useState<MediaItem | null>(null);\n const [editAlt, setEditAlt] = useState('');\n const [editPublic, setEditPublic] = useState(false);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const load = useCallback(async () => {\n setLoading(true);\n const params = new URLSearchParams({\n page: String(page),\n limit: '24',\n sortField: 'createdAt',\n sortOrder: 'desc',\n });\n if (search) params.set('search', search);\n if (typeFilter) params.set('type', typeFilter);\n try {\n const res = await fetch(`/api/media?${params}`);\n if (!res.ok) throw new Error('Failed to load');\n const json = await res.json();\n setData(Array.isArray(json.data) ? json.data : []);\n setTotalPages(json.totalPages || 1);\n } catch {\n setData([]);\n setTotalPages(1);\n } finally {\n setLoading(false);\n }\n }, [page, search, typeFilter]);\n\n useEffect(() => {\n load();\n }, [load]);\n\n const handleSearch = () => setSearch(searchInput.trim());\n\n const handleUpload = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n setUploading(true);\n try {\n const formData = new FormData();\n formData.append('file', file);\n const uploadRes = await fetch('/api/upload', { method: 'POST', body: formData });\n const uploadJson = await uploadRes.json();\n if (!uploadRes.ok) throw new Error(uploadJson.error || 'Upload failed');\n const filePath = uploadJson.filePath ?? uploadJson.url;\n if (!filePath) throw new Error('No file path returned');\n const createRes = await fetch('/api/media', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n filename: file.name,\n url: filePath.startsWith('http') ? filePath : filePath,\n mimeType: file.type || 'application/octet-stream',\n size: file.size,\n alt: null,\n isPublic: false,\n }),\n });\n if (!createRes.ok) throw new Error('Failed to create media record');\n toast.success('File uploaded');\n load();\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Upload failed');\n } finally {\n setUploading(false);\n e.target.value = '';\n }\n };\n\n const handleDelete = async (id: number) => {\n if (!confirm('Delete this file?')) return;\n try {\n const res = await fetch(`/api/media/${id}`, { method: 'DELETE' });\n if (!res.ok) throw new Error('Delete failed');\n toast.success('Deleted');\n load();\n } catch {\n toast.error('Delete failed');\n }\n };\n\n const handleSaveEdit = async () => {\n if (!editModal) return;\n try {\n const res = await fetch(`/api/media/${editModal.id}`, {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ alt: editAlt || null, isPublic: editPublic }),\n });\n if (!res.ok) throw new Error('Update failed');\n toast.success('Updated');\n setEditModal(null);\n load();\n } catch {\n toast.error('Update failed');\n }\n };\n\n const copyUrl = (url: string) => {\n const full = url.startsWith('http') ? url : `${typeof window !== 'undefined' ? window.location.origin : ''}${url}`;\n navigator.clipboard.writeText(full);\n toast.success('URL copied');\n };\n\n const openEdit = (item: MediaItem) => {\n setEditModal(item);\n setEditAlt(item.alt || '');\n setEditPublic(item.isPublic);\n };\n\n const grouped = groupByMonth(data);\n const isImage = (mime: string) => getTypeCategory(mime) === 'image';\n\n return (\n <div className=\"rounded-lg bg-white shadow-md\">\n <div className=\"bg-gray-800 border-b border-gray-700 px-4 py-2.5 rounded-t-lg\">\n <h1 className=\"text-base font-semibold text-white\">Media Library</h1>\n <p className=\"text-xs text-gray-300 mt-0.5\">Upload and manage files. Group by type or date.</p>\n </div>\n <div className=\"p-4 space-y-3\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <input\n ref={fileInputRef}\n type=\"file\"\n className=\"hidden\"\n onChange={handleUpload}\n disabled={uploading}\n accept=\"image/*,video/*,audio/*,.pdf,.doc,.docx\"\n />\n <Button\n type=\"button\"\n className=\"flex items-center gap-2\"\n disabled={uploading}\n onClick={() => fileInputRef.current?.click()}\n >\n <Upload className=\"h-4 w-4\" />\n {uploading ? 'Uploading...' : 'Upload'}\n </Button>\n <div className=\"flex items-center gap-2 flex-1 min-w-[200px]\">\n <Input\n placeholder=\"Search by filename...\"\n value={searchInput}\n onChange={(e) => setSearchInput(e.target.value)}\n onKeyDown={(e) => e.key === 'Enter' && handleSearch()}\n />\n <Button variant=\"secondary\" onClick={handleSearch}>\n <Search className=\"h-4 w-4\" />\n </Button>\n </div>\n <select\n className=\"border rounded-md px-3 py-2 text-sm bg-white\"\n value={typeFilter}\n onChange={(e) => setTypeFilter(e.target.value)}\n >\n <option value=\"\">All types</option>\n <option value=\"image\">Images</option>\n <option value=\"video\">Videos</option>\n <option value=\"audio\">Audio</option>\n <option value=\"application\">Documents</option>\n </select>\n </div>\n\n {loading ? (\n <div className=\"flex justify-center py-12\">\n <div className=\"animate-spin rounded-full h-8 w-8 border-2 border-gray-300 border-t-gray-600\" />\n </div>\n ) : data.length === 0 ? (\n <div className=\"text-center py-12 text-gray-500\">No media yet. Upload a file to get started.</div>\n ) : (\n <div className=\"space-y-8\">\n {Object.entries(grouped).map(([monthLabel, items]) => (\n <div key={monthLabel}>\n <h2 className=\"text-sm font-semibold text-gray-500 uppercase tracking-wider mb-3\">{monthLabel}</h2>\n <div className=\"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-6 gap-4\">\n {items.map((item) => (\n <div\n key={item.id}\n className=\"border rounded-lg overflow-hidden bg-gray-50 hover:bg-gray-100 transition-colors group\"\n >\n <div className=\"aspect-square flex items-center justify-center bg-gray-200 relative\">\n {isImage(item.mimeType) ? (\n <img\n src={item.url}\n alt={item.alt || item.filename}\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <TypeIcon mimeType={item.mimeType} />\n )}\n <div className=\"absolute inset-0 bg-black/0 group-hover:bg-black/40 transition-colors flex items-center justify-center gap-1 opacity-0 group-hover:opacity-100\">\n <Button\n size=\"icon\"\n variant=\"secondary\"\n className=\"h-8 w-8\"\n onClick={() => copyUrl(item.url)}\n >\n <Copy className=\"h-3 w-3\" />\n </Button>\n <Button size=\"icon\" variant=\"secondary\" className=\"h-8 w-8\" onClick={() => openEdit(item)}>\n <Edit2 className=\"h-3 w-3\" />\n </Button>\n <Button\n size=\"icon\"\n variant=\"destructive\"\n className=\"h-8 w-8\"\n onClick={() => handleDelete(item.id)}\n >\n <Trash2 className=\"h-3 w-3\" />\n </Button>\n </div>\n </div>\n <div className=\"p-2\">\n <p className=\"text-xs font-medium text-gray-900 truncate\" title={item.filename}>\n {item.filename}\n </p>\n <div className=\"flex items-center justify-between mt-1\">\n <span className=\"text-xs text-gray-500\">{formatDate(item.createdAt)}</span>\n <span className=\"text-xs px-1.5 py-0.5 rounded bg-gray-200 text-gray-600\">\n {getTypeLabel(item.mimeType)}\n </span>\n </div>\n {item.isPublic && (\n <span className=\"text-xs text-green-600 mt-0.5 block\">Public</span>\n )}\n </div>\n </div>\n ))}\n </div>\n </div>\n ))}\n </div>\n )}\n\n {totalPages > 1 && (\n <Pagination className=\"mt-6\">\n <PaginationContent>\n <PaginationItem>\n <PaginationPrevious\n onClick={() => page > 1 && setPage(page - 1)}\n className={page <= 1 ? 'pointer-events-none opacity-50' : 'cursor-pointer'}\n />\n </PaginationItem>\n {Array.from({ length: Math.min(5, totalPages) }, (_, i) => {\n const p = i + 1;\n return (\n <PaginationItem key={p}>\n <PaginationLink onClick={() => setPage(p)} isActive={page === p}>\n {p}\n </PaginationLink>\n </PaginationItem>\n );\n })}\n <PaginationItem>\n <PaginationNext\n onClick={() => page < totalPages && setPage(page + 1)}\n className={page >= totalPages ? 'pointer-events-none opacity-50' : 'cursor-pointer'}\n />\n </PaginationItem>\n </PaginationContent>\n </Pagination>\n )}\n </div>\n\n <Dialog open={!!editModal} onOpenChange={(open) => !open && setEditModal(null)}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Edit media</DialogTitle>\n </DialogHeader>\n {editModal && (\n <div className=\"space-y-4 py-2\">\n <div>\n <label className=\"text-sm font-medium\">Alt text</label>\n <Input\n value={editAlt}\n onChange={(e) => setEditAlt(e.target.value)}\n placeholder=\"Description for accessibility\"\n className=\"mt-1\"\n />\n </div>\n <div className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n id=\"edit-public\"\n checked={editPublic}\n onChange={(e) => setEditPublic(e.target.checked)}\n />\n <label htmlFor=\"edit-public\" className=\"text-sm\">\n Public (visible on site)\n </label>\n </div>\n </div>\n )}\n <DialogFooter>\n <Button variant=\"outline\" onClick={() => setEditModal(null)}>\n Cancel\n </Button>\n <Button onClick={handleSaveEdit}>Save</Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </div>\n );\n}\n","\"use client\";\n\nimport { useState, useEffect, useContext, useCallback, useRef } from \"react\";\nimport { Editor, Frame, Element, useEditor, useNode } from \"@craftjs/core\";\nimport { Input } from \"@/components/ui/input\";\nimport { Button } from \"@/components/ui/button\";\nimport { Label } from \"@/components/ui/label\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { Textarea } from \"@/components/ui/textarea\";\nimport { Save, X, ChevronDown, ChevronRight, LayoutDashboard, Layers, Box, SlidersHorizontal } from \"lucide-react\";\nimport { useRouter } from \"next/navigation\";\nimport ComponentSettings from \"../../components/Admin/ComponentSettings\";\nimport { AdminConfigContext } from \"../admin-config-context\";\nimport { getCatalog, buildResolver } from \"../../theme/registry\";\nimport type { ThemeConfig, ComponentMeta } from \"../../theme/types\";\nimport * as LucideIcons from \"lucide-react\";\n\n/** Wraps a theme component so it is selectable and draggable in the editor (useNode + connect/drag). */\nfunction createSelectable(Comp: React.ComponentType<any>): React.ComponentType<any> {\n function SelectableWrapper(props: any) {\n const { id, connectors, displayName, isHovered } = useNode((node) => ({\n displayName: (node.data?.props?.custom as any)?.displayName || node.data?.displayName || (typeof node.data?.type === \"string\" ? node.data.type : (node.data?.type as any)?.resolvedName) || \"Component\",\n isHovered: node.events.hovered,\n }));\n const { connect, drag } = connectors;\n const isSelected = useEditor((state) => state.events.selected.has(id));\n const borderCls = isSelected ? \"border border-dotted border-blue-500\" : isHovered ? \"border border-dotted border-gray-200\" : \"border border-transparent\";\n return (\n <div\n ref={(ref) => { if (ref) connect(drag(ref)); }}\n className={`min-h-[24px] w-full rounded ${borderCls}`}\n title={displayName}\n >\n <Comp {...props} />\n </div>\n );\n }\n (SelectableWrapper as any).craft = (Comp as any).craft;\n return SelectableWrapper;\n}\n\nfunction buildEditorResolver(theme: ThemeConfig): Record<string, React.ComponentType<any>> {\n const base = buildResolver(theme);\n const resolver: Record<string, React.ComponentType<any>> = {};\n for (const [name, Comp] of Object.entries(base)) {\n resolver[name] = createSelectable(Comp);\n }\n return resolver;\n}\n\nfunction getIcon(name: string) {\n const Icon = (LucideIcons as any)[name];\n return Icon || LucideIcons.Box;\n}\n\nfunction DraggableCatalogItem({\n meta,\n Comp,\n connectors,\n Icon,\n description,\n}: {\n meta: ComponentMeta;\n Comp: React.ComponentType<any>;\n connectors: ReturnType<typeof useEditor>[\"connectors\"];\n Icon: React.ComponentType<{ className?: string }>;\n description?: string;\n}) {\n const elRef = useRef<HTMLDivElement>(null);\n useEffect(() => {\n if (!elRef.current) return;\n if (meta.canContainChildren) {\n connectors.create(\n elRef.current,\n React.createElement(Element, { is: Comp, canvas: true, ...meta.defaultProps })\n );\n } else {\n connectors.create(elRef.current, React.createElement(Comp, meta.defaultProps));\n }\n }, [connectors, Comp, meta.defaultProps, meta.name, meta.canContainChildren]);\n return (\n <div\n ref={elRef}\n className=\"mx-2 mb-1 px-2 py-1.5 rounded cursor-grab hover:bg-gray-100 flex items-center gap-2\"\n title={description}\n >\n <Icon className=\"h-4 w-4 text-gray-500\" />\n <span className=\"text-sm text-gray-700\">{meta.label}</span>\n </div>\n );\n}\n\ntype RightTab = \"designer\" | \"seo\";\n\nfunction ComponentPickerContent({ theme, resolver }: { theme: ThemeConfig; resolver: Record<string, React.ComponentType<any>> }) {\n const { connectors } = useEditor();\n const catalog = getCatalog(theme);\n const [collapsed, setCollapsed] = useState<Record<string, boolean>>({});\n\n const toggleCategory = (cat: string) => {\n setCollapsed((prev) => ({ ...prev, [cat]: !prev[cat] }));\n };\n\n return (\n <div>\n {catalog.map(({ category, components }) => (\n <div key={category}>\n <button\n className=\"w-full px-3 py-2 flex items-center justify-between text-xs font-medium text-gray-600 hover:bg-gray-50\"\n onClick={() => toggleCategory(category)}\n >\n <span className=\"capitalize\">{category}</span>\n {collapsed[category] ? (\n <ChevronRight className=\"h-3 w-3\" />\n ) : (\n <ChevronDown className=\"h-3 w-3\" />\n )}\n </button>\n {!collapsed[category] && (\n <div className=\"pb-1\">\n {components.map((meta) => {\n const Comp = resolver[meta.name];\n if (!Comp) return null;\n const Icon = getIcon(meta.icon);\n return (\n <DraggableCatalogItem\n key={meta.name}\n meta={meta}\n Comp={Comp}\n connectors={connectors}\n Icon={Icon}\n description={meta.description}\n />\n );\n })}\n </div>\n )}\n </div>\n ))}\n </div>\n );\n}\n\nfunction PropertiesPanelContent({ theme }: { theme: ThemeConfig }) {\n const { selected, actions } = useEditor((state) => {\n const selectedIds = Array.from(state.events.selected);\n const id = selectedIds[0];\n if (!id) return { selected: null };\n const node = state.nodes[id];\n if (!node?.data) return { selected: null };\n const type = node.data.type;\n const resolvedName =\n typeof type === \"string\" ? type : (type as any)?.resolvedName ?? (node.data as any).name ?? \"\";\n return {\n selected: {\n id,\n props: node.data.props || {},\n resolvedName: String(resolvedName || \"\").trim(),\n name: node.data.displayName || resolvedName,\n },\n };\n });\n\n if (!selected) {\n return (\n <div className=\"py-4 px-2.5 text-[11px] text-gray-400 text-center\">\n Select a component to edit properties.\n </div>\n );\n }\n\n const themeComponent = theme.components.find(\n (c) =>\n c.meta.name === selected.resolvedName ||\n c.meta.label === selected.resolvedName ||\n (selected.name && c.meta.label === selected.name) ||\n (selected.name && c.meta.name === selected.name)\n );\n\n if (!themeComponent?.meta?.props?.length) {\n return (\n <div className=\"py-4 px-2.5 text-[11px] text-gray-400 text-center\">\n No configurable properties for this component.\n </div>\n );\n }\n\n const handleChange = (propName: string, value: any) => {\n actions.setProp(selected.id, (p: any) => {\n p[propName] = value;\n });\n };\n\n return (\n <div className=\"py-2 px-2.5\">\n <ComponentSettings\n meta={themeComponent.meta}\n values={selected.props}\n onChange={handleChange}\n />\n </div>\n );\n}\n\nfunction LayoutPanelContent() {\n const { selected, actions, isDeletable } = useEditor((state, q) => {\n const selectedIds = Array.from(state.events.selected);\n const id = selectedIds[0];\n if (!id) return { selected: null, isDeletable: false };\n const node = state.nodes[id];\n if (!node?.data) return { selected: null, isDeletable: false };\n const type = node.data.type;\n const resolvedName =\n typeof type === \"string\" ? type : (type as any)?.resolvedName ?? (node.data as any).name ?? \"\";\n return {\n selected: {\n id,\n props: node.data.props || {},\n resolvedName: String(resolvedName || \"\").trim(),\n name: node.data.displayName || resolvedName,\n },\n isDeletable: q.node(id).isDeletable(),\n };\n });\n\n if (!selected) {\n return (\n <div className=\"py-4 px-2.5 text-[11px] text-gray-400 text-center\">\n Select a component to edit layout.\n </div>\n );\n }\n\n const props = selected.props as Record<string, any>;\n const setLayoutProp = (key: string, value: string | number | boolean) => {\n actions.setProp(selected.id, (p: any) => {\n p[key] = value;\n });\n };\n\n const layoutProps = {\n width: props.width ?? \"\",\n height: props.height ?? \"\",\n margin: props.margin ?? \"\",\n padding: props.padding ?? \"\",\n borderRadius: props.borderRadius ?? \"\",\n boxShadow: props.boxShadow ?? \"\",\n flexDirection: (props.flexDirection ?? \"column\") as string,\n alignItems: (props.alignItems ?? \"flex-start\") as string,\n justifyContent: (props.justifyContent ?? \"flex-start\") as string,\n flexFill: props.flexFill ?? false,\n };\n\n const fieldCls = \"flex items-center gap-2 min-h-[28px]\";\n const labelCls = \"text-[11px] text-gray-500 font-medium w-14 shrink-0\";\n const inputCls = \"h-7 text-xs flex-1 min-w-0 rounded border border-input bg-background px-2\";\n const selectCls = \"h-7 w-full text-xs rounded border border-input bg-background px-2\";\n\n return (\n <div className=\"py-2 px-2.5 space-y-4\">\n <section className=\"space-y-1.5\">\n <div className=\"text-[10px] font-medium text-gray-400 uppercase tracking-wider px-0.5\">Dimensions</div>\n <div className=\"grid grid-cols-2 gap-x-2 gap-y-1.5\">\n <div className={fieldCls}>\n <Label className={labelCls}>W</Label>\n <Input value={layoutProps.width} onChange={(e) => setLayoutProp(\"width\", e.target.value)} placeholder=\"100%\" className={inputCls} />\n </div>\n <div className={fieldCls}>\n <Label className={labelCls}>H</Label>\n <Input value={layoutProps.height} onChange={(e) => setLayoutProp(\"height\", e.target.value)} placeholder=\"auto\" className={inputCls} />\n </div>\n </div>\n </section>\n\n <section className=\"space-y-1.5 border-t border-gray-100 pt-3\">\n <div className=\"text-[10px] font-medium text-gray-400 uppercase tracking-wider px-0.5\">Spacing</div>\n <div className=\"grid grid-cols-2 gap-x-2 gap-y-1.5\">\n <div className={fieldCls}>\n <Label className={labelCls}>Margin</Label>\n <Input value={layoutProps.margin} onChange={(e) => setLayoutProp(\"margin\", e.target.value)} placeholder=\"0\" className={inputCls} />\n </div>\n <div className={fieldCls}>\n <Label className={labelCls}>Padding</Label>\n <Input value={layoutProps.padding} onChange={(e) => setLayoutProp(\"padding\", e.target.value)} placeholder=\"0\" className={inputCls} />\n </div>\n </div>\n </section>\n\n <section className=\"space-y-1.5 border-t border-gray-100 pt-3\">\n <div className=\"text-[10px] font-medium text-gray-400 uppercase tracking-wider px-0.5\">Decoration</div>\n <div className=\"grid grid-cols-2 gap-x-2 gap-y-1.5\">\n <div className={fieldCls}>\n <Label className={labelCls}>Radius</Label>\n <Input value={layoutProps.borderRadius} onChange={(e) => setLayoutProp(\"borderRadius\", e.target.value)} placeholder=\"0\" className={inputCls} />\n </div>\n <div className={fieldCls}>\n <Label className={labelCls}>Shadow</Label>\n <Input value={layoutProps.boxShadow} onChange={(e) => setLayoutProp(\"boxShadow\", e.target.value)} placeholder=\"none\" className={inputCls} />\n </div>\n </div>\n </section>\n\n <section className=\"space-y-1.5 border-t border-gray-100 pt-3\">\n <div className=\"text-[10px] font-medium text-gray-400 uppercase tracking-wider px-0.5\">Alignment</div>\n <div className=\"space-y-1.5\">\n <div className={fieldCls}>\n <Label className={labelCls}>Direction</Label>\n <select value={layoutProps.flexDirection} onChange={(e) => setLayoutProp(\"flexDirection\", e.target.value)} className={selectCls}>\n <option value=\"row\">Row</option>\n <option value=\"column\">Column</option>\n <option value=\"row-reverse\">Row reverse</option>\n <option value=\"column-reverse\">Column reverse</option>\n </select>\n </div>\n <div className={fieldCls}>\n <Label className={labelCls}>Align</Label>\n <select value={layoutProps.alignItems} onChange={(e) => setLayoutProp(\"alignItems\", e.target.value)} className={selectCls}>\n <option value=\"flex-start\">Start</option>\n <option value=\"center\">Center</option>\n <option value=\"flex-end\">End</option>\n <option value=\"stretch\">Stretch</option>\n </select>\n </div>\n <div className={fieldCls}>\n <Label className={labelCls}>Justify</Label>\n <select value={layoutProps.justifyContent} onChange={(e) => setLayoutProp(\"justifyContent\", e.target.value)} className={selectCls}>\n <option value=\"flex-start\">Start</option>\n <option value=\"center\">Center</option>\n <option value=\"flex-end\">End</option>\n <option value=\"space-between\">Between</option>\n <option value=\"space-around\">Around</option>\n </select>\n </div>\n <div className=\"flex items-center gap-2 h-7 px-0.5\">\n <input type=\"checkbox\" id=\"flexFill\" checked={!!layoutProps.flexFill} onChange={(e) => setLayoutProp(\"flexFill\", e.target.checked)} className=\"rounded border-gray-300 h-3.5 w-3.5\" />\n <Label htmlFor=\"flexFill\" className=\"text-[11px] text-gray-500\">Fill space</Label>\n </div>\n </div>\n </section>\n\n {isDeletable && (\n <div className=\"border-t border-gray-100 pt-3\">\n <Button type=\"button\" variant=\"outline\" size=\"sm\" className=\"w-full h-7 text-[11px] text-red-600 border-red-200 hover:bg-red-50 hover:text-red-700\" onClick={() => actions.delete(selected.id)}>\n Delete\n </Button>\n </div>\n )}\n </div>\n );\n}\n\nfunction LayersPanelContent() {\n const { connectors } = useEditor();\n const { nodes, selectedSet } = useEditor((state) => ({\n nodes: state.nodes,\n selectedSet: state.events.selected,\n }));\n const [expanded, setExpanded] = useState<Record<string, boolean>>({});\n\n const nodeMap = (nodes || {}) as Record<string, any>;\n const rootId = (() => {\n const ids = Object.keys(nodeMap);\n const childIds = new Set<string>();\n ids.forEach((id) => {\n const node = nodeMap[id];\n const children = node?.data?.nodes || [];\n children.forEach((cid: string) => childIds.add(cid));\n });\n return ids.find((id) => !childIds.has(id)) || ids[0] || null;\n })();\n\n const selectedIds = Array.from(selectedSet ?? []);\n const toggleExpanded = (id: string) => {\n setExpanded((prev) => ({ ...prev, [id]: !prev[id] }));\n };\n\n const getDisplayName = (node: any) => {\n if (!node) return \"Node\";\n const type = node.data?.type;\n const name = typeof type === \"string\" ? type : type?.resolvedName;\n const custom = node.data?.props?.custom;\n return (custom as any)?.displayName || node.data?.displayName || name || \"Element\";\n };\n\n const getChildIds = (node: any) => node?.data?.nodes || [];\n\n function LayerRow({ nodeId, depth }: { nodeId: string; depth: number }) {\n const node = nodeMap[nodeId];\n if (!node) return null;\n const childIds = getChildIds(node);\n const hasChildren = childIds.length > 0;\n const isExpanded = expanded[nodeId] !== false;\n const isSelected = selectedIds.includes(nodeId);\n const displayName = getDisplayName(node);\n\n return (\n <div key={nodeId} className=\"flex flex-col\">\n <div\n ref={(ref) => { if (ref) connectors.select(ref, nodeId); }}\n className={`flex items-center gap-1 py-1 px-2 cursor-pointer text-xs rounded min-h-[24px] ${\n isSelected ? \"bg-blue-100 text-blue-800\" : \"hover:bg-gray-100 text-gray-700\"\n }`}\n style={{ paddingLeft: `${depth * 12 + 8}px` }}\n >\n <button\n type=\"button\"\n className=\"p-0 border-0 bg-transparent cursor-pointer flex items-center\"\n onClick={(e) => {\n e.stopPropagation();\n toggleExpanded(nodeId);\n }}\n aria-label={hasChildren ? (isExpanded ? \"Collapse\" : \"Expand\") : undefined}\n >\n {hasChildren ? (\n isExpanded ? (\n <ChevronDown className=\"h-3 w-3 text-gray-500\" />\n ) : (\n <ChevronRight className=\"h-3 w-3 text-gray-500\" />\n )\n ) : (\n <span className=\"w-3\" />\n )}\n </button>\n <span className=\"truncate flex-1\">{displayName}</span>\n </div>\n {hasChildren && isExpanded && (\n <div>\n {childIds.map((cid) => (\n <LayerRow key={cid} nodeId={cid} depth={depth + 1} />\n ))}\n </div>\n )}\n </div>\n );\n }\n\n if (!rootId) {\n return (\n <div className=\"p-3 text-xs text-gray-400\">\n Add components to the canvas to see layers.\n </div>\n );\n }\n\n return (\n <div className=\"py-1 max-h-[200px] overflow-y-auto\">\n <LayerRow nodeId={rootId} depth={0} />\n </div>\n );\n}\n\ninterface SeoTabProps {\n seoTitle: string; setSeoTitle: (v: string) => void;\n seoDescription: string; setSeoDescription: (v: string) => void;\n seoKeywords: string; setSeoKeywords: (v: string) => void;\n seoOgTitle: string; setSeoOgTitle: (v: string) => void;\n seoOgDescription: string; setSeoOgDescription: (v: string) => void;\n seoOgImage: string; setSeoOgImage: (v: string) => void;\n}\n\nfunction SeoTabContent(props: SeoTabProps) {\n return (\n <div className=\"p-4 space-y-3\">\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs\">SEO Title</Label>\n <Input value={props.seoTitle} onChange={(e) => props.setSeoTitle(e.target.value)} placeholder=\"SEO title\" />\n </div>\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs\">Meta Description</Label>\n <Textarea value={props.seoDescription} onChange={(e) => props.setSeoDescription(e.target.value)} placeholder=\"Page description for search engines\" rows={3} />\n </div>\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs\">Keywords</Label>\n <Input value={props.seoKeywords} onChange={(e) => props.setSeoKeywords(e.target.value)} placeholder=\"keyword1, keyword2\" />\n </div>\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs\">OG Title</Label>\n <Input value={props.seoOgTitle} onChange={(e) => props.setSeoOgTitle(e.target.value)} placeholder=\"Open Graph title\" />\n </div>\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs\">OG Description</Label>\n <Textarea value={props.seoOgDescription} onChange={(e) => props.setSeoOgDescription(e.target.value)} placeholder=\"Open Graph description\" rows={2} />\n </div>\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs\">OG Image</Label>\n <Input value={props.seoOgImage} onChange={(e) => props.setSeoOgImage(e.target.value)} placeholder=\"https://...\" />\n </div>\n </div>\n );\n}\n\nfunction CollapsibleSection({\n title,\n icon: Icon,\n open,\n onToggle,\n children,\n}: {\n title: string;\n icon: React.ComponentType<{ className?: string }>;\n open: boolean;\n onToggle: () => void;\n children: React.ReactNode;\n}) {\n return (\n <div className=\"flex-shrink-0 border-t border-gray-100\">\n <button\n type=\"button\"\n className=\"w-full px-2.5 py-1.5 flex items-center justify-between text-[11px] font-medium text-gray-600 hover:bg-gray-50/80\"\n onClick={onToggle}\n >\n <span className=\"flex items-center gap-1.5\">\n <Icon className=\"h-3 w-3 text-gray-400\" />\n {title}\n </span>\n {open ? <ChevronDown className=\"h-3 w-3 text-gray-400\" /> : <ChevronRight className=\"h-3 w-3 text-gray-400\" />}\n </button>\n {open && <div className=\"bg-white\">{children}</div>}\n </div>\n );\n}\n\nfunction RightSidebar({ theme, resolver, activeTab, setActiveTab, seoProps }: { theme: ThemeConfig; resolver: Record<string, React.ComponentType<any>>; activeTab: RightTab; setActiveTab: (t: RightTab) => void; seoProps: SeoTabProps }) {\n const [componentsOpen, setComponentsOpen] = useState(true);\n const [propertiesOpen, setPropertiesOpen] = useState(true);\n const [layoutOpen, setLayoutOpen] = useState(true);\n const [layersOpen, setLayersOpen] = useState(true);\n\n return (\n <div className=\"flex flex-col flex-1 overflow-hidden\">\n <div className=\"flex border-b flex-shrink-0\">\n {([\"designer\", \"seo\"] as RightTab[]).map((tab) => (\n <button\n key={tab}\n className={`flex-1 px-2 py-2 text-xs font-medium border-b-2 capitalize ${\n activeTab === tab\n ? \"border-gray-800 text-gray-800\"\n : \"border-transparent text-gray-500 hover:text-gray-700\"\n }`}\n onClick={() => setActiveTab(tab)}\n >\n {tab === \"designer\" ? \"Designer\" : \"Seo\"}\n </button>\n ))}\n </div>\n <div className=\"flex-1 overflow-y-auto flex flex-col min-h-0\">\n {activeTab === \"designer\" && (\n <>\n <CollapsibleSection\n title=\"Components\"\n icon={Box}\n open={componentsOpen}\n onToggle={() => setComponentsOpen((o) => !o)}\n >\n <ComponentPickerContent theme={theme} resolver={resolver} />\n </CollapsibleSection>\n <CollapsibleSection\n title=\"Properties\"\n icon={SlidersHorizontal}\n open={propertiesOpen}\n onToggle={() => setPropertiesOpen((o) => !o)}\n >\n <PropertiesPanelContent theme={theme} />\n </CollapsibleSection>\n <CollapsibleSection\n title=\"Layout\"\n icon={LayoutDashboard}\n open={layoutOpen}\n onToggle={() => setLayoutOpen((o) => !o)}\n >\n <LayoutPanelContent />\n </CollapsibleSection>\n <CollapsibleSection\n title=\"Layers\"\n icon={Layers}\n open={layersOpen}\n onToggle={() => setLayersOpen((o) => !o)}\n >\n <LayersPanelContent />\n </CollapsibleSection>\n </>\n )}\n {activeTab === \"seo\" && <SeoTabContent {...seoProps} />}\n </div>\n </div>\n );\n}\n\nfunction SaveButton({ pageId, pageData, onSaved, children, className }: { pageId?: string; pageData: { title: string; slug: string; published: boolean; seoTitle: string; seoDescription: string; seoKeywords: string; seoOgTitle: string; seoOgDescription: string; seoOgImage: string }; onSaved: (id: string) => void; children: React.ReactNode; className?: string }) {\n const { query } = useEditor();\n const [saving, setSaving] = useState(false);\n\n const handleSave = async () => {\n setSaving(true);\n try {\n const content = JSON.parse(query.serialize());\n\n let seoId: number | null = null;\n const hasSeo = pageData.seoTitle || pageData.seoDescription || pageData.seoKeywords;\n if (hasSeo) {\n const seoPayload = {\n title: pageData.seoTitle,\n description: pageData.seoDescription,\n keywords: pageData.seoKeywords,\n ogTitle: pageData.seoOgTitle,\n ogDescription: pageData.seoOgDescription,\n ogImage: pageData.seoOgImage,\n slug: pageData.slug,\n };\n const seoRes = await fetch(\"/api/seos\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(seoPayload),\n });\n if (seoRes.ok) {\n const seoData = await seoRes.json();\n seoId = seoData.id;\n }\n }\n\n const payload: Record<string, any> = {\n title: pageData.title,\n slug: pageData.slug,\n content,\n published: pageData.published,\n };\n if (seoId) payload.seoId = seoId;\n\n const url = pageId ? `/api/pages/${pageId}` : \"/api/pages\";\n const method = pageId ? \"PUT\" : \"POST\";\n const res = await fetch(url, {\n method,\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n });\n\n if (res.ok) {\n const saved = await res.json();\n onSaved(saved.id?.toString() || pageId || \"\");\n }\n } finally {\n setSaving(false);\n }\n };\n\n return (\n <Button\n onClick={handleSave}\n disabled={saving}\n size=\"sm\"\n className={className}\n >\n {saving ? \"Saving...\" : children}\n </Button>\n );\n}\n\nimport React from \"react\";\n\ninterface PageBuilderPageProps {\n pageId?: string;\n}\n\nexport default function PageBuilderPage({ pageId }: PageBuilderPageProps) {\n const { theme } = useContext(AdminConfigContext);\n const router = useRouter();\n\n const [title, setTitle] = useState(\"\");\n const [slug, setSlug] = useState(\"\");\n const [published, setPublished] = useState(false);\n const [initialContent, setInitialContent] = useState<string | null>(null);\n const [loading, setLoading] = useState(!!pageId);\n const [rightTab, setRightTab] = useState<RightTab>(\"designer\");\n\n const [seoTitle, setSeoTitle] = useState(\"\");\n const [seoDescription, setSeoDescription] = useState(\"\");\n const [seoKeywords, setSeoKeywords] = useState(\"\");\n const [seoOgTitle, setSeoOgTitle] = useState(\"\");\n const [seoOgDescription, setSeoOgDescription] = useState(\"\");\n const [seoOgImage, setSeoOgImage] = useState(\"\");\n\n useEffect(() => {\n if (!pageId) {\n setInitialContent(null);\n setLoading(false);\n return;\n }\n fetch(`/api/pages/${pageId}`)\n .then((r) => (r.ok ? r.json() : null))\n .then((data) => {\n if (data) {\n setTitle(data.title || \"\");\n setSlug(data.slug || \"\");\n setPublished(data.published || false);\n if (data.content) {\n setInitialContent(JSON.stringify(data.content));\n }\n if (data.seo) {\n setSeoTitle(data.seo.title || \"\");\n setSeoDescription(data.seo.description || \"\");\n setSeoKeywords(data.seo.keywords || \"\");\n setSeoOgTitle(data.seo.ogTitle || \"\");\n setSeoOgDescription(data.seo.ogDescription || \"\");\n setSeoOgImage(data.seo.ogImage || \"\");\n }\n }\n })\n .finally(() => setLoading(false));\n }, [pageId]);\n\n useEffect(() => {\n if (title && !slug) {\n setSlug(\n title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/(^-|-$)/g, \"\")\n );\n }\n }, [title, slug]);\n\n if (!theme) {\n return (\n <div className=\"flex items-center justify-center min-h-[50vh]\">\n <p className=\"text-gray-500\">No theme configured. Please set up a theme in your admin layout.</p>\n </div>\n );\n }\n\n if (loading) {\n return (\n <div className=\"flex items-center justify-center py-12\">\n <div className=\"animate-spin rounded-full h-6 w-6 border-2 border-gray-300 border-t-gray-600\" />\n <span className=\"ml-2\">Loading...</span>\n </div>\n );\n }\n\n const resolver = buildEditorResolver(theme);\n\n return (\n <Editor resolver={resolver} enabled={true}>\n <div className=\"rounded-lg bg-white shadow-md\">\n {/* Header */}\n <div className=\"bg-gray-800 border-b border-gray-700 px-4 py-2.5 rounded-t-lg\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-xl font-bold text-white\">\n {pageId ? \"Edit Page\" : \"Create New Page\"}\n </h1>\n <p className=\"text-xs text-gray-300 mt-0.5\">\n {pageId ? \"Update page content\" : \"Build a new page with drag-and-drop\"}\n </p>\n </div>\n <div className=\"flex items-center space-x-3\">\n <div className=\"flex items-center gap-2\">\n <Switch\n checked={published}\n onCheckedChange={setPublished}\n className=\"data-[state=checked]:bg-green-500\"\n />\n <span className=\"text-xs text-gray-300\">Published</span>\n </div>\n <SaveButton\n pageId={pageId}\n pageData={{ title, slug, published, seoTitle, seoDescription, seoKeywords, seoOgTitle, seoOgDescription, seoOgImage }}\n onSaved={(id) => { if (!pageId) router.replace(`/admin/pages/${id}`); }}\n className=\"flex items-center bg-white text-gray-800 hover:bg-gray-100 border-0 text-xs\"\n >\n <Save className=\"h-4 w-4 mr-1\" /> Save\n </SaveButton>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"flex items-center bg-white text-gray-800 hover:bg-gray-100 border-0 text-xs\"\n onClick={() => router.push(\"/admin/pages\")}\n >\n <X className=\"h-4 w-4 mr-1\" /> Close\n </Button>\n </div>\n </div>\n </div>\n\n {/* Content */}\n <div className=\"p-6\">\n <div className=\"flex w-full gap-6\">\n {/* LEFT COLUMN - Canvas */}\n <div className=\"flex w-3/4 flex-col gap-4\">\n <div>\n <label className=\"block text-sm font-semibold text-gray-700 mb-2\">Page Content</label>\n <div className=\"border rounded-md bg-gray-50 min-h-[500px]\">\n {initialContent ? (\n <Frame data={initialContent} />\n ) : (\n <Frame>\n <Element canvas is=\"div\" className=\"p-4 min-h-[500px]\">\n </Element>\n </Frame>\n )}\n </div>\n </div>\n </div>\n\n {/* RIGHT COLUMN - Sidebar */}\n <div className=\"flex w-1/4 flex-col gap-0 rounded-lg bg-gray-50 border overflow-hidden\">\n <div className=\"p-3 border-b bg-white rounded-t-lg\">\n <div className=\"text-xs font-semibold text-gray-500 uppercase tracking-wide mb-2\">Page</div>\n <div className=\"space-y-2\">\n <div>\n <label className=\"block text-xs font-medium text-gray-600 mb-1\">Title *</label>\n <Input\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n placeholder=\"Page title\"\n className=\"h-8 text-sm\"\n />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-gray-600 mb-1\">Slug *</label>\n <Input\n value={slug}\n onChange={(e) => setSlug(e.target.value)}\n placeholder=\"page-url-slug\"\n className=\"h-8 text-sm\"\n />\n </div>\n </div>\n </div>\n <RightSidebar\n theme={theme}\n resolver={resolver}\n activeTab={rightTab}\n setActiveTab={setRightTab}\n seoProps={{ seoTitle, setSeoTitle, seoDescription, setSeoDescription, seoKeywords, setSeoKeywords, seoOgTitle, setSeoOgTitle, seoOgDescription, setSeoOgDescription, seoOgImage, setSeoOgImage }}\n />\n </div>\n </div>\n </div>\n </div>\n </Editor>\n );\n}\n","import type { ThemeConfig, ThemeComponent, ComponentMeta } from './types';\n\nexport function createTheme(config: ThemeConfig): ThemeConfig {\n const names = config.components.map((c) => c.meta.name);\n const duplicates = names.filter((n, i) => names.indexOf(n) !== i);\n if (duplicates.length) {\n throw new Error(`Duplicate component names in theme \"${config.name}\": ${duplicates.join(', ')}`);\n }\n return Object.freeze(config) as ThemeConfig;\n}\n\nexport function buildResolver(theme: ThemeConfig): Record<string, React.ComponentType<any>> {\n const resolver: Record<string, React.ComponentType<any>> = {};\n for (const { meta, component } of theme.components) {\n resolver[meta.name] = component;\n }\n return resolver;\n}\n\nexport interface CatalogGroup {\n category: string;\n components: ComponentMeta[];\n}\n\nexport function getCatalog(theme: ThemeConfig): CatalogGroup[] {\n const groups = new Map<string, ComponentMeta[]>();\n for (const { meta } of theme.components) {\n const list = groups.get(meta.category) || [];\n list.push(meta);\n groups.set(meta.category, list);\n }\n return Array.from(groups.entries()).map(([category, components]) => ({\n category,\n components,\n }));\n}\n","'use client';\n\nimport { useContext } from 'react';\nimport { HardDrive, Mail, CreditCard, Puzzle, CheckCircle2, XCircle } from 'lucide-react';\nimport { AdminConfigContext } from '../admin-config-context';\nimport type { PluginDescriptor } from '../admin-config-context';\n\nconst ICON_MAP: Record<string, React.ComponentType<{ className?: string }>> = {\n storage: HardDrive,\n email: Mail,\n payment: CreditCard,\n};\n\nfunction PluginIcon({ descriptor }: { descriptor: PluginDescriptor }) {\n const Icon = descriptor.icon ? ICON_MAP[descriptor.icon] ?? Puzzle : Puzzle;\n return (\n <div className=\"flex h-11 w-11 shrink-0 items-center justify-center rounded-lg bg-gray-100 text-gray-600 dark:bg-gray-700 dark:text-gray-300\">\n <Icon className=\"h-5 w-5\" />\n </div>\n );\n}\n\nexport default function PluginsPage() {\n const { pluginDescriptors = [] } = useContext(AdminConfigContext);\n\n return (\n <div className=\"space-y-6\">\n <div>\n <h1 className=\"text-xl font-semibold text-gray-900 dark:text-white\">Plugins</h1>\n <p className=\"mt-0.5 text-sm text-gray-500 dark:text-gray-400\">\n Registered plugins and their status\n </p>\n </div>\n\n {pluginDescriptors.length === 0 ? (\n <div className=\"rounded-xl border border-gray-200 bg-white p-8 text-center dark:border-gray-700 dark:bg-gray-800\">\n <Puzzle className=\"mx-auto h-10 w-10 text-gray-400\" />\n <p className=\"mt-3 text-sm text-gray-500 dark:text-gray-400\">\n No plugins registered. Add plugin descriptors to your app admin layout.\n </p>\n </div>\n ) : (\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {pluginDescriptors.map((p) => {\n const enabled = p.enabled !== false;\n return (\n <div\n key={p.name}\n className=\"flex flex-col rounded-xl border border-gray-200 bg-white shadow-sm transition-shadow hover:shadow dark:border-gray-700 dark:bg-gray-800\"\n >\n <div className=\"flex items-start gap-4 p-5\">\n <PluginIcon descriptor={p} />\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center justify-between gap-2\">\n <h2 className=\"font-medium text-gray-900 dark:text-white\">\n {p.label || p.name}\n </h2>\n <span\n className={`inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs font-medium ${\n enabled\n ? 'bg-emerald-50 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-400'\n : 'bg-gray-100 text-gray-600 dark:bg-gray-700 dark:text-gray-400'\n }`}\n >\n {enabled ? (\n <CheckCircle2 className=\"h-3.5 w-3.5\" />\n ) : (\n <XCircle className=\"h-3.5 w-3.5\" />\n )}\n {enabled ? 'Enabled' : 'Disabled'}\n </span>\n </div>\n <p className=\"mt-0.5 text-xs text-gray-500 dark:text-gray-400\">v{p.version}</p>\n {p.description && (\n <p className=\"mt-2 text-sm text-gray-600 dark:text-gray-300\">\n {p.description}\n </p>\n )}\n </div>\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport { useRouter } from \"next/navigation\";\nimport { Save, X, AlertCircle } from \"lucide-react\";\nimport { SeoSection, saveSeo, fetchSeo, type SeoFields } from \"../../components/Admin/SeoSection\";\nimport DetailPageLayout from \"../../components/Admin/DetailPageLayout\";\n\nconst isCreate = (id: string) => id === \"create\";\n\nexport default function BrandEditPage({ brandId }: { brandId: string }) {\n const router = useRouter();\n const create = isCreate(brandId);\n const [loading, setLoading] = useState(!create);\n const [saving, setSaving] = useState(false);\n const [errors, setErrors] = useState<string[]>([]);\n const [name, setName] = useState(\"\");\n const [slug, setSlug] = useState(\"\");\n const [description, setDescription] = useState(\"\");\n const [logo, setLogo] = useState(\"\");\n const [active, setActive] = useState(true);\n const [sortOrder, setSortOrder] = useState(0);\n\n const [seoId, setSeoId] = useState<number | null>(null);\n const [seo, setSeo] = useState<SeoFields>({ seoTitle: \"\", seoDescription: \"\", seoKeywords: \"\", seoOgTitle: \"\", seoOgDescription: \"\", seoOgImage: \"\" });\n\n useEffect(() => {\n if (create) return;\n let cancelled = false;\n (async () => {\n try {\n const res = await fetch(`/api/brands/${brandId}`);\n if (!res.ok) throw new Error(\"Failed to load brand\");\n const data = await res.json();\n if (cancelled) return;\n setName(data.name ?? \"\");\n setSlug(data.slug ?? \"\");\n setDescription(data.description ?? \"\");\n setLogo(data.logo ?? \"\");\n setActive(data.active ?? true);\n setSortOrder(Number(data.sortOrder) ?? 0);\n\n if (data.seoId) {\n setSeoId(data.seoId);\n const seoData = await fetchSeo(data.seoId);\n if (!cancelled) setSeo(seoData);\n }\n } catch {\n if (!cancelled) setErrors([\"Failed to load brand\"]);\n } finally {\n if (!cancelled) setLoading(false);\n }\n })();\n return () => { cancelled = true; };\n }, [brandId, create]);\n\n const handleSave = async () => {\n setErrors([]);\n if (!name.trim()) {\n setErrors([\"Name is required\"]);\n return;\n }\n if (!slug.trim()) {\n setErrors([\"Slug is required\"]);\n return;\n }\n setSaving(true);\n try {\n const savedSeoId = await saveSeo(seo, slug.trim(), seoId);\n\n const payload: Record<string, unknown> = {\n name: name.trim(),\n slug: slug.trim(),\n description: description || null,\n logo: logo || null,\n active,\n sortOrder,\n };\n if (savedSeoId) payload.seoId = savedSeoId;\n\n const res = await fetch(create ? \"/api/brands\" : `/api/brands/${brandId}`, {\n method: create ? \"POST\" : \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n });\n if (!res.ok) {\n const data = await res.json().catch(() => ({}));\n setErrors([data.error ?? \"Failed to save\"]);\n return;\n }\n router.push(\"/admin/brands\");\n } catch {\n setErrors([\"Failed to save\"]);\n } finally {\n setSaving(false);\n }\n };\n\n if (loading) {\n return (\n <div className=\"flex items-center justify-center py-12\">\n <span className=\"text-gray-500\">Loading...</span>\n </div>\n );\n }\n\n return (\n <div className=\"rounded-lg bg-white shadow-md\">\n <div className=\"bg-gray-800 border-b border-gray-700 px-4 py-2.5 rounded-t-lg\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-xl font-bold text-white\">\n {create ? \"Add Brand\" : \"Edit Brand\"}\n </h1>\n <p className=\"text-xs text-gray-300 mt-0.5\">\n {create ? \"Create a new brand\" : \"Update brand details\"}\n </p>\n </div>\n <div className=\"flex items-center gap-3\">\n <div className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n id=\"active\"\n checked={active}\n onChange={(e) => setActive(e.target.checked)}\n className=\"h-4 w-4 rounded border-gray-300\"\n />\n <span className=\"text-xs text-gray-300\">Active</span>\n </div>\n <button\n type=\"button\"\n onClick={handleSave}\n disabled={saving}\n className=\"inline-flex items-center rounded-md bg-white px-3 py-1.5 text-xs font-medium text-gray-800 hover:bg-gray-100 disabled:opacity-50\"\n >\n <Save className=\"h-4 w-4 mr-1\" />\n {saving ? \"Saving...\" : \"Save\"}\n </button>\n <button\n type=\"button\"\n onClick={() => router.back()}\n className=\"inline-flex items-center rounded-md border border-gray-600 bg-transparent px-3 py-1.5 text-xs font-medium text-white hover:bg-gray-700\"\n >\n <X className=\"h-4 w-4 mr-1\" /> Close\n </button>\n </div>\n </div>\n </div>\n\n {errors.length > 0 && (\n <div className=\"bg-red-50 border-l-4 border-red-400 p-4 mx-6 mt-4\">\n <div className=\"flex\">\n <AlertCircle className=\"h-5 w-5 text-red-400 flex-shrink-0\" />\n <div className=\"ml-3\">\n <h3 className=\"text-sm font-medium text-red-800\">Please fix the following errors:</h3>\n <ul className=\"mt-2 text-sm text-red-700 list-disc pl-5 space-y-1\">\n {errors.map((e, i) => (\n <li key={i}>{e}</li>\n ))}\n </ul>\n </div>\n </div>\n </div>\n )}\n\n <DetailPageLayout\n main={\n <>\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">\n Basic info\n </h2>\n <div className=\"border border-gray-200 rounded-lg p-4 bg-gray-50/50 space-y-4\">\n <div>\n <label className=\"block text-xs font-medium text-gray-600 mb-1\">Name *</label>\n <input\n type=\"text\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n className=\"w-full rounded-md border border-gray-300 px-3 py-2 text-sm\"\n required\n />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-gray-600 mb-1\">Slug *</label>\n <input\n type=\"text\"\n value={slug}\n onChange={(e) => setSlug(e.target.value)}\n className=\"w-full rounded-md border border-gray-300 px-3 py-2 text-sm\"\n required\n />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-gray-600 mb-1\">Description</label>\n <textarea\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n className=\"w-full rounded-md border border-gray-300 px-3 py-2 text-sm min-h-[80px]\"\n rows={3}\n />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-gray-600 mb-1\">Logo URL</label>\n <input\n type=\"url\"\n value={logo}\n onChange={(e) => setLogo(e.target.value)}\n className=\"w-full rounded-md border border-gray-300 px-3 py-2 text-sm\"\n />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-gray-600 mb-1\">Sort order</label>\n <input\n type=\"number\"\n value={sortOrder}\n onChange={(e) => setSortOrder(Number(e.target.value) || 0)}\n className=\"w-full rounded-md border border-gray-300 px-3 py-2 text-sm w-24\"\n />\n </div>\n </div>\n </section>\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">\n SEO\n </h2>\n <div className=\"border border-gray-200 rounded-lg p-4 bg-gray-50/50\">\n <SeoSection values={seo} onChange={(field, value) => setSeo((s) => ({ ...s, [field]: value }))} />\n </div>\n </section>\n </>\n }\n sidebar={\n <>\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">\n Status\n </h2>\n <div className=\"border border-gray-200 rounded-lg p-4 bg-gray-50/50\">\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={active}\n onChange={(e) => setActive(e.target.checked)}\n className=\"h-4 w-4 rounded border-gray-300\"\n />\n <span className=\"text-sm font-medium text-gray-900\">Active</span>\n </label>\n </div>\n </section>\n </>\n }\n />\n </div>\n );\n}\n","\"use client\";\n\nexport type SeoFields = {\n seoTitle: string;\n seoDescription: string;\n seoKeywords: string;\n seoOgTitle: string;\n seoOgDescription: string;\n seoOgImage: string;\n};\n\nexport function SeoSection({\n values,\n onChange,\n}: {\n values: SeoFields;\n onChange: (field: keyof SeoFields, value: string) => void;\n}) {\n const inputCls = \"w-full rounded-md border border-gray-300 px-2 py-1.5 text-sm h-8\";\n const textareaCls = \"w-full rounded-md border border-gray-300 px-2 py-1.5 text-sm min-h-[60px]\";\n\n return (\n <div className=\"border-t border-gray-200 pt-2\">\n <div className=\"text-xs font-semibold text-gray-500 uppercase tracking-wide mb-3\">SEO</div>\n <div className=\"space-y-3\">\n <div>\n <label className=\"block text-xs font-medium text-gray-600 mb-1\">Meta Title</label>\n <input type=\"text\" value={values.seoTitle} onChange={(e) => onChange(\"seoTitle\", e.target.value)} className={inputCls} />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-gray-600 mb-1\">Meta Description</label>\n <textarea value={values.seoDescription} onChange={(e) => onChange(\"seoDescription\", e.target.value)} className={textareaCls} rows={2} />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-gray-600 mb-1\">Keywords</label>\n <input type=\"text\" value={values.seoKeywords} onChange={(e) => onChange(\"seoKeywords\", e.target.value)} placeholder=\"keyword1, keyword2\" className={inputCls} />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-gray-600 mb-1\">OG Title</label>\n <input type=\"text\" value={values.seoOgTitle} onChange={(e) => onChange(\"seoOgTitle\", e.target.value)} className={inputCls} />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-gray-600 mb-1\">OG Description</label>\n <textarea value={values.seoOgDescription} onChange={(e) => onChange(\"seoOgDescription\", e.target.value)} className={textareaCls} rows={2} />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-gray-600 mb-1\">OG Image</label>\n <input type=\"url\" value={values.seoOgImage} onChange={(e) => onChange(\"seoOgImage\", e.target.value)} placeholder=\"https://...\" className={inputCls} />\n </div>\n </div>\n </div>\n );\n}\n\nexport async function saveSeo(\n seo: SeoFields,\n slug: string,\n existingSeoId: number | null,\n): Promise<number | null> {\n const hasSeo = seo.seoTitle || seo.seoDescription || seo.seoKeywords;\n if (!hasSeo) return existingSeoId;\n\n const payload = {\n title: seo.seoTitle || null,\n description: seo.seoDescription || null,\n keywords: seo.seoKeywords || null,\n ogTitle: seo.seoOgTitle || null,\n ogDescription: seo.seoOgDescription || null,\n ogImage: seo.seoOgImage || null,\n slug,\n };\n\n if (existingSeoId) {\n const res = await fetch(`/api/seos/${existingSeoId}`, {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n });\n return res.ok ? existingSeoId : null;\n }\n\n const res = await fetch(\"/api/seos\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n });\n if (res.ok) {\n const data = await res.json();\n return data.id;\n }\n return null;\n}\n\nexport async function fetchSeo(seoId: number): Promise<SeoFields> {\n const empty: SeoFields = { seoTitle: \"\", seoDescription: \"\", seoKeywords: \"\", seoOgTitle: \"\", seoOgDescription: \"\", seoOgImage: \"\" };\n try {\n const res = await fetch(`/api/seos/${seoId}`);\n if (!res.ok) return empty;\n const data = await res.json();\n return {\n seoTitle: data.title ?? \"\",\n seoDescription: data.description ?? \"\",\n seoKeywords: data.keywords ?? \"\",\n seoOgTitle: data.ogTitle ?? \"\",\n seoOgDescription: data.ogDescription ?? \"\",\n seoOgImage: data.ogImage ?? \"\",\n };\n } catch {\n return empty;\n }\n}\n\nexport default SeoSection;\n","import type { CustomCrudConfig } from './admin-config-context';\n\nexport const STORE_CRUD_CONFIGS: Record<string, CustomCrudConfig> = {\n products: {\n title: 'Products',\n apiEndpoint: '/api/products',\n defaultSortField: 'createdAt',\n defaultSortOrder: 'desc',\n filters: [\n { param: 'status', label: 'Status', type: 'select', options: [\n { value: '', label: 'All' },\n { value: 'draft', label: 'Draft' },\n { value: 'available', label: 'Available' },\n { value: 'reserved', label: 'Reserved' },\n { value: 'sold', label: 'Sold' },\n ]},\n { param: 'inventory', label: 'Inventory', type: 'select', options: [\n { value: '', label: 'All' },\n { value: 'in_stock', label: 'In stock' },\n { value: 'out_of_stock', label: 'Out of stock' },\n ]},\n ],\n columns: [\n { field: 'name', displayName: 'Name' },\n { field: 'sku', displayName: 'SKU' },\n { field: 'brandId', displayName: 'Brand', relationApi: '/api/brands', relationLabelField: 'name', relationValueField: 'id' },\n { field: 'categoryId', displayName: 'Category', relationApi: '/api/product_categories', relationLabelField: 'name', relationValueField: 'id' },\n { field: 'collectionId', displayName: 'Collection', relationApi: '/api/collections', relationLabelField: 'name', relationValueField: 'id' },\n { field: 'price', displayName: 'Price' },\n { field: 'status', displayName: 'Status' },\n { field: 'featured', displayName: 'Featured', type: 'boolean' },\n { field: 'createdAt', displayName: 'Created', type: 'date' },\n ],\n addEditPageUrl: '',\n },\n collections: {\n title: 'Collections',\n apiEndpoint: '/api/collections',\n columns: [\n { field: 'name', displayName: 'Name' },\n { field: 'slug', displayName: 'Slug' },\n { field: 'brandId', displayName: 'Brand', relationApi: '/api/brands', relationLabelField: 'name', relationValueField: 'id' },\n { field: 'categoryId', displayName: 'Category', relationApi: '/api/product_categories', relationLabelField: 'name', relationValueField: 'id' },\n { field: 'active', displayName: 'Active', type: 'boolean' },\n { field: 'sortOrder', displayName: 'Order' },\n { field: 'createdAt', displayName: 'Created', type: 'date' },\n ],\n addEditPageUrl: '',\n },\n orders: {\n title: 'Orders',\n apiEndpoint: '/api/orders',\n defaultSortField: 'createdAt',\n defaultSortOrder: 'desc',\n filters: [\n { param: 'status', label: 'Status', type: 'select', options: [\n { value: '', label: 'All' },\n { value: 'pending', label: 'Pending' },\n { value: 'confirmed', label: 'Confirmed' },\n { value: 'processing', label: 'Processing' },\n { value: 'completed', label: 'Completed' },\n { value: 'cancelled', label: 'Cancelled' },\n ]},\n { param: 'date', label: 'Date range', type: 'dateRange' },\n { param: 'paymentRef', label: 'Payment ID', type: 'text' },\n ],\n columns: [\n { field: 'orderNumber', displayName: 'Order #' },\n { field: 'contact.name', displayName: 'Customer' },\n { field: 'contact.email', displayName: 'Email' },\n { field: 'contact.phone', displayName: 'Phone' },\n { field: 'itemsSummary', displayName: 'Models / Items' },\n { field: 'status', displayName: 'Status' },\n { field: 'total', displayName: 'Total' },\n { field: 'currency', displayName: 'Currency' },\n { field: 'createdAt', displayName: 'Created', type: 'date' },\n ],\n addEditPageUrl: '',\n },\n payments: {\n title: 'Payments',\n apiEndpoint: '/api/payments',\n defaultSortField: 'createdAt',\n defaultSortOrder: 'desc',\n filters: [\n { param: 'status', label: 'Status', type: 'select', options: [\n { value: '', label: 'All' },\n { value: 'pending', label: 'Pending' },\n { value: 'processing', label: 'Processing' },\n { value: 'completed', label: 'Completed' },\n { value: 'failed', label: 'Failed' },\n { value: 'refunded', label: 'Refunded' },\n ]},\n { param: 'date', label: 'Date range', type: 'dateRange' },\n { param: 'method', label: 'Method', type: 'select', options: [\n { value: '', label: 'All' },\n { value: 'razorpay', label: 'Razorpay' },\n ]},\n { param: 'orderNumber', label: 'Order #', type: 'text' },\n ],\n columns: [\n { field: 'order.orderNumber', displayName: 'Order #' },\n { field: 'contact.name', displayName: 'Customer' },\n { field: 'contact.email', displayName: 'Email' },\n { field: 'amount', displayName: 'Amount' },\n { field: 'currency', displayName: 'Currency' },\n { field: 'status', displayName: 'Status' },\n { field: 'method', displayName: 'Method' },\n { field: 'externalReference', displayName: 'Razorpay Order ID' },\n { field: 'paidAt', displayName: 'Paid At', type: 'date' },\n { field: 'createdAt', displayName: 'Created', type: 'date' },\n ],\n addEditPageUrl: '',\n },\n taxes: {\n title: 'Taxes',\n apiEndpoint: '/api/taxes',\n columns: [\n { field: 'name', displayName: 'Name' },\n { field: 'slug', displayName: 'Slug' },\n { field: 'rate', displayName: 'Rate (%)' },\n { field: 'isDefault', displayName: 'Default', type: 'boolean' },\n { field: 'active', displayName: 'Active', type: 'boolean' },\n { field: 'createdAt', displayName: 'Created', type: 'date' },\n ],\n addEditPageUrl: '',\n },\n brands: {\n title: 'Brands',\n apiEndpoint: '/api/brands',\n columns: [\n { field: 'name', displayName: 'Name' },\n { field: 'slug', displayName: 'Slug' },\n { field: 'active', displayName: 'Active', type: 'boolean' },\n { field: 'sortOrder', displayName: 'Order' },\n { field: 'createdAt', displayName: 'Created', type: 'date' },\n ],\n addEditPageUrl: '/admin/brands',\n },\n product_categories: {\n title: 'Categories',\n apiEndpoint: '/api/product_categories',\n columns: [\n { field: 'name', displayName: 'Name' },\n { field: 'slug', displayName: 'Slug' },\n { field: 'parentId', displayName: 'Parent', relationApi: '/api/product_categories', relationLabelField: 'name', relationValueField: 'id' },\n { field: 'active', displayName: 'Active', type: 'boolean' },\n { field: 'sortOrder', displayName: 'Order' },\n { field: 'createdAt', displayName: 'Created', type: 'date' },\n ],\n addEditPageUrl: '',\n },\n};\n","\"use client\";\n\nimport { useState, useEffect, useContext } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { Save } from \"lucide-react\";\nimport NavbarEditor from \"../../components/Admin/NavbarEditor\";\nimport ComponentSettings from \"../../components/Admin/ComponentSettings\";\nimport { AdminConfigContext } from \"../admin-config-context\";\nimport type { NavbarConfig, ThemeConfig } from \"../../theme/types\";\n\ntype Tab = \"navbar\" | \"footer\";\n\nexport default function LayoutSettingsPage() {\n const { theme } = useContext(AdminConfigContext);\n const [activeTab, setActiveTab] = useState<Tab>(\"navbar\");\n const [navbarConfig, setNavbarConfig] = useState<NavbarConfig>({\n logo: \"\",\n items: [],\n ctaLabel: \"\",\n ctaUrl: \"\",\n });\n const [footerValues, setFooterValues] = useState<Record<string, any>>({});\n const [saving, setSaving] = useState(false);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n fetch(\"/api/settings/theme\")\n .then((r) => (r.ok ? r.json() : null))\n .then((data) => {\n if (!data) return;\n if (data.navbar) {\n try {\n setNavbarConfig(JSON.parse(data.navbar));\n } catch {}\n }\n if (data.footer) {\n try {\n setFooterValues(JSON.parse(data.footer));\n } catch {}\n }\n })\n .finally(() => setLoading(false));\n }, []);\n\n const handleSave = async () => {\n setSaving(true);\n try {\n await fetch(\"/api/settings/theme\", {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n navbar: JSON.stringify(navbarConfig),\n footer: JSON.stringify(footerValues),\n }),\n });\n } finally {\n setSaving(false);\n }\n };\n\n const footerLayout = theme?.layout?.footer;\n const footerMeta = footerLayout\n ? {\n name: \"Footer\",\n label: \"Footer Settings\",\n category: \"layout\",\n icon: \"LayoutTemplate\",\n description: \"Footer configuration\",\n defaultProps: footerLayout.defaults || {},\n props: footerLayout.fields,\n }\n : null;\n\n if (loading) {\n return (\n <div className=\"flex items-center justify-center py-12\">\n <div className=\"animate-spin rounded-full h-6 w-6 border-2 border-gray-300 border-t-gray-600\" />\n </div>\n );\n }\n\n return (\n <div className=\"rounded-lg bg-white shadow-md\">\n <div className=\"bg-gray-800 px-4 py-2.5 rounded-t-lg flex items-center justify-between\">\n <div>\n <h1 className=\"text-xl font-bold text-white\">Layout Settings</h1>\n <p className=\"text-xs text-gray-300 mt-0.5\">Configure your site navbar and footer</p>\n </div>\n <Button\n onClick={handleSave}\n disabled={saving}\n className=\"bg-white text-gray-800 hover:bg-gray-100 border-0 text-xs\"\n >\n <Save className=\"h-4 w-4 mr-2\" />\n {saving ? \"Saving...\" : \"Save\"}\n </Button>\n </div>\n\n <div className=\"border-b\">\n <div className=\"flex\">\n <button\n className={`px-4 py-2.5 text-sm font-medium border-b-2 ${\n activeTab === \"navbar\"\n ? \"border-gray-800 text-gray-800\"\n : \"border-transparent text-gray-500 hover:text-gray-700\"\n }`}\n onClick={() => setActiveTab(\"navbar\")}\n >\n Navbar\n </button>\n <button\n className={`px-4 py-2.5 text-sm font-medium border-b-2 ${\n activeTab === \"footer\"\n ? \"border-gray-800 text-gray-800\"\n : \"border-transparent text-gray-500 hover:text-gray-700\"\n }`}\n onClick={() => setActiveTab(\"footer\")}\n >\n Footer\n </button>\n </div>\n </div>\n\n <div className=\"p-6\">\n {activeTab === \"navbar\" && (\n <NavbarEditor config={navbarConfig} onChange={setNavbarConfig} />\n )}\n {activeTab === \"footer\" && footerMeta && (\n <ComponentSettings\n meta={footerMeta}\n values={footerValues}\n onChange={(name, val) =>\n setFooterValues((prev) => ({ ...prev, [name]: val }))\n }\n />\n )}\n {activeTab === \"footer\" && !footerMeta && (\n <p className=\"text-sm text-gray-500\">\n No footer configuration defined in the current theme.\n </p>\n )}\n </div>\n </div>\n );\n}\n","export interface AdminNavItem {\n href: string;\n label: string;\n icon?: string;\n}\n\nexport const DEFAULT_ADMIN_NAV: AdminNavItem[] = [\n { href: '/admin/dashboard', label: 'Dashboard' },\n { href: '/admin/contacts', label: 'Contacts' },\n { href: '/admin/blogs', label: 'Blogs' },\n { href: '/admin/users', label: 'Users' },\n { href: '/admin/forms', label: 'Forms' },\n { href: '/admin/submissions', label: 'Submissions' },\n { href: '/admin/pages', label: 'Pages' },\n];\n","'use client';\n\nimport { SessionProvider } from 'next-auth/react';\nimport { ThemeProvider } from 'next-themes';\nimport { Toaster } from 'sonner';\n\nexport function CmsProviders({ children }: { children: React.ReactNode }) {\n return (\n <SessionProvider>\n <ThemeProvider attribute=\"class\" defaultTheme=\"system\" enableSystem>\n {children}\n <Toaster position=\"top-right\" />\n </ThemeProvider>\n </SessionProvider>\n );\n}\n"],"mappings":"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","names":["React","useSession","usePathname","React","jsx","jsx","jsx","jsxs","Link","Image","Settings","jsx","jsxs","Icon","Link","Settings","Image","jsx","jsxs","useSession","usePathname","id","React","Toaster","jsx","jsxs","Toaster","useEffect","useState","useState","useEffect","React","jsx","React","jsx","React","Check","ChevronDown","jsx","jsxs","jsxs","jsx","ChevronDown","Check","React","jsx","React","cva","jsx","cva","Label","useState","React","jsx","jsx","jsxs","useState","useState","useEffect","ChevronDown","jsx","jsxs","useState","useEffect","ChevronDown","jsx","jsxs","useState","useEffect","Label","React","jsx","React","ChevronRight","jsx","jsxs","ChevronRight","React","jsx","React","jsx","jsxs","jsx","jsxs","Check","X","Upload","Download","Link","useState","useEffect","useRef","X","jsx","jsxs","useState","useRef","useEffect","e","Fragment","jsx","jsxs","useState","useEffect","error","Upload","Download","Link","Check","X","useState","useEffect","useCallback","cva","jsx","cva","X","Plus","Trash2","useRouter","useState","Plus","X","jsx","jsxs","useState","jsx","jsxs","useState","useRouter","useCallback","useEffect","X","Plus","Trash2","useState","useEffect","useState","useRef","useCallback","Upload","X","ImageIcon","AlertCircle","Image","jsx","jsxs","useState","useRef","useCallback","error","X","AlertCircle","Upload","ImageIcon","X","Save","AlertCircle","useRouter","useState","useEffect","useRef","useCallback","X","Plus","Search","Fragment","jsx","jsxs","useState","useRef","useCallback","useEffect","useState","useEffect","useRef","X","Plus","Search","Check","Fragment","jsx","jsxs","useState","useRef","useEffect","useState","useEffect","useRef","X","Search","Check","jsx","jsxs","useState","useRef","useEffect","jsx","jsxs","useState","useEffect","useRouter","quillModules","Save","X","AlertCircle","useEffect","useRef","jsx","jsxs","Title","Tooltip","jsx","jsxs","MapPin","Users","jsx","jsxs","jsx","jsxs","usePathname","useEffect","jsx","jsxs","usePathname","useState","useEffect","jsx","jsxs","useState","useEffect","Label","useState","useEffect","Plus","Trash2","ChevronDown","ChevronRight","ArrowLeft","jsx","jsxs","useState","useEffect","Label","jsxs","jsx","Label","Plus","Link","useState","useEffect","useRouter","Fragment","jsx","jsxs","error","useState","Link","jsx","jsxs","useState","Label","Link","useState","useEffect","Link","jsx","jsxs","useState","useEffect","Link","Label","useState","useEffect","Suspense","useSearchParams","jsx","jsxs","useSearchParams","useState","useEffect","Label","Suspense","useSession","useEffect","useState","Users","Eye","ClipboardList","Fragment","jsx","jsxs","useSession","useState","useEffect","useState","useEffect","useContext","useRouter","useState","useEffect","X","Save","AlertCircle","useRouter","dynamic","jsx","jsxs","quillStyles","ReactQuill","useState","useEffect","useEffect","useState","Link","ArrowLeft","jsx","jsxs","useState","useEffect","Link","ArrowLeft","useEffect","useState","Link","useRouter","X","jsx","jsxs","Fragment","jsx","jsxs","useRouter","useState","useEffect","Link","X","useEffect","useState","Link","useRouter","X","Fragment","jsx","jsxs","formatMoney","useRouter","useState","useEffect","Link","X","useEffect","useState","Link","useRouter","X","Plus","Fragment","jsx","jsxs","formatMoney","formatAddress","useRouter","useState","useEffect","Link","X","Plus","useState","useEffect","useContext","useSearchParams","toast","Save","Fragment","jsx","jsxs","useSearchParams","useContext","useState","useEffect","toast","Label","Save","useState","useEffect","useCallback","useRef","Upload","Search","ImageIcon","FileText","File","Trash2","toast","jsx","jsxs","useState","useRef","useCallback","useEffect","useState","useEffect","useContext","useRef","Save","X","ChevronDown","ChevronRight","LayoutDashboard","Layers","useRouter","React","Fragment","jsx","jsxs","Icon","useRef","useEffect","useState","ChevronRight","ChevronDown","Label","LayoutDashboard","Layers","useContext","useRouter","Save","X","useContext","CreditCard","Puzzle","CheckCircle2","jsx","jsxs","CreditCard","Icon","Puzzle","useContext","CheckCircle2","useState","useEffect","useRouter","Save","X","AlertCircle","jsx","jsxs","res","Fragment","jsx","jsxs","useRouter","useState","useEffect","Save","X","AlertCircle","jsx","jsxs","useState","useEffect","useRouter","useContext","isCreate","useState","useEffect","useContext","Save","jsx","jsxs","useContext","useState","useEffect","Save","SessionProvider","Toaster","jsx","jsxs"]}
1
+ {"version":3,"sources":["../src/admin/pages/AdminLayout.tsx","../src/components/Admin/Header.tsx","../src/components/ui/button.tsx","../src/lib/utils.ts","../src/components/ui/dropdown-menu.tsx","../src/hooks/use-mobile.ts","../src/components/Admin/Sidebar.tsx","../src/admin/admin-config-context.tsx","../src/lib/infuro-favicon.ts","../src/lib/cms-version.ts","../src/components/Admin/MobileBottomNav.tsx","../src/components/ui/sheet.tsx","../src/admin/admin-theme.ts","../src/admin/AdminShell.tsx","../src/components/Admin/CRUD.tsx","../src/components/Admin/CreateEditForm.tsx","../src/components/ui/input.tsx","../src/components/ui/textarea.tsx","../src/components/ui/select.tsx","../src/components/ui/switch.tsx","../src/components/ui/label.tsx","../src/components/ui/file-upload.tsx","../src/components/ui/progress.tsx","../src/components/Admin/RelationAutocomplete.tsx","../src/components/ui/table.tsx","../src/components/ui/pagination.tsx","../src/components/ui/dialog.tsx","../src/components/Admin/BulkUploadDialog.tsx","../src/components/Admin/FormBuilder.tsx","../src/components/ui/badge.tsx","../src/components/Admin/FormBuilder/FieldConfiguration.tsx","../src/components/Admin/BlogEditorPage.tsx","../src/components/ui/image-upload.tsx","../src/components/Admin/TagAutocomplete.tsx","../src/components/Admin/CategoryAutocomplete.tsx","../src/components/Admin/UserAutocomplete.tsx","../src/components/Admin/AnalyticsChart.tsx","../src/components/Admin/DailyUserChart.tsx","../src/components/Admin/GeographicMap.tsx","../src/components/Admin/AnalyticsCard.tsx","../src/components/Admin/AnalyticsExclusion.tsx","../src/hooks/use-analytics.ts","../src/components/Admin/ComponentSettings.tsx","../src/components/Admin/NavbarEditor.tsx","../src/admin/pages/SignInPage.tsx","../src/components/Admin/AuthPageLayout.tsx","../src/components/Admin/AuthFooter.tsx","../src/admin/pages/ForgotPasswordPage.tsx","../src/admin/pages/ResetPasswordPage.tsx","../src/admin/pages/InvitePage.tsx","../src/admin/pages/DashboardPage.tsx","../src/admin/pages/AdminPageResolver.tsx","../src/components/Admin/PolicyEditorPage.tsx","../src/admin/pages/SubmissionDetailPage.tsx","../src/components/Admin/DetailPageHeader.tsx","../src/admin/pages/OrderDetailPage.tsx","../src/components/Admin/DetailPageLayout.tsx","../src/admin/pages/PaymentDetailPage.tsx","../src/admin/pages/ContactDetailPage.tsx","../src/admin/pages/SettingsPage.tsx","../src/admin/pages/MediaLibraryPage.tsx","../src/admin/pages/PageBuilderPage.tsx","../src/theme/registry.ts","../src/admin/pages/PluginsPage.tsx","../src/admin/pages/BrandEditPage.tsx","../src/components/Admin/SeoSection.tsx","../src/admin/store-crud-configs.ts","../src/admin/pages/LayoutSettingsPage.tsx","../src/admin/config.ts","../src/admin/CmsProviders.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useEffect, useState } from \"react\";\nimport { SessionProvider, useSession } from \"next-auth/react\";\nimport { useRouter, usePathname } from \"next/navigation\";\nimport { Toaster } from \"sonner\";\nimport AdminHeader from \"@/components/Admin/Header\";\nimport AdminSidebar from \"@/components/Admin/Sidebar\";\nimport MobileBottomNav from \"@/components/Admin/MobileBottomNav\";\nimport { Sheet, SheetContent } from \"@/components/ui/sheet\";\nimport { useIsMobile } from \"@/hooks/use-mobile\";\nimport { ADMIN_THEME_CSS } from \"../admin-theme\";\nimport { AdminConfigContext, type CustomNavItem, type CustomNavSection, type CustomCrudConfig, type ThemeRegistryItem } from \"../admin-config-context\";\nimport type { ThemeConfig } from \"../../theme/types\";\n\nconst PUBLIC_ADMIN_PATHS = [\"/admin/signin\", \"/admin/forgot-password\", \"/admin/reset-password\", \"/admin/invite\"];\nconst AdminStyle = () => <style dangerouslySetInnerHTML={{ __html: ADMIN_THEME_CSS }} />;\n\nfunction useAdminViewSettings() {\n useEffect(() => {\n fetch('/api/settings/admin_view')\n .then((r) => (r.ok ? r.json() : null))\n .then((data: Record<string, string> | null) => {\n if (!data) return;\n const root = document.getElementById('admin-root');\n if (data.compactView === 'false' && root) root.classList.remove('admin-app');\n else if (root) root.classList.add('admin-app');\n })\n .catch(() => {});\n }, []);\n}\n\nfunction AdminLayoutInner({ children }: { children: React.ReactNode }) {\n const { data: session, status } = useSession();\n const router = useRouter();\n const pathname = usePathname();\n const [loadingTimeout, setLoadingTimeout] = useState(false);\n const [moreSheetOpen, setMoreSheetOpen] = useState(false);\n const isMobile = useIsMobile();\n useAdminViewSettings();\n\n const isPublicPath = PUBLIC_ADMIN_PATHS.includes(pathname);\n\n useEffect(() => {\n if (isMobile) setMoreSheetOpen(false);\n }, [isMobile, pathname]);\n\n useEffect(() => {\n if (isPublicPath) return;\n \n if (status === \"loading\") {\n const timeout = setTimeout(() => setLoadingTimeout(true), 10000);\n return () => clearTimeout(timeout);\n }\n \n if (!session) {\n router.push(\"/admin/signin\");\n } else {\n setLoadingTimeout(false);\n }\n }, [session, status, router, pathname, isPublicPath]);\n\n if (isPublicPath) {\n return <><AdminStyle />{children}</>;\n }\n\n if (status === \"loading\") {\n return (\n <div className=\"flex items-center justify-center min-h-screen\">\n <AdminStyle />\n <div className=\"text-center\">\n <div className=\"animate-spin rounded-full h-32 w-32 border-2 border-gray-300 border-t-gray-700 mx-auto\"></div>\n <p className=\"mt-4 text-gray-600 text-sm\">Loading admin panel...</p>\n {loadingTimeout && (\n <div className=\"mt-4 p-4 bg-amber-50 border border-amber-300 rounded text-sm\">\n <p className=\"text-amber-800\">\n Loading timeout.\n <button onClick={() => window.location.reload()} className=\"ml-2 text-gray-700 hover:underline font-medium\">\n Refresh\n </button>\n </p>\n </div>\n )}\n </div>\n </div>\n );\n }\n\n if (!session) {\n return null;\n }\n\n if (isMobile) {\n return (\n <div id=\"admin-root\" className=\"admin-app h-screen bg-gray-100 flex flex-col overflow-hidden\">\n <AdminStyle />\n <AdminHeader />\n <main className=\"admin-scroll flex-1 min-h-0 min-w-0 p-3 sm:p-4 pb-24 bg-gray-100 overflow-auto\">{children}</main>\n <MobileBottomNav onOpenMore={() => setMoreSheetOpen(true)} />\n <Sheet open={moreSheetOpen} onOpenChange={setMoreSheetOpen}>\n <SheetContent side=\"right\" className=\"p-0 w-80 h-full overflow-y-auto\">\n <AdminSidebar variant=\"drawer\" />\n </SheetContent>\n </Sheet>\n <Toaster position=\"top-right\" />\n </div>\n );\n }\n\n return (\n <div id=\"admin-root\" className=\"admin-app h-screen bg-gray-100 flex flex-col overflow-hidden\">\n <AdminStyle />\n <AdminHeader />\n <div className=\"flex flex-1 min-h-0\">\n <AdminSidebar />\n <main className=\"admin-scroll flex-1 min-h-0 min-w-0 p-3 sm:p-4 bg-gray-100 overflow-auto\">{children}</main>\n </div>\n <Toaster position=\"top-right\" />\n </div>\n );\n}\n\nexport interface AdminLayoutProps {\n children: React.ReactNode;\n customNavItems?: CustomNavItem[];\n customNavSections?: CustomNavSection[];\n customCrudConfigs?: Record<string, CustomCrudConfig>;\n theme?: ThemeConfig;\n themeRegistry?: ThemeRegistryItem[];\n pluginDescriptors?: import(\"../admin-config-context\").PluginDescriptor[];\n}\n\nfunction useResolvedTheme(\n theme: ThemeConfig | undefined,\n themeRegistry: ThemeRegistryItem[] | undefined\n): ThemeConfig | undefined {\n const [activeThemeId, setActiveThemeId] = useState<string | null>(null);\n\n useEffect(() => {\n if (!themeRegistry || themeRegistry.length === 0) return;\n fetch(\"/api/settings/theme\")\n .then((r) => (r.ok ? r.json() : {}))\n .then((data: Record<string, string>) => {\n const id = data?.activeThemeId?.trim();\n setActiveThemeId(id || null);\n })\n .catch(() => {});\n }, [themeRegistry]);\n\n if (!themeRegistry || themeRegistry.length === 0) return theme;\n const id = activeThemeId || themeRegistry[0]?.id;\n const found = themeRegistry.find((t) => t.id === id);\n return found?.config ?? theme ?? themeRegistry[0]?.config;\n}\n\nfunction useStoreEnabled(): boolean {\n const [storeEnabled, setStoreEnabled] = useState(false);\n\n useEffect(() => {\n fetch(\"/api/settings/store\")\n .then((r) => (r.ok ? r.json() : {}))\n .then((data: Record<string, string>) => {\n setStoreEnabled(data?.enabled === 'true');\n })\n .catch(() => {});\n }, []);\n\n return storeEnabled;\n}\n\nexport default function AdminLayout({ children, customNavItems = [], customNavSections = [], customCrudConfigs = {}, theme, themeRegistry, pluginDescriptors = [] }: AdminLayoutProps) {\n const resolvedTheme = useResolvedTheme(theme, themeRegistry);\n const storeEnabled = useStoreEnabled();\n const configValue = React.useMemo(\n () => ({\n customNavItems,\n customNavSections,\n customCrudConfigs,\n theme: resolvedTheme,\n themeRegistry,\n pluginDescriptors,\n storeEnabled,\n }),\n [customNavItems, customNavSections, customCrudConfigs, resolvedTheme, themeRegistry, pluginDescriptors, storeEnabled]\n );\n return (\n <SessionProvider>\n <AdminConfigContext.Provider value={configValue}>\n <AdminLayoutInner>{children}</AdminLayoutInner>\n </AdminConfigContext.Provider>\n </SessionProvider>\n );\n}\n","\"use client\";\n\nimport { signOut, useSession } from \"next-auth/react\";\nimport { Button } from \"@/components/ui/button\";\nimport { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem } from \"@/components/ui/dropdown-menu\";\nimport Image from \"next/image\";\nimport { LogOut, Settings, User, ChevronDown } from \"lucide-react\";\nimport Link from \"next/link\";\nimport { useIsMobile } from \"@/hooks/use-mobile\";\n\nexport default function AdminHeader() {\n const { data: session } = useSession();\n const isMobile = useIsMobile();\n\n const handleLogout = () => {\n signOut({ callbackUrl: \"/admin/signin\" });\n };\n\n return (\n <header className=\"bg-white border-b border-gray-200 px-4 py-2\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center max-h-9 shrink-0\">\n <Image\n src={process.env.NEXT_PUBLIC_ADMIN_LOGO_URL || \"/images/logo/logo.png\"}\n alt=\"Admin\"\n width={120}\n height={34}\n className=\"max-h-9 w-auto object-contain object-left\"\n />\n </div>\n <div className=\"flex items-center space-x-3\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button \n variant=\"ghost\" \n className={isMobile ? \"p-1.5 hover:bg-gray-100 rounded-md transition-colors text-gray-700\" : \"flex items-center space-x-2 px-2 py-1.5 hover:bg-gray-100 rounded-md transition-colors text-gray-700\"}\n >\n <div className=\"h-7 w-7 rounded-full bg-gray-700 flex items-center justify-center overflow-hidden relative\">\n {session?.user?.image ? (\n <Image \n src={session.user.image} \n alt={session?.user?.name || \"User\"} \n fill\n className=\"object-cover\"\n />\n ) : (\n <span className=\"text-xs font-medium text-gray-100\">\n {session?.user?.name?.charAt(0).toUpperCase() || session?.user?.email?.charAt(0).toUpperCase() || \"A\"}\n </span>\n )}\n </div>\n {!isMobile && (\n <>\n <div className=\"flex flex-col items-start\">\n <span className=\"text-[13px] font-medium text-gray-900\">\n {session?.user?.name || session?.user?.email || \"Admin\"}\n </span>\n <span className=\"text-[11px] text-gray-500\">Administrator</span>\n </div>\n <ChevronDown className=\"h-3.5 w-3.5 text-gray-400\" />\n </>\n )}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-56\">\n <DropdownMenuItem asChild>\n <Link href=\"/admin/profile\" className=\"flex items-center text-gray-600\">\n <User className=\"mr-2 h-4 w-4\" />\n Profile\n </Link>\n </DropdownMenuItem>\n <DropdownMenuItem asChild>\n <Link href=\"/admin/settings\" className=\"flex items-center text-gray-600\">\n <Settings className=\"mr-2 h-4 w-4\" />\n Settings\n </Link>\n </DropdownMenuItem>\n <DropdownMenuItem onClick={handleLogout} className=\"text-red-600\">\n <LogOut className=\"mr-2 h-4 w-4\" />\n Sign Out\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n </header>\n );\n}\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground shadow hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2\",\n sm: \"h-8 rounded-md px-3 text-xs\",\n lg: \"h-10 rounded-md px-8\",\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}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\"\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n )\n }\n)\nButton.displayName = \"Button\"\n\nexport { Button, buttonVariants }\n","import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\nexport function generateSlug(title: string): string {\n return title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/(^-|-$)/g, '');\n}\n\nexport function validateSlug(slug: string): boolean {\n const slugRegex = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\n return slugRegex.test(slug) && slug.length >= 3 && slug.length <= 50;\n}\n\nexport function formatDate(date: Date | string): string {\n const d = new Date(date);\n return d.toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' });\n}\n\nexport function formatDateTime(date: Date | string): string {\n const d = new Date(date);\n return d.toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n}\n\nexport function formatDateOnly(date: Date | string): string {\n const d = new Date(date);\n return d.toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' });\n}\n\nexport function truncateText(text: string, maxLength: number): string {\n if (text.length <= maxLength) return text;\n return text.substring(0, maxLength).trim() + '...';\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\"\nimport { Check, ChevronRight, Circle } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst DropdownMenu = DropdownMenuPrimitive.Root\n\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger\n\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group\n\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal\n\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub\n\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n \"flex cursor-default gap-2 select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ml-auto\" />\n </DropdownMenuPrimitive.SubTrigger>\n))\nDropdownMenuSubTrigger.displayName =\n DropdownMenuPrimitive.SubTrigger.displayName\n\nconst DropdownMenuSubContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.SubContent\n ref={ref}\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className\n )}\n {...props}\n />\n))\nDropdownMenuSubContent.displayName =\n DropdownMenuPrimitive.SubContent.displayName\n\nconst DropdownMenuContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md\",\n \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n))\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName\n\nconst DropdownMenuItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&>svg]:size-4 [&>svg]:shrink-0\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n />\n))\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName\n\nconst DropdownMenuCheckboxItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <DropdownMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n))\nDropdownMenuCheckboxItem.displayName =\n DropdownMenuPrimitive.CheckboxItem.displayName\n\nconst DropdownMenuRadioItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.RadioItem\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Circle className=\"h-2 w-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n))\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName\n\nconst DropdownMenuLabel = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Label\n ref={ref}\n className={cn(\n \"px-2 py-1.5 text-sm font-semibold\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n />\n))\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName\n\nconst DropdownMenuSeparator = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n {...props}\n />\n))\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName\n\nconst DropdownMenuShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span\n className={cn(\"ml-auto text-xs tracking-widest opacity-60\", className)}\n {...props}\n />\n )\n}\nDropdownMenuShortcut.displayName = \"DropdownMenuShortcut\"\n\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuRadioGroup,\n}\n","import { useState, useEffect } from 'react';\n\nconst MOBILE_BREAKPOINT = 768;\n\nexport function useIsMobile(): boolean {\n const [isMobile, setIsMobile] = useState<boolean | undefined>(undefined);\n\n useEffect(() => {\n const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);\n const onChange = () => setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n mql.addEventListener('change', onChange);\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n return () => mql.removeEventListener('change', onChange);\n }, []);\n\n return !!isMobile;\n}\n","\"use client\";\n\nimport Link from \"next/link\";\nimport Image from \"next/image\";\nimport { usePathname } from \"next/navigation\";\nimport { useContext } from \"react\";\nimport {\n File,\n Users,\n Inbox,\n LinkIcon,\n LayoutDashboard,\n ClipboardList,\n MessageSquare,\n Settings,\n Image as ImageIcon,\n Car,\n MapPin,\n Building2,\n Package,\n Puzzle,\n ShoppingBag,\n Layers,\n ShoppingCart,\n CreditCard,\n Receipt,\n FolderTree,\n} from \"lucide-react\";\nimport { AdminConfigContext } from \"../../admin/admin-config-context\";\nimport { INFURO_FAVICON_BASE64 } from \"../../lib/infuro-favicon\";\nimport { CMS_VERSION } from \"../../lib/cms-version\";\n\nconst INFURO_FOOTER_LABEL = \"Infuro Tech Solutions LLP\";\nconst INFURO_FOOTER_URL = \"https://infurotech.com\";\n\nconst CUSTOM_ICON_MAP: Record<string, React.ComponentType<{ className?: string }>> = {\n car: Car,\n map: MapPin,\n building: Building2,\n package: Package,\n file: File,\n};\n\nfunction getIconForItem(iconName?: string) {\n if (!iconName) return File;\n const Icon = CUSTOM_ICON_MAP[iconName.toLowerCase()];\n return Icon ?? File;\n}\n\ninterface AdminSidebarProps {\n variant?: 'sidebar' | 'drawer';\n}\n\nexport default function AdminSidebar({ variant = 'sidebar' }: AdminSidebarProps) {\n const pathname = usePathname();\n const { customNavItems, customNavSections = [], storeEnabled } = useContext(AdminConfigContext);\n const isDrawer = variant === 'drawer';\n\n const isActive = (path: string) => {\n if (path === \"/admin/dashboard\") {\n return pathname === path;\n }\n return pathname.startsWith(path);\n };\n\n const linkActive = 'bg-gray-200 text-gray-900';\n const linkInactive = 'text-gray-600 hover:bg-gray-100 hover:text-gray-900';\n const iconActive = 'text-gray-700';\n const iconInactive = 'text-gray-400';\n const linkCls = 'flex items-center px-2.5 py-[7px] text-[13px] font-medium rounded-md transition-colors';\n const sectionCls = 'mb-5';\n const headingCls = 'text-[11px] font-semibold text-gray-400 uppercase tracking-wider px-2.5 mb-1.5';\n\n const asideCls = isDrawer\n ? 'w-full h-full min-h-0 bg-white flex flex-col overflow-hidden'\n : 'w-52 h-full min-h-0 bg-white border-r border-gray-200 flex-shrink-0 flex flex-col overflow-hidden';\n\n return (\n <aside className={asideCls}>\n <div className=\"flex flex-col flex-1 min-h-0 overflow-hidden\">\n <nav className=\"admin-scroll flex-1 min-h-0 px-3 py-4 pb-4 overflow-y-auto overscroll-contain\">\n <div className={sectionCls}>\n <h3 className={headingCls}>Main</h3>\n <ul className=\"space-y-0.5\">\n <li>\n <Link\n href=\"/admin/dashboard\"\n className={`${linkCls} ${isActive(\"/admin/dashboard\") ? linkActive : linkInactive}`}\n >\n <LayoutDashboard className={`h-4 w-4 mr-2 ${isActive(\"/admin/dashboard\") ? iconActive : iconInactive}`} />\n Dashboard\n </Link>\n </li>\n </ul>\n </div>\n {customNavSections.length > 0 && customNavSections.map((section) => (\n <div key={section.title} className={sectionCls}>\n <h3 className={headingCls}>{section.title}</h3>\n <ul className=\"space-y-0.5\">\n {section.items.map((item) => {\n const Icon = getIconForItem(item.icon);\n return (\n <li key={item.href}>\n <Link href={item.href} className={`${linkCls} ${isActive(item.href) ? linkActive : linkInactive}`}>\n <Icon className={`h-4 w-4 mr-2 ${isActive(item.href) ? iconActive : iconInactive}`} />\n {item.label}\n </Link>\n </li>\n );\n })}\n </ul>\n </div>\n ))}\n {customNavSections.length === 0 && customNavItems.length > 0 && (\n <div className={sectionCls}>\n <h3 className={headingCls}>Custom</h3>\n <ul className=\"space-y-0.5\">\n {customNavItems.map((item) => {\n const Icon = getIconForItem(item.icon);\n return (\n <li key={item.href}>\n <Link href={item.href} className={`${linkCls} ${isActive(item.href) ? linkActive : linkInactive}`}>\n <Icon className={`h-4 w-4 mr-2 ${isActive(item.href) ? iconActive : iconInactive}`} />\n {item.label}\n </Link>\n </li>\n );\n })}\n </ul>\n </div>\n )}\n {storeEnabled && (\n <div className={sectionCls}>\n <h3 className={headingCls}>Store</h3>\n <ul className=\"space-y-0.5\">\n <li><Link href=\"/admin/products\" className={`${linkCls} ${isActive(\"/admin/products\") ? linkActive : linkInactive}`}><ShoppingBag className={`h-4 w-4 mr-2 ${isActive(\"/admin/products\") ? iconActive : iconInactive}`} />Products</Link></li>\n <li><Link href=\"/admin/collections\" className={`${linkCls} ${isActive(\"/admin/collections\") ? linkActive : linkInactive}`}><Layers className={`h-4 w-4 mr-2 ${isActive(\"/admin/collections\") ? iconActive : iconInactive}`} />Collections</Link></li>\n <li><Link href=\"/admin/orders\" className={`${linkCls} ${isActive(\"/admin/orders\") ? linkActive : linkInactive}`}><ShoppingCart className={`h-4 w-4 mr-2 ${isActive(\"/admin/orders\") ? iconActive : iconInactive}`} />Orders</Link></li>\n <li><Link href=\"/admin/payments\" className={`${linkCls} ${isActive(\"/admin/payments\") ? linkActive : linkInactive}`}><CreditCard className={`h-4 w-4 mr-2 ${isActive(\"/admin/payments\") ? iconActive : iconInactive}`} />Payments</Link></li>\n <li><Link href=\"/admin/taxes\" className={`${linkCls} ${isActive(\"/admin/taxes\") ? linkActive : linkInactive}`}><Receipt className={`h-4 w-4 mr-2 ${isActive(\"/admin/taxes\") ? iconActive : iconInactive}`} />Taxes</Link></li>\n <li><Link href=\"/admin/brands\" className={`${linkCls} ${isActive(\"/admin/brands\") ? linkActive : linkInactive}`}><Building2 className={`h-4 w-4 mr-2 ${isActive(\"/admin/brands\") ? iconActive : iconInactive}`} />Brands</Link></li>\n <li><Link href=\"/admin/product_categories\" className={`${linkCls} ${isActive(\"/admin/product_categories\") ? linkActive : linkInactive}`}><FolderTree className={`h-4 w-4 mr-2 ${isActive(\"/admin/product_categories\") ? iconActive : iconInactive}`} />Categories</Link></li>\n </ul>\n </div>\n )}\n <div className={sectionCls}>\n <h3 className={headingCls}>Management</h3>\n <ul className=\"space-y-0.5\">\n <li><Link href=\"/admin/contacts\" className={`${linkCls} ${isActive(\"/admin/contacts\") ? linkActive : linkInactive}`}><Inbox className={`h-4 w-4 mr-2 ${isActive(\"/admin/contacts\") ? iconActive : iconInactive}`} />Contacts</Link></li>\n <li><Link href=\"/admin/blogs\" className={`${linkCls} ${isActive(\"/admin/blogs\") ? linkActive : linkInactive}`}><File className={`h-4 w-4 mr-2 ${isActive(\"/admin/blogs\") ? iconActive : iconInactive}`} />Blogs</Link></li>\n <li><Link href=\"/admin/pages\" className={`${linkCls} ${isActive(\"/admin/pages\") ? linkActive : linkInactive}`}><LinkIcon className={`h-4 w-4 mr-2 ${isActive(\"/admin/pages\") ? iconActive : iconInactive}`} />Pages</Link></li>\n <li><Link href=\"/admin/forms\" className={`${linkCls} ${isActive(\"/admin/forms\") ? linkActive : linkInactive}`}><ClipboardList className={`h-4 w-4 mr-2 ${isActive(\"/admin/forms\") ? iconActive : iconInactive}`} />Forms</Link></li>\n <li><Link href=\"/admin/submissions\" className={`${linkCls} ${isActive(\"/admin/submissions\") ? linkActive : linkInactive}`}><MessageSquare className={`h-4 w-4 mr-2 ${isActive(\"/admin/submissions\") ? iconActive : iconInactive}`} />Submissions</Link></li>\n <li><Link href=\"/admin/media\" className={`${linkCls} ${isActive(\"/admin/media\") ? linkActive : linkInactive}`}><ImageIcon className={`h-4 w-4 mr-2 ${isActive(\"/admin/media\") ? iconActive : iconInactive}`} />Media</Link></li>\n </ul>\n </div>\n <div className={sectionCls}>\n <h3 className={headingCls}>System</h3>\n <ul className=\"space-y-0.5\">\n <li><Link href=\"/admin/users\" className={`${linkCls} ${isActive(\"/admin/users\") ? linkActive : linkInactive}`}><Users className={`h-4 w-4 mr-2 ${isActive(\"/admin/users\") ? iconActive : iconInactive}`} />Users</Link></li>\n <li><Link href=\"/admin/plugins\" className={`${linkCls} ${isActive(\"/admin/plugins\") ? linkActive : linkInactive}`}><Puzzle className={`h-4 w-4 mr-2 ${isActive(\"/admin/plugins\") ? iconActive : iconInactive}`} />Plugins</Link></li>\n <li><Link href=\"/admin/settings\" className={`${linkCls} ${isActive(\"/admin/settings\") ? linkActive : linkInactive}`}><Settings className={`h-4 w-4 mr-2 ${isActive(\"/admin/settings\") ? iconActive : iconInactive}`} />Settings</Link></li>\n </ul>\n </div>\n </nav>\n <footer className=\"flex-shrink-0 px-3 py-3 border-t border-gray-200 bg-white\">\n <a\n href={INFURO_FOOTER_URL}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-start gap-2 text-gray-500 hover:text-gray-700 transition-colors\"\n >\n <Image src={INFURO_FAVICON_BASE64} alt={INFURO_FOOTER_LABEL} width={32} height={32} className=\"rounded object-contain flex-shrink-0\" unoptimized />\n <div className=\"flex flex-col gap-0 items-start min-w-0\">\n <span className=\"text-[11px] font-medium leading-tight\">{INFURO_FOOTER_LABEL}</span>\n <span className=\"text-[10px] text-gray-400\">v{CMS_VERSION}</span>\n </div>\n </a>\n </footer>\n </div>\n </aside>\n );\n}\n","'use client';\n\nimport React, { createContext } from 'react';\nimport type { ThemeConfig } from '../theme/types';\n\nexport interface ThemeRegistryItem {\n id: string;\n label: string;\n config: ThemeConfig;\n /** Optional image URL for theme card */\n image?: string;\n /** Optional short description for theme card */\n description?: string;\n}\n\nexport interface PluginDescriptor {\n name: string;\n label: string;\n version: string;\n description?: string;\n enabled?: boolean;\n /** Icon name for card display (e.g. 'storage', 'email', 'payment') */\n icon?: string;\n}\n\nexport interface CustomNavItem {\n href: string;\n label: string;\n icon?: string;\n}\n\nexport interface CustomNavSection {\n title: string;\n items: CustomNavItem[];\n}\n\nexport interface CustomCrudColumn {\n field: string;\n displayName: string;\n type?: string;\n /** When set, form renders an async searchable relation dropdown instead of a plain input. */\n relationApi?: string;\n /** Field on the relation entity to show in the list (default: 'name'). */\n relationLabelField?: string;\n /** Field on the relation entity to use as value (default: 'id'). */\n relationValueField?: string;\n}\n\n/** Single filter: select (status, method, inventory) or dateRange or text (paymentRef, orderNumber). */\nexport interface CrudFilterSelectOption {\n value: string;\n label: string;\n}\n\nexport interface CrudFilter {\n /** Query param name (e.g. status, dateFrom, paymentRef). */\n param: string;\n label: string;\n type: 'select' | 'dateRange' | 'text';\n /** For type select: options. For dateRange: param is base; API expects param+From and param+To (e.g. dateFrom, dateTo). */\n options?: CrudFilterSelectOption[];\n}\n\nexport interface CustomCrudConfig {\n title: string;\n apiEndpoint: string;\n columns: CustomCrudColumn[];\n addEditPageUrl: string;\n /** Default sort order for list (e.g. 'desc' for newest first). */\n defaultSortOrder?: 'asc' | 'desc';\n /** Default sort field for list (e.g. 'createdAt'). */\n defaultSortField?: string;\n /** Optional list filters (status, date range, paymentRef, orderNumber, etc.). */\n filters?: CrudFilter[];\n}\n\nexport interface AdminConfigValue {\n customNavItems: CustomNavItem[];\n customNavSections?: CustomNavSection[];\n customCrudConfigs: Record<string, CustomCrudConfig>;\n theme?: ThemeConfig;\n themeRegistry?: ThemeRegistryItem[];\n activeThemeId?: string;\n pluginDescriptors?: PluginDescriptor[];\n storeEnabled?: boolean;\n}\n\nconst defaultValue: AdminConfigValue = {\n customNavItems: [],\n customNavSections: [],\n customCrudConfigs: {},\n};\n\nexport const AdminConfigContext = createContext<AdminConfigValue>(defaultValue);\n","export const INFURO_FAVICON_BASE64 = \"data:image/x-icon;base64,AAABAAMAEBAAAAEAIABoBAAANgAAACAgAAABACAAKBEAAJ4EAAAwMAAAAQAgAGgmAADGFQAAKAAAABAAAAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8V////bv///7D////R////0f///7D///9u////FQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wL///9s0qun7q9qYv/DkYv/6tfV///+/v///////////////+7///9r////AgAAAAAAAAAAAAAAAP///wL///+Q/////sqcl/+WOzH/ljsx/5c9M//AiYP/+/j4/////////////////v///5D///8CAAAAAAAAAAD///9s/////v/////Oo5//lz00/5Y7Mf+WOzH/ljsx/7Z3cP/9+/v////////////////+////bAAAAAD///8V////7v///////////v39//Tq6f/QqKP/m0U8/5Y7Mf+WOzH/z6ah/////////////////////+7///8V////bv///////////////////////////////+XOy/+ZQTf/ljsx/59MQ//69fX/////////////////////bv///7D/////////////////////////////////////wYyG/5Y7Mf+WOzH/4MTC/////////////////////7D////R//////////////////7+//79/f/+/f3//v39/+DGw/+WOzH/ljsx/82inf/////////////////////R////0f///////////////9Svq/+mWVH/pllR/6ZZUf+iUUj/ljsx/5Y7Mf/KnJf/////////////////////0f///7D////////////////KnJf/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/062p/////////////////////7D///9u////////////////0amk/6FQSP+hUEj/oVBI/6JRSP+mWVH/plpS/+7g3v////////////////////9u////Ff///+7///////////7+/v/9/Pz/9u7t/8SSjP/Dj4r/9ezr//79/f/////////////////////u////FQAAAAD///9s/////v///////////////8OPif+WOzH/ljsx/7+Jgv/////////////////////+////bAAAAAAAAAAA////Av///5D////+//////////+9hH7/ljsx/5Y7Mf+8g3z////////////////+////kP///wIAAAAAAAAAAAAAAAD///8C////bP///+7/////8OTi/7R0bP+zcmr/8OLh///////////u////bP///wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8V////bv///7D////R////0f///7D///9u////FQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAAAABAAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8C////Hf///0n///95////mf///67///+u////mf///3n///9J////Hf///wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8I////Tf///7D////p/////v////////////////////////////////////7////p////sP///03///8IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8C////Pfjz8r7HlpH7wY2H/86lof/iysf/9e3s///+/v//////////////////////////////////////////+////77///89////AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Cf///37////z9Ovq/6BORf+WOzH/ljsx/5Y8Mv+hUEf/v4iC/+rY1v/+/f3///////////////////////////////////////////H///99////CQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wr///+d/////P/////06+r/oE5F/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/m0Q7/8WTjf/38PD///////////////////////////////////////////z///+d////CgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8J////nf////3///////////Tr6v+gTkX/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/61mX//w4+L///////////////////////////////////////////3///+d////CQAAAAAAAAAAAAAAAAAAAAAAAAAA////Av///37////8////////////////9Ovq/6BORf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/6daUv/v4uD///////////////////////////////////////////z///9+////AgAAAAAAAAAAAAAAAAAAAAD///89////8//////////////////////48fD/rGRc/5pCOf+YPjT/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/6xkXf/37+////////////////////////////////////////////P///89AAAAAAAAAAAAAAAA////CP///77////////////////////////////////7+Pf/8eXj/+DGw/++hn//m0U8/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/8GLhf/9/Pz//////////////////////////////////////////77///8IAAAAAAAAAAD///9N////+/////////////////////////////////////////////////7+/v/p1tP/rGRd/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/mkI4/+XPzf//////////////////////////////////////////+////00AAAAA////Av///7D////////////////////////////////////////////////////////////////06+r/r2pi/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/tndw//38+///////////////////////////////////////////sP///wL///8d////6f/////////////////////////////////////////////////////////////////////x5eP/olJJ/5Y7Mf+WOzH/ljsx/5Y7Mf+aQjn/7dza///////////////////////////////////////////p////Hf///0n////+///////////////////////////////////////////////////////////////////////////Ur6v/ljwy/5Y7Mf+WOzH/ljsx/5Y7Mf/Oo5////////////////////////////////////////////7///9J////ef////////////////////////////////////////////////////////////////////////////////fw7/+jVEv/ljsx/5Y7Mf+WOzH/ljsx/7Nxav///////////////////////////////////////////////3n///+Z/////////////////////////////////////////////////////////////////////////////////////7yCfP+WOzH/ljsx/5Y7Mf+WOzH/pllQ//r29f//////////////////////////////////////////mf///67///////////////////////////////////////////79/f/9/Pz//fz8//38/P/9/Pz//fz8//38/P/9/Pz/yZuW/5Y7Mf+WOzH/ljsx/5Y7Mf+gT0b/9evr//////////////////////////////////////////+u////rv/////////////////////////////////////69vb/wo2I/7Z3cf+2d3H/tndx/7Z3cf+2d3H/tndx/7Z3cf+lV0//ljsx/5Y7Mf+WOzH/ljsx/6BORf/06+r//////////////////////////////////////////67///+Z//////////////////////////////////////Tr6v+gTkX/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/oE5F//Tr6v//////////////////////////////////////////mf///3n/////////////////////////////////////9Ovq/6BORf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+lVk7/+fPz//////////////////////////////////////////95////Sf////7////////////////////////////////06+r/oE5F/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/7FuZ////v7//////////////////////////////////////v///0n///8d////6f////////////////////////////////Tr6v+gTkX/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/zKCb///////////////////////////////////////////p////Hf///wL///+w////////////////////////////////+PLx/7d4cf+tZl//rWZf/61mX/+tZl//rWZf/61mX/+tZl//rmdg/7Z3cP+2d3H/tndx/7h7df/w4uH//////////////////////////////////////////7D///8CAAAAAP///03////7/////////////////////////////////Pv6//z6+f/8+vn//Pr5//z6+f/z6un/48zJ/+LKx//y5+b//fz8//38/P/9/Pz//fz8///////////////////////////////////////////7////TQAAAAAAAAAA////CP///77/////////////////////////////////////////////////////4MXC/6VXTv+WPDL/ljwy/6JRSP/aubb///7+/////////////////////////////////////////////////////77///8IAAAAAAAAAAAAAAAA////Pf////P///////////////////////////////////////////Xs6/+jU0r/ljsx/5Y7Mf+WOzH/ljsx/59MQv/w5OL////////////////////////////////////////////////z////PQAAAAAAAAAAAAAAAAAAAAD///8C////fv////z/////////////////////////////////////3sK//5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/9m5tf///////////////////////////////////////////P///37///8CAAAAAAAAAAAAAAAAAAAAAAAAAAD///8J////nf////3////////////////////////////////ZuLX/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/17Sw//////////////////////////////////////3///+d////CQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8K////nf////z//////////////////////////+zc2v+aQzn/ljsx/5Y7Mf+WOzH/ljsx/5pDOf/r2tj////////////////////////////////8////nf///woAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8J////fv////P//////////////////////v39/8eYkv+YPjT/ljsx/5Y7Mf+YPjT/xpSP//79/f//////////////////////////8////37///8JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8C////Pf///77////7/////////////////fv6/+DEwf/Ekoz/wY2H/97Bvv/8+vr/////////////////////+////77///89////AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////CP///03///+w////6f////7////////////////////////////////////+////6f///7D///9N////CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wL///8d////Sf///3n///+Z////rv///67///+Z////ef///0n///8d////AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAADAAAABgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8E////DP///xr///80////Rv///1n///9q////gP///4D///9q////Wf///0b///80////Gv///wz///8EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////CP///y7///9g////lP///7v////V////6P////r////8/////P////z////8////+v///+j////V////u////5T///9g////Lv///wgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wf///81////k////8/////v////+v////////////////////////////////////////////////////////////////////r////v////z////5P///81////BwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8G////Kv37+3zt3Nrd27y5/Nm6t//fxMH/59LQ//Dk4v/48vH//fv6//////////////////////////////////////////////////////////////////////z////d////fP///yr///8GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///xH///9g////wvz5+ffNop3+m0U8/5c+NP+cRz7/pFVN/65oYP+8gnv/0qun/+jU0v/59fT//v7+///////////////////////////////////////////////////////////+////9////8L///9f////EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////GP///4n////m/////fv4+P/KnJf/mUE4/5Y7Mf+WOzH/ljsx/5Y7Mf+XPTT/m0Q6/6ZaUf/BjIX/6NXT//z5+f////////////////////////////////////////////////////////////////3////k////if///xgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wH///8i////pP////f///////////v4+P/KnJf/mUE4/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+XPjT/oVFI/8yhnP/x5OP//vz8////////////////////////////////////////////////////////////////9////6T///8i////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///yL///+d////8/////////////////v4+P/KnJf/mUE4/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5tEOv+3eHL/48rH//37+/////////////////////////////////////////////////////////////////P///+d////IgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////GP///6T////z//////////////////////v4+P/KnJf/mUE4/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+YPjT/qFxT/9y+uv/9+vr////////////////////////////////////////////////////////////////z////pP///xgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8R////if////f///////////////////////////v4+P/KnJf/mUE4/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsy/6NUS//Yt7P//Pn4////////////////////////////////////////////////////////////////9////4n///8RAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wb///9g////5v////////////////////////////////v4+P/KnZj/mUI4/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5c8Mv+pXlb/38PA//38/P///////////////////////////////////////////////////////////////+b///9g////BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///yr////C/////f////////////////////////////////38+//dwLz/qF1V/51JP/+bRDv/mD40/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+XPTP/qWBY/+vZ2P///v7///////////////////////////////////////////////////////////3////C////KgAAAAAAAAAAAAAAAAAAAAAAAAAA////B////3z////3///////////////////////////////////////////9+/r/9/Dv/+zc2f/dwLz/x5iT/7BrY/+eS0H/lz0z/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/lzwy/7d6c//06un////////////////////////////////////////////////////////////////3////fP///wcAAAAAAAAAAAAAAAAAAAAA////Nf///93////+//////////////////////////////////////////////////////7+/v/+/v7//fz8//Hm5f/XtLH/s3Fq/5lCOP+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/51JP//Sq6b//Pn5///////////////////////////////////////////////////////////+////3f///zUAAAAAAAAAAAAAAAD///8I////k/////z////////////////////////////////////////////////////////////////////////////////9+/v/8eTj/8aVkP+dRz7/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5c8Mv+vamL/7uDf/////////////////////////////////////////////////////////////////P///5P///8IAAAAAAAAAAD///8u////z/////////////////////////////////////////////////////////////////////////////////////////////////fx8P/ImZP/nUg//5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+ZQTj/0qyo//38/P///////////////////////////////////////////////////////////////8////8uAAAAAP///wT///9g////7//////////////////////////////////////////////////////////////////////////////////////////////////////07Or/xJGL/5hAN/+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/rGRd//Tq6P///////////////////////////////////////////////////////////////+////9g////BP///wz///+U////+v////////////////////////////////////////////////////////////////////////////////////////////////////////7/8+jm/7Nya/+WPDP/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/mkQ7/9m3s////v7///////////////////////////////////////////////////////////r///+U////DP///xr///+7/////////////////////////////////////////////////////////////////////////////////////////////////////////////////v7+/+HHxP+hUEf/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljwy/7yBe//69/f///////////////////////////////////////////////////////////////+7////Gv///zT////V//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////bu7f+7gHr/mD40/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/6xkXP/u4N/////////////////////////////////////////////////////////////////V////NP///0b////o//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////38/P/XtK//nEY9/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/6BNRP/iycb////////////////////////////////////////////////////////////////o////Rv///1n////6///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////o1NL/pVhQ/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5xGPP/Yt7L//v39///////////////////////////////////////////////////////////6////Wf///2r////8///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////06un/sW1m/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5pDOf/PpKD//Pr5///////////////////////////////////////////////////////////8////av///4D////8/////////////////////////////////////////////////////////////v7//fv7//37+v/9+/r//fv6//37+v/9+/r//fv6//37+v/9+/r//fv6//37+v/06un/snBp/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5lBOP/KnJj/+/j4///////////////////////////////////////////////////////////8////gP///4D////8//////////////////////////////////////////////////////79/f/s3Nr/z6ej/8uemv/Lnpr/y56a/8uemv/Lnpr/y56a/8uemv/Lnpr/y56a/8uemv/GlI//o1VM/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5lBOP/KnJf/+/j4///////////////////////////////////////////////////////////8////gP///2r////8//////////////////////////////////////////////////////z5+f/Nop3/m0Q7/5Y8Mv+WPDL/ljwy/5Y8Mv+WPDL/ljwy/5Y8Mv+WPDL/ljwy/5Y8Mv+WPDL/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5lBOP/KnJf/+/j4///////////////////////////////////////////////////////////8////av///1n////6//////////////////////////////////////////////////////v4+P/KnJf/mUE4/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5lCOP/KnZj/+/j4///////////////////////////////////////////////////////////6////Wf///0b////o//////////////////////////////////////////////////////v4+P/KnJf/mUE4/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5pDOv/Qp6P//Pr6///////////////////////////////////////////////////////////o////Rv///zT////V//////////////////////////////////////////////////////v4+P/KnJf/mUE4/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/51IP//bvbr//v7+///////////////////////////////////////////////////////////V////NP///xr///+7//////////////////////////////////////////////////////v4+P/KnJf/mUE4/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/6RVTf/n0c////////////////////////////////////////////////////////////////+7////Gv///wz///+U////+v////////////////////////////////////////////////v4+P/KnJf/mUE4/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/7FuZ//z6ej///////////////////////////////////////////////////////////r///+U////DP///wT///9g////7/////////////////////////////////////////////////z4+P/LnZj/mkI5/5Y8Mv+WPDL/ljwy/5Y8Mv+WPDL/ljwy/5Y8Mv+WPDL/ljwy/5Y8Mv+WPDL/ljwy/5Y8Mv+WPDL/ljwy/5Y8Mv+WPDL/mUE3/8mblf/9+/r//////////////////////////////////////////////////////////+////9g////BAAAAAD///8u////z/////////////////////////////////////////////////38/P/iycb/v4iC/7yCfP+8gnz/vIJ8/7yCfP+8gnz/vIJ8/7yCfP+8gnz/vIJ8/7yCfP+8gnz/voR+/8qcl//Lnpr/y56a/8uemv/Lnpr/zqOf//Hl5P///v7//////////////////////////////////////////////////////////8////8uAAAAAAAAAAD///8I////k/////z////////////////////////////////////////////////9/Pz/+vf2//r39v/69/b/+vf2//r39v/69/b/+vf2//j08//07Ov/7+Df/+7f3v/z6+n/+PPy//z6+v/9+/r//fv6//37+v/9+/r//fv7///+/v///////////////////////////////////////////////////////////P///5P///8IAAAAAAAAAAAAAAAA////Nf///93////+/////////////////////////////////////////////////////////////////////////////v7/9u7t/9i3s/++hn//sW1m/7BsZf+7gnv/066q//Ln5v/+/v7////////////////////////////////////////////////////////////////////////////////+////3f///zUAAAAAAAAAAAAAAAAAAAAA////B////3z////3///////////////////////////////////////////////////////////////////////////17Ov/wo6I/55KQf+XPjT/ljsx/5Y7Mf+XPTP/nEY9/7uBe//x5eP////////////////////////////////////////////////////////////////////////////////3////fP///wcAAAAAAAAAAAAAAAAAAAAAAAAAAP///yr////C/////f////////////////////////////////////////////////////////////////37+//UsKz/nUg//5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5tEO//No57/+/j4//////////////////////////////////////////////////////////////////////3////C////KgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wb///9g////5v////////////////////////////////////////////////////////////////bv7/+5fHb/lz0z/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y8Mv+ycGj/8ujm/////////////////////////////////////////////////////////////////////+b///9g////BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8R////if////f//////////////////////////////////////////////////////////+3e3P+qYlr/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+oXVT/6tnX////////////////////////////////////////////////////////////////9////4n///8RAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////GP///6T////z/////////////////////////////////////////////////////+vZ1/+oXVT/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+nWlL/6dbU///////////////////////////////////////////////////////////z////pP///xgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///yL///+d////8/////////////////////////////////////////////////Hm5f+wa2T/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5Y7Mf+uaGD/8OPh//////////////////////////////////////////////////////P///+d////IgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wH///8i////pP////f///////////////////////////////////////////r19P/CjYf/mD81/5Y7Mf+WOzH/ljsx/5Y7Mf+WOzH/ljsx/5g/Nf/BjIb/+fTz////////////////////////////////////////////////9////6T///8i////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////GP///4n////m/////f////////////////////////////////7+/v/m0M7/qmFZ/5c9M/+WOzH/ljsx/5Y7Mf+WOzH/lz0z/6leV//lz8z//v7+//////////////////////////////////////3////m////if///xgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///xH///9g////wv////f////+///////////////////////////8+vr/4snG/7d4cf+iUUj/mUA3/5c+NP+gTkT/tXVu/+DFw//8+fn////////////////////////////////+////9////8L///9g////EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8G////Kv///3z////d/////P///////////////////////////v38//Tr6v/kzcv/2726/9m6t//jysf/8uno//78/P////////////////////////////////z////d////fP///yr///8GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wf///81////k////8/////v////+v////////////////////////////////////////////////////////////////////r////v////z////5P///81////BwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////CP///y7///9g////lP///7v////V////6P////r////8/////P////z////8////+v///+j////V////u////5T///9g////Lv///wgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8E////DP///xr///80////Rv///1n///9q////gP///4D///9q////Wf///0b///80////Gv///wz///8EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==\";\n","declare const __CMS_CORE_VERSION__: string;\nexport const CMS_VERSION = typeof __CMS_CORE_VERSION__ !== \"undefined\" ? __CMS_CORE_VERSION__ : \"0.0.0\";\n","\"use client\";\n\nimport Link from \"next/link\";\nimport { usePathname } from \"next/navigation\";\nimport { useContext } from \"react\";\nimport {\n LayoutDashboard,\n Inbox,\n MessageSquare,\n File,\n ShoppingCart,\n ShoppingBag,\n Users,\n MoreHorizontal,\n} from \"lucide-react\";\nimport { AdminConfigContext } from \"../../admin/admin-config-context\";\nimport { cn } from \"@/lib/utils\";\n\ntype NavItem = {\n href: string;\n label: string;\n Icon: React.ComponentType<{ className?: string }>;\n};\n\nexport default function MobileBottomNav({ onOpenMore }: { onOpenMore: () => void }) {\n const pathname = usePathname();\n const { storeEnabled } = useContext(AdminConfigContext);\n\n const isActive = (path: string) => {\n if (path === \"/admin/dashboard\") return pathname === path;\n return pathname.startsWith(path);\n };\n\n const itemsWithoutStore: NavItem[] = [\n { href: \"/admin/dashboard\", label: \"Dashboard\", Icon: LayoutDashboard },\n { href: \"/admin/contacts\", label: \"Contacts\", Icon: Inbox },\n { href: \"/admin/submissions\", label: \"Submissions\", Icon: MessageSquare },\n { href: \"/admin/blogs\", label: \"Blogs\", Icon: File },\n ];\n\n const itemsWithStore: NavItem[] = [\n { href: \"/admin/dashboard\", label: \"Dashboard\", Icon: LayoutDashboard },\n { href: \"/admin/orders\", label: \"Orders\", Icon: ShoppingCart },\n { href: \"/admin/contacts\", label: \"Customers\", Icon: Users },\n { href: \"/admin/products\", label: \"Products\", Icon: ShoppingBag },\n ];\n\n const navItems = storeEnabled ? itemsWithStore : itemsWithoutStore;\n\n return (\n <nav className=\"fixed bottom-0 left-0 right-0 z-40 bg-white border-t border-gray-200\">\n <div className=\"flex items-center justify-around h-14 px-1\">\n {navItems.map(({ href, label, Icon }) => (\n <Link\n key={href}\n href={href}\n className={cn(\n \"flex flex-col items-center justify-center flex-1 min-w-0 py-1.5 gap-0.5 text-[10px] font-medium transition-colors\",\n isActive(href) ? \"text-gray-900\" : \"text-gray-500\"\n )}\n >\n <Icon className={cn(\"h-5 w-5 shrink-0\", isActive(href) ? \"text-gray-900\" : \"text-gray-400\")} />\n <span className=\"truncate max-w-full\">{label}</span>\n </Link>\n ))}\n <button\n type=\"button\"\n onClick={onOpenMore}\n className=\"flex flex-col items-center justify-center flex-1 min-w-0 py-1.5 gap-0.5 text-[10px] font-medium text-gray-500 hover:text-gray-900 transition-colors\"\n >\n <MoreHorizontal className=\"h-5 w-5 shrink-0 text-gray-400\" />\n <span className=\"truncate max-w-full\">More</span>\n </button>\n </div>\n </nav>\n );\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as SheetPrimitive from \"@radix-ui/react-dialog\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { X } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Sheet = SheetPrimitive.Root\n\nconst SheetTrigger = SheetPrimitive.Trigger\n\nconst SheetClose = SheetPrimitive.Close\n\nconst SheetPortal = SheetPrimitive.Portal\n\nconst SheetOverlay = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Overlay\n className={cn(\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n ref={ref}\n />\n))\nSheetOverlay.displayName = SheetPrimitive.Overlay.displayName\n\nconst sheetVariants = cva(\n \"fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500 data-[state=open]:animate-in data-[state=closed]:animate-out\",\n {\n variants: {\n side: {\n top: \"inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top\",\n bottom:\n \"inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom\",\n left: \"inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm\",\n right:\n \"inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm\",\n },\n },\n defaultVariants: {\n side: \"right\",\n },\n }\n)\n\ninterface SheetContentProps\n extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>,\n VariantProps<typeof sheetVariants> {}\n\nconst SheetContent = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Content>,\n SheetContentProps\n>(({ side = \"right\", className, children, ...props }, ref) => (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n ref={ref}\n className={cn(sheetVariants({ side }), className)}\n {...props}\n >\n <SheetPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n {children}\n </SheetPrimitive.Content>\n </SheetPortal>\n))\nSheetContent.displayName = SheetPrimitive.Content.displayName\n\nconst SheetHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-2 text-center sm:text-left\",\n className\n )}\n {...props}\n />\n)\nSheetHeader.displayName = \"SheetHeader\"\n\nconst SheetFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className\n )}\n {...props}\n />\n)\nSheetFooter.displayName = \"SheetFooter\"\n\nconst SheetTitle = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Title\n ref={ref}\n className={cn(\"text-lg font-semibold text-foreground\", className)}\n {...props}\n />\n))\nSheetTitle.displayName = SheetPrimitive.Title.displayName\n\nconst SheetDescription = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n))\nSheetDescription.displayName = SheetPrimitive.Description.displayName\n\nexport {\n Sheet,\n SheetPortal,\n SheetOverlay,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n","export const ADMIN_THEME_CSS = `\n@import url(\"https://fonts.googleapis.com/css2?family=Inter:wght@100;200;300;400;500;600;700;800;900&display=swap\");\n:root{--background:0 0% 100%;--foreground:0 0% 9%;--card:0 0% 100%;--card-foreground:0 0% 9%;--popover:0 0% 100%;--popover-foreground:0 0% 9%;--primary:0 0% 9%;--primary-foreground:0 0% 98%;--secondary:0 0% 96.1%;--secondary-foreground:0 0% 9%;--muted:0 0% 96.1%;--muted-foreground:0 0% 45.1%;--accent:0 0% 96.1%;--accent-foreground:0 0% 9%;--destructive:0 84.2% 60.2%;--destructive-foreground:0 0% 98%;--border:0 0% 89.8%;--input:0 0% 89.8%;--ring:0 0% 3.9%;--chart-1:0 0% 40%;--chart-2:0 0% 55%;--chart-3:0 0% 70%;--chart-4:0 0% 45%;--chart-5:0 0% 60%;--radius:0.375rem;--sidebar-background:0 0% 100%;--sidebar-foreground:0 0% 9%;--sidebar-primary:0 0% 9%;--sidebar-primary-foreground:0 0% 98%;--sidebar-accent:0 0% 96.1%;--sidebar-accent-foreground:0 0% 9%;--sidebar-border:0 0% 89.8%;--sidebar-ring:0 0% 9%}\n.dark{--background:0 0% 3.9%;--foreground:0 0% 98%;--card:0 0% 3.9%;--card-foreground:0 0% 98%;--primary:0 0% 98%;--primary-foreground:0 0% 9%;--secondary:0 0% 14.9%;--secondary-foreground:0 0% 98%;--muted:0 0% 14.9%;--muted-foreground:0 0% 63.9%;--border:0 0% 14.9%;--input:0 0% 14.9%;--ring:0 0% 83.1%;--sidebar-background:0 0% 9%;--sidebar-foreground:0 0% 98%;--sidebar-primary:0 0% 98%;--sidebar-primary-foreground:0 0% 9%;--sidebar-accent:0 0% 14.9%;--sidebar-accent-foreground:0 0% 98%;--sidebar-border:0 0% 14.9%;--sidebar-ring:0 0% 83.1%}\n*,*::before,*::after{border-color:hsl(var(--border))}\nbody{font-family:\"Inter\",ui-sans-serif,system-ui,sans-serif;font-size:14px}\n.admin-app{font-size:13.5px}\n.admin-app main{padding:0.85rem 1.15rem}\n.admin-app .rounded-lg .p-6,.admin-app [class*=\"p-6\"]{padding:0.85rem 1.15rem}\n.admin-app .px-6{padding-left:1.15rem;padding-right:1.15rem}\n.admin-app .py-4{padding-top:0.6rem;padding-bottom:0.6rem}\n.admin-app .py-6{padding-top:0.85rem;padding-bottom:0.85rem}\n.admin-app .text-xl{font-size:1.0625rem}\n.admin-app .text-lg{font-size:1rem}\n.admin-app .text-sm{font-size:0.8375rem}\n.admin-app .text-xs{font-size:0.775rem}\n.admin-app table td,.admin-app table th{padding:0.3rem 0.6rem;font-size:0.8375rem}\n.admin-app h1{font-size:1.0625rem;font-weight:600}\n.admin-app h2{font-size:1rem;font-weight:600}\n.admin-app h3{font-size:0.8375rem;font-weight:600}\n.admin-app .space-y-8 > * + *{margin-top:0.6rem}\n.admin-app .gap-4{gap:0.625rem}\n.admin-app .gap-6{gap:0.875rem}\n.admin-app .mb-6{margin-bottom:0.875rem}\n.admin-app .mb-8{margin-bottom:1.125rem}\n\n/* Sleek scrollbar: thin, rounded; visible on hover/scroll */\n#admin-root .admin-scroll,.admin-scroll{scrollbar-width:thin;scrollbar-color:transparent transparent;transition:scrollbar-color 0.2s ease}\n#admin-root .admin-scroll:hover,.admin-scroll:hover{scrollbar-color:rgba(0,0,0,.18) transparent}\n#admin-root .admin-scroll::-webkit-scrollbar,.admin-scroll::-webkit-scrollbar{width:5px;height:5px}\n#admin-root .admin-scroll::-webkit-scrollbar-track,.admin-scroll::-webkit-scrollbar-track{background:transparent}\n#admin-root .admin-scroll::-webkit-scrollbar-thumb,.admin-scroll::-webkit-scrollbar-thumb{background:transparent;border-radius:2.5px;transition:background 0.2s ease}\n#admin-root .admin-scroll:hover::-webkit-scrollbar-thumb,.admin-scroll:hover::-webkit-scrollbar-thumb{background:rgba(0,0,0,.18)}\n#admin-root .admin-scroll::-webkit-scrollbar-thumb:hover,.admin-scroll::-webkit-scrollbar-thumb:hover{background:rgba(0,0,0,.28)}\n#admin-root .admin-scroll::-webkit-scrollbar-thumb:active,.admin-scroll::-webkit-scrollbar-thumb:active{background:rgba(0,0,0,.35)}\n`;\n","'use client';\n\nimport { Toaster } from 'sonner';\nimport AdminHeader from '../components/Admin/Header';\nimport AdminSidebar from '../components/Admin/Sidebar';\n\nexport function AdminShell({ children }: { children: React.ReactNode }) {\n return (\n <div className=\"min-h-screen bg-[rgb(240,242,249)] flex flex-col\">\n <AdminHeader />\n <div className=\"flex flex-1\">\n <AdminSidebar />\n <main className=\"admin-scroll flex-1 p-6 bg-[rgb(240,242,249)] overflow-auto\">{children}</main>\n </div>\n <Toaster position=\"top-right\" />\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport CreateEditForm from \"./CreateEditForm\";\nimport {\n Table,\n TableHeader,\n TableRow,\n TableHead,\n TableBody,\n TableCell,\n} from \"@/components/ui/table\";\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport {\n Pagination,\n PaginationContent,\n PaginationItem,\n PaginationPrevious,\n PaginationNext,\n PaginationLink,\n} from \"@/components/ui/pagination\";\nimport { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from \"@/components/ui/dialog\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { formatDate, formatDateTime } from \"@/lib/utils\";\nimport { useIsMobile } from \"@/hooks/use-mobile\";\nimport { Edit, Trash2, Eye, Plus, Search, Check, X, RefreshCw, Upload, Download, MoreVertical, Filter } from \"lucide-react\";\nimport Link from \"next/link\";\nimport BulkUploadDialog from \"./BulkUploadDialog\";\n\nfunction getNestedValue(obj: Record<string, unknown> | null, path: string): unknown {\n return path.split(\".\").reduce((current: Record<string, unknown> | null, key: string) => {\n return current && current[key] !== undefined ? (current[key] as Record<string, unknown> | null) : null;\n }, obj);\n}\n\nfunction formatCellValue(value: unknown, col: { type?: string }): React.ReactNode {\n if (col.type === \"boolean\") return value ? <Check className=\"h-4 w-4 text-green-600\" /> : <X className=\"h-4 w-4 text-red-600\" />;\n if (col.type === \"date\") return formatDate(value as string | Date);\n if (col.type === \"datetime\") return formatDateTime(value as string | Date);\n return value != null ? String(value) : \"—\";\n}\n\nexport type CrudFilterOption = { value: string; label: string };\nexport type CrudFilterItem = {\n param: string;\n label: string;\n type: 'select' | 'dateRange' | 'text';\n options?: CrudFilterOption[];\n};\n\nexport default function AdminCRUD({\n title,\n apiEndpoint,\n columns,\n addEditPageUrl,\n customViewPageUrl,\n defaultSortField = '',\n defaultSortOrder = 'asc',\n filters = [],\n extraListParams,\n}: {\n title: string;\n apiEndpoint: string;\n columns: any[];\n addEditPageUrl: string;\n customViewPageUrl?: string;\n defaultSortField?: string;\n defaultSortOrder?: 'asc' | 'desc';\n filters?: CrudFilterItem[];\n extraListParams?: Record<string, string>;\n}) {\n const [data, setData] = useState<Record<string, unknown>[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [page, setPage] = useState(1);\n const [totalPages, setTotalPages] = useState(1);\n const [sortField, setSortField] = useState(defaultSortField);\n const [sortOrder, setSortOrder] = useState(defaultSortOrder);\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [filterValues, setFilterValues] = useState<Record<string, string>>({});\n const [filterApplyKey, setFilterApplyKey] = useState(0);\n const [isFormOpen, setIsFormOpen] = useState(false);\n const [editingItem, setEditingItem] = useState<Record<string, unknown> | null>(null);\n const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);\n const [itemToDelete, setItemToDelete] = useState<Record<string, unknown> | null>(null);\n const [deleteLoading, setDeleteLoading] = useState(false);\n const [refreshKey, setRefreshKey] = useState(0);\n const [bulkDialogOpen, setBulkDialogOpen] = useState(false);\n const [showFilters, setShowFilters] = useState(false);\n const isMobile = useIsMobile();\n\n useEffect(() => {\n async function loadData() {\n try {\n setLoading(true);\n setError(null);\n \n const params = new URLSearchParams({\n page: page.toString(),\n limit: \"10\",\n sortField,\n sortOrder,\n search: searchQuery,\n });\n filters.forEach((f) => {\n if (f.type === 'dateRange') {\n const from = filterValues.dateFrom ?? '';\n const to = filterValues.dateTo ?? '';\n if (from) params.set('dateFrom', from);\n if (to) params.set('dateTo', to);\n } else {\n const v = filterValues[f.param] ?? '';\n if (v) params.set(f.param, v);\n }\n });\n if (extraListParams) {\n Object.entries(extraListParams).forEach(([k, v]) => {\n if (v) params.set(k, v);\n });\n }\n \n const res = await fetch(`${apiEndpoint}?${params.toString()}`);\n \n if (!res.ok) {\n throw new Error(`HTTP error! status: ${res.status}`);\n }\n \n const result = await res.json();\n \n // Ensure data is always an array\n const safeData = Array.isArray(result.data) ? result.data : [];\n setData(safeData);\n setTotalPages(result.totalPages || 1);\n } catch (err) {\n console.error('Error loading data:', err);\n setError(err instanceof Error ? err.message : 'Failed to load');\n setData([]);\n setTotalPages(1);\n } finally {\n setLoading(false);\n }\n }\n \n loadData();\n }, [page, sortField, sortOrder, searchQuery, apiEndpoint, refreshKey, filterApplyKey, extraListParams]);\n\n const handleSort = (field: string) => {\n setSortField(field);\n setSortOrder(sortOrder === \"asc\" ? \"desc\" : \"asc\");\n };\n\n const handleSearch = () => {\n setPage(1);\n };\n\n const handleApplyFilters = () => {\n setPage(1);\n setFilterApplyKey((k) => k + 1);\n };\n\n const handleDeleteClick = (item: Record<string, unknown> & { id?: unknown }) => {\n setItemToDelete(item);\n setDeleteDialogOpen(true);\n };\n\n const handleDelete = async () => {\n if (!itemToDelete) return;\n \n setDeleteLoading(true);\n try {\n const res = await fetch(`${apiEndpoint}/${itemToDelete.id}`, { method: \"DELETE\" });\n if (res.ok) {\n setRefreshKey((k) => k + 1);\n setDeleteDialogOpen(false);\n setItemToDelete(null);\n } else {\n console.error('Failed to delete item');\n }\n } catch (err: unknown) {\n console.error('Error deleting item:', err);\n } finally {\n setDeleteLoading(false);\n }\n };\n\n const handleEdit = (item: Record<string, unknown> & { id?: unknown }) => {\n setEditingItem(item);\n setIsFormOpen(true);\n };\n\n const handleRegenerateInvite = async (userId: number) => {\n try {\n const res = await fetch(`/api/users/${userId}/regenerate-invite`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n });\n \n if (!res.ok) {\n const error = await res.json();\n throw new Error(error.error || \"Failed to regenerate invite\");\n }\n \n const result = await res.json();\n \n if (result.inviteLink) {\n alert(`New invite link generated: ${result.inviteLink}\\n\\nNote: ${result.note}`);\n }\n } catch (error: unknown) {\n console.error(\"Error regenerating invite:\", error);\n alert(error instanceof Error ? error.message : \"Failed to regenerate invite\");\n }\n };\n\n const addEditPage = addEditPageUrl && addEditPageUrl.length > 0;\n const hasCustomView = customViewPageUrl && customViewPageUrl.length > 0;\n \n // Extract resource name from API endpoint\n const resourceName = apiEndpoint.replace('/api/', '');\n\n const handleExport = async () => {\n try {\n const res = await fetch(`${apiEndpoint}/export?format=csv`);\n if (!res.ok) throw new Error(\"Export failed\");\n const blob = await res.blob();\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = `${resourceName}.csv`;\n a.click();\n URL.revokeObjectURL(url);\n } catch (err) {\n console.error(\"Export error:\", err);\n alert(\"Failed to export data\");\n }\n };\n\n if (loading) {\n return (\n <div className=\"rounded-lg bg-white p-6 shadow-md\">\n <div className=\"flex items-center justify-center py-8\">\n <div className=\"animate-spin rounded-full h-6 w-6 border-2 border-gray-300 border-t-gray-600\"></div>\n <span className=\"ml-2\">Loading...</span>\n </div>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"rounded-lg bg-white p-6 shadow-md\">\n <div className=\"text-center py-8\">\n <p className=\"text-red-600 mb-4\">Error loading data: {error}</p>\n <Button onClick={() => window.location.reload()}>Retry</Button>\n </div>\n </div>\n );\n }\n\n return (\n <>\n <div className=\"rounded-lg bg-white shadow-md min-w-0\">\n {/* Header with loader color gradient background */}\n <div className=\"bg-gray-800 border-b border-gray-700 px-4 py-2.5 rounded-t-lg\">\n {isMobile ? (\n <div className=\"flex items-center gap-2 min-w-0\">\n <div className=\"min-w-0 flex-1\">\n <h1 className=\"text-base font-semibold text-white truncate\">{title}</h1>\n <p className=\"text-xs text-gray-300 mt-0.5 truncate\">Manage and view all records</p>\n </div>\n <div className=\"flex items-center gap-1 shrink-0\">\n {!addEditPage && (\n <Button\n onClick={() => {\n setEditingItem(null);\n setIsFormOpen(true);\n }}\n size=\"icon\"\n className=\"h-8 w-8 bg-white text-gray-800 hover:bg-gray-100 border-0\"\n >\n <Plus className=\"h-4 w-4\" />\n <span className=\"sr-only\">Add</span>\n </Button>\n )}\n {addEditPage && (\n <Link\n href={addEditPageUrl + \"/create\"}\n className=\"inline-flex h-8 w-8 items-center justify-center rounded-md bg-white text-gray-800 hover:bg-gray-100 border-0\"\n >\n <Plus className=\"h-4 w-4\" />\n <span className=\"sr-only\">Add</span>\n </Link>\n )}\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"h-8 w-8 bg-transparent text-white border-gray-600 hover:bg-gray-700\"\n >\n <MoreVertical className=\"h-4 w-4\" />\n <span className=\"sr-only\">More actions</span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onClick={() => setBulkDialogOpen(true)}>\n <Upload className=\"h-4 w-4 mr-2\" />\n Import\n </DropdownMenuItem>\n <DropdownMenuItem onClick={handleExport}>\n <Download className=\"h-4 w-4 mr-2\" />\n Export\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n ) : (\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <h1 className=\"text-base font-semibold text-white\">{title}</h1>\n <p className=\"text-xs text-gray-300 mt-0.5\">Manage and view all records</p>\n </div>\n <div className=\"flex flex-wrap gap-2 shrink-0\">\n <Button\n onClick={() => setBulkDialogOpen(true)}\n variant=\"outline\"\n className=\"bg-transparent text-white border-gray-600 hover:bg-gray-700 text-xs h-8\"\n >\n <Upload className=\"h-3.5 w-3.5 mr-1\" />\n Import\n </Button>\n <Button\n onClick={handleExport}\n variant=\"outline\"\n className=\"bg-transparent text-white border-gray-600 hover:bg-gray-700 text-xs h-8\"\n >\n <Download className=\"h-3.5 w-3.5 mr-1\" />\n Export\n </Button>\n {!addEditPage && (\n <Button\n onClick={() => {\n setEditingItem(null);\n setIsFormOpen(true);\n }}\n className=\"bg-white text-gray-800 hover:bg-gray-100 border-0 text-xs h-8\"\n >\n <Plus className=\"h-3.5 w-3.5\" />\n Add\n </Button>\n )}\n {addEditPage && (\n <Link\n href={addEditPageUrl + \"/create\"}\n className=\"inline-flex items-center gap-1 bg-white text-gray-800 hover:bg-gray-100 border-0 text-xs h-8 px-3 rounded-md font-medium\"\n >\n <Plus className=\"h-3.5 w-3.5\" />\n Add\n </Link>\n )}\n </div>\n </div>\n )}\n </div>\n \n <div className=\"p-4 min-w-0\">\n \n {/* Search Box with icon buttons */}\n <div className=\"mb-4 flex min-w-0\">\n <div className=\"flex flex-1 min-w-0 items-center rounded-md border border-gray-300 bg-white focus-within:ring-2 focus-within:ring-gray-400 focus-within:ring-offset-0\">\n <Input\n type=\"text\"\n placeholder=\"Search...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n onKeyDown={(e) => e.key === \"Enter\" && handleSearch()}\n className=\"border-0 focus-visible:ring-0 focus-visible:ring-offset-0 rounded-l-md rounded-r-none flex-1 min-w-0\"\n />\n <div className=\"flex items-center border-l border-gray-200\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className={`h-8 w-8 rounded-none text-gray-600 hover:bg-gray-100 ${filters && filters.length > 0 ? \"\" : \"rounded-r-md\"}`}\n onClick={handleSearch}\n >\n <Search className=\"h-4 w-4\" />\n <span className=\"sr-only\">Search</span>\n </Button>\n {filters && filters.length > 0 && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className={`h-8 w-8 rounded-r-md rounded-l-none text-gray-600 hover:bg-gray-100 ${showFilters ? \"bg-gray-100\" : \"\"}`}\n onClick={() => setShowFilters((v) => !v)}\n >\n <Filter className=\"h-4 w-4\" />\n <span className=\"sr-only\">Toggle filters</span>\n </Button>\n )}\n </div>\n </div>\n </div>\n\n {/* Filters */}\n {filters && filters.length > 0 && showFilters && (\n <div className=\"mb-4 min-w-0 flex flex-wrap items-end gap-3 rounded border border-gray-200 bg-gray-50/50 p-3\">\n {filters.map((f) => {\n if (f.type === 'select') {\n return (\n <div key={f.param} className=\"flex flex-col gap-1\">\n <label className=\"text-xs font-medium text-gray-600\">{f.label}</label>\n <select\n className=\"rounded border border-gray-300 px-2 py-1.5 text-sm min-w-[120px]\"\n value={filterValues[f.param] ?? ''}\n onChange={(e) => setFilterValues((prev) => ({ ...prev, [f.param]: e.target.value }))}\n >\n {(f.options ?? []).map((opt) => (\n <option key={opt.value} value={opt.value}>{opt.label}</option>\n ))}\n </select>\n </div>\n );\n }\n if (f.type === 'dateRange') {\n return (\n <div key={f.param} className=\"flex flex-col gap-1\">\n <label className=\"text-xs font-medium text-gray-600\">{f.label}</label>\n <div className=\"flex items-center gap-2\">\n <input\n type=\"date\"\n className=\"rounded border border-gray-300 px-2 py-1.5 text-sm\"\n value={filterValues.dateFrom ?? ''}\n onChange={(e) => setFilterValues((prev) => ({ ...prev, dateFrom: e.target.value }))}\n />\n <span className=\"text-gray-400\">–</span>\n <input\n type=\"date\"\n className=\"rounded border border-gray-300 px-2 py-1.5 text-sm\"\n value={filterValues.dateTo ?? ''}\n onChange={(e) => setFilterValues((prev) => ({ ...prev, dateTo: e.target.value }))}\n />\n </div>\n </div>\n );\n }\n return (\n <div key={f.param} className=\"flex flex-col gap-1\">\n <label className=\"text-xs font-medium text-gray-600\">{f.label}</label>\n <Input\n type=\"text\"\n placeholder={f.label}\n className=\"h-8 w-40\"\n value={filterValues[f.param] ?? ''}\n onChange={(e) => setFilterValues((prev) => ({ ...prev, [f.param]: e.target.value }))}\n />\n </div>\n );\n })}\n <Button variant=\"outline\" size=\"sm\" className=\"h-8\" onClick={handleApplyFilters}>\n Apply filters\n </Button>\n </div>\n )}\n\n {/* Table (desktop) / Card list (mobile) */}\n {isMobile ? (\n <div className=\"flex flex-col gap-2 min-w-0\">\n {data && data.length > 0 ? (\n data.map((item: Record<string, unknown> & { id?: unknown }, index: number) => {\n const displayCols = columns?.slice(0, 4) ?? [];\n const primary = displayCols[0];\n const primaryVal = primary ? getNestedValue(item, primary.field || primary.key) : null;\n return (\n <div\n key={String(item.id ?? index)}\n className=\"min-w-0 rounded-md border border-gray-200 bg-gray-50/50 p-2.5 flex flex-col gap-1\"\n >\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"min-w-0 break-words flex-1 leading-tight\">\n <span className=\"font-medium\">{primaryVal != null ? String(primaryVal) : \"—\"}</span>\n </div>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8 shrink-0\">\n <MoreVertical className=\"h-4 w-4\" />\n <span className=\"sr-only\">Actions</span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem asChild>\n <Link\n href={hasCustomView ? `${customViewPageUrl}/${item.id}` : `/admin/${resourceName}/${item.id}/view`}\n className=\"flex items-center gap-2\"\n >\n <Eye className=\"h-4 w-4\" />\n View\n </Link>\n </DropdownMenuItem>\n {!addEditPage && (\n <DropdownMenuItem onClick={() => handleEdit(item)}>\n <Edit className=\"h-4 w-4 mr-2\" />\n Edit\n </DropdownMenuItem>\n )}\n {addEditPage && (\n <DropdownMenuItem asChild>\n <Link href={addEditPageUrl + \"/\" + item.id} className=\"flex items-center gap-2\">\n <Edit className=\"h-4 w-4\" />\n Edit\n </Link>\n </DropdownMenuItem>\n )}\n {resourceName === \"users\" && (\n <DropdownMenuItem onClick={() => handleRegenerateInvite(Number(item.id))}>\n <RefreshCw className=\"h-4 w-4 mr-2\" />\n Regenerate Invite\n </DropdownMenuItem>\n )}\n <DropdownMenuItem\n onClick={() => handleDeleteClick(item)}\n className=\"text-red-600 focus:text-red-600\"\n >\n <Trash2 className=\"h-4 w-4 mr-2\" />\n Delete\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n {displayCols.slice(1).map((col) => (\n <div key={col.field || col.key} className=\"text-sm text-gray-600 flex gap-1 min-w-0 leading-tight\">\n <span className=\"shrink-0\">{col.displayName}:</span>\n <span className=\"min-w-0 break-words\">\n {formatCellValue(getNestedValue(item, col.field || col.key), col)}\n </span>\n </div>\n ))}\n </div>\n );\n })\n ) : (\n <div className=\"rounded-md border border-gray-200 p-6 text-center text-gray-500\">\n No data found\n </div>\n )}\n </div>\n ) : (\n <div className=\"overflow-x-auto min-w-0 rounded-md border border-gray-200\">\n <Table>\n <TableHeader>\n <TableRow>\n {columns && columns.map((col) => (\n <TableHead\n key={col.field}\n className=\"cursor-pointer\"\n onClick={() => handleSort(col.field)}\n >\n {col.displayName}{\" \"}\n {sortField === col.field\n ? sortOrder === \"asc\"\n ? \"▲\"\n : \"▼\"\n : \"\"}\n </TableHead>\n ))}\n <TableHead className=\"w-12 text-center\">Actions</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {data && data.length > 0 ? (\n data.map((item: Record<string, unknown> & { id?: unknown }, index: number) => (\n <TableRow key={String(item.id ?? index)}>\n {columns && columns.map((col, colIndex) => {\n const fieldKey = col.field || col.key;\n const value = getNestedValue(item, fieldKey);\n return (\n <TableCell key={`${item.id}-${colIndex}-${fieldKey}`}>\n {formatCellValue(value, col)}\n </TableCell>\n );\n })}\n <TableCell className=\"text-center\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8\">\n <MoreVertical className=\"h-4 w-4\" />\n <span className=\"sr-only\">Actions</span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem asChild>\n <Link\n href={hasCustomView\n ? `${customViewPageUrl}/${item.id}`\n : `/admin/${resourceName}/${item.id}/view`}\n className=\"flex items-center gap-2\"\n >\n <Eye className=\"h-4 w-4\" />\n View\n </Link>\n </DropdownMenuItem>\n {!addEditPage && (\n <DropdownMenuItem onClick={() => handleEdit(item)}>\n <Edit className=\"h-4 w-4 mr-2\" />\n Edit\n </DropdownMenuItem>\n )}\n {addEditPage && (\n <DropdownMenuItem asChild>\n <Link href={addEditPageUrl + \"/\" + item.id} className=\"flex items-center gap-2\">\n <Edit className=\"h-4 w-4\" />\n Edit\n </Link>\n </DropdownMenuItem>\n )}\n {resourceName === \"users\" && (\n <DropdownMenuItem onClick={() => handleRegenerateInvite(Number(item.id))}>\n <RefreshCw className=\"h-4 w-4 mr-2\" />\n Regenerate Invite\n </DropdownMenuItem>\n )}\n <DropdownMenuItem\n onClick={() => handleDeleteClick(item)}\n className=\"text-red-600 focus:text-red-600\"\n >\n <Trash2 className=\"h-4 w-4 mr-2\" />\n Delete\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </TableCell>\n </TableRow>\n ))\n ) : (\n <TableRow>\n <TableCell colSpan={columns ? columns.length + 1 : 1} className=\"text-center py-8\">\n No data found\n </TableCell>\n </TableRow>\n )}\n </TableBody>\n </Table>\n </div>\n )}\n\n {/* Pagination */}\n {totalPages > 1 && (\n <Pagination className=\"mt-6\">\n <PaginationContent>\n <PaginationItem>\n <PaginationPrevious\n onClick={() => page > 1 && setPage(page - 1)}\n className={\n page <= 1\n ? \"pointer-events-none opacity-50\"\n : \"cursor-pointer\"\n }\n />\n </PaginationItem>\n {[...Array(totalPages)].map((_, index) => (\n <PaginationItem key={index}>\n <PaginationLink\n onClick={() => setPage(index + 1)}\n isActive={page === index + 1}\n >\n {index + 1}\n </PaginationLink>\n </PaginationItem>\n ))}\n <PaginationItem>\n <PaginationNext\n onClick={() => page < totalPages && setPage(page + 1)}\n className={\n page >= totalPages\n ? \"pointer-events-none opacity-50\"\n : \"cursor-pointer\"\n }\n />\n </PaginationItem>\n </PaginationContent>\n </Pagination>\n )}\n\n {/* Form Modal */}\n {isFormOpen && (\n <CreateEditForm\n isOpen={isFormOpen}\n onClose={() => {\n setIsFormOpen(false);\n setRefreshKey((k) => k + 1);\n }}\n apiEndpoint={apiEndpoint}\n columns={columns}\n existingData={editingItem}\n />\n )}\n\n {/* Delete Confirmation Dialog */}\n <Dialog open={deleteDialogOpen} onOpenChange={setDeleteDialogOpen}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Confirm Delete</DialogTitle>\n <DialogDescription>\n Are you sure you want to delete this item? This action cannot be undone.\n </DialogDescription>\n {itemToDelete && (\n <div className=\"mt-2 p-2 bg-gray-50 rounded\">\n <strong>Item:</strong> {String(itemToDelete.name ?? itemToDelete.title ?? itemToDelete.id ?? '')}\n </div>\n )}\n </DialogHeader>\n <DialogFooter>\n <Button variant=\"outline\" onClick={() => setDeleteDialogOpen(false)} disabled={deleteLoading}>\n Cancel\n </Button>\n <Button variant=\"destructive\" onClick={handleDelete} disabled={deleteLoading}>\n {deleteLoading ? \"Deleting...\" : \"Delete\"}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n\n {/* Bulk Upload Dialog */}\n {bulkDialogOpen && (\n <BulkUploadDialog\n apiEndpoint={apiEndpoint}\n onClose={() => {\n setBulkDialogOpen(false);\n setRefreshKey((k) => k + 1);\n }}\n />\n )}\n </div>\n </div>\n </>\n );\n}\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport { X } from \"lucide-react\";\nimport { Input } from \"@/components/ui/input\";\nimport { Textarea } from \"@/components/ui/textarea\";\nimport { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from \"@/components/ui/select\";\nimport { Button } from \"@/components/ui/button\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { Label } from \"@/components/ui/label\";\nimport FileUpload from \"@/components/ui/file-upload\";\nimport RelationAutocomplete from \"@/components/Admin/RelationAutocomplete\";\nimport { useIsMobile } from \"@/hooks/use-mobile\";\nimport { toast } from \"sonner\";\n\nexport default function CreateEditForm({ isOpen, onClose, apiEndpoint, columns, existingData }) {\n const isMobile = useIsMobile();\n const [formData, setFormData] = useState({});\n const [errors, setErrors] = useState({});\n\n useEffect(() => {\n if (existingData) {\n setFormData(existingData);\n } else {\n setFormData(columns.reduce((acc, col) => ({ ...acc, [col.field]: col.defaultValue || \"\" }), {}));\n }\n }, [existingData, columns]);\n\n const handleChange = (e, field) => {\n setFormData({ ...formData, [field]: e.target.value });\n };\n\n const handleFileUpload = (field, url) => {\n setFormData({ ...formData, [field]: url });\n };\n\n const handleToggleChange = (field) => {\n setFormData({ ...formData, [field]: !formData[field] });\n };\n\n const validateForm = () => {\n let newErrors = {};\n columns.forEach(col => {\n if (col.validation?.required && !formData[col.field]) {\n newErrors[col.field] = `${col.displayName} is required`;\n }\n });\n setErrors(newErrors);\n return Object.keys(newErrors).length === 0;\n };\n\n const handleSubmit = async (e) => {\n e.preventDefault();\n if (!validateForm()) return;\n\n const method = existingData ? \"PUT\" : \"POST\";\n const url = existingData ? `${apiEndpoint}/${existingData.id}` : apiEndpoint;\n\n try {\n const res = await fetch(url, {\n method,\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(formData),\n });\n \n if (!res.ok) throw new Error(\"Failed to save data\");\n \n const result = await res.json();\n \n // Handle invite link response for users\n if (result.inviteLink) {\n toast.success(`User invite created! Invite link: ${result.inviteLink}\\n\\nNote: ${result.note}`);\n }\n \n onClose();\n } catch (error) {\n console.error(\"Error saving data:\", error);\n }\n };\n\n return isOpen ? (\n <div className=\"fixed inset-0 z-50 bg-black/50 flex justify-end\">\n <div className={`bg-white h-full shadow-lg flex flex-col ${isMobile ? \"w-full rounded-none\" : \"w-1/3 rounded-l-lg\"}`}>\n <div className=\"flex items-center justify-between shrink-0 px-4 py-3 border-b border-gray-200\">\n <h2 className=\"text-xl font-semibold\">{existingData ? \"Edit\" : \"Create\"} Entry</h2>\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" onClick={onClose} className=\"h-8 w-8\" aria-label=\"Close\">\n <X className=\"h-5 w-5\" />\n </Button>\n </div>\n <form onSubmit={handleSubmit} className=\"flex flex-col flex-1 min-h-0\">\n <div className=\"flex-1 min-h-0 overflow-y-auto p-6 space-y-4\">\n {columns.map((col) => (\n <div key={col.field}>\n <Label className=\"block text-sm font-medium mb-1\">{col.displayName}</Label>\n {col.relationApi ? (\n <RelationAutocomplete\n apiEndpoint={col.relationApi}\n value={formData[col.field] ?? \"\"}\n onChange={(v) => setFormData({ ...formData, [col.field]: v })}\n labelField={col.relationLabelField ?? \"name\"}\n valueField={col.relationValueField ?? \"id\"}\n placeholder={`Select ${col.displayName}`}\n />\n ) : col.type === \"textarea\" ? (\n <Textarea value={formData[col.field] || \"\"} onChange={(e) => handleChange(e, col.field)} />\n ) : col.type === \"select\" ? (\n <Select onValueChange={(value) => setFormData({ ...formData, [col.field]: value })}>\n <SelectTrigger>\n <SelectValue placeholder={formData[col.field] || \"Select an option\"} />\n </SelectTrigger>\n <SelectContent>\n {col.options?.map((option) => (\n <SelectItem key={option.value} value={option.value}>{option.label}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : col.type === \"boolean\" ? (\n <Switch checked={formData[col.field] || false} onCheckedChange={() => handleToggleChange(col.field)} />\n ) : col.type === \"date\" ? (\n <Input type=\"date\" value={formData[col.field] || \"\"} onChange={(e) => handleChange(e, col.field)} />\n ) : col.type === \"password\" ? (\n <Input type=\"password\" value={formData[col.field] || \"\"} onChange={(e) => handleChange(e, col.field)} />\n ) : col.type === \"number\" ? (\n <Input type=\"number\" value={formData[col.field] || \"\"} onChange={(e) => handleChange(e, col.field)} />\n ) : col.type === \"file\" ? (\n <FileUpload onUploadSuccess={(url) => handleFileUpload(col.field, url)} />\n ) : (\n <Input type={col.type || \"text\"} value={formData[col.field] || \"\"} onChange={(e) => handleChange(e, col.field)} />\n )}\n {errors[col.field] && <p className=\"text-red-500 text-sm mt-1\">{errors[col.field]}</p>}\n </div>\n ))}\n </div>\n <div className=\"flex gap-2 p-4 border-t border-gray-200 shrink-0 bg-white\">\n <Button type=\"submit\" className=\"flex-1\">Save</Button>\n <Button type=\"button\" variant=\"outline\" onClick={onClose} className=\"flex-1\">Cancel</Button>\n </div>\n </form>\n </div>\n </div>\n ) : null;\n}\n","import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Input = React.forwardRef<HTMLInputElement, React.ComponentProps<\"input\">>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n \"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n className\n )}\n ref={ref}\n {...props}\n />\n )\n }\n)\nInput.displayName = \"Input\"\n\nexport { Input }\n","import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Textarea = React.forwardRef<\n HTMLTextAreaElement,\n React.ComponentProps<\"textarea\">\n>(({ className, ...props }, ref) => {\n return (\n <textarea\n className={cn(\n \"flex min-h-[60px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n className\n )}\n ref={ref}\n {...props}\n />\n )\n})\nTextarea.displayName = \"Textarea\"\n\nexport { Textarea }\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as SelectPrimitive from \"@radix-ui/react-select\"\nimport { Check, ChevronDown, ChevronUp } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Select = SelectPrimitive.Root\n\nconst SelectGroup = SelectPrimitive.Group\n\nconst SelectValue = SelectPrimitive.Value\n\nconst SelectTrigger = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n \"flex h-9 w-full items-center justify-between whitespace-nowrap rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm ring-offset-background data-[placeholder]:text-muted-foreground focus:outline-none focus:ring-1 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"h-4 w-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n))\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName\n\nconst SelectScrollUpButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollUpButton\n ref={ref}\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronUp className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollUpButton>\n))\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName\n\nconst SelectScrollDownButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollDownButton\n ref={ref}\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronDown className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollDownButton>\n))\nSelectScrollDownButton.displayName =\n SelectPrimitive.ScrollDownButton.displayName\n\nconst SelectContent = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = \"popper\", ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n \"relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n \"p-1\",\n position === \"popper\" &&\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n))\nSelectContent.displayName = SelectPrimitive.Content.displayName\n\nconst SelectLabel = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label\n ref={ref}\n className={cn(\"px-2 py-1.5 text-sm font-semibold\", className)}\n {...props}\n />\n))\nSelectLabel.displayName = SelectPrimitive.Label.displayName\n\nconst SelectItem = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-2 pr-8 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n {...props}\n >\n <span className=\"absolute right-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n))\nSelectItem.displayName = SelectPrimitive.Item.displayName\n\nconst SelectSeparator = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n {...props}\n />\n))\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectLabel,\n SelectItem,\n SelectSeparator,\n SelectScrollUpButton,\n SelectScrollDownButton,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as SwitchPrimitives from \"@radix-ui/react-switch\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Switch = React.forwardRef<\n React.ElementRef<typeof SwitchPrimitives.Root>,\n React.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root>\n>(({ className, ...props }, ref) => (\n <SwitchPrimitives.Root\n className={cn(\n \"peer inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input\",\n className\n )}\n {...props}\n ref={ref}\n >\n <SwitchPrimitives.Thumb\n className={cn(\n \"pointer-events-none block h-4 w-4 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0\"\n )}\n />\n </SwitchPrimitives.Root>\n))\nSwitch.displayName = SwitchPrimitives.Root.displayName\n\nexport { Switch }\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as LabelPrimitive from \"@radix-ui/react-label\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst labelVariants = cva(\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n)\n\nconst Label = React.forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> &\n VariantProps<typeof labelVariants>\n>(({ className, ...props }, ref) => (\n <LabelPrimitive.Root\n ref={ref}\n className={cn(labelVariants(), className)}\n {...props}\n />\n))\nLabel.displayName = LabelPrimitive.Root.displayName\n\nexport { Label }\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport { Progress } from \"@/components/ui/progress\";\nimport { cn } from \"@/lib/utils\";\n\nexport default function FileUpload({ onUploadSuccess }) {\n const [selectedFile, setSelectedFile] = useState(null);\n const [uploading, setUploading] = useState(false);\n const [progress, setProgress] = useState(0);\n const [fileUrl, setFileUrl] = useState(\"\");\n\n const handleFileChange = (event) => {\n setSelectedFile(event.target.files[0]);\n };\n\n const handleUpload = async () => {\n if (!selectedFile) return;\n setUploading(true);\n setProgress(10);\n\n const formData = new FormData();\n formData.append(\"file\", selectedFile);\n\n try {\n const response = await fetch(\"/api/upload\", {\n method: \"POST\",\n body: formData,\n });\n setProgress(60);\n\n const data = await response.json();\n if (response.ok) {\n setFileUrl(data.url);\n setProgress(100);\n onUploadSuccess(data.url);\n } else {\n console.error(\"Upload failed:\", data.error);\n }\n } catch (error) {\n console.error(\"Upload error:\", error);\n }\n setUploading(false);\n };\n\n return (\n <div className=\"space-y-4 border p-4 rounded-lg bg-white shadow-md\">\n <Input type=\"file\" onChange={handleFileChange} className=\"block w-full\" />\n {uploading && <Progress value={progress} className=\"h-2\" />}\n <Button onClick={handleUpload} disabled={!selectedFile || uploading} className={cn(\"w-full\", uploading && \"opacity-50\")}>Upload</Button>\n {fileUrl && (\n <div className=\"mt-2\">\n <span className=\"text-sm text-gray-600\">Uploaded File:</span>\n <a href={fileUrl} target=\"_blank\" rel=\"noopener noreferrer\" className=\"block text-gray-700 underline\">{fileUrl}</a>\n </div>\n )}\n </div>\n );\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as ProgressPrimitive from \"@radix-ui/react-progress\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Progress = React.forwardRef<\n React.ElementRef<typeof ProgressPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof ProgressPrimitive.Root>\n>(({ className, value, ...props }, ref) => (\n <ProgressPrimitive.Root\n ref={ref}\n className={cn(\n \"relative h-2 w-full overflow-hidden rounded-full bg-primary/20\",\n className\n )}\n {...props}\n >\n <ProgressPrimitive.Indicator\n className=\"h-full w-full flex-1 bg-primary transition-all\"\n style={{ transform: `translateX(-${100 - (value || 0)}%)` }}\n />\n </ProgressPrimitive.Root>\n))\nProgress.displayName = ProgressPrimitive.Root.displayName\n\nexport { Progress }\n","\"use client\";\n\nimport { useState, useEffect, useRef, useCallback } from \"react\";\nimport { Input } from \"@/components/ui/input\";\nimport { ChevronDown } from \"lucide-react\";\nimport { cn } from \"@/lib/utils\";\n\nconst DEBOUNCE_MS = 300;\nconst PAGE_SIZE = 20;\n\ninterface RelationAutocompleteProps {\n apiEndpoint: string;\n value: number | string | null | undefined;\n onChange: (value: number | string) => void;\n labelField?: string;\n valueField?: string;\n placeholder?: string;\n disabled?: boolean;\n}\n\nexport default function RelationAutocomplete({\n apiEndpoint,\n value,\n onChange,\n labelField = \"name\",\n valueField = \"id\",\n placeholder = \"Select…\",\n disabled = false,\n}: RelationAutocompleteProps) {\n const [open, setOpen] = useState(false);\n const [search, setSearch] = useState(\"\");\n const [searchInput, setSearchInput] = useState(\"\");\n const [items, setItems] = useState<Record<string, unknown>[]>([]);\n const [total, setTotal] = useState(0);\n const [page, setPage] = useState(1);\n const [loading, setLoading] = useState(false);\n const [loadingMore, setLoadingMore] = useState(false);\n const [selectedLabel, setSelectedLabel] = useState<string | null>(null);\n const [initialLabelLoaded, setInitialLabelLoaded] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const hasMore = items.length < total;\n\n const fetchPage = useCallback(\n async (pageNum: number, searchQ: string, append: boolean) => {\n const params = new URLSearchParams({\n page: String(pageNum),\n limit: String(PAGE_SIZE),\n ...(searchQ && { search: searchQ }),\n });\n const res = await fetch(`${apiEndpoint}?${params}`);\n if (!res.ok) return;\n const json = await res.json();\n const data = json.data ?? [];\n const totalCount = json.total ?? 0;\n if (append) {\n setItems((prev) => [...prev, ...data]);\n } else {\n setItems(data);\n }\n setTotal(totalCount);\n },\n [apiEndpoint]\n );\n\n useEffect(() => {\n if (!open) return;\n setPage(1);\n setLoading(true);\n fetchPage(1, search, false).finally(() => setLoading(false));\n }, [open, search, fetchPage]);\n\n useEffect(() => {\n if (!open) return;\n const onSearchInput = () => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n debounceRef.current = setTimeout(() => {\n setSearch(searchInput);\n setPage(1);\n debounceRef.current = null;\n }, DEBOUNCE_MS);\n };\n onSearchInput();\n return () => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n };\n }, [searchInput, open]);\n\n const loadInitialLabel = useCallback(() => {\n if (initialLabelLoaded || value == null || value === \"\") return;\n setInitialLabelLoaded(true);\n fetch(`${apiEndpoint}/${value}`)\n .then((r) => (r.ok ? r.json() : null))\n .then((item) => {\n if (item && typeof item[labelField] === \"string\") {\n setSelectedLabel(item[labelField]);\n }\n })\n .catch(() => {});\n }, [apiEndpoint, value, labelField, initialLabelLoaded]);\n\n useEffect(() => {\n if (value != null && value !== \"\") loadInitialLabel();\n else {\n setSelectedLabel(null);\n setInitialLabelLoaded(false);\n }\n }, [value, loadInitialLabel]);\n\n useEffect(() => {\n if (!open) return;\n const el = listRef.current;\n if (!el) return;\n const onScroll = () => {\n const { scrollTop, scrollHeight, clientHeight } = el;\n if (scrollTop + clientHeight >= scrollHeight - 50 && hasMore && !loadingMore) {\n setLoadingMore(true);\n const nextPage = page + 1;\n setPage(nextPage);\n fetchPage(nextPage, search, true).finally(() => setLoadingMore(false));\n }\n };\n el.addEventListener(\"scroll\", onScroll);\n return () => el.removeEventListener(\"scroll\", onScroll);\n }, [open, hasMore, page, search, loadingMore, fetchPage]);\n\n useEffect(() => {\n if (!open) return;\n const onPointerDown = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setOpen(false);\n }\n };\n document.addEventListener(\"pointerdown\", onPointerDown);\n return () => document.removeEventListener(\"pointerdown\", onPointerDown);\n }, [open]);\n\n const handleSelect = (item: Record<string, unknown>) => {\n const val = item[valueField];\n if (val !== undefined && val !== null) {\n onChange(typeof val === \"number\" ? val : String(val));\n setSelectedLabel(String(item[labelField] ?? \"\"));\n }\n setOpen(false);\n };\n\n const displayValue = selectedLabel ?? (value != null && value !== \"\" ? `#${value}` : \"\");\n\n return (\n <div ref={containerRef} className=\"relative w-full\">\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => !disabled && setOpen((o) => !o)}\n className={cn(\n \"flex h-9 w-full items-center justify-between gap-2 rounded-md border border-input bg-transparent px-3 py-2 text-sm text-left\",\n \"focus:outline-none focus:ring-1 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50\",\n !displayValue && \"text-muted-foreground\"\n )}\n >\n <span className=\"min-w-0 truncate\">{displayValue || placeholder}</span>\n <ChevronDown className=\"h-4 w-4 shrink-0 opacity-50\" />\n </button>\n {open && (\n <div\n className=\"absolute top-full left-0 z-50 mt-1 w-full min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md\"\n style={{ width: containerRef.current?.offsetWidth }}\n >\n <div className=\"border-b p-1\">\n <Input\n placeholder=\"Search…\"\n value={searchInput}\n onChange={(e) => setSearchInput(e.target.value)}\n className=\"h-8 text-sm\"\n autoFocus\n onKeyDown={(e) => e.stopPropagation()}\n />\n </div>\n <div\n ref={listRef}\n className=\"max-h-60 overflow-y-auto p-1\"\n >\n {loading && items.length === 0 ? (\n <div className=\"py-4 text-center text-sm text-muted-foreground\">Loading…</div>\n ) : items.length === 0 ? (\n <div className=\"py-4 text-center text-sm text-muted-foreground\">No results</div>\n ) : (\n items.map((item) => {\n const val = item[valueField];\n const key = val !== undefined && val !== null ? String(val) : Math.random();\n const label = String(item[labelField] ?? \"\");\n const isSelected = value != null && (val === value || String(val) === String(value));\n return (\n <button\n key={key}\n type=\"button\"\n className={cn(\n \"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-2 pr-8 text-sm outline-none hover:bg-accent hover:text-accent-foreground\",\n isSelected && \"bg-accent\"\n )}\n onClick={() => handleSelect(item)}\n >\n {label}\n </button>\n );\n })\n )}\n {loadingMore && (\n <div className=\"py-2 text-center text-xs text-muted-foreground\">Loading more…</div>\n )}\n </div>\n </div>\n )}\n </div>\n );\n}\n","import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Table = React.forwardRef<\n HTMLTableElement,\n React.HTMLAttributes<HTMLTableElement>\n>(({ className, ...props }, ref) => (\n <div className=\"relative w-full overflow-auto\">\n <table\n ref={ref}\n className={cn(\"w-full caption-bottom text-sm\", className)}\n {...props}\n />\n </div>\n))\nTable.displayName = \"Table\"\n\nconst TableHeader = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <thead ref={ref} className={cn(\"[&_tr]:border-b\", className)} {...props} />\n))\nTableHeader.displayName = \"TableHeader\"\n\nconst TableBody = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tbody\n ref={ref}\n className={cn(\"[&_tr:last-child]:border-0\", className)}\n {...props}\n />\n))\nTableBody.displayName = \"TableBody\"\n\nconst TableFooter = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tfoot\n ref={ref}\n className={cn(\n \"border-t bg-muted/50 font-medium [&>tr]:last:border-b-0\",\n className\n )}\n {...props}\n />\n))\nTableFooter.displayName = \"TableFooter\"\n\nconst TableRow = React.forwardRef<\n HTMLTableRowElement,\n React.HTMLAttributes<HTMLTableRowElement>\n>(({ className, ...props }, ref) => (\n <tr\n ref={ref}\n className={cn(\n \"border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted\",\n className\n )}\n {...props}\n />\n))\nTableRow.displayName = \"TableRow\"\n\nconst TableHead = React.forwardRef<\n HTMLTableCellElement,\n React.ThHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n <th\n ref={ref}\n className={cn(\n \"h-10 px-2 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]\",\n className\n )}\n {...props}\n />\n))\nTableHead.displayName = \"TableHead\"\n\nconst TableCell = React.forwardRef<\n HTMLTableCellElement,\n React.TdHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n <td\n ref={ref}\n className={cn(\n \"p-2 align-middle [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]\",\n className\n )}\n {...props}\n />\n))\nTableCell.displayName = \"TableCell\"\n\nconst TableCaption = React.forwardRef<\n HTMLTableCaptionElement,\n React.HTMLAttributes<HTMLTableCaptionElement>\n>(({ className, ...props }, ref) => (\n <caption\n ref={ref}\n className={cn(\"mt-4 text-sm text-muted-foreground\", className)}\n {...props}\n />\n))\nTableCaption.displayName = \"TableCaption\"\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n}\n","import * as React from \"react\"\nimport { ChevronLeft, ChevronRight, MoreHorizontal } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { ButtonProps, buttonVariants } from \"@/components/ui/button\"\n\nconst Pagination = ({ className, ...props }: React.ComponentProps<\"nav\">) => (\n <nav\n role=\"navigation\"\n aria-label=\"pagination\"\n className={cn(\"mx-auto flex w-full justify-center\", className)}\n {...props}\n />\n)\nPagination.displayName = \"Pagination\"\n\nconst PaginationContent = React.forwardRef<\n HTMLUListElement,\n React.ComponentProps<\"ul\">\n>(({ className, ...props }, ref) => (\n <ul\n ref={ref}\n className={cn(\"flex flex-row items-center gap-1\", className)}\n {...props}\n />\n))\nPaginationContent.displayName = \"PaginationContent\"\n\nconst PaginationItem = React.forwardRef<\n HTMLLIElement,\n React.ComponentProps<\"li\">\n>(({ className, ...props }, ref) => (\n <li ref={ref} className={cn(\"\", className)} {...props} />\n))\nPaginationItem.displayName = \"PaginationItem\"\n\ntype PaginationLinkProps = {\n isActive?: boolean\n} & Pick<ButtonProps, \"size\"> &\n React.ComponentProps<\"a\">\n\nconst PaginationLink = ({\n className,\n isActive,\n size = \"icon\",\n ...props\n}: PaginationLinkProps) => (\n <a\n aria-current={isActive ? \"page\" : undefined}\n className={cn(\n buttonVariants({\n variant: isActive ? \"outline\" : \"ghost\",\n size,\n }),\n className\n )}\n {...props}\n />\n)\nPaginationLink.displayName = \"PaginationLink\"\n\nconst PaginationPrevious = ({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) => (\n <PaginationLink\n aria-label=\"Go to previous page\"\n size=\"default\"\n className={cn(\"gap-1 pl-2.5\", className)}\n {...props}\n >\n <ChevronLeft className=\"h-4 w-4\" />\n <span>Previous</span>\n </PaginationLink>\n)\nPaginationPrevious.displayName = \"PaginationPrevious\"\n\nconst PaginationNext = ({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) => (\n <PaginationLink\n aria-label=\"Go to next page\"\n size=\"default\"\n className={cn(\"gap-1 pr-2.5\", className)}\n {...props}\n >\n <span>Next</span>\n <ChevronRight className=\"h-4 w-4\" />\n </PaginationLink>\n)\nPaginationNext.displayName = \"PaginationNext\"\n\nconst PaginationEllipsis = ({\n className,\n ...props\n}: React.ComponentProps<\"span\">) => (\n <span\n aria-hidden\n className={cn(\"flex h-9 w-9 items-center justify-center\", className)}\n {...props}\n >\n <MoreHorizontal className=\"h-4 w-4\" />\n <span className=\"sr-only\">More pages</span>\n </span>\n)\nPaginationEllipsis.displayName = \"PaginationEllipsis\"\n\nexport {\n Pagination,\n PaginationContent,\n PaginationLink,\n PaginationItem,\n PaginationPrevious,\n PaginationNext,\n PaginationEllipsis,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\nimport { X } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Dialog = DialogPrimitive.Root\n\nconst DialogTrigger = DialogPrimitive.Trigger\n\nconst DialogPortal = DialogPrimitive.Portal\n\nconst DialogClose = DialogPrimitive.Close\n\nconst DialogOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n />\n))\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName\n\nconst DialogContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg\",\n className\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPortal>\n))\nDialogContent.displayName = DialogPrimitive.Content.displayName\n\nconst DialogHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-1.5 text-center sm:text-left\",\n className\n )}\n {...props}\n />\n)\nDialogHeader.displayName = \"DialogHeader\"\n\nconst DialogFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className\n )}\n {...props}\n />\n)\nDialogFooter.displayName = \"DialogFooter\"\n\nconst DialogTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn(\n \"text-lg font-semibold leading-none tracking-tight\",\n className\n )}\n {...props}\n />\n))\nDialogTitle.displayName = DialogPrimitive.Title.displayName\n\nconst DialogDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n))\nDialogDescription.displayName = DialogPrimitive.Description.displayName\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogTrigger,\n DialogClose,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n}\n","\"use client\";\n\nimport { useState, useEffect, useRef } from \"react\";\nimport { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter } from \"@/components/ui/dialog\";\nimport { Button } from \"@/components/ui/button\";\nimport { Table, TableHeader, TableRow, TableHead, TableBody, TableCell } from \"@/components/ui/table\";\nimport { Download, Upload, AlertCircle, CheckCircle2, X } from \"lucide-react\";\nimport Papa from \"papaparse\";\n\ninterface ColumnMeta {\n name: string;\n type: string;\n nullable: boolean;\n isUnique: boolean;\n isPrimary: boolean;\n}\n\ninterface BulkUploadDialogProps {\n apiEndpoint: string;\n onClose: () => void;\n}\n\nconst AUTO_GENERATED_COLS = new Set([\n \"id\", \"createdAt\", \"updatedAt\", \"deletedAt\", \"createdBy\", \"updatedBy\", \"deletedBy\", \"deleted\"\n]);\n\nexport default function BulkUploadDialog({ apiEndpoint, onClose }: BulkUploadDialogProps) {\n const [columns, setColumns] = useState<ColumnMeta[]>([]);\n const [uniqueColumns, setUniqueColumns] = useState<string[]>([]);\n const [loading, setLoading] = useState(true);\n const [importing, setImporting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [success, setSuccess] = useState<string | null>(null);\n\n const [parsedData, setParsedData] = useState<Record<string, unknown>[]>([]);\n const [parseErrors, setParseErrors] = useState<string[]>([]);\n const [upsertKey, setUpsertKey] = useState<string>(\"id\");\n const [fileName, setFileName] = useState<string>(\"\");\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n fetchMetadata();\n }, [apiEndpoint]);\n\n const fetchMetadata = async () => {\n try {\n setLoading(true);\n const res = await fetch(`${apiEndpoint}/metadata`);\n if (!res.ok) throw new Error(\"Failed to fetch metadata\");\n const data = await res.json();\n setColumns(data.columns || []);\n setUniqueColumns(data.uniqueColumns || []);\n \n // Default upsert key: prefer slug, email, name if available\n const preferred = [\"slug\", \"email\", \"name\"];\n for (const key of preferred) {\n if (data.uniqueColumns?.includes(key)) {\n setUpsertKey(key);\n break;\n }\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to load metadata\");\n } finally {\n setLoading(false);\n }\n };\n\n const getTemplateColumns = () => {\n return columns.filter((c) => !AUTO_GENERATED_COLS.has(c.name));\n };\n\n const handleDownloadTemplate = () => {\n const templateCols = getTemplateColumns();\n const headers = templateCols.map((c) => c.name);\n const typeHints = templateCols.map((c) => `# ${c.type}${c.nullable ? \" (optional)\" : \"\"}`);\n \n const csv = [headers.join(\",\"), typeHints.join(\",\")].join(\"\\n\");\n const blob = new Blob([csv], { type: \"text/csv;charset=utf-8;\" });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n const resourceName = apiEndpoint.split(\"/\").pop() || \"data\";\n a.download = `${resourceName}_template.csv`;\n a.click();\n URL.revokeObjectURL(url);\n };\n\n const handleFileSelect = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n\n setFileName(file.name);\n setError(null);\n setSuccess(null);\n setParseErrors([]);\n\n Papa.parse(file, {\n header: true,\n skipEmptyLines: true,\n complete: (results) => {\n const errors: string[] = [];\n const data: Record<string, unknown>[] = [];\n\n results.data.forEach((row, idx) => {\n const record = row as Record<string, unknown>;\n \n // Skip comment rows (type hints)\n const firstVal = Object.values(record)[0];\n if (typeof firstVal === \"string\" && firstVal.startsWith(\"#\")) {\n return;\n }\n\n // Validate required fields\n const templateCols = getTemplateColumns();\n for (const col of templateCols) {\n if (!col.nullable && !record[col.name]) {\n errors.push(`Row ${idx + 1}: Missing required field \"${col.name}\"`);\n }\n }\n\n data.push(record);\n });\n\n if (results.errors.length > 0) {\n errors.push(...results.errors.map((e) => `Parse error: ${e.message}`));\n }\n\n setParsedData(data);\n setParseErrors(errors.slice(0, 10)); // Show first 10 errors\n },\n error: (err) => {\n setError(`Failed to parse CSV: ${err.message}`);\n },\n });\n };\n\n const handleImport = async () => {\n if (parsedData.length === 0) {\n setError(\"No data to import\");\n return;\n }\n\n setImporting(true);\n setError(null);\n setSuccess(null);\n\n try {\n const res = await fetch(`${apiEndpoint}/bulk`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n records: parsedData,\n upsertKey,\n }),\n });\n\n const result = await res.json();\n\n if (!res.ok) {\n setError(result.error || \"Import failed\");\n return;\n }\n\n setSuccess(`Successfully imported ${result.imported} records`);\n setParsedData([]);\n setFileName(\"\");\n if (fileInputRef.current) {\n fileInputRef.current.value = \"\";\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Import failed\");\n } finally {\n setImporting(false);\n }\n };\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault();\n const file = e.dataTransfer.files?.[0];\n if (file && file.type === \"text/csv\") {\n const input = fileInputRef.current;\n if (input) {\n const dt = new DataTransfer();\n dt.items.add(file);\n input.files = dt.files;\n handleFileSelect({ target: input } as React.ChangeEvent<HTMLInputElement>);\n }\n }\n };\n\n const previewColumns = parsedData.length > 0 ? Object.keys(parsedData[0]).slice(0, 6) : [];\n\n return (\n <Dialog open onOpenChange={() => onClose()}>\n <DialogContent className=\"max-w-3xl max-h-[90vh] overflow-y-auto\">\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2\">\n <Upload className=\"h-5 w-5\" />\n Bulk Import\n </DialogTitle>\n </DialogHeader>\n\n {loading ? (\n <div className=\"flex items-center justify-center py-8\">\n <div className=\"animate-spin rounded-full h-6 w-6 border-2 border-gray-300 border-t-gray-600\" />\n <span className=\"ml-2\">Loading...</span>\n </div>\n ) : (\n <div className=\"space-y-4\">\n {/* Download Template */}\n <div className=\"flex items-center justify-between p-3 bg-gray-50 rounded-lg\">\n <div>\n <p className=\"text-sm font-medium\">Step 1: Download Template</p>\n <p className=\"text-xs text-gray-500\">Get a CSV template with all required columns</p>\n </div>\n <Button variant=\"outline\" size=\"sm\" onClick={handleDownloadTemplate}>\n <Download className=\"h-4 w-4 mr-1\" /> Download\n </Button>\n </div>\n\n {/* Upload File */}\n <div\n className=\"border-2 border-dashed border-gray-300 rounded-lg p-6 text-center hover:border-gray-400 transition-colors\"\n onDragOver={(e) => e.preventDefault()}\n onDrop={handleDrop}\n >\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".csv\"\n onChange={handleFileSelect}\n className=\"hidden\"\n id=\"csv-upload\"\n />\n <label htmlFor=\"csv-upload\" className=\"cursor-pointer\">\n <Upload className=\"h-8 w-8 mx-auto text-gray-400 mb-2\" />\n <p className=\"text-sm text-gray-600\">\n {fileName ? fileName : \"Drop CSV file here or click to select\"}\n </p>\n <p className=\"text-xs text-gray-400 mt-1\">Step 2: Upload your filled CSV</p>\n </label>\n </div>\n\n {/* Upsert Key Selection */}\n {uniqueColumns.length > 0 && (\n <div className=\"flex items-center gap-3\">\n <label className=\"text-sm font-medium\">Upsert Key:</label>\n <select\n value={upsertKey}\n onChange={(e) => setUpsertKey(e.target.value)}\n className=\"rounded-md border border-gray-300 px-2 py-1 text-sm\"\n >\n <option value=\"id\">id (update only)</option>\n {uniqueColumns\n .filter((k) => k !== \"id\")\n .map((key) => (\n <option key={key} value={key}>\n {key}\n </option>\n ))}\n </select>\n <span className=\"text-xs text-gray-500\">\n Records with matching {upsertKey} will be updated\n </span>\n </div>\n )}\n\n {/* Parse Errors */}\n {parseErrors.length > 0 && (\n <div className=\"bg-yellow-50 border border-yellow-200 rounded-lg p-3\">\n <div className=\"flex items-start gap-2\">\n <AlertCircle className=\"h-4 w-4 text-yellow-600 mt-0.5\" />\n <div>\n <p className=\"text-sm font-medium text-yellow-800\">Validation Warnings</p>\n <ul className=\"text-xs text-yellow-700 mt-1 space-y-0.5\">\n {parseErrors.map((err, i) => (\n <li key={i}>{err}</li>\n ))}\n </ul>\n </div>\n </div>\n </div>\n )}\n\n {/* Preview Table */}\n {parsedData.length > 0 && (\n <div>\n <p className=\"text-sm font-medium mb-2\">\n Preview ({Math.min(parsedData.length, 5)} of {parsedData.length} rows)\n </p>\n <div className=\"border rounded-lg overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n {previewColumns.map((col) => (\n <TableHead key={col} className=\"text-xs\">\n {col}\n </TableHead>\n ))}\n {previewColumns.length < Object.keys(parsedData[0]).length && (\n <TableHead className=\"text-xs\">...</TableHead>\n )}\n </TableRow>\n </TableHeader>\n <TableBody>\n {parsedData.slice(0, 5).map((row, i) => (\n <TableRow key={i}>\n {previewColumns.map((col) => (\n <TableCell key={col} className=\"text-xs py-1\">\n {String(row[col] ?? \"\")}\n </TableCell>\n ))}\n {previewColumns.length < Object.keys(row).length && (\n <TableCell className=\"text-xs py-1\">...</TableCell>\n )}\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n </div>\n )}\n\n {/* Error/Success Messages */}\n {error && (\n <div className=\"bg-red-50 border border-red-200 rounded-lg p-3 flex items-center gap-2\">\n <X className=\"h-4 w-4 text-red-600\" />\n <span className=\"text-sm text-red-700\">{error}</span>\n </div>\n )}\n\n {success && (\n <div className=\"bg-green-50 border border-green-200 rounded-lg p-3 flex items-center gap-2\">\n <CheckCircle2 className=\"h-4 w-4 text-green-600\" />\n <span className=\"text-sm text-green-700\">{success}</span>\n </div>\n )}\n </div>\n )}\n\n <DialogFooter>\n <Button variant=\"outline\" onClick={onClose}>\n Cancel\n </Button>\n <Button\n onClick={handleImport}\n disabled={parsedData.length === 0 || importing}\n >\n {importing ? \"Importing...\" : `Import ${parsedData.length} Records`}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","\"use client\";\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport { Input } from \"@/components/ui/input\";\nimport { Button } from \"@/components/ui/button\";\nimport { Textarea } from \"@/components/ui/textarea\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { X, ArrowLeft, Save, Plus, Trash2 } from \"lucide-react\";\nimport { useRouter } from \"next/navigation\";\nimport Link from \"next/link\";\nimport FieldConfiguration from \"./FormBuilder/FieldConfiguration\";\n\ninterface FormField {\n id: string;\n label: string;\n type: string;\n placeholder?: string;\n options?: string[];\n required: boolean;\n validation?: any;\n order: number;\n groupId: number;\n columnWidth: number;\n}\n\ninterface FormData {\n id?: number;\n name: string;\n description?: string;\n campaign?: string;\n slug: string;\n published: boolean;\n fields: FormField[];\n}\n\nexport default function FormBuilder({ formId }: { formId?: string }) {\n const [formData, setFormData] = useState<FormData>({\n name: \"\",\n description: \"\",\n campaign: \"\",\n slug: \"\",\n published: false,\n fields: [],\n });\n const [errors, setErrors] = useState<string[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [isSaving, setIsSaving] = useState(false);\n const [selectedField, setSelectedField] = useState<FormField | null>(null);\n const router = useRouter();\n\n const loadFormData = useCallback(async () => {\n try {\n setIsLoading(true);\n const response = await fetch(`/api/forms/${formId}`);\n if (response.ok) {\n const data = await response.json();\n setFormData({\n id: data.id,\n name: data.name,\n description: data.description || \"\",\n campaign: data.campaign || \"\",\n slug: data.slug,\n published: data.published,\n fields: (data.fields ?? []).map((field: any) => ({\n ...field,\n id: field.id.toString(),\n options: field.options ? JSON.parse(field.options) : undefined,\n validation: field.validation ? JSON.parse(field.validation) : undefined,\n })),\n });\n }\n } catch (error) {\n console.error(\"Error loading form:\", error);\n setErrors([\"Failed to load form data\"]);\n } finally {\n setIsLoading(false);\n }\n }, [formId]);\n\n // Load existing form data if editing\n useEffect(() => {\n if (formId) {\n loadFormData();\n }\n }, [formId, loadFormData]);\n\n // Auto-generate slug from name\n useEffect(() => {\n if (formData.name && !formData.slug) {\n const generatedSlug = formData.name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/(^-|-$)/g, '');\n setFormData(prev => ({ ...prev, slug: generatedSlug }));\n }\n }, [formData.name, formData.slug]);\n\n const addField = () => {\n const newField: FormField = {\n id: `field_${Date.now()}`,\n label: \"New Field\",\n type: \"text\",\n placeholder: \"\",\n required: false,\n order: formData.fields.length + 1,\n groupId: 1,\n columnWidth: 12,\n };\n setFormData(prev => ({\n ...prev,\n fields: [...prev.fields, newField],\n }));\n setSelectedField(newField);\n };\n\n const updateField = (fieldId: string, updates: Partial<FormField>) => {\n setFormData(prev => ({\n ...prev,\n fields: prev.fields.map(field => {\n if (field.id === fieldId) {\n const updatedField = { ...field, ...updates };\n \n // Initialize options array when field type changes to select/checkbox/radio\n if (updates.type && [\"select\", \"checkbox\", \"radio\"].includes(updates.type) && !updatedField.options) {\n updatedField.options = [];\n }\n \n return updatedField;\n }\n return field;\n }),\n }));\n \n if (selectedField?.id === fieldId) {\n const updatedSelectedField = selectedField ? { ...selectedField, ...updates } : null;\n \n // Initialize options array when field type changes to select/checkbox/radio\n if (updatedSelectedField && updates.type && [\"select\", \"checkbox\", \"radio\"].includes(updates.type) && !updatedSelectedField.options) {\n updatedSelectedField.options = [];\n }\n \n setSelectedField(updatedSelectedField);\n }\n };\n\n const removeField = (fieldId: string) => {\n setFormData(prev => ({\n ...prev,\n fields: prev.fields.filter(field => field.id !== fieldId),\n }));\n \n if (selectedField?.id === fieldId) {\n setSelectedField(null);\n }\n };\n\n const moveField = (fromIndex: number, toIndex: number) => {\n const fields = Array.from(formData.fields);\n const [movedField] = fields.splice(fromIndex, 1);\n fields.splice(toIndex, 0, movedField);\n\n // Update order numbers\n const updatedFields = fields.map((field, index) => ({\n ...field,\n order: index + 1,\n }));\n\n setFormData(prev => ({ ...prev, fields: updatedFields }));\n };\n\n const validateForm = () => {\n const newErrors: string[] = [];\n\n if (!formData.name.trim()) {\n newErrors.push(\"Form name is required\");\n }\n\n if (!formData.slug.trim()) {\n newErrors.push(\"Form slug is required\");\n }\n\n if (formData.fields.length === 0) {\n newErrors.push(\"At least one field is required\");\n }\n\n // Validate fields\n formData.fields.forEach((field, index) => {\n if (!field.label.trim()) {\n newErrors.push(`Field ${index + 1}: Label is required`);\n }\n });\n\n setErrors(newErrors);\n return newErrors.length === 0;\n };\n\n const handleSave = async (isPublishing: boolean = false) => {\n if (!validateForm()) return;\n\n try {\n setIsSaving(true);\n setErrors([]);\n\n const payload = {\n ...formData,\n published: isPublishing ? true : formData.published,\n fields: formData.fields.map((field) => {\n const numericId = typeof field.id === 'number' ? field.id : /^\\d+$/.test(String(field.id)) ? parseInt(String(field.id), 10) : undefined;\n const { id: _id, ...rest } = field;\n return {\n ...rest,\n ...(numericId !== undefined && { id: numericId }),\n options: field.options != null ? (Array.isArray(field.options) ? JSON.stringify(field.options) : field.options) : null,\n validation: field.validation != null ? (typeof field.validation === 'object' ? JSON.stringify(field.validation) : field.validation) : null,\n };\n }),\n };\n\n const url = formId ? `/api/forms/${formId}` : '/api/forms';\n const method = formId ? 'PUT' : 'POST';\n\n const response = await fetch(url, {\n method,\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n const errorData = await response.json();\n throw new Error(errorData.error || 'Failed to save form');\n }\n\n const savedForm = await response.json();\n router.push('/admin/forms');\n } catch (error: unknown) {\n console.error(\"Save error:\", error);\n setErrors([error instanceof Error ? error.message : \"Failed to save form\"]);\n } finally {\n setIsSaving(false);\n }\n };\n\n if (isLoading) {\n return <div className=\"flex items-center justify-center h-64\">Loading...</div>;\n }\n\n return (\n <div className=\"rounded-lg bg-white shadow-md\">\n {/* Header with loader color gradient background */}\n <div className=\"bg-gray-800 border-b border-gray-700 px-4 py-2.5 rounded-t-lg\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-xl font-bold text-white\">\n {formId ? 'Edit Form' : 'Create New Form'}\n </h1>\n <p className=\"text-xs text-gray-300 mt-0.5\">Design your form with drag-and-drop fields</p>\n </div>\n <div className=\"flex items-center space-x-3\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"bg-white text-gray-800 hover:bg-gray-100 border-0 text-xs\"\n onClick={() => router.push('/admin/forms')}\n >\n <X className=\"h-4 w-4 mr-2\" />\n Close\n </Button>\n </div>\n </div>\n </div>\n\n {/* Error Messages */}\n {errors.length > 0 && (\n <div className=\"bg-red-50 border-l-4 border-red-400 p-4 mx-6 mt-4\">\n <div className=\"flex\">\n <div className=\"ml-3\">\n <h3 className=\"text-sm font-medium text-red-800\">\n Please fix the following errors:\n </h3>\n <div className=\"mt-2 text-sm text-red-700\">\n <ul className=\"list-disc pl-5 space-y-1\">\n {errors.map((error, index) => (\n <li key={index}>{error}</li>\n ))}\n </ul>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* Content */}\n <div className=\"p-6\">\n\n {/* Error Messages */}\n {errors.length > 0 && (\n <div className=\"mb-6 p-4 bg-red-50 border border-red-200 rounded-md\">\n <div className=\"flex\">\n <div className=\"flex-shrink-0\">\n <X className=\"h-5 w-5 text-red-400\" />\n </div>\n <div className=\"ml-3\">\n <h3 className=\"text-sm font-medium text-red-800\">\n There were errors with your submission\n </h3>\n <div className=\"mt-2 text-sm text-red-700\">\n <ul className=\"list-disc pl-5 space-y-1\">\n {errors.map((error, index) => (\n <li key={index}>{error}</li>\n ))}\n </ul>\n </div>\n </div>\n </div>\n </div>\n )}\n\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-8\">\n {/* Form Settings Panel */}\n <div className=\"lg:col-span-1\">\n <div className=\"bg-white rounded-lg shadow p-6\">\n <h2 className=\"text-lg font-semibold mb-4\">Form Settings</h2>\n \n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n Form Name *\n </label>\n <Input\n value={formData.name}\n onChange={(e) => setFormData(prev => ({ ...prev, name: e.target.value }))}\n placeholder=\"Enter form name\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n Slug *\n </label>\n <Input\n value={formData.slug}\n onChange={(e) => setFormData(prev => ({ ...prev, slug: e.target.value }))}\n placeholder=\"form-slug\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n Description\n </label>\n <Textarea\n value={formData.description}\n onChange={(e) => setFormData(prev => ({ ...prev, description: e.target.value }))}\n placeholder=\"Form description\"\n rows={3}\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n Campaign\n </label>\n <Input\n value={formData.campaign}\n onChange={(e) => setFormData(prev => ({ ...prev, campaign: e.target.value }))}\n placeholder=\"Campaign name\"\n />\n </div>\n\n <div className=\"flex items-center space-x-2\">\n <Switch\n checked={formData.published}\n onCheckedChange={(checked) => setFormData(prev => ({ ...prev, published: checked }))}\n />\n <label className=\"text-sm font-medium text-gray-700\">\n Published\n </label>\n </div>\n </div>\n </div>\n </div>\n\n {/* Form Builder */}\n <div className=\"lg:col-span-2\">\n <div className=\"bg-white rounded-lg shadow\">\n {/* Toolbar */}\n <div className=\"border-b border-gray-200 p-4\">\n <div className=\"flex items-center justify-between\">\n <h2 className=\"text-lg font-semibold\">Form Fields</h2>\n <Button onClick={addField} size=\"sm\">\n <Plus className=\"h-4 w-4 mr-2\" />\n Add Field\n </Button>\n </div>\n </div>\n\n {/* Fields List */}\n <div className=\"p-4\">\n {formData.fields.length === 0 ? (\n <div className=\"text-center py-12\">\n <p className=\"text-gray-500 mb-4\">No fields added yet</p>\n <Button onClick={addField}>\n <Plus className=\"h-4 w-4 mr-2\" />\n Add Your First Field\n </Button>\n </div>\n ) : (\n <div className=\"space-y-3\">\n {formData.fields.map((field, index) => (\n <div\n key={field.id}\n className={`border rounded-lg p-4 ${\n selectedField?.id === field.id\n ? 'border-gray-500 bg-gray-100'\n : 'border-gray-200 bg-white'\n }`}\n >\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center space-x-3\">\n <div className=\"flex flex-col space-y-1\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => moveField(index, Math.max(0, index - 1))}\n disabled={index === 0}\n className=\"h-6 w-6 p-0\"\n >\n ↑\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => moveField(index, Math.min(formData.fields.length - 1, index + 1))}\n disabled={index === formData.fields.length - 1}\n className=\"h-6 w-6 p-0\"\n >\n ↓\n </Button>\n </div>\n <div className=\"flex items-center space-x-2\">\n <Badge variant=\"outline\">{field.type}</Badge>\n <span className=\"font-medium\">{field.label}</span>\n {field.required && (\n <Badge variant=\"destructive\" className=\"text-xs\">Required</Badge>\n )}\n </div>\n </div>\n <div className=\"flex items-center space-x-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setSelectedField(field)}\n >\n Configure\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => removeField(field.id)}\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n\n {/* Field Configuration Panel */}\n {selectedField && (\n <div className=\"mt-6 bg-white rounded-lg shadow p-6\">\n <div className=\"flex items-center justify-between mb-4\">\n <h3 className=\"text-lg font-semibold\">Configure Field</h3>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setSelectedField(null)}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n <FieldConfiguration\n field={selectedField}\n onUpdate={(updates) => updateField(selectedField.id, updates)}\n />\n </div>\n )}\n </div>\n </div>\n\n </div>\n \n {/* Footer with Action Buttons */}\n <div className=\"bg-gray-50 border-t border-gray-200 px-6 py-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"text-sm text-gray-600\">\n {formId ? \"Editing existing form\" : \"Creating new form\"}\n </div>\n <div className=\"flex items-center space-x-3\">\n <Button \n variant=\"outline\"\n className=\"bg-white text-gray-800 hover:bg-gray-100 border-0 text-xs\"\n onClick={() => router.push('/admin/forms')}\n >\n Close\n </Button>\n <Button \n onClick={() => handleSave(false)} \n disabled={isSaving}\n className=\"bg-white text-gray-800 hover:bg-gray-100 border-0 text-xs\"\n >\n <Save className=\"h-4 w-4 mr-2\" />\n {isSaving ? \"Saving...\" : \"Save\"}\n </Button>\n <Button \n onClick={() => handleSave(true)}\n disabled={isSaving}\n className=\"bg-gray-800 text-white hover:bg-gray-700 text-xs\"\n >\n {isSaving ? \"Publishing...\" : \"Publish\"}\n </Button>\n </div>\n </div>\n </div>\n </div>\n );\n} ","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst badgeVariants = cva(\n \"inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\",\n {\n variants: {\n variant: {\n default:\n \"border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80\",\n secondary:\n \"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n destructive:\n \"border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80\",\n outline: \"text-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\nfunction Badge({ className, variant, ...props }: BadgeProps) {\n return (\n <div className={cn(badgeVariants({ variant }), className)} {...props} />\n )\n}\n\nexport { Badge, badgeVariants }\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { Input } from \"@/components/ui/input\";\nimport { Button } from \"@/components/ui/button\";\nimport { Textarea } from \"@/components/ui/textarea\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"@/components/ui/select\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Plus, X } from \"lucide-react\";\n\ninterface FormField {\n id: string;\n label: string;\n type: string;\n placeholder?: string;\n options?: string[];\n required: boolean;\n validation?: any;\n order: number;\n groupId: number;\n columnWidth: number;\n}\n\ninterface FieldConfigurationProps {\n field: FormField;\n onUpdate: (updates: Partial<FormField>) => void;\n}\n\nconst FIELD_TYPES = [\n { value: \"text\", label: \"Text Input\" },\n { value: \"email\", label: \"Email\" },\n { value: \"textarea\", label: \"Text Area\" },\n { value: \"select\", label: \"Dropdown\" },\n { value: \"checkbox\", label: \"Checkbox\" },\n { value: \"radio\", label: \"Radio Buttons\" },\n { value: \"file\", label: \"File Upload\" },\n { value: \"date\", label: \"Date\" },\n { value: \"number\", label: \"Number\" },\n { value: \"phone\", label: \"Phone\" },\n];\n\nconst COLUMN_WIDTHS = [\n { value: 4, label: \"1/3 Width (4 cols)\" },\n { value: 6, label: \"1/2 Width (6 cols)\" },\n { value: 12, label: \"Full Width (12 cols)\" },\n];\n\nexport default function FieldConfiguration({ field, onUpdate }: FieldConfigurationProps) {\n const [newOption, setNewOption] = useState(\"\");\n\n const addOption = () => {\n if (newOption.trim()) {\n const currentOptions = field.options || [];\n onUpdate({\n options: [...currentOptions, newOption.trim()]\n });\n setNewOption(\"\");\n }\n };\n\n const removeOption = (index: number) => {\n const currentOptions = field.options || [];\n onUpdate({\n options: currentOptions.filter((_, i) => i !== index)\n });\n };\n\n const needsOptions = [\"select\", \"checkbox\", \"radio\"].includes(field.type);\n\n return (\n <div className=\"space-y-6\">\n {/* Basic Settings */}\n <div className=\"space-y-4\">\n <h4 className=\"font-medium text-gray-900\">Basic Settings</h4>\n \n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n Field Type\n </label>\n <Select\n value={field.type}\n onValueChange={(value) => onUpdate({ type: value })}\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {FIELD_TYPES.map((type) => (\n <SelectItem key={type.value} value={type.value}>\n {type.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n Label *\n </label>\n <Input\n value={field.label}\n onChange={(e) => onUpdate({ label: e.target.value })}\n placeholder=\"Field label\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n Placeholder\n </label>\n <Input\n value={field.placeholder || \"\"}\n onChange={(e) => onUpdate({ placeholder: e.target.value })}\n placeholder=\"Placeholder text\"\n />\n </div>\n\n <div className=\"flex items-center space-x-2\">\n <Switch\n checked={field.required}\n onCheckedChange={(checked) => onUpdate({ required: checked })}\n />\n <label className=\"text-sm font-medium text-gray-700\">\n Required field\n </label>\n </div>\n </div>\n\n {/* Layout Settings */}\n <div className=\"space-y-4\">\n <h4 className=\"font-medium text-gray-900\">Layout Settings</h4>\n \n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n Column Width\n </label>\n <Select\n value={field.columnWidth.toString()}\n onValueChange={(value) => onUpdate({ columnWidth: parseInt(value) })}\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {COLUMN_WIDTHS.map((width) => (\n <SelectItem key={width.value} value={width.value.toString()}>\n {width.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n Group ID\n </label>\n <Input\n type=\"number\"\n value={field.groupId}\n onChange={(e) => onUpdate({ groupId: parseInt(e.target.value) || 1 })}\n placeholder=\"Group ID\"\n min=\"1\"\n />\n <p className=\"text-xs text-gray-500 mt-1\">\n Fields with the same group ID will be placed in the same row\n </p>\n </div>\n </div>\n\n {/* Options for select/checkbox/radio */}\n {needsOptions && (\n <div className=\"space-y-4\">\n <h4 className=\"font-medium text-gray-900\">Options</h4>\n \n <div className=\"space-y-2\">\n {(field.options || []).length === 0 && (\n <p className=\"text-sm text-gray-500 italic\">No options added yet. Add options below.</p>\n )}\n \n {(field.options || []).map((option, index) => (\n <div key={index} className=\"flex items-center space-x-2\">\n <Input\n value={option}\n onChange={(e) => {\n const newOptions = [...(field.options || [])];\n newOptions[index] = e.target.value;\n onUpdate({ options: newOptions });\n }}\n placeholder=\"Option text\"\n />\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => removeOption(index)}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n ))}\n \n <div className=\"flex items-center space-x-2\">\n <Input\n value={newOption}\n onChange={(e) => setNewOption(e.target.value)}\n placeholder=\"Add new option\"\n onKeyPress={(e) => e.key === 'Enter' && addOption()}\n />\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={addOption}\n disabled={!newOption.trim()}\n >\n <Plus className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n </div>\n )}\n\n {/* Validation Settings */}\n <div className=\"space-y-4\">\n <h4 className=\"font-medium text-gray-900\">Validation</h4>\n \n {field.type === \"text\" && (\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n Min Length\n </label>\n <Input\n type=\"number\"\n value={field.validation?.minLength || \"\"}\n onChange={(e) => onUpdate({\n validation: {\n ...field.validation,\n minLength: e.target.value ? parseInt(e.target.value) : undefined\n }\n })}\n placeholder=\"Minimum characters\"\n min=\"0\"\n />\n </div>\n )}\n\n {field.type === \"text\" && (\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n Max Length\n </label>\n <Input\n type=\"number\"\n value={field.validation?.maxLength || \"\"}\n onChange={(e) => onUpdate({\n validation: {\n ...field.validation,\n maxLength: e.target.value ? parseInt(e.target.value) : undefined\n }\n })}\n placeholder=\"Maximum characters\"\n min=\"0\"\n />\n </div>\n )}\n\n {field.type === \"number\" && (\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n Min Value\n </label>\n <Input\n type=\"number\"\n value={field.validation?.min || \"\"}\n onChange={(e) => onUpdate({\n validation: {\n ...field.validation,\n min: e.target.value ? parseFloat(e.target.value) : undefined\n }\n })}\n placeholder=\"Minimum value\"\n />\n </div>\n )}\n\n {field.type === \"number\" && (\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n Max Value\n </label>\n <Input\n type=\"number\"\n value={field.validation?.max || \"\"}\n onChange={(e) => onUpdate({\n validation: {\n ...field.validation,\n max: e.target.value ? parseFloat(e.target.value) : undefined\n }\n })}\n placeholder=\"Maximum value\"\n />\n </div>\n )}\n\n {field.type === \"file\" && (\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n Allowed File Types\n </label>\n <Input\n value={field.validation?.allowedTypes || \"\"}\n onChange={(e) => onUpdate({\n validation: {\n ...field.validation,\n allowedTypes: e.target.value\n }\n })}\n placeholder=\"e.g., .pdf,.doc,.jpg,.png\"\n />\n <p className=\"text-xs text-gray-500 mt-1\">\n Comma-separated file extensions (e.g., .pdf,.doc,.jpg,.png)\n </p>\n </div>\n )}\n </div>\n\n {/* Field Preview */}\n <div className=\"space-y-4\">\n <h4 className=\"font-medium text-gray-900\">Preview</h4>\n <div className=\"border rounded-lg p-4 bg-gray-50\">\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n {field.label} {field.required && <span className=\"text-red-500\">*</span>}\n </label>\n \n {field.type === \"text\" && (\n <Input placeholder={field.placeholder} disabled />\n )}\n \n {field.type === \"email\" && (\n <Input type=\"email\" placeholder={field.placeholder} disabled />\n )}\n \n {field.type === \"textarea\" && (\n <Textarea placeholder={field.placeholder} disabled />\n )}\n \n {field.type === \"select\" && (\n <div>\n {(field.options || []).length === 0 ? (\n <p className=\"text-sm text-gray-400 italic\">No options configured</p>\n ) : (\n <Select disabled>\n <SelectTrigger>\n <SelectValue placeholder={field.placeholder || \"Select an option\"} />\n </SelectTrigger>\n <SelectContent>\n {(field.options || []).map((option, index) => (\n <SelectItem key={index} value={option}>\n {option}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n </div>\n )}\n \n {field.type === \"checkbox\" && (\n <div className=\"space-y-2\">\n {(field.options || []).length === 0 ? (\n <p className=\"text-sm text-gray-400 italic\">No options configured</p>\n ) : (\n (field.options || []).map((option, index) => (\n <div key={index} className=\"flex items-center space-x-2\">\n <input type=\"checkbox\" disabled />\n <label className=\"text-sm\">{option}</label>\n </div>\n ))\n )}\n </div>\n )}\n \n {field.type === \"radio\" && (\n <div className=\"space-y-2\">\n {(field.options || []).length === 0 ? (\n <p className=\"text-sm text-gray-400 italic\">No options configured</p>\n ) : (\n (field.options || []).map((option, index) => (\n <div key={index} className=\"flex items-center space-x-2\">\n <input type=\"radio\" name=\"preview\" disabled />\n <label className=\"text-sm\">{option}</label>\n </div>\n ))\n )}\n </div>\n )}\n \n {field.type === \"file\" && (\n <Input type=\"file\" disabled />\n )}\n \n {field.type === \"date\" && (\n <Input type=\"date\" disabled />\n )}\n \n {field.type === \"number\" && (\n <Input type=\"number\" placeholder={field.placeholder} disabled />\n )}\n \n {field.type === \"phone\" && (\n <Input type=\"tel\" placeholder={field.placeholder} disabled />\n )}\n </div>\n </div>\n </div>\n );\n} ","\"use client\";\n\nimport Image from \"next/image\";\nimport { useState, useEffect } from \"react\";\nimport { Input } from \"@/components/ui/input\";\nimport { Button } from \"@/components/ui/button\";\nimport { Textarea } from \"@/components/ui/textarea\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { Badge } from \"@/components/ui/badge\";\nimport FileUpload from \"@/components/ui/file-upload\";\nimport ImageUpload from \"@/components/ui/image-upload\";\nimport { X, ArrowLeft, Save, Eye, AlertCircle } from \"lucide-react\";\nimport { useRouter } from \"next/navigation\";\nimport Link from \"next/link\";\nimport dynamic from \"next/dynamic\";\nimport TagAutocomplete from \"./TagAutocomplete\";\nimport CategoryAutocomplete from \"./CategoryAutocomplete\";\nimport UserAutocomplete from \"./UserAutocomplete\";\n\n\n// Custom styles for Quill editor to match form inputs\nconst quillStyles = `\n .ql-container {\n border: none !important;\n font-size: 14px;\n font-family: inherit;\n border-radius: 0 0 6px 6px;\n }\n .ql-toolbar {\n border: none !important;\n border-bottom: 1px solid #e5e7eb !important;\n background: #f9fafb;\n border-radius: 6px 6px 0 0;\n padding: 8px 12px;\n }\n .ql-toolbar button {\n border-radius: 4px;\n margin: 0 1px;\n }\n .ql-toolbar button:hover {\n background-color: #e5e7eb !important;\n }\n .ql-editor {\n min-height: 800px;\n padding: 16px;\n border: none !important;\n outline: none !important;\n font-family: inherit;\n line-height: 1.6;\n color: #374151;\n }\n .ql-editor:focus {\n outline: none !important;\n }\n .ql-editor.ql-blank::before {\n color: #9ca3af;\n font-style: normal;\n font-size: 14px;\n }\n .ql-editor p {\n margin-bottom: 12px;\n }\n .ql-editor h1, .ql-editor h2, .ql-editor h3 {\n margin-top: 16px;\n margin-bottom: 8px;\n font-weight: 600;\n }\n`;\n\n// Dynamically import Quill to prevent SSR issues\nconst ReactQuill = dynamic(() => import(\"react-quill-new\"), { ssr: false });\n\nexport default function BlogEditor({ existingBlog }: { existingBlog?: any }) {\n const [title, setTitle] = useState(existingBlog?.title || \"\");\n const [slug, setSlug] = useState(existingBlog?.slug || \"\");\n const [coverImage, setCoverImage] = useState<string | null>(\n existingBlog?.coverImage || null,\n );\n const [ogImage, setOgImage] = useState<string | null>(\n existingBlog?.seo?.ogImage || existingBlog?.ogImage || null,\n );\n\n // Debug OG image\n useEffect(() => {\n if (existingBlog) {\n console.log(\"Existing blog data:\", {\n seoOgImage: existingBlog?.seo?.ogImage,\n directOgImage: existingBlog?.ogImage,\n finalOgImage: existingBlog?.seo?.ogImage || existingBlog?.ogImage || null\n });\n }\n }, [existingBlog]);\n const [metaTitle, setMetaTitle] = useState(existingBlog?.seo?.title || \"\");\n const [metaDescription, setMetaDescription] = useState(\n existingBlog?.seo?.description || \"\",\n );\n const [metaKeywords, setMetaKeywords] = useState(\n existingBlog?.seo?.keywords || \"\",\n );\n const [published, setPublished] = useState(existingBlog?.published || false);\n const [tags, setTags] = useState<string[]>(\n existingBlog?.tags?.map((tag: any) => tag.name) || []\n );\n const [category, setCategory] = useState<string | null>(\n existingBlog?.category?.name || null\n );\n const [authorId, setAuthorId] = useState<number | null>(\n existingBlog?.authorId || null\n );\n const [content, setContent] = useState(existingBlog?.content || \"\");\n const [createdAt, setCreatedAt] = useState(\n existingBlog?.createdAt \n ? new Date(existingBlog.createdAt).toISOString().slice(0, 16)\n : new Date().toISOString().slice(0, 16)\n );\n const [errors, setErrors] = useState<string[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [isSaving, setIsSaving] = useState(false);\n const router = useRouter();\n\n // Auto-generate slug from title\n useEffect(() => {\n if (title && !slug) {\n const generatedSlug = title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/(^-|-$)/g, '');\n setSlug(generatedSlug);\n }\n }, [title, slug]);\n\n // Handle image upload\n const handleUpload = async (\n event: React.ChangeEvent<HTMLInputElement>,\n setImage: (url: string) => void,\n ) => {\n if (!event.target.files) return;\n\n const formData = new FormData();\n formData.append(\"file\", event.target.files[0]);\n\n try {\n const res = await fetch(\"/api/upload\", {\n method: \"POST\",\n body: formData,\n });\n\n const data = await res.json();\n\n if (!res.ok) {\n throw new Error(data.error || data.details || \"Upload failed\");\n }\n\n console.log(\"Upload successful:\", data.filePath);\n setImage(data.filePath);\n } catch (error) {\n console.error(\"Upload error:\", error);\n const errorMessage = error instanceof Error ? error.message : \"Failed to upload image\";\n setErrors([errorMessage]);\n }\n };\n\n\n\n // Validate form\n const validateForm = (isPublishing: boolean = false) => {\n const newErrors: string[] = [];\n\n if (!title.trim()) {\n newErrors.push(\"Title is required\");\n }\n\n if (!authorId) {\n newErrors.push(\"Author is required\");\n }\n\n if (!content.trim()) {\n newErrors.push(\"Content is required\");\n }\n\n if (isPublishing) {\n if (!slug.trim()) {\n newErrors.push(\"Slug is required for publishing\");\n }\n \n if (!metaTitle.trim()) {\n newErrors.push(\"Meta title is required for publishing\");\n }\n \n if (!metaDescription.trim()) {\n newErrors.push(\"Meta description is required for publishing\");\n }\n \n if (!coverImage) {\n newErrors.push(\"Cover image is required for publishing\");\n }\n }\n\n setErrors(newErrors);\n return newErrors.length === 0;\n };\n\n // Save the blog post (partial save)\n const handleSave = async (isPublishing: boolean = false) => {\n setIsSaving(true);\n setErrors([]);\n\n // Validate form\n if (!validateForm(isPublishing)) {\n setIsSaving(false);\n return;\n }\n\n const body = {\n title,\n slug,\n content,\n published: isPublishing,\n tags,\n category,\n authorId,\n metaTitle,\n metaDescription,\n metaKeywords,\n coverImage,\n ogImage,\n createdAt,\n };\n\n const method = existingBlog ? \"PUT\" : \"POST\";\n const url = existingBlog ? `/api/blogs/${existingBlog.id}` : \"/api/blogs\";\n\n try {\n const response = await fetch(url, {\n method,\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n\n const data = await response.json();\n\n if (!response.ok) {\n if (data.details && Array.isArray(data.details)) {\n setErrors(data.details);\n } else {\n setErrors([data.error || \"Failed to save blog\"]);\n }\n return;\n }\n\n // Success\n if (isPublishing) {\n router.push(\"/admin/blogs\");\n } else {\n // For partial save, update the existing blog ID if it's a new blog\n if (!existingBlog && data.id) {\n router.replace(`/admin/blogs/${data.id}`);\n }\n }\n } catch (error) {\n console.error(\"Save error:\", error);\n setErrors([\"Failed to save blog\"]);\n } finally {\n setIsSaving(false);\n }\n };\n\n // Quill Modules (Toolbar Configuration)\n const quillModules = {\n toolbar: [\n [{ header: [1, 2, false] }],\n [\"bold\", \"italic\", \"underline\", \"strike\"],\n [{ list: \"ordered\" }, { list: \"bullet\" }],\n [\"blockquote\", \"code-block\"],\n [\"link\", \"image\", \"video\"],\n [{ align: [] }],\n [{ color: [] }, { background: [] }],\n [\"clean\"], // Remove formatting\n [{ table: true }], // Table Button\n ],\n table: {\n operationMenu: {\n items: {\n insertColumnRight: { text: \"Insert Column Right\" },\n insertColumnLeft: { text: \"Insert Column Left\" },\n insertRowUp: { text: \"Insert Row Above\" },\n insertRowDown: { text: \"Insert Row Below\" },\n deleteColumn: { text: \"Delete Column\" },\n deleteRow: { text: \"Delete Row\" },\n deleteTable: { text: \"Delete Table\" },\n },\n },\n },\n };\n\n return (\n <div className=\"min-w-0 rounded-lg bg-white shadow-md\">\n {/* Header with loader color gradient background */}\n <div className=\"bg-gray-800 border-b border-gray-700 px-4 py-2.5 rounded-t-lg\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-xl font-bold text-white\">\n {existingBlog ? \"Edit Blog\" : \"Create New Blog\"}\n </h1>\n <p className=\"text-xs text-gray-300 mt-0.5\">\n {existingBlog ? \"Update blog details\" : \"Add a new blog post\"}\n </p>\n </div>\n <div className=\"flex items-center space-x-3\">\n <div className=\"flex items-center gap-2\">\n <Switch\n checked={published}\n onCheckedChange={(checked) => setPublished(checked as boolean)}\n className=\"data-[state=checked]:bg-green-500\"\n />\n <span className=\"text-xs text-gray-300\">Published</span>\n </div>\n <Button\n size=\"sm\"\n className=\"flex items-center bg-white text-gray-800 hover:bg-gray-100 border-0 text-xs\"\n onClick={() => handleSave(published)}\n disabled={isSaving}\n >\n <Save className=\"h-4 w-4 mr-1\" />\n {isSaving ? \"Saving...\" : \"Save\"}\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"flex items-center bg-white text-gray-800 hover:bg-gray-100 border-0 text-xs\"\n onClick={() => router.back()}\n >\n <X className=\"h-4 w-4 mr-1\" /> Close\n </Button>\n </div>\n </div>\n </div>\n \n {/* Error Messages */}\n {errors.length > 0 && (\n <div className=\"bg-red-50 border-l-4 border-red-400 p-4 mx-6 mt-4\">\n <div className=\"flex\">\n <AlertCircle className=\"h-5 w-5 text-red-400\" />\n <div className=\"ml-3\">\n <h3 className=\"text-sm font-medium text-red-800\">\n Please fix the following errors:\n </h3>\n <div className=\"mt-2 text-sm text-red-700\">\n <ul className=\"list-disc pl-5 space-y-1\">\n {errors.map((error, index) => (\n <li key={index}>{error}</li>\n ))}\n </ul>\n </div>\n </div>\n </div>\n </div>\n )}\n \n {/* Content */}\n <div className=\"min-w-0 p-6\">\n <div className=\"flex flex-col lg:flex-row w-full gap-6 min-w-0\">\n {/* LEFT COLUMN - 80% */}\n <div className=\"flex w-full lg:w-3/4 flex-col gap-4 min-w-0\">\n {/* Quill Editor with Table Support */}\n <div className=\"mb-6\">\n <label className=\"block text-sm font-semibold text-gray-700 mb-2\">\n Content *\n </label>\n <div className=\"border border-gray-300 rounded-md bg-white overflow-hidden focus-within:border-gray-500 focus-within:ring-1 focus-within:ring-gray-500 transition-colors\">\n <style dangerouslySetInnerHTML={{ __html: quillStyles }} />\n <ReactQuill\n value={content}\n onChange={setContent}\n theme=\"snow\"\n modules={quillModules}\n placeholder=\"Write your blog content here...\"\n />\n </div>\n </div>\n </div>\n\n {/* RIGHT COLUMN - 20% */}\n <div className=\"flex w-full lg:w-1/4 flex-col gap-4 rounded-lg bg-gray-50 border overflow-hidden min-w-0\">\n <div className=\"p-3 bg-white border-b\">\n <div className=\"text-xs font-semibold text-gray-500 uppercase tracking-wide mb-2\">Blog</div>\n <div className=\"space-y-2\">\n <div>\n <label className=\"block text-xs font-medium text-gray-600 mb-1\">Title *</label>\n <Input\n type=\"text\"\n placeholder=\"Blog Title\"\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n className=\"h-8 text-sm\"\n />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-gray-600 mb-1\">Slug *</label>\n <Input\n type=\"text\"\n placeholder=\"blog-post-url\"\n value={slug}\n onChange={(e) => setSlug(e.target.value)}\n className=\"h-8 text-sm\"\n />\n <p className=\"text-xs text-gray-500 mt-1\">yourdomain.com/blog/{slug || \"...\"}</p>\n </div>\n </div>\n </div>\n <div className=\"p-4 flex flex-col gap-4\">\n {/* Author Selection */}\n <div>\n <p className=\"text-sm font-semibold\">Author *</p>\n <UserAutocomplete\n selectedUserId={authorId}\n onUserChange={setAuthorId}\n placeholder=\"Select author...\"\n className=\"w-full\"\n />\n </div>\n\n {/* Cover Image Upload */}\n <div>\n <ImageUpload\n value={coverImage}\n onChange={setCoverImage}\n label=\"Cover Image\"\n required={true}\n className=\"w-full\"\n />\n </div>\n\n {/* Open Graph Image Upload */}\n <div>\n <ImageUpload\n value={ogImage}\n onChange={setOgImage}\n label=\"OG Image (for social sharing)\"\n required={false}\n className=\"w-full\"\n />\n </div>\n\n {/* Tags Input */}\n <div>\n <p className=\"text-sm font-semibold\">Tags</p>\n <TagAutocomplete\n selectedTags={tags}\n onTagsChange={setTags}\n placeholder=\"Search or create tags...\"\n className=\"w-full\"\n />\n </div>\n\n {/* Category Input */}\n <div>\n <p className=\"text-sm font-semibold\">Category</p>\n <CategoryAutocomplete\n selectedCategory={category}\n onCategoryChange={setCategory}\n placeholder=\"Search or create category...\"\n className=\"w-full\"\n />\n </div>\n\n {/* Meta Title */}\n <div>\n <p className=\"text-sm font-semibold\">Meta Title *</p>\n <Input\n type=\"text\"\n placeholder=\"Meta Title\"\n value={metaTitle}\n onChange={(e) => setMetaTitle(e.target.value)}\n className=\"w-full\"\n />\n </div>\n\n {/* Meta Description */}\n <div>\n <p className=\"text-sm font-semibold\">Meta Description *</p>\n <Textarea\n placeholder=\"Meta Description\"\n value={metaDescription}\n onChange={(e) => setMetaDescription(e.target.value)}\n className=\"w-full\"\n rows={3}\n />\n </div>\n\n {/* Meta Keywords */}\n <div>\n <p className=\"text-sm font-semibold\">Meta Keywords</p>\n <Input\n type=\"text\"\n placeholder=\"Comma-separated keywords\"\n value={metaKeywords}\n onChange={(e) => setMetaKeywords(e.target.value)}\n className=\"w-full\"\n />\n </div>\n\n {/* Created Date */}\n <div>\n <p className=\"text-sm font-semibold\">Created Date</p>\n <Input\n type=\"datetime-local\"\n value={createdAt}\n onChange={(e) => setCreatedAt(e.target.value)}\n className=\"w-full\"\n />\n <p className=\"text-xs text-gray-500 mt-1\">\n Set the creation date for backdated posts\n </p>\n </div>\n\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useState, useRef, useCallback } from 'react';\nimport { Upload, X, ImageIcon, AlertCircle, CheckCircle } from 'lucide-react';\nimport { Button } from './button';\nimport { cn } from '@/lib/utils';\nimport Image from 'next/image';\n\ninterface ImageUploadProps {\n value?: string | null;\n onChange: (url: string) => void;\n onRemove?: () => void;\n label: string;\n required?: boolean;\n className?: string;\n maxSize?: number; // in MB\n acceptedTypes?: string[];\n}\n\nexport default function ImageUpload({\n value,\n onChange,\n onRemove,\n label,\n required = false,\n className,\n maxSize = 10, // 10MB default\n acceptedTypes = ['image/jpeg', 'image/png', 'image/gif', 'image/webp']\n}: ImageUploadProps) {\n const [isDragOver, setIsDragOver] = useState(false);\n const [isUploading, setIsUploading] = useState(false);\n const [uploadProgress, setUploadProgress] = useState(0);\n const [error, setError] = useState<string | null>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const handleFileSelect = useCallback(async (file: File) => {\n // Reset states\n setError(null);\n setUploadProgress(0);\n\n // Validate file type\n if (!acceptedTypes.includes(file.type)) {\n setError(`File type not supported. Please use: ${acceptedTypes.join(', ')}`);\n return;\n }\n\n // Validate file size\n if (file.size > maxSize * 1024 * 1024) {\n setError(`File size must be less than ${maxSize}MB`);\n return;\n }\n\n setIsUploading(true);\n\n try {\n const formData = new FormData();\n formData.append(\"file\", file);\n\n const response = await fetch(\"/api/upload\", {\n method: \"POST\",\n body: formData,\n });\n\n const data = await response.json();\n\n if (!response.ok) {\n throw new Error(data.error || data.details || \"Upload failed\");\n }\n\n onChange(data.filePath);\n setUploadProgress(100);\n } catch (error) {\n console.error(\"Upload error:\", error);\n setError(error instanceof Error ? error.message : \"Failed to upload image\");\n } finally {\n setIsUploading(false);\n }\n }, [onChange, acceptedTypes, maxSize]);\n\n const handleDrop = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n setIsDragOver(false);\n\n const files = Array.from(e.dataTransfer.files);\n if (files.length > 0) {\n handleFileSelect(files[0]);\n }\n }, [handleFileSelect]);\n\n const handleDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n setIsDragOver(true);\n }, []);\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n setIsDragOver(false);\n }, []);\n\n const handleFileInputChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files;\n if (files && files.length > 0) {\n handleFileSelect(files[0]);\n }\n }, [handleFileSelect]);\n\n const handleRemove = useCallback(() => {\n if (onRemove) {\n onRemove();\n } else {\n onChange('');\n }\n setError(null);\n setUploadProgress(0);\n }, [onChange, onRemove]);\n\n const openFileDialog = useCallback(() => {\n fileInputRef.current?.click();\n }, []);\n\n return (\n <div className={cn(\"space-y-3\", className)}>\n <div className=\"flex items-center justify-between\">\n <label className=\"text-sm font-semibold\">\n {label}\n {required && <span className=\"text-red-500 ml-1\">*</span>}\n </label>\n {value && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={handleRemove}\n className=\"h-8 px-2 text-xs\"\n >\n <X className=\"h-3 w-3 mr-1\" />\n Remove\n </Button>\n )}\n </div>\n\n {!value ? (\n <div\n className={cn(\n \"border-2 border-dashed rounded-lg p-6 text-center transition-colors cursor-pointer\",\n isDragOver\n ? \"border-primary bg-primary/5\"\n : \"border-gray-300 hover:border-primary/50 hover:bg-gray-50\",\n error && \"border-red-300 bg-red-50\"\n )}\n onDrop={handleDrop}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onClick={openFileDialog}\n >\n <input\n ref={fileInputRef}\n type=\"file\"\n accept={acceptedTypes.join(',')}\n onChange={handleFileInputChange}\n className=\"hidden\"\n disabled={isUploading}\n />\n\n {isUploading ? (\n <div className=\"space-y-3\">\n <div className=\"animate-spin rounded-full h-8 w-8 border-b-2 border-primary mx-auto\"></div>\n <div className=\"space-y-1\">\n <p className=\"text-sm font-medium\">Uploading...</p>\n <div className=\"w-full bg-gray-200 rounded-full h-2\">\n <div\n className=\"bg-primary h-2 rounded-full transition-all duration-300\"\n style={{ width: `${uploadProgress}%` }}\n ></div>\n </div>\n <p className=\"text-xs text-gray-500\">{uploadProgress}%</p>\n </div>\n </div>\n ) : (\n <div className=\"space-y-3\">\n <div className=\"mx-auto w-12 h-12 bg-gray-100 rounded-full flex items-center justify-center\">\n {error ? (\n <AlertCircle className=\"h-6 w-6 text-red-500\" />\n ) : (\n <Upload className=\"h-6 w-6 text-gray-400\" />\n )}\n </div>\n <div className=\"space-y-1\">\n <p className=\"text-sm font-medium\">\n {error ? \"Upload failed\" : \"Click to upload or drag and drop\"}\n </p>\n <p className=\"text-xs text-gray-500\">\n {error || `PNG, JPG, GIF, WEBP up to ${maxSize}MB`}\n </p>\n </div>\n </div>\n )}\n </div>\n ) : (\n <div className=\"space-y-3\">\n <div className=\"relative group\">\n <div className=\"aspect-video w-full rounded-lg overflow-hidden bg-gray-100\">\n <Image\n src={value}\n alt={label}\n width={800}\n height={450}\n className=\"w-full h-full object-cover\"\n onError={(e) => {\n console.error(\"Image failed to load:\", value);\n e.currentTarget.style.display = 'none';\n }}\n />\n </div>\n <div className=\"absolute inset-0 bg-black/50 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center\">\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n onClick={openFileDialog}\n className=\"bg-white/90 hover:bg-white\"\n >\n <ImageIcon className=\"h-4 w-4 mr-1\" />\n Replace\n </Button>\n </div>\n </div>\n <div className=\"flex items-center justify-between text-xs text-gray-500\">\n <span>Current image</span>\n <span className=\"truncate max-w-[200px]\">{value}</span>\n </div>\n </div>\n )}\n\n {error && (\n <div className=\"flex items-center space-x-2 text-sm text-red-600\">\n <AlertCircle className=\"h-4 w-4\" />\n <span>{error}</span>\n </div>\n )}\n </div>\n );\n} ","\"use client\";\n\nimport { useState, useEffect, useRef, useCallback } from \"react\";\nimport { Input } from \"@/components/ui/input\";\nimport { Button } from \"@/components/ui/button\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { X, Plus, Search } from \"lucide-react\";\n\ninterface Tag {\n id: number;\n name: string;\n}\n\ninterface TagAutocompleteProps {\n selectedTags: string[];\n onTagsChange: (tags: string[]) => void;\n placeholder?: string;\n className?: string;\n}\n\nexport default function TagAutocomplete({\n selectedTags,\n onTagsChange,\n placeholder = \"Search or create tags...\",\n className = \"\"\n}: TagAutocompleteProps) {\n const [inputValue, setInputValue] = useState(\"\");\n const [suggestions, setSuggestions] = useState<Tag[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [showSuggestions, setShowSuggestions] = useState(false);\n const [isCreating, setIsCreating] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const suggestionsRef = useRef<HTMLDivElement>(null);\n\n // Fetch tag suggestions\n const fetchSuggestions = useCallback(async (query: string) => {\n if (!query.trim()) {\n setSuggestions([]);\n return;\n }\n\n setIsLoading(true);\n try {\n const response = await fetch(`/api/tags?search=${encodeURIComponent(query)}`);\n if (response.ok) {\n const tags = await response.json();\n // Filter out already selected tags\n const filteredTags = tags.filter((tag: Tag) => \n !selectedTags.includes(tag.name)\n );\n setSuggestions(filteredTags);\n }\n } catch (error) {\n console.error(\"Error fetching tags:\", error);\n } finally {\n setIsLoading(false);\n }\n }, [selectedTags]);\n\n // Debounced search\n useEffect(() => {\n const timeoutId = setTimeout(() => {\n fetchSuggestions(inputValue);\n }, 300);\n\n return () => clearTimeout(timeoutId);\n }, [inputValue, fetchSuggestions]);\n\n // Handle input change\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n setInputValue(value);\n setShowSuggestions(true);\n };\n\n // Handle suggestion selection\n const handleSuggestionSelect = (tag: Tag) => {\n if (!selectedTags.includes(tag.name)) {\n onTagsChange([...selectedTags, tag.name]);\n }\n setInputValue(\"\");\n setShowSuggestions(false);\n setSuggestions([]);\n };\n\n // Handle creating new tag\n const handleCreateTag = async () => {\n if (!inputValue.trim() || selectedTags.includes(inputValue.trim())) {\n return;\n }\n\n setIsCreating(true);\n try {\n const response = await fetch(\"/api/tags\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ name: inputValue.trim() }),\n });\n\n if (response.ok) {\n const newTag = await response.json();\n onTagsChange([...selectedTags, newTag.name]);\n setInputValue(\"\");\n setShowSuggestions(false);\n setSuggestions([]);\n } else {\n const error = await response.json();\n console.error(\"Error creating tag:\", error);\n }\n } catch (error) {\n console.error(\"Error creating tag:\", error);\n } finally {\n setIsCreating(false);\n }\n };\n\n // Handle removing tag\n const handleRemoveTag = (tagToRemove: string) => {\n onTagsChange(selectedTags.filter(tag => tag !== tagToRemove));\n };\n\n // Handle key press\n const handleKeyPress = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n if (suggestions.length > 0) {\n handleSuggestionSelect(suggestions[0]);\n } else if (inputValue.trim()) {\n handleCreateTag();\n }\n } else if (e.key === \"Escape\") {\n setShowSuggestions(false);\n inputRef.current?.blur();\n }\n };\n\n // Handle click outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n suggestionsRef.current &&\n !suggestionsRef.current.contains(event.target as Node) &&\n inputRef.current &&\n !inputRef.current.contains(event.target as Node)\n ) {\n setShowSuggestions(false);\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, []);\n\n return (\n <div className={`relative ${className}`}>\n {/* Selected Tags */}\n {selectedTags.length > 0 && (\n <div className=\"mb-2 flex flex-wrap gap-2\">\n {selectedTags.map((tag) => (\n <Badge key={tag} className=\"flex items-center gap-1\">\n {tag}\n <X\n size={12}\n className=\"cursor-pointer hover:text-red-500\"\n onClick={() => handleRemoveTag(tag)}\n />\n </Badge>\n ))}\n </div>\n )}\n\n {/* Input Field */}\n <div className=\"relative\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-gray-400\" />\n <Input\n ref={inputRef}\n type=\"text\"\n placeholder={placeholder}\n value={inputValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyPress}\n onFocus={() => setShowSuggestions(true)}\n className=\"pl-10 pr-20\"\n />\n {inputValue.trim() && (\n <Button\n size=\"sm\"\n onClick={handleCreateTag}\n disabled={isCreating || selectedTags.includes(inputValue.trim())}\n className=\"absolute right-1 top-1/2 -translate-y-1/2 h-7 px-2\"\n >\n {isCreating ? (\n \"Creating...\"\n ) : (\n <>\n <Plus className=\"h-3 w-3 mr-1\" />\n Create\n </>\n )}\n </Button>\n )}\n </div>\n\n {/* Suggestions Dropdown */}\n {showSuggestions && (suggestions.length > 0 || isLoading) && (\n <div\n ref={suggestionsRef}\n className=\"absolute z-50 w-full mt-1 bg-white border border-gray-200 rounded-md shadow-lg max-h-60 overflow-auto\"\n >\n {isLoading ? (\n <div className=\"px-4 py-2 text-sm text-gray-500\">Loading...</div>\n ) : (\n suggestions.map((tag) => (\n <div\n key={tag.id}\n className=\"px-4 py-2 hover:bg-gray-100 cursor-pointer text-sm\"\n onClick={() => handleSuggestionSelect(tag)}\n >\n {tag.name}\n </div>\n ))\n )}\n </div>\n )}\n\n {/* Create New Tag Option */}\n {showSuggestions && \n inputValue.trim() && \n !isLoading && \n suggestions.length === 0 && \n !selectedTags.includes(inputValue.trim()) && (\n <div\n ref={suggestionsRef}\n className=\"absolute z-50 w-full mt-1 bg-white border border-gray-200 rounded-md shadow-lg\"\n >\n <div\n className=\"px-4 py-2 hover:bg-gray-100 cursor-pointer text-sm text-gray-700 flex items-center\"\n onClick={handleCreateTag}\n >\n <Plus className=\"h-3 w-3 mr-2\" />\n Create &quot;{inputValue.trim()}&quot;\n </div>\n </div>\n )}\n </div>\n );\n} ","\"use client\";\n\nimport { useState, useEffect, useRef } from \"react\";\nimport { Input } from \"@/components/ui/input\";\nimport { Button } from \"@/components/ui/button\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { X, Plus, Search, Check } from \"lucide-react\";\n\ninterface Category {\n id: number;\n name: string;\n}\n\ninterface CategoryAutocompleteProps {\n selectedCategory: string | null;\n onCategoryChange: (category: string | null) => void;\n placeholder?: string;\n className?: string;\n}\n\nexport default function CategoryAutocomplete({\n selectedCategory,\n onCategoryChange,\n placeholder = \"Search or create category...\",\n className = \"\"\n}: CategoryAutocompleteProps) {\n const [inputValue, setInputValue] = useState(\"\");\n const [suggestions, setSuggestions] = useState<Category[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [showSuggestions, setShowSuggestions] = useState(false);\n const [isCreating, setIsCreating] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const suggestionsRef = useRef<HTMLDivElement>(null);\n\n // Fetch category suggestions\n const fetchSuggestions = async (query: string) => {\n if (!query.trim()) {\n setSuggestions([]);\n return;\n }\n\n setIsLoading(true);\n try {\n const response = await fetch(`/api/categories?search=${encodeURIComponent(query)}`);\n if (response.ok) {\n const categories = await response.json();\n setSuggestions(categories);\n }\n } catch (error) {\n console.error(\"Error fetching categories:\", error);\n } finally {\n setIsLoading(false);\n }\n };\n\n // Debounced search\n useEffect(() => {\n const timeoutId = setTimeout(() => {\n fetchSuggestions(inputValue);\n }, 300);\n\n return () => clearTimeout(timeoutId);\n }, [inputValue]);\n\n // Handle input change\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n setInputValue(value);\n setShowSuggestions(true);\n };\n\n // Handle suggestion selection\n const handleSuggestionSelect = (category: Category) => {\n onCategoryChange(category.name);\n setInputValue(\"\");\n setShowSuggestions(false);\n setSuggestions([]);\n };\n\n // Handle creating new category\n const handleCreateCategory = async () => {\n if (!inputValue.trim()) {\n return;\n }\n\n setIsCreating(true);\n try {\n const response = await fetch(\"/api/categories\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ name: inputValue.trim() }),\n });\n\n if (response.ok) {\n const newCategory = await response.json();\n onCategoryChange(newCategory.name);\n setInputValue(\"\");\n setShowSuggestions(false);\n setSuggestions([]);\n } else {\n const error = await response.json();\n console.error(\"Error creating category:\", error);\n }\n } catch (error) {\n console.error(\"Error creating category:\", error);\n } finally {\n setIsCreating(false);\n }\n };\n\n // Handle removing category\n const handleRemoveCategory = () => {\n onCategoryChange(null);\n };\n\n // Handle key press\n const handleKeyPress = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n if (suggestions.length > 0) {\n handleSuggestionSelect(suggestions[0]);\n } else if (inputValue.trim()) {\n handleCreateCategory();\n }\n } else if (e.key === \"Escape\") {\n setShowSuggestions(false);\n inputRef.current?.blur();\n }\n };\n\n // Handle click outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n suggestionsRef.current &&\n !suggestionsRef.current.contains(event.target as Node) &&\n inputRef.current &&\n !inputRef.current.contains(event.target as Node)\n ) {\n setShowSuggestions(false);\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, []);\n\n return (\n <div className={`relative ${className}`}>\n {/* Selected Category */}\n {selectedCategory && (\n <div className=\"mb-2\">\n <Badge className=\"flex items-center gap-1\">\n {selectedCategory}\n <X\n size={12}\n className=\"cursor-pointer hover:text-red-500\"\n onClick={handleRemoveCategory}\n />\n </Badge>\n </div>\n )}\n\n {/* Input Field */}\n <div className=\"relative\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-gray-400\" />\n <Input\n ref={inputRef}\n type=\"text\"\n placeholder={placeholder}\n value={inputValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyPress}\n onFocus={() => setShowSuggestions(true)}\n className=\"pl-10 pr-20\"\n />\n {inputValue.trim() && (\n <Button\n size=\"sm\"\n onClick={handleCreateCategory}\n disabled={isCreating}\n className=\"absolute right-1 top-1/2 -translate-y-1/2 h-7 px-2\"\n >\n {isCreating ? (\n \"Creating...\"\n ) : (\n <>\n <Plus className=\"h-3 w-3 mr-1\" />\n Create\n </>\n )}\n </Button>\n )}\n </div>\n\n {/* Suggestions Dropdown */}\n {showSuggestions && (suggestions.length > 0 || isLoading) && (\n <div\n ref={suggestionsRef}\n className=\"absolute z-50 w-full mt-1 bg-white border border-gray-200 rounded-md shadow-lg max-h-60 overflow-auto\"\n >\n {isLoading ? (\n <div className=\"px-4 py-2 text-sm text-gray-500\">Loading...</div>\n ) : (\n suggestions.map((category) => (\n <div\n key={category.id}\n className=\"px-4 py-2 hover:bg-gray-100 cursor-pointer text-sm flex items-center justify-between\"\n onClick={() => handleSuggestionSelect(category)}\n >\n {category.name}\n {selectedCategory === category.name && (\n <Check className=\"h-4 w-4 text-green-500\" />\n )}\n </div>\n ))\n )}\n </div>\n )}\n\n {/* Create New Category Option */}\n {showSuggestions && \n inputValue.trim() && \n !isLoading && \n suggestions.length === 0 && (\n <div\n ref={suggestionsRef}\n className=\"absolute z-50 w-full mt-1 bg-white border border-gray-200 rounded-md shadow-lg\"\n >\n <div\n className=\"px-4 py-2 hover:bg-gray-100 cursor-pointer text-sm text-gray-700 flex items-center\"\n onClick={handleCreateCategory}\n >\n <Plus className=\"h-3 w-3 mr-2\" />\n Create &quot;{inputValue.trim()}&quot;\n </div>\n </div>\n )}\n </div>\n );\n} ","\"use client\";\n\nimport { useState, useEffect, useRef } from \"react\";\nimport { Input } from \"@/components/ui/input\";\nimport { Button } from \"@/components/ui/button\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { X, Search, Check } from \"lucide-react\";\n\ninterface User {\n id: number;\n name: string;\n email: string;\n}\n\ninterface UserAutocompleteProps {\n selectedUserId: number | null;\n onUserChange: (userId: number | null) => void;\n placeholder?: string;\n className?: string;\n}\n\nexport default function UserAutocomplete({\n selectedUserId,\n onUserChange,\n placeholder = \"Select author...\",\n className = \"\"\n}: UserAutocompleteProps) {\n const [inputValue, setInputValue] = useState(\"\");\n const [suggestions, setSuggestions] = useState<User[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [showSuggestions, setShowSuggestions] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const suggestionsRef = useRef<HTMLDivElement>(null);\n\n // Fetch user suggestions\n const fetchSuggestions = async (query: string) => {\n setIsLoading(true);\n try {\n const params = new URLSearchParams();\n if (query.trim()) {\n params.append(\"search\", query);\n }\n params.append(\"limit\", \"50\");\n\n const response = await fetch(`/api/users?${params}`);\n if (response.ok) {\n const data = await response.json();\n setSuggestions(data.data || []);\n }\n } catch (error) {\n console.error(\"Error fetching users:\", error);\n } finally {\n setIsLoading(false);\n }\n };\n\n // Debounced search\n useEffect(() => {\n const timeoutId = setTimeout(() => {\n fetchSuggestions(inputValue);\n }, 300);\n\n return () => clearTimeout(timeoutId);\n }, [inputValue]);\n\n // Handle input change\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n setInputValue(value);\n setShowSuggestions(true);\n };\n\n // Handle suggestion selection\n const handleSuggestionSelect = (user: User) => {\n onUserChange(user.id);\n setInputValue(\"\");\n setShowSuggestions(false);\n setSuggestions([]);\n };\n\n // Handle removing user\n const handleRemoveUser = () => {\n onUserChange(null);\n };\n\n // Handle key press\n const handleKeyPress = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n if (suggestions.length > 0) {\n handleSuggestionSelect(suggestions[0]);\n }\n } else if (e.key === \"Escape\") {\n setShowSuggestions(false);\n inputRef.current?.blur();\n }\n };\n\n // Handle click outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n suggestionsRef.current &&\n !suggestionsRef.current.contains(event.target as Node) &&\n inputRef.current &&\n !inputRef.current.contains(event.target as Node)\n ) {\n setShowSuggestions(false);\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, []);\n\n const selectedUser = suggestions.find(user => user.id === selectedUserId);\n\n return (\n <div className={`relative ${className}`}>\n {/* Selected User */}\n {selectedUser && (\n <div className=\"mb-2\">\n <Badge className=\"flex items-center gap-1\">\n {selectedUser.name}\n <X\n size={12}\n className=\"cursor-pointer hover:text-red-500\"\n onClick={handleRemoveUser}\n />\n </Badge>\n </div>\n )}\n\n {/* Input Field */}\n <div className=\"relative\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-gray-400\" />\n <Input\n ref={inputRef}\n type=\"text\"\n placeholder={placeholder}\n value={inputValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyPress}\n onFocus={() => setShowSuggestions(true)}\n className=\"pl-10\"\n />\n </div>\n\n {/* Suggestions Dropdown */}\n {showSuggestions && (suggestions.length > 0 || isLoading) && (\n <div\n ref={suggestionsRef}\n className=\"absolute z-50 w-full mt-1 bg-white border border-gray-200 rounded-md shadow-lg max-h-60 overflow-auto\"\n >\n {isLoading ? (\n <div className=\"px-4 py-2 text-sm text-gray-500\">Loading...</div>\n ) : (\n suggestions.map((user) => (\n <div\n key={user.id}\n className=\"px-4 py-2 hover:bg-gray-100 cursor-pointer text-sm flex items-center justify-between\"\n onClick={() => handleSuggestionSelect(user)}\n >\n <div className=\"flex flex-col\">\n <span className=\"font-medium\">{user.name}</span>\n <span className=\"text-xs text-gray-500\">{user.email}</span>\n </div>\n {selectedUserId === user.id && (\n <Check className=\"h-4 w-4 text-green-500\" />\n )}\n </div>\n ))\n )}\n </div>\n )}\n </div>\n );\n} ","\"use client\";\n\nimport { useEffect, useRef } from 'react';\n\ninterface AnalyticsChartProps {\n data: Array<{ label: string; value: number }>;\n title: string;\n type: 'bar' | 'line' | 'doughnut';\n}\n\nexport default function AnalyticsChart({ data, title, type }: AnalyticsChartProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n\n useEffect(() => {\n if (!canvasRef.current || !data.length) return;\n\n const ctx = canvasRef.current.getContext('2d');\n if (!ctx) return;\n\n // Simple chart implementation - you can enhance this with Chart.js or similar\n const maxValue = Math.max(...data.map(d => d.value));\n const barWidth = 40;\n const barSpacing = 20;\n const chartHeight = 200;\n\n ctx.clearRect(0, 0, canvasRef.current.width, canvasRef.current.height);\n\n data.forEach((item, index) => {\n const x = index * (barWidth + barSpacing) + 50;\n const height = (item.value / maxValue) * chartHeight;\n const y = chartHeight - height + 50;\n\n ctx.fillStyle = '#3b82f6';\n ctx.fillRect(x, y, barWidth, height);\n\n ctx.fillStyle = '#374151';\n ctx.font = '12px Arial';\n ctx.textAlign = 'center';\n ctx.fillText(item.label, x + barWidth / 2, chartHeight + 70);\n });\n }, [data]);\n\n return (\n <div className=\"bg-white dark:bg-gray-800 p-6 rounded-lg shadow\">\n <h3 className=\"text-lg font-semibold mb-4\">{title}</h3>\n <canvas ref={canvasRef} width={600} height={300} className=\"w-full\" />\n </div>\n );\n} ","\"use client\";\n\nimport {\n Chart as ChartJS,\n CategoryScale,\n LinearScale,\n PointElement,\n LineElement,\n Title,\n Tooltip,\n Legend,\n Filler,\n} from 'chart.js';\nimport { Line } from 'react-chartjs-2';\n\nChartJS.register(\n CategoryScale,\n LinearScale,\n PointElement,\n LineElement,\n Title,\n Tooltip,\n Legend,\n Filler\n);\n\ninterface DailyUserChartProps {\n data: Array<{ date: string; users: number }>;\n title?: string;\n}\n\nexport default function DailyUserChart({ data, title = \"Daily User Activity\" }: DailyUserChartProps) {\n const chartData = {\n labels: data.map(item => item.date),\n datasets: [\n {\n label: 'Daily Users',\n data: data.map(item => item.users),\n borderColor: 'rgb(59, 130, 246)',\n backgroundColor: 'rgba(59, 130, 246, 0.1)',\n borderWidth: 2,\n fill: true,\n tension: 0.4,\n pointBackgroundColor: 'rgb(59, 130, 246)',\n pointBorderColor: '#fff',\n pointBorderWidth: 2,\n pointRadius: 3,\n pointHoverRadius: 5,\n },\n ],\n };\n\n const options = {\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n legend: {\n display: false,\n },\n title: {\n display: false,\n },\n tooltip: {\n backgroundColor: 'rgba(0, 0, 0, 0.8)',\n titleColor: '#fff',\n bodyColor: '#fff',\n borderColor: 'rgba(59, 130, 246, 0.5)',\n borderWidth: 1,\n cornerRadius: 8,\n displayColors: false,\n callbacks: {\n title: (context: any) => `Date: ${context[0].label}`,\n label: (context: any) => `Users: ${context.parsed.y.toLocaleString()}`,\n },\n },\n },\n scales: {\n x: {\n grid: {\n display: false,\n },\n ticks: {\n color: '#6b7280',\n font: {\n size: 11,\n },\n },\n },\n y: {\n grid: {\n color: 'rgba(0, 0, 0, 0.05)',\n },\n ticks: {\n color: '#6b7280',\n font: {\n size: 11,\n },\n callback: (value: any) => value.toLocaleString(),\n },\n },\n },\n elements: {\n point: {\n hoverBackgroundColor: 'rgb(59, 130, 246)',\n },\n },\n };\n\n return (\n <div className=\"bg-white rounded-lg border border-gray-100 p-4 shadow-sm\">\n <h3 className=\"text-base font-semibold text-gray-800 mb-3\">{title}</h3>\n <div className=\"h-48\">\n <Line data={chartData} options={options} />\n </div>\n </div>\n );\n} ","\"use client\";\n\nimport { MapPin, Users } from \"lucide-react\";\n\ninterface GeographicData {\n country: string;\n sessions: number;\n}\n\ninterface GeographicMapProps {\n data: GeographicData[];\n title?: string;\n}\n\nexport default function GeographicMap({ data, title = \"Geographic Distribution\" }: GeographicMapProps) {\n const totalSessions = data.reduce((sum, item) => sum + item.sessions, 0);\n \n return (\n <div className=\"bg-white rounded-lg border border-gray-100 p-4 shadow-sm\">\n <div className=\"flex items-center mb-4\">\n <MapPin className=\"w-4 h-4 text-gray-600 mr-2\" />\n <h3 className=\"text-base font-semibold text-gray-800\">{title}</h3>\n </div>\n \n <div className=\"space-y-3\">\n {data.map((item, index) => {\n const percentage = totalSessions > 0 ? (item.sessions / totalSessions) * 100 : 0;\n \n return (\n <div key={index} className=\"flex items-center justify-between p-3 bg-gray-50 rounded-lg hover:bg-gray-100 transition-colors duration-200\">\n <div className=\"flex items-center flex-1\">\n <div className=\"w-6 h-6 bg-gray-200 rounded-full flex items-center justify-center mr-2\">\n <Users className=\"w-3 h-3 text-gray-600\" />\n </div>\n <div className=\"flex-1\">\n <p className=\"text-xs font-medium text-gray-700\">{item.country}</p>\n <div className=\"flex items-center mt-1\">\n <div className=\"flex-1 bg-gray-200 rounded-full h-1.5 mr-2\">\n <div \n className=\"bg-gray-600 h-1.5 rounded-full transition-all duration-300\"\n style={{ width: `${percentage}%` }}\n ></div>\n </div>\n <span className=\"text-xs text-gray-500\">{percentage.toFixed(1)}%</span>\n </div>\n </div>\n </div>\n <div className=\"text-right\">\n <p className=\"text-xs font-semibold text-gray-900\">{item.sessions.toLocaleString()}</p>\n <p className=\"text-xs text-gray-500\">sessions</p>\n </div>\n </div>\n );\n })}\n </div>\n \n <div className=\"mt-4 pt-3 border-t border-gray-200\">\n <div className=\"flex items-center justify-between text-xs\">\n <span className=\"text-gray-600\">Total Sessions</span>\n <span className=\"font-semibold text-gray-900\">{totalSessions.toLocaleString()}</span>\n </div>\n </div>\n </div>\n );\n} ","interface AnalyticsCardProps {\n title: string;\n value: string | number;\n subtitle: string;\n icon?: React.ReactNode;\n trend?: {\n value: number;\n isPositive: boolean;\n };\n}\n\nexport default function AnalyticsCard({ title, value, subtitle, icon, trend }: AnalyticsCardProps) {\n return (\n <div className=\"bg-white rounded border border-gray-200 p-2.5 shadow-sm\">\n <div className=\"flex items-center justify-between mb-1.5\">\n <p className=\"text-xs font-medium text-gray-600\">{title}</p>\n <div className=\"p-1 bg-gray-200 rounded\">\n {icon}\n </div>\n </div>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center\">\n <p className=\"text-base font-semibold text-gray-900\">{value}</p>\n {trend && (\n <div className={`flex items-center ml-1 ${trend.isPositive ? 'text-green-500' : 'text-red-500'}`}>\n <span className=\"text-xs\">{trend.isPositive ? '↗' : '↘'}</span>\n <span className=\"text-xs ml-0.5\">{trend.value}%</span>\n </div>\n )}\n </div>\n <p className=\"text-xs text-gray-500\">{subtitle}</p>\n </div>\n </div>\n );\n} ","'use client';\n\nimport { usePathname } from 'next/navigation';\nimport { useAnalytics } from '../../hooks/use-analytics';\n\nexport default function AnalyticsExclusion() {\n const pathname = usePathname();\n const { isAdminRoute, shouldTrack } = useAnalytics(pathname);\n\n if (!isAdminRoute) return null;\n\n return (\n <div className=\"fixed bottom-4 right-4 bg-green-100 border border-green-400 text-green-700 px-4 py-2 rounded text-sm z-50\">\n <strong>Analytics Disabled:</strong> Admin pages are excluded from tracking\n </div>\n );\n} ","import { useEffect } from 'react';\n\n/**\n * Call from app with pathname from usePathname() (next/navigation).\n * Disables tracking on admin routes when pathname starts with /admin.\n */\nexport function useAnalytics(pathname: string | null): { isAdminRoute: boolean; shouldTrack: boolean } {\n const isAdminRoute = pathname != null && pathname.startsWith('/admin');\n\n useEffect(() => {\n if (isAdminRoute && typeof window !== 'undefined') {\n if (typeof (window as unknown as { gtag?: () => void }).gtag === 'function') {\n (window as unknown as { gtag: () => void }).gtag = () => {};\n }\n if (Array.isArray((window as unknown as { dataLayer?: unknown[] }).dataLayer)) {\n (window as unknown as { dataLayer: unknown[] }).dataLayer = [];\n }\n }\n }, [isAdminRoute]);\n\n return { isAdminRoute, shouldTrack: !isAdminRoute };\n}\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport { Input } from \"@/components/ui/input\";\nimport { Textarea } from \"@/components/ui/textarea\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { Label } from \"@/components/ui/label\";\nimport type { PropDefinition, ComponentMeta } from \"../../theme/types\";\n\ninterface EntityOption {\n id: number | string;\n [key: string]: any;\n}\n\nfunction EntitySelect({\n prop,\n value,\n onChange,\n}: {\n prop: PropDefinition;\n value: string;\n onChange: (val: string) => void;\n}) {\n const [options, setOptions] = useState<EntityOption[]>([]);\n\n useEffect(() => {\n if (!prop.entity) return;\n fetch(`/api/${prop.entity}`)\n .then((r) => (r.ok ? r.json() : { data: [] }))\n .then((res) => setOptions(res.data || res || []))\n .catch(() => {});\n }, [prop.entity]);\n\n const displayField = prop.displayField || \"name\";\n\n return (\n <select\n className=\"h-7 w-full rounded border border-input bg-background px-2 text-xs\"\n value={value || \"\"}\n onChange={(e) => onChange(e.target.value)}\n >\n <option value=\"\">Select...</option>\n {options.map((opt) => (\n <option key={opt.id} value={opt.slug || opt.id}>\n {opt[displayField] || opt.id}\n </option>\n ))}\n </select>\n );\n}\n\nfunction SelectInput({\n prop,\n value,\n onChange,\n}: {\n prop: PropDefinition;\n value: string;\n onChange: (val: string) => void;\n}) {\n return (\n <select\n className=\"h-7 w-full rounded border border-input bg-background px-2 text-xs\"\n value={value || \"\"}\n onChange={(e) => onChange(e.target.value)}\n >\n <option value=\"\">Select...</option>\n {prop.options?.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n );\n}\n\ninterface PropFieldProps {\n prop: PropDefinition;\n value: any;\n onChange: (val: any) => void;\n}\n\nconst compactInputCls = \"h-7 text-xs rounded border border-input bg-background px-2\";\n\nfunction PropField({ prop, value, onChange }: PropFieldProps) {\n switch (prop.type) {\n case \"text\":\n case \"url\":\n return (\n <Input\n type={prop.type === \"url\" ? \"url\" : \"text\"}\n value={value || \"\"}\n onChange={(e) => onChange(e.target.value)}\n placeholder={prop.label}\n className={compactInputCls}\n />\n );\n\n case \"number\":\n return (\n <Input\n type=\"number\"\n value={value ?? \"\"}\n onChange={(e) => onChange(Number(e.target.value))}\n placeholder={prop.label}\n className={compactInputCls}\n />\n );\n\n case \"textarea\":\n return (\n <Textarea\n value={value || \"\"}\n onChange={(e) => onChange(e.target.value)}\n placeholder={prop.label}\n rows={2}\n className=\"text-xs rounded border border-input px-2 py-1.5 min-h-[52px]\"\n />\n );\n\n case \"boolean\":\n return (\n <Switch\n checked={!!value}\n onCheckedChange={(checked) => onChange(checked)}\n className=\"scale-75 origin-left\"\n />\n );\n\n case \"color\":\n return (\n <div className=\"flex items-center gap-1.5\">\n <input\n type=\"color\"\n value={value || \"#000000\"}\n onChange={(e) => onChange(e.target.value)}\n className=\"h-7 w-9 rounded border border-input cursor-pointer shrink-0\"\n />\n <Input value={value || \"\"} onChange={(e) => onChange(e.target.value)} placeholder=\"#000000\" className={`${compactInputCls} flex-1 min-w-0`} />\n </div>\n );\n\n case \"image\":\n return (\n <div className=\"space-y-1.5\">\n {value && <img src={value} alt=\"\" className=\"h-14 w-14 rounded object-cover border border-input\" />}\n <Input value={value || \"\"} onChange={(e) => onChange(e.target.value)} placeholder=\"URL\" className={compactInputCls} />\n </div>\n );\n\n case \"richtext\":\n return (\n <Textarea\n value={value || \"\"}\n onChange={(e) => onChange(e.target.value)}\n placeholder={prop.label}\n rows={4}\n className=\"text-xs rounded border border-input px-2 py-1.5 min-h-[80px]\"\n />\n );\n\n case \"select\":\n return <SelectInput prop={prop} value={value} onChange={onChange} />;\n\n case \"entity\":\n return <EntitySelect prop={prop} value={value} onChange={onChange} />;\n\n default:\n return (\n <Input value={value || \"\"} onChange={(e) => onChange(e.target.value)} placeholder={prop.label} className={compactInputCls} />\n );\n }\n}\n\ninterface ComponentSettingsProps {\n meta: ComponentMeta;\n values: Record<string, any>;\n onChange: (name: string, value: any) => void;\n}\n\nexport default function ComponentSettings({\n meta,\n values,\n onChange,\n}: ComponentSettingsProps) {\n if (!meta.props || meta.props.length === 0) {\n return <p className=\"text-[11px] text-gray-500 py-2\">No configurable properties.</p>;\n }\n\n return (\n <div className=\"space-y-3\">\n {meta.props.map((prop) => (\n <div key={prop.name} className=\"flex flex-col gap-1\">\n <Label className=\"text-[11px] font-medium text-gray-500\">\n {prop.label}\n {prop.required && <span className=\"text-red-500 ml-0.5\">*</span>}\n </Label>\n <PropField prop={prop} value={values[prop.name]} onChange={(val) => onChange(prop.name, val)} />\n </div>\n ))}\n </div>\n );\n}\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport { Input } from \"@/components/ui/input\";\nimport { Button } from \"@/components/ui/button\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { Label } from \"@/components/ui/label\";\nimport { Plus, Trash2, GripVertical, ChevronDown, ChevronRight, ArrowRight, ArrowLeft } from \"lucide-react\";\nimport type { NavItem, NavbarConfig } from \"../../theme/types\";\n\nfunction generateId() {\n return `nav_${Date.now()}_${Math.random().toString(36).slice(2, 7)}`;\n}\n\ninterface NavItemEditorProps {\n item: NavItem;\n depth: number;\n onUpdate: (id: string, updates: Partial<NavItem>) => void;\n onRemove: (id: string) => void;\n onIndent: (id: string) => void;\n onOutdent: (id: string) => void;\n onMoveUp: (id: string) => void;\n onMoveDown: (id: string) => void;\n canIndent: boolean;\n canOutdent: boolean;\n canMoveUp: boolean;\n canMoveDown: boolean;\n}\n\nfunction NavItemEditor({\n item,\n depth,\n onUpdate,\n onRemove,\n onIndent,\n onOutdent,\n onMoveUp,\n onMoveDown,\n canIndent,\n canOutdent,\n canMoveUp,\n canMoveDown,\n}: NavItemEditorProps) {\n const [expanded, setExpanded] = useState(false);\n const [pages, setPages] = useState<{ id: number; title: string; slug: string }[]>([]);\n\n useEffect(() => {\n if (!expanded) return;\n fetch(\"/api/pages\")\n .then((r) => (r.ok ? r.json() : []))\n .then((data: unknown) => {\n const res = data as { data?: unknown[] } | unknown[];\n const list = Array.isArray(res) ? res : (res && typeof res === 'object' && 'data' in res ? (res as { data: unknown[] }).data : []) ?? [];\n setPages((list as { id: number; title?: string; slug?: string }[]).map((p) => ({ id: p.id, title: p.title || \"\", slug: p.slug || \"\" })));\n })\n .catch(() => {});\n }, [expanded]);\n\n const handleLinkPage = (pageId: string) => {\n if (!pageId) {\n onUpdate(item.id, { pageId: undefined, url: item.url || \"\" });\n return;\n }\n const id = Number(pageId);\n const p = pages.find((x) => x.id === id);\n if (p) onUpdate(item.id, { pageId: id, url: `/${p.slug}`, label: item.label || p.title });\n };\n\n return (\n <div>\n <div\n className=\"flex items-center gap-2 p-2 bg-white border rounded-md hover:bg-gray-50\"\n style={{ marginLeft: depth * 24 }}\n >\n <GripVertical className=\"h-4 w-4 text-gray-400 flex-shrink-0 cursor-grab\" />\n <button\n onClick={() => setExpanded(!expanded)}\n className=\"flex-shrink-0 p-0.5\"\n >\n {expanded ? (\n <ChevronDown className=\"h-3.5 w-3.5 text-gray-500\" />\n ) : (\n <ChevronRight className=\"h-3.5 w-3.5 text-gray-500\" />\n )}\n </button>\n <span className=\"text-sm font-medium flex-1 truncate\">{item.label || \"Untitled\"}</span>\n <span className=\"text-xs text-gray-400 truncate max-w-[120px]\">{item.url}</span>\n <div className=\"flex items-center gap-0.5\">\n <Button variant=\"ghost\" size=\"sm\" className=\"h-6 w-6 p-0\" onClick={() => onMoveUp(item.id)} disabled={!canMoveUp}>↑</Button>\n <Button variant=\"ghost\" size=\"sm\" className=\"h-6 w-6 p-0\" onClick={() => onMoveDown(item.id)} disabled={!canMoveDown}>↓</Button>\n <Button variant=\"ghost\" size=\"sm\" className=\"h-6 w-6 p-0\" onClick={() => onOutdent(item.id)} disabled={!canOutdent} title=\"Move left\">\n <ArrowLeft className=\"h-3 w-3\" />\n </Button>\n <Button variant=\"ghost\" size=\"sm\" className=\"h-6 w-6 p-0\" onClick={() => onIndent(item.id)} disabled={!canIndent} title=\"Nest under above item\">\n <ArrowRight className=\"h-3 w-3\" />\n </Button>\n <Button variant=\"ghost\" size=\"sm\" className=\"h-6 w-6 p-0 text-red-500 hover:text-red-700\" onClick={() => onRemove(item.id)}>\n <Trash2 className=\"h-3.5 w-3.5\" />\n </Button>\n </div>\n </div>\n {expanded && (\n <div className=\"border border-t-0 rounded-b-md p-3 bg-gray-50 space-y-3\" style={{ marginLeft: depth * 24 }}>\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs\">Label</Label>\n <Input\n value={item.label}\n onChange={(e) => onUpdate(item.id, { label: e.target.value })}\n placeholder=\"Menu item label\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs\">Link to page</Label>\n <select\n value={item.pageId ?? \"\"}\n onChange={(e) => handleLinkPage(e.target.value)}\n className=\"h-9 w-full rounded border border-input bg-background px-2 text-sm\"\n >\n <option value=\"\">— Custom / external —</option>\n {pages.map((p) => (\n <option key={p.id} value={p.id}>{p.title} (/{p.slug})</option>\n ))}\n </select>\n </div>\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs\">URL</Label>\n <Input\n value={item.url}\n onChange={(e) => onUpdate(item.id, { url: e.target.value })}\n placeholder=\"/page-slug or https://...\"\n />\n </div>\n <div className=\"flex items-center gap-2\">\n <Switch\n checked={item.openInNewTab || false}\n onCheckedChange={(checked) => onUpdate(item.id, { openInNewTab: checked })}\n />\n <Label className=\"text-xs\">Open in new tab</Label>\n </div>\n </div>\n )}\n {item.children?.map((child, ci) => (\n <NavItemEditor\n key={child.id}\n item={child}\n depth={depth + 1}\n onUpdate={onUpdate}\n onRemove={onRemove}\n onIndent={onIndent}\n onOutdent={onOutdent}\n onMoveUp={onMoveUp}\n onMoveDown={onMoveDown}\n canIndent={ci > 0}\n canOutdent={true}\n canMoveUp={ci > 0}\n canMoveDown={ci < (item.children?.length || 0) - 1}\n />\n ))}\n </div>\n );\n}\n\nfunction flattenWithDepth(\n items: NavItem[],\n depth = 0\n): { item: NavItem; depth: number; parentId: string | null; index: number }[] {\n const result: { item: NavItem; depth: number; parentId: string | null; index: number }[] = [];\n items.forEach((item, index) => {\n result.push({ item, depth, parentId: null, index });\n if (item.children) {\n item.children.forEach((child, ci) => {\n result.push({ item: child, depth: depth + 1, parentId: item.id, index: ci });\n if (child.children) {\n child.children.forEach((gc, gci) => {\n result.push({ item: gc, depth: depth + 2, parentId: child.id, index: gci });\n });\n }\n });\n }\n });\n return result;\n}\n\nfunction updateItemInTree(items: NavItem[], id: string, updates: Partial<NavItem>): NavItem[] {\n return items.map((item) => {\n if (item.id === id) return { ...item, ...updates };\n if (item.children) {\n return { ...item, children: updateItemInTree(item.children, id, updates) };\n }\n return item;\n });\n}\n\nfunction removeItemFromTree(items: NavItem[], id: string): NavItem[] {\n return items\n .filter((item) => item.id !== id)\n .map((item) => {\n if (item.children) {\n return { ...item, children: removeItemFromTree(item.children, id) };\n }\n return item;\n });\n}\n\nfunction moveItem(items: NavItem[], id: string, direction: \"up\" | \"down\"): NavItem[] {\n const index = items.findIndex((i) => i.id === id);\n if (index === -1) {\n return items.map((item) => {\n if (item.children) {\n return { ...item, children: moveItem(item.children, id, direction) };\n }\n return item;\n });\n }\n const newIndex = direction === \"up\" ? index - 1 : index + 1;\n if (newIndex < 0 || newIndex >= items.length) return items;\n const result = [...items];\n [result[index], result[newIndex]] = [result[newIndex], result[index]];\n return result;\n}\n\nfunction findItemAndParent(\n items: NavItem[],\n id: string,\n parent: NavItem[] | null = null,\n parentItem: NavItem | null = null\n): { item: NavItem; siblings: NavItem[]; parentItem: NavItem | null; index: number } | null {\n for (let i = 0; i < items.length; i++) {\n if (items[i].id === id) {\n return { item: items[i], siblings: items, parentItem, index: i };\n }\n if (items[i].children) {\n const found = findItemAndParent(items[i].children!, id, items, items[i]);\n if (found) return found;\n }\n }\n return null;\n}\n\ninterface NavbarEditorProps {\n config: NavbarConfig;\n onChange: (config: NavbarConfig) => void;\n}\n\nexport default function NavbarEditor({ config, onChange }: NavbarEditorProps) {\n const items = config.items || [];\n\n const setItems = (newItems: NavItem[]) => {\n onChange({ ...config, items: newItems });\n };\n\n const addItem = () => {\n setItems([\n ...items,\n { id: generateId(), label: \"New Item\", url: \"/\", children: [] },\n ]);\n };\n\n const handleUpdate = (id: string, updates: Partial<NavItem>) => {\n setItems(updateItemInTree(items, id, updates));\n };\n\n const handleRemove = (id: string) => {\n setItems(removeItemFromTree(items, id));\n };\n\n const handleMoveUp = (id: string) => setItems(moveItem(items, id, \"up\"));\n const handleMoveDown = (id: string) => setItems(moveItem(items, id, \"down\"));\n\n const handleIndent = (id: string) => {\n const found = findItemAndParent(items, id);\n if (!found || found.index === 0) return;\n const prevSibling = found.siblings[found.index - 1];\n const item = found.item;\n const newSiblings = found.siblings.filter((_, i) => i !== found.index);\n const updatedPrev = {\n ...prevSibling,\n children: [...(prevSibling.children || []), item],\n };\n const result = newSiblings.map((s) =>\n s.id === prevSibling.id ? updatedPrev : s\n );\n if (found.parentItem) {\n setItems(updateItemInTree(items, found.parentItem.id, { children: result }));\n } else {\n setItems(result);\n }\n };\n\n const handleOutdent = (id: string) => {\n const found = findItemAndParent(items, id);\n if (!found || !found.parentItem) return;\n const parentFound = findItemAndParent(items, found.parentItem.id);\n if (!parentFound) return;\n\n const item = found.item;\n const newParentChildren = found.parentItem.children!.filter((c) => c.id !== id);\n const updatedParent = { ...found.parentItem, children: newParentChildren };\n\n const parentIndex = parentFound.index;\n const newSiblings = [...parentFound.siblings];\n newSiblings[parentIndex] = updatedParent;\n newSiblings.splice(parentIndex + 1, 0, item);\n\n if (parentFound.parentItem) {\n setItems(updateItemInTree(items, parentFound.parentItem.id, { children: newSiblings }));\n } else {\n setItems(newSiblings);\n }\n };\n\n return (\n <div className=\"space-y-6\">\n <div className=\"space-y-3\">\n <Label className=\"text-sm font-medium\">Logo</Label>\n <div className=\"flex items-center gap-3\">\n {config.logo && (\n <img src={config.logo} alt=\"Logo\" className=\"h-10 rounded border object-contain\" />\n )}\n <Input\n value={config.logo || \"\"}\n onChange={(e) => onChange({ ...config, logo: e.target.value })}\n placeholder=\"Logo image URL\"\n />\n </div>\n </div>\n\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <Label className=\"text-sm font-medium\">Menu Items</Label>\n <Button variant=\"outline\" size=\"sm\" onClick={addItem}>\n <Plus className=\"h-3.5 w-3.5 mr-1\" /> Add Item\n </Button>\n </div>\n {items.length === 0 ? (\n <p className=\"text-sm text-gray-400 text-center py-4\">No menu items yet.</p>\n ) : (\n <div className=\"space-y-1\">\n {items.map((item, index) => (\n <NavItemEditor\n key={item.id}\n item={item}\n depth={0}\n onUpdate={handleUpdate}\n onRemove={handleRemove}\n onIndent={handleIndent}\n onOutdent={handleOutdent}\n onMoveUp={handleMoveUp}\n onMoveDown={handleMoveDown}\n canIndent={index > 0}\n canOutdent={false}\n canMoveUp={index > 0}\n canMoveDown={index < items.length - 1}\n />\n ))}\n </div>\n )}\n </div>\n\n </div>\n );\n}\n","\"use client\";\n\nimport Link from \"next/link\";\nimport { useState, useEffect } from \"react\";\nimport { signIn, getSession } from \"next-auth/react\";\nimport { useRouter } from \"next/navigation\";\nimport AuthPageLayout from \"../../components/Admin/AuthPageLayout\";\n\nconst SigninPage = () => {\n const [email, setEmail] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const [error, setError] = useState(\"\");\n const [loading, setLoading] = useState(false);\n const router = useRouter();\n\n useEffect(() => {\n // Check if user is already signed in\n getSession().then((session) => {\n if (session) {\n router.push(\"/admin/dashboard\");\n }\n });\n }, [router]);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setLoading(true);\n setError(\"\");\n\n try {\n const result = await signIn(\"credentials\", {\n email,\n password,\n redirect: false,\n });\n\n if (result?.error) {\n setError(\"Invalid email or password\");\n } else {\n router.push(\"/admin/dashboard\");\n }\n } catch (error) {\n setError(\"An error occurred. Please try again.\");\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <AuthPageLayout>\n <div className=\"w-full shadow-md rounded-lg bg-white dark:bg-dark px-4 py-6 sm:px-6 sm:py-8\">\n <h3 className=\"mb-1 text-center text-xl font-bold text-black dark:text-white sm:text-2xl\">Sign in</h3>\n <p className=\"mb-6 text-center text-sm text-body-color\">Enter your credentials</p>\n\n {error && (\n <div className=\"mb-4 rounded-md bg-red-50 p-3 text-sm text-red-600 dark:bg-red-900/20 dark:text-red-400\">\n {error}\n </div>\n )}\n\n <form onSubmit={handleSubmit}>\n <div className=\"mb-4\">\n <label htmlFor=\"email\" className=\"mb-1.5 block text-sm text-dark dark:text-white\">Email</label>\n <input\n type=\"email\"\n name=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"Enter email\"\n required\n className=\"border border-gray-300 w-full rounded bg-gray-50 px-3 py-2 text-sm text-gray-900 outline-none focus:border-gray-500 focus:ring-1 focus:ring-gray-500 dark:bg-dark dark:border-gray-600\"\n />\n </div>\n <div className=\"mb-4\">\n <label htmlFor=\"password\" className=\"mb-1.5 block text-sm text-dark dark:text-white\">Password</label>\n <input\n type=\"password\"\n name=\"password\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"Enter password\"\n required\n className=\"border border-gray-300 w-full rounded bg-gray-50 px-3 py-2 text-sm text-gray-900 outline-none focus:border-gray-500 focus:ring-1 focus:ring-gray-500 dark:bg-dark dark:border-gray-600\"\n />\n </div>\n <div className=\"mb-4 flex items-center justify-between\">\n <label className=\"flex cursor-pointer items-center gap-2 text-sm text-body-color\">\n <input type=\"checkbox\" className=\"h-4 w-4 rounded border-gray-300\" />\n Keep signed in\n </label>\n <Link href=\"/admin/forgot-password\" className=\"text-xs font-medium text-gray-600 hover:underline\">\n Forgot password?\n </Link>\n </div>\n <div>\n <button\n type=\"submit\"\n disabled={loading}\n className=\"w-full rounded bg-gray-900 px-4 py-2 text-sm font-medium text-white hover:bg-gray-800 disabled:opacity-50 disabled:cursor-not-allowed dark:bg-gray-800 dark:hover:bg-gray-700\"\n >\n {loading ? \"Signing in...\" : \"Sign in\"}\n </button>\n </div>\n </form>\n </div>\n </AuthPageLayout>\n );\n};\n\nexport default SigninPage;\n","\"use client\";\n\nimport Image from \"next/image\";\nimport AuthFooter from \"./AuthFooter\";\n\nconst ADMIN_LOGO_SRC = process.env.NEXT_PUBLIC_ADMIN_LOGO_URL || \"/images/logo/logo.png\";\n\nexport default function AuthPageLayout({ children }: { children: React.ReactNode }) {\n return (\n <div className=\"min-h-screen flex flex-col bg-gray-50 dark:bg-dark\">\n <div className=\"flex-1 flex items-center justify-center px-4 py-6\">\n <div className=\"w-full max-w-[400px] flex flex-col items-center gap-6\">\n <div className=\"flex justify-center\">\n <Image\n src={ADMIN_LOGO_SRC}\n alt=\"Admin\"\n width={200}\n height={60}\n className=\"max-h-14 w-auto object-contain sm:max-h-16\"\n unoptimized={ADMIN_LOGO_SRC.startsWith(\"data:\")}\n />\n </div>\n {children}\n </div>\n </div>\n <AuthFooter />\n </div>\n );\n}\n","\"use client\";\n\nimport Image from \"next/image\";\nimport { INFURO_FAVICON_BASE64 } from \"@/lib/infuro-favicon\";\nimport { CMS_VERSION } from \"@/lib/cms-version\";\n\nconst INFURO_FOOTER_LABEL = \"Infuro Tech Solutions LLP\";\nconst INFURO_FOOTER_URL = \"https://infurotech.com\";\n\nexport default function AuthFooter() {\n return (\n <footer className=\"mt-auto flex flex-col items-center gap-1 py-6\">\n <a\n href={INFURO_FOOTER_URL}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center gap-2 text-gray-500 hover:text-gray-700 transition-colors text-sm\"\n >\n <Image src={INFURO_FAVICON_BASE64} alt={INFURO_FOOTER_LABEL} width={24} height={24} className=\"rounded object-contain\" unoptimized />\n <span className=\"font-medium\">{INFURO_FOOTER_LABEL}</span>\n </a>\n <span className=\"text-xs text-gray-400\">v{CMS_VERSION}</span>\n </footer>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport Link from \"next/link\";\nimport { Input } from \"../../components/ui/input\";\nimport { Button } from \"../../components/ui/button\";\nimport { Label } from \"../../components/ui/label\";\nimport AuthPageLayout from \"../../components/Admin/AuthPageLayout\";\n\nexport default function ForgotPasswordPage() {\n const [email, setEmail] = useState(\"\");\n const [loading, setLoading] = useState(false);\n const [message, setMessage] = useState(\"\");\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n if (!email.trim()) return;\n setLoading(true);\n setMessage(\"\");\n try {\n const res = await fetch(\"/api/users/forgot-password\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ email: email.trim() }),\n });\n const data = await res.json();\n if (res.ok) {\n setMessage(data.message || \"If an account exists with this email, you will receive a reset link shortly.\");\n } else {\n setMessage(data.error || \"Something went wrong.\");\n }\n } catch {\n setMessage(\"Something went wrong. Please try again.\");\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <AuthPageLayout>\n <div className=\"w-full space-y-4 p-5 sm:p-6 bg-white dark:bg-[#2C303B] rounded-lg shadow-md\">\n <div className=\"text-center\">\n <h2 className=\"text-xl font-bold text-gray-900 dark:text-white\">Forgot password</h2>\n <p className=\"mt-1 text-sm text-body-color\">Enter your email for a reset link.</p>\n </div>\n\n <form onSubmit={handleSubmit} className=\"space-y-3\">\n <div>\n <Label htmlFor=\"email\" className=\"text-sm\">Email</Label>\n <Input id=\"email\" type=\"email\" required value={email} onChange={(e) => setEmail(e.target.value)} placeholder=\"you@example.com\" className=\"mt-1 h-9 text-sm\" />\n </div>\n\n {message && (\n <div className={`p-2.5 rounded-md text-sm ${message.includes(\"receive\") ? \"bg-green-50 dark:bg-green-900/20 text-green-700 dark:text-green-400\" : \"bg-red-50 dark:bg-red-900/20 text-red-700 dark:text-red-400\"}`}>\n {message}\n </div>\n )}\n\n <Button type=\"submit\" disabled={loading} className=\"w-full h-9 text-sm\">\n {loading ? \"Sending...\" : \"Send reset link\"}\n </Button>\n </form>\n\n <p className=\"text-center text-xs text-body-color\">\n <Link href=\"/admin/signin\" className=\"text-gray-600 hover:underline\">Back to sign in</Link>\n </p>\n </div>\n </AuthPageLayout>\n );\n}\n","\"use client\";\n\nimport { useState, useEffect, Suspense } from \"react\";\nimport { useSearchParams } from \"next/navigation\";\nimport Link from \"next/link\";\nimport { Input } from \"../../components/ui/input\";\nimport { Button } from \"../../components/ui/button\";\nimport { Label } from \"../../components/ui/label\";\nimport AuthPageLayout from \"../../components/Admin/AuthPageLayout\";\n\nfunction ResetPasswordPageContent() {\n const searchParams = useSearchParams();\n const token = searchParams.get(\"token\");\n const [formData, setFormData] = useState({ password: \"\", confirmPassword: \"\" });\n const [loading, setLoading] = useState(false);\n const [message, setMessage] = useState(\"\");\n\n useEffect(() => {\n if (!token) setMessage(\"Invalid reset link. Token is missing.\");\n }, [token]);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n if (formData.password !== formData.confirmPassword) {\n setMessage(\"Passwords do not match\");\n return;\n }\n if (formData.password.length < 6) {\n setMessage(\"Password must be at least 6 characters\");\n return;\n }\n setLoading(true);\n setMessage(\"\");\n try {\n const res = await fetch(\"/api/users/set-password\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ token, newPassword: formData.password }),\n });\n const data = await res.json();\n if (res.ok) {\n setMessage(data.message || \"Password updated. You can now sign in.\");\n setFormData({ password: \"\", confirmPassword: \"\" });\n } else {\n setMessage(data.error || \"Failed to reset password\");\n }\n } catch {\n setMessage(\"Something went wrong. Please try again.\");\n } finally {\n setLoading(false);\n }\n };\n\n if (!token) {\n return (\n <AuthPageLayout>\n <div className=\"w-full space-y-4 p-5 sm:p-6 bg-white dark:bg-[#2C303B] rounded-lg shadow-md text-center\">\n <h2 className=\"text-xl font-bold text-gray-900 dark:text-white\">Invalid reset link</h2>\n <p className=\"text-sm text-body-color\">{message}</p>\n <Link href=\"/admin/forgot-password\" className=\"text-sm text-gray-600 hover:underline\">Request a new link</Link>\n </div>\n </AuthPageLayout>\n );\n }\n\n return (\n <AuthPageLayout>\n <div className=\"w-full space-y-4 p-5 sm:p-6 bg-white dark:bg-[#2C303B] rounded-lg shadow-md\">\n <div className=\"text-center\">\n <h2 className=\"text-xl font-bold text-gray-900 dark:text-white\">Set new password</h2>\n <p className=\"mt-1 text-sm text-body-color\">Enter your new password.</p>\n </div>\n\n <form onSubmit={handleSubmit} className=\"space-y-3\">\n <div>\n <Label htmlFor=\"password\" className=\"text-sm\">New password</Label>\n <Input id=\"password\" type=\"password\" required minLength={6} value={formData.password} onChange={(e) => setFormData({ ...formData, password: e.target.value })} className=\"mt-1 h-9 text-sm\" />\n </div>\n <div>\n <Label htmlFor=\"confirmPassword\" className=\"text-sm\">Confirm password</Label>\n <Input id=\"confirmPassword\" type=\"password\" required minLength={6} value={formData.confirmPassword} onChange={(e) => setFormData({ ...formData, confirmPassword: e.target.value })} className=\"mt-1 h-9 text-sm\" />\n </div>\n\n {message && (\n <div className={`p-2.5 rounded-md text-sm ${message.includes(\"successfully\") || message.includes(\"now sign in\") ? \"bg-green-50 dark:bg-green-900/20 text-green-700 dark:text-green-400\" : \"bg-red-50 dark:bg-red-900/20 text-red-700 dark:text-red-400\"}`}>\n {message}\n </div>\n )}\n\n <Button type=\"submit\" disabled={loading} className=\"w-full h-9 text-sm\">\n {loading ? \"Updating...\" : \"Update password\"}\n </Button>\n </form>\n\n <p className=\"text-center text-xs text-body-color\">\n <Link href=\"/admin/signin\" className=\"text-gray-600 hover:underline\">Back to sign in</Link>\n </p>\n </div>\n </AuthPageLayout>\n );\n}\n\nexport default function ResetPasswordPage() {\n return (\n <Suspense fallback={\n <div className=\"min-h-screen flex items-center justify-center bg-gray-50 dark:bg-dark\">\n <div className=\"max-w-[400px] w-full p-6 text-center\">\n <div className=\"animate-spin rounded-full h-6 w-6 border-2 border-gray-300 border-t-gray-600 mx-auto\"></div>\n <p className=\"mt-3 text-sm text-body-color\">Loading...</p>\n </div>\n </div>\n }>\n <ResetPasswordPageContent />\n </Suspense>\n );\n}\n","\"use client\";\n\nimport React, { useState, useEffect, Suspense } from \"react\";\nimport { useSearchParams } from \"next/navigation\";\nimport { Input } from \"../../components/ui/input\";\nimport { Button } from \"../../components/ui/button\";\nimport { Label } from \"../../components/ui/label\";\nimport AuthPageLayout from \"../../components/Admin/AuthPageLayout\";\n\nfunction InvitePageContent() {\n const searchParams = useSearchParams();\n const token = searchParams.get(\"token\");\n const [formData, setFormData] = useState({\n password: \"\",\n confirmPassword: \"\"\n });\n const [loading, setLoading] = useState(false);\n const [message, setMessage] = useState(\"\");\n\n useEffect(() => {\n if (!token) {\n setMessage(\"Invalid invite link. Token is missing.\");\n }\n }, [token]);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n \n if (formData.password !== formData.confirmPassword) {\n setMessage(\"Passwords do not match\");\n return;\n }\n\n if (formData.password.length < 6) {\n setMessage(\"Password must be at least 6 characters long\");\n return;\n }\n\n setLoading(true);\n setMessage(\"\");\n\n try {\n const res = await fetch(\"/api/users/invite\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n token,\n password: formData.password\n }),\n });\n\n const result = await res.json();\n\n if (res.ok) {\n setMessage(\"Account activated successfully! You can now log in.\");\n setFormData({ password: \"\", confirmPassword: \"\" });\n } else {\n setMessage(result.error || \"Failed to activate account\");\n }\n } catch (error) {\n setMessage(\"An error occurred. Please try again.\");\n } finally {\n setLoading(false);\n }\n };\n\n if (!token) {\n return (\n <AuthPageLayout>\n <div className=\"w-full space-y-4 p-5 sm:p-6 bg-white rounded-lg shadow-md text-center\">\n <h2 className=\"text-xl font-bold text-gray-900\">Invalid invite</h2>\n <p className=\"text-sm text-gray-600\">{message}</p>\n </div>\n </AuthPageLayout>\n );\n }\n\n return (\n <AuthPageLayout>\n <div className=\"w-full space-y-4 p-5 sm:p-6 bg-white rounded-lg shadow-md\">\n <div className=\"text-center\">\n <h2 className=\"text-xl font-bold text-gray-900\">Set your password</h2>\n <p className=\"mt-1 text-sm text-gray-600\">Set a password to activate your account.</p>\n </div>\n\n <form onSubmit={handleSubmit} className=\"space-y-3\">\n <div>\n <Label htmlFor=\"password\" className=\"text-sm\">Password</Label>\n <Input id=\"password\" type=\"password\" required value={formData.password} onChange={(e) => setFormData({ ...formData, password: e.target.value })} className=\"mt-1 h-9 text-sm\" />\n </div>\n <div>\n <Label htmlFor=\"confirmPassword\" className=\"text-sm\">Confirm password</Label>\n <Input id=\"confirmPassword\" type=\"password\" required value={formData.confirmPassword} onChange={(e) => setFormData({ ...formData, confirmPassword: e.target.value })} className=\"mt-1 h-9 text-sm\" />\n </div>\n\n {message && (\n <div className={`p-2.5 rounded-md text-sm ${message.includes(\"successfully\") ? \"bg-green-50 text-green-700\" : \"bg-red-50 text-red-700\"}`}>\n {message}\n </div>\n )}\n\n <Button type=\"submit\" disabled={loading} className=\"w-full h-9 text-sm\">\n {loading ? \"Activating...\" : \"Activate account\"}\n </Button>\n </form>\n </div>\n </AuthPageLayout>\n );\n}\n\nexport default function InvitePage() {\n return (\n <Suspense fallback={\n <div className=\"min-h-screen flex items-center justify-center bg-gray-50\">\n <div className=\"max-w-[400px] w-full p-6 text-center\">\n <div className=\"animate-spin rounded-full h-6 w-6 border-2 border-gray-300 border-t-gray-600 mx-auto\"></div>\n <p className=\"mt-3 text-sm text-gray-600\">Loading...</p>\n </div>\n </div>\n }>\n <InvitePageContent />\n </Suspense>\n );\n} ","\"use client\";\n\nimport { useSession } from \"next-auth/react\";\nimport { useEffect, useState } from \"react\";\nimport AnalyticsCard from \"../../components/Admin/AnalyticsCard\";\nimport DailyUserChart from \"../../components/Admin/DailyUserChart\";\nimport GeographicMap from \"../../components/Admin/GeographicMap\";\nimport { Users, Eye, MousePointer, Globe, FileText, ClipboardList, UserCheck, TrendingUp, MapPin, BarChart3, Activity } from \"lucide-react\";\n\ninterface AnalyticsData {\n visitors: number;\n pageViews: number;\n bounceRate: number;\n avgSessionDuration: number;\n topPages: Array<{ page: string; views: number }>;\n trafficSources: Array<{ source: string; sessions: number }>;\n geographicData: Array<{ country: string; sessions: number }>;\n dailyUsers: Array<{ date: string; users: number }>;\n}\n\ninterface DashboardStats {\n contacts: {\n total: number;\n recent: number;\n };\n forms: {\n total: number;\n submissions: number;\n recentSubmissions: number;\n };\n users: number;\n blogs: number;\n}\n\ninterface LoadingState {\n analytics: boolean;\n stats: boolean;\n}\n\nexport default function DashboardPage() {\n const { data: session } = useSession();\n const [analyticsData, setAnalyticsData] = useState<AnalyticsData | null>(null);\n const [dashboardStats, setDashboardStats] = useState<DashboardStats | null>(null);\n const [loading, setLoading] = useState<LoadingState>({ analytics: true, stats: true });\n const [analyticsEnabled, setAnalyticsEnabled] = useState(false);\n\n useEffect(() => {\n const fetchData = async () => {\n // Fork: Start both API calls simultaneously\n const analyticsPromise = fetch('/api/analytics?days=30');\n const statsPromise = fetch('/api/dashboard/stats');\n\n try {\n // Join: Wait for both promises to resolve\n const [analyticsResponse, statsResponse] = await Promise.all([analyticsPromise, statsPromise]);\n\n // Handle analytics response\n if (analyticsResponse.ok) {\n const data = await analyticsResponse.json();\n setAnalyticsData(data);\n setAnalyticsEnabled(true);\n } else if (analyticsResponse.status === 404) {\n setAnalyticsEnabled(false);\n } else if (analyticsResponse.status === 401) {\n setAnalyticsEnabled(false);\n } else if (analyticsResponse.status === 403) {\n setAnalyticsEnabled(false);\n } else {\n setAnalyticsEnabled(false);\n }\n\n // Handle stats response\n if (statsResponse.ok) {\n const stats = await statsResponse.json();\n setDashboardStats(stats);\n }\n\n } catch (error) {\n setAnalyticsEnabled(false);\n } finally {\n // Set both loading states to false\n setLoading({ analytics: false, stats: false });\n }\n };\n\n fetchData();\n }, []);\n\n const isLoading = loading.analytics || loading.stats;\n\n return (\n <div className=\"min-w-0 rounded-lg bg-white shadow-md\">\n {/* Header with loader color gradient background */}\n <div className=\"bg-gray-800 border-b border-gray-700 px-4 py-2.5 rounded-t-lg\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-base font-semibold text-white\">Dashboard</h1>\n <p className=\"text-xs text-gray-300 mt-0.5\">Welcome back, {session?.user?.email}</p>\n </div>\n <div className=\"flex items-center space-x-3\">\n <div className=\"text-right text-gray-200\">\n <p className=\"text-xs text-gray-400\">Last updated</p>\n <p className=\"text-sm font-medium\">{new Date().toLocaleDateString()}</p>\n </div>\n </div>\n </div>\n </div>\n <div className=\"min-w-0 p-4 bg-gray-50\">\n <div className=\"mb-4\">\n <div className=\"flex items-center mb-2\">\n <BarChart3 className=\"w-4 h-4 text-gray-600 mr-2\" />\n <h2 className=\"text-sm font-semibold text-gray-800\">Overview</h2>\n </div>\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-3\">\n <div className=\"bg-white rounded border border-gray-200 p-2.5 shadow-sm\">\n <div className=\"flex items-center justify-between mb-1.5\">\n <p className=\"text-xs font-medium text-gray-600\">Total Contacts</p>\n <div className=\"p-1 bg-gray-200 rounded\">\n <Users className=\"w-3.5 h-3.5 text-gray-600\" />\n </div>\n </div>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center\">\n <p className=\"text-xl font-bold text-gray-900\">{dashboardStats?.contacts.total || 0}</p>\n <TrendingUp className=\"w-3 h-3 text-green-500 ml-1\" />\n </div>\n <p className=\"text-xs text-green-600\">+{dashboardStats?.contacts.recent || 0}</p>\n </div>\n </div>\n \n <div className=\"bg-white rounded border border-gray-200 p-2.5 shadow-sm\">\n <div className=\"flex items-center justify-between mb-1.5\">\n <p className=\"text-xs font-medium text-gray-600\">Form Submissions</p>\n <div className=\"p-1 bg-gray-200 rounded\">\n <FileText className=\"w-3.5 h-3.5 text-gray-600\" />\n </div>\n </div>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center\">\n <p className=\"text-xl font-bold text-gray-900\">{dashboardStats?.forms.submissions || 0}</p>\n <TrendingUp className=\"w-3 h-3 text-green-500 ml-1\" />\n </div>\n <p className=\"text-xs text-green-600\">+{dashboardStats?.forms.recentSubmissions || 0}</p>\n </div>\n </div>\n \n <div className=\"bg-white rounded border border-gray-200 p-2.5 shadow-sm\">\n <div className=\"flex items-center justify-between mb-1.5\">\n <p className=\"text-xs font-medium text-gray-600\">Active Forms</p>\n <div className=\"p-1 bg-gray-200 rounded\">\n <ClipboardList className=\"w-3.5 h-3.5 text-gray-600\" />\n </div>\n </div>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center\">\n <p className=\"text-xl font-bold text-gray-900\">{dashboardStats?.forms.total || 0}</p>\n </div>\n <p className=\"text-xs text-gray-500\">Total</p>\n </div>\n </div>\n \n <div className=\"bg-white rounded border border-gray-200 p-2.5 shadow-sm\">\n <div className=\"flex items-center justify-between mb-1.5\">\n <p className=\"text-xs font-medium text-gray-600\">Registered Users</p>\n <div className=\"p-1 bg-gray-200 rounded\">\n <UserCheck className=\"w-3.5 h-3.5 text-gray-600\" />\n </div>\n </div>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center\">\n <p className=\"text-xl font-bold text-gray-900\">{dashboardStats?.users || 0}</p>\n </div>\n <p className=\"text-xs text-gray-500\">Total</p>\n </div>\n </div>\n </div>\n </div>\n\n {/* Dotted Line Separator */}\n <div className=\"border-t-2 border-dotted border-gray-200 my-6\"></div>\n \n {/* Analytics Section - Only show if enabled */}\n {analyticsEnabled && !isLoading && analyticsData && (\n <>\n {/* Analytics Overview */}\n <div className=\"mb-4\">\n <div className=\"flex items-center mb-2\">\n <Globe className=\"w-4 h-4 text-gray-600 mr-2\" />\n <h2 className=\"text-sm font-semibold text-gray-800\">Website Analytics</h2>\n </div>\n \n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4\">\n <AnalyticsCard\n title=\"Total Visitors\"\n value={analyticsData.visitors.toLocaleString()}\n subtitle=\"Last 30 days\"\n icon={<Users className=\"w-5 h-5\" />}\n trend={{ value: 12.5, isPositive: true }}\n />\n \n <AnalyticsCard\n title=\"Page Views\"\n value={analyticsData.pageViews.toLocaleString()}\n subtitle=\"Last 30 days\"\n icon={<Eye className=\"w-5 h-5\" />}\n trend={{ value: 8.2, isPositive: true }}\n />\n \n <AnalyticsCard\n title=\"Bounce Rate\"\n value={`${analyticsData.bounceRate.toFixed(1)}%`}\n subtitle=\"Last 30 days\"\n icon={<MousePointer className=\"w-5 h-5\" />}\n trend={{ value: 3.1, isPositive: false }}\n />\n \n <AnalyticsCard\n title=\"Avg Session\"\n value={`${Math.round(analyticsData.avgSessionDuration / 60)}m`}\n subtitle=\"Last 30 days\"\n icon={<Globe className=\"w-5 h-5\" />}\n trend={{ value: 15.7, isPositive: true }}\n />\n </div>\n </div>\n\n {/* Dotted Line Separator */}\n <div className=\"border-t-2 border-dotted border-gray-200 my-6\"></div>\n\n {/* Daily User Activity Chart */}\n <div className=\"mb-6\">\n <div className=\"flex items-center mb-4\">\n <Activity className=\"w-5 h-5 text-gray-600 mr-2\" />\n <h2 className=\"text-xl font-semibold text-gray-800\">Daily User Activity</h2>\n </div>\n \n <DailyUserChart \n data={analyticsData.dailyUsers} \n title=\"Daily User Trends (Last 30 Days)\"\n />\n </div>\n\n {/* Dotted Line Separator */}\n <div className=\"border-t-2 border-dotted border-gray-200 my-6\"></div>\n\n {/* Analytics Details */}\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6 mb-6\">\n {/* Top Pages */}\n <div className=\"bg-white rounded-lg border border-gray-100 p-4 shadow-sm\">\n <h3 className=\"text-base font-semibold text-gray-800 mb-3\">Top Pages</h3>\n <div className=\"space-y-2\">\n {analyticsData.topPages.map((page, index) => (\n <div key={index} className=\"flex items-center justify-between p-2 bg-gray-50 rounded-lg\">\n <div className=\"flex items-center\">\n <span className=\"text-xs font-medium text-gray-500 w-4\">{index + 1}</span>\n <span className=\"text-xs text-gray-700 truncate max-w-xs\">{page.page}</span>\n </div>\n <span className=\"text-xs font-semibold text-gray-900\">{page.views.toLocaleString()}</span>\n </div>\n ))}\n </div>\n </div>\n \n {/* Traffic Sources */}\n <div className=\"bg-white rounded-lg border border-gray-100 p-4 shadow-sm\">\n <h3 className=\"text-base font-semibold text-gray-800 mb-3\">Traffic Sources</h3>\n <div className=\"space-y-2\">\n {analyticsData.trafficSources.map((source, index) => (\n <div key={index} className=\"flex items-center justify-between p-2 bg-gray-50 rounded-lg\">\n <span className=\"text-xs text-gray-700\">{source.source}</span>\n <span className=\"text-xs font-semibold text-gray-900\">{source.sessions.toLocaleString()}</span>\n </div>\n ))}\n </div>\n </div>\n </div>\n\n {/* Dotted Line Separator */}\n <div className=\"border-t-2 border-dotted border-gray-200 my-6\"></div>\n\n {/* Geographic Distribution */}\n <div className=\"mb-6\">\n <GeographicMap data={analyticsData.geographicData} />\n </div>\n </>\n )}\n\n {/* Loading State */}\n {isLoading && (\n <div className=\"flex items-center justify-center py-8\">\n <div className=\"animate-spin rounded-full h-5 w-5 border-2 border-gray-300 border-t-gray-600\"></div>\n <span className=\"ml-2 text-sm text-gray-600\">Loading dashboard data...</span>\n </div>\n )}\n\n {/* No Analytics State */}\n {!isLoading && !analyticsEnabled && (\n <div className=\"text-center py-8\">\n <Globe className=\"w-10 h-10 text-gray-400 mx-auto mb-3\" />\n <h3 className=\"text-base font-medium text-gray-600 mb-1\">Analytics Not Configured</h3>\n <p className=\"text-xs text-gray-500\">Google Analytics integration is required to view website analytics.</p>\n </div>\n )}\n </div>\n </div>\n );\n}\n","'use client';\n\nimport React, { useState, useEffect, useContext, useMemo } from 'react';\nimport { useRouter } from 'next/navigation';\nimport DashboardPage from './DashboardPage';\nimport SignInPage from './SignInPage';\nimport ForgotPasswordPage from './ForgotPasswordPage';\nimport ResetPasswordPage from './ResetPasswordPage';\nimport InvitePage from './InvitePage';\nimport AdminCRUD, { type CrudFilterItem } from '../../components/Admin/CRUD';\nimport BlogEditorPage from '../../components/Admin/BlogEditorPage';\nimport PolicyEditorPage from '../../components/Admin/PolicyEditorPage';\nimport FormBuilder from '../../components/Admin/FormBuilder';\nimport SubmissionDetailPage from './SubmissionDetailPage';\nimport OrderDetailPage from './OrderDetailPage';\nimport PaymentDetailPage from './PaymentDetailPage';\nimport ContactDetailPage from './ContactDetailPage';\nimport SettingsPage from './SettingsPage';\nimport MediaLibraryPage from './MediaLibraryPage';\nimport PageBuilderPage from './PageBuilderPage';\nimport PluginsPage from './PluginsPage';\nimport BrandEditPage from './BrandEditPage';\nimport { AdminConfigContext } from '../admin-config-context';\nimport { STORE_CRUD_CONFIGS } from '../store-crud-configs';\n\nconst PAGE_MAP: Record<string, React.ComponentType> = {\n dashboard: DashboardPage,\n signin: SignInPage,\n 'forgot-password': ForgotPasswordPage,\n 'reset-password': ResetPasswordPage,\n invite: InvitePage,\n settings: SettingsPage,\n plugins: PluginsPage,\n};\n\ninterface CrudColumn {\n field: string;\n displayName: string;\n type?: string;\n}\n\ninterface CrudConfig {\n title: string;\n apiEndpoint: string;\n columns: CrudColumn[];\n addEditPageUrl: string;\n filters?: CrudFilterItem[];\n}\n\nconst CRUD_CONFIGS: Record<string, CrudConfig> = {\n contacts: {\n title: 'Contacts',\n apiEndpoint: '/api/contacts',\n columns: [\n { field: 'name', displayName: 'Name' },\n { field: 'email', displayName: 'Email' },\n { field: 'phone', displayName: 'Phone' },\n { field: 'type', displayName: 'Type' },\n { field: 'createdAt', displayName: 'Created', type: 'date' },\n ],\n addEditPageUrl: '',\n filters: [\n { param: 'type', label: 'Type', type: 'select', options: [\n { value: '', label: 'All' },\n { value: 'customer', label: 'Customer' },\n { value: 'lead', label: 'Lead' },\n { value: 'vendor', label: 'Vendor' },\n ]},\n { param: 'orderId', label: 'Order ID', type: 'text' },\n ],\n },\n blogs: {\n title: 'Blogs',\n apiEndpoint: '/api/blogs',\n columns: [\n { field: 'title', displayName: 'Title' },\n { field: 'slug', displayName: 'Slug' },\n { field: 'published', displayName: 'Published', type: 'boolean' },\n { field: 'createdAt', displayName: 'Created', type: 'date' },\n ],\n addEditPageUrl: '/admin/blogs',\n },\n users: {\n title: 'Users',\n apiEndpoint: '/api/users',\n columns: [\n { field: 'name', displayName: 'Name' },\n { field: 'email', displayName: 'Email' },\n { field: 'blocked', displayName: 'Blocked', type: 'boolean' },\n { field: 'createdAt', displayName: 'Created', type: 'date' },\n ],\n addEditPageUrl: '',\n },\n forms: {\n title: 'Forms',\n apiEndpoint: '/api/forms',\n columns: [\n { field: 'name', displayName: 'Name' },\n { field: 'slug', displayName: 'Slug' },\n { field: 'published', displayName: 'Published', type: 'boolean' },\n { field: 'createdAt', displayName: 'Created', type: 'date' },\n ],\n addEditPageUrl: '/admin/forms',\n },\n submissions: {\n title: 'Submissions',\n apiEndpoint: '/api/form-submissions',\n columns: [\n { field: 'form.name', displayName: 'Form' },\n { field: 'contact.email', displayName: 'Contact' },\n { field: 'createdAt', displayName: 'Created', type: 'date' },\n ],\n addEditPageUrl: '',\n },\n pages: {\n title: 'Pages',\n apiEndpoint: '/api/pages',\n columns: [\n { field: 'title', displayName: 'Title' },\n { field: 'slug', displayName: 'Slug' },\n { field: 'published', displayName: 'Published', type: 'boolean' },\n { field: 'createdAt', displayName: 'Created', type: 'date' },\n ],\n addEditPageUrl: '/admin/pages',\n },\n categories: {\n title: 'Categories',\n apiEndpoint: '/api/categories',\n columns: [\n { field: 'name', displayName: 'Name' },\n { field: 'createdAt', displayName: 'Created', type: 'date' },\n ],\n addEditPageUrl: '',\n },\n tags: {\n title: 'Tags',\n apiEndpoint: '/api/tags',\n columns: [\n { field: 'name', displayName: 'Name' },\n { field: 'createdAt', displayName: 'Created', type: 'date' },\n ],\n addEditPageUrl: '',\n },\n media: {\n title: 'Media',\n apiEndpoint: '/api/media',\n columns: [\n { field: 'filename', displayName: 'Filename' },\n { field: 'mimeType', displayName: 'Type' },\n { field: 'isPublic', displayName: 'Public', type: 'boolean' },\n { field: 'createdAt', displayName: 'Created', type: 'date' },\n ],\n addEditPageUrl: '',\n },\n policies: {\n title: 'Policies',\n apiEndpoint: '/api/policies',\n columns: [\n { field: 'title', displayName: 'Title' },\n { field: 'version', displayName: 'Version' },\n { field: 'published', displayName: 'Published', type: 'boolean' },\n { field: 'publishedAt', displayName: 'Published Date', type: 'date' },\n { field: 'createdAt', displayName: 'Created', type: 'date' },\n ],\n addEditPageUrl: '/admin/policies',\n },\n};\n\nfunction BlogEditorWrapper({ blogId }: { blogId?: string }) {\n const [blog, setBlog] = useState<Record<string, unknown> | null>(null);\n const [loading, setLoading] = useState(!!blogId);\n\n useEffect(() => {\n if (!blogId) return;\n fetch(`/api/blogs/${blogId}`)\n .then((res) => (res.ok ? res.json() : null))\n .then((data) => setBlog(data))\n .finally(() => setLoading(false));\n }, [blogId]);\n\n if (loading) {\n return (\n <div className=\"flex items-center justify-center py-8\">\n <div className=\"animate-spin rounded-full h-6 w-6 border-2 border-gray-300 border-t-gray-600\" />\n <span className=\"ml-2\">Loading...</span>\n </div>\n );\n }\n\n return <BlogEditorPage existingBlog={blog} />;\n}\n\nfunction PolicyEditorWrapper({ policyId }: { policyId?: string }) {\n const [policy, setPolicy] = useState<Record<string, unknown> | null>(null);\n const [loading, setLoading] = useState(!!policyId);\n\n useEffect(() => {\n if (!policyId) return;\n fetch(`/api/policies/${policyId}`)\n .then((res) => (res.ok ? res.json() : null))\n .then((data) => setPolicy(data))\n .finally(() => setLoading(false));\n }, [policyId]);\n\n if (loading) {\n return (\n <div className=\"flex items-center justify-center py-8\">\n <div className=\"animate-spin rounded-full h-6 w-6 border-2 border-gray-300 border-t-gray-600\" />\n <span className=\"ml-2\">Loading...</span>\n </div>\n );\n }\n\n return <PolicyEditorPage existingPolicy={policy} />;\n}\n\nexport default function AdminPageResolver({ slug }: { slug?: string[] }) {\n const router = useRouter();\n const { customCrudConfigs, storeEnabled } = useContext(AdminConfigContext);\n const key = slug?.[0] || 'dashboard';\n\n useEffect(() => {\n if (key === 'layout-settings') {\n router.replace('/admin/settings?tab=navbar');\n }\n }, [key, router]);\n\n if (key === 'layout-settings') {\n return (\n <div className=\"flex justify-center py-8\">\n <div className=\"animate-spin rounded-full h-6 w-6 border-2 border-gray-300 border-t-gray-600\" />\n <span className=\"ml-2\">Redirecting...</span>\n </div>\n );\n }\n\n const Page = PAGE_MAP[key];\n\n if (Page) {\n return <Page />;\n }\n\n if (key === 'form-submissions' && slug && slug.length === 3 && slug[2] === 'view') {\n return <SubmissionDetailPage submissionId={slug[1]} />;\n }\n if (key === 'orders' && slug && slug.length === 3 && slug[2] === 'view') {\n return <OrderDetailPage orderId={slug[1]} />;\n }\n if (key === 'payments' && slug && slug.length === 3 && slug[2] === 'view') {\n return <PaymentDetailPage paymentId={slug[1]} />;\n }\n if (key === 'contacts' && slug && slug.length === 3 && slug[2] === 'view') {\n return <ContactDetailPage contactId={slug[1]} />;\n }\n\n const crud = { ...CRUD_CONFIGS, ...STORE_CRUD_CONFIGS, ...customCrudConfigs }[key];\n\n if (crud && slug && slug.length >= 2) {\n const subPath = slug[1];\n const isCreate = subPath === 'create';\n\n if (key === 'blogs') {\n return <BlogEditorWrapper blogId={isCreate ? undefined : subPath} />;\n }\n if (key === 'policies') {\n return <PolicyEditorWrapper policyId={isCreate ? undefined : subPath} />;\n }\n if (key === 'forms') {\n return <FormBuilder formId={isCreate ? undefined : subPath} />;\n }\n if (key === 'pages') {\n return <PageBuilderPage pageId={isCreate ? undefined : subPath} />;\n }\n if (key === 'brands') {\n return <BrandEditPage brandId={subPath} />;\n }\n }\n\n if (crud) {\n if (key === 'media') {\n return <MediaLibraryPage />;\n }\n const isContactsWithStore = key === 'contacts' && storeEnabled;\n const columns = isContactsWithStore\n ? [\n ...crud.columns,\n { field: 'orderCount', displayName: 'Orders' },\n { field: 'totalPaid', displayName: 'Total paid' },\n ]\n : crud.columns;\n const extraListParams = useMemo(\n () => (isContactsWithStore ? { includeSummary: '1' } : undefined),\n [isContactsWithStore]\n );\n return (\n <AdminCRUD\n title={crud.title}\n apiEndpoint={crud.apiEndpoint}\n columns={columns}\n addEditPageUrl={crud.addEditPageUrl}\n defaultSortField={(crud as { defaultSortField?: string }).defaultSortField}\n defaultSortOrder={(crud as { defaultSortOrder?: 'asc' | 'desc' }).defaultSortOrder}\n filters={crud.filters ?? (STORE_CRUD_CONFIGS[key]?.filters as CrudFilterItem[] | undefined)}\n extraListParams={extraListParams}\n />\n );\n }\n\n return (\n <div className=\"flex items-center justify-center min-h-[50vh]\">\n <p className=\"text-gray-500\">Page not found</p>\n </div>\n );\n}\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport { Input } from \"@/components/ui/input\";\nimport { Button } from \"@/components/ui/button\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { X, Save, AlertCircle } from \"lucide-react\";\nimport { useRouter } from \"next/navigation\";\nimport dynamic from \"next/dynamic\";\n\nconst quillStyles = `\n .ql-container {\n border: none !important;\n font-size: 14px;\n font-family: inherit;\n border-radius: 0 0 6px 6px;\n }\n .ql-toolbar {\n border: none !important;\n border-bottom: 1px solid #e5e7eb !important;\n background: #f9fafb;\n border-radius: 6px 6px 0 0;\n padding: 8px 12px;\n }\n .ql-toolbar button {\n border-radius: 4px;\n margin: 0 1px;\n }\n .ql-toolbar button:hover {\n background-color: #e5e7eb !important;\n }\n .ql-editor {\n min-height: 400px;\n padding: 16px;\n border: none !important;\n outline: none !important;\n font-family: inherit;\n line-height: 1.6;\n color: #374151;\n }\n .ql-editor:focus {\n outline: none !important;\n }\n .ql-editor.ql-blank::before {\n color: #9ca3af;\n font-style: normal;\n font-size: 14px;\n }\n .ql-editor p {\n margin-bottom: 12px;\n }\n .ql-editor h1, .ql-editor h2, .ql-editor h3 {\n margin-top: 16px;\n margin-bottom: 8px;\n font-weight: 600;\n }\n`;\n\nconst ReactQuill = dynamic(() => import(\"react-quill-new\"), { ssr: false });\n\nconst quillModules = {\n toolbar: [\n [{ header: [1, 2, false] }],\n [\"bold\", \"italic\", \"underline\", \"strike\"],\n [{ list: \"ordered\" }, { list: \"bullet\" }],\n [\"blockquote\", \"code-block\"],\n [\"link\", \"image\"],\n [{ align: [] }],\n [\"clean\"],\n ],\n};\n\ninterface PolicyEditorPageProps {\n existingPolicy?: Record<string, unknown> | null;\n}\n\nexport default function PolicyEditorPage({ existingPolicy }: PolicyEditorPageProps) {\n const [title, setTitle] = useState((existingPolicy?.title as string) || \"\");\n const [slug, setSlug] = useState((existingPolicy?.slug as string) || \"\");\n const [content, setContent] = useState((existingPolicy?.content as string) || \"\");\n const [version, setVersion] = useState((existingPolicy?.version as string) || \"\");\n const [published, setPublished] = useState((existingPolicy?.published as boolean) ?? false);\n const [publishedAt, setPublishedAt] = useState(\n existingPolicy?.publishedAt\n ? new Date(existingPolicy.publishedAt as string).toISOString().slice(0, 16)\n : \"\"\n );\n const [errors, setErrors] = useState<string[]>([]);\n const [isSaving, setIsSaving] = useState(false);\n const router = useRouter();\n\n useEffect(() => {\n if (title && !slug) {\n const generated = title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/(^-|-$)/g, \"\");\n setSlug(generated);\n }\n }, [title, slug]);\n\n const validate = () => {\n const next: string[] = [];\n if (!title.trim()) next.push(\"Title is required\");\n if (!slug.trim()) next.push(\"Slug is required\");\n setErrors(next);\n return next.length === 0;\n };\n\n const handleSave = async () => {\n setIsSaving(true);\n setErrors([]);\n if (!validate()) {\n setIsSaving(false);\n return;\n }\n const body = {\n title: title.trim(),\n slug: slug.trim(),\n content,\n version: version.trim() || null,\n published,\n publishedAt: publishedAt ? new Date(publishedAt).toISOString() : null,\n };\n const method = existingPolicy ? \"PUT\" : \"POST\";\n const url = existingPolicy ? `/api/policies/${existingPolicy.id}` : \"/api/policies\";\n try {\n const res = await fetch(url, {\n method,\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n const data = await res.json();\n if (!res.ok) {\n setErrors(Array.isArray(data.details) ? data.details : [data.error || \"Failed to save\"]);\n return;\n }\n if (!existingPolicy && data.id) {\n router.replace(`/admin/policies/${data.id}`);\n }\n } catch {\n setErrors([\"Failed to save policy\"]);\n } finally {\n setIsSaving(false);\n }\n };\n\n return (\n <div className=\"min-w-0 rounded-lg bg-white shadow-md\">\n <div className=\"bg-gray-800 border-b border-gray-700 px-4 py-2.5 rounded-t-lg\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-xl font-bold text-white\">\n {existingPolicy ? \"Edit Policy\" : \"Create Policy\"}\n </h1>\n <p className=\"text-xs text-gray-300 mt-0.5\">\n {existingPolicy ? \"Update policy\" : \"Add a new policy\"}\n </p>\n </div>\n <div className=\"flex items-center gap-3\">\n <div className=\"flex items-center gap-2\">\n <Switch\n checked={published}\n onCheckedChange={(c) => setPublished(c as boolean)}\n className=\"data-[state=checked]:bg-green-500\"\n />\n <span className=\"text-xs text-gray-300\">Published</span>\n </div>\n <Button\n size=\"sm\"\n className=\"flex items-center bg-white text-gray-800 hover:bg-gray-100 border-0 text-xs\"\n onClick={handleSave}\n disabled={isSaving}\n >\n <Save className=\"h-4 w-4 mr-1\" />\n {isSaving ? \"Saving...\" : \"Save\"}\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"flex items-center bg-white text-gray-800 hover:bg-gray-100 border-0 text-xs\"\n onClick={() => router.back()}\n >\n <X className=\"h-4 w-4 mr-1\" /> Close\n </Button>\n </div>\n </div>\n </div>\n {errors.length > 0 && (\n <div className=\"bg-red-50 border-l-4 border-red-400 p-4 mx-6 mt-4\">\n <div className=\"flex\">\n <AlertCircle className=\"h-5 w-5 text-red-400\" />\n <div className=\"ml-3\">\n <h3 className=\"text-sm font-medium text-red-800\">Please fix the following errors:</h3>\n <ul className=\"mt-2 text-sm text-red-700 list-disc pl-5 space-y-1\">\n {errors.map((e, i) => (\n <li key={i}>{e}</li>\n ))}\n </ul>\n </div>\n </div>\n </div>\n )}\n <div className=\"min-w-0 p-6 flex flex-col lg:flex-row w-full gap-6\">\n <div className=\"flex w-full lg:w-3/4 flex-col gap-4 min-w-0\">\n <div>\n <label className=\"block text-sm font-semibold text-gray-700 mb-2\">Content *</label>\n <div className=\"border border-gray-300 rounded-md bg-white overflow-hidden focus-within:border-gray-500 focus-within:ring-1 focus-within:ring-gray-500\">\n <style dangerouslySetInnerHTML={{ __html: quillStyles }} />\n <ReactQuill\n value={content}\n onChange={setContent}\n theme=\"snow\"\n modules={quillModules}\n placeholder=\"Policy content (HTML)...\"\n />\n </div>\n </div>\n </div>\n <div className=\"flex w-full lg:w-1/4 flex-col gap-4 rounded-lg bg-gray-50 border overflow-hidden p-4 min-w-0\">\n <div>\n <label className=\"block text-xs font-medium text-gray-600 mb-1\">Title *</label>\n <Input\n type=\"text\"\n placeholder=\"Policy Title\"\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n className=\"h-8 text-sm\"\n />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-gray-600 mb-1\">Slug *</label>\n <Input\n type=\"text\"\n placeholder=\"policy-slug\"\n value={slug}\n onChange={(e) => setSlug(e.target.value)}\n className=\"h-8 text-sm\"\n />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-gray-600 mb-1\">Version</label>\n <Input\n type=\"text\"\n placeholder=\"e.g. 1.0\"\n value={version}\n onChange={(e) => setVersion(e.target.value)}\n className=\"h-8 text-sm\"\n />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-gray-600 mb-1\">Published Date</label>\n <Input\n type=\"datetime-local\"\n value={publishedAt}\n onChange={(e) => setPublishedAt(e.target.value)}\n className=\"h-8 text-sm\"\n />\n </div>\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport Link from \"next/link\";\nimport { ArrowLeft } from \"lucide-react\";\nimport { Button } from \"@/components/ui/button\";\nimport { formatDateTime } from \"@/lib/utils\";\nimport DetailPageHeader from \"../../components/Admin/DetailPageHeader\";\n\ninterface FormFieldRef {\n id: number;\n label: string;\n type: string;\n}\n\ninterface FormRef {\n id: number;\n name: string;\n slug: string;\n fields?: FormFieldRef[];\n}\n\ninterface ContactRef {\n id: number;\n name: string;\n email: string;\n phone: string | null;\n}\n\ninterface Submission {\n id: number;\n formId: number;\n contactId: number | null;\n data: Record<string, unknown>;\n ipAddress: string | null;\n userAgent: string | null;\n createdAt: string;\n updatedAt: string;\n form?: FormRef;\n contact?: ContactRef | null;\n}\n\nexport default function SubmissionDetailPage({ submissionId }: { submissionId: string }) {\n const [submission, setSubmission] = useState<Submission | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n async function load() {\n try {\n setLoading(true);\n setError(null);\n const res = await fetch(`/api/form-submissions/${submissionId}`);\n if (!res.ok) {\n if (res.status === 404) setError(\"Submission not found\");\n else setError(\"Failed to load\");\n setSubmission(null);\n return;\n }\n const data = await res.json();\n setSubmission(data);\n } catch {\n setError(\"Failed to load\");\n setSubmission(null);\n } finally {\n setLoading(false);\n }\n }\n load();\n }, [submissionId]);\n\n if (loading) {\n return (\n <div className=\"rounded-lg bg-white p-6 shadow-md\">\n <div className=\"flex justify-center py-12\">\n <span className=\"text-gray-500\">Loading...</span>\n </div>\n </div>\n );\n }\n\n if (error || !submission) {\n return (\n <div className=\"rounded-lg bg-white p-6 shadow-md\">\n <p className=\"text-red-600\">{error ?? \"Not found\"}</p>\n <Link href=\"/admin/submissions\">\n <Button variant=\"outline\" className=\"mt-4\">\n <ArrowLeft className=\"h-4 w-4 mr-2\" />\n Back to Submissions\n </Button>\n </Link>\n </div>\n );\n }\n\n const formName = submission.form?.name ?? `Form #${submission.formId}`;\n const contact = submission.contact;\n const fieldLabel = (key: string) => {\n const field = submission.form?.fields?.find((f) => String(f.id) === key);\n return field?.label ?? key;\n };\n\n return (\n <div className=\"rounded-lg bg-white shadow-md\">\n <DetailPageHeader\n title={`Submission #${submission.id}`}\n backHref=\"/admin/submissions\"\n backLabel=\"Back to Submissions\"\n closeHref=\"/admin/submissions\"\n />\n <div className=\"p-4 sm:p-6 space-y-6 min-w-0\">\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">Form</h2>\n <p className=\"text-gray-900 font-medium break-words\">{formName}</p>\n </section>\n\n {contact && (\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">Contact</h2>\n <div className=\"min-w-0 overflow-hidden border border-gray-200 rounded-lg p-4 bg-gray-50/50\">\n <dl className=\"min-w-0 grid grid-cols-1 sm:grid-cols-3 gap-2 text-sm\">\n <div className=\"min-w-0\">\n <dt className=\"text-gray-500\">Name</dt>\n <dd className=\"font-medium text-gray-900 break-words\">{contact.name}</dd>\n </div>\n <div className=\"min-w-0\">\n <dt className=\"text-gray-500\">Email</dt>\n <dd className=\"font-medium text-gray-900 break-words\">{contact.email}</dd>\n </div>\n <div className=\"min-w-0\">\n <dt className=\"text-gray-500\">Phone</dt>\n <dd className=\"font-medium text-gray-900 break-words\">{contact.phone ?? \"—\"}</dd>\n </div>\n </dl>\n </div>\n </section>\n )}\n\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">Submission data</h2>\n <div className=\"min-w-0 overflow-x-auto border border-gray-200 rounded-md\">\n <table className=\"w-full text-sm\">\n <thead className=\"bg-gray-50\">\n <tr>\n <th className=\"text-left py-2 px-3 font-medium text-gray-600\">Field</th>\n <th className=\"text-left py-2 px-3 font-medium text-gray-600\">Value</th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-gray-200\">\n {Object.entries(submission.data ?? {}).length === 0 ? (\n <tr>\n <td colSpan={2} className=\"py-4 px-3 text-gray-500\">\n No data\n </td>\n </tr>\n ) : (\n Object.entries(submission.data ?? {}).map(([key, value]) => (\n <tr key={key}>\n <td className=\"py-2 px-3 text-gray-600 font-medium\">{fieldLabel(key)}</td>\n <td className=\"py-2 px-3 text-gray-900 break-words min-w-0\">\n {value === null || value === undefined\n ? \"—\"\n : typeof value === \"object\"\n ? JSON.stringify(value)\n : String(value)}\n </td>\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n </section>\n\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">Audit</h2>\n <div className=\"min-w-0 overflow-hidden border border-gray-200 rounded-lg p-4 bg-gray-50/50\">\n <dl className=\"min-w-0 grid grid-cols-1 gap-2 text-sm\">\n <div className=\"min-w-0\">\n <dt className=\"text-gray-500\">Submitted at</dt>\n <dd className=\"font-medium text-gray-900\">{formatDateTime(submission.createdAt)}</dd>\n </div>\n {submission.ipAddress && (\n <div className=\"min-w-0\">\n <dt className=\"text-gray-500\">IP address</dt>\n <dd className=\"font-mono text-gray-900 break-words\">{submission.ipAddress}</dd>\n </div>\n )}\n {submission.userAgent && (\n <div className=\"min-w-0\">\n <dt className=\"text-gray-500\">User agent</dt>\n <dd className=\"text-gray-900 break-words\">{submission.userAgent}</dd>\n </div>\n )}\n </dl>\n </div>\n </section>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport Link from \"next/link\";\nimport { useRouter } from \"next/navigation\";\nimport { ArrowLeft, MoreVertical, X } from \"lucide-react\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\n\nexport interface DetailPageHeaderMenuItem {\n label: string;\n onClick: () => void;\n}\n\ninterface DetailPageHeaderProps {\n title: React.ReactNode;\n subtitle?: React.ReactNode;\n backHref?: string;\n backLabel?: string;\n closeHref?: string;\n onClose?: () => void;\n menuItems?: DetailPageHeaderMenuItem[];\n}\n\nexport default function DetailPageHeader({\n title,\n subtitle,\n backHref,\n backLabel = \"Back\",\n closeHref,\n onClose,\n menuItems = [],\n}: DetailPageHeaderProps) {\n const router = useRouter();\n\n const handleClose = () => {\n if (onClose) onClose();\n else if (closeHref) router.push(closeHref);\n else router.back();\n };\n\n return (\n <div className=\"bg-gray-800 border-b border-gray-700 px-4 py-2.5 rounded-t-lg flex items-center justify-between\">\n <div className=\"flex items-center gap-3 min-w-0\">\n {backHref && (\n <Link\n href={backHref}\n className=\"inline-flex items-center gap-1 text-gray-300 hover:text-white text-sm shrink-0\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n {backLabel}\n </Link>\n )}\n <div className=\"min-w-0\">\n <h1 className=\"text-base font-semibold text-white truncate\">{title}</h1>\n {subtitle != null && subtitle !== \"\" && (\n <div className=\"text-sm text-gray-400 truncate\">{subtitle}</div>\n )}\n </div>\n </div>\n <div className=\"flex items-center gap-2 shrink-0\">\n {menuItems.length > 0 && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 text-gray-300 hover:text-white hover:bg-gray-700\"\n >\n <MoreVertical className=\"h-4 w-4\" />\n <span className=\"sr-only\">More</span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-48\">\n {menuItems.map((item, i) => (\n <DropdownMenuItem key={i} onClick={item.onClick}>\n {item.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"h-8 w-8 rounded-md border border-gray-600 bg-transparent text-white hover:bg-gray-700\"\n onClick={handleClose}\n >\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </Button>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport Link from \"next/link\";\nimport { useRouter } from \"next/navigation\";\nimport { X } from \"lucide-react\";\nimport { Button } from \"@/components/ui/button\";\nimport { formatDateTime, formatDate } from \"@/lib/utils\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"@/components/ui/table\";\nimport DetailPageLayout from \"../../components/Admin/DetailPageLayout\";\nimport DetailPageHeader from \"../../components/Admin/DetailPageHeader\";\n\ninterface ContactRef {\n id: number;\n name: string;\n email: string;\n phone: string | null;\n}\n\ninterface AddressRef {\n id: number;\n tag: string | null;\n line1: string | null;\n line2: string | null;\n city: string | null;\n state: string | null;\n postalCode: string | null;\n country: string | null;\n}\n\ninterface ProductRef {\n id: number;\n name: string;\n sku?: string;\n collection?: { name: string } | null;\n}\n\ninterface OrderItemRef {\n id: number;\n productId: number;\n quantity: number;\n unitPrice: number;\n tax: number;\n total: number;\n product?: ProductRef;\n}\n\ninterface PaymentRef {\n id: number;\n orderId: number;\n amount: number;\n currency: string;\n status: string;\n method: string | null;\n externalReference: string | null;\n paidAt: string | null;\n createdAt: string;\n metadata?: Record<string, unknown> | null;\n}\n\ninterface Order {\n id: number;\n orderNumber: string;\n contactId: number;\n status: string;\n subtotal: number;\n tax: number;\n discount: number;\n total: number;\n currency: string;\n createdAt: string;\n updatedAt: string;\n contact?: ContactRef;\n billingAddress?: AddressRef | null;\n shippingAddress?: AddressRef | null;\n items?: OrderItemRef[];\n payments?: PaymentRef[];\n}\n\nfunction formatMoney(amount: number, currency: string = \"INR\"): string {\n return new Intl.NumberFormat(\"en-IN\", {\n style: \"currency\",\n currency,\n minimumFractionDigits: 2,\n }).format(Number(amount));\n}\n\nfunction statusBadge(status: string): string {\n const map: Record<string, string> = {\n pending: \"bg-amber-100 text-amber-800\",\n confirmed: \"bg-blue-100 text-blue-800\",\n processing: \"bg-sky-100 text-sky-800\",\n completed: \"bg-green-100 text-green-800\",\n cancelled: \"bg-gray-100 text-gray-600\",\n };\n return map[status] ?? \"bg-gray-100 text-gray-700\";\n}\n\nfunction formatAddress(a: AddressRef): string {\n const parts = [a.line1, a.line2, a.city, a.state, a.postalCode, a.country].filter(Boolean);\n return parts.join(\", \") || \"—\";\n}\n\nexport default function OrderDetailPage({ orderId }: { orderId: string }) {\n const router = useRouter();\n const [order, setOrder] = useState<Order | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n async function load() {\n try {\n setLoading(true);\n setError(null);\n const res = await fetch(`/api/orders/${orderId}`);\n if (!res.ok) {\n if (res.status === 404) setError(\"Order not found\");\n else setError(\"Failed to load\");\n setOrder(null);\n return;\n }\n const data = await res.json();\n setOrder(data);\n } catch {\n setError(\"Failed to load\");\n setOrder(null);\n } finally {\n setLoading(false);\n }\n }\n load();\n }, [orderId]);\n\n if (loading) {\n return (\n <div className=\"rounded-lg bg-white p-6 shadow-md\">\n <div className=\"flex justify-center py-12\">\n <span className=\"text-gray-500\">Loading...</span>\n </div>\n </div>\n );\n }\n\n if (error || !order) {\n return (\n <div className=\"rounded-lg bg-white p-6 shadow-md\">\n <p className=\"text-red-600\">{error ?? \"Not found\"}</p>\n <Link href=\"/admin/orders\">\n <Button variant=\"outline\" className=\"mt-4\">\n <X className=\"h-4 w-4 mr-2\" />\n Close\n </Button>\n </Link>\n </div>\n );\n }\n\n const contact = order.contact;\n const items = order.items ?? [];\n const payments = order.payments ?? [];\n const currency = order.currency ?? \"INR\";\n\n return (\n <div className=\"rounded-lg bg-white shadow-md\">\n <DetailPageHeader\n title={`Order ${order.orderNumber}`}\n subtitle={\n <>\n <span\n className={`inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium capitalize mr-2 ${statusBadge(\n order.status\n )}`}\n >\n {order.status}\n </span>\n <span className=\"text-sm text-gray-400\">\n {formatDateTime(order.createdAt)}\n </span>\n </>\n }\n closeHref=\"/admin/orders\"\n />\n\n <DetailPageLayout\n main={\n <>\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">\n Order details\n </h2>\n <div className=\"min-w-0 overflow-hidden border border-gray-200 rounded-lg p-4 bg-gray-50/50\">\n <dl className=\"min-w-0 grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-3 text-sm\">\n <div className=\"min-w-0\">\n <dt className=\"text-gray-500\">Order ID</dt>\n <dd className=\"font-medium text-gray-900\">{order.id}</dd>\n </div>\n <div className=\"min-w-0\">\n <dt className=\"text-gray-500\">Created</dt>\n <dd className=\"font-medium text-gray-900\">{formatDateTime(order.createdAt)}</dd>\n </div>\n <div className=\"min-w-0\">\n <dt className=\"text-gray-500\">Last updated</dt>\n <dd className=\"font-medium text-gray-900\">{formatDate(order.updatedAt)}</dd>\n </div>\n <div className=\"min-w-0\">\n <dt className=\"text-gray-500\">Total</dt>\n <dd className=\"font-medium text-gray-900\">{formatMoney(Number(order.total), currency)}</dd>\n </div>\n </dl>\n </div>\n </section>\n\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">\n Line items\n </h2>\n <div className=\"min-w-0 overflow-x-auto border border-gray-200 rounded-lg\">\n <Table>\n <TableHeader>\n <TableRow className=\"bg-gray-50\">\n <TableHead className=\"font-medium\">Product / Model</TableHead>\n <TableHead className=\"font-medium\">SKU</TableHead>\n <TableHead className=\"font-medium text-right\">Qty</TableHead>\n <TableHead className=\"font-medium text-right\">Unit price</TableHead>\n <TableHead className=\"font-medium text-right\">Total</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {items.length === 0 ? (\n <TableRow>\n <TableCell colSpan={5} className=\"py-6 text-center text-gray-500\">\n No items\n </TableCell>\n </TableRow>\n ) : (\n items.map((item) => {\n const label =\n item.product?.collection?.name ?? item.product?.name ?? `Product #${item.productId}`;\n return (\n <TableRow key={item.id}>\n <TableCell className=\"font-medium break-words min-w-0\">{label}</TableCell>\n <TableCell className=\"text-gray-600 break-words min-w-0\">\n {item.product?.sku ?? \"—\"}\n </TableCell>\n <TableCell className=\"text-right\">{item.quantity}</TableCell>\n <TableCell className=\"text-right\">\n {formatMoney(Number(item.unitPrice), currency)}\n </TableCell>\n <TableCell className=\"text-right font-medium\">\n {formatMoney(Number(item.total), currency)}\n </TableCell>\n </TableRow>\n );\n })\n )}\n </TableBody>\n </Table>\n </div>\n </section>\n\n <section className=\"flex justify-end\">\n <div className=\"min-w-0 overflow-hidden border border-gray-200 rounded-lg p-4 w-full max-w-xs space-y-2 text-sm\">\n <div className=\"flex justify-between text-gray-600\">\n <span>Subtotal</span>\n <span>{formatMoney(Number(order.subtotal), currency)}</span>\n </div>\n {Number(order.tax) > 0 && (\n <div className=\"flex justify-between text-gray-600\">\n <span>Tax</span>\n <span>{formatMoney(Number(order.tax), currency)}</span>\n </div>\n )}\n {Number(order.discount) > 0 && (\n <div className=\"flex justify-between text-gray-600\">\n <span>Discount</span>\n <span>-{formatMoney(Number(order.discount), currency)}</span>\n </div>\n )}\n <div className=\"flex justify-between font-semibold text-gray-900 pt-2 border-t border-gray-200\">\n <span>Total</span>\n <span>{formatMoney(Number(order.total), currency)}</span>\n </div>\n </div>\n </section>\n </>\n }\n sidebar={\n <>\n {contact && (\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">\n Customer\n </h2>\n <div className=\"min-w-0 overflow-hidden border border-gray-200 rounded-lg p-4 bg-gray-50/50\">\n <dl className=\"min-w-0 grid grid-cols-1 sm:grid-cols-3 gap-3 text-sm\">\n <div className=\"min-w-0\">\n <dt className=\"text-gray-500\">Name</dt>\n <dd className=\"font-medium text-gray-900 break-words\">{contact.name}</dd>\n </div>\n <div className=\"min-w-0\">\n <dt className=\"text-gray-500\">Email</dt>\n <dd className=\"font-medium text-gray-900 break-words\">\n <a href={`mailto:${contact.email}`} className=\"text-blue-600 hover:underline\">\n {contact.email}\n </a>\n </dd>\n </div>\n <div className=\"min-w-0\">\n <dt className=\"text-gray-500\">Phone</dt>\n <dd className=\"font-medium text-gray-900 break-words\">\n {contact.phone ? (\n <a href={`tel:${contact.phone}`} className=\"text-blue-600 hover:underline\">\n {contact.phone}\n </a>\n ) : (\n \"—\"\n )}\n </dd>\n </div>\n </dl>\n </div>\n </section>\n )}\n\n {(order.billingAddress || order.shippingAddress) && (\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">\n Customer addresses\n </h2>\n <div className=\"min-w-0 overflow-hidden border border-gray-200 rounded-lg p-4 bg-gray-50/50 space-y-4\">\n {order.billingAddress && (\n <div className=\"min-w-0\">\n <dt className=\"text-gray-500 text-xs font-medium uppercase tracking-wider mb-1\">Billing</dt>\n <dd className=\"text-gray-900 text-sm break-words\">{formatAddress(order.billingAddress)}</dd>\n </div>\n )}\n {order.shippingAddress && (\n <div className=\"min-w-0\">\n <dt className=\"text-gray-500 text-xs font-medium uppercase tracking-wider mb-1\">Shipping</dt>\n <dd className=\"text-gray-900 text-sm break-words\">{formatAddress(order.shippingAddress)}</dd>\n </div>\n )}\n </div>\n </section>\n )}\n\n {payments.length > 0 && (\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">\n Payments\n </h2>\n <div className=\"min-w-0 overflow-x-auto border border-gray-200 rounded-lg\">\n <Table>\n <TableHeader>\n <TableRow className=\"bg-gray-50\">\n <TableHead className=\"font-medium\">Amount</TableHead>\n <TableHead className=\"font-medium\">Status</TableHead>\n <TableHead className=\"font-medium\">Method</TableHead>\n <TableHead className=\"font-medium\">Paid at</TableHead>\n <TableHead className=\"font-medium\">Gateway reference</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {payments.map((p) => (\n <TableRow key={p.id}>\n <TableCell className=\"font-medium\">\n {formatMoney(Number(p.amount), p.currency)}\n </TableCell>\n <TableCell>\n <span\n className={`inline-flex rounded-full px-2 py-0.5 text-xs font-medium ${\n p.status === \"completed\"\n ? \"bg-green-100 text-green-800\"\n : p.status === \"failed\"\n ? \"bg-red-100 text-red-800\"\n : \"bg-gray-100 text-gray-700\"\n }`}\n >\n {p.status}\n </span>\n </TableCell>\n <TableCell className=\"text-gray-600\">{p.method ?? \"—\"}</TableCell>\n <TableCell className=\"text-gray-600\">\n {p.paidAt ? formatDateTime(p.paidAt) : \"—\"}\n </TableCell>\n <TableCell className=\"text-gray-600 font-mono text-xs break-words min-w-0\">\n {p.externalReference ?? \"—\"}\n {(p.metadata as Record<string, string> | undefined)?.razorpayPaymentId && (\n <span className=\"block mt-0.5\">\n {String((p.metadata as Record<string, string>).razorpayPaymentId)}\n </span>\n )}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n </section>\n )}\n </>\n }\n />\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\n\nexport default function DetailPageLayout({\n main,\n sidebar,\n}: {\n main: React.ReactNode;\n sidebar: React.ReactNode;\n}) {\n return (\n <div className=\"min-w-0 w-full p-4 sm:p-6 grid grid-cols-1 xl:grid-cols-3 gap-4 sm:gap-6\">\n <div className=\"min-w-0 w-full xl:col-span-2 space-y-6\">{main}</div>\n <div className=\"min-w-0 w-full xl:col-span-1 space-y-6\">{sidebar}</div>\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport Link from \"next/link\";\nimport { useRouter } from \"next/navigation\";\nimport { X } from \"lucide-react\";\nimport { Button } from \"@/components/ui/button\";\nimport { formatDateTime } from \"@/lib/utils\";\nimport DetailPageLayout from \"../../components/Admin/DetailPageLayout\";\nimport DetailPageHeader from \"../../components/Admin/DetailPageHeader\";\n\ninterface ContactRef {\n id: number;\n name: string;\n email: string;\n phone?: string | null;\n}\n\ninterface OrderRef {\n id: number;\n orderNumber: string;\n contact?: ContactRef;\n}\n\ninterface Payment {\n id: number;\n orderId: number;\n contactId: number | null;\n amount: number;\n currency: string;\n status: string;\n method: string | null;\n externalReference: string | null;\n paidAt: string | null;\n createdAt: string;\n updatedAt: string;\n metadata?: Record<string, unknown> | null;\n order?: OrderRef;\n contact?: ContactRef | null;\n}\n\nfunction formatMoney(amount: number, currency: string = \"INR\"): string {\n return new Intl.NumberFormat(\"en-IN\", {\n style: \"currency\",\n currency,\n minimumFractionDigits: 2,\n }).format(Number(amount));\n}\n\nexport default function PaymentDetailPage({ paymentId }: { paymentId: string }) {\n const router = useRouter();\n const [payment, setPayment] = useState<Payment | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n async function load() {\n try {\n setLoading(true);\n setError(null);\n const res = await fetch(`/api/payments/${paymentId}`);\n if (!res.ok) {\n if (res.status === 404) setError(\"Payment not found\");\n else setError(\"Failed to load\");\n setPayment(null);\n return;\n }\n const data = await res.json();\n setPayment(data);\n } catch {\n setError(\"Failed to load\");\n setPayment(null);\n } finally {\n setLoading(false);\n }\n }\n load();\n }, [paymentId]);\n\n if (loading) {\n return (\n <div className=\"rounded-lg bg-white p-6 shadow-md\">\n <div className=\"flex justify-center py-12\">\n <span className=\"text-gray-500\">Loading...</span>\n </div>\n </div>\n );\n }\n\n if (error || !payment) {\n return (\n <div className=\"rounded-lg bg-white p-6 shadow-md\">\n <p className=\"text-red-600\">{error ?? \"Not found\"}</p>\n <Link href=\"/admin/payments\">\n <Button variant=\"outline\" className=\"mt-4\">\n <X className=\"h-4 w-4 mr-2\" />\n Close\n </Button>\n </Link>\n </div>\n );\n }\n\n const customer = payment.order?.contact ?? payment.contact;\n const meta = (payment.metadata ?? {}) as Record<string, string>;\n\n return (\n <div className=\"rounded-lg bg-white shadow-md\">\n <DetailPageHeader\n title={`Payment #${payment.id}`}\n subtitle={\n <>\n <span\n className={`inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium mr-2 ${\n payment.status === \"completed\"\n ? \"bg-green-100 text-green-800\"\n : payment.status === \"failed\"\n ? \"bg-red-100 text-red-800\"\n : \"bg-amber-100 text-amber-800\"\n }`}\n >\n {payment.status}\n </span>\n <span className=\"text-sm text-gray-400\">\n {formatDateTime(payment.createdAt)}\n </span>\n </>\n }\n closeHref=\"/admin/payments\"\n />\n\n <DetailPageLayout\n main={\n <>\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">\n Payment details\n </h2>\n <div className=\"min-w-0 overflow-hidden border border-gray-200 rounded-lg p-4 bg-gray-50/50\">\n <dl className=\"min-w-0 grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-3 text-sm\">\n <div className=\"min-w-0\">\n <dt className=\"text-gray-500\">Payment ID</dt>\n <dd className=\"font-medium text-gray-900\">{payment.id}</dd>\n </div>\n <div className=\"min-w-0\">\n <dt className=\"text-gray-500\">Amount</dt>\n <dd className=\"font-medium text-gray-900\">{formatMoney(Number(payment.amount), payment.currency)}</dd>\n </div>\n <div className=\"min-w-0\">\n <dt className=\"text-gray-500\">Method</dt>\n <dd className=\"font-medium text-gray-900 break-words\">{payment.method ?? \"—\"}</dd>\n </div>\n <div className=\"min-w-0\">\n <dt className=\"text-gray-500\">Created</dt>\n <dd className=\"font-medium text-gray-900\">{formatDateTime(payment.createdAt)}</dd>\n </div>\n <div className=\"min-w-0\">\n <dt className=\"text-gray-500\">Last updated</dt>\n <dd className=\"font-medium text-gray-900\">{formatDateTime(payment.updatedAt)}</dd>\n </div>\n {payment.paidAt && (\n <div className=\"min-w-0\">\n <dt className=\"text-gray-500\">Paid at</dt>\n <dd className=\"font-medium text-gray-900\">{formatDateTime(payment.paidAt)}</dd>\n </div>\n )}\n {payment.externalReference && (\n <div className=\"sm:col-span-2\">\n <dt className=\"text-gray-500\">Razorpay Order ID</dt>\n <dd className=\"font-mono text-gray-900 text-xs mt-0.5 break-all\">{payment.externalReference}</dd>\n </div>\n )}\n {meta.razorpayPaymentId && (\n <div className=\"sm:col-span-2\">\n <dt className=\"text-gray-500\">Razorpay Payment ID</dt>\n <dd className=\"font-mono text-gray-900 text-xs mt-0.5 break-all\">{meta.razorpayPaymentId}</dd>\n </div>\n )}\n </dl>\n </div>\n </section>\n\n {payment.order && (\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">\n Order\n </h2>\n <div className=\"min-w-0 overflow-hidden border border-gray-200 rounded-lg p-4 bg-gray-50/50\">\n <Link\n href={`/admin/orders/${payment.order.id}/view`}\n className=\"text-blue-600 hover:underline font-medium break-words\"\n >\n {payment.order.orderNumber}\n </Link>\n <p className=\"text-xs text-gray-500 mt-1\">\n View full order details\n </p>\n </div>\n </section>\n )}\n </>\n }\n sidebar={\n <>\n {customer && (\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">\n Customer\n </h2>\n <div className=\"min-w-0 overflow-hidden border border-gray-200 rounded-lg p-4 bg-gray-50/50\">\n <dl className=\"min-w-0 grid grid-cols-1 sm:grid-cols-3 gap-3 text-sm\">\n <div className=\"min-w-0\">\n <dt className=\"text-gray-500\">Name</dt>\n <dd className=\"font-medium text-gray-900 break-words\">{customer.name}</dd>\n </div>\n <div className=\"min-w-0\">\n <dt className=\"text-gray-500\">Email</dt>\n <dd className=\"font-medium text-gray-900 break-words\">\n <a\n href={`mailto:${customer.email}`}\n className=\"text-blue-600 hover:underline\"\n >\n {customer.email}\n </a>\n </dd>\n </div>\n <div className=\"min-w-0\">\n <dt className=\"text-gray-500\">Phone</dt>\n <dd className=\"font-medium text-gray-900 break-words\">{customer.phone ?? \"—\"}</dd>\n </div>\n </dl>\n </div>\n </section>\n )}\n </>\n }\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport Link from \"next/link\";\nimport { useRouter } from \"next/navigation\";\nimport { Plus, X } from \"lucide-react\";\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport { formatDateTime, formatDate } from \"@/lib/utils\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"@/components/ui/table\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n} from \"@/components/ui/dialog\";\nimport DetailPageLayout from \"../../components/Admin/DetailPageLayout\";\nimport DetailPageHeader from \"../../components/Admin/DetailPageHeader\";\n\ninterface AddressRef {\n id: number;\n tag: string | null;\n line1: string | null;\n line2: string | null;\n city: string | null;\n state: string | null;\n postalCode: string | null;\n country: string | null;\n}\n\ninterface FormRef {\n id: number;\n name: string;\n}\n\ninterface SubmissionRef {\n id: number;\n formId: number;\n form?: FormRef;\n createdAt: string;\n}\n\ninterface OrderRef {\n id: number;\n orderNumber: string;\n status: string;\n total: number;\n currency: string;\n createdAt: string;\n}\n\ninterface PaymentRef {\n id: number;\n amount: number;\n currency: string;\n status: string;\n createdAt: string;\n}\n\ninterface ContactDetail {\n id: number;\n name: string;\n email: string;\n phone: string | null;\n type: string | null;\n company: string | null;\n taxId: string | null;\n notes: string | null;\n createdAt: string;\n form_submissions?: SubmissionRef[];\n orders?: OrderRef[];\n payments?: PaymentRef[];\n addresses?: AddressRef[];\n summary?: {\n totalOrders: number;\n totalPaid: number;\n lastOrderAt: string | null;\n };\n}\n\nfunction formatMoney(amount: number, currency: string = \"INR\"): string {\n return new Intl.NumberFormat(\"en-IN\", {\n style: \"currency\",\n currency,\n minimumFractionDigits: 2,\n }).format(Number(amount));\n}\n\nfunction formatAddress(a: AddressRef): string {\n const parts = [a.line1, a.line2, a.city, a.state, a.postalCode, a.country].filter(Boolean);\n return parts.join(\", \") || \"—\";\n}\n\nconst ADDRESS_TAGS = [{ value: \"\", label: \"—\" }, { value: \"default\", label: \"Default\" }, { value: \"billing\", label: \"Billing\" }, { value: \"shipping\", label: \"Shipping\" }];\n\nexport default function ContactDetailPage({ contactId }: { contactId: string }) {\n const router = useRouter();\n const [contact, setContact] = useState<ContactDetail | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [addAddressOpen, setAddAddressOpen] = useState(false);\n const [addAddressSaving, setAddAddressSaving] = useState(false);\n const [addAddressForm, setAddAddressForm] = useState({\n tag: \"\",\n line1: \"\",\n line2: \"\",\n city: \"\",\n state: \"\",\n postalCode: \"\",\n country: \"\",\n });\n\n const loadContact = () => {\n fetch(`/api/contacts/${contactId}`)\n .then((res) => (res.ok ? res.json() : null))\n .then((data) => setContact(data))\n .catch(() => setContact(null));\n };\n\n useEffect(() => {\n async function load() {\n try {\n setLoading(true);\n setError(null);\n const res = await fetch(`/api/contacts/${contactId}`);\n if (!res.ok) {\n if (res.status === 404) setError(\"Contact not found\");\n else setError(\"Failed to load\");\n setContact(null);\n return;\n }\n const data = await res.json();\n setContact(data);\n } catch {\n setError(\"Failed to load\");\n setContact(null);\n } finally {\n setLoading(false);\n }\n }\n load();\n }, [contactId]);\n\n const handleAddAddress = async (e: React.FormEvent) => {\n e.preventDefault();\n if (!contactId) return;\n setAddAddressSaving(true);\n try {\n const res = await fetch(\"/api/addresses\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n contactId: Number(contactId),\n tag: addAddressForm.tag || null,\n line1: addAddressForm.line1 || null,\n line2: addAddressForm.line2 || null,\n city: addAddressForm.city || null,\n state: addAddressForm.state || null,\n postalCode: addAddressForm.postalCode || null,\n country: addAddressForm.country || null,\n }),\n });\n if (res.ok) {\n setAddAddressOpen(false);\n setAddAddressForm({ tag: \"\", line1: \"\", line2: \"\", city: \"\", state: \"\", postalCode: \"\", country: \"\" });\n loadContact();\n }\n } finally {\n setAddAddressSaving(false);\n }\n };\n\n if (loading) {\n return (\n <div className=\"rounded-lg bg-white p-6 shadow-md\">\n <div className=\"flex justify-center py-12\">\n <span className=\"text-gray-500\">Loading...</span>\n </div>\n </div>\n );\n }\n\n if (error || !contact) {\n return (\n <div className=\"rounded-lg bg-white p-6 shadow-md\">\n <p className=\"text-red-600\">{error ?? \"Not found\"}</p>\n <Link href=\"/admin/contacts\">\n <Button variant=\"outline\" className=\"mt-4\">\n <X className=\"h-4 w-4 mr-2\" />\n Close\n </Button>\n </Link>\n </div>\n );\n }\n\n const submissions = contact.form_submissions ?? [];\n const orders = contact.orders ?? [];\n const payments = contact.payments ?? [];\n const addresses = contact.addresses ?? [];\n const summary = contact.summary ?? { totalOrders: 0, totalPaid: 0, lastOrderAt: null };\n\n return (\n <div className=\"rounded-lg bg-white shadow-md\">\n <DetailPageHeader\n title={contact.name}\n subtitle={contact.email}\n closeHref=\"/admin/contacts\"\n />\n\n <DetailPageLayout\n main={\n <>\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">\n Contact details\n </h2>\n <div className=\"min-w-0 overflow-hidden border border-gray-200 rounded-lg p-4 bg-gray-50/50\">\n <dl className=\"min-w-0 grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-3 text-sm\">\n <div className=\"min-w-0\">\n <dt className=\"text-gray-500\">Name</dt>\n <dd className=\"font-medium text-gray-900 break-words\">{contact.name}</dd>\n </div>\n <div className=\"min-w-0\">\n <dt className=\"text-gray-500\">Email</dt>\n <dd className=\"font-medium text-gray-900 break-words\">\n <a href={`mailto:${contact.email}`} className=\"text-blue-600 hover:underline\">\n {contact.email}\n </a>\n </dd>\n </div>\n <div className=\"min-w-0\">\n <dt className=\"text-gray-500\">Phone</dt>\n <dd className=\"font-medium text-gray-900 break-words\">{contact.phone ?? \"—\"}</dd>\n </div>\n {(contact.type ?? contact.company ?? contact.taxId) && (\n <>\n {contact.type && (\n <div className=\"min-w-0\">\n <dt className=\"text-gray-500\">Type</dt>\n <dd className=\"font-medium text-gray-900 break-words\">{contact.type}</dd>\n </div>\n )}\n {contact.company && (\n <div className=\"min-w-0\">\n <dt className=\"text-gray-500\">Company</dt>\n <dd className=\"font-medium text-gray-900 break-words\">{contact.company}</dd>\n </div>\n )}\n {contact.taxId && (\n <div className=\"min-w-0\">\n <dt className=\"text-gray-500\">Tax ID</dt>\n <dd className=\"font-medium text-gray-900 break-words\">{contact.taxId}</dd>\n </div>\n )}\n </>\n )}\n <div className=\"min-w-0\">\n <dt className=\"text-gray-500\">Created</dt>\n <dd className=\"font-medium text-gray-900\">{formatDateTime(contact.createdAt)}</dd>\n </div>\n {contact.notes && (\n <div className=\"min-w-0 sm:col-span-2 lg:col-span-4\">\n <dt className=\"text-gray-500\">Notes</dt>\n <dd className=\"font-medium text-gray-900 mt-0.5 whitespace-pre-wrap break-words\">{contact.notes}</dd>\n </div>\n )}\n </dl>\n </div>\n </section>\n\n <section>\n <div className=\"flex items-center justify-between mb-2\">\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider\">\n Addresses\n </h2>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setAddAddressOpen(true)}\n className=\"inline-flex items-center gap-1\"\n >\n <Plus className=\"h-3.5 w-3.5\" /> Add address\n </Button>\n </div>\n <div className=\"min-w-0 overflow-x-auto border border-gray-200 rounded-lg\">\n <Table>\n <TableHeader>\n <TableRow className=\"bg-gray-50\">\n <TableHead className=\"font-medium\">Tag</TableHead>\n <TableHead className=\"font-medium\">Address</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {addresses.length === 0 ? (\n <TableRow>\n <TableCell colSpan={2} className=\"py-6 text-center text-gray-500\">\n No addresses. Add one to manage billing and shipping for this contact.\n </TableCell>\n </TableRow>\n ) : (\n addresses.map((a) => (\n <TableRow key={a.id}>\n <TableCell className=\"font-medium\">{a.tag ?? \"—\"}</TableCell>\n <TableCell className=\"text-gray-700 break-words min-w-0\">{formatAddress(a)}</TableCell>\n </TableRow>\n ))\n )}\n </TableBody>\n </Table>\n </div>\n </section>\n </>\n }\n sidebar={\n <>\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">\n Summary\n </h2>\n <div className=\"min-w-0 overflow-hidden border border-gray-200 rounded-lg p-4 bg-gray-50/50\">\n <dl className=\"min-w-0 grid grid-cols-1 sm:grid-cols-3 gap-3 text-sm\">\n <div>\n <dt className=\"text-gray-500\">Total orders</dt>\n <dd className=\"font-medium text-gray-900\">{summary.totalOrders}</dd>\n </div>\n <div>\n <dt className=\"text-gray-500\">Total paid</dt>\n <dd className=\"font-medium text-gray-900\">{formatMoney(summary.totalPaid, \"INR\")}</dd>\n </div>\n <div>\n <dt className=\"text-gray-500\">Last order</dt>\n <dd className=\"font-medium text-gray-900\">\n {summary.lastOrderAt ? formatDate(summary.lastOrderAt) : \"—\"}\n </dd>\n </div>\n </dl>\n </div>\n </section>\n\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">\n Submissions\n </h2>\n <div className=\"min-w-0 overflow-x-auto border border-gray-200 rounded-lg\">\n <Table>\n <TableHeader>\n <TableRow className=\"bg-gray-50\">\n <TableHead className=\"font-medium\">Form</TableHead>\n <TableHead className=\"font-medium\">Submitted</TableHead>\n <TableHead className=\"font-medium w-20\"></TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {submissions.length === 0 ? (\n <TableRow>\n <TableCell colSpan={3} className=\"py-6 text-center text-gray-500\">\n No submissions\n </TableCell>\n </TableRow>\n ) : (\n submissions.map((s) => (\n <TableRow key={s.id}>\n <TableCell className=\"font-medium\">{s.form?.name ?? `Form #${s.formId}`}</TableCell>\n <TableCell className=\"text-gray-600\">{formatDateTime(s.createdAt)}</TableCell>\n <TableCell>\n <Link\n href={`/admin/form-submissions/${s.id}/view`}\n className=\"text-blue-600 hover:underline text-sm\"\n >\n View\n </Link>\n </TableCell>\n </TableRow>\n ))\n )}\n </TableBody>\n </Table>\n </div>\n </section>\n\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">\n Orders\n </h2>\n <div className=\"min-w-0 overflow-x-auto border border-gray-200 rounded-lg\">\n <Table>\n <TableHeader>\n <TableRow className=\"bg-gray-50\">\n <TableHead className=\"font-medium\">Order #</TableHead>\n <TableHead className=\"font-medium\">Total</TableHead>\n <TableHead className=\"font-medium\">Date</TableHead>\n <TableHead className=\"font-medium w-20\"></TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {orders.length === 0 ? (\n <TableRow>\n <TableCell colSpan={4} className=\"py-6 text-center text-gray-500\">\n No orders\n </TableCell>\n </TableRow>\n ) : (\n orders.map((o) => (\n <TableRow key={o.id}>\n <TableCell className=\"font-medium\">{o.orderNumber ?? `#${o.id}`}</TableCell>\n <TableCell className=\"text-gray-600\">{formatMoney(Number(o.total), o.currency)}</TableCell>\n <TableCell className=\"text-gray-600\">{formatDateTime(o.createdAt)}</TableCell>\n <TableCell>\n <Link\n href={`/admin/orders/${o.id}/view`}\n className=\"text-blue-600 hover:underline text-sm\"\n >\n View\n </Link>\n </TableCell>\n </TableRow>\n ))\n )}\n </TableBody>\n </Table>\n </div>\n </section>\n\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">\n Payments\n </h2>\n <div className=\"min-w-0 overflow-x-auto border border-gray-200 rounded-lg\">\n <Table>\n <TableHeader>\n <TableRow className=\"bg-gray-50\">\n <TableHead className=\"font-medium\">Amount</TableHead>\n <TableHead className=\"font-medium\">Status</TableHead>\n <TableHead className=\"font-medium\">Date</TableHead>\n <TableHead className=\"font-medium w-20\"></TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {payments.length === 0 ? (\n <TableRow>\n <TableCell colSpan={4} className=\"py-6 text-center text-gray-500\">\n No payments\n </TableCell>\n </TableRow>\n ) : (\n payments.map((p) => (\n <TableRow key={p.id}>\n <TableCell className=\"font-medium\">{formatMoney(Number(p.amount), p.currency)}</TableCell>\n <TableCell className=\"capitalize text-gray-600\">{p.status}</TableCell>\n <TableCell className=\"text-gray-600\">{formatDateTime(p.createdAt)}</TableCell>\n <TableCell>\n <Link\n href={`/admin/payments/${p.id}/view`}\n className=\"text-blue-600 hover:underline text-sm\"\n >\n View\n </Link>\n </TableCell>\n </TableRow>\n ))\n )}\n </TableBody>\n </Table>\n </div>\n </section>\n </>\n }\n />\n\n <Dialog open={addAddressOpen} onOpenChange={setAddAddressOpen}>\n <DialogContent className=\"max-w-md\">\n <DialogHeader>\n <DialogTitle>Add address</DialogTitle>\n </DialogHeader>\n <form onSubmit={handleAddAddress} className=\"space-y-3\">\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">Tag</label>\n <select\n value={addAddressForm.tag}\n onChange={(e) => setAddAddressForm((f) => ({ ...f, tag: e.target.value }))}\n className=\"w-full rounded border border-gray-300 px-3 py-2 text-sm\"\n >\n {ADDRESS_TAGS.map((o) => (\n <option key={o.value || \"empty\"} value={o.value}>{o.label}</option>\n ))}\n </select>\n </div>\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">Line 1</label>\n <Input\n value={addAddressForm.line1}\n onChange={(e) => setAddAddressForm((f) => ({ ...f, line1: e.target.value }))}\n className=\"w-full\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">Line 2</label>\n <Input\n value={addAddressForm.line2}\n onChange={(e) => setAddAddressForm((f) => ({ ...f, line2: e.target.value }))}\n className=\"w-full\"\n />\n </div>\n <div className=\"grid grid-cols-2 gap-2\">\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">City</label>\n <Input\n value={addAddressForm.city}\n onChange={(e) => setAddAddressForm((f) => ({ ...f, city: e.target.value }))}\n className=\"w-full\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">State</label>\n <Input\n value={addAddressForm.state}\n onChange={(e) => setAddAddressForm((f) => ({ ...f, state: e.target.value }))}\n className=\"w-full\"\n />\n </div>\n </div>\n <div className=\"grid grid-cols-2 gap-2\">\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">Postal code</label>\n <Input\n value={addAddressForm.postalCode}\n onChange={(e) => setAddAddressForm((f) => ({ ...f, postalCode: e.target.value }))}\n className=\"w-full\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">Country</label>\n <Input\n value={addAddressForm.country}\n onChange={(e) => setAddAddressForm((f) => ({ ...f, country: e.target.value }))}\n className=\"w-full\"\n />\n </div>\n </div>\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={() => setAddAddressOpen(false)}>\n Cancel\n </Button>\n <Button type=\"submit\" disabled={addAddressSaving}>\n {addAddressSaving ? \"Saving…\" : \"Add address\"}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n </div>\n );\n}\n","'use client';\n\nimport { useState, useEffect, useContext } from 'react';\nimport { useSearchParams } from 'next/navigation';\nimport { Button } from '@/components/ui/button';\nimport { Input } from '@/components/ui/input';\nimport { Switch } from '@/components/ui/switch';\nimport { Label } from '@/components/ui/label';\nimport { toast } from 'sonner';\nimport { Save, RotateCcw } from 'lucide-react';\nimport { AdminConfigContext } from '../admin-config-context';\nimport NavbarEditor from '../../components/Admin/NavbarEditor';\nimport type { NavbarConfig } from '../../theme/types';\n\ntype SettingsTab = 'appearance' | 'navbar' | 'store';\n\ninterface AdminViewSettings {\n primaryColor: string;\n secondaryColor: string;\n compactView: string;\n}\n\nconst DEFAULTS: AdminViewSettings = {\n primaryColor: '#313996',\n secondaryColor: '#6366f1',\n compactView: 'false',\n};\n\nfunction hexToHsl(hex: string): string {\n const r = parseInt(hex.slice(1, 3), 16) / 255;\n const g = parseInt(hex.slice(3, 5), 16) / 255;\n const b = parseInt(hex.slice(5, 7), 16) / 255;\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n const l = (max + min) / 2;\n if (max === min) return `0 0% ${Math.round(l * 100)}%`;\n const d = max - min;\n const s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n let h = 0;\n if (max === r) h = ((g - b) / d + (g < b ? 6 : 0)) / 6;\n else if (max === g) h = ((b - r) / d + 2) / 6;\n else h = ((r - g) / d + 4) / 6;\n return `${Math.round(h * 360)} ${Math.round(s * 100)}% ${Math.round(l * 100)}%`;\n}\n\nexport default function SettingsPage() {\n const searchParams = useSearchParams();\n const tabParam = searchParams.get('tab') as SettingsTab | null;\n const { theme, themeRegistry } = useContext(AdminConfigContext);\n const [tab, setTab] = useState<SettingsTab>(\n tabParam === 'navbar' ? 'navbar' : tabParam === 'store' ? 'store' : 'appearance'\n );\n useEffect(() => {\n if (tabParam === 'navbar') setTab('navbar');\n else if (tabParam === 'store') setTab('store');\n }, [tabParam]);\n\n const [settings, setSettings] = useState<AdminViewSettings>(DEFAULTS);\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n\n const [activeThemeId, setActiveThemeId] = useState('');\n const [navbarConfig, setNavbarConfig] = useState<NavbarConfig>({ logo: '', items: [], ctaLabel: '', ctaUrl: '' });\n const [themeSettingsLoading, setThemeSettingsLoading] = useState(true);\n\n const [storeEnabled, setStoreEnabled] = useState(false);\n const [storeSettingsLoading, setStoreSettingsLoading] = useState(true);\n\n useEffect(() => {\n fetch('/api/settings/admin_view')\n .then((r) => (r.ok ? r.json() : {}))\n .then((data: Record<string, string>) => {\n setSettings({\n primaryColor: data.primaryColor || DEFAULTS.primaryColor,\n secondaryColor: data.secondaryColor || DEFAULTS.secondaryColor,\n compactView: data.compactView || DEFAULTS.compactView,\n });\n })\n .finally(() => setLoading(false));\n }, []);\n\n useEffect(() => {\n fetch('/api/settings/theme')\n .then((r) => (r.ok ? r.json() : null))\n .then((data: Record<string, string> | null) => {\n if (!data) return;\n setActiveThemeId((data.activeThemeId || '').trim());\n if (data.navbar) {\n try { setNavbarConfig(JSON.parse(data.navbar)); } catch {}\n }\n })\n .finally(() => setThemeSettingsLoading(false));\n }, []);\n\n useEffect(() => {\n fetch('/api/settings/store')\n .then((r) => (r.ok ? r.json() : {}))\n .then((data: Record<string, string>) => {\n setStoreEnabled(data.enabled === 'true');\n })\n .finally(() => setStoreSettingsLoading(false));\n }, []);\n\n const handleSaveAppearance = async () => {\n setSaving(true);\n try {\n const body: Record<string, { value: string; type: 'public' | 'private' }> = {\n primaryColor: { value: settings.primaryColor, type: 'public' },\n secondaryColor: { value: settings.secondaryColor, type: 'public' },\n compactView: { value: settings.compactView, type: 'public' },\n };\n const res = await fetch('/api/settings/admin_view', {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n if (!res.ok) throw new Error();\n document.documentElement.style.setProperty('--primary', hexToHsl(settings.primaryColor));\n document.documentElement.style.setProperty('--primary-foreground', '0 0% 100%');\n document.documentElement.style.setProperty('--secondary', hexToHsl(settings.secondaryColor));\n if (settings.compactView === 'true') document.documentElement.classList.add('compact');\n else document.documentElement.classList.remove('compact');\n toast.success('Settings saved');\n } catch {\n toast.error('Failed to save settings');\n } finally {\n setSaving(false);\n }\n };\n\n const handleSelectTheme = async (id: string) => {\n setActiveThemeId(id);\n setSaving(true);\n try {\n await fetch('/api/settings/theme', {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ activeThemeId: { value: id, type: 'public' as const } }),\n });\n toast.success('Theme updated');\n window.location.reload();\n } catch {\n toast.error('Failed to save theme');\n } finally {\n setSaving(false);\n }\n };\n\n const handleSaveNavbar = async () => {\n setSaving(true);\n try {\n await fetch('/api/settings/theme', {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ navbar: { value: JSON.stringify(navbarConfig), type: 'public' } }),\n });\n toast.success('Navbar saved');\n } catch {\n toast.error('Failed to save');\n } finally {\n setSaving(false);\n }\n };\n\n const handleSaveStore = async () => {\n setSaving(true);\n try {\n await fetch('/api/settings/store', {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ enabled: { value: storeEnabled ? 'true' : 'false', type: 'public' } }),\n });\n toast.success('Store settings saved');\n window.location.reload();\n } catch {\n toast.error('Failed to save store settings');\n } finally {\n setSaving(false);\n }\n };\n\n const handleReset = () => setSettings(DEFAULTS);\n\n const tabs: { id: SettingsTab; label: string }[] = [\n { id: 'appearance', label: 'Appearance' },\n { id: 'navbar', label: 'Navbar & pages' },\n { id: 'store', label: 'Store' },\n ];\n\n if (loading) {\n return (\n <div className=\"flex justify-center py-8\">\n <div className=\"animate-spin rounded-full h-6 w-6 border-2 border-gray-300 border-t-gray-600\" />\n <span className=\"ml-2\">Loading...</span>\n </div>\n );\n }\n\n return (\n <div className=\"min-w-0 rounded-lg bg-white shadow-md\">\n <div className=\"bg-gray-800 border-b border-gray-700 px-4 py-2.5 rounded-t-lg\">\n <h1 className=\"text-base font-semibold text-white\">Settings</h1>\n <p className=\"text-xs text-gray-300 mt-0.5\">Appearance, navbar, and store configuration</p>\n </div>\n\n <div className=\"border-b flex\">\n {tabs.map((t) => (\n <button\n key={t.id}\n className={`px-4 py-2.5 text-sm font-medium border-b-2 ${tab === t.id ? 'border-gray-800 text-gray-800 bg-white' : 'border-transparent text-gray-500 hover:text-gray-700'}`}\n onClick={() => setTab(t.id)}\n >\n {t.label}\n </button>\n ))}\n </div>\n\n <div className=\"min-w-0 p-6\">\n {tab === 'appearance' && (\n <div className=\"space-y-10\">\n {/* Site theme – compact cards */}\n {themeRegistry && themeRegistry.length > 0 && (\n <div>\n <h2 className=\"text-xs font-semibold text-gray-500 uppercase tracking-wider mb-3\">Site theme</h2>\n <div className=\"grid grid-cols-4 sm:grid-cols-6 lg:grid-cols-8 gap-2\">\n {themeRegistry.map((t) => {\n const isActive = (activeThemeId || themeRegistry[0]?.id) === t.id;\n return (\n <button\n key={t.id}\n type=\"button\"\n onClick={() => handleSelectTheme(t.id)}\n disabled={saving}\n className={`text-left rounded border p-1.5 transition-colors ${isActive ? 'border-blue-500 bg-blue-50/60 ring-1 ring-blue-500/30' : 'border-gray-200 hover:border-gray-300 bg-white'}`}\n >\n {t.image ? (\n <div className=\"aspect-[4/3] rounded bg-gray-100 mb-1 overflow-hidden\">\n <img src={t.image} alt=\"\" className=\"w-full h-full object-cover\" />\n </div>\n ) : (\n <div className=\"aspect-[4/3] rounded bg-gray-100 mb-1 flex items-center justify-center text-gray-300 text-[10px]\">—</div>\n )}\n <p className=\"font-medium text-gray-900 text-[11px] truncate leading-tight\">{t.label}</p>\n {t.description && <p className=\"text-[10px] text-gray-500 truncate leading-tight mt-0.5\" title={t.description}>{t.description}</p>}\n {isActive && <span className=\"text-[9px] font-medium text-blue-600 uppercase tracking-wide\">Active</span>}\n </button>\n );\n })}\n </div>\n </div>\n )}\n\n {/* Admin appearance – compact */}\n <div className=\"border-t border-gray-100 pt-6\">\n <h2 className=\"text-xs font-semibold text-gray-500 uppercase tracking-wider mb-2\">Admin theme colors</h2>\n <div className=\"flex flex-wrap items-center gap-4\">\n <div className=\"flex items-center gap-2\">\n <Label className=\"text-[11px] text-gray-500 w-14 shrink-0\">Primary</Label>\n <input type=\"color\" value={settings.primaryColor} onChange={(e) => setSettings({ ...settings, primaryColor: e.target.value })} className=\"h-6 w-8 rounded border border-gray-300 cursor-pointer shrink-0\" />\n <Input value={settings.primaryColor} onChange={(e) => setSettings({ ...settings, primaryColor: e.target.value })} className=\"h-7 w-20 font-mono text-[11px]\" maxLength={7} />\n </div>\n <div className=\"flex items-center gap-2\">\n <Label className=\"text-[11px] text-gray-500 w-14 shrink-0\">Secondary</Label>\n <input type=\"color\" value={settings.secondaryColor} onChange={(e) => setSettings({ ...settings, secondaryColor: e.target.value })} className=\"h-6 w-8 rounded border border-gray-300 cursor-pointer shrink-0\" />\n <Input value={settings.secondaryColor} onChange={(e) => setSettings({ ...settings, secondaryColor: e.target.value })} className=\"h-7 w-20 font-mono text-[11px]\" maxLength={7} />\n </div>\n </div>\n </div>\n\n <div className=\"border-t border-gray-100 pt-4\">\n <div className=\"flex items-center gap-2\">\n <Switch checked={settings.compactView === 'true'} onCheckedChange={(c) => setSettings({ ...settings, compactView: c ? 'true' : 'false' })} className=\"scale-90\" />\n <Label className=\"text-[11px] text-gray-600\">Compact view</Label>\n <span className=\"text-[11px] text-gray-400\">Smaller spacing in admin</span>\n </div>\n </div>\n </div>\n )}\n\n {tab === 'navbar' && (\n <div className=\"space-y-6\">\n {themeSettingsLoading ? (\n <div className=\"flex items-center gap-2 text-gray-500\">Loading...</div>\n ) : (\n <>\n <div>\n <h2 className=\"text-lg font-semibold text-gray-900 mb-2\">Navbar & pages</h2>\n <p className=\"text-sm text-gray-500 mb-4\">Set logo and menu items. Use parent/child (indent/outdent) for hierarchy. Each item can link to a page or a custom URL.</p>\n <NavbarEditor config={navbarConfig} onChange={setNavbarConfig} />\n </div>\n <Button onClick={handleSaveNavbar} disabled={saving}>{saving ? 'Saving...' : 'Save navbar'}</Button>\n </>\n )}\n </div>\n )}\n\n {tab === 'store' && (\n <div className=\"space-y-6\">\n {storeSettingsLoading ? (\n <div className=\"flex items-center gap-2 text-gray-500\">Loading...</div>\n ) : (\n <>\n <div>\n <h2 className=\"text-lg font-semibold text-gray-900 mb-2\">Store / E-commerce</h2>\n <p className=\"text-sm text-gray-500 mb-4\">Enable e-commerce functionality to manage products, orders, payments, and more.</p>\n <div className=\"flex items-center gap-3 p-4 bg-gray-50 rounded-lg border border-gray-200\">\n <Switch checked={storeEnabled} onCheckedChange={setStoreEnabled} />\n <div>\n <Label className=\"text-sm font-medium text-gray-700\">Enable Store</Label>\n <p className=\"text-xs text-gray-500\">Shows Store section in sidebar with Products, Orders, Payments, etc.</p>\n </div>\n </div>\n </div>\n <Button onClick={handleSaveStore} disabled={saving}><Save className=\"h-4 w-4 mr-2\" />{saving ? 'Saving...' : 'Save'}</Button>\n </>\n )}\n </div>\n )}\n </div>\n\n {tab === 'appearance' && (\n <div className=\"bg-gray-50 border-t px-6 py-4 flex justify-between rounded-b-lg\">\n <Button variant=\"outline\" onClick={handleReset}><RotateCcw className=\"h-4 w-4 mr-2\" />Reset to defaults</Button>\n <Button onClick={handleSaveAppearance} disabled={saving}><Save className=\"h-4 w-4 mr-2\" />{saving ? 'Saving...' : 'Save'}</Button>\n </div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport React, { useState, useEffect, useCallback, useRef } from 'react';\nimport { Button } from '@/components/ui/button';\nimport { Input } from '@/components/ui/input';\nimport {\n Pagination,\n PaginationContent,\n PaginationItem,\n PaginationPrevious,\n PaginationNext,\n PaginationLink,\n} from '@/components/ui/pagination';\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n} from '@/components/ui/dialog';\nimport { formatDate } from '@/lib/utils';\nimport { Upload, Search, Image as ImageIcon, FileText, Film, File, Copy, Trash2, Edit2 } from 'lucide-react';\nimport { toast } from 'sonner';\n\ninterface MediaItem {\n id: number;\n filename: string;\n url: string;\n mimeType: string;\n size: number;\n alt: string | null;\n isPublic: boolean;\n createdAt: string;\n}\n\nfunction getTypeCategory(mime: string): string {\n if (!mime) return 'other';\n if (mime.startsWith('image/')) return 'image';\n if (mime.startsWith('video/')) return 'video';\n if (mime.startsWith('audio/')) return 'audio';\n if (mime === 'application/pdf' || mime.startsWith('application/')) return 'document';\n return 'other';\n}\n\nfunction getTypeLabel(mime: string): string {\n const c = getTypeCategory(mime);\n const labels: Record<string, string> = {\n image: 'Image',\n video: 'Video',\n audio: 'Audio',\n document: 'Document',\n other: 'Other',\n };\n return labels[c] || 'Other';\n}\n\nfunction TypeIcon({ mimeType }: { mimeType: string }) {\n const c = getTypeCategory(mimeType);\n if (c === 'image') return <ImageIcon className=\"h-8 w-8 text-gray-400\" />;\n if (c === 'video') return <Film className=\"h-8 w-8 text-gray-400\" />;\n if (c === 'document') return <FileText className=\"h-8 w-8 text-gray-400\" />;\n return <File className=\"h-8 w-8 text-gray-400\" />;\n}\n\nfunction groupByMonth(items: MediaItem[]): Record<string, MediaItem[]> {\n const groups: Record<string, MediaItem[]> = {};\n items.forEach((item) => {\n const d = new Date(item.createdAt);\n const key = `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}`;\n const label = d.toLocaleDateString('en-US', { year: 'numeric', month: 'long' });\n if (!groups[label]) groups[label] = [];\n groups[label].push(item);\n });\n return groups;\n}\n\nexport default function MediaLibraryPage() {\n const [data, setData] = useState<MediaItem[]>([]);\n const [loading, setLoading] = useState(true);\n const [page, setPage] = useState(1);\n const [totalPages, setTotalPages] = useState(1);\n const [search, setSearch] = useState('');\n const [searchInput, setSearchInput] = useState('');\n const [typeFilter, setTypeFilter] = useState<string>('');\n const [uploading, setUploading] = useState(false);\n const [editModal, setEditModal] = useState<MediaItem | null>(null);\n const [editAlt, setEditAlt] = useState('');\n const [editPublic, setEditPublic] = useState(false);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const load = useCallback(async () => {\n setLoading(true);\n const params = new URLSearchParams({\n page: String(page),\n limit: '24',\n sortField: 'createdAt',\n sortOrder: 'desc',\n });\n if (search) params.set('search', search);\n if (typeFilter) params.set('type', typeFilter);\n try {\n const res = await fetch(`/api/media?${params}`);\n if (!res.ok) throw new Error('Failed to load');\n const json = await res.json();\n setData(Array.isArray(json.data) ? json.data : []);\n setTotalPages(json.totalPages || 1);\n } catch {\n setData([]);\n setTotalPages(1);\n } finally {\n setLoading(false);\n }\n }, [page, search, typeFilter]);\n\n useEffect(() => {\n load();\n }, [load]);\n\n const handleSearch = () => setSearch(searchInput.trim());\n\n const handleUpload = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n setUploading(true);\n try {\n const formData = new FormData();\n formData.append('file', file);\n const uploadRes = await fetch('/api/upload', { method: 'POST', body: formData });\n const uploadJson = await uploadRes.json();\n if (!uploadRes.ok) throw new Error(uploadJson.error || 'Upload failed');\n const filePath = uploadJson.filePath ?? uploadJson.url;\n if (!filePath) throw new Error('No file path returned');\n const createRes = await fetch('/api/media', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n filename: file.name,\n url: filePath.startsWith('http') ? filePath : filePath,\n mimeType: file.type || 'application/octet-stream',\n size: file.size,\n alt: null,\n isPublic: false,\n }),\n });\n if (!createRes.ok) throw new Error('Failed to create media record');\n toast.success('File uploaded');\n load();\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Upload failed');\n } finally {\n setUploading(false);\n e.target.value = '';\n }\n };\n\n const handleDelete = async (id: number) => {\n if (!confirm('Delete this file?')) return;\n try {\n const res = await fetch(`/api/media/${id}`, { method: 'DELETE' });\n if (!res.ok) throw new Error('Delete failed');\n toast.success('Deleted');\n load();\n } catch {\n toast.error('Delete failed');\n }\n };\n\n const handleSaveEdit = async () => {\n if (!editModal) return;\n try {\n const res = await fetch(`/api/media/${editModal.id}`, {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ alt: editAlt || null, isPublic: editPublic }),\n });\n if (!res.ok) throw new Error('Update failed');\n toast.success('Updated');\n setEditModal(null);\n load();\n } catch {\n toast.error('Update failed');\n }\n };\n\n const copyUrl = (url: string) => {\n const full = url.startsWith('http') ? url : `${typeof window !== 'undefined' ? window.location.origin : ''}${url}`;\n navigator.clipboard.writeText(full);\n toast.success('URL copied');\n };\n\n const openEdit = (item: MediaItem) => {\n setEditModal(item);\n setEditAlt(item.alt || '');\n setEditPublic(item.isPublic);\n };\n\n const grouped = groupByMonth(data);\n const isImage = (mime: string) => getTypeCategory(mime) === 'image';\n\n return (\n <div className=\"min-w-0 rounded-lg bg-white shadow-md\">\n <div className=\"bg-gray-800 border-b border-gray-700 px-4 py-2.5 rounded-t-lg\">\n <h1 className=\"text-base font-semibold text-white\">Media Library</h1>\n <p className=\"text-xs text-gray-300 mt-0.5\">Upload and manage files. Group by type or date.</p>\n </div>\n <div className=\"min-w-0 p-4 space-y-3\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <input\n ref={fileInputRef}\n type=\"file\"\n className=\"hidden\"\n onChange={handleUpload}\n disabled={uploading}\n accept=\"image/*,video/*,audio/*,.pdf,.doc,.docx\"\n />\n <Button\n type=\"button\"\n className=\"flex items-center gap-2\"\n disabled={uploading}\n onClick={() => fileInputRef.current?.click()}\n >\n <Upload className=\"h-4 w-4\" />\n {uploading ? 'Uploading...' : 'Upload'}\n </Button>\n <div className=\"flex items-center gap-2 flex-1 min-w-[200px]\">\n <Input\n placeholder=\"Search by filename...\"\n value={searchInput}\n onChange={(e) => setSearchInput(e.target.value)}\n onKeyDown={(e) => e.key === 'Enter' && handleSearch()}\n />\n <Button variant=\"secondary\" onClick={handleSearch}>\n <Search className=\"h-4 w-4\" />\n </Button>\n </div>\n <select\n className=\"border rounded-md px-3 py-2 text-sm bg-white\"\n value={typeFilter}\n onChange={(e) => setTypeFilter(e.target.value)}\n >\n <option value=\"\">All types</option>\n <option value=\"image\">Images</option>\n <option value=\"video\">Videos</option>\n <option value=\"audio\">Audio</option>\n <option value=\"application\">Documents</option>\n </select>\n </div>\n\n {loading ? (\n <div className=\"flex justify-center py-12\">\n <div className=\"animate-spin rounded-full h-8 w-8 border-2 border-gray-300 border-t-gray-600\" />\n </div>\n ) : data.length === 0 ? (\n <div className=\"text-center py-12 text-gray-500\">No media yet. Upload a file to get started.</div>\n ) : (\n <div className=\"space-y-8\">\n {Object.entries(grouped).map(([monthLabel, items]) => (\n <div key={monthLabel}>\n <h2 className=\"text-sm font-semibold text-gray-500 uppercase tracking-wider mb-3\">{monthLabel}</h2>\n <div className=\"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-6 gap-4\">\n {items.map((item) => (\n <div\n key={item.id}\n className=\"border rounded-lg overflow-hidden bg-gray-50 hover:bg-gray-100 transition-colors group\"\n >\n <div className=\"aspect-square flex items-center justify-center bg-gray-200 relative\">\n {isImage(item.mimeType) ? (\n <img\n src={item.url}\n alt={item.alt || item.filename}\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <TypeIcon mimeType={item.mimeType} />\n )}\n <div className=\"absolute inset-0 bg-black/0 group-hover:bg-black/40 transition-colors flex items-center justify-center gap-1 opacity-0 group-hover:opacity-100\">\n <Button\n size=\"icon\"\n variant=\"secondary\"\n className=\"h-8 w-8\"\n onClick={() => copyUrl(item.url)}\n >\n <Copy className=\"h-3 w-3\" />\n </Button>\n <Button size=\"icon\" variant=\"secondary\" className=\"h-8 w-8\" onClick={() => openEdit(item)}>\n <Edit2 className=\"h-3 w-3\" />\n </Button>\n <Button\n size=\"icon\"\n variant=\"destructive\"\n className=\"h-8 w-8\"\n onClick={() => handleDelete(item.id)}\n >\n <Trash2 className=\"h-3 w-3\" />\n </Button>\n </div>\n </div>\n <div className=\"p-2\">\n <p className=\"text-xs font-medium text-gray-900 truncate\" title={item.filename}>\n {item.filename}\n </p>\n <div className=\"flex items-center justify-between mt-1\">\n <span className=\"text-xs text-gray-500\">{formatDate(item.createdAt)}</span>\n <span className=\"text-xs px-1.5 py-0.5 rounded bg-gray-200 text-gray-600\">\n {getTypeLabel(item.mimeType)}\n </span>\n </div>\n {item.isPublic && (\n <span className=\"text-xs text-green-600 mt-0.5 block\">Public</span>\n )}\n </div>\n </div>\n ))}\n </div>\n </div>\n ))}\n </div>\n )}\n\n {totalPages > 1 && (\n <Pagination className=\"mt-6\">\n <PaginationContent>\n <PaginationItem>\n <PaginationPrevious\n onClick={() => page > 1 && setPage(page - 1)}\n className={page <= 1 ? 'pointer-events-none opacity-50' : 'cursor-pointer'}\n />\n </PaginationItem>\n {Array.from({ length: Math.min(5, totalPages) }, (_, i) => {\n const p = i + 1;\n return (\n <PaginationItem key={p}>\n <PaginationLink onClick={() => setPage(p)} isActive={page === p}>\n {p}\n </PaginationLink>\n </PaginationItem>\n );\n })}\n <PaginationItem>\n <PaginationNext\n onClick={() => page < totalPages && setPage(page + 1)}\n className={page >= totalPages ? 'pointer-events-none opacity-50' : 'cursor-pointer'}\n />\n </PaginationItem>\n </PaginationContent>\n </Pagination>\n )}\n </div>\n\n <Dialog open={!!editModal} onOpenChange={(open) => !open && setEditModal(null)}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Edit media</DialogTitle>\n </DialogHeader>\n {editModal && (\n <div className=\"space-y-4 py-2\">\n <div>\n <label className=\"text-sm font-medium\">Alt text</label>\n <Input\n value={editAlt}\n onChange={(e) => setEditAlt(e.target.value)}\n placeholder=\"Description for accessibility\"\n className=\"mt-1\"\n />\n </div>\n <div className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n id=\"edit-public\"\n checked={editPublic}\n onChange={(e) => setEditPublic(e.target.checked)}\n />\n <label htmlFor=\"edit-public\" className=\"text-sm\">\n Public (visible on site)\n </label>\n </div>\n </div>\n )}\n <DialogFooter>\n <Button variant=\"outline\" onClick={() => setEditModal(null)}>\n Cancel\n </Button>\n <Button onClick={handleSaveEdit}>Save</Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </div>\n );\n}\n","\"use client\";\n\nimport { useState, useEffect, useContext, useCallback, useRef } from \"react\";\nimport { Editor, Frame, Element, useEditor, useNode } from \"@craftjs/core\";\nimport { Input } from \"@/components/ui/input\";\nimport { Button } from \"@/components/ui/button\";\nimport { Label } from \"@/components/ui/label\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { Textarea } from \"@/components/ui/textarea\";\nimport { Save, X, ChevronDown, ChevronRight, LayoutDashboard, Layers, Box, SlidersHorizontal } from \"lucide-react\";\nimport { useRouter } from \"next/navigation\";\nimport ComponentSettings from \"../../components/Admin/ComponentSettings\";\nimport { AdminConfigContext } from \"../admin-config-context\";\nimport { getCatalog, buildResolver } from \"../../theme/registry\";\nimport type { ThemeConfig, ComponentMeta } from \"../../theme/types\";\nimport * as LucideIcons from \"lucide-react\";\n\n/** Wraps a theme component so it is selectable and draggable in the editor (useNode + connect/drag). */\nfunction createSelectable(Comp: React.ComponentType<any>): React.ComponentType<any> {\n function SelectableWrapper(props: any) {\n const { id, connectors, displayName, isHovered } = useNode((node) => ({\n displayName: (node.data?.props?.custom as any)?.displayName || node.data?.displayName || (typeof node.data?.type === \"string\" ? node.data.type : (node.data?.type as any)?.resolvedName) || \"Component\",\n isHovered: node.events.hovered,\n }));\n const { connect, drag } = connectors;\n const isSelected = useEditor((state) => state.events.selected.has(id));\n const borderCls = isSelected ? \"border border-dotted border-blue-500\" : isHovered ? \"border border-dotted border-gray-200\" : \"border border-transparent\";\n return (\n <div\n ref={(ref) => { if (ref) connect(drag(ref)); }}\n className={`min-h-[24px] w-full rounded ${borderCls}`}\n title={displayName}\n >\n <Comp {...props} />\n </div>\n );\n }\n (SelectableWrapper as any).craft = (Comp as any).craft;\n return SelectableWrapper;\n}\n\nfunction buildEditorResolver(theme: ThemeConfig): Record<string, React.ComponentType<any>> {\n const base = buildResolver(theme);\n const resolver: Record<string, React.ComponentType<any>> = {};\n for (const [name, Comp] of Object.entries(base)) {\n resolver[name] = createSelectable(Comp);\n }\n return resolver;\n}\n\nfunction getIcon(name: string) {\n const Icon = (LucideIcons as any)[name];\n return Icon || LucideIcons.Box;\n}\n\nfunction DraggableCatalogItem({\n meta,\n Comp,\n connectors,\n Icon,\n description,\n}: {\n meta: ComponentMeta;\n Comp: React.ComponentType<any>;\n connectors: ReturnType<typeof useEditor>[\"connectors\"];\n Icon: React.ComponentType<{ className?: string }>;\n description?: string;\n}) {\n const elRef = useRef<HTMLDivElement>(null);\n useEffect(() => {\n if (!elRef.current) return;\n if (meta.canContainChildren) {\n connectors.create(\n elRef.current,\n React.createElement(Element, { is: Comp, canvas: true, ...meta.defaultProps })\n );\n } else {\n connectors.create(elRef.current, React.createElement(Comp, meta.defaultProps));\n }\n }, [connectors, Comp, meta.defaultProps, meta.name, meta.canContainChildren]);\n return (\n <div\n ref={elRef}\n className=\"mx-2 mb-1 px-2 py-1.5 rounded cursor-grab hover:bg-gray-100 flex items-center gap-2\"\n title={description}\n >\n <Icon className=\"h-4 w-4 text-gray-500\" />\n <span className=\"text-sm text-gray-700\">{meta.label}</span>\n </div>\n );\n}\n\ntype RightTab = \"designer\" | \"seo\";\n\nfunction ComponentPickerContent({ theme, resolver }: { theme: ThemeConfig; resolver: Record<string, React.ComponentType<any>> }) {\n const { connectors } = useEditor();\n const catalog = getCatalog(theme);\n const [collapsed, setCollapsed] = useState<Record<string, boolean>>({});\n\n const toggleCategory = (cat: string) => {\n setCollapsed((prev) => ({ ...prev, [cat]: !prev[cat] }));\n };\n\n return (\n <div>\n {catalog.map(({ category, components }) => (\n <div key={category}>\n <button\n className=\"w-full px-3 py-2 flex items-center justify-between text-xs font-medium text-gray-600 hover:bg-gray-50\"\n onClick={() => toggleCategory(category)}\n >\n <span className=\"capitalize\">{category}</span>\n {collapsed[category] ? (\n <ChevronRight className=\"h-3 w-3\" />\n ) : (\n <ChevronDown className=\"h-3 w-3\" />\n )}\n </button>\n {!collapsed[category] && (\n <div className=\"pb-1\">\n {components.map((meta) => {\n const Comp = resolver[meta.name];\n if (!Comp) return null;\n const Icon = getIcon(meta.icon);\n return (\n <DraggableCatalogItem\n key={meta.name}\n meta={meta}\n Comp={Comp}\n connectors={connectors}\n Icon={Icon}\n description={meta.description}\n />\n );\n })}\n </div>\n )}\n </div>\n ))}\n </div>\n );\n}\n\nfunction PropertiesPanelContent({ theme }: { theme: ThemeConfig }) {\n const { selected, actions } = useEditor((state) => {\n const selectedIds = Array.from(state.events.selected);\n const id = selectedIds[0];\n if (!id) return { selected: null };\n const node = state.nodes[id];\n if (!node?.data) return { selected: null };\n const type = node.data.type;\n const resolvedName =\n typeof type === \"string\" ? type : (type as any)?.resolvedName ?? (node.data as any).name ?? \"\";\n return {\n selected: {\n id,\n props: node.data.props || {},\n resolvedName: String(resolvedName || \"\").trim(),\n name: node.data.displayName || resolvedName,\n },\n };\n });\n\n if (!selected) {\n return (\n <div className=\"py-4 px-2.5 text-[11px] text-gray-400 text-center\">\n Select a component to edit properties.\n </div>\n );\n }\n\n const themeComponent = theme.components.find(\n (c) =>\n c.meta.name === selected.resolvedName ||\n c.meta.label === selected.resolvedName ||\n (selected.name && c.meta.label === selected.name) ||\n (selected.name && c.meta.name === selected.name)\n );\n\n if (!themeComponent?.meta?.props?.length) {\n return (\n <div className=\"py-4 px-2.5 text-[11px] text-gray-400 text-center\">\n No configurable properties for this component.\n </div>\n );\n }\n\n const handleChange = (propName: string, value: any) => {\n actions.setProp(selected.id, (p: any) => {\n p[propName] = value;\n });\n };\n\n return (\n <div className=\"py-2 px-2.5\">\n <ComponentSettings\n meta={themeComponent.meta}\n values={selected.props}\n onChange={handleChange}\n />\n </div>\n );\n}\n\nfunction LayoutPanelContent() {\n const { selected, actions, isDeletable } = useEditor((state, q) => {\n const selectedIds = Array.from(state.events.selected);\n const id = selectedIds[0];\n if (!id) return { selected: null, isDeletable: false };\n const node = state.nodes[id];\n if (!node?.data) return { selected: null, isDeletable: false };\n const type = node.data.type;\n const resolvedName =\n typeof type === \"string\" ? type : (type as any)?.resolvedName ?? (node.data as any).name ?? \"\";\n return {\n selected: {\n id,\n props: node.data.props || {},\n resolvedName: String(resolvedName || \"\").trim(),\n name: node.data.displayName || resolvedName,\n },\n isDeletable: q.node(id).isDeletable(),\n };\n });\n\n if (!selected) {\n return (\n <div className=\"py-4 px-2.5 text-[11px] text-gray-400 text-center\">\n Select a component to edit layout.\n </div>\n );\n }\n\n const props = selected.props as Record<string, any>;\n const setLayoutProp = (key: string, value: string | number | boolean) => {\n actions.setProp(selected.id, (p: any) => {\n p[key] = value;\n });\n };\n\n const layoutProps = {\n width: props.width ?? \"\",\n height: props.height ?? \"\",\n margin: props.margin ?? \"\",\n padding: props.padding ?? \"\",\n borderRadius: props.borderRadius ?? \"\",\n boxShadow: props.boxShadow ?? \"\",\n flexDirection: (props.flexDirection ?? \"column\") as string,\n alignItems: (props.alignItems ?? \"flex-start\") as string,\n justifyContent: (props.justifyContent ?? \"flex-start\") as string,\n flexFill: props.flexFill ?? false,\n };\n\n const fieldCls = \"flex items-center gap-2 min-h-[28px]\";\n const labelCls = \"text-[11px] text-gray-500 font-medium w-14 shrink-0\";\n const inputCls = \"h-7 text-xs flex-1 min-w-0 rounded border border-input bg-background px-2\";\n const selectCls = \"h-7 w-full text-xs rounded border border-input bg-background px-2\";\n\n return (\n <div className=\"py-2 px-2.5 space-y-4\">\n <section className=\"space-y-1.5\">\n <div className=\"text-[10px] font-medium text-gray-400 uppercase tracking-wider px-0.5\">Dimensions</div>\n <div className=\"grid grid-cols-2 gap-x-2 gap-y-1.5\">\n <div className={fieldCls}>\n <Label className={labelCls}>W</Label>\n <Input value={layoutProps.width} onChange={(e) => setLayoutProp(\"width\", e.target.value)} placeholder=\"100%\" className={inputCls} />\n </div>\n <div className={fieldCls}>\n <Label className={labelCls}>H</Label>\n <Input value={layoutProps.height} onChange={(e) => setLayoutProp(\"height\", e.target.value)} placeholder=\"auto\" className={inputCls} />\n </div>\n </div>\n </section>\n\n <section className=\"space-y-1.5 border-t border-gray-100 pt-3\">\n <div className=\"text-[10px] font-medium text-gray-400 uppercase tracking-wider px-0.5\">Spacing</div>\n <div className=\"grid grid-cols-2 gap-x-2 gap-y-1.5\">\n <div className={fieldCls}>\n <Label className={labelCls}>Margin</Label>\n <Input value={layoutProps.margin} onChange={(e) => setLayoutProp(\"margin\", e.target.value)} placeholder=\"0\" className={inputCls} />\n </div>\n <div className={fieldCls}>\n <Label className={labelCls}>Padding</Label>\n <Input value={layoutProps.padding} onChange={(e) => setLayoutProp(\"padding\", e.target.value)} placeholder=\"0\" className={inputCls} />\n </div>\n </div>\n </section>\n\n <section className=\"space-y-1.5 border-t border-gray-100 pt-3\">\n <div className=\"text-[10px] font-medium text-gray-400 uppercase tracking-wider px-0.5\">Decoration</div>\n <div className=\"grid grid-cols-2 gap-x-2 gap-y-1.5\">\n <div className={fieldCls}>\n <Label className={labelCls}>Radius</Label>\n <Input value={layoutProps.borderRadius} onChange={(e) => setLayoutProp(\"borderRadius\", e.target.value)} placeholder=\"0\" className={inputCls} />\n </div>\n <div className={fieldCls}>\n <Label className={labelCls}>Shadow</Label>\n <Input value={layoutProps.boxShadow} onChange={(e) => setLayoutProp(\"boxShadow\", e.target.value)} placeholder=\"none\" className={inputCls} />\n </div>\n </div>\n </section>\n\n <section className=\"space-y-1.5 border-t border-gray-100 pt-3\">\n <div className=\"text-[10px] font-medium text-gray-400 uppercase tracking-wider px-0.5\">Alignment</div>\n <div className=\"space-y-1.5\">\n <div className={fieldCls}>\n <Label className={labelCls}>Direction</Label>\n <select value={layoutProps.flexDirection} onChange={(e) => setLayoutProp(\"flexDirection\", e.target.value)} className={selectCls}>\n <option value=\"row\">Row</option>\n <option value=\"column\">Column</option>\n <option value=\"row-reverse\">Row reverse</option>\n <option value=\"column-reverse\">Column reverse</option>\n </select>\n </div>\n <div className={fieldCls}>\n <Label className={labelCls}>Align</Label>\n <select value={layoutProps.alignItems} onChange={(e) => setLayoutProp(\"alignItems\", e.target.value)} className={selectCls}>\n <option value=\"flex-start\">Start</option>\n <option value=\"center\">Center</option>\n <option value=\"flex-end\">End</option>\n <option value=\"stretch\">Stretch</option>\n </select>\n </div>\n <div className={fieldCls}>\n <Label className={labelCls}>Justify</Label>\n <select value={layoutProps.justifyContent} onChange={(e) => setLayoutProp(\"justifyContent\", e.target.value)} className={selectCls}>\n <option value=\"flex-start\">Start</option>\n <option value=\"center\">Center</option>\n <option value=\"flex-end\">End</option>\n <option value=\"space-between\">Between</option>\n <option value=\"space-around\">Around</option>\n </select>\n </div>\n <div className=\"flex items-center gap-2 h-7 px-0.5\">\n <input type=\"checkbox\" id=\"flexFill\" checked={!!layoutProps.flexFill} onChange={(e) => setLayoutProp(\"flexFill\", e.target.checked)} className=\"rounded border-gray-300 h-3.5 w-3.5\" />\n <Label htmlFor=\"flexFill\" className=\"text-[11px] text-gray-500\">Fill space</Label>\n </div>\n </div>\n </section>\n\n {isDeletable && (\n <div className=\"border-t border-gray-100 pt-3\">\n <Button type=\"button\" variant=\"outline\" size=\"sm\" className=\"w-full h-7 text-[11px] text-red-600 border-red-200 hover:bg-red-50 hover:text-red-700\" onClick={() => actions.delete(selected.id)}>\n Delete\n </Button>\n </div>\n )}\n </div>\n );\n}\n\nfunction LayersPanelContent() {\n const { connectors } = useEditor();\n const { nodes, selectedSet } = useEditor((state) => ({\n nodes: state.nodes,\n selectedSet: state.events.selected,\n }));\n const [expanded, setExpanded] = useState<Record<string, boolean>>({});\n\n const nodeMap = (nodes || {}) as Record<string, any>;\n const rootId = (() => {\n const ids = Object.keys(nodeMap);\n const childIds = new Set<string>();\n ids.forEach((id) => {\n const node = nodeMap[id];\n const children = node?.data?.nodes || [];\n children.forEach((cid: string) => childIds.add(cid));\n });\n return ids.find((id) => !childIds.has(id)) || ids[0] || null;\n })();\n\n const selectedIds = Array.from(selectedSet ?? []);\n const toggleExpanded = (id: string) => {\n setExpanded((prev) => ({ ...prev, [id]: !prev[id] }));\n };\n\n const getDisplayName = (node: any) => {\n if (!node) return \"Node\";\n const type = node.data?.type;\n const name = typeof type === \"string\" ? type : type?.resolvedName;\n const custom = node.data?.props?.custom;\n return (custom as any)?.displayName || node.data?.displayName || name || \"Element\";\n };\n\n const getChildIds = (node: any) => node?.data?.nodes || [];\n\n function LayerRow({ nodeId, depth }: { nodeId: string; depth: number }) {\n const node = nodeMap[nodeId];\n if (!node) return null;\n const childIds = getChildIds(node);\n const hasChildren = childIds.length > 0;\n const isExpanded = expanded[nodeId] !== false;\n const isSelected = selectedIds.includes(nodeId);\n const displayName = getDisplayName(node);\n\n return (\n <div key={nodeId} className=\"flex flex-col\">\n <div\n ref={(ref) => { if (ref) connectors.select(ref, nodeId); }}\n className={`flex items-center gap-1 py-1 px-2 cursor-pointer text-xs rounded min-h-[24px] ${\n isSelected ? \"bg-blue-100 text-blue-800\" : \"hover:bg-gray-100 text-gray-700\"\n }`}\n style={{ paddingLeft: `${depth * 12 + 8}px` }}\n >\n <button\n type=\"button\"\n className=\"p-0 border-0 bg-transparent cursor-pointer flex items-center\"\n onClick={(e) => {\n e.stopPropagation();\n toggleExpanded(nodeId);\n }}\n aria-label={hasChildren ? (isExpanded ? \"Collapse\" : \"Expand\") : undefined}\n >\n {hasChildren ? (\n isExpanded ? (\n <ChevronDown className=\"h-3 w-3 text-gray-500\" />\n ) : (\n <ChevronRight className=\"h-3 w-3 text-gray-500\" />\n )\n ) : (\n <span className=\"w-3\" />\n )}\n </button>\n <span className=\"truncate flex-1\">{displayName}</span>\n </div>\n {hasChildren && isExpanded && (\n <div>\n {childIds.map((cid) => (\n <LayerRow key={cid} nodeId={cid} depth={depth + 1} />\n ))}\n </div>\n )}\n </div>\n );\n }\n\n if (!rootId) {\n return (\n <div className=\"p-3 text-xs text-gray-400\">\n Add components to the canvas to see layers.\n </div>\n );\n }\n\n return (\n <div className=\"py-1 max-h-[200px] overflow-y-auto\">\n <LayerRow nodeId={rootId} depth={0} />\n </div>\n );\n}\n\ninterface SeoTabProps {\n seoTitle: string; setSeoTitle: (v: string) => void;\n seoDescription: string; setSeoDescription: (v: string) => void;\n seoKeywords: string; setSeoKeywords: (v: string) => void;\n seoOgTitle: string; setSeoOgTitle: (v: string) => void;\n seoOgDescription: string; setSeoOgDescription: (v: string) => void;\n seoOgImage: string; setSeoOgImage: (v: string) => void;\n}\n\nfunction SeoTabContent(props: SeoTabProps) {\n return (\n <div className=\"p-4 space-y-3\">\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs\">SEO Title</Label>\n <Input value={props.seoTitle} onChange={(e) => props.setSeoTitle(e.target.value)} placeholder=\"SEO title\" />\n </div>\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs\">Meta Description</Label>\n <Textarea value={props.seoDescription} onChange={(e) => props.setSeoDescription(e.target.value)} placeholder=\"Page description for search engines\" rows={3} />\n </div>\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs\">Keywords</Label>\n <Input value={props.seoKeywords} onChange={(e) => props.setSeoKeywords(e.target.value)} placeholder=\"keyword1, keyword2\" />\n </div>\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs\">OG Title</Label>\n <Input value={props.seoOgTitle} onChange={(e) => props.setSeoOgTitle(e.target.value)} placeholder=\"Open Graph title\" />\n </div>\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs\">OG Description</Label>\n <Textarea value={props.seoOgDescription} onChange={(e) => props.setSeoOgDescription(e.target.value)} placeholder=\"Open Graph description\" rows={2} />\n </div>\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs\">OG Image</Label>\n <Input value={props.seoOgImage} onChange={(e) => props.setSeoOgImage(e.target.value)} placeholder=\"https://...\" />\n </div>\n </div>\n );\n}\n\nfunction CollapsibleSection({\n title,\n icon: Icon,\n open,\n onToggle,\n children,\n}: {\n title: string;\n icon: React.ComponentType<{ className?: string }>;\n open: boolean;\n onToggle: () => void;\n children: React.ReactNode;\n}) {\n return (\n <div className=\"flex-shrink-0 border-t border-gray-100\">\n <button\n type=\"button\"\n className=\"w-full px-2.5 py-1.5 flex items-center justify-between text-[11px] font-medium text-gray-600 hover:bg-gray-50/80\"\n onClick={onToggle}\n >\n <span className=\"flex items-center gap-1.5\">\n <Icon className=\"h-3 w-3 text-gray-400\" />\n {title}\n </span>\n {open ? <ChevronDown className=\"h-3 w-3 text-gray-400\" /> : <ChevronRight className=\"h-3 w-3 text-gray-400\" />}\n </button>\n {open && <div className=\"bg-white\">{children}</div>}\n </div>\n );\n}\n\nfunction RightSidebar({ theme, resolver, activeTab, setActiveTab, seoProps }: { theme: ThemeConfig; resolver: Record<string, React.ComponentType<any>>; activeTab: RightTab; setActiveTab: (t: RightTab) => void; seoProps: SeoTabProps }) {\n const [componentsOpen, setComponentsOpen] = useState(true);\n const [propertiesOpen, setPropertiesOpen] = useState(true);\n const [layoutOpen, setLayoutOpen] = useState(true);\n const [layersOpen, setLayersOpen] = useState(true);\n\n return (\n <div className=\"flex flex-col flex-1 overflow-hidden\">\n <div className=\"flex border-b flex-shrink-0\">\n {([\"designer\", \"seo\"] as RightTab[]).map((tab) => (\n <button\n key={tab}\n className={`flex-1 px-2 py-2 text-xs font-medium border-b-2 capitalize ${\n activeTab === tab\n ? \"border-gray-800 text-gray-800\"\n : \"border-transparent text-gray-500 hover:text-gray-700\"\n }`}\n onClick={() => setActiveTab(tab)}\n >\n {tab === \"designer\" ? \"Designer\" : \"Seo\"}\n </button>\n ))}\n </div>\n <div className=\"flex-1 overflow-y-auto flex flex-col min-h-0\">\n {activeTab === \"designer\" && (\n <>\n <CollapsibleSection\n title=\"Components\"\n icon={Box}\n open={componentsOpen}\n onToggle={() => setComponentsOpen((o) => !o)}\n >\n <ComponentPickerContent theme={theme} resolver={resolver} />\n </CollapsibleSection>\n <CollapsibleSection\n title=\"Properties\"\n icon={SlidersHorizontal}\n open={propertiesOpen}\n onToggle={() => setPropertiesOpen((o) => !o)}\n >\n <PropertiesPanelContent theme={theme} />\n </CollapsibleSection>\n <CollapsibleSection\n title=\"Layout\"\n icon={LayoutDashboard}\n open={layoutOpen}\n onToggle={() => setLayoutOpen((o) => !o)}\n >\n <LayoutPanelContent />\n </CollapsibleSection>\n <CollapsibleSection\n title=\"Layers\"\n icon={Layers}\n open={layersOpen}\n onToggle={() => setLayersOpen((o) => !o)}\n >\n <LayersPanelContent />\n </CollapsibleSection>\n </>\n )}\n {activeTab === \"seo\" && <SeoTabContent {...seoProps} />}\n </div>\n </div>\n );\n}\n\nfunction SaveButton({ pageId, pageData, onSaved, children, className }: { pageId?: string; pageData: { title: string; slug: string; published: boolean; seoTitle: string; seoDescription: string; seoKeywords: string; seoOgTitle: string; seoOgDescription: string; seoOgImage: string }; onSaved: (id: string) => void; children: React.ReactNode; className?: string }) {\n const { query } = useEditor();\n const [saving, setSaving] = useState(false);\n\n const handleSave = async () => {\n setSaving(true);\n try {\n const content = JSON.parse(query.serialize());\n\n let seoId: number | null = null;\n const hasSeo = pageData.seoTitle || pageData.seoDescription || pageData.seoKeywords;\n if (hasSeo) {\n const seoPayload = {\n title: pageData.seoTitle,\n description: pageData.seoDescription,\n keywords: pageData.seoKeywords,\n ogTitle: pageData.seoOgTitle,\n ogDescription: pageData.seoOgDescription,\n ogImage: pageData.seoOgImage,\n slug: pageData.slug,\n };\n const seoRes = await fetch(\"/api/seos\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(seoPayload),\n });\n if (seoRes.ok) {\n const seoData = await seoRes.json();\n seoId = seoData.id;\n }\n }\n\n const payload: Record<string, any> = {\n title: pageData.title,\n slug: pageData.slug,\n content,\n published: pageData.published,\n };\n if (seoId) payload.seoId = seoId;\n\n const url = pageId ? `/api/pages/${pageId}` : \"/api/pages\";\n const method = pageId ? \"PUT\" : \"POST\";\n const res = await fetch(url, {\n method,\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n });\n\n if (res.ok) {\n const saved = await res.json();\n onSaved(saved.id?.toString() || pageId || \"\");\n }\n } finally {\n setSaving(false);\n }\n };\n\n return (\n <Button\n onClick={handleSave}\n disabled={saving}\n size=\"sm\"\n className={className}\n >\n {saving ? \"Saving...\" : children}\n </Button>\n );\n}\n\nimport React from \"react\";\n\ninterface PageBuilderPageProps {\n pageId?: string;\n}\n\nexport default function PageBuilderPage({ pageId }: PageBuilderPageProps) {\n const { theme } = useContext(AdminConfigContext);\n const router = useRouter();\n\n const [title, setTitle] = useState(\"\");\n const [slug, setSlug] = useState(\"\");\n const [published, setPublished] = useState(false);\n const [initialContent, setInitialContent] = useState<string | null>(null);\n const [loading, setLoading] = useState(!!pageId);\n const [rightTab, setRightTab] = useState<RightTab>(\"designer\");\n\n const [seoTitle, setSeoTitle] = useState(\"\");\n const [seoDescription, setSeoDescription] = useState(\"\");\n const [seoKeywords, setSeoKeywords] = useState(\"\");\n const [seoOgTitle, setSeoOgTitle] = useState(\"\");\n const [seoOgDescription, setSeoOgDescription] = useState(\"\");\n const [seoOgImage, setSeoOgImage] = useState(\"\");\n\n useEffect(() => {\n if (!pageId) {\n setInitialContent(null);\n setLoading(false);\n return;\n }\n fetch(`/api/pages/${pageId}`)\n .then((r) => (r.ok ? r.json() : null))\n .then((data) => {\n if (data) {\n setTitle(data.title || \"\");\n setSlug(data.slug || \"\");\n setPublished(data.published || false);\n if (data.content) {\n setInitialContent(JSON.stringify(data.content));\n }\n if (data.seo) {\n setSeoTitle(data.seo.title || \"\");\n setSeoDescription(data.seo.description || \"\");\n setSeoKeywords(data.seo.keywords || \"\");\n setSeoOgTitle(data.seo.ogTitle || \"\");\n setSeoOgDescription(data.seo.ogDescription || \"\");\n setSeoOgImage(data.seo.ogImage || \"\");\n }\n }\n })\n .finally(() => setLoading(false));\n }, [pageId]);\n\n useEffect(() => {\n if (title && !slug) {\n setSlug(\n title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/(^-|-$)/g, \"\")\n );\n }\n }, [title, slug]);\n\n if (!theme) {\n return (\n <div className=\"flex items-center justify-center min-h-[50vh]\">\n <p className=\"text-gray-500\">No theme configured. Please set up a theme in your admin layout.</p>\n </div>\n );\n }\n\n if (loading) {\n return (\n <div className=\"flex items-center justify-center py-12\">\n <div className=\"animate-spin rounded-full h-6 w-6 border-2 border-gray-300 border-t-gray-600\" />\n <span className=\"ml-2\">Loading...</span>\n </div>\n );\n }\n\n const resolver = buildEditorResolver(theme);\n\n return (\n <Editor resolver={resolver} enabled={true}>\n <div className=\"min-w-0 rounded-lg bg-white shadow-md\">\n {/* Header */}\n <div className=\"bg-gray-800 border-b border-gray-700 px-4 py-2.5 rounded-t-lg\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-xl font-bold text-white\">\n {pageId ? \"Edit Page\" : \"Create New Page\"}\n </h1>\n <p className=\"text-xs text-gray-300 mt-0.5\">\n {pageId ? \"Update page content\" : \"Build a new page with drag-and-drop\"}\n </p>\n </div>\n <div className=\"flex items-center space-x-3\">\n <div className=\"flex items-center gap-2\">\n <Switch\n checked={published}\n onCheckedChange={setPublished}\n className=\"data-[state=checked]:bg-green-500\"\n />\n <span className=\"text-xs text-gray-300\">Published</span>\n </div>\n <SaveButton\n pageId={pageId}\n pageData={{ title, slug, published, seoTitle, seoDescription, seoKeywords, seoOgTitle, seoOgDescription, seoOgImage }}\n onSaved={(id) => { if (!pageId) router.replace(`/admin/pages/${id}`); }}\n className=\"flex items-center bg-white text-gray-800 hover:bg-gray-100 border-0 text-xs\"\n >\n <Save className=\"h-4 w-4 mr-1\" /> Save\n </SaveButton>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"flex items-center bg-white text-gray-800 hover:bg-gray-100 border-0 text-xs\"\n onClick={() => router.push(\"/admin/pages\")}\n >\n <X className=\"h-4 w-4 mr-1\" /> Close\n </Button>\n </div>\n </div>\n </div>\n\n {/* Content */}\n <div className=\"min-w-0 p-6\">\n <div className=\"flex flex-col lg:flex-row w-full gap-6 min-w-0\">\n {/* LEFT COLUMN - Canvas */}\n <div className=\"flex w-full lg:w-3/4 flex-col gap-4 min-w-0\">\n <div>\n <label className=\"block text-sm font-semibold text-gray-700 mb-2\">Page Content</label>\n <div className=\"border rounded-md bg-gray-50 min-h-[500px]\">\n {initialContent ? (\n <Frame data={initialContent} />\n ) : (\n <Frame>\n <Element canvas is=\"div\" className=\"p-4 min-h-[500px]\">\n </Element>\n </Frame>\n )}\n </div>\n </div>\n </div>\n\n {/* RIGHT COLUMN - Sidebar */}\n <div className=\"flex w-full lg:w-1/4 flex-col gap-0 rounded-lg bg-gray-50 border overflow-hidden min-w-0\">\n <div className=\"p-3 border-b bg-white rounded-t-lg\">\n <div className=\"text-xs font-semibold text-gray-500 uppercase tracking-wide mb-2\">Page</div>\n <div className=\"space-y-2\">\n <div>\n <label className=\"block text-xs font-medium text-gray-600 mb-1\">Title *</label>\n <Input\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n placeholder=\"Page title\"\n className=\"h-8 text-sm\"\n />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-gray-600 mb-1\">Slug *</label>\n <Input\n value={slug}\n onChange={(e) => setSlug(e.target.value)}\n placeholder=\"page-url-slug\"\n className=\"h-8 text-sm\"\n />\n </div>\n </div>\n </div>\n <RightSidebar\n theme={theme}\n resolver={resolver}\n activeTab={rightTab}\n setActiveTab={setRightTab}\n seoProps={{ seoTitle, setSeoTitle, seoDescription, setSeoDescription, seoKeywords, setSeoKeywords, seoOgTitle, setSeoOgTitle, seoOgDescription, setSeoOgDescription, seoOgImage, setSeoOgImage }}\n />\n </div>\n </div>\n </div>\n </div>\n </Editor>\n );\n}\n","import type { ThemeConfig, ThemeComponent, ComponentMeta } from './types';\n\nexport function createTheme(config: ThemeConfig): ThemeConfig {\n const names = config.components.map((c) => c.meta.name);\n const duplicates = names.filter((n, i) => names.indexOf(n) !== i);\n if (duplicates.length) {\n throw new Error(`Duplicate component names in theme \"${config.name}\": ${duplicates.join(', ')}`);\n }\n return Object.freeze(config) as ThemeConfig;\n}\n\nexport function buildResolver(theme: ThemeConfig): Record<string, React.ComponentType<any>> {\n const resolver: Record<string, React.ComponentType<any>> = {};\n for (const { meta, component } of theme.components) {\n resolver[meta.name] = component;\n }\n return resolver;\n}\n\nexport interface CatalogGroup {\n category: string;\n components: ComponentMeta[];\n}\n\nexport function getCatalog(theme: ThemeConfig): CatalogGroup[] {\n const groups = new Map<string, ComponentMeta[]>();\n for (const { meta } of theme.components) {\n const list = groups.get(meta.category) || [];\n list.push(meta);\n groups.set(meta.category, list);\n }\n return Array.from(groups.entries()).map(([category, components]) => ({\n category,\n components,\n }));\n}\n","'use client';\n\nimport { useContext } from 'react';\nimport { HardDrive, Mail, CreditCard, Puzzle, CheckCircle2, XCircle } from 'lucide-react';\nimport { AdminConfigContext } from '../admin-config-context';\nimport type { PluginDescriptor } from '../admin-config-context';\n\nconst ICON_MAP: Record<string, React.ComponentType<{ className?: string }>> = {\n storage: HardDrive,\n email: Mail,\n payment: CreditCard,\n};\n\nfunction PluginIcon({ descriptor }: { descriptor: PluginDescriptor }) {\n const Icon = descriptor.icon ? ICON_MAP[descriptor.icon] ?? Puzzle : Puzzle;\n return (\n <div className=\"flex h-11 w-11 shrink-0 items-center justify-center rounded-lg bg-gray-100 text-gray-600 dark:bg-gray-700 dark:text-gray-300\">\n <Icon className=\"h-5 w-5\" />\n </div>\n );\n}\n\nexport default function PluginsPage() {\n const { pluginDescriptors = [] } = useContext(AdminConfigContext);\n\n return (\n <div className=\"space-y-6\">\n <div>\n <h1 className=\"text-xl font-semibold text-gray-900 dark:text-white\">Plugins</h1>\n <p className=\"mt-0.5 text-sm text-gray-500 dark:text-gray-400\">\n Registered plugins and their status\n </p>\n </div>\n\n {pluginDescriptors.length === 0 ? (\n <div className=\"rounded-xl border border-gray-200 bg-white p-8 text-center dark:border-gray-700 dark:bg-gray-800\">\n <Puzzle className=\"mx-auto h-10 w-10 text-gray-400\" />\n <p className=\"mt-3 text-sm text-gray-500 dark:text-gray-400\">\n No plugins registered. Add plugin descriptors to your app admin layout.\n </p>\n </div>\n ) : (\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {pluginDescriptors.map((p) => {\n const enabled = p.enabled !== false;\n return (\n <div\n key={p.name}\n className=\"flex flex-col rounded-xl border border-gray-200 bg-white shadow-sm transition-shadow hover:shadow dark:border-gray-700 dark:bg-gray-800\"\n >\n <div className=\"flex items-start gap-4 p-5\">\n <PluginIcon descriptor={p} />\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center justify-between gap-2\">\n <h2 className=\"font-medium text-gray-900 dark:text-white\">\n {p.label || p.name}\n </h2>\n <span\n className={`inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs font-medium ${\n enabled\n ? 'bg-emerald-50 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-400'\n : 'bg-gray-100 text-gray-600 dark:bg-gray-700 dark:text-gray-400'\n }`}\n >\n {enabled ? (\n <CheckCircle2 className=\"h-3.5 w-3.5\" />\n ) : (\n <XCircle className=\"h-3.5 w-3.5\" />\n )}\n {enabled ? 'Enabled' : 'Disabled'}\n </span>\n </div>\n <p className=\"mt-0.5 text-xs text-gray-500 dark:text-gray-400\">v{p.version}</p>\n {p.description && (\n <p className=\"mt-2 text-sm text-gray-600 dark:text-gray-300\">\n {p.description}\n </p>\n )}\n </div>\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport { useRouter } from \"next/navigation\";\nimport { AlertCircle } from \"lucide-react\";\nimport { SeoSection, saveSeo, fetchSeo, type SeoFields } from \"../../components/Admin/SeoSection\";\nimport DetailPageLayout from \"../../components/Admin/DetailPageLayout\";\nimport DetailPageHeader from \"../../components/Admin/DetailPageHeader\";\n\nconst isCreate = (id: string) => id === \"create\";\n\nexport default function BrandEditPage({ brandId }: { brandId: string }) {\n const router = useRouter();\n const create = isCreate(brandId);\n const [loading, setLoading] = useState(!create);\n const [saving, setSaving] = useState(false);\n const [errors, setErrors] = useState<string[]>([]);\n const [name, setName] = useState(\"\");\n const [slug, setSlug] = useState(\"\");\n const [description, setDescription] = useState(\"\");\n const [logo, setLogo] = useState(\"\");\n const [active, setActive] = useState(true);\n const [sortOrder, setSortOrder] = useState(0);\n\n const [seoId, setSeoId] = useState<number | null>(null);\n const [seo, setSeo] = useState<SeoFields>({ seoTitle: \"\", seoDescription: \"\", seoKeywords: \"\", seoOgTitle: \"\", seoOgDescription: \"\", seoOgImage: \"\" });\n\n useEffect(() => {\n if (create) return;\n let cancelled = false;\n (async () => {\n try {\n const res = await fetch(`/api/brands/${brandId}`);\n if (!res.ok) throw new Error(\"Failed to load brand\");\n const data = await res.json();\n if (cancelled) return;\n setName(data.name ?? \"\");\n setSlug(data.slug ?? \"\");\n setDescription(data.description ?? \"\");\n setLogo(data.logo ?? \"\");\n setActive(data.active ?? true);\n setSortOrder(Number(data.sortOrder) ?? 0);\n\n if (data.seoId) {\n setSeoId(data.seoId);\n const seoData = await fetchSeo(data.seoId);\n if (!cancelled) setSeo(seoData);\n }\n } catch {\n if (!cancelled) setErrors([\"Failed to load brand\"]);\n } finally {\n if (!cancelled) setLoading(false);\n }\n })();\n return () => { cancelled = true; };\n }, [brandId, create]);\n\n const handleSave = async () => {\n setErrors([]);\n if (!name.trim()) {\n setErrors([\"Name is required\"]);\n return;\n }\n if (!slug.trim()) {\n setErrors([\"Slug is required\"]);\n return;\n }\n setSaving(true);\n try {\n const savedSeoId = await saveSeo(seo, slug.trim(), seoId);\n\n const payload: Record<string, unknown> = {\n name: name.trim(),\n slug: slug.trim(),\n description: description || null,\n logo: logo || null,\n active,\n sortOrder,\n };\n if (savedSeoId) payload.seoId = savedSeoId;\n\n const res = await fetch(create ? \"/api/brands\" : `/api/brands/${brandId}`, {\n method: create ? \"POST\" : \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n });\n if (!res.ok) {\n const data = await res.json().catch(() => ({}));\n setErrors([data.error ?? \"Failed to save\"]);\n return;\n }\n router.push(\"/admin/brands\");\n } catch {\n setErrors([\"Failed to save\"]);\n } finally {\n setSaving(false);\n }\n };\n\n if (loading) {\n return (\n <div className=\"flex items-center justify-center py-12\">\n <span className=\"text-gray-500\">Loading...</span>\n </div>\n );\n }\n\n return (\n <div className=\"rounded-lg bg-white shadow-md\">\n <DetailPageHeader\n title={create ? \"Add Brand\" : \"Edit Brand\"}\n subtitle={create ? \"Create a new brand\" : \"Update brand details\"}\n closeHref=\"/admin/brands\"\n menuItems={[\n { label: saving ? \"Saving...\" : \"Save\", onClick: handleSave },\n { label: active ? \"Deactivate\" : \"Activate\", onClick: () => setActive(!active) },\n ]}\n />\n\n {errors.length > 0 && (\n <div className=\"bg-red-50 border-l-4 border-red-400 p-4 mx-6 mt-4\">\n <div className=\"flex\">\n <AlertCircle className=\"h-5 w-5 text-red-400 flex-shrink-0\" />\n <div className=\"ml-3\">\n <h3 className=\"text-sm font-medium text-red-800\">Please fix the following errors:</h3>\n <ul className=\"mt-2 text-sm text-red-700 list-disc pl-5 space-y-1\">\n {errors.map((e, i) => (\n <li key={i}>{e}</li>\n ))}\n </ul>\n </div>\n </div>\n </div>\n )}\n\n <DetailPageLayout\n main={\n <>\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">\n Basic info\n </h2>\n <div className=\"min-w-0 overflow-hidden border border-gray-200 rounded-lg p-4 bg-gray-50/50 space-y-4\">\n <div>\n <label className=\"block text-xs font-medium text-gray-600 mb-1\">Name *</label>\n <input\n type=\"text\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n className=\"w-full rounded-md border border-gray-300 px-3 py-2 text-sm\"\n required\n />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-gray-600 mb-1\">Slug *</label>\n <input\n type=\"text\"\n value={slug}\n onChange={(e) => setSlug(e.target.value)}\n className=\"w-full rounded-md border border-gray-300 px-3 py-2 text-sm\"\n required\n />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-gray-600 mb-1\">Description</label>\n <textarea\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n className=\"w-full rounded-md border border-gray-300 px-3 py-2 text-sm min-h-[80px]\"\n rows={3}\n />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-gray-600 mb-1\">Logo URL</label>\n <input\n type=\"url\"\n value={logo}\n onChange={(e) => setLogo(e.target.value)}\n className=\"w-full rounded-md border border-gray-300 px-3 py-2 text-sm\"\n />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-gray-600 mb-1\">Sort order</label>\n <input\n type=\"number\"\n value={sortOrder}\n onChange={(e) => setSortOrder(Number(e.target.value) || 0)}\n className=\"w-full rounded-md border border-gray-300 px-3 py-2 text-sm w-24\"\n />\n </div>\n </div>\n </section>\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">\n SEO\n </h2>\n <div className=\"min-w-0 overflow-hidden border border-gray-200 rounded-lg p-4 bg-gray-50/50\">\n <SeoSection values={seo} onChange={(field, value) => setSeo((s) => ({ ...s, [field]: value }))} />\n </div>\n </section>\n </>\n }\n sidebar={\n <>\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">\n Status\n </h2>\n <div className=\"min-w-0 overflow-hidden border border-gray-200 rounded-lg p-4 bg-gray-50/50\">\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={active}\n onChange={(e) => setActive(e.target.checked)}\n className=\"h-4 w-4 rounded border-gray-300\"\n />\n <span className=\"text-sm font-medium text-gray-900\">Active</span>\n </label>\n </div>\n </section>\n </>\n }\n />\n </div>\n );\n}\n","\"use client\";\n\nexport type SeoFields = {\n seoTitle: string;\n seoDescription: string;\n seoKeywords: string;\n seoOgTitle: string;\n seoOgDescription: string;\n seoOgImage: string;\n};\n\nexport function SeoSection({\n values,\n onChange,\n}: {\n values: SeoFields;\n onChange: (field: keyof SeoFields, value: string) => void;\n}) {\n const inputCls = \"w-full rounded-md border border-gray-300 px-2 py-1.5 text-sm h-8\";\n const textareaCls = \"w-full rounded-md border border-gray-300 px-2 py-1.5 text-sm min-h-[60px]\";\n\n return (\n <div className=\"border-t border-gray-200 pt-2\">\n <div className=\"text-xs font-semibold text-gray-500 uppercase tracking-wide mb-3\">SEO</div>\n <div className=\"space-y-3\">\n <div>\n <label className=\"block text-xs font-medium text-gray-600 mb-1\">Meta Title</label>\n <input type=\"text\" value={values.seoTitle} onChange={(e) => onChange(\"seoTitle\", e.target.value)} className={inputCls} />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-gray-600 mb-1\">Meta Description</label>\n <textarea value={values.seoDescription} onChange={(e) => onChange(\"seoDescription\", e.target.value)} className={textareaCls} rows={2} />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-gray-600 mb-1\">Keywords</label>\n <input type=\"text\" value={values.seoKeywords} onChange={(e) => onChange(\"seoKeywords\", e.target.value)} placeholder=\"keyword1, keyword2\" className={inputCls} />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-gray-600 mb-1\">OG Title</label>\n <input type=\"text\" value={values.seoOgTitle} onChange={(e) => onChange(\"seoOgTitle\", e.target.value)} className={inputCls} />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-gray-600 mb-1\">OG Description</label>\n <textarea value={values.seoOgDescription} onChange={(e) => onChange(\"seoOgDescription\", e.target.value)} className={textareaCls} rows={2} />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-gray-600 mb-1\">OG Image</label>\n <input type=\"url\" value={values.seoOgImage} onChange={(e) => onChange(\"seoOgImage\", e.target.value)} placeholder=\"https://...\" className={inputCls} />\n </div>\n </div>\n </div>\n );\n}\n\nexport async function saveSeo(\n seo: SeoFields,\n slug: string,\n existingSeoId: number | null,\n): Promise<number | null> {\n const hasSeo = seo.seoTitle || seo.seoDescription || seo.seoKeywords;\n if (!hasSeo) return existingSeoId;\n\n const payload = {\n title: seo.seoTitle || null,\n description: seo.seoDescription || null,\n keywords: seo.seoKeywords || null,\n ogTitle: seo.seoOgTitle || null,\n ogDescription: seo.seoOgDescription || null,\n ogImage: seo.seoOgImage || null,\n slug,\n };\n\n if (existingSeoId) {\n const res = await fetch(`/api/seos/${existingSeoId}`, {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n });\n return res.ok ? existingSeoId : null;\n }\n\n const res = await fetch(\"/api/seos\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n });\n if (res.ok) {\n const data = await res.json();\n return data.id;\n }\n return null;\n}\n\nexport async function fetchSeo(seoId: number): Promise<SeoFields> {\n const empty: SeoFields = { seoTitle: \"\", seoDescription: \"\", seoKeywords: \"\", seoOgTitle: \"\", seoOgDescription: \"\", seoOgImage: \"\" };\n try {\n const res = await fetch(`/api/seos/${seoId}`);\n if (!res.ok) return empty;\n const data = await res.json();\n return {\n seoTitle: data.title ?? \"\",\n seoDescription: data.description ?? \"\",\n seoKeywords: data.keywords ?? \"\",\n seoOgTitle: data.ogTitle ?? \"\",\n seoOgDescription: data.ogDescription ?? \"\",\n seoOgImage: data.ogImage ?? \"\",\n };\n } catch {\n return empty;\n }\n}\n\nexport default SeoSection;\n","import type { CustomCrudConfig } from './admin-config-context';\n\nexport const STORE_CRUD_CONFIGS: Record<string, CustomCrudConfig> = {\n products: {\n title: 'Products',\n apiEndpoint: '/api/products',\n defaultSortField: 'createdAt',\n defaultSortOrder: 'desc',\n filters: [\n { param: 'status', label: 'Status', type: 'select', options: [\n { value: '', label: 'All' },\n { value: 'draft', label: 'Draft' },\n { value: 'available', label: 'Available' },\n { value: 'reserved', label: 'Reserved' },\n { value: 'sold', label: 'Sold' },\n ]},\n { param: 'inventory', label: 'Inventory', type: 'select', options: [\n { value: '', label: 'All' },\n { value: 'in_stock', label: 'In stock' },\n { value: 'out_of_stock', label: 'Out of stock' },\n ]},\n ],\n columns: [\n { field: 'name', displayName: 'Name' },\n { field: 'sku', displayName: 'SKU' },\n { field: 'brandId', displayName: 'Brand', relationApi: '/api/brands', relationLabelField: 'name', relationValueField: 'id' },\n { field: 'categoryId', displayName: 'Category', relationApi: '/api/product_categories', relationLabelField: 'name', relationValueField: 'id' },\n { field: 'collectionId', displayName: 'Collection', relationApi: '/api/collections', relationLabelField: 'name', relationValueField: 'id' },\n { field: 'price', displayName: 'Price' },\n { field: 'status', displayName: 'Status' },\n { field: 'featured', displayName: 'Featured', type: 'boolean' },\n { field: 'createdAt', displayName: 'Created', type: 'date' },\n ],\n addEditPageUrl: '',\n },\n collections: {\n title: 'Collections',\n apiEndpoint: '/api/collections',\n columns: [\n { field: 'name', displayName: 'Name' },\n { field: 'slug', displayName: 'Slug' },\n { field: 'brandId', displayName: 'Brand', relationApi: '/api/brands', relationLabelField: 'name', relationValueField: 'id' },\n { field: 'categoryId', displayName: 'Category', relationApi: '/api/product_categories', relationLabelField: 'name', relationValueField: 'id' },\n { field: 'active', displayName: 'Active', type: 'boolean' },\n { field: 'sortOrder', displayName: 'Order' },\n { field: 'createdAt', displayName: 'Created', type: 'date' },\n ],\n addEditPageUrl: '',\n },\n orders: {\n title: 'Orders',\n apiEndpoint: '/api/orders',\n defaultSortField: 'createdAt',\n defaultSortOrder: 'desc',\n filters: [\n { param: 'status', label: 'Status', type: 'select', options: [\n { value: '', label: 'All' },\n { value: 'pending', label: 'Pending' },\n { value: 'confirmed', label: 'Confirmed' },\n { value: 'processing', label: 'Processing' },\n { value: 'completed', label: 'Completed' },\n { value: 'cancelled', label: 'Cancelled' },\n ]},\n { param: 'date', label: 'Date range', type: 'dateRange' },\n { param: 'paymentRef', label: 'Payment ID', type: 'text' },\n ],\n columns: [\n { field: 'orderNumber', displayName: 'Order #' },\n { field: 'contact.name', displayName: 'Customer' },\n { field: 'contact.email', displayName: 'Email' },\n { field: 'contact.phone', displayName: 'Phone' },\n { field: 'itemsSummary', displayName: 'Models / Items' },\n { field: 'status', displayName: 'Status' },\n { field: 'total', displayName: 'Total' },\n { field: 'currency', displayName: 'Currency' },\n { field: 'createdAt', displayName: 'Created', type: 'date' },\n ],\n addEditPageUrl: '',\n },\n payments: {\n title: 'Payments',\n apiEndpoint: '/api/payments',\n defaultSortField: 'createdAt',\n defaultSortOrder: 'desc',\n filters: [\n { param: 'status', label: 'Status', type: 'select', options: [\n { value: '', label: 'All' },\n { value: 'pending', label: 'Pending' },\n { value: 'processing', label: 'Processing' },\n { value: 'completed', label: 'Completed' },\n { value: 'failed', label: 'Failed' },\n { value: 'refunded', label: 'Refunded' },\n ]},\n { param: 'date', label: 'Date range', type: 'dateRange' },\n { param: 'method', label: 'Method', type: 'select', options: [\n { value: '', label: 'All' },\n { value: 'razorpay', label: 'Razorpay' },\n ]},\n { param: 'orderNumber', label: 'Order #', type: 'text' },\n ],\n columns: [\n { field: 'order.orderNumber', displayName: 'Order #' },\n { field: 'contact.name', displayName: 'Customer' },\n { field: 'contact.email', displayName: 'Email' },\n { field: 'amount', displayName: 'Amount' },\n { field: 'currency', displayName: 'Currency' },\n { field: 'status', displayName: 'Status' },\n { field: 'method', displayName: 'Method' },\n { field: 'externalReference', displayName: 'Razorpay Order ID' },\n { field: 'paidAt', displayName: 'Paid At', type: 'date' },\n { field: 'createdAt', displayName: 'Created', type: 'date' },\n ],\n addEditPageUrl: '',\n },\n taxes: {\n title: 'Taxes',\n apiEndpoint: '/api/taxes',\n columns: [\n { field: 'name', displayName: 'Name' },\n { field: 'slug', displayName: 'Slug' },\n { field: 'rate', displayName: 'Rate (%)' },\n { field: 'isDefault', displayName: 'Default', type: 'boolean' },\n { field: 'active', displayName: 'Active', type: 'boolean' },\n { field: 'createdAt', displayName: 'Created', type: 'date' },\n ],\n addEditPageUrl: '',\n },\n brands: {\n title: 'Brands',\n apiEndpoint: '/api/brands',\n columns: [\n { field: 'name', displayName: 'Name' },\n { field: 'slug', displayName: 'Slug' },\n { field: 'active', displayName: 'Active', type: 'boolean' },\n { field: 'sortOrder', displayName: 'Order' },\n { field: 'createdAt', displayName: 'Created', type: 'date' },\n ],\n addEditPageUrl: '/admin/brands',\n },\n product_categories: {\n title: 'Categories',\n apiEndpoint: '/api/product_categories',\n columns: [\n { field: 'name', displayName: 'Name' },\n { field: 'slug', displayName: 'Slug' },\n { field: 'parentId', displayName: 'Parent', relationApi: '/api/product_categories', relationLabelField: 'name', relationValueField: 'id' },\n { field: 'active', displayName: 'Active', type: 'boolean' },\n { field: 'sortOrder', displayName: 'Order' },\n { field: 'createdAt', displayName: 'Created', type: 'date' },\n ],\n addEditPageUrl: '',\n },\n};\n","\"use client\";\n\nimport { useState, useEffect, useContext } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { Save } from \"lucide-react\";\nimport NavbarEditor from \"../../components/Admin/NavbarEditor\";\nimport ComponentSettings from \"../../components/Admin/ComponentSettings\";\nimport { AdminConfigContext } from \"../admin-config-context\";\nimport type { NavbarConfig, ThemeConfig } from \"../../theme/types\";\n\ntype Tab = \"navbar\" | \"footer\";\n\nexport default function LayoutSettingsPage() {\n const { theme } = useContext(AdminConfigContext);\n const [activeTab, setActiveTab] = useState<Tab>(\"navbar\");\n const [navbarConfig, setNavbarConfig] = useState<NavbarConfig>({\n logo: \"\",\n items: [],\n ctaLabel: \"\",\n ctaUrl: \"\",\n });\n const [footerValues, setFooterValues] = useState<Record<string, any>>({});\n const [saving, setSaving] = useState(false);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n fetch(\"/api/settings/theme\")\n .then((r) => (r.ok ? r.json() : null))\n .then((data) => {\n if (!data) return;\n if (data.navbar) {\n try {\n setNavbarConfig(JSON.parse(data.navbar));\n } catch {}\n }\n if (data.footer) {\n try {\n setFooterValues(JSON.parse(data.footer));\n } catch {}\n }\n })\n .finally(() => setLoading(false));\n }, []);\n\n const handleSave = async () => {\n setSaving(true);\n try {\n await fetch(\"/api/settings/theme\", {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n navbar: JSON.stringify(navbarConfig),\n footer: JSON.stringify(footerValues),\n }),\n });\n } finally {\n setSaving(false);\n }\n };\n\n const footerLayout = theme?.layout?.footer;\n const footerMeta = footerLayout\n ? {\n name: \"Footer\",\n label: \"Footer Settings\",\n category: \"layout\",\n icon: \"LayoutTemplate\",\n description: \"Footer configuration\",\n defaultProps: footerLayout.defaults || {},\n props: footerLayout.fields,\n }\n : null;\n\n if (loading) {\n return (\n <div className=\"flex items-center justify-center py-12\">\n <div className=\"animate-spin rounded-full h-6 w-6 border-2 border-gray-300 border-t-gray-600\" />\n </div>\n );\n }\n\n return (\n <div className=\"min-w-0 rounded-lg bg-white shadow-md\">\n <div className=\"bg-gray-800 px-4 py-2.5 rounded-t-lg flex items-center justify-between\">\n <div>\n <h1 className=\"text-xl font-bold text-white\">Layout Settings</h1>\n <p className=\"text-xs text-gray-300 mt-0.5\">Configure your site navbar and footer</p>\n </div>\n <Button\n onClick={handleSave}\n disabled={saving}\n className=\"bg-white text-gray-800 hover:bg-gray-100 border-0 text-xs\"\n >\n <Save className=\"h-4 w-4 mr-2\" />\n {saving ? \"Saving...\" : \"Save\"}\n </Button>\n </div>\n\n <div className=\"border-b\">\n <div className=\"flex\">\n <button\n className={`px-4 py-2.5 text-sm font-medium border-b-2 ${\n activeTab === \"navbar\"\n ? \"border-gray-800 text-gray-800\"\n : \"border-transparent text-gray-500 hover:text-gray-700\"\n }`}\n onClick={() => setActiveTab(\"navbar\")}\n >\n Navbar\n </button>\n <button\n className={`px-4 py-2.5 text-sm font-medium border-b-2 ${\n activeTab === \"footer\"\n ? \"border-gray-800 text-gray-800\"\n : \"border-transparent text-gray-500 hover:text-gray-700\"\n }`}\n onClick={() => setActiveTab(\"footer\")}\n >\n Footer\n </button>\n </div>\n </div>\n\n <div className=\"min-w-0 p-6\">\n {activeTab === \"navbar\" && (\n <NavbarEditor config={navbarConfig} onChange={setNavbarConfig} />\n )}\n {activeTab === \"footer\" && footerMeta && (\n <ComponentSettings\n meta={footerMeta}\n values={footerValues}\n onChange={(name, val) =>\n setFooterValues((prev) => ({ ...prev, [name]: val }))\n }\n />\n )}\n {activeTab === \"footer\" && !footerMeta && (\n <p className=\"text-sm text-gray-500\">\n No footer configuration defined in the current theme.\n </p>\n )}\n </div>\n </div>\n );\n}\n","export interface AdminNavItem {\n href: string;\n label: string;\n icon?: string;\n}\n\nexport const DEFAULT_ADMIN_NAV: AdminNavItem[] = [\n { href: '/admin/dashboard', label: 'Dashboard' },\n { href: '/admin/contacts', label: 'Contacts' },\n { href: '/admin/blogs', label: 'Blogs' },\n { href: '/admin/users', label: 'Users' },\n { href: '/admin/forms', label: 'Forms' },\n { href: '/admin/submissions', label: 'Submissions' },\n { href: '/admin/pages', label: 'Pages' },\n];\n","'use client';\n\nimport { SessionProvider } from 'next-auth/react';\nimport { ThemeProvider } from 'next-themes';\nimport { Toaster } from 'sonner';\n\nexport function CmsProviders({ children }: { children: React.ReactNode }) {\n return (\n <SessionProvider>\n <ThemeProvider attribute=\"class\" defaultTheme=\"system\" enableSystem>\n {children}\n <Toaster position=\"top-right\" />\n </ThemeProvider>\n </SessionProvider>\n );\n}\n"],"mappings":"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","names":["React","useEffect","useState","useSession","usePathname","React","jsx","jsx","jsx","jsxs","Link","Image","Settings","jsx","jsxs","Icon","Link","Settings","Image","Link","usePathname","useContext","LayoutDashboard","Inbox","MessageSquare","File","ShoppingCart","ShoppingBag","Users","jsx","jsxs","usePathname","useContext","LayoutDashboard","Inbox","MessageSquare","File","ShoppingCart","Users","ShoppingBag","Icon","Link","React","cva","jsx","jsxs","jsx","cva","jsxs","Fragment","jsx","jsxs","useEffect","useSession","usePathname","useState","id","React","Toaster","jsx","jsxs","Toaster","useEffect","useState","useState","useEffect","X","React","jsx","React","jsx","React","Check","ChevronDown","jsx","jsxs","jsxs","jsx","ChevronDown","Check","React","jsx","React","cva","jsx","cva","Label","useState","React","jsx","jsx","jsxs","useState","useState","useEffect","ChevronDown","jsx","jsxs","useState","useEffect","ChevronDown","jsx","jsxs","useState","useEffect","X","Label","React","jsx","React","ChevronRight","MoreHorizontal","jsx","jsxs","ChevronRight","MoreHorizontal","React","X","jsx","jsxs","jsx","jsxs","X","Check","X","Upload","Download","Link","useState","useEffect","useRef","X","jsx","jsxs","useState","useRef","useEffect","e","Fragment","jsx","jsxs","Check","X","useState","useEffect","error","Link","Upload","Download","useState","useEffect","useCallback","cva","jsx","cva","X","Plus","Trash2","useRouter","useState","Plus","X","jsx","jsxs","useState","jsx","jsxs","useState","useRouter","useCallback","useEffect","X","Plus","Trash2","useState","useEffect","useState","useRef","useCallback","Upload","X","ImageIcon","AlertCircle","Image","jsx","jsxs","useState","useRef","useCallback","error","X","AlertCircle","Upload","ImageIcon","X","Save","AlertCircle","useRouter","useState","useEffect","useRef","useCallback","X","Plus","Search","Fragment","jsx","jsxs","useState","useRef","useCallback","useEffect","useState","useEffect","useRef","X","Plus","Search","Check","Fragment","jsx","jsxs","useState","useRef","useEffect","useState","useEffect","useRef","X","Search","Check","jsx","jsxs","useState","useRef","useEffect","jsx","jsxs","useState","useEffect","useRouter","quillModules","Save","X","AlertCircle","useEffect","useRef","jsx","jsxs","Title","jsx","jsxs","MapPin","Users","jsx","jsxs","jsx","jsxs","usePathname","useEffect","jsx","jsxs","usePathname","useState","useEffect","jsx","jsxs","useState","useEffect","Label","useState","useEffect","Plus","Trash2","ChevronDown","ChevronRight","ArrowLeft","jsx","jsxs","useState","useEffect","Label","jsxs","jsx","Label","Plus","Link","useState","useEffect","useRouter","Image","Image","jsx","jsxs","INFURO_FOOTER_LABEL","INFURO_FOOTER_URL","Image","jsx","jsxs","Image","jsx","jsxs","useState","useRouter","useEffect","error","Link","useState","Link","jsx","jsxs","useState","Label","Link","useState","useEffect","Link","jsx","jsxs","useState","useEffect","Link","Label","useState","useEffect","Suspense","useSearchParams","jsx","jsxs","useSearchParams","useState","useEffect","Label","Suspense","useSession","useEffect","useState","Users","Eye","ClipboardList","Fragment","jsx","jsxs","useSession","useState","useEffect","useState","useEffect","useContext","useRouter","useState","useEffect","X","Save","AlertCircle","useRouter","dynamic","jsx","jsxs","quillStyles","ReactQuill","useState","useEffect","useEffect","useState","Link","ArrowLeft","Link","useRouter","ArrowLeft","MoreVertical","X","jsx","jsxs","useRouter","Link","ArrowLeft","MoreVertical","X","jsx","jsxs","useState","useEffect","Link","ArrowLeft","useEffect","useState","Link","useRouter","X","jsx","jsxs","Fragment","jsx","jsxs","useRouter","useState","useEffect","Link","X","useEffect","useState","Link","useRouter","X","Fragment","jsx","jsxs","formatMoney","useRouter","useState","useEffect","Link","X","useEffect","useState","Link","useRouter","Plus","X","Fragment","jsx","jsxs","formatMoney","formatAddress","useRouter","useState","useEffect","Link","X","Plus","useState","useEffect","useContext","useSearchParams","toast","Save","Fragment","jsx","jsxs","useSearchParams","useContext","useState","useEffect","toast","Label","Save","useState","useEffect","useCallback","useRef","Upload","Search","ImageIcon","FileText","File","Trash2","toast","jsx","jsxs","useState","useRef","useCallback","useEffect","useState","useEffect","useContext","useRef","Save","X","ChevronDown","ChevronRight","LayoutDashboard","Layers","useRouter","React","Fragment","jsx","jsxs","Icon","useRef","useEffect","useState","ChevronRight","ChevronDown","Label","LayoutDashboard","Layers","useContext","useRouter","Save","X","useContext","CreditCard","Puzzle","CheckCircle2","jsx","jsxs","CreditCard","Icon","Puzzle","useContext","CheckCircle2","useState","useEffect","useRouter","AlertCircle","jsx","jsxs","res","Fragment","jsx","jsxs","useRouter","useState","useEffect","AlertCircle","jsx","jsxs","useState","useEffect","useRouter","useContext","isCreate","useState","useEffect","useContext","Save","jsx","jsxs","useContext","useState","useEffect","Save","SessionProvider","Toaster","jsx","jsxs"]}