@infuro/cms-core 1.0.10 → 1.0.11

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/admin/index.tsx","../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/JoditRichText.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/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/lib/email-recipients.ts","../src/admin/pages/BrandEditPage.tsx","../src/components/Admin/SeoSection.tsx","../src/admin/pages/ProductEditPage.tsx","../src/components/Admin/AttributeFacetNameInput.tsx","../src/admin/pages/CollectionEditPage.tsx","../src/admin/pages/RolesPage.tsx","../src/auth/permission-entities.ts","../src/admin/store-crud-configs.ts","../src/admin/pages/LayoutSettingsPage.tsx","../src/admin/config.ts","../src/admin/CmsProviders.tsx"],"sourcesContent":["'use client';\n\n// Default export: admin layout (theme/shell owned by core, WordPress-style)\nexport { default } from './pages/AdminLayout';\nexport { default as AdminLayout } from './pages/AdminLayout';\n\nexport { AdminShell } from './AdminShell';\nexport {\n AdminHeader,\n AdminSidebar,\n AdminCRUD,\n CreateEditForm,\n FormBuilder,\n BlogEditorPage,\n AnalyticsChart,\n DailyUserChart,\n GeographicMap,\n AnalyticsCard,\n AnalyticsExclusion,\n CategoryAutocomplete,\n TagAutocomplete,\n UserAutocomplete,\n ComponentSettings,\n NavbarEditor,\n JoditRichText,\n} from './components/index';\n\nexport { default as AdminSignInPage } from './pages/SignInPage';\nexport { default as AdminForgotPasswordPage } from './pages/ForgotPasswordPage';\nexport { default as AdminResetPasswordPage } from './pages/ResetPasswordPage';\nexport { default as AdminInvitePage } from './pages/InvitePage';\nexport { default as AdminDashboardPage } from './pages/DashboardPage';\nexport { default as AdminPageResolver } from './pages/AdminPageResolver';\nexport { default as AdminSettingsPage } from './pages/SettingsPage';\nexport { default as LayoutSettingsPage } from './pages/LayoutSettingsPage';\nexport { default as PageBuilderPage } from './pages/PageBuilderPage';\nexport { default as BrandEditPage } from './pages/BrandEditPage';\nexport { default as ProductEditPage } from './pages/ProductEditPage';\nexport { default as CollectionEditPage } from './pages/CollectionEditPage';\nexport { default as DetailPageHeader } from '../components/Admin/DetailPageHeader';\nexport { default as DetailPageLayout } from '../components/Admin/DetailPageLayout';\nexport type { DetailPageHeaderMenuItem } from '../components/Admin/DetailPageHeader';\n\nexport { DEFAULT_ADMIN_NAV } from './config';\nexport { STORE_CRUD_CONFIGS } from './store-crud-configs';\nexport type { AdminNavItem } from './config';\n\nexport { AdminConfigContext } from './admin-config-context';\nexport type { CustomNavItem, CustomNavSection, CustomCrudConfig, CustomCrudColumn, ThemeRegistryItem, PluginDescriptor } from './admin-config-context';\nexport type { AdminLayoutProps } from './pages/AdminLayout';\nexport { CmsProviders } from './CmsProviders';\n","\"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 Shield,\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/roles\" className={`${linkCls} ${isActive(\"/admin/roles\") ? linkActive : linkInactive}`}><Shield className={`h-4 w-4 mr-2 ${isActive(\"/admin/roles\") ? iconActive : iconInactive}`} />Roles</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', 'llm') */\n icon?: string;\n /** When set, plugin card shows inline form that loads/saves /api/settings/{settingsGroup} (e.g. 'llm') */\n settingsGroup?: 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 manageUserGroups,\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 /** When true, show group (role) selector for each user; requires GET /api/admin/roles. */\n manageUserGroups?: boolean;\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 [roleOptions, setRoleOptions] = useState<{ id: number; name: string }[]>([]);\n const isMobile = useIsMobile();\n const showGroupColumn = !!manageUserGroups && roleOptions.length > 0;\n\n useEffect(() => {\n if (!manageUserGroups) return;\n fetch(\"/api/admin/roles\")\n .then((r) => (r.ok ? r.json() : null))\n .then((data: { groups?: { id: number; name: string }[] } | null) => {\n if (data?.groups?.length) setRoleOptions(data.groups.map((g) => ({ id: g.id, name: g.name })));\n })\n .catch(() => {});\n }, [manageUserGroups]);\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 handleUserGroupChange = async (userId: number, groupId: number) => {\n try {\n const res = await fetch(`/api/users/${userId}`, {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ groupId }),\n });\n if (!res.ok) return;\n const updated = await res.json();\n setData((prev) =>\n prev.map((row) => (Number(row.id) === userId ? { ...row, ...updated } : row))\n );\n } catch {\n /* ignore */\n }\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 {showGroupColumn && (\n <div className=\"text-sm text-gray-600 flex gap-1 items-center min-w-0\">\n <span className=\"shrink-0\">Group:</span>\n <select\n className=\"max-w-full rounded border border-gray-300 px-2 py-1 text-sm dark:border-gray-600 dark:bg-gray-800\"\n value={\n item.groupId != null && roleOptions.some((g) => g.id === item.groupId)\n ? String(item.groupId)\n : \"\"\n }\n onChange={(e) => {\n const v = e.target.value;\n if (v) handleUserGroupChange(Number(item.id), Number(v));\n }}\n >\n <option value=\"\">—</option>\n {roleOptions.map((g) => (\n <option key={g.id} value={g.id}>\n {g.name}\n </option>\n ))}\n </select>\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 {showGroupColumn && <TableHead className=\"min-w-[140px]\">Group</TableHead>}\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 {showGroupColumn && (\n <TableCell>\n <select\n className=\"max-w-[180px] rounded border border-gray-300 px-2 py-1 text-sm dark:border-gray-600 dark:bg-gray-800\"\n value={\n item.groupId != null && roleOptions.some((g) => g.id === item.groupId)\n ? String(item.groupId)\n : \"\"\n }\n onChange={(e) => {\n const v = e.target.value;\n if (v) handleUserGroupChange(Number(item.id), Number(v));\n }}\n >\n <option value=\"\">—</option>\n {roleOptions.map((g) => (\n <option key={g.id} value={g.id}>\n {g.name}\n </option>\n ))}\n </select>\n </TableCell>\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\n colSpan={columns ? columns.length + 1 + (showGroupColumn ? 1 : 0) : 1}\n className=\"text-center py-8\"\n >\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 TagAutocomplete from \"./TagAutocomplete\";\nimport JoditRichText from \"./JoditRichText\";\nimport CategoryAutocomplete from \"./CategoryAutocomplete\";\nimport UserAutocomplete from \"./UserAutocomplete\";\n\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 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 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 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 <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 <JoditRichText\n value={content}\n onChange={setContent}\n placeholder=\"Write your blog content here...\"\n minHeight={800}\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 res = await response.json();\n const tags = Array.isArray(res?.data) ? res.data : [];\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 dynamic from 'next/dynamic';\nimport { useMemo } from 'react';\nimport 'jodit/es2021/jodit.min.css';\n\nconst JoditEditor = dynamic(() => import('jodit-react').then((m) => m.default), {\n ssr: false,\n loading: () => <div className=\"min-h-[300px] rounded-md border border-gray-200 bg-gray-50 animate-pulse\" />,\n});\n\nexport interface JoditRichTextProps {\n value: string;\n onChange: (html: string) => void;\n placeholder?: string;\n minHeight?: number;\n}\n\nexport default function JoditRichText({ value, onChange, placeholder, minHeight = 400 }: JoditRichTextProps) {\n const config = useMemo(\n () => ({\n readonly: false,\n placeholder: placeholder ?? '',\n height: minHeight,\n toolbarSticky: false,\n toolbarButtonSize: 'small' as const,\n showCharsCounter: false,\n showWordsCounter: false,\n disablePlugins: ['poweredByJodit'],\n buttons: [\n 'source',\n '|',\n 'bold',\n 'italic',\n 'underline',\n 'strikethrough',\n '|',\n 'ul',\n 'ol',\n '|',\n 'fontsize',\n 'brush',\n 'paragraph',\n '|',\n 'link',\n 'image',\n 'video',\n '|',\n 'align',\n '|',\n 'outdent',\n 'indent',\n '|',\n 'table',\n '|',\n 'hr',\n 'eraser',\n '|',\n 'undo',\n 'redo',\n '|',\n 'fullsize',\n ],\n uploader: {\n url: '/api/upload',\n method: 'POST' as const,\n format: 'json',\n filesVariableName: () => 'file',\n isSuccess: (resp: { error?: string }) => !resp?.error,\n getMessage: (resp: { error?: string }) => resp?.error ?? '',\n process: (resp: { filePath?: string }) => ({\n files: resp.filePath ? [resp.filePath] : [],\n path: '',\n baseurl: '',\n }),\n },\n }),\n [placeholder, minHeight]\n );\n\n return (\n <div className=\"jodit-rich-text [&_.jodit-container]:!border-0 [&_.jodit-workplace]:!min-h-0\">\n <JoditEditor value={value} config={config} onChange={onChange} />\n </div>\n );\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 res = await response.json();\n const categories = Array.isArray(res?.data) ? res.data : [];\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, useSession } 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 const { update } = useSession();\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 await update();\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 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 ProductEditPage from './ProductEditPage';\nimport CollectionEditPage from './CollectionEditPage';\nimport RolesPage from './RolesPage';\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 roles: RolesPage,\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};\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\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 === '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 if (key === 'products') {\n return <ProductEditPage productId={subPath} />;\n }\n if (key === 'collections') {\n return <CollectionEditPage collectionId={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 manageUserGroups={key === 'users'}\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 { 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 <span className=\"text-sm text-gray-400\">\n {formatDateTime(order.createdAt)}\n </span>\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\">Status</dt>\n <dd>\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 </dd>\n </div>\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 space-y-3\">\n {payments.map((p) => (\n <div\n key={p.id}\n className=\"min-w-0 overflow-hidden border border-gray-200 rounded-lg p-4 bg-gray-50/50\"\n >\n <dl className=\"grid grid-cols-1 gap-2 text-sm\">\n <div className=\"min-w-0\">\n <dt className=\"text-gray-500\">Amount</dt>\n <dd className=\"font-medium text-gray-900\">{formatMoney(Number(p.amount), p.currency)}</dd>\n </div>\n <div className=\"min-w-0\">\n <dt className=\"text-gray-500\">Status</dt>\n <dd>\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 </dd>\n </div>\n <div className=\"min-w-0\">\n <dt className=\"text-gray-500\">Method</dt>\n <dd className=\"text-gray-900\">{p.method ?? \"—\"}</dd>\n </div>\n <div className=\"min-w-0\">\n <dt className=\"text-gray-500\">Paid at</dt>\n <dd className=\"text-gray-900\">{p.paidAt ? formatDateTime(p.paidAt) : \"—\"}</dd>\n </div>\n <div className=\"min-w-0\">\n <dt className=\"text-gray-500\">Gateway reference</dt>\n <dd className=\"text-gray-900 font-mono text-xs break-all\">\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 </dd>\n </div>\n </dl>\n </div>\n ))}\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 /** Omit for a single full-width main column (e.g. product/collection merchandising). */\n sidebar?: React.ReactNode;\n}) {\n if (sidebar == null) {\n return (\n <div className=\"min-w-0 w-full p-4 sm:p-6 space-y-6 max-w-4xl\">\n {main}\n </div>\n );\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 <span className=\"text-sm text-gray-400\">\n {formatDateTime(payment.createdAt)}\n </span>\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\">Status</dt>\n <dd>\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 </dd>\n </div>\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, useState, useEffect } from 'react';\nimport { HardDrive, Mail, CreditCard, MessageCircle, Puzzle, CheckCircle2, XCircle, Save, X, Plus } from 'lucide-react';\nimport { Badge } from '@/components/ui/badge';\nimport { parseEmailRecipientsFromConfig, serializeEmailRecipients } from '@/lib/email-recipients';\nimport { AdminConfigContext } from '../admin-config-context';\nimport type { PluginDescriptor } from '../admin-config-context';\nimport { Button } from '@/components/ui/button';\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 { toast } from 'sonner';\n\nconst ICON_MAP: Record<string, React.ComponentType<{ className?: string }>> = {\n storage: HardDrive,\n email: Mail,\n payment: CreditCard,\n llm: MessageCircle,\n};\n\nfunction splitInputToEmails(input: string): string[] {\n return input\n .split(/[,;]+/)\n .map((s) => s.trim())\n .filter(Boolean);\n}\n\ntype SocialLinkRow = { iconUrl: string; url: string; iconFallback: string };\n\nconst EMPTY_SOCIAL_ROW: SocialLinkRow = { iconUrl: '', url: '', iconFallback: '' };\n\nfunction rowsFromSocialSetting(raw: string): SocialLinkRow[] {\n if (!raw?.trim()) return [{ ...EMPTY_SOCIAL_ROW }];\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (!Array.isArray(parsed) || parsed.length === 0) return [{ ...EMPTY_SOCIAL_ROW }];\n return parsed.map((item) => {\n if (!item || typeof item !== 'object') return { ...EMPTY_SOCIAL_ROW };\n const o = item as Record<string, unknown>;\n let iconUrl = String(o.iconUrl ?? o.icon_image ?? '').trim();\n let iconFallback = String(o.icon ?? '').trim();\n if (!iconUrl && /^https?:\\/\\//i.test(iconFallback)) {\n iconUrl = iconFallback;\n iconFallback = '';\n }\n return { iconUrl, url: String(o.url ?? '').trim(), iconFallback };\n });\n } catch {\n return [{ ...EMPTY_SOCIAL_ROW }];\n }\n}\n\nfunction serializeSocialRows(rows: SocialLinkRow[]): string {\n const items = rows\n .filter((r) => r.url.trim())\n .map((r) => {\n const o: Record<string, string> = { url: r.url.trim() };\n if (r.iconUrl.trim()) o.iconUrl = r.iconUrl.trim();\n if (r.iconFallback.trim()) o.icon = r.iconFallback.trim();\n return o;\n });\n return JSON.stringify(items);\n}\n\nfunction EmailRecipientTags({\n id,\n label,\n hint,\n emails,\n onChange,\n placeholder,\n}: {\n id: string;\n label: string;\n hint: string;\n emails: string[];\n onChange: (next: string[]) => void;\n placeholder?: string;\n}) {\n const [draft, setDraft] = useState('');\n\n const commitDraft = () => {\n const parts = splitInputToEmails(draft);\n if (!parts.length) return;\n const next = [...emails];\n for (const p of parts) {\n if (!next.includes(p)) next.push(p);\n }\n onChange(next);\n setDraft('');\n };\n\n return (\n <div className=\"space-y-1\">\n <Label htmlFor={id} className=\"text-sm\">{label}</Label>\n <div\n className=\"flex min-h-9 flex-wrap items-center gap-1.5 rounded-md border border-input bg-background px-2 py-1.5 text-sm ring-offset-background focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2 dark:border-gray-600\"\n >\n {emails.map((email) => (\n <Badge key={email} variant=\"secondary\" className=\"gap-1 pr-0.5 font-normal\">\n <span className=\"max-w-[220px] truncate\">{email}</span>\n <button\n type=\"button\"\n className=\"rounded p-0.5 hover:bg-muted\"\n aria-label={`Remove ${email}`}\n onClick={() => onChange(emails.filter((e) => e !== email))}\n >\n <X className=\"h-3 w-3\" />\n </button>\n </Badge>\n ))}\n <input\n id={id}\n type=\"text\"\n inputMode=\"email\"\n autoComplete=\"off\"\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ',' || e.key === ';') {\n e.preventDefault();\n commitDraft();\n } else if (e.key === 'Backspace' && draft === '' && emails.length > 0) {\n onChange(emails.slice(0, -1));\n }\n }}\n onBlur={() => {\n if (draft.trim()) commitDraft();\n }}\n placeholder={emails.length ? '' : placeholder}\n className=\"min-w-[140px] flex-1 bg-transparent outline-none placeholder:text-muted-foreground\"\n />\n </div>\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">{hint}</p>\n </div>\n );\n}\n\nfunction PluginIcon({ descriptor, size = 'md' }: { descriptor: PluginDescriptor; size?: 'sm' | 'md' }) {\n const Icon = descriptor.icon ? ICON_MAP[descriptor.icon] ?? Puzzle : Puzzle;\n const sizeClass = size === 'sm' ? 'h-8 w-8' : 'h-11 w-11';\n const iconClass = size === 'sm' ? 'h-4 w-4' : 'h-5 w-5';\n return (\n <div className={`flex shrink-0 items-center justify-center rounded-lg bg-gray-100 text-gray-600 dark:bg-gray-700 dark:text-gray-300 ${sizeClass}`}>\n <Icon className={iconClass} />\n </div>\n );\n}\n\nfunction PluginSettingsPanel({\n descriptor,\n onSaved,\n}: {\n descriptor: PluginDescriptor;\n onSaved?: () => void;\n}) {\n const settingsGroup = descriptor.settingsGroup!;\n const isLlm = settingsGroup === 'llm';\n const isEmail = settingsGroup === 'email';\n const [enabled, setEnabled] = useState(true);\n const [botName, setBotName] = useState('');\n const [icon, setIcon] = useState('');\n const [iconImageUrl, setIconImageUrl] = useState('');\n const [iconBackgroundColor, setIconBackgroundColor] = useState('#6366f1');\n const [headerColor, setHeaderColor] = useState('#6366f1');\n const [salesTeamEmails, setSalesTeamEmails] = useState<string[]>([]);\n const [fulfilmentTeamEmails, setFulfilmentTeamEmails] = useState<string[]>([]);\n const [crmEmails, setCrmEmails] = useState<string[]>([]);\n const [logoUrl, setLogoUrl] = useState('');\n const [companyName, setCompanyName] = useState('');\n const [supportEmail, setSupportEmail] = useState('');\n const [supportPhone, setSupportPhone] = useState('');\n const [followUsTitle, setFollowUsTitle] = useState('Follow Us');\n const [socialLinkRows, setSocialLinkRows] = useState<SocialLinkRow[]>([{ ...EMPTY_SOCIAL_ROW }]);\n const [footerDisclaimer, setFooterDisclaimer] = useState('');\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n\n useEffect(() => {\n fetch(`/api/settings/${settingsGroup}`)\n .then((r) => (r.ok ? r.json() : {}))\n .then((data: Record<string, string>) => {\n setEnabled(data.enabled !== 'false');\n setBotName(data.botName ?? '');\n setIcon(data.icon ?? '');\n if (isLlm) {\n setIconImageUrl(data.iconImageUrl ?? '');\n setIconBackgroundColor(data.iconBackgroundColor ?? '#6366f1');\n setHeaderColor(data.headerColor ?? '#6366f1');\n }\n if (isEmail) {\n const sales = parseEmailRecipientsFromConfig(data.salesTeamEmails ?? data.salesTeamEmail);\n const fulfil = parseEmailRecipientsFromConfig(data.fulfilmentTeamEmails ?? data.fulfilmentTeamEmail);\n const crm = parseEmailRecipientsFromConfig(data.crmEmails ?? data.crmEmail);\n setSalesTeamEmails(sales);\n setFulfilmentTeamEmails(fulfil);\n setCrmEmails(crm);\n setLogoUrl(data.logoUrl ?? '');\n setCompanyName(data.companyName ?? '');\n setSupportEmail(data.supportEmail ?? '');\n setSupportPhone(data.supportPhone ?? '');\n setFollowUsTitle(data.followUsTitle?.trim() ? data.followUsTitle : 'Follow Us');\n setSocialLinkRows(rowsFromSocialSetting(data.socialLinks ?? ''));\n setFooterDisclaimer(data.footerDisclaimer ?? '');\n }\n })\n .finally(() => setLoading(false));\n }, [settingsGroup, isLlm, isEmail]);\n\n const buildPayload = () => {\n const payload: Record<string, { value: string; type: 'public' }> = {\n enabled: { value: enabled ? 'true' : 'false', type: 'public' },\n botName: { value: botName, type: 'public' },\n icon: { value: icon, type: 'public' },\n };\n if (isLlm) {\n payload.iconImageUrl = { value: iconImageUrl, type: 'public' };\n payload.iconBackgroundColor = { value: iconBackgroundColor, type: 'public' };\n payload.headerColor = { value: headerColor, type: 'public' };\n }\n if (isEmail) {\n payload.salesTeamEmails = { value: serializeEmailRecipients(salesTeamEmails), type: 'public' };\n payload.fulfilmentTeamEmails = { value: serializeEmailRecipients(fulfilmentTeamEmails), type: 'public' };\n payload.crmEmails = { value: serializeEmailRecipients(crmEmails), type: 'public' };\n payload.logoUrl = { value: logoUrl, type: 'public' };\n payload.companyName = { value: companyName, type: 'public' };\n payload.supportEmail = { value: supportEmail, type: 'public' };\n payload.supportPhone = { value: supportPhone, type: 'public' };\n payload.followUsTitle = { value: followUsTitle, type: 'public' };\n payload.socialLinks = { value: serializeSocialRows(socialLinkRows), type: 'public' };\n payload.footerDisclaimer = { value: footerDisclaimer, type: 'public' };\n }\n return payload;\n };\n\n const handleSave = async () => {\n setSaving(true);\n try {\n const res = await fetch(`/api/settings/${settingsGroup}`, {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(buildPayload()),\n });\n if (!res.ok) throw new Error();\n toast.success('Settings saved');\n onSaved?.();\n } catch {\n toast.error('Failed to save');\n } finally {\n setSaving(false);\n }\n };\n\n if (loading) return <div className=\"text-sm text-gray-500 dark:text-gray-400\">Loading...</div>;\n if (isEmail) {\n return (\n <div className=\"space-y-4\">\n <EmailRecipientTags\n id={`${settingsGroup}-salesTeamEmails`}\n label=\"Sales team (orders)\"\n hint=\"Order confirmations and sales notifications. Type an address and press Enter; comma or semicolon also splits multiple.\"\n emails={salesTeamEmails}\n onChange={setSalesTeamEmails}\n placeholder=\"e.g. sales@example.com\"\n />\n <EmailRecipientTags\n id={`${settingsGroup}-fulfilmentTeamEmails`}\n label=\"Fulfilment team\"\n hint=\"Shipping and fulfilment updates.\"\n emails={fulfilmentTeamEmails}\n onChange={setFulfilmentTeamEmails}\n placeholder=\"e.g. fulfilment@example.com\"\n />\n <EmailRecipientTags\n id={`${settingsGroup}-crmEmails`}\n label=\"CRM (contact / form submissions)\"\n hint=\"Form submissions and contact notifications.\"\n emails={crmEmails}\n onChange={setCrmEmails}\n placeholder=\"e.g. crm@example.com\"\n />\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">Layout below merges with Branding settings; values here override branding when set. Use absolute URLs for logos in email.</p>\n <div className=\"space-y-1\">\n <Label htmlFor={`${settingsGroup}-logoUrl`} className=\"text-sm\">Logo URL (optional override)</Label>\n <Input id={`${settingsGroup}-logoUrl`} value={logoUrl} onChange={(e) => setLogoUrl(e.target.value)} placeholder=\"https://…\" className=\"h-8 text-sm\" />\n </div>\n <div className=\"space-y-1\">\n <Label htmlFor={`${settingsGroup}-companyName`} className=\"text-sm\">Company name (optional override)</Label>\n <Input id={`${settingsGroup}-companyName`} value={companyName} onChange={(e) => setCompanyName(e.target.value)} className=\"h-8 text-sm\" />\n </div>\n <div className=\"space-y-1\">\n <Label htmlFor={`${settingsGroup}-supportEmail`} className=\"text-sm\">Support email (footer)</Label>\n <Input id={`${settingsGroup}-supportEmail`} value={supportEmail} onChange={(e) => setSupportEmail(e.target.value)} type=\"email\" className=\"h-8 text-sm\" />\n </div>\n <div className=\"space-y-1\">\n <Label htmlFor={`${settingsGroup}-supportPhone`} className=\"text-sm\">Support phone (footer)</Label>\n <Input id={`${settingsGroup}-supportPhone`} value={supportPhone} onChange={(e) => setSupportPhone(e.target.value)} className=\"h-8 text-sm\" />\n </div>\n <div className=\"space-y-1\">\n <Label htmlFor={`${settingsGroup}-followUsTitle`} className=\"text-sm\">“Follow us” heading</Label>\n <Input id={`${settingsGroup}-followUsTitle`} value={followUsTitle} onChange={(e) => setFollowUsTitle(e.target.value)} className=\"h-8 text-sm\" />\n </div>\n <div className=\"space-y-2\">\n <Label className=\"text-sm\">Social links</Label>\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">Add rows: icon image URL (optional), link URL, and emoji/text only if you are not using an image.</p>\n {socialLinkRows.map((row, i) => (\n <div key={i} className=\"flex flex-wrap items-end gap-2 border-b border-border/60 pb-3 dark:border-gray-600\">\n <div className=\"min-w-[160px] flex-1 space-y-1\">\n <Label className=\"text-xs text-muted-foreground\">Icon image URL</Label>\n <Input\n value={row.iconUrl}\n onChange={(e) => {\n const next = [...socialLinkRows];\n next[i] = { ...next[i], iconUrl: e.target.value };\n setSocialLinkRows(next);\n }}\n placeholder=\"https://…\"\n className=\"h-8 text-sm\"\n />\n </div>\n <div className=\"min-w-[160px] flex-1 space-y-1\">\n <Label className=\"text-xs text-muted-foreground\">Link URL</Label>\n <Input\n value={row.url}\n onChange={(e) => {\n const next = [...socialLinkRows];\n next[i] = { ...next[i], url: e.target.value };\n setSocialLinkRows(next);\n }}\n placeholder=\"https://…\"\n className=\"h-8 text-sm\"\n />\n </div>\n <div className=\"w-[120px] space-y-1\">\n <Label className=\"text-xs text-muted-foreground\">Emoji / text</Label>\n <Input\n value={row.iconFallback}\n onChange={(e) => {\n const next = [...socialLinkRows];\n next[i] = { ...next[i], iconFallback: e.target.value };\n setSocialLinkRows(next);\n }}\n placeholder=\"e.g. 🌐\"\n className=\"h-8 text-sm\"\n />\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0\"\n aria-label=\"Remove row\"\n disabled={socialLinkRows.length <= 1}\n onClick={() => {\n if (socialLinkRows.length <= 1) setSocialLinkRows([{ ...EMPTY_SOCIAL_ROW }]);\n else setSocialLinkRows(socialLinkRows.filter((_, j) => j !== i));\n }}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n ))}\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"mt-1\"\n onClick={() => setSocialLinkRows([...socialLinkRows, { ...EMPTY_SOCIAL_ROW }])}\n >\n <Plus className=\"mr-1 h-4 w-4\" />\n Add link\n </Button>\n </div>\n <div className=\"space-y-1\">\n <Label htmlFor={`${settingsGroup}-footerDisclaimer`} className=\"text-sm\">Footer disclaimer</Label>\n <Textarea\n id={`${settingsGroup}-footerDisclaimer`}\n value={footerDisclaimer}\n onChange={(e) => setFooterDisclaimer(e.target.value)}\n rows={4}\n className=\"text-sm\"\n />\n </div>\n <Button size=\"sm\" onClick={handleSave} disabled={saving}>{saving ? 'Saving…' : 'Save'}</Button>\n </div>\n );\n }\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between gap-2\">\n <Label htmlFor={`${settingsGroup}-enabled`} className=\"text-sm\">Enabled</Label>\n <Switch id={`${settingsGroup}-enabled`} checked={enabled} onCheckedChange={setEnabled} />\n </div>\n <div className=\"space-y-1\">\n <Label htmlFor={`${settingsGroup}-botName`} className=\"text-sm\">Name</Label>\n <Input\n id={`${settingsGroup}-botName`}\n value={botName}\n onChange={(e) => setBotName(e.target.value)}\n placeholder=\"e.g. Support Bot\"\n className=\"h-8 text-sm\"\n />\n </div>\n {isLlm ? (\n <>\n <div className=\"space-y-1\">\n <Label htmlFor={`${settingsGroup}-iconImageUrl`} className=\"text-sm\">Icon image URL</Label>\n <Input\n id={`${settingsGroup}-iconImageUrl`}\n value={iconImageUrl}\n onChange={(e) => setIconImageUrl(e.target.value)}\n placeholder=\"https://… or /images/chat-icon.png\"\n className=\"h-8 text-sm\"\n />\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">PNG or image URL. Leave empty to use emoji below.</p>\n </div>\n <div className=\"space-y-1\">\n <Label htmlFor={`${settingsGroup}-icon`} className=\"text-sm\">Icon fallback (emoji)</Label>\n <Input\n id={`${settingsGroup}-icon`}\n value={icon}\n onChange={(e) => setIcon(e.target.value)}\n placeholder=\"e.g. 💬\"\n className=\"h-8 text-sm w-20\"\n />\n </div>\n <div className=\"flex gap-4\">\n <div className=\"space-y-1\">\n <Label htmlFor={`${settingsGroup}-iconBg`} className=\"text-sm\">Icon background</Label>\n <div className=\"flex items-center gap-2\">\n <input\n type=\"color\"\n id={`${settingsGroup}-iconBg`}\n value={iconBackgroundColor}\n onChange={(e) => setIconBackgroundColor(e.target.value)}\n className=\"h-8 w-10 cursor-pointer rounded border border-gray-300 dark:border-gray-600\"\n />\n <Input\n value={iconBackgroundColor}\n onChange={(e) => setIconBackgroundColor(e.target.value)}\n className=\"h-8 w-24 text-sm font-mono\"\n />\n </div>\n </div>\n <div className=\"space-y-1\">\n <Label htmlFor={`${settingsGroup}-headerColor`} className=\"text-sm\">Header color</Label>\n <div className=\"flex items-center gap-2\">\n <input\n type=\"color\"\n id={`${settingsGroup}-headerColor`}\n value={headerColor}\n onChange={(e) => setHeaderColor(e.target.value)}\n className=\"h-8 w-10 cursor-pointer rounded border border-gray-300 dark:border-gray-600\"\n />\n <Input\n value={headerColor}\n onChange={(e) => setHeaderColor(e.target.value)}\n className=\"h-8 w-24 text-sm font-mono\"\n />\n </div>\n </div>\n </div>\n </>\n ) : (\n <div className=\"space-y-1\">\n <Label htmlFor={`${settingsGroup}-icon`} className=\"text-sm\">Icon (emoji or name)</Label>\n <Input\n id={`${settingsGroup}-icon`}\n value={icon}\n onChange={(e) => setIcon(e.target.value)}\n placeholder=\"e.g. 🤖 or llm\"\n className=\"h-8 text-sm\"\n />\n </div>\n )}\n <Button size=\"sm\" onClick={handleSave} disabled={saving} className=\"gap-1\">\n <Save className=\"h-3.5 w-3.5\" />\n Save\n </Button>\n </div>\n );\n}\n\nfunction PluginListItem({\n descriptor,\n enabled,\n selected,\n onSelect,\n}: {\n descriptor: PluginDescriptor;\n enabled: boolean;\n selected: boolean;\n onSelect: () => void;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onSelect}\n className={`flex w-full items-center gap-3 rounded-lg border px-3 py-2.5 text-left transition-colors ${\n selected\n ? 'border-gray-300 bg-gray-50 dark:border-gray-600 dark:bg-gray-700/50'\n : 'border-transparent hover:bg-gray-50 dark:hover:bg-gray-800/50'\n }`}\n >\n <PluginIcon descriptor={descriptor} size=\"sm\" />\n <div className=\"min-w-0 flex-1\">\n <div className=\"font-medium text-gray-900 dark:text-white truncate\">\n {descriptor.label || descriptor.name}\n </div>\n <div className=\"flex items-center gap-2 mt-0.5\">\n <span\n className={`inline-flex items-center gap-1 rounded-full px-1.5 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 ? <CheckCircle2 className=\"h-3 w-3\" /> : <XCircle className=\"h-3 w-3\" />}\n {enabled ? 'On' : 'Off'}\n </span>\n <span className=\"text-xs text-gray-400 dark:text-gray-500\">v{descriptor.version}</span>\n </div>\n </div>\n </button>\n );\n}\n\nexport default function PluginsPage() {\n const { pluginDescriptors = [] } = useContext(AdminConfigContext);\n const [selectedName, setSelectedName] = useState<string | null>(null);\n const [enabledMap, setEnabledMap] = useState<Record<string, boolean>>({});\n\n useEffect(() => {\n pluginDescriptors.forEach((p) => {\n if (!p.settingsGroup) return;\n fetch(`/api/settings/${p.settingsGroup}`)\n .then((r) => (r.ok ? r.json() : {}))\n .then((data: Record<string, string>) =>\n setEnabledMap((prev) => ({ ...prev, [p.name]: data.enabled !== 'false' }))\n )\n .catch(() => {});\n });\n }, [pluginDescriptors]);\n\n const selectedDescriptor = pluginDescriptors.find((p) => p.name === selectedName);\n const refreshEnabled = (name: string) => {\n const d = pluginDescriptors.find((p) => p.name === name);\n if (!d?.settingsGroup) return;\n fetch(`/api/settings/${d.settingsGroup}`)\n .then((r) => (r.ok ? r.json() : {}))\n .then((data: Record<string, string>) =>\n setEnabledMap((prev) => ({ ...prev, [name]: data.enabled !== 'false' }))\n )\n .catch(() => {});\n };\n\n return (\n <div className=\"min-w-0 rounded-lg bg-white shadow-md dark:bg-gray-800\">\n <div className=\"bg-gray-800 border-b border-gray-700 px-4 py-2.5 rounded-t-lg dark:bg-gray-900 dark:border-gray-700\">\n <h1 className=\"text-base font-semibold text-white\">Plugins</h1>\n <p className=\"text-xs text-gray-300 mt-0.5\">Registered plugins and their status</p>\n </div>\n\n <div className=\"min-w-0 p-6\">\n {pluginDescriptors.length === 0 ? (\n <div className=\"py-12 text-center\">\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=\"flex gap-6\">\n <div className=\"w-56 shrink-0 space-y-1\">\n {pluginDescriptors.map((p) => (\n <PluginListItem\n key={p.name}\n descriptor={p}\n enabled={p.settingsGroup ? (enabledMap[p.name] ?? p.enabled !== false) : (p.enabled !== false)}\n selected={selectedName === p.name}\n onSelect={() => setSelectedName(p.name)}\n />\n ))}\n </div>\n <div className=\"min-w-0 flex-1\">\n {!selectedName ? (\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\n <Puzzle className=\"h-10 w-10 text-gray-300 dark:text-gray-600\" />\n <p className=\"mt-3 text-sm text-gray-500 dark:text-gray-400\">\n Select a plugin to view or edit its configuration.\n </p>\n </div>\n ) : (\n <div className=\"rounded-lg border border-gray-200 bg-gray-50/50 p-5 dark:border-gray-700 dark:bg-gray-800/50\">\n {selectedDescriptor?.settingsGroup ? (\n <>\n <h2 className=\"text-sm font-medium text-gray-700 dark:text-gray-300 mb-4\">\n {selectedDescriptor.label || selectedDescriptor.name} — Configuration\n </h2>\n <PluginSettingsPanel\n descriptor={selectedDescriptor}\n onSaved={() => refreshEnabled(selectedDescriptor.name)}\n />\n </>\n ) : (\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\n <Puzzle className=\"h-10 w-10 text-gray-300 dark:text-gray-600\" />\n <p className=\"mt-3 text-sm text-gray-500 dark:text-gray-400\">\n No configuration available for this plugin.\n </p>\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}\n","/** Parse stored config value into a list of emails (JSON array, or comma/semicolon-separated string). */\nexport function parseEmailRecipientsFromConfig(raw: string | undefined | null): string[] {\n if (raw == null || raw === '') return [];\n const trimmed = raw.trim();\n if (trimmed.startsWith('[')) {\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n if (Array.isArray(parsed)) {\n return parsed.map((e) => String(e).trim()).filter(Boolean);\n }\n } catch {\n // fall through\n }\n }\n return trimmed\n .split(/[,;]+/)\n .map((s) => s.trim())\n .filter(Boolean);\n}\n\n/** Serialize email list for config storage (JSON array in DB). */\nexport function serializeEmailRecipients(emails: string[]): string {\n return JSON.stringify(emails);\n}\n\n/** Join for SMTP `to` header (multiple recipients). */\nexport function joinRecipientsForSend(emails: string[]): string | null {\n if (!emails.length) return null;\n return emails.join(', ');\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","\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport { useRouter } from \"next/navigation\";\nimport { AlertCircle, Plus, Trash2, Star } 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\";\nimport AttributeFacetNameInput from \"../../components/Admin/AttributeFacetNameInput\";\n\ntype Collection = { id: number; name: string };\ntype Brand = { id: number; name: string };\ntype Category = { id: number; name: string };\ntype ProductAttribute = { attributeId: number; value: string };\ntype FacetRow = { name: string; value: string };\ntype ImageRow = { url: string; alt: string; isDefault: boolean };\ntype SpecRow = { key: string; value: string };\n\nconst isCreate = (id: string) => id === \"create\";\nconst sectionCls = \"min-w-0 overflow-hidden border border-gray-200 rounded-lg p-4 bg-gray-50/50\";\nconst labelCls = \"block text-xs font-medium text-gray-600 mb-1\";\nconst inputCls = \"w-full rounded-md border border-gray-300 px-2 py-1.5 text-sm\";\n\nfunction buildProductMetadata(\n other: Record<string, unknown>,\n opts: { description: string; images: ImageRow[]; specifications: SpecRow[] }\n): Record<string, unknown> | null {\n const base: Record<string, unknown> = { ...other };\n if (opts.description.trim()) base.description = opts.description.trim();\n else delete base.description;\n\n const filled = opts.images.filter((i) => i.url.trim());\n const imagesOut = filled.map((i, idx) => ({\n url: i.url.trim(),\n alt: i.alt.trim() || undefined,\n sortOrder: idx,\n isDefault: !!i.isDefault,\n }));\n if (imagesOut.length) {\n const defaultIdx = imagesOut.findIndex((x) => x.isDefault);\n imagesOut.forEach((x, i) => {\n x.isDefault = (defaultIdx >= 0 ? i === defaultIdx : i === 0);\n });\n base.images = imagesOut;\n }\n else delete base.images;\n\n const specs = opts.specifications\n .filter((s) => s.key.trim() && s.value.trim())\n .map((s) => ({ key: s.key.trim(), value: s.value.trim() }));\n if (specs.length) base.specifications = specs;\n else delete base.specifications;\n\n return Object.keys(base).length ? base : null;\n}\n\nfunction pickOtherMetadata(m: Record<string, unknown> | null | undefined): Record<string, unknown> {\n if (!m || typeof m !== \"object\" || Array.isArray(m)) return {};\n const { description: _d, images: _i, specifications: _s, ...rest } = m;\n return rest;\n}\n\nexport default function ProductEditPage({ productId }: { productId: string }) {\n const router = useRouter();\n const create = isCreate(productId);\n const [loading, setLoading] = useState(!create);\n const [saving, setSaving] = useState(false);\n const [errors, setErrors] = useState<string[]>([]);\n\n const [collections, setCollections] = useState<Collection[]>([]);\n const [brands, setBrands] = useState<Brand[]>([]);\n const [categories, setCategories] = useState<Category[]>([]);\n\n const [name, setName] = useState(\"\");\n const [sku, setSku] = useState(\"\");\n const [hsn, setHsn] = useState(\"\");\n const [collectionId, setCollectionId] = useState<number | null>(null);\n const [brandId, setBrandId] = useState<number | null>(null);\n const [categoryId, setCategoryId] = useState<number | null>(null);\n const [price, setPrice] = useState(\"\");\n const [compareAtPrice, setCompareAtPrice] = useState(\"\");\n const [quantity, setQuantity] = useState(1);\n const [status, setStatus] = useState<string>(\"draft\");\n const [featured, setFeatured] = useState(false);\n\n const [description, setDescription] = useState(\"\");\n const [images, setImages] = useState<ImageRow[]>([{ url: \"\", alt: \"\", isDefault: true }]);\n const [specifications, setSpecifications] = useState<SpecRow[]>([{ key: \"\", value: \"\" }]);\n const [otherMetadata, setOtherMetadata] = useState<Record<string, unknown>>({});\n const [facetRows, setFacetRows] = useState<FacetRow[]>([{ name: \"\", value: \"\" }]);\n\n const [seoId, setSeoId] = useState<number | null>(null);\n const [seo, setSeo] = useState<SeoFields>({\n seoTitle: \"\",\n seoDescription: \"\",\n seoKeywords: \"\",\n seoOgTitle: \"\",\n seoOgDescription: \"\",\n seoOgImage: \"\",\n });\n\n useEffect(() => {\n let cancelled = false;\n (async () => {\n try {\n const [colRes, brandRes, catRes, attrRes] = await Promise.all([\n fetch(\"/api/collections?limit=500\"),\n fetch(\"/api/brands?limit=500\"),\n fetch(\"/api/product_categories?limit=500\"),\n fetch(\"/api/attributes?limit=500\"),\n ]);\n let attrList: { id: number; name: string }[] = [];\n if (!cancelled && colRes.ok) {\n const d = await colRes.json();\n if (Array.isArray(d.data)) setCollections(d.data);\n }\n if (!cancelled && brandRes.ok) {\n const d = await brandRes.json();\n if (Array.isArray(d.data)) setBrands(d.data);\n }\n if (!cancelled && catRes.ok) {\n const d = await catRes.json();\n if (Array.isArray(d.data)) setCategories(d.data);\n }\n if (!cancelled && attrRes.ok) {\n const d = await attrRes.json();\n if (Array.isArray(d.data)) attrList = d.data;\n }\n if (create) {\n if (!cancelled) setLoading(false);\n return;\n }\n const res = await fetch(`/api/products/${productId}`);\n if (!res.ok) throw new Error(\"Failed to load product\");\n const product = await res.json();\n if (cancelled) return;\n\n setName(product.name ?? \"\");\n setSku(product.sku ?? \"\");\n setHsn(product.hsn ?? \"\");\n setCollectionId(product.collectionId ?? null);\n setBrandId(product.brandId ?? null);\n setCategoryId(product.categoryId ?? null);\n setPrice(product.price != null ? String(product.price) : \"\");\n setCompareAtPrice(product.compareAtPrice != null ? String(product.compareAtPrice) : \"\");\n setQuantity(product.quantity ?? 1);\n setStatus(product.status ?? \"draft\");\n setFeatured(product.featured ?? false);\n\n const m = product.metadata as Record<string, unknown> | null | undefined;\n setDescription((m && typeof m.description === \"string\" ? m.description : \"\") ?? \"\");\n const rawImages = m?.images as Array<{ url?: string; alt?: string; isDefault?: boolean }> | undefined;\n if (Array.isArray(rawImages) && rawImages.length > 0) {\n setImages(\n rawImages.map((x) => ({\n url: String(x?.url ?? \"\"),\n alt: String(x?.alt ?? \"\"),\n isDefault: !!x?.isDefault,\n }))\n );\n }\n const rawSpecs = m?.specifications as Array<{ key?: string; value?: string }> | undefined;\n if (Array.isArray(rawSpecs) && rawSpecs.length > 0) {\n setSpecifications(rawSpecs.map((s) => ({ key: String(s?.key ?? \"\"), value: String(s?.value ?? \"\") })));\n }\n setOtherMetadata(pickOtherMetadata(m));\n\n if (product.seoId) {\n setSeoId(product.seoId);\n const seoData = await fetchSeo(product.seoId);\n if (!cancelled) setSeo(seoData);\n }\n const paRes = await fetch(`/api/product_attributes?productId=${productId}&limit=100`);\n if (paRes.ok && !cancelled) {\n const paData = await paRes.json();\n if (Array.isArray(paData.data) && paData.data.length > 0) {\n const rows: FacetRow[] = [];\n (paData.data as ProductAttribute[]).forEach((pa) => {\n const a = attrList.find((x) => x.id === pa.attributeId);\n if (a) rows.push({ name: a.name, value: pa.value ?? \"\" });\n });\n if (rows.length) setFacetRows(rows);\n else if (!cancelled) setFacetRows([{ name: \"\", value: \"\" }]);\n } else if (!cancelled) setFacetRows([{ name: \"\", value: \"\" }]);\n }\n } catch {\n if (!cancelled) setErrors([\"Failed to load product\"]);\n } finally {\n if (!cancelled) setLoading(false);\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [productId, create]);\n\n const handleSave = async () => {\n setErrors([]);\n if (!name.trim()) {\n setErrors([\"Name is required\"]);\n return;\n }\n if (!price.trim()) {\n setErrors([\"Price is required\"]);\n return;\n }\n setSaving(true);\n try {\n const savedSeoId = await saveSeo(seo, name.trim().toLowerCase().replace(/[^a-z0-9]+/g, \"-\"), seoId);\n const metadata = buildProductMetadata(otherMetadata, { description, images, specifications });\n const productPayload: Record<string, unknown> = {\n name: name.trim(),\n sku: sku.trim() || null,\n hsn: hsn.trim() || null,\n collectionId: collectionId || null,\n brandId: brandId || null,\n categoryId: categoryId || null,\n price: Number(price),\n compareAtPrice: compareAtPrice ? Number(compareAtPrice) : null,\n quantity,\n status,\n featured,\n metadata,\n };\n if (savedSeoId) productPayload.seoId = savedSeoId;\n\n const res = await fetch(create ? \"/api/products\" : `/api/products/${productId}`, {\n method: create ? \"POST\" : \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(productPayload),\n });\n if (!res.ok) {\n const data = await res.json().catch(() => ({}));\n setErrors([(data as { error?: string }).error ?? \"Failed to save product\"]);\n return;\n }\n const savedProduct = await res.json();\n const savedId = create ? (savedProduct as { id: number }).id : productId;\n\n const slugify = (n: string) =>\n n\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\") || \"attribute\";\n async function ensureAttributeId(attrName: string): Promise<number | null> {\n const name = attrName.trim();\n if (!name) return null;\n const slug = slugify(name);\n const r = await fetch(`/api/attributes?search=${encodeURIComponent(name)}&limit=50`);\n if (r.ok) {\n const d = await r.json();\n const rows = (Array.isArray(d.data) ? d.data : []) as { id: number; name: string; slug?: string }[];\n const found =\n rows.find((x) => x.name.toLowerCase() === name.toLowerCase()) ??\n rows.find((x) => x.slug === slug);\n if (found) return found.id;\n }\n const post = await fetch(\"/api/attributes\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ name, slug, type: \"text\", active: true, sortOrder: 0 }),\n });\n if (post.ok) {\n const a = (await post.json()) as { id: number };\n return a.id ?? null;\n }\n const r2 = await fetch(`/api/attributes?search=${encodeURIComponent(name)}&limit=50`);\n if (r2.ok) {\n const d = await r2.json();\n const rows = (Array.isArray(d.data) ? d.data : []) as { id: number; name: string }[];\n const found = rows.find((x) => x.name.toLowerCase() === name.toLowerCase());\n if (found) return found.id;\n }\n return null;\n }\n\n const wanted = new Map<number, string>();\n for (const row of facetRows) {\n const n = row.name.trim();\n const v = row.value.trim();\n if (!n || !v) continue;\n const aid = await ensureAttributeId(n);\n if (aid != null) wanted.set(aid, v);\n }\n\n const paListRes = await fetch(`/api/product_attributes?productId=${savedId}&limit=200`);\n const paListData = paListRes.ok ? await paListRes.json() : { data: [] };\n const existingPa = (Array.isArray(paListData.data) ? paListData.data : []) as {\n id: number;\n attributeId: number;\n }[];\n for (const ep of existingPa) {\n if (!wanted.has(ep.attributeId)) {\n await fetch(`/api/product_attributes/${ep.id}`, { method: \"DELETE\" });\n }\n }\n for (const [attributeId, value] of wanted) {\n const existingRes = await fetch(\n `/api/product_attributes?productId=${savedId}&attributeId=${attributeId}&limit=1`\n );\n const existingData = await existingRes.json();\n const existing = Array.isArray(existingData.data) ? existingData.data[0] : undefined;\n if (existing) {\n await fetch(`/api/product_attributes/${(existing as { id: number }).id}`, {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ value }),\n });\n } else {\n await fetch(\"/api/product_attributes\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n productId: Number(savedId),\n attributeId,\n value,\n }),\n });\n }\n }\n router.push(\"/admin/products\");\n } catch {\n setErrors([\"Failed to save\"]);\n } finally {\n setSaving(false);\n }\n };\n\n const addImage = () => setImages((prev) => [...prev, { url: \"\", alt: \"\", isDefault: false }]);\n const removeImage = (i: number) =>\n setImages((prev) => (prev.length <= 1 ? prev : prev.filter((_, j) => j !== i)));\n const setImage = (i: number, field: keyof ImageRow, value: string | boolean) =>\n setImages((prev) => prev.map((row, j) => (j === i ? { ...row, [field]: value } : row)));\n const setDefaultImage = (i: number) =>\n setImages((prev) => prev.map((row, j) => ({ ...row, isDefault: j === i })));\n\n const addSpec = () => setSpecifications((prev) => [...prev, { key: \"\", value: \"\" }]);\n const removeSpec = (i: number) =>\n setSpecifications((prev) => (prev.length <= 1 ? prev : prev.filter((_, j) => j !== i)));\n const setSpec = (i: number, field: keyof SpecRow, value: string) =>\n setSpecifications((prev) => prev.map((row, j) => (j === i ? { ...row, [field]: value } : row)));\n\n const addFacet = () => setFacetRows((prev) => [...prev, { name: \"\", value: \"\" }]);\n const removeFacet = (i: number) =>\n setFacetRows((prev) => (prev.length <= 1 ? prev : prev.filter((_, j) => j !== i)));\n const setFacet = (i: number, field: keyof FacetRow, value: string) =>\n setFacetRows((prev) => prev.map((row, j) => (j === i ? { ...row, [field]: value } : row)));\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 Product\" : \"Edit Product\"}\n subtitle={create ? \"Create a new product\" : \"Update product details\"}\n closeHref=\"/admin/products\"\n menuItems={[\n { label: saving ? \"Saving...\" : \"Save\", onClick: handleSave },\n { label: featured ? \"Unfeature\" : \"Feature\", onClick: () => setFeatured(!featured) },\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 <DetailPageLayout\n main={\n <>\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">Product details</h2>\n <div className={`${sectionCls} space-y-4`}>\n <div>\n <label className={labelCls}>Name *</label>\n <input type=\"text\" value={name} onChange={(e) => setName(e.target.value)} className={inputCls} required />\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className={labelCls}>SKU</label>\n <input type=\"text\" value={sku} onChange={(e) => setSku(e.target.value)} className={inputCls} />\n </div>\n <div>\n <label className={labelCls}>HSN</label>\n <input type=\"text\" value={hsn} onChange={(e) => setHsn(e.target.value)} className={inputCls} />\n </div>\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className={labelCls}>Brand</label>\n <select value={brandId ?? \"\"} onChange={(e) => setBrandId(e.target.value ? Number(e.target.value) : null)} className={inputCls}>\n <option value=\"\">None</option>\n {brands.map((b) => (\n <option key={b.id} value={b.id}>{b.name}</option>\n ))}\n </select>\n </div>\n <div>\n <label className={labelCls}>Category</label>\n <select value={categoryId ?? \"\"} onChange={(e) => setCategoryId(e.target.value ? Number(e.target.value) : null)} className={inputCls}>\n <option value=\"\">None</option>\n {categories.map((c) => (\n <option key={c.id} value={c.id}>{c.name}</option>\n ))}\n </select>\n </div>\n </div>\n <div>\n <label className={labelCls}>Collection</label>\n <select value={collectionId ?? \"\"} onChange={(e) => setCollectionId(e.target.value ? Number(e.target.value) : null)} className={inputCls}>\n <option value=\"\">None</option>\n {collections.map((c) => (\n <option key={c.id} value={c.id}>{c.name}</option>\n ))}\n </select>\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className={labelCls}>Price *</label>\n <input type=\"number\" value={price} onChange={(e) => setPrice(e.target.value)} className={inputCls} required />\n </div>\n <div>\n <label className={labelCls}>Compare at price</label>\n <input type=\"number\" value={compareAtPrice} onChange={(e) => setCompareAtPrice(e.target.value)} className={inputCls} />\n </div>\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className={labelCls}>Quantity</label>\n <input type=\"number\" value={quantity} onChange={(e) => setQuantity(Number(e.target.value) || 0)} className={inputCls} />\n </div>\n <div>\n <label className={labelCls}>Status</label>\n <select value={status} onChange={(e) => setStatus(e.target.value)} className={inputCls}>\n <option value=\"draft\">Draft</option>\n <option value=\"available\">Available</option>\n <option value=\"reserved\">Reserved</option>\n <option value=\"sold\">Sold</option>\n </select>\n </div>\n </div>\n </div>\n </section>\n\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">Attributes (facets)</h2>\n <p className=\"text-xs text-gray-500 mb-2\">Search existing attributes or create new ones (like blog categories). Value on the right.</p>\n <div className={`${sectionCls} space-y-2`}>\n {facetRows.map((row, i) => (\n <div key={i} className=\"flex gap-2 items-start\">\n <AttributeFacetNameInput\n value={row.name}\n onChange={(name) => setFacet(i, \"name\", name)}\n inputClassName={inputCls}\n />\n <input\n type=\"text\"\n value={row.value}\n onChange={(e) => setFacet(i, \"value\", e.target.value)}\n placeholder=\"Value\"\n className={`${inputCls} flex-1 min-w-[120px]`}\n />\n <button type=\"button\" onClick={() => removeFacet(i)} className=\"p-2 text-gray-400 hover:text-red-600 rounded shrink-0 mt-0.5\">\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\n ))}\n <button type=\"button\" onClick={addFacet} className=\"inline-flex items-center gap-1 rounded border border-gray-300 bg-white px-2 py-1.5 text-xs font-medium text-gray-700 hover:bg-gray-50\">\n <Plus className=\"h-3.5 w-3.5\" /> Add attribute\n </button>\n </div>\n </section>\n\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">Media</h2>\n <div className={`${sectionCls} space-y-3`}>\n {images.map((row, i) => (\n <div key={i} className=\"flex flex-wrap items-start gap-2 p-2 bg-white rounded border border-gray-200\">\n <div className=\"flex-1 min-w-[200px]\">\n <label className={labelCls}>Image URL</label>\n <input\n type=\"url\"\n value={row.url}\n onChange={(e) => setImage(i, \"url\", e.target.value)}\n className={inputCls}\n placeholder=\"https://...\"\n />\n </div>\n <div className=\"flex-1 min-w-[120px]\">\n <label className={labelCls}>Alt text</label>\n <input\n type=\"text\"\n value={row.alt}\n onChange={(e) => setImage(i, \"alt\", e.target.value)}\n className={inputCls}\n />\n </div>\n <button\n type=\"button\"\n onClick={() => setDefaultImage(i)}\n title=\"Set as default\"\n className=\"mt-6 p-2 rounded border border-gray-300 hover:bg-gray-100\"\n >\n <Star className={`h-4 w-4 ${row.isDefault ? \"fill-amber-400 text-amber-500\" : \"text-gray-400\"}`} />\n </button>\n <button type=\"button\" onClick={() => removeImage(i)} className=\"mt-6 p-2 text-gray-400 hover:text-red-600 rounded\">\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\n ))}\n <button type=\"button\" onClick={addImage} className=\"inline-flex items-center gap-1 rounded border border-gray-300 bg-white px-2 py-1.5 text-xs font-medium text-gray-700 hover:bg-gray-50\">\n <Plus className=\"h-3.5 w-3.5\" /> Add image\n </button>\n </div>\n </section>\n\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">Description</h2>\n <div className={sectionCls}>\n <textarea\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n className=\"w-full rounded-md border border-gray-300 px-2 py-1.5 text-sm min-h-[100px]\"\n rows={4}\n placeholder=\"Product description...\"\n />\n </div>\n </section>\n\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">Specifications</h2>\n <div className={`${sectionCls} space-y-2`}>\n {specifications.map((row, i) => (\n <div key={i} className=\"flex gap-2\">\n <input\n type=\"text\"\n value={row.key}\n onChange={(e) => setSpec(i, \"key\", e.target.value)}\n placeholder=\"Key\"\n className={`${inputCls} flex-1`}\n />\n <input\n type=\"text\"\n value={row.value}\n onChange={(e) => setSpec(i, \"value\", e.target.value)}\n placeholder=\"Value\"\n className={`${inputCls} flex-1`}\n />\n <button type=\"button\" onClick={() => removeSpec(i)} className=\"p-2 text-gray-400 hover:text-red-600 rounded shrink-0\">\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\n ))}\n <button type=\"button\" onClick={addSpec} className=\"inline-flex items-center gap-1 rounded border border-gray-300 bg-white px-2 py-1.5 text-xs font-medium text-gray-700 hover:bg-gray-50\">\n <Plus className=\"h-3.5 w-3.5\" /> Add row\n </button>\n </div>\n </section>\n </>\n }\n sidebar={\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">SEO</h2>\n <div className={sectionCls}>\n <SeoSection values={seo} onChange={(field, value) => setSeo((s) => ({ ...s, [field]: value }))} />\n </div>\n </section>\n }\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\n\ntype Attr = { id: number; name: string };\n\nfunction slugFromName(name: string): string {\n const s = name\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n return s || \"attribute\";\n}\n\nexport default function AttributeFacetNameInput({\n value,\n onChange,\n inputClassName,\n}: {\n value: string;\n onChange: (name: string) => void;\n inputClassName: string;\n}) {\n const [draft, setDraft] = useState(value);\n const [open, setOpen] = useState(false);\n const [list, setList] = useState<Attr[]>([]);\n\n useEffect(() => {\n setDraft(value);\n }, [value]);\n\n useEffect(() => {\n const q = draft.trim();\n if (!q) {\n setList([]);\n return;\n }\n const t = setTimeout(async () => {\n const r = await fetch(`/api/attributes?search=${encodeURIComponent(q)}&limit=30`);\n if (r.ok) {\n const d = await r.json();\n setList(Array.isArray(d.data) ? d.data : []);\n }\n }, 250);\n return () => clearTimeout(t);\n }, [draft]);\n\n const pick = (a: Attr) => {\n onChange(a.name);\n setDraft(a.name);\n setOpen(false);\n };\n\n const createAttr = async () => {\n const name = draft.trim();\n if (!name) return;\n const slug = slugFromName(name);\n const res = await fetch(\"/api/attributes\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n name,\n slug,\n type: \"text\",\n active: true,\n sortOrder: 0,\n }),\n });\n if (res.ok) {\n const a = (await res.json()) as { name?: string };\n const n = a.name ?? name;\n onChange(n);\n setDraft(n);\n setOpen(false);\n return;\n }\n const r2 = await fetch(`/api/attributes?search=${encodeURIComponent(name)}&limit=20`);\n if (r2.ok) {\n const d = await r2.json();\n const rows = (Array.isArray(d.data) ? d.data : []) as Attr[];\n const found =\n rows.find((x) => x.name.toLowerCase() === name.toLowerCase()) ?? rows[0];\n if (found) pick(found);\n }\n };\n\n const exactMatch = list.some((x) => x.name.toLowerCase() === draft.trim().toLowerCase());\n\n return (\n <div className=\"relative min-w-0 flex-1\">\n <input\n type=\"text\"\n value={draft}\n onChange={(e) => {\n setDraft(e.target.value);\n setOpen(true);\n }}\n onFocus={() => setOpen(true)}\n onBlur={() =>\n setTimeout(() => {\n setOpen(false);\n onChange(draft.trim());\n }, 200)\n }\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n if (list[0] && !draft.trim()) return;\n if (list[0] && draft.trim()) {\n const m = list.find(\n (x) => x.name.toLowerCase() === draft.trim().toLowerCase()\n );\n if (m) pick(m);\n else pick(list[0]);\n } else if (draft.trim()) void createAttr();\n }\n }}\n placeholder=\"Search or create attribute…\"\n className={inputClassName}\n />\n {open && (list.length > 0 || (draft.trim() && !exactMatch)) && (\n <ul className=\"absolute z-20 mt-1 w-full rounded-md border border-gray-200 bg-white py-1 shadow-lg max-h-48 overflow-auto\">\n {list.map((a) => (\n <li\n key={a.id}\n onMouseDown={(e) => {\n e.preventDefault();\n pick(a);\n }}\n className=\"cursor-pointer px-3 py-1.5 text-sm hover:bg-gray-100\"\n >\n {a.name}\n </li>\n ))}\n {draft.trim() && !exactMatch && (\n <li\n onMouseDown={(e) => {\n e.preventDefault();\n void createAttr();\n }}\n className=\"cursor-pointer px-3 py-1.5 text-sm text-gray-700 hover:bg-gray-100 border-t border-gray-100\"\n >\n Create &quot;{draft.trim()}&quot;\n </li>\n )}\n </ul>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport { useRouter } from \"next/navigation\";\nimport { AlertCircle, Plus, Trash2, ChevronDown, ChevronUp } 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\ntype Category = { id: number; name: string };\ntype Brand = { id: number; name: string };\ntype HeroSlide = { url: string; type: \"image\" | \"video\"; caption: string };\ntype VariantForm = { name: string; price: string; extraSpecs: { key: string; value: string }[] };\n\nconst isCreate = (id: string) => id === \"create\";\nconst emptySlide = (): HeroSlide => ({ url: \"\", type: \"image\", caption: \"\" });\nconst emptyVariant = (): VariantForm => ({ name: \"\", price: \"\", extraSpecs: [] });\nconst sectionCls = \"min-w-0 overflow-hidden border border-gray-200 rounded-lg p-4 bg-gray-50/50\";\nconst labelCls = \"block text-xs font-medium text-gray-600 mb-1\";\nconst inputCls = \"w-full rounded-md border border-gray-300 px-2 py-1.5 text-sm\";\n\nexport default function CollectionEditPage({ collectionId }: { collectionId: string }) {\n const router = useRouter();\n const create = isCreate(collectionId);\n const [loading, setLoading] = useState(!create);\n const [saving, setSaving] = useState(false);\n const [errors, setErrors] = useState<string[]>([]);\n const [categories, setCategories] = useState<Category[]>([]);\n const [brands, setBrands] = useState<Brand[]>([]);\n\n const [name, setName] = useState(\"\");\n const [slug, setSlug] = useState(\"\");\n const [hsn, setHsn] = useState(\"\");\n const [categoryId, setCategoryId] = useState<number | null>(null);\n const [brandId, setBrandId] = useState<number | null>(null);\n const [description, setDescription] = useState(\"\");\n const [image, setImage] = useState(\"\");\n const [active, setActive] = useState(true);\n const [sortOrder, setSortOrder] = useState(0);\n\n const [advancedOpen, setAdvancedOpen] = useState(false);\n const [heroSlides, setHeroSlides] = useState<HeroSlide[]>([emptySlide()]);\n const [variants, setVariants] = useState<VariantForm[]>([emptyVariant()]);\n const [experienceDescription, setExperienceDescription] = useState(\"\");\n const [brochureUrl, setBrochureUrl] = useState(\"\");\n\n const [seoId, setSeoId] = useState<number | null>(null);\n const [seo, setSeo] = useState<SeoFields>({\n seoTitle: \"\",\n seoDescription: \"\",\n seoKeywords: \"\",\n seoOgTitle: \"\",\n seoOgDescription: \"\",\n seoOgImage: \"\",\n });\n\n useEffect(() => {\n let cancelled = false;\n (async () => {\n try {\n const [catRes, brandRes] = await Promise.all([\n fetch(\"/api/product_categories?limit=500\"),\n fetch(\"/api/brands?limit=500\"),\n ]);\n if (!cancelled && catRes.ok) {\n const d = await catRes.json();\n if (Array.isArray(d.data)) setCategories(d.data);\n }\n if (!cancelled && brandRes.ok) {\n const d = await brandRes.json();\n if (Array.isArray(d.data)) setBrands(d.data);\n }\n if (create) {\n if (!cancelled) setLoading(false);\n return;\n }\n const res = await fetch(`/api/collections/${collectionId}`);\n if (!res.ok) throw new Error(\"Failed to load collection\");\n const data = await res.json();\n if (cancelled) return;\n\n setName(data.name ?? \"\");\n setSlug(data.slug ?? \"\");\n setHsn(data.hsn ?? \"\");\n setCategoryId(data.categoryId ?? null);\n setBrandId(data.brandId ?? null);\n setDescription(data.description ?? \"\");\n setImage(data.image ?? \"\");\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 const m = data.metadata as Record<string, unknown> | null;\n const rawVariants = m?.variants as Array<Record<string, unknown>> | undefined;\n if (Array.isArray(rawVariants) && rawVariants.length > 0) {\n setVariants(\n rawVariants.map((v) => {\n const extraSpecs: { key: string; value: string }[] = [];\n Object.keys(v).forEach((k) => {\n if (k !== \"name\" && k !== \"price\" && v[k] != null) extraSpecs.push({ key: k, value: String(v[k]) });\n });\n return {\n name: String(v.name ?? \"\"),\n price: v.price != null ? String(v.price) : \"\",\n extraSpecs,\n };\n })\n );\n }\n const slides = m?.heroSlides as Array<{ url?: string; type?: string; caption?: string }> | undefined;\n if (Array.isArray(slides) && slides.length > 0) {\n setHeroSlides(\n slides.map((s) => ({\n url: s?.url ?? \"\",\n type: (s?.type === \"video\" ? \"video\" : \"image\") as \"image\" | \"video\",\n caption: s?.caption ?? \"\",\n }))\n );\n }\n const exp = m?.experience as { description?: string } | undefined;\n setExperienceDescription(exp?.description ?? \"\");\n setBrochureUrl(typeof m?.brochureUrl === \"string\" ? m.brochureUrl : \"\");\n } catch {\n if (!cancelled) setErrors([\"Failed to load collection\"]);\n } finally {\n if (!cancelled) setLoading(false);\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [collectionId, create]);\n\n const buildMetadata = (): Record<string, unknown> | null => {\n const meta: Record<string, unknown> = {};\n const validVariants = variants.filter((v) => v.name.trim());\n if (validVariants.length > 0) {\n meta.variants = validVariants.map((v) => {\n const obj: Record<string, unknown> = { name: v.name.trim() };\n if (v.price) obj.price = Number(v.price);\n v.extraSpecs.forEach((s) => {\n if (s.key.trim()) obj[s.key.trim()] = s.value.trim();\n });\n return obj;\n });\n }\n const slides = heroSlides.filter((x) => x.url.trim());\n if (slides.length > 0) {\n meta.heroSlides = slides.map((s) => ({ url: s.url, type: s.type, caption: s.caption || undefined }));\n }\n if (experienceDescription.trim()) meta.experience = { description: experienceDescription.trim() };\n if (brochureUrl.trim()) meta.brochureUrl = brochureUrl.trim();\n return Object.keys(meta).length > 0 ? meta : null;\n };\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 const payload: Record<string, unknown> = {\n name: name.trim(),\n slug: slug.trim(),\n hsn: hsn.trim() || null,\n categoryId: categoryId || null,\n brandId: brandId || null,\n description: description || null,\n image: image || null,\n active,\n sortOrder,\n metadata: buildMetadata(),\n };\n if (savedSeoId) payload.seoId = savedSeoId;\n const res = await fetch(create ? \"/api/collections\" : `/api/collections/${collectionId}`, {\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 as { error?: string }).error ?? \"Failed to save\"]);\n return;\n }\n router.push(\"/admin/collections\");\n } catch {\n setErrors([\"Failed to save\"]);\n } finally {\n setSaving(false);\n }\n };\n\n const addHeroSlide = () => setHeroSlides((s) => [...s, emptySlide()]);\n const removeHeroSlide = (i: number) => setHeroSlides((s) => (s.length <= 1 ? s : s.filter((_, j) => j !== i)));\n const updateHeroSlide = (i: number, field: keyof HeroSlide, value: string) =>\n setHeroSlides((s) => s.map((slide, j) => (j === i ? { ...slide, [field]: value } : slide)));\n const addVariant = () => setVariants((v) => [...v, emptyVariant()]);\n const removeVariant = (i: number) => setVariants((v) => (v.length <= 1 ? v : v.filter((_, j) => j !== i)));\n const updateVariant = (i: number, field: keyof VariantForm, value: string | { key: string; value: string }[]) =>\n setVariants((v) => v.map((x, j) => (j === i ? { ...x, [field]: value } : x)));\n const updateVariantExtraSpec = (variantIdx: number, specIdx: number, keyOrValue: \"key\" | \"value\", val: string) =>\n setVariants((v) =>\n v.map((x, j) => {\n if (j !== variantIdx) return x;\n const next = [...x.extraSpecs];\n next[specIdx] = { ...next[specIdx], [keyOrValue]: val };\n return { ...x, extraSpecs: next };\n })\n );\n const addVariantExtraSpec = (variantIdx: number) =>\n setVariants((v) =>\n v.map((x, j) => (j === variantIdx ? { ...x, extraSpecs: [...x.extraSpecs, { key: \"\", value: \"\" }] } : x))\n );\n const removeVariantExtraSpec = (variantIdx: number, specIdx: number) =>\n setVariants((v) =>\n v.map((x, j) => (j === variantIdx ? { ...x, extraSpecs: x.extraSpecs.filter((_, s) => s !== specIdx) } : x))\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 Collection\" : \"Edit Collection\"}\n subtitle={create ? \"Create a new collection\" : \"Update collection and page content\"}\n closeHref=\"/admin/collections\"\n menuItems={[\n { label: saving ? \"Saving...\" : \"Save\", onClick: handleSave },\n { label: active ? \"Deactivate\" : \"Activate\", onClick: () => setActive(!active) },\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 <DetailPageLayout\n main={\n <>\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">Basic info</h2>\n <div className={`${sectionCls} space-y-4`}>\n <div>\n <label className={labelCls}>Name *</label>\n <input type=\"text\" value={name} onChange={(e) => setName(e.target.value)} className={inputCls} required />\n </div>\n <div>\n <label className={labelCls}>Slug *</label>\n <input type=\"text\" value={slug} onChange={(e) => setSlug(e.target.value)} className={inputCls} required />\n </div>\n <div>\n <label className={labelCls}>HSN</label>\n <input type=\"text\" value={hsn} onChange={(e) => setHsn(e.target.value)} className={inputCls} />\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className={labelCls}>Category</label>\n <select value={categoryId ?? \"\"} onChange={(e) => setCategoryId(e.target.value ? Number(e.target.value) : null)} className={inputCls}>\n <option value=\"\">None</option>\n {categories.map((c) => (\n <option key={c.id} value={c.id}>{c.name}</option>\n ))}\n </select>\n </div>\n <div>\n <label className={labelCls}>Brand</label>\n <select value={brandId ?? \"\"} onChange={(e) => setBrandId(e.target.value ? Number(e.target.value) : null)} className={inputCls}>\n <option value=\"\">None</option>\n {brands.map((b) => (\n <option key={b.id} value={b.id}>{b.name}</option>\n ))}\n </select>\n </div>\n </div>\n <div>\n <label className={labelCls}>Description</label>\n <textarea value={description} onChange={(e) => setDescription(e.target.value)} className={`${inputCls} min-h-[80px]`} rows={3} />\n </div>\n <div>\n <label className={labelCls}>Cover image URL</label>\n <input type=\"url\" value={image} onChange={(e) => setImage(e.target.value)} className={inputCls} placeholder=\"https://...\" />\n </div>\n <div>\n <label className={labelCls}>Sort order</label>\n <input type=\"number\" value={sortOrder} onChange={(e) => setSortOrder(Number(e.target.value) || 0)} className={inputCls} style={{ width: \"6rem\" }} />\n </div>\n </div>\n </section>\n\n <section>\n <button\n type=\"button\"\n onClick={() => setAdvancedOpen((o) => !o)}\n className=\"flex items-center gap-2 w-full text-left text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\"\n >\n {advancedOpen ? <ChevronUp className=\"h-4 w-4\" /> : <ChevronDown className=\"h-4 w-4\" />}\n Advanced page content\n </button>\n {advancedOpen && (\n <div className=\"space-y-4\">\n <div className={sectionCls}>\n <h3 className=\"text-xs font-medium text-gray-700 mb-2\">Hero carousel</h3>\n {heroSlides.map((slide, i) => (\n <div key={i} className=\"flex flex-wrap gap-2 mb-3 p-2 bg-white rounded border\">\n <input type=\"url\" value={slide.url} onChange={(e) => updateHeroSlide(i, \"url\", e.target.value)} placeholder=\"Media URL\" className={`${inputCls} flex-1 min-w-[200px]`} />\n <select value={slide.type} onChange={(e) => updateHeroSlide(i, \"type\", e.target.value as \"image\" | \"video\")} className={`${inputCls} w-24`}>\n <option value=\"image\">Image</option>\n <option value=\"video\">Video</option>\n </select>\n <input type=\"text\" value={slide.caption} onChange={(e) => updateHeroSlide(i, \"caption\", e.target.value)} placeholder=\"Caption\" className={`${inputCls} flex-1 min-w-[120px]`} />\n <button type=\"button\" onClick={() => removeHeroSlide(i)} className=\"p-2 text-gray-400 hover:text-red-600 rounded shrink-0\">\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\n ))}\n <button type=\"button\" onClick={addHeroSlide} className=\"inline-flex items-center gap-1 rounded border border-gray-300 bg-white px-2 py-1.5 text-xs font-medium text-gray-700 hover:bg-gray-50\">\n <Plus className=\"h-3.5 w-3.5\" /> Add slide\n </button>\n </div>\n <div className={sectionCls}>\n <h3 className=\"text-xs font-medium text-gray-700 mb-2\">Variants</h3>\n {variants.map((v, i) => (\n <div key={i} className=\"mb-4 p-3 bg-white rounded border space-y-2\">\n <div className=\"flex gap-2\">\n <input type=\"text\" value={v.name} onChange={(e) => updateVariant(i, \"name\", e.target.value)} placeholder=\"Name\" className={`${inputCls} w-40`} />\n <input type=\"number\" value={v.price} onChange={(e) => updateVariant(i, \"price\", e.target.value)} placeholder=\"Price\" className={`${inputCls} w-28`} />\n <button type=\"button\" onClick={() => removeVariant(i)} className=\"p-2 text-gray-400 hover:text-red-600 rounded shrink-0\">\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\n {v.extraSpecs.map((s, si) => (\n <div key={si} className=\"flex gap-2\">\n <input type=\"text\" value={s.key} onChange={(e) => updateVariantExtraSpec(i, si, \"key\", e.target.value)} placeholder=\"Key\" className={`${inputCls} flex-1`} />\n <input type=\"text\" value={s.value} onChange={(e) => updateVariantExtraSpec(i, si, \"value\", e.target.value)} placeholder=\"Value\" className={`${inputCls} flex-1`} />\n <button type=\"button\" onClick={() => removeVariantExtraSpec(i, si)} className=\"p-2 text-gray-400 hover:text-red-600 rounded shrink-0\">\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\n ))}\n <button type=\"button\" onClick={() => addVariantExtraSpec(i)} className=\"inline-flex items-center gap-1 rounded border border-gray-300 bg-white px-2 py-1 text-xs text-gray-700 hover:bg-gray-50\">\n <Plus className=\"h-3 w-3\" /> Add spec\n </button>\n </div>\n ))}\n <button type=\"button\" onClick={addVariant} className=\"inline-flex items-center gap-1 rounded border border-gray-300 bg-white px-2 py-1.5 text-xs font-medium text-gray-700 hover:bg-gray-50\">\n <Plus className=\"h-3.5 w-3.5\" /> Add variant\n </button>\n </div>\n <div className={sectionCls}>\n <label className={labelCls}>Experience description</label>\n <textarea value={experienceDescription} onChange={(e) => setExperienceDescription(e.target.value)} className={`${inputCls} min-h-[60px]`} rows={2} placeholder=\"Optional\" />\n </div>\n <div className={sectionCls}>\n <label className={labelCls}>Brochure URL</label>\n <input type=\"url\" value={brochureUrl} onChange={(e) => setBrochureUrl(e.target.value)} className={inputCls} placeholder=\"https://...\" />\n </div>\n </div>\n )}\n </section>\n </>\n }\n sidebar={\n <>\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">Status</h2>\n <div className={sectionCls}>\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input type=\"checkbox\" checked={active} onChange={(e) => setActive(e.target.checked)} className=\"h-4 w-4 rounded border-gray-300\" />\n <span className=\"text-sm font-medium text-gray-900\">Active</span>\n </label>\n </div>\n </section>\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">SEO</h2>\n <div className={sectionCls}>\n <SeoSection values={seo} onChange={(field, value) => setSeo((s) => ({ ...s, [field]: value }))} />\n </div>\n </section>\n </>\n }\n />\n </div>\n );\n}\n","'use client';\n\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { useSession } from 'next-auth/react';\nimport { Shield, Save, Trash2 } from 'lucide-react';\nimport { isSuperAdminGroupName } from '../../auth/permission-entities';\nimport { Button } from '@/components/ui/button';\nimport { Input } from '@/components/ui/input';\nimport { Label } from '@/components/ui/label';\n\ntype PermRow = { entity: string; canCreate: boolean; canRead: boolean; canUpdate: boolean; canDelete: boolean };\n\ntype Group = { id: number; name: string; permissions: PermRow[] };\n\nfunction RoleListItem({\n group,\n selected,\n onSelect,\n}: {\n group: Group;\n selected: boolean;\n onSelect: () => void;\n}) {\n const superG = isSuperAdminGroupName(group.name);\n return (\n <button\n type=\"button\"\n onClick={onSelect}\n className={`flex w-full items-center gap-3 rounded-lg border px-3 py-2.5 text-left transition-colors ${\n selected\n ? 'border-gray-300 bg-gray-50 dark:border-gray-600 dark:bg-gray-700/50'\n : 'border-transparent hover:bg-gray-50 dark:hover:bg-gray-800/50'\n }`}\n >\n <Shield className=\"h-5 w-5 shrink-0 text-gray-500\" />\n <div className=\"min-w-0 flex-1\">\n <div className=\"font-medium text-gray-900 dark:text-white truncate\">{group.name}</div>\n </div>\n </button>\n );\n}\n\nexport default function RolesPage() {\n const { data: session, status } = useSession();\n const u = session?.user as { isRBACAdmin?: boolean } | undefined;\n const canManage = !!u?.isRBACAdmin;\n\n const [entities, setEntities] = useState<string[]>([]);\n const [groups, setGroups] = useState<Group[]>([]);\n const [selectedId, setSelectedId] = useState<number | null>(null);\n const [matrix, setMatrix] = useState<Record<string, PermRow>>({});\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n const [newName, setNewName] = useState('');\n const [error, setError] = useState<string | null>(null);\n\n const load = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const res = await fetch('/api/admin/roles');\n if (!res.ok) {\n setError(\n res.status === 403\n ? 'You do not have access to manage roles. Ensure your user is in the Administrator group, then sign out and sign in again.'\n : 'Failed to load roles'\n );\n return;\n }\n const data = await res.json();\n setEntities(data.entities ?? []);\n setGroups(data.groups ?? []);\n setSelectedId((prev) => {\n if (prev == null) return null;\n const still = (data.groups as Group[])?.some((g) => g.id === prev);\n return still ? prev : null;\n });\n } catch {\n setError('Failed to load');\n } finally {\n setLoading(false);\n }\n }, []);\n\n useEffect(() => {\n if (status === 'authenticated' && canManage) load();\n }, [status, canManage, load]);\n\n const selected = groups.find((g) => g.id === selectedId);\n\n useEffect(() => {\n if (!selected || !entities.length) {\n setMatrix({});\n return;\n }\n const m: Record<string, PermRow> = {};\n const byEntity = new Map(selected.permissions.map((p) => [p.entity, p]));\n for (const e of entities) {\n const p = byEntity.get(e);\n m[e] = p\n ? {\n entity: e,\n canCreate: p.canCreate,\n canRead: p.canRead,\n canUpdate: p.canUpdate,\n canDelete: p.canDelete,\n }\n : { entity: e, canCreate: false, canRead: false, canUpdate: false, canDelete: false };\n }\n setMatrix(m);\n }, [selected, entities]);\n\n const toggle = (entity: string, key: keyof Pick<PermRow, 'canCreate' | 'canRead' | 'canUpdate' | 'canDelete'>) => {\n setMatrix((prev) => ({\n ...prev,\n [entity]: { ...prev[entity]!, [key]: !prev[entity]![key] },\n }));\n };\n\n const saveMatrix = async () => {\n if (!selectedId) return;\n setSaving(true);\n setError(null);\n try {\n const permissions = Object.values(matrix);\n const res = await fetch(`/api/admin/roles/${selectedId}/permissions`, {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ permissions }),\n });\n if (!res.ok) {\n const j = await res.json().catch(() => ({}));\n setError((j as { error?: string }).error || 'Save failed');\n return;\n }\n await load();\n } catch {\n setError('Save failed');\n } finally {\n setSaving(false);\n }\n };\n\n const createGroup = async () => {\n const name = newName.trim();\n if (!name) return;\n setError(null);\n try {\n const res = await fetch('/api/admin/roles', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ name }),\n });\n if (!res.ok) {\n const j = await res.json().catch(() => ({}));\n setError((j as { error?: string }).error || 'Create failed');\n return;\n }\n const g = await res.json();\n setNewName('');\n await load();\n setSelectedId(g.id);\n } catch {\n setError('Create failed');\n }\n };\n\n const deleteGroup = async () => {\n if (!selectedId || !selected || isSuperAdminGroupName(selected.name)) return;\n if (!confirm(`Delete group \"${selected.name}\"?`)) return;\n try {\n const res = await fetch(`/api/admin/roles/${selectedId}`, { method: 'DELETE' });\n if (!res.ok) {\n const j = await res.json().catch(() => ({}));\n setError((j as { error?: string }).error || 'Delete failed');\n return;\n }\n setSelectedId(null);\n await load();\n } catch {\n setError('Delete failed');\n }\n };\n\n if (status === 'loading' || loading) {\n return (\n <div className=\"flex items-center justify-center py-12 text-gray-600\">\n Loading…\n </div>\n );\n }\n\n if (!canManage) {\n return <p className=\"text-gray-600 p-6\">You do not have permission to manage roles.</p>;\n }\n\n return (\n <div className=\"min-w-0 rounded-lg bg-white shadow-md dark:bg-gray-800\">\n <div className=\"rounded-t-lg border-b border-gray-700 bg-gray-800 px-4 py-2.5 dark:border-gray-700 dark:bg-gray-900\">\n <h1 className=\"text-base font-semibold text-white\">Roles</h1>\n <p className=\"mt-0.5 text-xs text-gray-300\">\n Only the Administrator group can open this page. All roles use the matrix for entity access (Administrator also has users / roles plumbing without matrix rows).\n </p>\n </div>\n\n <div className=\"min-w-0 p-6\">\n {error ? (\n <div className=\"py-8 text-center\">\n <p className=\"text-sm text-red-600 dark:text-red-400\">{error}</p>\n </div>\n ) : groups.length === 0 ? (\n <div className=\"py-12 text-center\">\n <Shield className=\"mx-auto h-10 w-10 text-gray-400\" />\n <p className=\"mt-3 text-sm text-gray-500 dark:text-gray-400\">No roles yet. Add one below.</p>\n </div>\n ) : (\n <div className=\"flex gap-6\">\n <div className=\"w-56 shrink-0 space-y-1\">\n {groups.map((g) => (\n <RoleListItem key={g.id} group={g} selected={selectedId === g.id} onSelect={() => setSelectedId(g.id)} />\n ))}\n <div className=\"space-y-2 border-t border-gray-200 pt-3 dark:border-gray-700\">\n <Label className=\"text-xs text-gray-500\">New role</Label>\n <div className=\"flex gap-2\">\n <Input\n className=\"h-8 text-sm\"\n placeholder=\"Name\"\n value={newName}\n onChange={(e) => setNewName(e.target.value)}\n onKeyDown={(e) => e.key === 'Enter' && createGroup()}\n />\n <Button type=\"button\" size=\"sm\" variant=\"outline\" className=\"shrink-0\" onClick={createGroup}>\n Add\n </Button>\n </div>\n </div>\n </div>\n\n <div className=\"min-w-0 flex-1\">\n {!selectedId ? (\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\n <Shield className=\"h-10 w-10 text-gray-300 dark:text-gray-600\" />\n <p className=\"mt-3 text-sm text-gray-500 dark:text-gray-400\">Select a role to view or edit permissions.</p>\n </div>\n ) : (\n <div className=\"rounded-lg border border-gray-200 bg-gray-50/50 p-5 dark:border-gray-700 dark:bg-gray-800/50\">\n <div className=\"mb-4 flex flex-wrap items-center gap-2\">\n <h2 className=\"text-sm font-medium text-gray-700 dark:text-gray-300\">{selected?.name} — Permissions</h2>\n <Button size=\"sm\" onClick={saveMatrix} disabled={saving} className=\"gap-1\">\n <Save className=\"h-3.5 w-3.5\" />\n {saving ? 'Saving…' : 'Save'}\n </Button>\n {selected && !isSuperAdminGroupName(selected.name) && (\n <Button size=\"sm\" variant=\"outline\" className=\"gap-1 text-red-600\" onClick={deleteGroup}>\n <Trash2 className=\"h-3.5 w-3.5\" />\n Delete role\n </Button>\n )}\n </div>\n {entities.length > 0 && (\n <div className=\"overflow-x-auto rounded-md border border-gray-200 dark:border-gray-600\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b bg-gray-50 dark:bg-gray-900/50\">\n <th className=\"p-3 text-left font-medium\">Resource</th>\n <th className=\"p-2\">C</th>\n <th className=\"p-2\">R</th>\n <th className=\"p-2\">U</th>\n <th className=\"p-2\">D</th>\n </tr>\n </thead>\n <tbody>\n {entities.map((entity) => {\n const row = matrix[entity];\n if (!row) return null;\n return (\n <tr key={entity} className=\"border-b border-gray-100 hover:bg-gray-50/50 dark:border-gray-700 dark:hover:bg-gray-800/30\">\n <td className=\"p-3 font-mono text-xs\">{entity}</td>\n {(['canCreate', 'canRead', 'canUpdate', 'canDelete'] as const).map((k) => (\n <td key={k} className=\"p-2 text-center\">\n <input\n type=\"checkbox\"\n checked={row[k]}\n onChange={() => toggle(entity, k)}\n />\n </td>\n ))}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n )}\n\n {!error && groups.length === 0 && (\n <div className=\"mt-6 flex max-w-md gap-2\">\n <Input placeholder=\"New role name\" value={newName} onChange={(e) => setNewName(e.target.value)} onKeyDown={(e) => e.key === 'Enter' && createGroup()} />\n <Button type=\"button\" onClick={createGroup}>\n Add role\n </Button>\n </div>\n )}\n </div>\n </div>\n );\n}\n","/** API resource keys excluded from the permission matrix (internal / not admin-CRUD). */\nexport const PERMISSION_ENTITY_INTERNAL_EXCLUDE = new Set([\n 'users',\n 'password_reset_tokens',\n 'user_groups',\n 'permissions',\n 'comments',\n 'form_fields',\n 'configs',\n 'knowledge_base_chunks',\n 'carts',\n 'cart_items',\n 'wishlists',\n 'wishlist_items',\n]);\n\n/** Non-CRUD admin surfaces mapped to entity keys for RBAC. */\nexport const PERMISSION_LOGICAL_ENTITIES = [\n 'users',\n 'forms',\n 'form_submissions',\n 'dashboard',\n 'upload',\n 'settings',\n 'analytics',\n 'chat',\n] as const;\n\n/** Canonical name for new installs / migrations */\nexport const ADMIN_GROUP_NAME = 'Administrator';\n\n/** System administrator group (roles UI + users / user_groups / permissions bypass). */\nexport function isSuperAdminGroupName(name: string | null | undefined): boolean {\n return name === ADMIN_GROUP_NAME;\n}\n\nexport type EntityCrudAction = 'create' | 'read' | 'update' | 'delete';\n\nexport type EntityPermissionFlags = { c: boolean; r: boolean; u: boolean; d: boolean };\n\nexport function getPermissionableEntityKeys(entityMap: Record<string, unknown>): string[] {\n const fromMap = Object.keys(entityMap).filter((k) => !PERMISSION_ENTITY_INTERNAL_EXCLUDE.has(k));\n const logical = PERMISSION_LOGICAL_ENTITIES.filter((k) => !fromMap.includes(k));\n return [...fromMap.sort(), ...logical].filter((k, i, a) => a.indexOf(k) === i);\n}\n\nexport function permissionRowsToRecord(\n rows: Array<{ entity: string; canCreate: boolean; canRead: boolean; canUpdate: boolean; canDelete: boolean }> | undefined\n): Record<string, EntityPermissionFlags> {\n const out: Record<string, EntityPermissionFlags> = {};\n if (!rows?.length) return out;\n for (const p of rows) {\n out[p.entity] = {\n c: !!p.canCreate,\n r: !!p.canRead,\n u: !!p.canUpdate,\n d: !!p.canDelete,\n };\n }\n return out;\n}\n\nexport function hasEntityPermission(\n record: Record<string, EntityPermissionFlags> | undefined,\n entity: string,\n action: EntityCrudAction\n): boolean {\n const p = record?.[entity];\n if (!p) return false;\n if (action === 'create') return p.c;\n if (action === 'read') return p.r;\n if (action === 'update') return p.u;\n return p.d;\n}\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: 'hsn', displayName: 'HSN' },\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: '/admin/products',\n },\n collections: {\n title: 'Collections',\n apiEndpoint: '/api/collections',\n columns: [\n { field: 'name', displayName: 'Name' },\n { field: 'slug', displayName: 'Slug' },\n { field: 'hsn', displayName: 'HSN' },\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: '/admin/collections',\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/roles', label: 'Roles' },\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":["import_react","import_navigation","import_react","React","import_jsx_runtime","import_lucide_react","import_jsx_runtime","Image","Link","import_link","import_image","import_react","import_lucide_react","import_react","import_jsx_runtime","Icon","sectionCls","Link","ImageIcon","Image","import_link","import_navigation","import_react","import_lucide_react","import_jsx_runtime","Icon","Link","React","import_class_variance_authority","import_lucide_react","import_jsx_runtime","import_jsx_runtime","id","React","import_sonner","import_jsx_runtime","import_react","import_react","import_lucide_react","React","import_jsx_runtime","React","import_jsx_runtime","React","import_lucide_react","import_jsx_runtime","React","import_jsx_runtime","React","import_class_variance_authority","import_jsx_runtime","Label","import_react","React","import_jsx_runtime","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_sonner","import_jsx_runtime","Label","React","import_jsx_runtime","React","import_lucide_react","import_jsx_runtime","React","import_lucide_react","import_jsx_runtime","import_lucide_react","import_link","import_react","import_lucide_react","import_jsx_runtime","Papa","e","import_jsx_runtime","data","error","Link","import_react","import_class_variance_authority","import_jsx_runtime","import_lucide_react","import_navigation","import_react","import_lucide_react","import_jsx_runtime","import_jsx_runtime","import_react","import_react","import_lucide_react","import_image","import_jsx_runtime","error","Image","import_lucide_react","import_navigation","import_react","import_lucide_react","import_jsx_runtime","import_react","import_jsx_runtime","dynamic","import_react","import_lucide_react","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","ChartJS","import_lucide_react","import_jsx_runtime","import_jsx_runtime","import_navigation","import_react","import_jsx_runtime","import_react","import_jsx_runtime","Label","import_react","import_lucide_react","import_jsx_runtime","Label","Label","import_link","import_react","import_navigation","import_image","import_image","import_jsx_runtime","INFURO_FOOTER_LABEL","INFURO_FOOTER_URL","Image","import_jsx_runtime","Image","import_jsx_runtime","error","Link","import_react","import_link","import_jsx_runtime","Label","Link","import_react","import_navigation","import_link","import_jsx_runtime","Link","Label","import_react","import_navigation","import_jsx_runtime","Label","import_react","import_lucide_react","import_jsx_runtime","import_react","import_navigation","import_react","import_link","import_lucide_react","import_link","import_navigation","import_lucide_react","import_jsx_runtime","Link","import_jsx_runtime","Link","import_react","import_link","import_navigation","import_lucide_react","import_jsx_runtime","import_jsx_runtime","Link","import_react","import_link","import_navigation","import_lucide_react","import_jsx_runtime","formatMoney","Link","import_react","import_link","import_navigation","import_lucide_react","import_jsx_runtime","formatMoney","formatAddress","Link","import_react","import_navigation","import_sonner","import_lucide_react","import_jsx_runtime","Label","import_react","import_lucide_react","import_sonner","import_jsx_runtime","ImageIcon","import_react","import_lucide_react","import_navigation","import_react","import_jsx_runtime","Icon","React","labelCls","inputCls","Label","import_react","import_lucide_react","import_sonner","import_jsx_runtime","Label","Icon","import_react","import_navigation","import_lucide_react","import_jsx_runtime","inputCls","res","import_jsx_runtime","import_react","import_navigation","import_lucide_react","import_react","import_jsx_runtime","import_jsx_runtime","isCreate","name","import_react","import_navigation","import_lucide_react","import_jsx_runtime","isCreate","sectionCls","labelCls","inputCls","import_react","import_lucide_react","import_jsx_runtime","Label","import_jsx_runtime","isCreate","import_react","import_lucide_react","import_jsx_runtime","import_react","import_sonner","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../src/admin/index.tsx","../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/JoditRichText.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/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/lib/email-recipients.ts","../src/admin/pages/BrandEditPage.tsx","../src/components/Admin/SeoSection.tsx","../src/admin/pages/ProductEditPage.tsx","../src/components/Admin/AttributeFacetNameInput.tsx","../src/admin/pages/CollectionEditPage.tsx","../src/admin/pages/RolesPage.tsx","../src/auth/permission-entities.ts","../src/admin/store-crud-configs.ts","../src/admin/pages/LayoutSettingsPage.tsx","../src/admin/config.ts","../src/admin/CmsProviders.tsx"],"sourcesContent":["'use client';\n\n// Default export: admin layout (theme/shell owned by core, WordPress-style)\nexport { default } from './pages/AdminLayout';\nexport { default as AdminLayout } from './pages/AdminLayout';\n\nexport { AdminShell } from './AdminShell';\nexport {\n AdminHeader,\n AdminSidebar,\n AdminCRUD,\n CreateEditForm,\n FormBuilder,\n BlogEditorPage,\n AnalyticsChart,\n DailyUserChart,\n GeographicMap,\n AnalyticsCard,\n AnalyticsExclusion,\n CategoryAutocomplete,\n TagAutocomplete,\n UserAutocomplete,\n ComponentSettings,\n NavbarEditor,\n JoditRichText,\n} from './components/index';\n\nexport { default as AdminSignInPage } from './pages/SignInPage';\nexport { default as AdminForgotPasswordPage } from './pages/ForgotPasswordPage';\nexport { default as AdminResetPasswordPage } from './pages/ResetPasswordPage';\nexport { default as AdminInvitePage } from './pages/InvitePage';\nexport { default as AdminDashboardPage } from './pages/DashboardPage';\nexport { default as AdminPageResolver } from './pages/AdminPageResolver';\nexport { default as AdminSettingsPage } from './pages/SettingsPage';\nexport { default as LayoutSettingsPage } from './pages/LayoutSettingsPage';\nexport { default as PageBuilderPage } from './pages/PageBuilderPage';\nexport { default as BrandEditPage } from './pages/BrandEditPage';\nexport { default as ProductEditPage } from './pages/ProductEditPage';\nexport { default as CollectionEditPage } from './pages/CollectionEditPage';\nexport { default as DetailPageHeader } from '../components/Admin/DetailPageHeader';\nexport { default as DetailPageLayout } from '../components/Admin/DetailPageLayout';\nexport type { DetailPageHeaderMenuItem } from '../components/Admin/DetailPageHeader';\n\nexport { DEFAULT_ADMIN_NAV } from './config';\nexport { STORE_CRUD_CONFIGS } from './store-crud-configs';\nexport type { AdminNavItem } from './config';\n\nexport { AdminConfigContext } from './admin-config-context';\nexport type { CustomNavItem, CustomNavSection, CustomCrudConfig, CustomCrudColumn, ThemeRegistryItem, PluginDescriptor } from './admin-config-context';\nexport type { AdminLayoutProps } from './pages/AdminLayout';\nexport { CmsProviders } from './CmsProviders';\n","\"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 (status === \"unauthenticated\") {\n router.replace(\"/admin/signin\");\n } else {\n setLoadingTimeout(false);\n }\n }, [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 Shield,\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/roles\" className={`${linkCls} ${isActive(\"/admin/roles\") ? linkActive : linkInactive}`}><Shield className={`h-4 w-4 mr-2 ${isActive(\"/admin/roles\") ? iconActive : iconInactive}`} />Roles</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', 'llm') */\n icon?: string;\n /** When set, plugin card shows inline form that loads/saves /api/settings/{settingsGroup} (e.g. 'llm') */\n settingsGroup?: 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 manageUserGroups,\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 /** When true, show group (role) selector for each user; requires GET /api/admin/roles. */\n manageUserGroups?: boolean;\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 [roleOptions, setRoleOptions] = useState<{ id: number; name: string }[]>([]);\n const isMobile = useIsMobile();\n const showGroupColumn = !!manageUserGroups && roleOptions.length > 0;\n\n useEffect(() => {\n if (!manageUserGroups) return;\n fetch(\"/api/admin/roles\")\n .then((r) => (r.ok ? r.json() : null))\n .then((data: { groups?: { id: number; name: string }[] } | null) => {\n if (data?.groups?.length) setRoleOptions(data.groups.map((g) => ({ id: g.id, name: g.name })));\n })\n .catch(() => {});\n }, [manageUserGroups]);\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 handleUserGroupChange = async (userId: number, groupId: number) => {\n try {\n const res = await fetch(`/api/users/${userId}`, {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ groupId }),\n });\n if (!res.ok) return;\n const updated = await res.json();\n setData((prev) =>\n prev.map((row) => (Number(row.id) === userId ? { ...row, ...updated } : row))\n );\n } catch {\n /* ignore */\n }\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 {showGroupColumn && (\n <div className=\"text-sm text-gray-600 flex gap-1 items-center min-w-0\">\n <span className=\"shrink-0\">Group:</span>\n <select\n className=\"max-w-full rounded border border-gray-300 px-2 py-1 text-sm dark:border-gray-600 dark:bg-gray-800\"\n value={\n item.groupId != null && roleOptions.some((g) => g.id === item.groupId)\n ? String(item.groupId)\n : \"\"\n }\n onChange={(e) => {\n const v = e.target.value;\n if (v) handleUserGroupChange(Number(item.id), Number(v));\n }}\n >\n <option value=\"\">—</option>\n {roleOptions.map((g) => (\n <option key={g.id} value={g.id}>\n {g.name}\n </option>\n ))}\n </select>\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 {showGroupColumn && <TableHead className=\"min-w-[140px]\">Group</TableHead>}\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 {showGroupColumn && (\n <TableCell>\n <select\n className=\"max-w-[180px] rounded border border-gray-300 px-2 py-1 text-sm dark:border-gray-600 dark:bg-gray-800\"\n value={\n item.groupId != null && roleOptions.some((g) => g.id === item.groupId)\n ? String(item.groupId)\n : \"\"\n }\n onChange={(e) => {\n const v = e.target.value;\n if (v) handleUserGroupChange(Number(item.id), Number(v));\n }}\n >\n <option value=\"\">—</option>\n {roleOptions.map((g) => (\n <option key={g.id} value={g.id}>\n {g.name}\n </option>\n ))}\n </select>\n </TableCell>\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\n colSpan={columns ? columns.length + 1 + (showGroupColumn ? 1 : 0) : 1}\n className=\"text-center py-8\"\n >\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 TagAutocomplete from \"./TagAutocomplete\";\nimport JoditRichText from \"./JoditRichText\";\nimport CategoryAutocomplete from \"./CategoryAutocomplete\";\nimport UserAutocomplete from \"./UserAutocomplete\";\n\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 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 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 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 <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 <JoditRichText\n value={content}\n onChange={setContent}\n placeholder=\"Write your blog content here...\"\n minHeight={800}\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 res = await response.json();\n const tags = Array.isArray(res?.data) ? res.data : [];\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 dynamic from 'next/dynamic';\nimport { useMemo } from 'react';\nimport 'jodit/es2021/jodit.min.css';\n\nconst JoditEditor = dynamic(() => import('jodit-react').then((m) => m.default), {\n ssr: false,\n loading: () => <div className=\"min-h-[300px] rounded-md border border-gray-200 bg-gray-50 animate-pulse\" />,\n});\n\nexport interface JoditRichTextProps {\n value: string;\n onChange: (html: string) => void;\n placeholder?: string;\n minHeight?: number;\n}\n\nexport default function JoditRichText({ value, onChange, placeholder, minHeight = 400 }: JoditRichTextProps) {\n const config = useMemo(\n () => ({\n readonly: false,\n placeholder: placeholder ?? '',\n height: minHeight,\n toolbarSticky: false,\n toolbarButtonSize: 'small' as const,\n showCharsCounter: false,\n showWordsCounter: false,\n disablePlugins: ['poweredByJodit'],\n buttons: [\n 'source',\n '|',\n 'bold',\n 'italic',\n 'underline',\n 'strikethrough',\n '|',\n 'ul',\n 'ol',\n '|',\n 'fontsize',\n 'brush',\n 'paragraph',\n '|',\n 'link',\n 'image',\n 'video',\n '|',\n 'align',\n '|',\n 'outdent',\n 'indent',\n '|',\n 'table',\n '|',\n 'hr',\n 'eraser',\n '|',\n 'undo',\n 'redo',\n '|',\n 'fullsize',\n ],\n uploader: {\n url: '/api/upload',\n method: 'POST' as const,\n format: 'json',\n filesVariableName: () => 'file',\n isSuccess: (resp: { error?: string }) => !resp?.error,\n getMessage: (resp: { error?: string }) => resp?.error ?? '',\n process: (resp: { filePath?: string }) => ({\n files: resp.filePath ? [resp.filePath] : [],\n path: '',\n baseurl: '',\n }),\n },\n }),\n [placeholder, minHeight]\n );\n\n return (\n <div className=\"jodit-rich-text [&_.jodit-container]:!border-0 [&_.jodit-workplace]:!min-h-0\">\n <JoditEditor value={value} config={config} onChange={onChange} />\n </div>\n );\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 res = await response.json();\n const categories = Array.isArray(res?.data) ? res.data : [];\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, useSession } 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 const { status, update } = useSession();\n\n useEffect(() => {\n if (status === \"authenticated\") {\n router.replace(\"/admin/dashboard\");\n }\n }, [status, 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 await update();\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 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 ProductEditPage from './ProductEditPage';\nimport CollectionEditPage from './CollectionEditPage';\nimport RolesPage from './RolesPage';\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 roles: RolesPage,\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};\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\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 === '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 if (key === 'products') {\n return <ProductEditPage productId={subPath} />;\n }\n if (key === 'collections') {\n return <CollectionEditPage collectionId={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 manageUserGroups={key === 'users'}\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 { 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 <span className=\"text-sm text-gray-400\">\n {formatDateTime(order.createdAt)}\n </span>\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\">Status</dt>\n <dd>\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 </dd>\n </div>\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 space-y-3\">\n {payments.map((p) => (\n <div\n key={p.id}\n className=\"min-w-0 overflow-hidden border border-gray-200 rounded-lg p-4 bg-gray-50/50\"\n >\n <dl className=\"grid grid-cols-1 gap-2 text-sm\">\n <div className=\"min-w-0\">\n <dt className=\"text-gray-500\">Amount</dt>\n <dd className=\"font-medium text-gray-900\">{formatMoney(Number(p.amount), p.currency)}</dd>\n </div>\n <div className=\"min-w-0\">\n <dt className=\"text-gray-500\">Status</dt>\n <dd>\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 </dd>\n </div>\n <div className=\"min-w-0\">\n <dt className=\"text-gray-500\">Method</dt>\n <dd className=\"text-gray-900\">{p.method ?? \"—\"}</dd>\n </div>\n <div className=\"min-w-0\">\n <dt className=\"text-gray-500\">Paid at</dt>\n <dd className=\"text-gray-900\">{p.paidAt ? formatDateTime(p.paidAt) : \"—\"}</dd>\n </div>\n <div className=\"min-w-0\">\n <dt className=\"text-gray-500\">Gateway reference</dt>\n <dd className=\"text-gray-900 font-mono text-xs break-all\">\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 </dd>\n </div>\n </dl>\n </div>\n ))}\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 /** Omit for a single full-width main column (e.g. product/collection merchandising). */\n sidebar?: React.ReactNode;\n}) {\n if (sidebar == null) {\n return (\n <div className=\"min-w-0 w-full p-4 sm:p-6 space-y-6 max-w-4xl\">\n {main}\n </div>\n );\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 <span className=\"text-sm text-gray-400\">\n {formatDateTime(payment.createdAt)}\n </span>\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\">Status</dt>\n <dd>\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 </dd>\n </div>\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, useState, useEffect } from 'react';\nimport { HardDrive, Mail, CreditCard, MessageCircle, Puzzle, CheckCircle2, XCircle, Save, X, Plus } from 'lucide-react';\nimport { Badge } from '@/components/ui/badge';\nimport { parseEmailRecipientsFromConfig, serializeEmailRecipients } from '@/lib/email-recipients';\nimport { AdminConfigContext } from '../admin-config-context';\nimport type { PluginDescriptor } from '../admin-config-context';\nimport { Button } from '@/components/ui/button';\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 { toast } from 'sonner';\n\nconst ICON_MAP: Record<string, React.ComponentType<{ className?: string }>> = {\n storage: HardDrive,\n email: Mail,\n payment: CreditCard,\n llm: MessageCircle,\n};\n\nfunction splitInputToEmails(input: string): string[] {\n return input\n .split(/[,;]+/)\n .map((s) => s.trim())\n .filter(Boolean);\n}\n\ntype SocialLinkRow = { iconUrl: string; url: string; iconFallback: string };\n\nconst EMPTY_SOCIAL_ROW: SocialLinkRow = { iconUrl: '', url: '', iconFallback: '' };\n\nfunction rowsFromSocialSetting(raw: string): SocialLinkRow[] {\n if (!raw?.trim()) return [{ ...EMPTY_SOCIAL_ROW }];\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (!Array.isArray(parsed) || parsed.length === 0) return [{ ...EMPTY_SOCIAL_ROW }];\n return parsed.map((item) => {\n if (!item || typeof item !== 'object') return { ...EMPTY_SOCIAL_ROW };\n const o = item as Record<string, unknown>;\n let iconUrl = String(o.iconUrl ?? o.icon_image ?? '').trim();\n let iconFallback = String(o.icon ?? '').trim();\n if (!iconUrl && /^https?:\\/\\//i.test(iconFallback)) {\n iconUrl = iconFallback;\n iconFallback = '';\n }\n return { iconUrl, url: String(o.url ?? '').trim(), iconFallback };\n });\n } catch {\n return [{ ...EMPTY_SOCIAL_ROW }];\n }\n}\n\nfunction serializeSocialRows(rows: SocialLinkRow[]): string {\n const items = rows\n .filter((r) => r.url.trim())\n .map((r) => {\n const o: Record<string, string> = { url: r.url.trim() };\n if (r.iconUrl.trim()) o.iconUrl = r.iconUrl.trim();\n if (r.iconFallback.trim()) o.icon = r.iconFallback.trim();\n return o;\n });\n return JSON.stringify(items);\n}\n\nfunction EmailRecipientTags({\n id,\n label,\n hint,\n emails,\n onChange,\n placeholder,\n}: {\n id: string;\n label: string;\n hint: string;\n emails: string[];\n onChange: (next: string[]) => void;\n placeholder?: string;\n}) {\n const [draft, setDraft] = useState('');\n\n const commitDraft = () => {\n const parts = splitInputToEmails(draft);\n if (!parts.length) return;\n const next = [...emails];\n for (const p of parts) {\n if (!next.includes(p)) next.push(p);\n }\n onChange(next);\n setDraft('');\n };\n\n return (\n <div className=\"space-y-1\">\n <Label htmlFor={id} className=\"text-sm\">{label}</Label>\n <div\n className=\"flex min-h-9 flex-wrap items-center gap-1.5 rounded-md border border-input bg-background px-2 py-1.5 text-sm ring-offset-background focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2 dark:border-gray-600\"\n >\n {emails.map((email) => (\n <Badge key={email} variant=\"secondary\" className=\"gap-1 pr-0.5 font-normal\">\n <span className=\"max-w-[220px] truncate\">{email}</span>\n <button\n type=\"button\"\n className=\"rounded p-0.5 hover:bg-muted\"\n aria-label={`Remove ${email}`}\n onClick={() => onChange(emails.filter((e) => e !== email))}\n >\n <X className=\"h-3 w-3\" />\n </button>\n </Badge>\n ))}\n <input\n id={id}\n type=\"text\"\n inputMode=\"email\"\n autoComplete=\"off\"\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ',' || e.key === ';') {\n e.preventDefault();\n commitDraft();\n } else if (e.key === 'Backspace' && draft === '' && emails.length > 0) {\n onChange(emails.slice(0, -1));\n }\n }}\n onBlur={() => {\n if (draft.trim()) commitDraft();\n }}\n placeholder={emails.length ? '' : placeholder}\n className=\"min-w-[140px] flex-1 bg-transparent outline-none placeholder:text-muted-foreground\"\n />\n </div>\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">{hint}</p>\n </div>\n );\n}\n\nfunction PluginIcon({ descriptor, size = 'md' }: { descriptor: PluginDescriptor; size?: 'sm' | 'md' }) {\n const Icon = descriptor.icon ? ICON_MAP[descriptor.icon] ?? Puzzle : Puzzle;\n const sizeClass = size === 'sm' ? 'h-8 w-8' : 'h-11 w-11';\n const iconClass = size === 'sm' ? 'h-4 w-4' : 'h-5 w-5';\n return (\n <div className={`flex shrink-0 items-center justify-center rounded-lg bg-gray-100 text-gray-600 dark:bg-gray-700 dark:text-gray-300 ${sizeClass}`}>\n <Icon className={iconClass} />\n </div>\n );\n}\n\nfunction PluginSettingsPanel({\n descriptor,\n onSaved,\n}: {\n descriptor: PluginDescriptor;\n onSaved?: () => void;\n}) {\n const settingsGroup = descriptor.settingsGroup!;\n const isLlm = settingsGroup === 'llm';\n const isEmail = settingsGroup === 'email';\n const [enabled, setEnabled] = useState(true);\n const [botName, setBotName] = useState('');\n const [icon, setIcon] = useState('');\n const [iconImageUrl, setIconImageUrl] = useState('');\n const [iconBackgroundColor, setIconBackgroundColor] = useState('#6366f1');\n const [headerColor, setHeaderColor] = useState('#6366f1');\n const [salesTeamEmails, setSalesTeamEmails] = useState<string[]>([]);\n const [fulfilmentTeamEmails, setFulfilmentTeamEmails] = useState<string[]>([]);\n const [crmEmails, setCrmEmails] = useState<string[]>([]);\n const [logoUrl, setLogoUrl] = useState('');\n const [companyName, setCompanyName] = useState('');\n const [supportEmail, setSupportEmail] = useState('');\n const [supportPhone, setSupportPhone] = useState('');\n const [followUsTitle, setFollowUsTitle] = useState('Follow Us');\n const [socialLinkRows, setSocialLinkRows] = useState<SocialLinkRow[]>([{ ...EMPTY_SOCIAL_ROW }]);\n const [footerDisclaimer, setFooterDisclaimer] = useState('');\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n\n useEffect(() => {\n fetch(`/api/settings/${settingsGroup}`)\n .then((r) => (r.ok ? r.json() : {}))\n .then((data: Record<string, string>) => {\n setEnabled(data.enabled !== 'false');\n setBotName(data.botName ?? '');\n setIcon(data.icon ?? '');\n if (isLlm) {\n setIconImageUrl(data.iconImageUrl ?? '');\n setIconBackgroundColor(data.iconBackgroundColor ?? '#6366f1');\n setHeaderColor(data.headerColor ?? '#6366f1');\n }\n if (isEmail) {\n const sales = parseEmailRecipientsFromConfig(data.salesTeamEmails ?? data.salesTeamEmail);\n const fulfil = parseEmailRecipientsFromConfig(data.fulfilmentTeamEmails ?? data.fulfilmentTeamEmail);\n const crm = parseEmailRecipientsFromConfig(data.crmEmails ?? data.crmEmail);\n setSalesTeamEmails(sales);\n setFulfilmentTeamEmails(fulfil);\n setCrmEmails(crm);\n setLogoUrl(data.logoUrl ?? '');\n setCompanyName(data.companyName ?? '');\n setSupportEmail(data.supportEmail ?? '');\n setSupportPhone(data.supportPhone ?? '');\n setFollowUsTitle(data.followUsTitle?.trim() ? data.followUsTitle : 'Follow Us');\n setSocialLinkRows(rowsFromSocialSetting(data.socialLinks ?? ''));\n setFooterDisclaimer(data.footerDisclaimer ?? '');\n }\n })\n .finally(() => setLoading(false));\n }, [settingsGroup, isLlm, isEmail]);\n\n const buildPayload = () => {\n const payload: Record<string, { value: string; type: 'public' }> = {\n enabled: { value: enabled ? 'true' : 'false', type: 'public' },\n botName: { value: botName, type: 'public' },\n icon: { value: icon, type: 'public' },\n };\n if (isLlm) {\n payload.iconImageUrl = { value: iconImageUrl, type: 'public' };\n payload.iconBackgroundColor = { value: iconBackgroundColor, type: 'public' };\n payload.headerColor = { value: headerColor, type: 'public' };\n }\n if (isEmail) {\n payload.salesTeamEmails = { value: serializeEmailRecipients(salesTeamEmails), type: 'public' };\n payload.fulfilmentTeamEmails = { value: serializeEmailRecipients(fulfilmentTeamEmails), type: 'public' };\n payload.crmEmails = { value: serializeEmailRecipients(crmEmails), type: 'public' };\n payload.logoUrl = { value: logoUrl, type: 'public' };\n payload.companyName = { value: companyName, type: 'public' };\n payload.supportEmail = { value: supportEmail, type: 'public' };\n payload.supportPhone = { value: supportPhone, type: 'public' };\n payload.followUsTitle = { value: followUsTitle, type: 'public' };\n payload.socialLinks = { value: serializeSocialRows(socialLinkRows), type: 'public' };\n payload.footerDisclaimer = { value: footerDisclaimer, type: 'public' };\n }\n return payload;\n };\n\n const handleSave = async () => {\n setSaving(true);\n try {\n const res = await fetch(`/api/settings/${settingsGroup}`, {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(buildPayload()),\n });\n if (!res.ok) throw new Error();\n toast.success('Settings saved');\n onSaved?.();\n } catch {\n toast.error('Failed to save');\n } finally {\n setSaving(false);\n }\n };\n\n if (loading) return <div className=\"text-sm text-gray-500 dark:text-gray-400\">Loading...</div>;\n if (isEmail) {\n return (\n <div className=\"space-y-4\">\n <EmailRecipientTags\n id={`${settingsGroup}-salesTeamEmails`}\n label=\"Sales team (orders)\"\n hint=\"Order confirmations and sales notifications. Type an address and press Enter; comma or semicolon also splits multiple.\"\n emails={salesTeamEmails}\n onChange={setSalesTeamEmails}\n placeholder=\"e.g. sales@example.com\"\n />\n <EmailRecipientTags\n id={`${settingsGroup}-fulfilmentTeamEmails`}\n label=\"Fulfilment team\"\n hint=\"Shipping and fulfilment updates.\"\n emails={fulfilmentTeamEmails}\n onChange={setFulfilmentTeamEmails}\n placeholder=\"e.g. fulfilment@example.com\"\n />\n <EmailRecipientTags\n id={`${settingsGroup}-crmEmails`}\n label=\"CRM (contact / form submissions)\"\n hint=\"Form submissions and contact notifications.\"\n emails={crmEmails}\n onChange={setCrmEmails}\n placeholder=\"e.g. crm@example.com\"\n />\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">Layout below merges with Branding settings; values here override branding when set. Use absolute URLs for logos in email.</p>\n <div className=\"space-y-1\">\n <Label htmlFor={`${settingsGroup}-logoUrl`} className=\"text-sm\">Logo URL (optional override)</Label>\n <Input id={`${settingsGroup}-logoUrl`} value={logoUrl} onChange={(e) => setLogoUrl(e.target.value)} placeholder=\"https://…\" className=\"h-8 text-sm\" />\n </div>\n <div className=\"space-y-1\">\n <Label htmlFor={`${settingsGroup}-companyName`} className=\"text-sm\">Company name (optional override)</Label>\n <Input id={`${settingsGroup}-companyName`} value={companyName} onChange={(e) => setCompanyName(e.target.value)} className=\"h-8 text-sm\" />\n </div>\n <div className=\"space-y-1\">\n <Label htmlFor={`${settingsGroup}-supportEmail`} className=\"text-sm\">Support email (footer)</Label>\n <Input id={`${settingsGroup}-supportEmail`} value={supportEmail} onChange={(e) => setSupportEmail(e.target.value)} type=\"email\" className=\"h-8 text-sm\" />\n </div>\n <div className=\"space-y-1\">\n <Label htmlFor={`${settingsGroup}-supportPhone`} className=\"text-sm\">Support phone (footer)</Label>\n <Input id={`${settingsGroup}-supportPhone`} value={supportPhone} onChange={(e) => setSupportPhone(e.target.value)} className=\"h-8 text-sm\" />\n </div>\n <div className=\"space-y-1\">\n <Label htmlFor={`${settingsGroup}-followUsTitle`} className=\"text-sm\">“Follow us” heading</Label>\n <Input id={`${settingsGroup}-followUsTitle`} value={followUsTitle} onChange={(e) => setFollowUsTitle(e.target.value)} className=\"h-8 text-sm\" />\n </div>\n <div className=\"space-y-2\">\n <Label className=\"text-sm\">Social links</Label>\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">Add rows: icon image URL (optional), link URL, and emoji/text only if you are not using an image.</p>\n {socialLinkRows.map((row, i) => (\n <div key={i} className=\"flex flex-wrap items-end gap-2 border-b border-border/60 pb-3 dark:border-gray-600\">\n <div className=\"min-w-[160px] flex-1 space-y-1\">\n <Label className=\"text-xs text-muted-foreground\">Icon image URL</Label>\n <Input\n value={row.iconUrl}\n onChange={(e) => {\n const next = [...socialLinkRows];\n next[i] = { ...next[i], iconUrl: e.target.value };\n setSocialLinkRows(next);\n }}\n placeholder=\"https://…\"\n className=\"h-8 text-sm\"\n />\n </div>\n <div className=\"min-w-[160px] flex-1 space-y-1\">\n <Label className=\"text-xs text-muted-foreground\">Link URL</Label>\n <Input\n value={row.url}\n onChange={(e) => {\n const next = [...socialLinkRows];\n next[i] = { ...next[i], url: e.target.value };\n setSocialLinkRows(next);\n }}\n placeholder=\"https://…\"\n className=\"h-8 text-sm\"\n />\n </div>\n <div className=\"w-[120px] space-y-1\">\n <Label className=\"text-xs text-muted-foreground\">Emoji / text</Label>\n <Input\n value={row.iconFallback}\n onChange={(e) => {\n const next = [...socialLinkRows];\n next[i] = { ...next[i], iconFallback: e.target.value };\n setSocialLinkRows(next);\n }}\n placeholder=\"e.g. 🌐\"\n className=\"h-8 text-sm\"\n />\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0\"\n aria-label=\"Remove row\"\n disabled={socialLinkRows.length <= 1}\n onClick={() => {\n if (socialLinkRows.length <= 1) setSocialLinkRows([{ ...EMPTY_SOCIAL_ROW }]);\n else setSocialLinkRows(socialLinkRows.filter((_, j) => j !== i));\n }}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n ))}\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"mt-1\"\n onClick={() => setSocialLinkRows([...socialLinkRows, { ...EMPTY_SOCIAL_ROW }])}\n >\n <Plus className=\"mr-1 h-4 w-4\" />\n Add link\n </Button>\n </div>\n <div className=\"space-y-1\">\n <Label htmlFor={`${settingsGroup}-footerDisclaimer`} className=\"text-sm\">Footer disclaimer</Label>\n <Textarea\n id={`${settingsGroup}-footerDisclaimer`}\n value={footerDisclaimer}\n onChange={(e) => setFooterDisclaimer(e.target.value)}\n rows={4}\n className=\"text-sm\"\n />\n </div>\n <Button size=\"sm\" onClick={handleSave} disabled={saving}>{saving ? 'Saving…' : 'Save'}</Button>\n </div>\n );\n }\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between gap-2\">\n <Label htmlFor={`${settingsGroup}-enabled`} className=\"text-sm\">Enabled</Label>\n <Switch id={`${settingsGroup}-enabled`} checked={enabled} onCheckedChange={setEnabled} />\n </div>\n <div className=\"space-y-1\">\n <Label htmlFor={`${settingsGroup}-botName`} className=\"text-sm\">Name</Label>\n <Input\n id={`${settingsGroup}-botName`}\n value={botName}\n onChange={(e) => setBotName(e.target.value)}\n placeholder=\"e.g. Support Bot\"\n className=\"h-8 text-sm\"\n />\n </div>\n {isLlm ? (\n <>\n <div className=\"space-y-1\">\n <Label htmlFor={`${settingsGroup}-iconImageUrl`} className=\"text-sm\">Icon image URL</Label>\n <Input\n id={`${settingsGroup}-iconImageUrl`}\n value={iconImageUrl}\n onChange={(e) => setIconImageUrl(e.target.value)}\n placeholder=\"https://… or /images/chat-icon.png\"\n className=\"h-8 text-sm\"\n />\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">PNG or image URL. Leave empty to use emoji below.</p>\n </div>\n <div className=\"space-y-1\">\n <Label htmlFor={`${settingsGroup}-icon`} className=\"text-sm\">Icon fallback (emoji)</Label>\n <Input\n id={`${settingsGroup}-icon`}\n value={icon}\n onChange={(e) => setIcon(e.target.value)}\n placeholder=\"e.g. 💬\"\n className=\"h-8 text-sm w-20\"\n />\n </div>\n <div className=\"flex gap-4\">\n <div className=\"space-y-1\">\n <Label htmlFor={`${settingsGroup}-iconBg`} className=\"text-sm\">Icon background</Label>\n <div className=\"flex items-center gap-2\">\n <input\n type=\"color\"\n id={`${settingsGroup}-iconBg`}\n value={iconBackgroundColor}\n onChange={(e) => setIconBackgroundColor(e.target.value)}\n className=\"h-8 w-10 cursor-pointer rounded border border-gray-300 dark:border-gray-600\"\n />\n <Input\n value={iconBackgroundColor}\n onChange={(e) => setIconBackgroundColor(e.target.value)}\n className=\"h-8 w-24 text-sm font-mono\"\n />\n </div>\n </div>\n <div className=\"space-y-1\">\n <Label htmlFor={`${settingsGroup}-headerColor`} className=\"text-sm\">Header color</Label>\n <div className=\"flex items-center gap-2\">\n <input\n type=\"color\"\n id={`${settingsGroup}-headerColor`}\n value={headerColor}\n onChange={(e) => setHeaderColor(e.target.value)}\n className=\"h-8 w-10 cursor-pointer rounded border border-gray-300 dark:border-gray-600\"\n />\n <Input\n value={headerColor}\n onChange={(e) => setHeaderColor(e.target.value)}\n className=\"h-8 w-24 text-sm font-mono\"\n />\n </div>\n </div>\n </div>\n </>\n ) : (\n <div className=\"space-y-1\">\n <Label htmlFor={`${settingsGroup}-icon`} className=\"text-sm\">Icon (emoji or name)</Label>\n <Input\n id={`${settingsGroup}-icon`}\n value={icon}\n onChange={(e) => setIcon(e.target.value)}\n placeholder=\"e.g. 🤖 or llm\"\n className=\"h-8 text-sm\"\n />\n </div>\n )}\n <Button size=\"sm\" onClick={handleSave} disabled={saving} className=\"gap-1\">\n <Save className=\"h-3.5 w-3.5\" />\n Save\n </Button>\n </div>\n );\n}\n\nfunction PluginListItem({\n descriptor,\n enabled,\n selected,\n onSelect,\n}: {\n descriptor: PluginDescriptor;\n enabled: boolean;\n selected: boolean;\n onSelect: () => void;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onSelect}\n className={`flex w-full items-center gap-3 rounded-lg border px-3 py-2.5 text-left transition-colors ${\n selected\n ? 'border-gray-300 bg-gray-50 dark:border-gray-600 dark:bg-gray-700/50'\n : 'border-transparent hover:bg-gray-50 dark:hover:bg-gray-800/50'\n }`}\n >\n <PluginIcon descriptor={descriptor} size=\"sm\" />\n <div className=\"min-w-0 flex-1\">\n <div className=\"font-medium text-gray-900 dark:text-white truncate\">\n {descriptor.label || descriptor.name}\n </div>\n <div className=\"flex items-center gap-2 mt-0.5\">\n <span\n className={`inline-flex items-center gap-1 rounded-full px-1.5 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 ? <CheckCircle2 className=\"h-3 w-3\" /> : <XCircle className=\"h-3 w-3\" />}\n {enabled ? 'On' : 'Off'}\n </span>\n <span className=\"text-xs text-gray-400 dark:text-gray-500\">v{descriptor.version}</span>\n </div>\n </div>\n </button>\n );\n}\n\nexport default function PluginsPage() {\n const { pluginDescriptors = [] } = useContext(AdminConfigContext);\n const [selectedName, setSelectedName] = useState<string | null>(null);\n const [enabledMap, setEnabledMap] = useState<Record<string, boolean>>({});\n\n useEffect(() => {\n pluginDescriptors.forEach((p) => {\n if (!p.settingsGroup) return;\n fetch(`/api/settings/${p.settingsGroup}`)\n .then((r) => (r.ok ? r.json() : {}))\n .then((data: Record<string, string>) =>\n setEnabledMap((prev) => ({ ...prev, [p.name]: data.enabled !== 'false' }))\n )\n .catch(() => {});\n });\n }, [pluginDescriptors]);\n\n const selectedDescriptor = pluginDescriptors.find((p) => p.name === selectedName);\n const refreshEnabled = (name: string) => {\n const d = pluginDescriptors.find((p) => p.name === name);\n if (!d?.settingsGroup) return;\n fetch(`/api/settings/${d.settingsGroup}`)\n .then((r) => (r.ok ? r.json() : {}))\n .then((data: Record<string, string>) =>\n setEnabledMap((prev) => ({ ...prev, [name]: data.enabled !== 'false' }))\n )\n .catch(() => {});\n };\n\n return (\n <div className=\"min-w-0 rounded-lg bg-white shadow-md dark:bg-gray-800\">\n <div className=\"bg-gray-800 border-b border-gray-700 px-4 py-2.5 rounded-t-lg dark:bg-gray-900 dark:border-gray-700\">\n <h1 className=\"text-base font-semibold text-white\">Plugins</h1>\n <p className=\"text-xs text-gray-300 mt-0.5\">Registered plugins and their status</p>\n </div>\n\n <div className=\"min-w-0 p-6\">\n {pluginDescriptors.length === 0 ? (\n <div className=\"py-12 text-center\">\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=\"flex gap-6\">\n <div className=\"w-56 shrink-0 space-y-1\">\n {pluginDescriptors.map((p) => (\n <PluginListItem\n key={p.name}\n descriptor={p}\n enabled={p.settingsGroup ? (enabledMap[p.name] ?? p.enabled !== false) : (p.enabled !== false)}\n selected={selectedName === p.name}\n onSelect={() => setSelectedName(p.name)}\n />\n ))}\n </div>\n <div className=\"min-w-0 flex-1\">\n {!selectedName ? (\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\n <Puzzle className=\"h-10 w-10 text-gray-300 dark:text-gray-600\" />\n <p className=\"mt-3 text-sm text-gray-500 dark:text-gray-400\">\n Select a plugin to view or edit its configuration.\n </p>\n </div>\n ) : (\n <div className=\"rounded-lg border border-gray-200 bg-gray-50/50 p-5 dark:border-gray-700 dark:bg-gray-800/50\">\n {selectedDescriptor?.settingsGroup ? (\n <>\n <h2 className=\"text-sm font-medium text-gray-700 dark:text-gray-300 mb-4\">\n {selectedDescriptor.label || selectedDescriptor.name} — Configuration\n </h2>\n <PluginSettingsPanel\n descriptor={selectedDescriptor}\n onSaved={() => refreshEnabled(selectedDescriptor.name)}\n />\n </>\n ) : (\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\n <Puzzle className=\"h-10 w-10 text-gray-300 dark:text-gray-600\" />\n <p className=\"mt-3 text-sm text-gray-500 dark:text-gray-400\">\n No configuration available for this plugin.\n </p>\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}\n","/** Parse stored config value into a list of emails (JSON array, or comma/semicolon-separated string). */\nexport function parseEmailRecipientsFromConfig(raw: string | undefined | null): string[] {\n if (raw == null || raw === '') return [];\n const trimmed = raw.trim();\n if (trimmed.startsWith('[')) {\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n if (Array.isArray(parsed)) {\n return parsed.map((e) => String(e).trim()).filter(Boolean);\n }\n } catch {\n // fall through\n }\n }\n return trimmed\n .split(/[,;]+/)\n .map((s) => s.trim())\n .filter(Boolean);\n}\n\n/** Serialize email list for config storage (JSON array in DB). */\nexport function serializeEmailRecipients(emails: string[]): string {\n return JSON.stringify(emails);\n}\n\n/** Join for SMTP `to` header (multiple recipients). */\nexport function joinRecipientsForSend(emails: string[]): string | null {\n if (!emails.length) return null;\n return emails.join(', ');\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","\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport { useRouter } from \"next/navigation\";\nimport { AlertCircle, Plus, Trash2, Star } 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\";\nimport AttributeFacetNameInput from \"../../components/Admin/AttributeFacetNameInput\";\n\ntype Collection = { id: number; name: string };\ntype Brand = { id: number; name: string };\ntype Category = { id: number; name: string };\ntype ProductAttribute = { attributeId: number; value: string };\ntype FacetRow = { name: string; value: string };\ntype ImageRow = { url: string; alt: string; isDefault: boolean };\ntype SpecRow = { key: string; value: string };\n\nconst isCreate = (id: string) => id === \"create\";\nconst sectionCls = \"min-w-0 overflow-hidden border border-gray-200 rounded-lg p-4 bg-gray-50/50\";\nconst labelCls = \"block text-xs font-medium text-gray-600 mb-1\";\nconst inputCls = \"w-full rounded-md border border-gray-300 px-2 py-1.5 text-sm\";\n\nfunction buildProductMetadata(\n other: Record<string, unknown>,\n opts: { description: string; images: ImageRow[]; specifications: SpecRow[] }\n): Record<string, unknown> | null {\n const base: Record<string, unknown> = { ...other };\n if (opts.description.trim()) base.description = opts.description.trim();\n else delete base.description;\n\n const filled = opts.images.filter((i) => i.url.trim());\n const imagesOut = filled.map((i, idx) => ({\n url: i.url.trim(),\n alt: i.alt.trim() || undefined,\n sortOrder: idx,\n isDefault: !!i.isDefault,\n }));\n if (imagesOut.length) {\n const defaultIdx = imagesOut.findIndex((x) => x.isDefault);\n imagesOut.forEach((x, i) => {\n x.isDefault = (defaultIdx >= 0 ? i === defaultIdx : i === 0);\n });\n base.images = imagesOut;\n }\n else delete base.images;\n\n const specs = opts.specifications\n .filter((s) => s.key.trim() && s.value.trim())\n .map((s) => ({ key: s.key.trim(), value: s.value.trim() }));\n if (specs.length) base.specifications = specs;\n else delete base.specifications;\n\n return Object.keys(base).length ? base : null;\n}\n\nfunction pickOtherMetadata(m: Record<string, unknown> | null | undefined): Record<string, unknown> {\n if (!m || typeof m !== \"object\" || Array.isArray(m)) return {};\n const { description: _d, images: _i, specifications: _s, ...rest } = m;\n return rest;\n}\n\nexport default function ProductEditPage({ productId }: { productId: string }) {\n const router = useRouter();\n const create = isCreate(productId);\n const [loading, setLoading] = useState(!create);\n const [saving, setSaving] = useState(false);\n const [errors, setErrors] = useState<string[]>([]);\n\n const [collections, setCollections] = useState<Collection[]>([]);\n const [brands, setBrands] = useState<Brand[]>([]);\n const [categories, setCategories] = useState<Category[]>([]);\n\n const [name, setName] = useState(\"\");\n const [sku, setSku] = useState(\"\");\n const [hsn, setHsn] = useState(\"\");\n const [collectionId, setCollectionId] = useState<number | null>(null);\n const [brandId, setBrandId] = useState<number | null>(null);\n const [categoryId, setCategoryId] = useState<number | null>(null);\n const [price, setPrice] = useState(\"\");\n const [compareAtPrice, setCompareAtPrice] = useState(\"\");\n const [quantity, setQuantity] = useState(1);\n const [status, setStatus] = useState<string>(\"draft\");\n const [featured, setFeatured] = useState(false);\n\n const [description, setDescription] = useState(\"\");\n const [images, setImages] = useState<ImageRow[]>([{ url: \"\", alt: \"\", isDefault: true }]);\n const [specifications, setSpecifications] = useState<SpecRow[]>([{ key: \"\", value: \"\" }]);\n const [otherMetadata, setOtherMetadata] = useState<Record<string, unknown>>({});\n const [facetRows, setFacetRows] = useState<FacetRow[]>([{ name: \"\", value: \"\" }]);\n\n const [seoId, setSeoId] = useState<number | null>(null);\n const [seo, setSeo] = useState<SeoFields>({\n seoTitle: \"\",\n seoDescription: \"\",\n seoKeywords: \"\",\n seoOgTitle: \"\",\n seoOgDescription: \"\",\n seoOgImage: \"\",\n });\n\n useEffect(() => {\n let cancelled = false;\n (async () => {\n try {\n const [colRes, brandRes, catRes, attrRes] = await Promise.all([\n fetch(\"/api/collections?limit=500\"),\n fetch(\"/api/brands?limit=500\"),\n fetch(\"/api/product_categories?limit=500\"),\n fetch(\"/api/attributes?limit=500\"),\n ]);\n let attrList: { id: number; name: string }[] = [];\n if (!cancelled && colRes.ok) {\n const d = await colRes.json();\n if (Array.isArray(d.data)) setCollections(d.data);\n }\n if (!cancelled && brandRes.ok) {\n const d = await brandRes.json();\n if (Array.isArray(d.data)) setBrands(d.data);\n }\n if (!cancelled && catRes.ok) {\n const d = await catRes.json();\n if (Array.isArray(d.data)) setCategories(d.data);\n }\n if (!cancelled && attrRes.ok) {\n const d = await attrRes.json();\n if (Array.isArray(d.data)) attrList = d.data;\n }\n if (create) {\n if (!cancelled) setLoading(false);\n return;\n }\n const res = await fetch(`/api/products/${productId}`);\n if (!res.ok) throw new Error(\"Failed to load product\");\n const product = await res.json();\n if (cancelled) return;\n\n setName(product.name ?? \"\");\n setSku(product.sku ?? \"\");\n setHsn(product.hsn ?? \"\");\n setCollectionId(product.collectionId ?? null);\n setBrandId(product.brandId ?? null);\n setCategoryId(product.categoryId ?? null);\n setPrice(product.price != null ? String(product.price) : \"\");\n setCompareAtPrice(product.compareAtPrice != null ? String(product.compareAtPrice) : \"\");\n setQuantity(product.quantity ?? 1);\n setStatus(product.status ?? \"draft\");\n setFeatured(product.featured ?? false);\n\n const m = product.metadata as Record<string, unknown> | null | undefined;\n setDescription((m && typeof m.description === \"string\" ? m.description : \"\") ?? \"\");\n const rawImages = m?.images as Array<{ url?: string; alt?: string; isDefault?: boolean }> | undefined;\n if (Array.isArray(rawImages) && rawImages.length > 0) {\n setImages(\n rawImages.map((x) => ({\n url: String(x?.url ?? \"\"),\n alt: String(x?.alt ?? \"\"),\n isDefault: !!x?.isDefault,\n }))\n );\n }\n const rawSpecs = m?.specifications as Array<{ key?: string; value?: string }> | undefined;\n if (Array.isArray(rawSpecs) && rawSpecs.length > 0) {\n setSpecifications(rawSpecs.map((s) => ({ key: String(s?.key ?? \"\"), value: String(s?.value ?? \"\") })));\n }\n setOtherMetadata(pickOtherMetadata(m));\n\n if (product.seoId) {\n setSeoId(product.seoId);\n const seoData = await fetchSeo(product.seoId);\n if (!cancelled) setSeo(seoData);\n }\n const paRes = await fetch(`/api/product_attributes?productId=${productId}&limit=100`);\n if (paRes.ok && !cancelled) {\n const paData = await paRes.json();\n if (Array.isArray(paData.data) && paData.data.length > 0) {\n const rows: FacetRow[] = [];\n (paData.data as ProductAttribute[]).forEach((pa) => {\n const a = attrList.find((x) => x.id === pa.attributeId);\n if (a) rows.push({ name: a.name, value: pa.value ?? \"\" });\n });\n if (rows.length) setFacetRows(rows);\n else if (!cancelled) setFacetRows([{ name: \"\", value: \"\" }]);\n } else if (!cancelled) setFacetRows([{ name: \"\", value: \"\" }]);\n }\n } catch {\n if (!cancelled) setErrors([\"Failed to load product\"]);\n } finally {\n if (!cancelled) setLoading(false);\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [productId, create]);\n\n const handleSave = async () => {\n setErrors([]);\n if (!name.trim()) {\n setErrors([\"Name is required\"]);\n return;\n }\n if (!price.trim()) {\n setErrors([\"Price is required\"]);\n return;\n }\n setSaving(true);\n try {\n const savedSeoId = await saveSeo(seo, name.trim().toLowerCase().replace(/[^a-z0-9]+/g, \"-\"), seoId);\n const metadata = buildProductMetadata(otherMetadata, { description, images, specifications });\n const productPayload: Record<string, unknown> = {\n name: name.trim(),\n sku: sku.trim() || null,\n hsn: hsn.trim() || null,\n collectionId: collectionId || null,\n brandId: brandId || null,\n categoryId: categoryId || null,\n price: Number(price),\n compareAtPrice: compareAtPrice ? Number(compareAtPrice) : null,\n quantity,\n status,\n featured,\n metadata,\n };\n if (savedSeoId) productPayload.seoId = savedSeoId;\n\n const res = await fetch(create ? \"/api/products\" : `/api/products/${productId}`, {\n method: create ? \"POST\" : \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(productPayload),\n });\n if (!res.ok) {\n const data = await res.json().catch(() => ({}));\n setErrors([(data as { error?: string }).error ?? \"Failed to save product\"]);\n return;\n }\n const savedProduct = await res.json();\n const savedId = create ? (savedProduct as { id: number }).id : productId;\n\n const slugify = (n: string) =>\n n\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\") || \"attribute\";\n async function ensureAttributeId(attrName: string): Promise<number | null> {\n const name = attrName.trim();\n if (!name) return null;\n const slug = slugify(name);\n const r = await fetch(`/api/attributes?search=${encodeURIComponent(name)}&limit=50`);\n if (r.ok) {\n const d = await r.json();\n const rows = (Array.isArray(d.data) ? d.data : []) as { id: number; name: string; slug?: string }[];\n const found =\n rows.find((x) => x.name.toLowerCase() === name.toLowerCase()) ??\n rows.find((x) => x.slug === slug);\n if (found) return found.id;\n }\n const post = await fetch(\"/api/attributes\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ name, slug, type: \"text\", active: true, sortOrder: 0 }),\n });\n if (post.ok) {\n const a = (await post.json()) as { id: number };\n return a.id ?? null;\n }\n const r2 = await fetch(`/api/attributes?search=${encodeURIComponent(name)}&limit=50`);\n if (r2.ok) {\n const d = await r2.json();\n const rows = (Array.isArray(d.data) ? d.data : []) as { id: number; name: string }[];\n const found = rows.find((x) => x.name.toLowerCase() === name.toLowerCase());\n if (found) return found.id;\n }\n return null;\n }\n\n const wanted = new Map<number, string>();\n for (const row of facetRows) {\n const n = row.name.trim();\n const v = row.value.trim();\n if (!n || !v) continue;\n const aid = await ensureAttributeId(n);\n if (aid != null) wanted.set(aid, v);\n }\n\n const paListRes = await fetch(`/api/product_attributes?productId=${savedId}&limit=200`);\n const paListData = paListRes.ok ? await paListRes.json() : { data: [] };\n const existingPa = (Array.isArray(paListData.data) ? paListData.data : []) as {\n id: number;\n attributeId: number;\n }[];\n for (const ep of existingPa) {\n if (!wanted.has(ep.attributeId)) {\n await fetch(`/api/product_attributes/${ep.id}`, { method: \"DELETE\" });\n }\n }\n for (const [attributeId, value] of wanted) {\n const existingRes = await fetch(\n `/api/product_attributes?productId=${savedId}&attributeId=${attributeId}&limit=1`\n );\n const existingData = await existingRes.json();\n const existing = Array.isArray(existingData.data) ? existingData.data[0] : undefined;\n if (existing) {\n await fetch(`/api/product_attributes/${(existing as { id: number }).id}`, {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ value }),\n });\n } else {\n await fetch(\"/api/product_attributes\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n productId: Number(savedId),\n attributeId,\n value,\n }),\n });\n }\n }\n router.push(\"/admin/products\");\n } catch {\n setErrors([\"Failed to save\"]);\n } finally {\n setSaving(false);\n }\n };\n\n const addImage = () => setImages((prev) => [...prev, { url: \"\", alt: \"\", isDefault: false }]);\n const removeImage = (i: number) =>\n setImages((prev) => (prev.length <= 1 ? prev : prev.filter((_, j) => j !== i)));\n const setImage = (i: number, field: keyof ImageRow, value: string | boolean) =>\n setImages((prev) => prev.map((row, j) => (j === i ? { ...row, [field]: value } : row)));\n const setDefaultImage = (i: number) =>\n setImages((prev) => prev.map((row, j) => ({ ...row, isDefault: j === i })));\n\n const addSpec = () => setSpecifications((prev) => [...prev, { key: \"\", value: \"\" }]);\n const removeSpec = (i: number) =>\n setSpecifications((prev) => (prev.length <= 1 ? prev : prev.filter((_, j) => j !== i)));\n const setSpec = (i: number, field: keyof SpecRow, value: string) =>\n setSpecifications((prev) => prev.map((row, j) => (j === i ? { ...row, [field]: value } : row)));\n\n const addFacet = () => setFacetRows((prev) => [...prev, { name: \"\", value: \"\" }]);\n const removeFacet = (i: number) =>\n setFacetRows((prev) => (prev.length <= 1 ? prev : prev.filter((_, j) => j !== i)));\n const setFacet = (i: number, field: keyof FacetRow, value: string) =>\n setFacetRows((prev) => prev.map((row, j) => (j === i ? { ...row, [field]: value } : row)));\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 Product\" : \"Edit Product\"}\n subtitle={create ? \"Create a new product\" : \"Update product details\"}\n closeHref=\"/admin/products\"\n menuItems={[\n { label: saving ? \"Saving...\" : \"Save\", onClick: handleSave },\n { label: featured ? \"Unfeature\" : \"Feature\", onClick: () => setFeatured(!featured) },\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 <DetailPageLayout\n main={\n <>\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">Product details</h2>\n <div className={`${sectionCls} space-y-4`}>\n <div>\n <label className={labelCls}>Name *</label>\n <input type=\"text\" value={name} onChange={(e) => setName(e.target.value)} className={inputCls} required />\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className={labelCls}>SKU</label>\n <input type=\"text\" value={sku} onChange={(e) => setSku(e.target.value)} className={inputCls} />\n </div>\n <div>\n <label className={labelCls}>HSN</label>\n <input type=\"text\" value={hsn} onChange={(e) => setHsn(e.target.value)} className={inputCls} />\n </div>\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className={labelCls}>Brand</label>\n <select value={brandId ?? \"\"} onChange={(e) => setBrandId(e.target.value ? Number(e.target.value) : null)} className={inputCls}>\n <option value=\"\">None</option>\n {brands.map((b) => (\n <option key={b.id} value={b.id}>{b.name}</option>\n ))}\n </select>\n </div>\n <div>\n <label className={labelCls}>Category</label>\n <select value={categoryId ?? \"\"} onChange={(e) => setCategoryId(e.target.value ? Number(e.target.value) : null)} className={inputCls}>\n <option value=\"\">None</option>\n {categories.map((c) => (\n <option key={c.id} value={c.id}>{c.name}</option>\n ))}\n </select>\n </div>\n </div>\n <div>\n <label className={labelCls}>Collection</label>\n <select value={collectionId ?? \"\"} onChange={(e) => setCollectionId(e.target.value ? Number(e.target.value) : null)} className={inputCls}>\n <option value=\"\">None</option>\n {collections.map((c) => (\n <option key={c.id} value={c.id}>{c.name}</option>\n ))}\n </select>\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className={labelCls}>Price *</label>\n <input type=\"number\" value={price} onChange={(e) => setPrice(e.target.value)} className={inputCls} required />\n </div>\n <div>\n <label className={labelCls}>Compare at price</label>\n <input type=\"number\" value={compareAtPrice} onChange={(e) => setCompareAtPrice(e.target.value)} className={inputCls} />\n </div>\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className={labelCls}>Quantity</label>\n <input type=\"number\" value={quantity} onChange={(e) => setQuantity(Number(e.target.value) || 0)} className={inputCls} />\n </div>\n <div>\n <label className={labelCls}>Status</label>\n <select value={status} onChange={(e) => setStatus(e.target.value)} className={inputCls}>\n <option value=\"draft\">Draft</option>\n <option value=\"available\">Available</option>\n <option value=\"reserved\">Reserved</option>\n <option value=\"sold\">Sold</option>\n </select>\n </div>\n </div>\n </div>\n </section>\n\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">Attributes (facets)</h2>\n <p className=\"text-xs text-gray-500 mb-2\">Search existing attributes or create new ones (like blog categories). Value on the right.</p>\n <div className={`${sectionCls} space-y-2`}>\n {facetRows.map((row, i) => (\n <div key={i} className=\"flex gap-2 items-start\">\n <AttributeFacetNameInput\n value={row.name}\n onChange={(name) => setFacet(i, \"name\", name)}\n inputClassName={inputCls}\n />\n <input\n type=\"text\"\n value={row.value}\n onChange={(e) => setFacet(i, \"value\", e.target.value)}\n placeholder=\"Value\"\n className={`${inputCls} flex-1 min-w-[120px]`}\n />\n <button type=\"button\" onClick={() => removeFacet(i)} className=\"p-2 text-gray-400 hover:text-red-600 rounded shrink-0 mt-0.5\">\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\n ))}\n <button type=\"button\" onClick={addFacet} className=\"inline-flex items-center gap-1 rounded border border-gray-300 bg-white px-2 py-1.5 text-xs font-medium text-gray-700 hover:bg-gray-50\">\n <Plus className=\"h-3.5 w-3.5\" /> Add attribute\n </button>\n </div>\n </section>\n\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">Media</h2>\n <div className={`${sectionCls} space-y-3`}>\n {images.map((row, i) => (\n <div key={i} className=\"flex flex-wrap items-start gap-2 p-2 bg-white rounded border border-gray-200\">\n <div className=\"flex-1 min-w-[200px]\">\n <label className={labelCls}>Image URL</label>\n <input\n type=\"url\"\n value={row.url}\n onChange={(e) => setImage(i, \"url\", e.target.value)}\n className={inputCls}\n placeholder=\"https://...\"\n />\n </div>\n <div className=\"flex-1 min-w-[120px]\">\n <label className={labelCls}>Alt text</label>\n <input\n type=\"text\"\n value={row.alt}\n onChange={(e) => setImage(i, \"alt\", e.target.value)}\n className={inputCls}\n />\n </div>\n <button\n type=\"button\"\n onClick={() => setDefaultImage(i)}\n title=\"Set as default\"\n className=\"mt-6 p-2 rounded border border-gray-300 hover:bg-gray-100\"\n >\n <Star className={`h-4 w-4 ${row.isDefault ? \"fill-amber-400 text-amber-500\" : \"text-gray-400\"}`} />\n </button>\n <button type=\"button\" onClick={() => removeImage(i)} className=\"mt-6 p-2 text-gray-400 hover:text-red-600 rounded\">\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\n ))}\n <button type=\"button\" onClick={addImage} className=\"inline-flex items-center gap-1 rounded border border-gray-300 bg-white px-2 py-1.5 text-xs font-medium text-gray-700 hover:bg-gray-50\">\n <Plus className=\"h-3.5 w-3.5\" /> Add image\n </button>\n </div>\n </section>\n\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">Description</h2>\n <div className={sectionCls}>\n <textarea\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n className=\"w-full rounded-md border border-gray-300 px-2 py-1.5 text-sm min-h-[100px]\"\n rows={4}\n placeholder=\"Product description...\"\n />\n </div>\n </section>\n\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">Specifications</h2>\n <div className={`${sectionCls} space-y-2`}>\n {specifications.map((row, i) => (\n <div key={i} className=\"flex gap-2\">\n <input\n type=\"text\"\n value={row.key}\n onChange={(e) => setSpec(i, \"key\", e.target.value)}\n placeholder=\"Key\"\n className={`${inputCls} flex-1`}\n />\n <input\n type=\"text\"\n value={row.value}\n onChange={(e) => setSpec(i, \"value\", e.target.value)}\n placeholder=\"Value\"\n className={`${inputCls} flex-1`}\n />\n <button type=\"button\" onClick={() => removeSpec(i)} className=\"p-2 text-gray-400 hover:text-red-600 rounded shrink-0\">\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\n ))}\n <button type=\"button\" onClick={addSpec} className=\"inline-flex items-center gap-1 rounded border border-gray-300 bg-white px-2 py-1.5 text-xs font-medium text-gray-700 hover:bg-gray-50\">\n <Plus className=\"h-3.5 w-3.5\" /> Add row\n </button>\n </div>\n </section>\n </>\n }\n sidebar={\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">SEO</h2>\n <div className={sectionCls}>\n <SeoSection values={seo} onChange={(field, value) => setSeo((s) => ({ ...s, [field]: value }))} />\n </div>\n </section>\n }\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\n\ntype Attr = { id: number; name: string };\n\nfunction slugFromName(name: string): string {\n const s = name\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n return s || \"attribute\";\n}\n\nexport default function AttributeFacetNameInput({\n value,\n onChange,\n inputClassName,\n}: {\n value: string;\n onChange: (name: string) => void;\n inputClassName: string;\n}) {\n const [draft, setDraft] = useState(value);\n const [open, setOpen] = useState(false);\n const [list, setList] = useState<Attr[]>([]);\n\n useEffect(() => {\n setDraft(value);\n }, [value]);\n\n useEffect(() => {\n const q = draft.trim();\n if (!q) {\n setList([]);\n return;\n }\n const t = setTimeout(async () => {\n const r = await fetch(`/api/attributes?search=${encodeURIComponent(q)}&limit=30`);\n if (r.ok) {\n const d = await r.json();\n setList(Array.isArray(d.data) ? d.data : []);\n }\n }, 250);\n return () => clearTimeout(t);\n }, [draft]);\n\n const pick = (a: Attr) => {\n onChange(a.name);\n setDraft(a.name);\n setOpen(false);\n };\n\n const createAttr = async () => {\n const name = draft.trim();\n if (!name) return;\n const slug = slugFromName(name);\n const res = await fetch(\"/api/attributes\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n name,\n slug,\n type: \"text\",\n active: true,\n sortOrder: 0,\n }),\n });\n if (res.ok) {\n const a = (await res.json()) as { name?: string };\n const n = a.name ?? name;\n onChange(n);\n setDraft(n);\n setOpen(false);\n return;\n }\n const r2 = await fetch(`/api/attributes?search=${encodeURIComponent(name)}&limit=20`);\n if (r2.ok) {\n const d = await r2.json();\n const rows = (Array.isArray(d.data) ? d.data : []) as Attr[];\n const found =\n rows.find((x) => x.name.toLowerCase() === name.toLowerCase()) ?? rows[0];\n if (found) pick(found);\n }\n };\n\n const exactMatch = list.some((x) => x.name.toLowerCase() === draft.trim().toLowerCase());\n\n return (\n <div className=\"relative min-w-0 flex-1\">\n <input\n type=\"text\"\n value={draft}\n onChange={(e) => {\n setDraft(e.target.value);\n setOpen(true);\n }}\n onFocus={() => setOpen(true)}\n onBlur={() =>\n setTimeout(() => {\n setOpen(false);\n onChange(draft.trim());\n }, 200)\n }\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n if (list[0] && !draft.trim()) return;\n if (list[0] && draft.trim()) {\n const m = list.find(\n (x) => x.name.toLowerCase() === draft.trim().toLowerCase()\n );\n if (m) pick(m);\n else pick(list[0]);\n } else if (draft.trim()) void createAttr();\n }\n }}\n placeholder=\"Search or create attribute…\"\n className={inputClassName}\n />\n {open && (list.length > 0 || (draft.trim() && !exactMatch)) && (\n <ul className=\"absolute z-20 mt-1 w-full rounded-md border border-gray-200 bg-white py-1 shadow-lg max-h-48 overflow-auto\">\n {list.map((a) => (\n <li\n key={a.id}\n onMouseDown={(e) => {\n e.preventDefault();\n pick(a);\n }}\n className=\"cursor-pointer px-3 py-1.5 text-sm hover:bg-gray-100\"\n >\n {a.name}\n </li>\n ))}\n {draft.trim() && !exactMatch && (\n <li\n onMouseDown={(e) => {\n e.preventDefault();\n void createAttr();\n }}\n className=\"cursor-pointer px-3 py-1.5 text-sm text-gray-700 hover:bg-gray-100 border-t border-gray-100\"\n >\n Create &quot;{draft.trim()}&quot;\n </li>\n )}\n </ul>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport { useRouter } from \"next/navigation\";\nimport { AlertCircle, Plus, Trash2, ChevronDown, ChevronUp } 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\ntype Category = { id: number; name: string };\ntype Brand = { id: number; name: string };\ntype HeroSlide = { url: string; type: \"image\" | \"video\"; caption: string };\ntype VariantForm = { name: string; price: string; extraSpecs: { key: string; value: string }[] };\n\nconst isCreate = (id: string) => id === \"create\";\nconst emptySlide = (): HeroSlide => ({ url: \"\", type: \"image\", caption: \"\" });\nconst emptyVariant = (): VariantForm => ({ name: \"\", price: \"\", extraSpecs: [] });\nconst sectionCls = \"min-w-0 overflow-hidden border border-gray-200 rounded-lg p-4 bg-gray-50/50\";\nconst labelCls = \"block text-xs font-medium text-gray-600 mb-1\";\nconst inputCls = \"w-full rounded-md border border-gray-300 px-2 py-1.5 text-sm\";\n\nexport default function CollectionEditPage({ collectionId }: { collectionId: string }) {\n const router = useRouter();\n const create = isCreate(collectionId);\n const [loading, setLoading] = useState(!create);\n const [saving, setSaving] = useState(false);\n const [errors, setErrors] = useState<string[]>([]);\n const [categories, setCategories] = useState<Category[]>([]);\n const [brands, setBrands] = useState<Brand[]>([]);\n\n const [name, setName] = useState(\"\");\n const [slug, setSlug] = useState(\"\");\n const [hsn, setHsn] = useState(\"\");\n const [categoryId, setCategoryId] = useState<number | null>(null);\n const [brandId, setBrandId] = useState<number | null>(null);\n const [description, setDescription] = useState(\"\");\n const [image, setImage] = useState(\"\");\n const [active, setActive] = useState(true);\n const [sortOrder, setSortOrder] = useState(0);\n\n const [advancedOpen, setAdvancedOpen] = useState(false);\n const [heroSlides, setHeroSlides] = useState<HeroSlide[]>([emptySlide()]);\n const [variants, setVariants] = useState<VariantForm[]>([emptyVariant()]);\n const [experienceDescription, setExperienceDescription] = useState(\"\");\n const [brochureUrl, setBrochureUrl] = useState(\"\");\n\n const [seoId, setSeoId] = useState<number | null>(null);\n const [seo, setSeo] = useState<SeoFields>({\n seoTitle: \"\",\n seoDescription: \"\",\n seoKeywords: \"\",\n seoOgTitle: \"\",\n seoOgDescription: \"\",\n seoOgImage: \"\",\n });\n\n useEffect(() => {\n let cancelled = false;\n (async () => {\n try {\n const [catRes, brandRes] = await Promise.all([\n fetch(\"/api/product_categories?limit=500\"),\n fetch(\"/api/brands?limit=500\"),\n ]);\n if (!cancelled && catRes.ok) {\n const d = await catRes.json();\n if (Array.isArray(d.data)) setCategories(d.data);\n }\n if (!cancelled && brandRes.ok) {\n const d = await brandRes.json();\n if (Array.isArray(d.data)) setBrands(d.data);\n }\n if (create) {\n if (!cancelled) setLoading(false);\n return;\n }\n const res = await fetch(`/api/collections/${collectionId}`);\n if (!res.ok) throw new Error(\"Failed to load collection\");\n const data = await res.json();\n if (cancelled) return;\n\n setName(data.name ?? \"\");\n setSlug(data.slug ?? \"\");\n setHsn(data.hsn ?? \"\");\n setCategoryId(data.categoryId ?? null);\n setBrandId(data.brandId ?? null);\n setDescription(data.description ?? \"\");\n setImage(data.image ?? \"\");\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 const m = data.metadata as Record<string, unknown> | null;\n const rawVariants = m?.variants as Array<Record<string, unknown>> | undefined;\n if (Array.isArray(rawVariants) && rawVariants.length > 0) {\n setVariants(\n rawVariants.map((v) => {\n const extraSpecs: { key: string; value: string }[] = [];\n Object.keys(v).forEach((k) => {\n if (k !== \"name\" && k !== \"price\" && v[k] != null) extraSpecs.push({ key: k, value: String(v[k]) });\n });\n return {\n name: String(v.name ?? \"\"),\n price: v.price != null ? String(v.price) : \"\",\n extraSpecs,\n };\n })\n );\n }\n const slides = m?.heroSlides as Array<{ url?: string; type?: string; caption?: string }> | undefined;\n if (Array.isArray(slides) && slides.length > 0) {\n setHeroSlides(\n slides.map((s) => ({\n url: s?.url ?? \"\",\n type: (s?.type === \"video\" ? \"video\" : \"image\") as \"image\" | \"video\",\n caption: s?.caption ?? \"\",\n }))\n );\n }\n const exp = m?.experience as { description?: string } | undefined;\n setExperienceDescription(exp?.description ?? \"\");\n setBrochureUrl(typeof m?.brochureUrl === \"string\" ? m.brochureUrl : \"\");\n } catch {\n if (!cancelled) setErrors([\"Failed to load collection\"]);\n } finally {\n if (!cancelled) setLoading(false);\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [collectionId, create]);\n\n const buildMetadata = (): Record<string, unknown> | null => {\n const meta: Record<string, unknown> = {};\n const validVariants = variants.filter((v) => v.name.trim());\n if (validVariants.length > 0) {\n meta.variants = validVariants.map((v) => {\n const obj: Record<string, unknown> = { name: v.name.trim() };\n if (v.price) obj.price = Number(v.price);\n v.extraSpecs.forEach((s) => {\n if (s.key.trim()) obj[s.key.trim()] = s.value.trim();\n });\n return obj;\n });\n }\n const slides = heroSlides.filter((x) => x.url.trim());\n if (slides.length > 0) {\n meta.heroSlides = slides.map((s) => ({ url: s.url, type: s.type, caption: s.caption || undefined }));\n }\n if (experienceDescription.trim()) meta.experience = { description: experienceDescription.trim() };\n if (brochureUrl.trim()) meta.brochureUrl = brochureUrl.trim();\n return Object.keys(meta).length > 0 ? meta : null;\n };\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 const payload: Record<string, unknown> = {\n name: name.trim(),\n slug: slug.trim(),\n hsn: hsn.trim() || null,\n categoryId: categoryId || null,\n brandId: brandId || null,\n description: description || null,\n image: image || null,\n active,\n sortOrder,\n metadata: buildMetadata(),\n };\n if (savedSeoId) payload.seoId = savedSeoId;\n const res = await fetch(create ? \"/api/collections\" : `/api/collections/${collectionId}`, {\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 as { error?: string }).error ?? \"Failed to save\"]);\n return;\n }\n router.push(\"/admin/collections\");\n } catch {\n setErrors([\"Failed to save\"]);\n } finally {\n setSaving(false);\n }\n };\n\n const addHeroSlide = () => setHeroSlides((s) => [...s, emptySlide()]);\n const removeHeroSlide = (i: number) => setHeroSlides((s) => (s.length <= 1 ? s : s.filter((_, j) => j !== i)));\n const updateHeroSlide = (i: number, field: keyof HeroSlide, value: string) =>\n setHeroSlides((s) => s.map((slide, j) => (j === i ? { ...slide, [field]: value } : slide)));\n const addVariant = () => setVariants((v) => [...v, emptyVariant()]);\n const removeVariant = (i: number) => setVariants((v) => (v.length <= 1 ? v : v.filter((_, j) => j !== i)));\n const updateVariant = (i: number, field: keyof VariantForm, value: string | { key: string; value: string }[]) =>\n setVariants((v) => v.map((x, j) => (j === i ? { ...x, [field]: value } : x)));\n const updateVariantExtraSpec = (variantIdx: number, specIdx: number, keyOrValue: \"key\" | \"value\", val: string) =>\n setVariants((v) =>\n v.map((x, j) => {\n if (j !== variantIdx) return x;\n const next = [...x.extraSpecs];\n next[specIdx] = { ...next[specIdx], [keyOrValue]: val };\n return { ...x, extraSpecs: next };\n })\n );\n const addVariantExtraSpec = (variantIdx: number) =>\n setVariants((v) =>\n v.map((x, j) => (j === variantIdx ? { ...x, extraSpecs: [...x.extraSpecs, { key: \"\", value: \"\" }] } : x))\n );\n const removeVariantExtraSpec = (variantIdx: number, specIdx: number) =>\n setVariants((v) =>\n v.map((x, j) => (j === variantIdx ? { ...x, extraSpecs: x.extraSpecs.filter((_, s) => s !== specIdx) } : x))\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 Collection\" : \"Edit Collection\"}\n subtitle={create ? \"Create a new collection\" : \"Update collection and page content\"}\n closeHref=\"/admin/collections\"\n menuItems={[\n { label: saving ? \"Saving...\" : \"Save\", onClick: handleSave },\n { label: active ? \"Deactivate\" : \"Activate\", onClick: () => setActive(!active) },\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 <DetailPageLayout\n main={\n <>\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">Basic info</h2>\n <div className={`${sectionCls} space-y-4`}>\n <div>\n <label className={labelCls}>Name *</label>\n <input type=\"text\" value={name} onChange={(e) => setName(e.target.value)} className={inputCls} required />\n </div>\n <div>\n <label className={labelCls}>Slug *</label>\n <input type=\"text\" value={slug} onChange={(e) => setSlug(e.target.value)} className={inputCls} required />\n </div>\n <div>\n <label className={labelCls}>HSN</label>\n <input type=\"text\" value={hsn} onChange={(e) => setHsn(e.target.value)} className={inputCls} />\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className={labelCls}>Category</label>\n <select value={categoryId ?? \"\"} onChange={(e) => setCategoryId(e.target.value ? Number(e.target.value) : null)} className={inputCls}>\n <option value=\"\">None</option>\n {categories.map((c) => (\n <option key={c.id} value={c.id}>{c.name}</option>\n ))}\n </select>\n </div>\n <div>\n <label className={labelCls}>Brand</label>\n <select value={brandId ?? \"\"} onChange={(e) => setBrandId(e.target.value ? Number(e.target.value) : null)} className={inputCls}>\n <option value=\"\">None</option>\n {brands.map((b) => (\n <option key={b.id} value={b.id}>{b.name}</option>\n ))}\n </select>\n </div>\n </div>\n <div>\n <label className={labelCls}>Description</label>\n <textarea value={description} onChange={(e) => setDescription(e.target.value)} className={`${inputCls} min-h-[80px]`} rows={3} />\n </div>\n <div>\n <label className={labelCls}>Cover image URL</label>\n <input type=\"url\" value={image} onChange={(e) => setImage(e.target.value)} className={inputCls} placeholder=\"https://...\" />\n </div>\n <div>\n <label className={labelCls}>Sort order</label>\n <input type=\"number\" value={sortOrder} onChange={(e) => setSortOrder(Number(e.target.value) || 0)} className={inputCls} style={{ width: \"6rem\" }} />\n </div>\n </div>\n </section>\n\n <section>\n <button\n type=\"button\"\n onClick={() => setAdvancedOpen((o) => !o)}\n className=\"flex items-center gap-2 w-full text-left text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\"\n >\n {advancedOpen ? <ChevronUp className=\"h-4 w-4\" /> : <ChevronDown className=\"h-4 w-4\" />}\n Advanced page content\n </button>\n {advancedOpen && (\n <div className=\"space-y-4\">\n <div className={sectionCls}>\n <h3 className=\"text-xs font-medium text-gray-700 mb-2\">Hero carousel</h3>\n {heroSlides.map((slide, i) => (\n <div key={i} className=\"flex flex-wrap gap-2 mb-3 p-2 bg-white rounded border\">\n <input type=\"url\" value={slide.url} onChange={(e) => updateHeroSlide(i, \"url\", e.target.value)} placeholder=\"Media URL\" className={`${inputCls} flex-1 min-w-[200px]`} />\n <select value={slide.type} onChange={(e) => updateHeroSlide(i, \"type\", e.target.value as \"image\" | \"video\")} className={`${inputCls} w-24`}>\n <option value=\"image\">Image</option>\n <option value=\"video\">Video</option>\n </select>\n <input type=\"text\" value={slide.caption} onChange={(e) => updateHeroSlide(i, \"caption\", e.target.value)} placeholder=\"Caption\" className={`${inputCls} flex-1 min-w-[120px]`} />\n <button type=\"button\" onClick={() => removeHeroSlide(i)} className=\"p-2 text-gray-400 hover:text-red-600 rounded shrink-0\">\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\n ))}\n <button type=\"button\" onClick={addHeroSlide} className=\"inline-flex items-center gap-1 rounded border border-gray-300 bg-white px-2 py-1.5 text-xs font-medium text-gray-700 hover:bg-gray-50\">\n <Plus className=\"h-3.5 w-3.5\" /> Add slide\n </button>\n </div>\n <div className={sectionCls}>\n <h3 className=\"text-xs font-medium text-gray-700 mb-2\">Variants</h3>\n {variants.map((v, i) => (\n <div key={i} className=\"mb-4 p-3 bg-white rounded border space-y-2\">\n <div className=\"flex gap-2\">\n <input type=\"text\" value={v.name} onChange={(e) => updateVariant(i, \"name\", e.target.value)} placeholder=\"Name\" className={`${inputCls} w-40`} />\n <input type=\"number\" value={v.price} onChange={(e) => updateVariant(i, \"price\", e.target.value)} placeholder=\"Price\" className={`${inputCls} w-28`} />\n <button type=\"button\" onClick={() => removeVariant(i)} className=\"p-2 text-gray-400 hover:text-red-600 rounded shrink-0\">\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\n {v.extraSpecs.map((s, si) => (\n <div key={si} className=\"flex gap-2\">\n <input type=\"text\" value={s.key} onChange={(e) => updateVariantExtraSpec(i, si, \"key\", e.target.value)} placeholder=\"Key\" className={`${inputCls} flex-1`} />\n <input type=\"text\" value={s.value} onChange={(e) => updateVariantExtraSpec(i, si, \"value\", e.target.value)} placeholder=\"Value\" className={`${inputCls} flex-1`} />\n <button type=\"button\" onClick={() => removeVariantExtraSpec(i, si)} className=\"p-2 text-gray-400 hover:text-red-600 rounded shrink-0\">\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\n ))}\n <button type=\"button\" onClick={() => addVariantExtraSpec(i)} className=\"inline-flex items-center gap-1 rounded border border-gray-300 bg-white px-2 py-1 text-xs text-gray-700 hover:bg-gray-50\">\n <Plus className=\"h-3 w-3\" /> Add spec\n </button>\n </div>\n ))}\n <button type=\"button\" onClick={addVariant} className=\"inline-flex items-center gap-1 rounded border border-gray-300 bg-white px-2 py-1.5 text-xs font-medium text-gray-700 hover:bg-gray-50\">\n <Plus className=\"h-3.5 w-3.5\" /> Add variant\n </button>\n </div>\n <div className={sectionCls}>\n <label className={labelCls}>Experience description</label>\n <textarea value={experienceDescription} onChange={(e) => setExperienceDescription(e.target.value)} className={`${inputCls} min-h-[60px]`} rows={2} placeholder=\"Optional\" />\n </div>\n <div className={sectionCls}>\n <label className={labelCls}>Brochure URL</label>\n <input type=\"url\" value={brochureUrl} onChange={(e) => setBrochureUrl(e.target.value)} className={inputCls} placeholder=\"https://...\" />\n </div>\n </div>\n )}\n </section>\n </>\n }\n sidebar={\n <>\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">Status</h2>\n <div className={sectionCls}>\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input type=\"checkbox\" checked={active} onChange={(e) => setActive(e.target.checked)} className=\"h-4 w-4 rounded border-gray-300\" />\n <span className=\"text-sm font-medium text-gray-900\">Active</span>\n </label>\n </div>\n </section>\n <section>\n <h2 className=\"text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2\">SEO</h2>\n <div className={sectionCls}>\n <SeoSection values={seo} onChange={(field, value) => setSeo((s) => ({ ...s, [field]: value }))} />\n </div>\n </section>\n </>\n }\n />\n </div>\n );\n}\n","'use client';\n\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { useSession } from 'next-auth/react';\nimport { Shield, Save, Trash2 } from 'lucide-react';\nimport { isSuperAdminGroupName } from '../../auth/permission-entities';\nimport { Button } from '@/components/ui/button';\nimport { Input } from '@/components/ui/input';\nimport { Label } from '@/components/ui/label';\n\ntype PermRow = { entity: string; canCreate: boolean; canRead: boolean; canUpdate: boolean; canDelete: boolean };\n\ntype Group = { id: number; name: string; permissions: PermRow[] };\n\nfunction RoleListItem({\n group,\n selected,\n onSelect,\n}: {\n group: Group;\n selected: boolean;\n onSelect: () => void;\n}) {\n const superG = isSuperAdminGroupName(group.name);\n return (\n <button\n type=\"button\"\n onClick={onSelect}\n className={`flex w-full items-center gap-3 rounded-lg border px-3 py-2.5 text-left transition-colors ${\n selected\n ? 'border-gray-300 bg-gray-50 dark:border-gray-600 dark:bg-gray-700/50'\n : 'border-transparent hover:bg-gray-50 dark:hover:bg-gray-800/50'\n }`}\n >\n <Shield className=\"h-5 w-5 shrink-0 text-gray-500\" />\n <div className=\"min-w-0 flex-1\">\n <div className=\"font-medium text-gray-900 dark:text-white truncate\">{group.name}</div>\n </div>\n </button>\n );\n}\n\nexport default function RolesPage() {\n const { data: session, status } = useSession();\n const u = session?.user as { isRBACAdmin?: boolean } | undefined;\n const canManage = !!u?.isRBACAdmin;\n\n const [entities, setEntities] = useState<string[]>([]);\n const [groups, setGroups] = useState<Group[]>([]);\n const [selectedId, setSelectedId] = useState<number | null>(null);\n const [matrix, setMatrix] = useState<Record<string, PermRow>>({});\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n const [newName, setNewName] = useState('');\n const [error, setError] = useState<string | null>(null);\n\n const load = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const res = await fetch('/api/admin/roles');\n if (!res.ok) {\n setError(\n res.status === 403\n ? 'You do not have access to manage roles. Ensure your user is in the Administrator group, then sign out and sign in again.'\n : 'Failed to load roles'\n );\n return;\n }\n const data = await res.json();\n setEntities(data.entities ?? []);\n setGroups(data.groups ?? []);\n setSelectedId((prev) => {\n if (prev == null) return null;\n const still = (data.groups as Group[])?.some((g) => g.id === prev);\n return still ? prev : null;\n });\n } catch {\n setError('Failed to load');\n } finally {\n setLoading(false);\n }\n }, []);\n\n useEffect(() => {\n if (status === 'authenticated' && canManage) load();\n }, [status, canManage, load]);\n\n const selected = groups.find((g) => g.id === selectedId);\n\n useEffect(() => {\n if (!selected || !entities.length) {\n setMatrix({});\n return;\n }\n const m: Record<string, PermRow> = {};\n const byEntity = new Map(selected.permissions.map((p) => [p.entity, p]));\n for (const e of entities) {\n const p = byEntity.get(e);\n m[e] = p\n ? {\n entity: e,\n canCreate: p.canCreate,\n canRead: p.canRead,\n canUpdate: p.canUpdate,\n canDelete: p.canDelete,\n }\n : { entity: e, canCreate: false, canRead: false, canUpdate: false, canDelete: false };\n }\n setMatrix(m);\n }, [selected, entities]);\n\n const toggle = (entity: string, key: keyof Pick<PermRow, 'canCreate' | 'canRead' | 'canUpdate' | 'canDelete'>) => {\n setMatrix((prev) => ({\n ...prev,\n [entity]: { ...prev[entity]!, [key]: !prev[entity]![key] },\n }));\n };\n\n const saveMatrix = async () => {\n if (!selectedId) return;\n setSaving(true);\n setError(null);\n try {\n const permissions = Object.values(matrix);\n const res = await fetch(`/api/admin/roles/${selectedId}/permissions`, {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ permissions }),\n });\n if (!res.ok) {\n const j = await res.json().catch(() => ({}));\n setError((j as { error?: string }).error || 'Save failed');\n return;\n }\n await load();\n } catch {\n setError('Save failed');\n } finally {\n setSaving(false);\n }\n };\n\n const createGroup = async () => {\n const name = newName.trim();\n if (!name) return;\n setError(null);\n try {\n const res = await fetch('/api/admin/roles', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ name }),\n });\n if (!res.ok) {\n const j = await res.json().catch(() => ({}));\n setError((j as { error?: string }).error || 'Create failed');\n return;\n }\n const g = await res.json();\n setNewName('');\n await load();\n setSelectedId(g.id);\n } catch {\n setError('Create failed');\n }\n };\n\n const deleteGroup = async () => {\n if (!selectedId || !selected || isSuperAdminGroupName(selected.name)) return;\n if (!confirm(`Delete group \"${selected.name}\"?`)) return;\n try {\n const res = await fetch(`/api/admin/roles/${selectedId}`, { method: 'DELETE' });\n if (!res.ok) {\n const j = await res.json().catch(() => ({}));\n setError((j as { error?: string }).error || 'Delete failed');\n return;\n }\n setSelectedId(null);\n await load();\n } catch {\n setError('Delete failed');\n }\n };\n\n if (status === 'loading' || loading) {\n return (\n <div className=\"flex items-center justify-center py-12 text-gray-600\">\n Loading…\n </div>\n );\n }\n\n if (!canManage) {\n return <p className=\"text-gray-600 p-6\">You do not have permission to manage roles.</p>;\n }\n\n return (\n <div className=\"min-w-0 rounded-lg bg-white shadow-md dark:bg-gray-800\">\n <div className=\"rounded-t-lg border-b border-gray-700 bg-gray-800 px-4 py-2.5 dark:border-gray-700 dark:bg-gray-900\">\n <h1 className=\"text-base font-semibold text-white\">Roles</h1>\n <p className=\"mt-0.5 text-xs text-gray-300\">\n Only the Administrator group can open this page. All roles use the matrix for entity access (Administrator also has users / roles plumbing without matrix rows).\n </p>\n </div>\n\n <div className=\"min-w-0 p-6\">\n {error ? (\n <div className=\"py-8 text-center\">\n <p className=\"text-sm text-red-600 dark:text-red-400\">{error}</p>\n </div>\n ) : groups.length === 0 ? (\n <div className=\"py-12 text-center\">\n <Shield className=\"mx-auto h-10 w-10 text-gray-400\" />\n <p className=\"mt-3 text-sm text-gray-500 dark:text-gray-400\">No roles yet. Add one below.</p>\n </div>\n ) : (\n <div className=\"flex gap-6\">\n <div className=\"w-56 shrink-0 space-y-1\">\n {groups.map((g) => (\n <RoleListItem key={g.id} group={g} selected={selectedId === g.id} onSelect={() => setSelectedId(g.id)} />\n ))}\n <div className=\"space-y-2 border-t border-gray-200 pt-3 dark:border-gray-700\">\n <Label className=\"text-xs text-gray-500\">New role</Label>\n <div className=\"flex gap-2\">\n <Input\n className=\"h-8 text-sm\"\n placeholder=\"Name\"\n value={newName}\n onChange={(e) => setNewName(e.target.value)}\n onKeyDown={(e) => e.key === 'Enter' && createGroup()}\n />\n <Button type=\"button\" size=\"sm\" variant=\"outline\" className=\"shrink-0\" onClick={createGroup}>\n Add\n </Button>\n </div>\n </div>\n </div>\n\n <div className=\"min-w-0 flex-1\">\n {!selectedId ? (\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\n <Shield className=\"h-10 w-10 text-gray-300 dark:text-gray-600\" />\n <p className=\"mt-3 text-sm text-gray-500 dark:text-gray-400\">Select a role to view or edit permissions.</p>\n </div>\n ) : (\n <div className=\"rounded-lg border border-gray-200 bg-gray-50/50 p-5 dark:border-gray-700 dark:bg-gray-800/50\">\n <div className=\"mb-4 flex flex-wrap items-center gap-2\">\n <h2 className=\"text-sm font-medium text-gray-700 dark:text-gray-300\">{selected?.name} — Permissions</h2>\n <Button size=\"sm\" onClick={saveMatrix} disabled={saving} className=\"gap-1\">\n <Save className=\"h-3.5 w-3.5\" />\n {saving ? 'Saving…' : 'Save'}\n </Button>\n {selected && !isSuperAdminGroupName(selected.name) && (\n <Button size=\"sm\" variant=\"outline\" className=\"gap-1 text-red-600\" onClick={deleteGroup}>\n <Trash2 className=\"h-3.5 w-3.5\" />\n Delete role\n </Button>\n )}\n </div>\n {entities.length > 0 && (\n <div className=\"overflow-x-auto rounded-md border border-gray-200 dark:border-gray-600\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b bg-gray-50 dark:bg-gray-900/50\">\n <th className=\"p-3 text-left font-medium\">Resource</th>\n <th className=\"p-2\">C</th>\n <th className=\"p-2\">R</th>\n <th className=\"p-2\">U</th>\n <th className=\"p-2\">D</th>\n </tr>\n </thead>\n <tbody>\n {entities.map((entity) => {\n const row = matrix[entity];\n if (!row) return null;\n return (\n <tr key={entity} className=\"border-b border-gray-100 hover:bg-gray-50/50 dark:border-gray-700 dark:hover:bg-gray-800/30\">\n <td className=\"p-3 font-mono text-xs\">{entity}</td>\n {(['canCreate', 'canRead', 'canUpdate', 'canDelete'] as const).map((k) => (\n <td key={k} className=\"p-2 text-center\">\n <input\n type=\"checkbox\"\n checked={row[k]}\n onChange={() => toggle(entity, k)}\n />\n </td>\n ))}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n )}\n\n {!error && groups.length === 0 && (\n <div className=\"mt-6 flex max-w-md gap-2\">\n <Input placeholder=\"New role name\" value={newName} onChange={(e) => setNewName(e.target.value)} onKeyDown={(e) => e.key === 'Enter' && createGroup()} />\n <Button type=\"button\" onClick={createGroup}>\n Add role\n </Button>\n </div>\n )}\n </div>\n </div>\n );\n}\n","/** API resource keys excluded from the permission matrix (internal / not admin-CRUD). */\nexport const PERMISSION_ENTITY_INTERNAL_EXCLUDE = new Set([\n 'users',\n 'password_reset_tokens',\n 'user_groups',\n 'permissions',\n 'comments',\n 'form_fields',\n 'configs',\n 'knowledge_base_chunks',\n 'carts',\n 'cart_items',\n 'wishlists',\n 'wishlist_items',\n]);\n\n/** Non-CRUD admin surfaces mapped to entity keys for RBAC. */\nexport const PERMISSION_LOGICAL_ENTITIES = [\n 'users',\n 'forms',\n 'form_submissions',\n 'dashboard',\n 'upload',\n 'settings',\n 'analytics',\n 'chat',\n] as const;\n\n/** Canonical name for new installs / migrations */\nexport const ADMIN_GROUP_NAME = 'Administrator';\n\n/** System administrator group (roles UI + users / user_groups / permissions bypass). */\nexport function isSuperAdminGroupName(name: string | null | undefined): boolean {\n return name === ADMIN_GROUP_NAME;\n}\n\nexport type EntityCrudAction = 'create' | 'read' | 'update' | 'delete';\n\nexport type EntityPermissionFlags = { c: boolean; r: boolean; u: boolean; d: boolean };\n\nexport function getPermissionableEntityKeys(entityMap: Record<string, unknown>): string[] {\n const fromMap = Object.keys(entityMap).filter((k) => !PERMISSION_ENTITY_INTERNAL_EXCLUDE.has(k));\n const logical = PERMISSION_LOGICAL_ENTITIES.filter((k) => !fromMap.includes(k));\n return [...fromMap.sort(), ...logical].filter((k, i, a) => a.indexOf(k) === i);\n}\n\nexport function permissionRowsToRecord(\n rows: Array<{ entity: string; canCreate: boolean; canRead: boolean; canUpdate: boolean; canDelete: boolean }> | undefined\n): Record<string, EntityPermissionFlags> {\n const out: Record<string, EntityPermissionFlags> = {};\n if (!rows?.length) return out;\n for (const p of rows) {\n out[p.entity] = {\n c: !!p.canCreate,\n r: !!p.canRead,\n u: !!p.canUpdate,\n d: !!p.canDelete,\n };\n }\n return out;\n}\n\nexport function hasEntityPermission(\n record: Record<string, EntityPermissionFlags> | undefined,\n entity: string,\n action: EntityCrudAction\n): boolean {\n const p = record?.[entity];\n if (!p) return false;\n if (action === 'create') return p.c;\n if (action === 'read') return p.r;\n if (action === 'update') return p.u;\n return p.d;\n}\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: 'hsn', displayName: 'HSN' },\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: '/admin/products',\n },\n collections: {\n title: 'Collections',\n apiEndpoint: '/api/collections',\n columns: [\n { field: 'name', displayName: 'Name' },\n { field: 'slug', displayName: 'Slug' },\n { field: 'hsn', displayName: 'HSN' },\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: '/admin/collections',\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/roles', label: 'Roles' },\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":["import_react","import_navigation","import_react","React","import_jsx_runtime","import_lucide_react","import_jsx_runtime","Image","Link","import_link","import_image","import_react","import_lucide_react","import_react","import_jsx_runtime","Icon","sectionCls","Link","ImageIcon","Image","import_link","import_navigation","import_react","import_lucide_react","import_jsx_runtime","Icon","Link","React","import_class_variance_authority","import_lucide_react","import_jsx_runtime","import_jsx_runtime","id","React","import_sonner","import_jsx_runtime","import_react","import_react","import_lucide_react","React","import_jsx_runtime","React","import_jsx_runtime","React","import_lucide_react","import_jsx_runtime","React","import_jsx_runtime","React","import_class_variance_authority","import_jsx_runtime","Label","import_react","React","import_jsx_runtime","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_sonner","import_jsx_runtime","Label","React","import_jsx_runtime","React","import_lucide_react","import_jsx_runtime","React","import_lucide_react","import_jsx_runtime","import_lucide_react","import_link","import_react","import_lucide_react","import_jsx_runtime","Papa","e","import_jsx_runtime","data","error","Link","import_react","import_class_variance_authority","import_jsx_runtime","import_lucide_react","import_navigation","import_react","import_lucide_react","import_jsx_runtime","import_jsx_runtime","import_react","import_react","import_lucide_react","import_image","import_jsx_runtime","error","Image","import_lucide_react","import_navigation","import_react","import_lucide_react","import_jsx_runtime","import_react","import_jsx_runtime","dynamic","import_react","import_lucide_react","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","ChartJS","import_lucide_react","import_jsx_runtime","import_jsx_runtime","import_navigation","import_react","import_jsx_runtime","import_react","import_jsx_runtime","Label","import_react","import_lucide_react","import_jsx_runtime","Label","Label","import_link","import_react","import_navigation","import_image","import_image","import_jsx_runtime","INFURO_FOOTER_LABEL","INFURO_FOOTER_URL","Image","import_jsx_runtime","Image","import_jsx_runtime","error","Link","import_react","import_link","import_jsx_runtime","Label","Link","import_react","import_navigation","import_link","import_jsx_runtime","Link","Label","import_react","import_navigation","import_jsx_runtime","Label","import_react","import_lucide_react","import_jsx_runtime","import_react","import_navigation","import_react","import_link","import_lucide_react","import_link","import_navigation","import_lucide_react","import_jsx_runtime","Link","import_jsx_runtime","Link","import_react","import_link","import_navigation","import_lucide_react","import_jsx_runtime","import_jsx_runtime","Link","import_react","import_link","import_navigation","import_lucide_react","import_jsx_runtime","formatMoney","Link","import_react","import_link","import_navigation","import_lucide_react","import_jsx_runtime","formatMoney","formatAddress","Link","import_react","import_navigation","import_sonner","import_lucide_react","import_jsx_runtime","Label","import_react","import_lucide_react","import_sonner","import_jsx_runtime","ImageIcon","import_react","import_lucide_react","import_navigation","import_react","import_jsx_runtime","Icon","React","labelCls","inputCls","Label","import_react","import_lucide_react","import_sonner","import_jsx_runtime","Label","Icon","import_react","import_navigation","import_lucide_react","import_jsx_runtime","inputCls","res","import_jsx_runtime","import_react","import_navigation","import_lucide_react","import_react","import_jsx_runtime","import_jsx_runtime","isCreate","name","import_react","import_navigation","import_lucide_react","import_jsx_runtime","isCreate","sectionCls","labelCls","inputCls","import_react","import_lucide_react","import_jsx_runtime","Label","import_jsx_runtime","isCreate","import_react","import_lucide_react","import_jsx_runtime","import_react","import_sonner","import_jsx_runtime"]}