@zenith-open/zenithcms-admin 1.0.0-beta.2 → 1.0.0-beta.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/{ApiExplorerPage-UJpoKRI0.js → ApiExplorerPage-CLsHG-Ke.js} +1 -1
- package/dist/assets/{ApiExplorerPage-UJpoKRI0.js.map → ApiExplorerPage-CLsHG-Ke.js.map} +1 -1
- package/dist/assets/{AuditLogPage-8xYlRl1I.js → AuditLogPage-Bp2Nvabr.js} +1 -1
- package/dist/assets/{AuditLogPage-8xYlRl1I.js.map → AuditLogPage-Bp2Nvabr.js.map} +1 -1
- package/dist/assets/{BlockBuilderPage-DcOo3Vnt.js → BlockBuilderPage-CeVMk5Ns.js} +1 -1
- package/dist/assets/{BlockBuilderPage-DcOo3Vnt.js.map → BlockBuilderPage-CeVMk5Ns.js.map} +1 -1
- package/dist/assets/{CollectionHooksPage-Dn_ujtlp.js → CollectionHooksPage-EFkVZNrc.js} +1 -1
- package/dist/assets/{CollectionHooksPage-Dn_ujtlp.js.map → CollectionHooksPage-EFkVZNrc.js.map} +1 -1
- package/dist/assets/{CollectionsPage-BSPHf7H2.js → CollectionsPage-D-N_ykJz.js} +1 -1
- package/dist/assets/{CollectionsPage-BSPHf7H2.js.map → CollectionsPage-D-N_ykJz.js.map} +1 -1
- package/dist/assets/{ComponentBuilderPage-CT6S12LA.js → ComponentBuilderPage-C3mhOLPs.js} +1 -1
- package/dist/assets/{ComponentBuilderPage-CT6S12LA.js.map → ComponentBuilderPage-C3mhOLPs.js.map} +1 -1
- package/dist/assets/{DashboardBuilder-Cbi9Ddiu.js → DashboardBuilder-Beiurp0v.js} +1 -1
- package/dist/assets/{DashboardBuilder-Cbi9Ddiu.js.map → DashboardBuilder-Beiurp0v.js.map} +1 -1
- package/dist/assets/{PluginsPage-5YRpbP-N.js → PluginsPage-BjPoOvBl.js} +1 -1
- package/dist/assets/{PluginsPage-5YRpbP-N.js.map → PluginsPage-BjPoOvBl.js.map} +1 -1
- package/dist/assets/{RedirectsPage-D_4jAdaI.js → RedirectsPage-GIZCbEll.js} +1 -1
- package/dist/assets/{RedirectsPage-D_4jAdaI.js.map → RedirectsPage-GIZCbEll.js.map} +1 -1
- package/dist/assets/{SchemaBuilderPage-EFA5XIAa.js → SchemaBuilderPage-3CDbJi28.js} +1 -1
- package/dist/assets/{SchemaBuilderPage-EFA5XIAa.js.map → SchemaBuilderPage-3CDbJi28.js.map} +1 -1
- package/dist/assets/{SettingsPage-BRpcMw48.js → SettingsPage-DYYNnxkV.js} +1 -1
- package/dist/assets/{SettingsPage-BRpcMw48.js.map → SettingsPage-DYYNnxkV.js.map} +1 -1
- package/dist/assets/{SpatialEditor-CPgS7Zrd.js → SpatialEditor-DlyP5PPa.js} +1 -1
- package/dist/assets/{SpatialEditor-CPgS7Zrd.js.map → SpatialEditor-DlyP5PPa.js.map} +1 -1
- package/dist/assets/{TemplatesPage-B-nNYv3o.js → TemplatesPage-DfeCDCe_.js} +1 -1
- package/dist/assets/{TemplatesPage-B-nNYv3o.js.map → TemplatesPage-DfeCDCe_.js.map} +1 -1
- package/dist/assets/{TrashPage-Ccusal1w.js → TrashPage-DGi-7RPl.js} +1 -1
- package/dist/assets/{TrashPage-Ccusal1w.js.map → TrashPage-DGi-7RPl.js.map} +1 -1
- package/dist/assets/{index-ChcKY5Xe.js → index-C4J6QNLn.js} +3 -3
- package/dist/assets/index-C4J6QNLn.js.map +1 -0
- package/dist/assets/index-Umj4hIVD.css +1 -0
- package/dist/index.html +45 -3
- package/dist/sw.js +1 -1
- package/dist/sw.js.map +1 -1
- package/package.json +2 -2
- package/dist/assets/index-ChcKY5Xe.js.map +0 -1
- package/dist/assets/index-CxhwdV2K.css +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SettingsPage-BRpcMw48.js","names":[],"sources":["../../src/hooks/usePermissions.ts","../../src/components/ui/ActionPanel.tsx","../../src/pages/settings/SettingsGeneral.tsx","../../src/pages/settings/SettingsSecurity.tsx","../../src/pages/settings/SettingsNotifications.tsx","../../src/pages/settings/InviteUserModal.tsx","../../src/pages/settings/EditUserModal.tsx","../../src/pages/settings/SettingsUsers.tsx","../../src/pages/settings/GenerateKeyModal.tsx","../../src/pages/settings/ApiIntegrationGuide.tsx","../../src/pages/settings/SettingsApiKeys.tsx","../../src/pages/settings/SettingsDatabase.tsx","../../src/pages/settings/CreateRoleModal.tsx","../../src/pages/settings/DeleteRoleConfirmDialog.tsx","../../src/pages/settings/SettingsRoles.tsx","../../src/pages/settings/SettingsAppearance.tsx","../../src/pages/settings/SettingsWebhooks.tsx","../../src/pages/settings/SettingsPlugins.tsx","../../src/pages/settings/SettingsApiKeyModal.tsx","../../src/pages/settings/SettingsWebhookLogs.tsx","../../src/pages/settings/SettingsLegal.tsx","../../src/pages/settings/SettingsSystem.tsx","../../src/pages/SettingsPage.tsx"],"sourcesContent":["/**\n * usePermissions\n *\n * A role-based UI access hook. Components import this to conditionally\n * render actions based on the currently authenticated user's role.\n *\n * Roles in order of least → most privilege:\n * viewer → editor → admin\n *\n * Usage:\n * const { can } = usePermissions()\n * if (can('publish')) { ... }\n * <PermissionGate action=\"delete\"><button>Delete</button></PermissionGate>\n */\n\nimport React from 'react'\nimport { useAuthStore } from '../store/authStore'\n\ntype Role = 'admin' | 'editor' | 'viewer'\n\ntype Action =\n | 'view'\n | 'create'\n | 'edit'\n | 'delete'\n | 'publish'\n | 'unpublish'\n | 'manage_users'\n | 'manage_settings'\n | 'manage_plugins'\n | 'manage_schema'\n | 'manage_api_keys'\n | 'download_backup'\n | 'view_audit_log'\n | 'manage_redirects'\n\n/** Map each action to the minimum role required */\nconst PERMISSION_MAP: Record<Action, Role> = {\n view: 'viewer',\n create: 'editor',\n edit: 'editor',\n publish: 'editor',\n unpublish: 'editor',\n delete: 'editor',\n view_audit_log: 'editor',\n manage_redirects: 'editor',\n manage_schema: 'admin',\n manage_settings: 'admin',\n manage_plugins: 'admin',\n manage_users: 'admin',\n manage_api_keys: 'admin',\n download_backup: 'admin',\n}\n\nconst ROLE_HIERARCHY: Record<Role, number> = {\n viewer: 0,\n editor: 1,\n admin: 2,\n}\n\nfunction hasPermission(userRole: Role | undefined, action: Action): boolean {\n if (!userRole) return false\n const requiredLevel = ROLE_HIERARCHY[PERMISSION_MAP[action]] ?? 999\n const userLevel = ROLE_HIERARCHY[userRole] ?? -1\n return userLevel >= requiredLevel\n}\n\n/** Hook that returns a `can(action)` helper based on the logged-in user's role */\nexport function usePermissions() {\n const user = useAuthStore((s) => s.user)\n const role = (user?.role ?? 'viewer') as Role\n\n return {\n role,\n /** Returns true if the current user can perform the given action */\n can: (action: Action) => hasPermission(role, action),\n /** Returns true if the current user is an admin */\n isAdmin: role === 'admin',\n /** Returns true if the current user is an editor or above */\n isEditor: ROLE_HIERARCHY[role] >= ROLE_HIERARCHY['editor'],\n }\n}\n\n/** HOC: renders children only if the current user can perform the given action */\nexport function PermissionGate({\n action,\n children,\n fallback = null,\n}: {\n action: Action\n children: React.ReactNode\n fallback?: React.ReactNode\n}): React.ReactElement | null {\n const { can } = usePermissions()\n return can(action) ? (children as React.ReactElement) : (fallback as React.ReactElement | null)\n}\n","import React from 'react';\nimport { cn } from '../../lib/utils';\nimport { useTheme } from '../../context/ThemeContext';\n\nexport interface ActionPanelProps extends React.HTMLAttributes<HTMLDivElement> {\n sidebar?: React.ReactNode;\n sidebarPosition?: 'left' | 'right';\n sidebarWidth?: string;\n}\n\nexport function ActionPanel({ \n children, \n sidebar, \n sidebarPosition = 'right',\n sidebarWidth = 'w-[320px]',\n className,\n ...props \n}: ActionPanelProps) {\n const { theme } = useTheme();\n\n return (\n <div \n className={cn(\n \"flex flex-col lg:flex-row h-full min-h-[calc(100vh-65px)]\",\n className\n )}\n {...props}\n >\n {sidebarPosition === 'left' && sidebar && (\n <div className={cn(\n \"shrink-0 border-b lg:border-b-0 lg:border-r flex flex-col\",\n sidebarWidth,\n theme === 'dark' ? 'border-z-border bg-[#050505]' : 'border-z-border bg-[var(--z-bg-input)]/30'\n )}>\n {sidebar}\n </div>\n )}\n \n <div className=\"flex-1 flex flex-col min-w-0\">\n {children}\n </div>\n\n {sidebarPosition === 'right' && sidebar && (\n <div className={cn(\n \"shrink-0 border-t lg:border-t-0 lg:border-l flex flex-col\",\n sidebarWidth,\n theme === 'dark' ? 'border-z-border bg-[#050505]' : 'border-z-border bg-[var(--z-bg-input)]/30'\n )}>\n {sidebar}\n </div>\n )}\n </div>\n );\n}\n","import React, { useState, useEffect, useCallback } from 'react'\nimport {\n Globe, Palette, Upload, Image, Check, Copy, Link2, MapPin,\n Clock, Mail, Loader2, Eye, ExternalLink, Calendar, Tag\n} from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport api from '../../lib/api'\nimport toast from 'react-hot-toast'\n\n// IANA Timezone list — abbreviated\nconst TIMEZONES = [\n 'UTC', 'America/New_York', 'America/Chicago', 'America/Denver', 'America/Los_Angeles',\n 'America/Anchorage', 'America/Honolulu', 'America/Sao_Paulo', 'America/Toronto', 'America/Vancouver',\n 'Europe/London', 'Europe/Paris', 'Europe/Berlin', 'Europe/Amsterdam', 'Europe/Rome',\n 'Europe/Madrid', 'Europe/Stockholm', 'Europe/Athens', 'Europe/Warsaw', 'Europe/Prague',\n 'Asia/Dubai', 'Asia/Kolkata', 'Asia/Singapore', 'Asia/Tokyo', 'Asia/Shanghai',\n 'Asia/Seoul', 'Asia/Bangkok', 'Asia/Jakarta', 'Asia/Karachi', 'Asia/Tehran',\n 'Africa/Cairo', 'Africa/Lagos', 'Africa/Johannesburg', 'Africa/Nairobi',\n 'Australia/Sydney', 'Australia/Melbourne', 'Pacific/Auckland',\n]\n\nconst LOCALES = [\n { value: 'en', label: 'English (en)' },\n { value: 'en-US', label: 'English US (en-US)' },\n { value: 'en-GB', label: 'English UK (en-GB)' },\n { value: 'fr', label: 'French (fr)' },\n { value: 'de', label: 'German (de)' },\n { value: 'es', label: 'Spanish (es)' },\n { value: 'it', label: 'Italian (it)' },\n { value: 'pt', label: 'Portuguese (pt)' },\n { value: 'ar', label: 'Arabic (ar)' },\n { value: 'zh', label: 'Chinese (zh)' },\n { value: 'ja', label: 'Japanese (ja)' },\n { value: 'ko', label: 'Korean (ko)' },\n { value: 'hi', label: 'Hindi (hi)' },\n { value: 'ru', label: 'Russian (ru)' },\n { value: 'nl', label: 'Dutch (nl)' },\n { value: 'pl', label: 'Polish (pl)' },\n { value: 'tr', label: 'Turkish (tr)' },\n]\n\ninterface SettingsGeneralProps {\n settings: {\n siteName: string\n siteDescription: string\n logoUrl: string\n faviconUrl: string\n publicUrl: string\n defaultLocale: string\n supportedLocales: string[]\n maintenanceMode: boolean\n timezone?: string\n supportEmail?: string\n dateFormat?: string\n ogImageUrl?: string\n [key: string]: any\n }\n setSettings: (s: any) => void\n theme: 'light' | 'dark'\n}\n\nconst SettingsGeneral: React.FC<SettingsGeneralProps> = ({ settings, setSettings, theme }) => {\n const dark = theme === 'dark'\n const [copied, setCopied] = useState(false)\n const [uploadingLogo, setUploadingLogo] = useState(false)\n const [uploadingFavicon, setUploadingFavicon] = useState(false)\n const [uploadingOg, setUploadingOg] = useState(false)\n\n const activeSiteId = localStorage.getItem('activeSiteId') || ''\n const activeSiteName = localStorage.getItem('activeSiteName') || 'Unknown Site'\n\n const handleCopy = () => {\n if (!activeSiteId) return\n navigator.clipboard.writeText(activeSiteId).then(() => {\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n })\n }\n\n const handleImageUpload = async (\n file: File,\n field: 'logoUrl' | 'faviconUrl' | 'ogImageUrl',\n setUploading: (v: boolean) => void\n ) => {\n setUploading(true)\n try {\n const form = new FormData()\n form.append('file', file)\n const res = await api.post('/upload', form, { headers: { 'Content-Type': 'multipart/form-data' } })\n const url = res.data?.data?.url || res.data?.url\n if (url) {\n setSettings({ ...settings, [field]: url })\n toast.success('Image uploaded')\n }\n } catch {\n toast.error('Upload failed')\n } finally {\n setUploading(false)\n }\n }\n\n const card = cn(\n 'p-5 border rounded-none transition-all space-y-3',\n dark ? 'bg-z-panel backdrop-blur-md border-z-border shadow-sm' : 'bg-[var(--z-bg-input)]/50 border-z-border shadow-sm'\n )\n\n const inp = cn(\n 'w-full border rounded-none py-2.5 px-4 text-sm transition-all outline-none focus:ring-1 focus:ring-z-active-border focus:border-z-accent',\n dark ? 'bg-app/80 border-z-border text-z-primary placeholder:text-z-primary' : 'bg-z-panel border-z-border'\n )\n\n const ImageUploadField = ({\n field, label, value, uploading, setUploading\n }: { field: 'logoUrl' | 'faviconUrl' | 'ogImageUrl'; label: string; value: string; uploading: boolean; setUploading: (v: boolean) => void }) => (\n <div className={card}>\n <label className=\"text-sm font-semibold text-z-secondary\">{label}</label>\n <div className=\"flex gap-3 items-start\">\n {/* Preview */}\n <div className={cn('w-16 h-16 flex-shrink-0 border flex items-center justify-center overflow-hidden', dark ? 'bg-app/80 border-z-border' : 'bg-[var(--z-bg-hover)] border-z-border')}>\n {value ? (\n <img src={value} alt={label} className=\"w-full h-full object-contain\" onError={e => { (e.target as any).style.display = 'none' }} />\n ) : (\n <Image size={20} className=\"text-z-secondary\" />\n )}\n </div>\n <div className=\"flex-1 space-y-2\">\n <input\n type=\"url\"\n value={value || ''}\n onChange={e => setSettings({ ...settings, [field]: e.target.value })}\n placeholder=\"https://...\"\n className={inp}\n />\n <label className={cn('flex items-center gap-2 cursor-pointer text-sm font-semibold border px-3 py-2 w-fit transition-all', dark ? 'border-z-border text-z-muted hover:text-z-primary hover:border-z-border' : 'border-z-border text-z-secondary hover:text-z-primary')}>\n {uploading ? <Loader2 size={12} className=\"animate-spin\" /> : <Upload size={12} />}\n Upload File\n <input\n type=\"file\"\n accept=\"image/*\"\n className=\"hidden\"\n onChange={e => {\n const file = e.target.files?.[0]\n if (file) handleImageUpload(file, field, setUploading)\n }}\n />\n </label>\n </div>\n </div>\n </div>\n )\n\n return (\n <div className=\"space-y-4\">\n {/* Site ID Banner */}\n <div className={cn('p-5 border space-y-3', dark ? 'bg-z-panel backdrop-blur-md border-z-border shadow-sm' : 'bg-z-input border-z-border')}>\n <div className=\"flex items-center gap-2\">\n <Link2 size={12} className=\"text-z-secondary\" />\n <span className=\"text-sm font-semibold text-z-secondary\">Site Identifier</span>\n <span className=\"ml-auto text-sm text-z-secondary\">{activeSiteName}</span>\n </div>\n <div className=\"flex items-center gap-3\">\n <code className={cn('flex-1 font-mono text-sm px-3 py-2 border truncate', 'bg-z-panel border-z-border text-z-primary')}>\n {activeSiteId || <span className=\"opacity-40\">No site selected</span>}\n </code>\n <button\n onClick={handleCopy}\n disabled={!activeSiteId}\n className={cn('flex items-center gap-2 px-4 py-2 text-xs font-bold border transition-all', activeSiteId\n ? dark ? 'bg-z-accent hover:brightness-110 text-z-logo-text border-transparent shadow-sm' : 'bg-z-base text-z-primary border-transparent hover:bg-z-base'\n : 'bg-z-hover text-z-secondary cursor-not-allowed border-z-border')}\n >\n {copied ? <Check size={13} /> : <Copy size={13} />}\n {copied ? 'Copied!' : 'Copy'}\n </button>\n </div>\n <p className={cn('text-sm leading-relaxed', 'text-z-secondary')}>\n Use this as <code className=\"px-1 py-0.5 bg-z-panel/10\">VITE_CMS_SITE_ID</code> in template <code className=\"px-1 py-0.5 bg-z-panel/10\">.env</code> files to connect storefronts to this site.\n </p>\n </div>\n\n {/* Core Identity */}\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div className={card}>\n <label className=\"text-sm font-semibold text-z-secondary\">Application Name</label>\n <input type=\"text\" value={settings.siteName || ''} onChange={e => setSettings({ ...settings, siteName: e.target.value })} className={inp} placeholder=\"My CMS\" />\n </div>\n <div className={card}>\n <label className=\"text-sm font-semibold text-z-secondary\">Support Email</label>\n <input type=\"email\" value={settings.supportEmail || ''} onChange={e => setSettings({ ...settings, supportEmail: e.target.value })} className={inp} placeholder=\"support@company.com\" />\n </div>\n </div>\n\n <div className={card}>\n <label className=\"text-sm font-semibold text-z-secondary\">Site Description</label>\n <textarea value={settings.siteDescription || ''} onChange={e => setSettings({ ...settings, siteDescription: e.target.value })} rows={3} className={cn(inp, 'resize-none')} placeholder=\"A short description of your platform...\" />\n </div>\n\n <div className={card}>\n <label className=\"text-sm font-semibold text-z-secondary\">Public API Endpoint</label>\n <input type=\"url\" value={settings.publicUrl || ''} onChange={e => setSettings({ ...settings, publicUrl: e.target.value })} className={inp} placeholder=\"https://api.yoursite.com\" />\n <p className=\"text-sm text-z-secondary\">The publicly-accessible URL where your CMS API is hosted.</p>\n </div>\n\n {/* Media Branding */}\n <div className=\"space-y-1.5\">\n <p className=\"text-sm font-semibold text-z-secondary px-1\">Branding Assets</p>\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <ImageUploadField field=\"logoUrl\" label=\"Site Logo\" value={settings.logoUrl} uploading={uploadingLogo} setUploading={setUploadingLogo} />\n <ImageUploadField field=\"faviconUrl\" label=\"Favicon\" value={settings.faviconUrl} uploading={uploadingFavicon} setUploading={setUploadingFavicon} />\n <ImageUploadField field=\"ogImageUrl\" label=\"OG Share Image\" value={settings.ogImageUrl || ''} uploading={uploadingOg} setUploading={setUploadingOg} />\n </div>\n </div>\n\n {/* Localization */}\n <div className=\"space-y-1.5\">\n <p className=\"text-sm font-semibold text-z-secondary px-1\">Localization</p>\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <div className={card}>\n <label className=\"text-sm font-semibold text-z-secondary\">Default Locale</label>\n <select value={settings.defaultLocale || 'en'} onChange={e => setSettings({ ...settings, defaultLocale: e.target.value })} className={inp}>\n {LOCALES.map(l => <option key={l.value} value={l.value}>{l.label}</option>)}\n </select>\n </div>\n <div className={card}>\n <label className=\"text-sm font-semibold text-z-secondary\">Timezone</label>\n <select value={settings.timezone || 'UTC'} onChange={e => setSettings({ ...settings, timezone: e.target.value })} className={inp}>\n {TIMEZONES.map(tz => <option key={tz} value={tz}>{tz}</option>)}\n </select>\n </div>\n <div className={card}>\n <label className=\"text-sm font-semibold text-z-secondary\">Date Format</label>\n <select value={settings.dateFormat || 'MM/DD/YYYY'} onChange={e => setSettings({ ...settings, dateFormat: e.target.value })} className={inp}>\n {['MM/DD/YYYY', 'DD/MM/YYYY', 'YYYY-MM-DD', 'MMMM D, YYYY', 'D MMMM YYYY'].map(f => (\n <option key={f} value={f}>{f}</option>\n ))}\n </select>\n </div>\n </div>\n </div>\n\n {/* Maintenance Mode */}\n <div className={cn('p-5 border flex items-center justify-between transition-all group rounded-lg', \n settings.maintenanceMode \n ? (dark ? 'bg-red-950/20 border-red-900/50 shadow-[0_0_15px_rgba(220,38,38,0.15)]' : 'bg-red-50 border-red-200 shadow-sm')\n : (dark ? 'bg-z-panel backdrop-blur-md border-z-border shadow-sm' : 'bg-[var(--z-bg-input)]/50 border-z-border shadow-sm')\n )}>\n <div>\n <div className=\"flex items-center gap-2\">\n <span className={cn('text-sm font-bold', settings.maintenanceMode ? 'text-red-500' : (dark ? 'text-z-primary' : 'text-z-primary'))}>\n Maintenance Protocol\n </span>\n {settings.maintenanceMode && (\n <span className=\"px-2 py-0.5 rounded text-[10px] font-bold uppercase tracking-wider bg-red-500 text-white animate-pulse\">Active</span>\n )}\n </div>\n <p className={cn(\"text-sm mt-1\", settings.maintenanceMode ? 'text-red-500/80' : 'text-z-secondary')}>Restrict public access to the system while active. Admins can still log in.</p>\n </div>\n <label className=\"relative inline-flex items-center cursor-pointer flex-shrink-0\">\n <input type=\"checkbox\" checked={settings.maintenanceMode} onChange={e => setSettings({ ...settings, maintenanceMode: e.target.checked })} className=\"sr-only peer\" />\n <div className={cn(\n \"w-11 h-6 rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all shadow-inner\", \n dark ? 'bg-gray-700 peer-checked:bg-red-600' : 'bg-gray-300 peer-checked:bg-red-500'\n )}></div>\n </label>\n </div>\n\n {/* Danger Zone */}\n <div className=\"pt-6 mt-6 border-t border-red-900/30\">\n <h4 className=\"text-sm font-bold text-red-500 uppercase tracking-wider mb-4\">Danger Zone</h4>\n <div className={cn('p-5 border flex items-center justify-between transition-all border-red-500/20', dark ? 'bg-red-950/10' : 'bg-red-50')}>\n <div>\n <span className=\"text-sm font-semibold text-red-500\">Delete Site Workspace</span>\n <p className=\"text-sm text-red-400/80 mt-1\">Permanently delete this site and all its content, media, and configurations. This action cannot be undone.</p>\n </div>\n <button\n onClick={() => {\n if (window.confirm('Are you absolutely sure you want to permanently delete this site? This action cannot be undone.')) {\n api.delete(`/sites/${activeSiteId}`).then(() => {\n toast.success('Site deleted')\n window.location.href = '/'\n }).catch(err => {\n toast.error(err.response?.data?.error?.message || 'Failed to delete site')\n })\n }\n }}\n className=\"px-4 py-2 border border-red-500 text-red-500 hover:bg-red-500 hover:text-z-logo-text transition-colors text-sm font-medium\"\n >\n Delete Site\n </button>\n </div>\n </div>\n </div>\n )\n}\n\nexport default SettingsGeneral\n","import React, { useState, useEffect } from 'react'\nimport {\n Shield, ShieldCheck, ShieldAlert, Loader2, AlertTriangle, Globe,\n Lock, Clock, Users, Wifi, Eye, EyeOff, XCircle, Trash2, RefreshCw,\n Info, CheckCircle2, Server, Activity\n} from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport api from '../../lib/api'\nimport toast from 'react-hot-toast'\nimport { useAuthStore } from '../../store/authStore'\nimport { useShallow } from 'zustand/react/shallow'\n\ninterface SettingsSecurityProps {\n settings: {\n jwtExpiresIn: string\n passwordMinLength: number\n allowRegistration: boolean\n rateLimitWindow?: number\n rateLimitMax?: number\n [key: string]: any\n }\n setSettings: (s: any) => void\n theme: 'light' | 'dark'\n}\n\ninterface Session {\n id: string\n userId: string\n ipAddress: string\n userAgent: string\n createdAt: string\n lastActivityAt?: string\n current?: boolean\n}\n\nconst SettingsSecurity: React.FC<SettingsSecurityProps> = ({ settings, setSettings, theme }) => {\n const dark = theme === 'dark'\n const { user } = useAuthStore(useShallow(state => ({ user: state.user })))\n const [setupState, setSetupState] = useState<'idle' | 'loading' | 'qrcode'>('idle')\n const [qrCode, setQrCode] = useState<string | null>(null)\n const [token, setToken] = useState('')\n const [verifying, setVerifying] = useState(false)\n const [enabled, setEnabled] = useState(user?.twoFactorEnabled || false)\n const [showCorsInput, setShowCorsInput] = useState(false)\n const [sessions, setSessions] = useState<Session[]>([])\n const [sessionsLoading, setSessionsLoading] = useState(false)\n const [revokingSessionId, setRevokingSessionId] = useState<string | null>(null)\n\n const fetchSessions = async () => {\n setSessionsLoading(true)\n try {\n const res = await api.get('/auth/sessions')\n const data = res.data?.data || res.data\n setSessions(Array.isArray(data) ? data : [])\n } catch {\n setSessions([])\n } finally {\n setSessionsLoading(false)\n }\n }\n\n useEffect(() => { fetchSessions() }, [])\n\n const handleSetup = async () => {\n setSetupState('loading')\n try {\n const res = await api.post('/auth/2fa/setup')\n setQrCode(res.data.data.qrCodeImage)\n setSetupState('qrcode')\n } catch {\n toast.error('Failed to initiate 2FA setup')\n setSetupState('idle')\n }\n }\n\n const handleVerify = async () => {\n if (!token) return toast.error('Enter the 6-digit code')\n setVerifying(true)\n try {\n await api.post('/auth/2fa/verify-setup', { token })\n toast.success('2FA successfully enabled')\n setEnabled(true)\n setSetupState('idle')\n } catch {\n toast.error('Invalid token')\n } finally {\n setVerifying(false)\n }\n }\n\n const handleRevokeSession = async (id: string) => {\n setRevokingSessionId(id)\n try {\n await api.delete(`/auth/sessions/${id}`)\n setSessions(prev => prev.filter(s => s.id !== id))\n toast.success('Session revoked')\n } catch {\n toast.error('Failed to revoke session')\n } finally {\n setRevokingSessionId(null)\n }\n }\n\n const card = cn(\n 'p-5 border rounded-none transition-all space-y-3',\n dark ? 'bg-z-panel backdrop-blur-md border-z-border shadow-sm' : 'bg-[var(--z-bg-input)]/50 border-z-border shadow-sm'\n )\n\n const inp = cn(\n 'w-full border rounded-none py-2.5 px-4 text-sm font-mono outline-none transition-all focus:ring-1 focus:ring-z-active-border focus:border-z-accent',\n dark ? 'bg-app/80 border-z-border text-z-primary placeholder:text-z-primary' : 'bg-z-panel border-z-border'\n )\n\n const Toggle = ({ checked, onChange }: { checked: boolean; onChange: (v: boolean) => void }) => (\n <label className=\"relative inline-flex items-center cursor-pointer flex-shrink-0\">\n <input type=\"checkbox\" checked={checked} onChange={e => onChange(e.target.checked)} className=\"sr-only peer\" />\n <div className={cn(\"w-11 h-6 rounded-none peer peer-checked:after:translate-x-full after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-[var(--z-bg-hover)] after:rounded-none after:h-5 after:w-5 after:transition-all border shadow-inner\", 'bg-[var(--z-border-strong)] peer-checked:bg-z-accent border-transparent')}></div>\n </label>\n )\n\n return (\n <div className=\"space-y-5\">\n {/* Authentication Controls */}\n <div className=\"space-y-1.5\">\n <p className=\"text-sm font-semibold text-z-secondary px-1\">Authentication</p>\n <div className={cn('border rounded-none divide-y', dark ? 'border-z-border divide-z-border' : 'border-z-border divide-z-border')}>\n {/* Open Registration */}\n <div className={cn('flex items-center justify-between p-5', dark ? 'bg-z-panel backdrop-blur-md' : 'bg-z-panel')}>\n <div>\n <p className={cn('text-sm font-semibold ', dark ? 'text-z-primary' : 'text-z-primary')}>Open Registration</p>\n <p className=\"text-sm text-z-secondary mt-1\">Allow anyone to sign up. When off, users must be explicitly invited.</p>\n </div>\n <Toggle checked={settings.allowRegistration} onChange={v => setSettings({ ...settings, allowRegistration: v })} />\n </div>\n {/* Token Lifetime */}\n <div className=\"p-5 space-y-2\">\n <div className=\"flex items-center gap-2\">\n <Clock size={13} className=\"text-z-secondary\" />\n <label className={cn('text-sm font-semibold ', dark ? 'text-z-primary' : 'text-z-primary')}>Session Token Lifetime</label>\n </div>\n <div className=\"flex gap-2\">\n {['1h', '12h', '24h', '7d', '30d'].map(opt => (\n <button\n key={opt}\n onClick={() => setSettings({ ...settings, jwtExpiresIn: opt })}\n className={cn('px-3 py-2 text-sm font-semibold border transition-all', settings.jwtExpiresIn === opt\n ? dark ? 'bg-z-accent/20 border-z-active-border text-z-active-text' : 'bg-z-active-bg border-z-active-border text-z-accent'\n : dark ? 'bg-z-hover border-z-border text-z-secondary hover:text-z-secondary' : 'bg-z-input border-z-border text-z-secondary'\n )}\n >\n {opt}\n </button>\n ))}\n <input\n type=\"text\"\n value={settings.jwtExpiresIn}\n onChange={e => setSettings({ ...settings, jwtExpiresIn: e.target.value })}\n placeholder=\"Custom (e.g. 2d)\"\n className={cn(inp, 'max-w-32 py-2')}\n />\n </div>\n <p className=\"text-sm text-z-secondary\">Format: 1h, 7d, 30m etc. Tokens will expire after this duration.</p>\n </div>\n {/* Password Policy */}\n <div className=\"p-5 space-y-2\">\n <div className=\"flex items-center gap-2\">\n <Lock size={13} className=\"text-z-secondary\" />\n <label className={cn('text-sm font-semibold ', dark ? 'text-z-primary' : 'text-z-primary')}>Minimum Password Length</label>\n </div>\n <div className=\"flex items-center gap-3\">\n <input\n type=\"range\"\n min={6} max={32}\n value={settings.passwordMinLength || 8}\n onChange={e => setSettings({ ...settings, passwordMinLength: Number(e.target.value) })}\n className=\"flex-1 accent-z-accent\"\n />\n <span className={cn('text-lg font-semibold min-w-[3ch] text-right', dark ? 'text-z-active-text' : 'text-z-accent')}>\n {settings.passwordMinLength || 8}\n </span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Rate Limiting */}\n <div className=\"space-y-1.5\">\n <p className=\"text-sm font-semibold text-z-secondary px-1\">Rate Limiting</p>\n <div className={cn('border rounded-none', 'z-panel')}>\n <div className=\"grid grid-cols-2 gap-4 p-5\">\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-semibold text-z-secondary\">Window (minutes)</label>\n <input\n type=\"number\"\n value={settings.rateLimitWindow || 15}\n onChange={e => setSettings({ ...settings, rateLimitWindow: parseInt(e.target.value) || 15 })}\n className={inp}\n placeholder=\"15\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-semibold text-z-secondary\">Max Requests / Window</label>\n <input\n type=\"number\"\n value={settings.rateLimitMax || 100}\n onChange={e => setSettings({ ...settings, rateLimitMax: parseInt(e.target.value) || 100 })}\n className={inp}\n placeholder=\"100\"\n />\n </div>\n </div>\n <div className={cn('px-5 pb-4 text-sm text-z-secondary flex items-center gap-2 border-t', 'border-z-border')}>\n <Info size={11} className=\"text-z-active-text mt-0.5 shrink-0\" />\n <p className=\"mt-3\">Requests exceeding {settings.rateLimitMax || 100} per {settings.rateLimitWindow || 15} minutes will receive a 429 Too Many Requests error. Applies per IP address.</p>\n </div>\n </div>\n </div>\n\n {/* CORS Origins */}\n <div className=\"space-y-1.5\">\n <p className=\"text-sm font-semibold text-z-secondary px-1\">CORS & Origins</p>\n <div className={cn(card)}>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <Globe size={13} className=\"text-z-secondary\" />\n <label className={cn('text-sm font-semibold ', dark ? 'text-z-primary' : 'text-z-primary')}>Allowed Origins</label>\n </div>\n <button onClick={() => setShowCorsInput(!showCorsInput)} className=\"text-sm text-z-active-text hover:text-z-active-text font-semibold\">\n {showCorsInput ? 'Collapse' : 'Configure'}\n </button>\n </div>\n {showCorsInput && (\n <div className=\"space-y-2 pt-2\">\n <textarea\n value={(settings.corsOrigins || []).join('\\n')}\n onChange={e => setSettings({ ...settings, corsOrigins: e.target.value.split('\\n').map((s: string) => s.trim()).filter(Boolean) })}\n rows={4}\n placeholder={'https://yoursite.com\\nhttps://app.yoursite.com\\nhttp://localhost:3000'}\n className={cn(inp, 'resize-none font-mono')}\n />\n <p className=\"text-sm text-z-secondary\">One origin per line. Use * to allow all (not recommended in production).</p>\n </div>\n )}\n </div>\n </div>\n\n {/* 2FA */}\n <div className=\"space-y-1.5\">\n <p className=\"text-sm font-semibold text-z-secondary px-1\">Two-Factor Authentication</p>\n <div className={cn('border rounded-none p-6 space-y-6', dark ? 'bg-z-panel backdrop-blur-md border-z-border shadow-sm' : 'bg-z-panel border-z-border')}>\n <div className=\"flex items-center gap-4\">\n <div className={cn('p-3', dark ? 'bg-z-accent/20 text-z-active-text' : 'bg-z-active-bg text-z-accent')}>\n {enabled ? <ShieldCheck size={24} /> : <ShieldAlert size={24} />}\n </div>\n <div>\n <h3 className={cn('text-sm font-semibold ', 'text-z-primary')}>Two-Factor Authentication (TOTP)</h3>\n <p className=\"text-sm text-z-secondary mt-1\">Secure your admin account with an authenticator app (Google Authenticator, Authy, 1Password)</p>\n </div>\n </div>\n\n {enabled ? (\n <div className={cn('flex items-center gap-2 text-sm font-semibold ', dark ? 'text-z-active-text' : 'text-z-accent')}>\n <ShieldCheck size={16} /> 2FA is Active on your account\n </div>\n ) : setupState === 'idle' ? (\n <button\n onClick={handleSetup}\n className={cn('px-6 py-3 text-z-primary text-sm font-semibold border transition-all',\n dark ? 'bg-z-accent border-transparent hover:opacity-90 shadow-sm' : 'bg-z-accent border-transparent hover:brightness-110')}\n >\n Enable 2FA\n </button>\n ) : setupState === 'loading' ? (\n <Loader2 className={cn('animate-spin', dark ? 'text-z-active-text' : 'text-z-secondary')} size={24} />\n ) : (\n <div className=\"space-y-5\">\n <div className=\"space-y-2\">\n <p className={cn('text-sm font-semibold ', dark ? 'text-z-muted' : 'text-z-secondary')}>1. Scan this QR code with your authenticator app</p>\n {qrCode && <img src={qrCode} alt=\"2FA QR Code\" className=\"w-48 h-48 border-4 border-z-border rounded-none\" />}\n </div>\n <div className=\"space-y-2\">\n <p className={cn('text-sm font-semibold ', dark ? 'text-z-muted' : 'text-z-secondary')}>2. Enter the 6-digit code to verify</p>\n <div className=\"flex gap-3 items-center\">\n <input\n type=\"text\"\n placeholder=\"000000\"\n maxLength={6}\n value={token}\n onChange={e => setToken(e.target.value.replace(/\\D/g, ''))}\n className={cn(inp, 'max-w-[140px] text-center text-2xl font-mono')}\n />\n <button\n onClick={handleVerify}\n disabled={token.length !== 6 || verifying}\n className={cn('px-6 py-3 disabled:opacity-50 text-z-primary text-sm font-semibold border flex items-center gap-2',\n dark ? 'bg-z-accent border-transparent hover:opacity-90' : 'bg-z-accent border-transparent hover:brightness-110')}\n >\n {verifying ? <Loader2 size={13} className=\"animate-spin\" /> : <CheckCircle2 size={13} />}\n Verify & Enable\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* Active Sessions */}\n <div className=\"space-y-1.5\">\n <div className=\"flex items-center justify-between px-1\">\n <p className=\"text-sm font-semibold text-z-secondary\">Active Sessions</p>\n <button onClick={fetchSessions} className=\"text-sm text-z-active-text hover:text-z-active-text font-semibold flex items-center gap-1\">\n <RefreshCw size={10} /> Refresh\n </button>\n </div>\n <div className={cn('border rounded-none overflow-hidden', 'z-panel')}>\n {sessionsLoading ? (\n <div className=\"flex items-center justify-center py-8\">\n <Loader2 size={20} className=\"text-z-active-text animate-spin\" />\n </div>\n ) : sessions.length === 0 ? (\n <div className=\"py-8 text-center\">\n <p className=\"text-sm text-z-secondary\">No active session data available</p>\n <p className=\"text-sm text-z-primary mt-1\">Sessions are tracked automatically on login</p>\n </div>\n ) : (\n <div className=\"divide-y\" style={{ borderColor: 'var(--z-border)' }}>\n {sessions.map(session => (\n <div key={session.id} className=\"flex items-center gap-4 px-5 py-3\">\n <div className={cn('w-8 h-8 flex items-center justify-center flex-shrink-0', dark ? 'bg-z-hover text-z-muted' : 'bg-[var(--z-bg-input)] text-z-secondary')}>\n <Server size={14} />\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className={cn('text-sm font-semibold truncate', dark ? 'text-z-primary' : 'text-z-primary')}>\n {session.ipAddress || 'Unknown IP'}\n {session.current && <span className=\"ml-2 text-sm text-z-active-text font-semibold px-1.5 border border-z-active-border bg-z-active-bg\">CURRENT</span>}\n </p>\n <p className=\"text-sm text-z-secondary truncate\">{session.userAgent || 'Unknown device'}</p>\n <p className=\"text-sm text-z-primary mt-0.5\">\n {session.lastActivityAt ? `Active ${new Date(session.lastActivityAt).toLocaleString()}` : `Created ${new Date(session.createdAt).toLocaleString()}`}\n </p>\n </div>\n {!session.current && (\n <button\n onClick={() => handleRevokeSession(session.id)}\n disabled={revokingSessionId === session.id}\n className=\"p-2 text-z-secondary hover:text-red-400 transition-colors disabled:opacity-40\"\n title=\"Revoke session\"\n >\n {revokingSessionId === session.id ? <Loader2 size={14} className=\"animate-spin\" /> : <XCircle size={14} />}\n </button>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n </div>\n )\n}\n\nexport default SettingsSecurity\n","import React, { useState, useEffect, useRef, useCallback } from 'react'\nimport {\n Mail, Send, Eye, EyeOff, RefreshCw, Loader2, CheckCircle2,\n AlertTriangle, Info, Zap, Lock, Server, Clock, Shield\n} from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport api from '../../lib/api'\nimport toast from 'react-hot-toast'\n\ninterface SettingsNotificationsProps {\n settings: {\n smtpHost: string\n smtpPort: number\n smtpUser: string\n smtpPass: string\n fromEmail: string\n smtpSecure?: boolean\n smtpFromName?: string\n emailSubjectPrefix?: string\n [key: string]: any\n }\n setSettings: (s: any) => void\n theme: 'light' | 'dark'\n testingSmtp: boolean\n setTestingSmtp: (v: boolean) => void\n}\n\nconst SMTP_PROVIDERS = [\n { id: 'custom', label: 'Custom SMTP', host: '', port: 587 },\n { id: 'gmail', label: 'Gmail', host: 'smtp.gmail.com', port: 587 },\n { id: 'sendgrid', label: 'SendGrid', host: 'smtp.sendgrid.net', port: 587 },\n { id: 'mailgun', label: 'Mailgun', host: 'smtp.mailgun.org', port: 587 },\n { id: 'ses', label: 'Amazon SES', host: 'email-smtp.us-east-1.amazonaws.com', port: 587 },\n { id: 'outlook', label: 'Outlook / Office365', host: 'smtp.office365.com', port: 587 },\n { id: 'zoho', label: 'Zoho Mail', host: 'smtp.zoho.com', port: 587 },\n { id: 'postmark', label: 'Postmark', host: 'smtp.postmarkapp.com', port: 587 },\n { id: 'resend', label: 'Resend', host: 'smtp.resend.com', port: 587 },\n]\n\nconst SettingsNotifications: React.FC<SettingsNotificationsProps> = ({\n settings, setSettings, theme, testingSmtp, setTestingSmtp,\n}) => {\n const dark = theme === 'dark'\n const [showPass, setShowPass] = useState(false)\n const [selectedProvider, setSelectedProvider] = useState('custom')\n const [testEmail, setTestEmail] = useState('')\n const [testEmailOpen, setTestEmailOpen] = useState(false)\n const [sendingTest, setSendingTest] = useState(false)\n const [lastTestResult, setLastTestResult] = useState<{ ok: boolean; msg: string } | null>(null)\n \n const isMountedRef = useRef(true)\n useEffect(() => {\n return () => {\n isMountedRef.current = false\n }\n }, [])\n\n const handlePresetSelect = (providerId: string) => {\n const preset = SMTP_PROVIDERS.find(p => p.id === providerId)\n if (!preset) return\n setSelectedProvider(providerId)\n if (preset.host) {\n setSettings({ ...settings, smtpHost: preset.host, smtpPort: preset.port })\n }\n }\n\n const handleTestSmtp = async () => {\n setTestingSmtp(true)\n setLastTestResult(null)\n try {\n const res = await api.post('/system/smtp/test', {\n smtpHost: settings.smtpHost,\n smtpPort: settings.smtpPort,\n smtpUser: settings.smtpUser,\n smtpPass: settings.smtpPass,\n resendKey: settings.resendKey,\n fromEmail: settings.fromEmail,\n smtpSecure: settings.smtpSecure,\n })\n setLastTestResult({ ok: true, msg: res.data?.message || 'Connection successful' })\n toast.success(res.data?.message || 'SMTP connected successfully')\n } catch (err: any) {\n const msg = err?.response?.data?.error || err?.response?.data?.message || 'SMTP connection failed'\n setLastTestResult({ ok: false, msg })\n toast.error('SMTP connection failed')\n } finally {\n setTestingSmtp(false)\n }\n }\n\n const handleSendTestEmail = async () => {\n if (!testEmail.trim()) return toast.error('Enter a recipient email')\n setSendingTest(true)\n try {\n await api.post('/system/smtp/send-test', {\n to: testEmail,\n smtpHost: settings.smtpHost,\n smtpPort: settings.smtpPort,\n smtpUser: settings.smtpUser,\n smtpPass: settings.smtpPass,\n resendKey: settings.resendKey,\n fromEmail: settings.fromEmail,\n })\n toast.success(`Test email sent to ${testEmail}`)\n setTestEmailOpen(false)\n } catch {\n toast.error('Failed to send test email')\n } finally {\n setSendingTest(false)\n }\n }\n\n const card = cn(\n 'p-5 border rounded-none transition-all',\n dark ? 'bg-z-panel backdrop-blur-md border-z-border shadow-sm' : 'bg-[var(--z-bg-input)]/50 border-z-border shadow-sm'\n )\n\n const inp = cn(\n 'w-full border rounded-none py-2.5 px-4 text-sm outline-none transition-all focus:ring-1 focus:ring-z-active-border focus:border-z-accent',\n dark ? 'bg-app/80 border-z-border text-z-primary placeholder:text-z-primary' : 'bg-z-panel border-z-border'\n )\n\n const portMode = settings.smtpPort === 465 ? 'SSL' : settings.smtpPort === 587 ? 'TLS/STARTTLS' : 'Custom'\n\n return (\n <div className=\"space-y-5\">\n {/* Provider Presets */}\n <div className=\"space-y-2\">\n <p className=\"text-sm font-semibold text-z-secondary px-1\">Quick Configure</p>\n <div className=\"flex flex-wrap gap-2\">\n {SMTP_PROVIDERS.map(p => (\n <button\n key={p.id}\n onClick={() => handlePresetSelect(p.id)}\n className={cn(\n 'px-3 py-1.5 text-sm font-semibold border transition-all',\n selectedProvider === p.id\n ? dark ? 'bg-z-accent/20 border-z-active-border text-z-active-text' : 'bg-z-active-bg border-z-active-border text-z-accent'\n : dark ? 'bg-z-hover border-z-border text-z-secondary hover:text-z-secondary' : 'bg-z-input border-z-border text-z-secondary'\n )}\n >\n {p.label}\n </button>\n ))}\n </div>\n </div>\n\n {/* Main Config */}\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {/* Host */}\n <div className={cn(card, 'space-y-2')}>\n <label className=\"text-sm font-semibold text-z-secondary\">SMTP Relay Host</label>\n <div className=\"flex items-center gap-2\">\n <Server size={12} className=\"text-z-secondary shrink-0\" />\n <input type=\"text\" value={settings.smtpHost || ''} onChange={e => setSettings({ ...settings, smtpHost: e.target.value })} className={inp} placeholder=\"smtp.example.com\" />\n </div>\n </div>\n\n {/* Port + TLS */}\n <div className={cn(card, 'space-y-2')}>\n <div className=\"flex items-center justify-between\">\n <label className=\"text-sm font-semibold text-z-secondary\">Port & Encryption</label>\n <span className={cn('text-sm font-semibold px-2 py-0.5 border', portMode === 'SSL' ? 'text-z-active-text border-z-active-border bg-z-active-bg' : portMode === 'TLS/STARTTLS' ? 'text-z-active-text border-z-accent/30 bg-z-accent/10' : 'text-z-secondary border-z-border bg-z-hover')}>{portMode}</span>\n </div>\n <div className=\"flex gap-2\">\n {[25, 465, 587, 2525].map(p => (\n <button key={p} onClick={() => setSettings({ ...settings, smtpPort: p })}\n className={cn('px-3 py-2 text-sm font-semibold border transition-all', settings.smtpPort === p ? dark ? 'bg-z-accent/20 border-z-active-border text-z-active-text' : 'bg-z-active-bg border-z-active-border text-z-accent' : dark ? 'bg-z-hover border-z-border text-z-secondary' : 'bg-z-input border-z-border text-z-secondary')}>\n {p}\n </button>\n ))}\n <input type=\"number\" value={settings.smtpPort || 587} onChange={e => setSettings({ ...settings, smtpPort: parseInt(e.target.value) || 587 })} className={cn(inp, 'max-w-20')} />\n </div>\n </div>\n\n {/* User */}\n <div className={cn(card, 'space-y-2')}>\n <label className=\"text-sm font-semibold text-z-secondary\">SMTP Username</label>\n <input type=\"text\" value={settings.smtpUser || ''} onChange={e => setSettings({ ...settings, smtpUser: e.target.value })} className={inp} placeholder=\"user@example.com\" />\n </div>\n\n {/* Password */}\n <div className={cn(card, 'space-y-2')}>\n <label className=\"text-sm font-semibold text-z-secondary\">SMTP Password</label>\n <div className=\"relative\">\n <input type={showPass ? 'text' : 'password'} value={settings.smtpPass || ''} onChange={e => setSettings({ ...settings, smtpPass: e.target.value })} className={cn(inp, 'pr-10')} placeholder=\"••••••••\" />\n <button onClick={() => setShowPass(!showPass)} type=\"button\" className=\"absolute right-3 top-1/2 -translate-y-1/2 text-z-secondary hover:text-z-secondary transition-colors\">\n {showPass ? <EyeOff size={13} /> : <Eye size={13} />}\n </button>\n </div>\n </div>\n\n {/* Resend API Key */}\n <div className={cn(card, 'space-y-2 md:col-span-2 mt-4')}>\n <div className=\"flex items-center gap-2 mb-1\">\n <Zap size={14} className=\"text-z-accent\" />\n <label className=\"text-sm font-semibold text-z-primary\">Resend Integration</label>\n </div>\n <p className=\"text-xs text-z-secondary mb-2\">If provided, Zenith will use Resend instead of custom SMTP.</p>\n <div className=\"relative\">\n <input type={showPass ? 'text' : 'password'} value={settings.resendKey || ''} onChange={e => setSettings({ ...settings, resendKey: e.target.value })} className={cn(inp, 'pr-10')} placeholder=\"re_123456789\" />\n <button onClick={() => setShowPass(!showPass)} type=\"button\" className=\"absolute right-3 top-1/2 -translate-y-1/2 text-z-secondary hover:text-z-secondary transition-colors\">\n {showPass ? <EyeOff size={13} /> : <Eye size={13} />}\n </button>\n </div>\n </div>\n\n {/* From Email */}\n <div className={cn(card, 'space-y-2')}>\n <label className=\"text-sm font-semibold text-z-secondary\">From Email Address</label>\n <input type=\"email\" value={settings.fromEmail || ''} onChange={e => setSettings({ ...settings, fromEmail: e.target.value })} className={inp} placeholder=\"noreply@yoursite.com\" />\n </div>\n\n {/* From Name */}\n <div className={cn(card, 'space-y-2')}>\n <label className=\"text-sm font-semibold text-z-secondary\">From Display Name</label>\n <input type=\"text\" value={settings.smtpFromName || ''} onChange={e => setSettings({ ...settings, smtpFromName: e.target.value })} className={inp} placeholder=\"Zenith CMS\" />\n </div>\n </div>\n\n {/* Subject Prefix */}\n <div className={cn(card, 'space-y-2')}>\n <label className=\"text-sm font-semibold text-z-secondary\">Email Subject Prefix (optional)</label>\n <input type=\"text\" value={settings.emailSubjectPrefix || ''} onChange={e => setSettings({ ...settings, emailSubjectPrefix: e.target.value })} className={inp} placeholder=\"[MyApp] \" />\n <p className=\"text-sm text-z-secondary\">Prepended to all outgoing email subjects, e.g. \"[Zenith] Password Reset\"</p>\n </div>\n\n {/* SSL Toggle */}\n <div className={cn('flex items-center justify-between p-4 border', 'bg-z-panel border-z-border')}>\n <div>\n <p className={cn('text-sm font-semibold ', dark ? 'text-z-primary' : 'text-z-primary')}>Force SSL/TLS</p>\n <p className=\"text-sm text-z-secondary mt-0.5\">Use implicit TLS (port 465). Disable for STARTTLS (port 587)</p>\n </div>\n <label className=\"relative inline-flex items-center cursor-pointer\">\n <input type=\"checkbox\" checked={!!settings.smtpSecure} onChange={e => setSettings({ ...settings, smtpSecure: e.target.checked, smtpPort: e.target.checked ? 465 : 587 })} className=\"sr-only peer\" />\n <div className={cn(\"w-11 h-6 rounded-none peer peer-checked:after:translate-x-full after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-z-panel after:rounded-none after:h-5 after:w-5 after:transition-all border shadow-inner\", 'bg-z-input peer-checked:bg-z-accent border-z-border')}></div>\n </label>\n </div>\n\n {/* Test Result */}\n {lastTestResult && (\n <div className={cn('flex items-center gap-3 p-4 border', lastTestResult.ok ? dark ? 'bg-z-accent/5 border-z-accent/20' : 'bg-z-active-bg border-z-active-border' : dark ? 'bg-red-500/5 border-red-500/20' : 'bg-red-50 border-red-200')}>\n {lastTestResult.ok ? <CheckCircle2 size={14} className=\"text-z-active-text shrink-0\" /> : <AlertTriangle size={14} className=\"text-red-400 shrink-0\" />}\n <p className={cn('text-sm font-semibold ', lastTestResult.ok ? 'text-z-active-text' : 'text-red-400')}>{lastTestResult.msg}</p>\n </div>\n )}\n\n {/* Actions */}\n <div className=\"flex flex-wrap items-center gap-3\">\n <button\n onClick={handleTestSmtp}\n disabled={testingSmtp}\n className={cn('flex items-center gap-2 px-6 py-3 text-sm font-semibold border transition-all active:scale-95',\n dark ? 'bg-z-accent border-transparent text-z-primary hover:opacity-90 shadow-sm' : 'bg-z-accent text-z-primary border-transparent hover:brightness-110')}\n >\n {testingSmtp ? <Loader2 size={13} className=\"animate-spin\" /> : <Zap size={13} />}\n Test Connection\n </button>\n <button\n onClick={() => setTestEmailOpen(!testEmailOpen)}\n className={cn('flex items-center gap-2 px-4 py-3 text-sm font-semibold border transition-all',\n dark ? 'border-z-border text-z-muted hover:text-z-primary' : 'border-z-border text-z-secondary')}\n >\n <Send size={12} />\n Send Test Email\n </button>\n </div>\n\n {/* Test Email Inline Form */}\n {testEmailOpen && (\n <div className={cn('p-4 border space-y-3', dark ? 'bg-z-panel border-z-border' : 'bg-z-input border-z-border')}>\n <label className=\"text-sm font-semibold text-z-secondary\">Test Recipient Email</label>\n <div className=\"flex gap-3\">\n <input\n type=\"email\"\n value={testEmail}\n onChange={e => setTestEmail(e.target.value)}\n placeholder=\"you@example.com\"\n className={cn(inp, 'flex-1')}\n onKeyDown={e => e.key === 'Enter' && handleSendTestEmail()}\n />\n <button\n onClick={handleSendTestEmail}\n disabled={sendingTest || !testEmail.trim()}\n className={cn('flex items-center gap-2 px-5 py-2.5 text-sm font-semibold border transition-all disabled:opacity-40',\n dark ? 'bg-z-accent text-z-logo-text border-transparent hover:opacity-90' : 'bg-z-accent text-z-primary border-transparent hover:brightness-110')}\n >\n {sendingTest ? <Loader2 size={12} className=\"animate-spin\" /> : <Send size={12} />}\n Send\n </button>\n </div>\n <p className=\"text-sm text-z-secondary\">A sample email will be sent using the SMTP settings above.</p>\n </div>\n )}\n </div>\n )\n}\n\nexport default SettingsNotifications\n","import React, { useState, useRef, useEffect } from 'react'\nimport { X, Users, Loader2 } from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport api from '../../lib/api'\nimport toast from 'react-hot-toast'\n\ninterface InviteUserModalProps {\n onClose: () => void\n onInvited: () => void\n theme: 'light' | 'dark'\n}\n\nconst InviteUserModal: React.FC<InviteUserModalProps> = ({ onClose, onInvited, theme }) => {\n const [email, setEmail] = useState('')\n const [role, setRole] = useState<string>('editor')\n const [availableRoles, setAvailableRoles] = useState<string[]>(['admin', 'editor', 'viewer'])\n const [loading, setLoading] = useState(false)\n const [sent, setSent] = useState(false)\n const isMountedRef = useRef(true)\n useEffect(() => { \n const fetchRoles = async () => {\n try {\n const res = await api.get('/system/roles')\n if (res.data?.data) {\n const roles = res.data.data.map((r: any) => r.roleName)\n setAvailableRoles((prev) => Array.from(new Set([...prev, ...roles])))\n }\n } catch (e) {\n // use defaults\n }\n }\n fetchRoles()\n return () => { isMountedRef.current = false } \n }, [])\n\n const handleInvite = async (e: React.FormEvent) => {\n e.preventDefault()\n if (!email.trim()) return\n\n setLoading(true)\n try {\n await api.post('/system/members', { email: email.trim(), role })\n toast.success(`Invitation sent to ${email}`)\n setSent(true)\n onInvited()\n setTimeout(() => { if (isMountedRef.current) onClose() }, 1200)\n } catch (err: any) {\n toast.error(err?.response?.data?.error || 'Failed to send invitation')\n } finally {\n setLoading(false)\n }\n }\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-[var(--z-bg-modal)] backdrop-blur-sm\">\n <div\n className={cn(\n 'w-full max-w-md border rounded-none-none shadow-2xl',\n theme === 'dark'\n ? 'bg-app border-z-border'\n : 'bg-z-panel border-z-border shadow-sm shadow-[var(--z-border)]'\n )}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between px-8 py-6 border-b border-z-border\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-10 h-10 rounded-none-none bg-z-panel border border-z-border/20 flex items-center justify-center\">\n <Users size={18} className=\"text-z-secondary \" />\n </div>\n <span className=\"text-sm font-semibold tracking-wide\">\n Initialize Operator\n </span>\n </div>\n <button onClick={onClose} className=\"text-z-secondary hover:text-z-primary transition-colors\">\n <X size={18} />\n </button>\n </div>\n\n {sent ? (\n <div className=\"px-8 py-12 text-center space-y-4\">\n <div className=\"w-16 h-16 mx-auto rounded-none-none bg-z-panel border border-z-border/20 flex items-center justify-center\">\n <Users size={28} className=\"text-z-secondary \" />\n </div>\n <p className=\"text-sm font-semibold text-z-secondary \">\n Invitation Dispatched\n </p>\n <p className=\"text-sm text-z-secondary\">\n {email} — check inbox for password reset link\n </p>\n </div>\n ) : (\n <form onSubmit={handleInvite} className=\"px-8 py-6 space-y-6\">\n {/* Email */}\n <div className=\"space-y-2\">\n <label className=\"text-sm font-semibold text-z-secondary\">\n Operator Email\n </label>\n <input\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n required\n autoFocus\n placeholder=\"operator@example.com\"\n className={cn(\n 'w-full border rounded-none-none py-4 px-5 text-[13px] font-semibold transition-all outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black',\n theme === 'dark'\n ? 'bg-z-hover border-z-border text-z-primary focus:border-z-border/50'\n : 'bg-z-input border-z-border focus:border-z-border'\n )}\n />\n </div>\n\n {/* Role */}\n <div className=\"space-y-2\">\n <label className=\"text-sm font-semibold text-z-secondary\">\n Auth Tier\n </label>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-2\">\n {availableRoles.map((r) => (\n <button\n key={r}\n type=\"button\"\n onClick={() => setRole(r)}\n className={cn(\n 'py-3 text-sm font-semibold border rounded-none-none transition-all',\n role === r\n ? 'border-z-border/40 bg-z-panel text-z-secondary'\n : theme === 'dark'\n ? 'border-z-border text-z-secondary hover:border-z-border'\n : 'border-z-border text-z-muted hover:border-z-border-strong'\n )}\n >\n {r}\n </button>\n ))}\n </div>\n </div>\n\n {/* Submit */}\n <button\n type=\"submit\"\n disabled={loading || !email.trim()}\n className={cn(\n 'w-full py-4 rounded-none-none text-sm font-semibold shadow-lg transition-all active:scale-95 disabled:opacity-40',\n theme === 'dark'\n ? 'bg-z-border hover:bg-z-accent text-z-primary'\n : 'bg-z-accent hover:brightness-110 text-z-primary'\n )}\n >\n {loading ? (\n <span className=\"flex items-center justify-center gap-2\">\n <Loader2 size={14} className=\"animate-spin\" />\n Dispatching Invite...\n </span>\n ) : (\n 'Dispatch Invitation'\n )}\n </button>\n </form>\n )}\n\n <div className=\"px-8 pb-6\">\n <p className=\"text-sm text-z-secondary text-center\">\n 48h expiring token · sent via SMTP relay · password set on first login\n </p>\n </div>\n </div>\n </div>\n )\n}\n\nexport default InviteUserModal\n","import React, { useState, useRef, useEffect } from 'react'\nimport { createPortal } from 'react-dom'\nimport { X, UserCog, Loader2, Check } from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport api from '../../lib/api'\nimport toast from 'react-hot-toast'\nimport { useSystemMetadata } from '../../hooks/useQueries'\n\ninterface EditUserModalProps {\n user: any\n onClose: () => void\n onUpdated: () => void\n theme: 'light' | 'dark'\n}\n\nconst PRESET_COLORS = [\n 'var(--z-accent)', // Emerald\n '#3B82F6', // Blue\n '#F59E0B', // Amber\n '#EF4444', // Red\n '#EC4899', // Pink\n 'var(--z-accent)', // Purple\n '#06B6D4', // Cyan\n '#64748B', // Slate\n]\n\nconst EditUserModal: React.FC<EditUserModalProps> = ({ user, onClose, onUpdated, theme }) => {\n const { data: health } = useSystemMetadata()\n const collections = health?.collections || []\n const globals = health?.globals || []\n\n const [sites, setSites] = useState<any[]>([])\n \n // Combine collections, globals, and sites into scopes\n const availableScopes = [\n ...sites.map(s => ({ id: `site:${s.slug}`, label: `Site: ${s.name}` })),\n ...collections.map((c: any) => ({ id: `col:${c.slug}`, label: `Collection: ${c.name}` })),\n ...globals.map((g: any) => ({ id: `glb:${g.slug}`, label: `Global: ${g.name}` })),\n ]\n\n const [role, setRole] = useState<string>(user.role || 'viewer')\n const [color, setColor] = useState<string>(user.color || '')\n \n const [specialAccess, setSpecialAccess] = useState<Set<string>>(\n new Set(user.specialAccess && Array.isArray(user.specialAccess) ? user.specialAccess : [])\n )\n \n const [availableRoles, setAvailableRoles] = useState<string[]>(['admin', 'editor', 'viewer'])\n const [loading, setLoading] = useState(false)\n const isMountedRef = useRef(true)\n\n useEffect(() => {\n const fetchRolesAndSites = async () => {\n try {\n const [rolesRes, sitesRes] = await Promise.all([\n api.get('/roles').catch(() => ({ data: { data: [] } })),\n api.get('/sites').catch(() => ({ data: { data: [] } }))\n ])\n \n if (rolesRes.data?.data) {\n const roles = rolesRes.data.data.map((r: any) => r.roleName.toLowerCase())\n // Ensure base roles are always present\n const baseRoles = ['admin', 'editor', 'viewer']\n setAvailableRoles(Array.from(new Set([...baseRoles, ...roles])))\n }\n \n if (sitesRes.data?.data) {\n setSites(sitesRes.data.data)\n }\n } catch (e) {\n // use defaults\n }\n }\n fetchRolesAndSites()\n return () => {\n isMountedRef.current = false\n }\n }, [])\n\n const toggleScope = (scopeId: string) => {\n setSpecialAccess(prev => {\n const newSet = new Set(prev)\n if (newSet.has(scopeId)) newSet.delete(scopeId)\n else newSet.add(scopeId)\n return newSet\n })\n }\n\n const handleUpdate = async (e: React.FormEvent) => {\n e.preventDefault()\n setLoading(true)\n try {\n const payload: any = { role }\n if (color) payload.color = color\n \n payload.specialAccess = Array.from(specialAccess)\n\n await api.patch(`/system/users/${user._id}`, payload)\n toast.success('Operator profile updated')\n onUpdated()\n if (isMountedRef.current) onClose()\n } catch (err: any) {\n toast.error(err?.response?.data?.error || 'Failed to update operator')\n } finally {\n if (isMountedRef.current) setLoading(false)\n }\n }\n\n const modalContent = (\n <div className=\"fixed inset-0 z-[9999] flex items-center justify-center bg-[var(--z-bg-modal)] backdrop-blur-sm p-4\">\n <div\n className={cn(\n 'w-full max-w-md border rounded-none-none shadow-2xl max-h-[90vh] flex flex-col',\n theme === 'dark' ? 'bg-app border-z-border' : 'bg-z-panel border-z-border shadow-sm shadow-[var(--z-border)]'\n )}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between px-8 py-6 border-b border-z-border shrink-0\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-10 h-10 rounded-none-none bg-z-panel border border-z-border/20 flex items-center justify-center\">\n <UserCog size={18} className=\"text-z-secondary \" />\n </div>\n <span className=\"text-sm font-semibold tracking-wide text-inherit\">Edit Operator</span>\n </div>\n <button onClick={onClose} className=\"text-z-secondary hover:text-z-active-text transition-colors\">\n <X size={18} />\n </button>\n </div>\n\n <div className=\"flex-1 overflow-y-auto\">\n <form onSubmit={handleUpdate} className=\"px-8 py-6 space-y-8\">\n <div className=\"space-y-1\">\n <p className=\"text-[14px] font-semibold\">{user.email}</p>\n <p className=\"text-sm text-z-secondary\">\n ID: {user._id}\n </p>\n </div>\n\n {/* Role */}\n <div className=\"space-y-3\">\n <label className=\"text-sm font-semibold text-z-secondary\">\n Auth Tier\n </label>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-2\">\n {availableRoles.map((r) => (\n <button\n key={r}\n type=\"button\"\n onClick={() => setRole(r)}\n className={cn(\n 'py-3 text-sm font-semibold border rounded-none-none transition-all',\n role === r\n ? 'border-z-accent/40 bg-z-active-bg text-z-active-text'\n : theme === 'dark'\n ? 'border-z-border text-z-secondary hover:border-z-border'\n : 'border-z-border text-z-muted hover:border-z-border-strong'\n )}\n >\n {r}\n </button>\n ))}\n </div>\n </div>\n\n {/* Color */}\n <div className=\"space-y-3\">\n <label className=\"text-sm font-semibold text-z-secondary\">\n Profile Color\n </label>\n <div className=\"flex items-center gap-3 flex-wrap\">\n {PRESET_COLORS.map((c) => (\n <button\n key={c}\n type=\"button\"\n onClick={() => setColor(c)}\n className={cn(\n 'w-8 h-8 rounded-none-none border-2 transition-transform hover:scale-110 flex items-center justify-center',\n color === c ? 'border-z-border shadow-[0_0_10px_rgba(255,255,255,0.3)]' : 'border-transparent'\n )}\n style={{ backgroundColor: c }}\n title={`Select color ${c}`}\n >\n {color === c && <Check size={12} className=\"text-z-primary mix-blend-difference\" />}\n </button>\n ))}\n <input\n type=\"color\"\n value={color || '#000000'}\n onChange={(e) => setColor(e.target.value)}\n className=\"w-8 h-8 cursor-pointer rounded-none-none bg-transparent border-0 p-0\"\n title=\"Custom Color\"\n />\n </div>\n {!color && (\n <p className=\"text-sm text-z-secondary\">\n Currently auto-assigned deterministically\n </p>\n )}\n </div>\n\n {/* Special Access Scopes */}\n <div className=\"space-y-3\">\n <label className=\"text-sm font-semibold text-z-secondary\">\n Restrict Content Access\n </label>\n <p className=\"text-sm text-z-secondary mb-2\">\n Select exactly which collections this operator can view/edit. If none are selected, they default to standard role constraints.\n </p>\n <div className=\"space-y-2 max-h-48 overflow-y-auto pr-2 custom-scrollbar\">\n {availableScopes.length > 0 ? availableScopes.map(scope => (\n <button\n key={scope.id}\n type=\"button\"\n onClick={() => toggleScope(scope.id)}\n className={cn(\n 'w-full flex items-center justify-between p-3 border rounded-none-none transition-all text-left',\n specialAccess.has(scope.id)\n ? theme === 'dark'\n ? 'border-amber-500/30 bg-amber-500/5'\n : 'border-amber-500/30 bg-amber-50'\n : theme === 'dark'\n ? 'border-z-border hover:border-z-border-strong'\n : 'border-z-border hover:border-z-border-strong'\n )}\n >\n <span className={cn(\n 'text-sm font-semibold ',\n specialAccess.has(scope.id) \n ? 'text-amber-500' \n : 'text-z-secondary'\n )}>\n {scope.label}\n </span>\n <div className={cn(\n 'w-4 h-4 border rounded-none-none flex items-center justify-center transition-colors',\n specialAccess.has(scope.id)\n ? 'bg-amber-500 border-amber-500 text-z-primary'\n : 'border-z-border/30 text-transparent'\n )}>\n <Check size={10} strokeWidth={4} />\n </div>\n </button>\n )) : (\n <p className=\"text-sm text-z-secondary\">No collections available to restrict.</p>\n )}\n </div>\n </div>\n\n {/* Submit */}\n <div className=\"pt-4\">\n <button\n type=\"submit\"\n disabled={loading}\n className={cn(\n 'w-full py-4 rounded-none-none text-sm font-semibold shadow-lg transition-all active:scale-95 disabled:opacity-40',\n theme === 'dark'\n ? 'bg-z-accent hover:bg-z-accent text-z-primary'\n : 'bg-z-accent hover:brightness-110 text-z-logo-text'\n )}\n >\n {loading ? (\n <span className=\"flex items-center justify-center gap-2\">\n <Loader2 size={14} className=\"animate-spin\" />\n Updating Profile...\n </span>\n ) : (\n 'Save Operator Profile'\n )}\n </button>\n </div>\n </form>\n </div>\n </div>\n </div>\n )\n\n return createPortal(modalContent, document.body)\n}\n\nexport default EditUserModal\n","import React, { useState } from 'react'\nimport {\n Users, Trash2, Loader2, UserCog, Search, Filter, Mail,\n CheckCircle2, XCircle, Clock, Shield, UserPlus, UserX, RefreshCw,\n ChevronDown, Activity\n} from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport api from '../../lib/api'\nimport toast from 'react-hot-toast'\nimport InviteUserModal from './InviteUserModal'\nimport EditUserModal from './EditUserModal'\n\ninterface User {\n _id: string\n email: string\n role: string\n status?: 'active' | 'suspended' | 'pending'\n lastLogin?: string\n createdAt?: string\n firstName?: string\n lastName?: string\n [key: string]: any\n}\n\ninterface SettingsUsersProps {\n users: User[]\n theme: 'light' | 'dark'\n fetchData: () => void\n}\n\nconst ROLE_OPTIONS = ['admin', 'editor', 'viewer']\n\nconst STATUS_BADGE: Record<string, string> = {\n active: 'text-z-active-text border-z-active-border bg-z-active-bg',\n suspended: 'text-red-400 border-red-500/30 bg-red-500/10',\n pending: 'text-amber-400 border-amber-500/30 bg-amber-500/10',\n}\n\nconst ROLE_BADGE: Record<string, string> = {\n admin: 'text-red-400 border-red-500/30 bg-red-500/10',\n editor: 'text-amber-400 border-amber-500/30 bg-amber-500/10',\n viewer: 'text-z-active-text border-z-active-border bg-z-active-bg',\n}\n\nconst SettingsUsers: React.FC<SettingsUsersProps> = ({ users, theme, fetchData }) => {\n const dark = theme === 'dark'\n const [inviteOpen, setInviteOpen] = useState(false)\n const [editingUser, setEditingUser] = useState<User | null>(null)\n const [deletingId, setDeletingId] = useState<string | null>(null)\n const [suspendingId, setSuspendingId] = useState<string | null>(null)\n const [resetEmailId, setResetEmailId] = useState<string | null>(null)\n const [updatingRoleId, setUpdatingRoleId] = useState<string | null>(null)\n const [search, setSearch] = useState('')\n const [filterRole, setFilterRole] = useState<string>('all')\n const [filterStatus, setFilterStatus] = useState<string>('all')\n const [selectedIds, setSelectedIds] = useState<string[]>([])\n const [bulkDeleting, setBulkDeleting] = useState(false)\n\n const handleDeleteUser = async (id: string) => {\n setDeletingId(id)\n try {\n await api.delete(`/system/users/${id}`)\n toast.success('Operator removed')\n fetchData()\n } catch (err: any) {\n toast.error(err?.response?.data?.error || 'Failed to remove operator')\n } finally {\n setDeletingId(null)\n }\n }\n\n const handleSuspend = async (user: User) => {\n setSuspendingId(user._id)\n try {\n const isSuspended = user.status === 'suspended'\n await api.patch(`/system/users/${user._id}`, { status: isSuspended ? 'active' : 'suspended' })\n toast.success(isSuspended ? 'User reactivated' : 'User suspended')\n fetchData()\n } catch {\n toast.error('Action failed')\n } finally {\n setSuspendingId(null)\n }\n }\n\n const handleSendPasswordReset = async (user: User) => {\n setResetEmailId(user._id)\n try {\n await api.post('/auth/forgot-password', { email: user.email })\n toast.success(`Password reset sent to ${user.email}`)\n } catch {\n toast.error('Failed to send reset email')\n } finally {\n setResetEmailId(null)\n }\n }\n\n const handleRoleChange = async (user: User, newRole: string) => {\n setUpdatingRoleId(user._id)\n try {\n await api.patch(`/system/users/${user._id}`, { role: newRole })\n toast.success(`Role updated to ${newRole}`)\n fetchData()\n } catch {\n toast.error('Failed to update role')\n } finally {\n setUpdatingRoleId(null)\n }\n }\n\n const handleBulkDelete = async () => {\n if (!selectedIds.length) return\n if (!window.confirm(`Delete ${selectedIds.length} user(s)?`)) return\n setBulkDeleting(true)\n try {\n await Promise.all(selectedIds.map(id => api.delete(`/system/users/${id}`)))\n toast.success(`${selectedIds.length} users removed`)\n setSelectedIds([])\n fetchData()\n } catch {\n toast.error('Bulk delete failed')\n } finally {\n setBulkDeleting(false)\n }\n }\n\n const toggleSelect = (id: string) => {\n setSelectedIds(prev => prev.includes(id) ? prev.filter(x => x !== id) : [...prev, id])\n }\n\n const filtered = users.filter(u => {\n const matchSearch = !search || u.email.toLowerCase().includes(search.toLowerCase()) || (u.firstName || '').toLowerCase().includes(search.toLowerCase())\n const matchRole = filterRole === 'all' || u.role === filterRole\n const matchStatus = filterStatus === 'all' || (u.status || 'active') === filterStatus\n return matchSearch && matchRole && matchStatus\n })\n\n const card = cn(\n 'border rounded-none transition-all group',\n dark ? 'bg-z-panel backdrop-blur-md border-z-border hover:border-z-active-border shadow-sm' : 'bg-z-panel border-z-border shadow-sm hover:border-z-active-border'\n )\n\n const inp = cn(\n 'border rounded-none py-2 px-3 text-sm outline-none transition-all focus:ring-1 focus:ring-z-active-border focus:border-z-accent',\n dark ? 'bg-app/80 border-z-border text-z-primary placeholder:text-z-primary' : 'bg-z-panel border-z-border'\n )\n\n return (\n <>\n <div className=\"space-y-4\">\n {/* Toolbar */}\n <div className=\"flex flex-wrap items-center gap-3\">\n <div className=\"relative flex-1 min-w-[200px]\">\n <Search size={12} className=\"absolute left-3 top-1/2 -translate-y-1/2 text-z-secondary\" />\n <input\n value={search}\n onChange={e => setSearch(e.target.value)}\n placeholder=\"Search by email or name...\"\n className={cn(inp, 'pl-8 w-full')}\n />\n </div>\n <select value={filterRole} onChange={e => setFilterRole(e.target.value)} className={cn(inp, 'min-w-[110px]')}>\n <option value=\"all\">All Roles</option>\n {ROLE_OPTIONS.map(r => <option key={r} value={r}>{r}</option>)}\n </select>\n <select value={filterStatus} onChange={e => setFilterStatus(e.target.value)} className={cn(inp, 'min-w-[110px]')}>\n <option value=\"all\">All Status</option>\n <option value=\"active\">Active</option>\n <option value=\"suspended\">Suspended</option>\n <option value=\"pending\">Pending</option>\n </select>\n <div className=\"flex items-center gap-2 ml-auto\">\n {selectedIds.length > 0 && (\n <button onClick={handleBulkDelete} disabled={bulkDeleting}\n className={cn('flex items-center gap-2 px-3 py-2 text-sm font-semibold border transition-all', dark ? 'bg-red-500/10 border-red-500/30 text-red-400 hover:bg-red-500/20' : 'bg-red-50 border-red-200 text-red-600')}>\n {bulkDeleting ? <Loader2 size={11} className=\"animate-spin\" /> : <Trash2 size={11} />}\n Delete ({selectedIds.length})\n </button>\n )}\n <span className={cn('text-sm font-semibold ', 'text-z-secondary')}>\n {filtered.length}/{users.length} users\n </span>\n <button onClick={() => setInviteOpen(true)}\n className={cn('flex items-center gap-2 text-sm font-semibold border px-5 py-2.5 transition-all', dark ? 'border-z-active-border text-z-active-text hover:bg-z-active-bg' : 'border-z-active-border text-z-accent hover:bg-z-active-bg')}>\n <UserPlus size={13} />\n Invite User\n </button>\n </div>\n </div>\n\n {/* User Cards */}\n <div className=\"space-y-2\">\n {filtered.length === 0 ? (\n <div className={cn('py-12 border border-dashed text-center', 'border-z-border')}>\n <Users size={28} className=\"text-z-secondary mx-auto mb-3\" />\n <p className=\"text-sm text-z-secondary\">No users match your filters</p>\n </div>\n ) : (\n filtered.map(user => {\n const status = user.status || 'active'\n const isSuspended = status === 'suspended'\n return (\n <div key={user._id} className={card}>\n <div className=\"flex items-center gap-4 p-4\">\n {/* Checkbox */}\n <input\n type=\"checkbox\"\n checked={selectedIds.includes(user._id)}\n onChange={() => toggleSelect(user._id)}\n className=\"accent-z-accent w-3.5 h-3.5 flex-shrink-0\"\n onClick={e => e.stopPropagation()}\n />\n {/* Avatar */}\n <div className={cn('w-10 h-10 flex items-center justify-center text-sm font-semibold flex-shrink-0 border', isSuspended ? dark ? 'bg-red-500/10 text-red-400 border-red-500/20' : 'bg-red-50 text-red-500 border-red-200' : dark ? 'bg-z-active-bg text-z-active-text border-z-active-border' : 'bg-z-active-bg text-z-accent border-z-active-border')}>\n {(user.firstName?.[0] || user.email[0]).toUpperCase()}\n </div>\n {/* Info */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className={cn('text-sm font-semibold leading-none', 'text-z-primary')}>\n {user.firstName ? `${user.firstName} ${user.lastName || ''}`.trim() : user.email}\n </span>\n <span className={cn('text-sm font-semibold px-1.5 py-0.5 border', ROLE_BADGE[user.role] || 'text-z-muted border-z-border bg-z-hover')}>\n {user.role}\n </span>\n <span className={cn('text-sm font-semibold px-1.5 py-0.5 border', STATUS_BADGE[status] || STATUS_BADGE.active)}>\n {status}\n </span>\n </div>\n <div className=\"flex items-center gap-3 mt-1.5 flex-wrap\">\n {user.firstName && (\n <span className=\"text-sm text-z-secondary\">{user.email}</span>\n )}\n {user.lastLogin && (\n <span className=\"text-sm text-z-secondary flex items-center gap-1\">\n <Clock size={8} /> Last login {new Date(user.lastLogin).toLocaleDateString()}\n </span>\n )}\n {user.createdAt && (\n <span className=\"text-sm text-z-secondary\">Joined {new Date(user.createdAt).toLocaleDateString()}</span>\n )}\n </div>\n </div>\n\n {/* Actions (visible on hover) */}\n <div className=\"flex items-center gap-1 opacity-0 group-hover:opacity-100 transition-opacity\">\n {/* Inline role change */}\n <div className=\"relative\">\n <select\n value={user.role}\n onChange={e => handleRoleChange(user, e.target.value)}\n disabled={updatingRoleId === user._id}\n className={cn('text-sm font-semibold border py-1.5 px-2 outline-none transition-all cursor-pointer', dark ? 'bg-app/80 border-z-border text-z-muted hover:border-z-active-border' : 'bg-z-panel border-z-border text-z-secondary')}\n onClick={e => e.stopPropagation()}\n >\n {ROLE_OPTIONS.map(r => <option key={r} value={r}>{r}</option>)}\n </select>\n </div>\n {/* Password Reset */}\n <button\n onClick={() => handleSendPasswordReset(user)}\n disabled={resetEmailId === user._id}\n className={cn('p-2 transition-colors', dark ? 'text-z-secondary hover:text-z-active-text' : 'text-z-muted hover:text-z-active-text')}\n title=\"Send password reset\"\n >\n {resetEmailId === user._id ? <Loader2 size={14} className=\"animate-spin\" /> : <Mail size={14} />}\n </button>\n {/* Edit */}\n <button\n onClick={() => setEditingUser(user)}\n className={cn('p-2 transition-colors', dark ? 'text-z-secondary hover:text-z-active-text' : 'text-z-muted hover:text-z-accent')}\n title=\"Edit user\"\n >\n <UserCog size={14} />\n </button>\n {/* Suspend/Activate */}\n <button\n onClick={() => handleSuspend(user)}\n disabled={suspendingId === user._id}\n className={cn('p-2 transition-colors disabled:opacity-30', isSuspended ? dark ? 'text-z-secondary hover:text-z-active-text' : 'text-z-muted hover:text-z-accent' : dark ? 'text-z-secondary hover:text-amber-400' : 'text-z-muted hover:text-amber-600')}\n title={isSuspended ? 'Reactivate' : 'Suspend'}\n >\n {suspendingId === user._id ? <Loader2 size={14} className=\"animate-spin\" /> : isSuspended ? <CheckCircle2 size={14} /> : <UserX size={14} />}\n </button>\n {/* Delete */}\n <button\n onClick={() => handleDeleteUser(user._id)}\n disabled={deletingId === user._id}\n className={cn('p-2 transition-colors disabled:opacity-30', dark ? 'text-z-secondary hover:text-red-400' : 'text-z-muted hover:text-red-600')}\n title=\"Delete user\"\n >\n {deletingId === user._id ? <Loader2 size={14} className=\"animate-spin\" /> : <Trash2 size={14} />}\n </button>\n </div>\n </div>\n </div>\n )\n })\n )}\n </div>\n </div>\n\n {inviteOpen && (\n <InviteUserModal onClose={() => setInviteOpen(false)} onInvited={fetchData} theme={theme} />\n )}\n {editingUser && (\n <EditUserModal user={editingUser} onClose={() => setEditingUser(null)} onUpdated={fetchData} theme={theme} />\n )}\n </>\n )\n}\n\nexport default SettingsUsers\n","import React, { useState } from 'react'\nimport { X, Key, Loader2 } from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport api from '../../lib/api'\n\ninterface GenerateKeyModalProps {\n onClose: () => void\n onGenerated: (key: any) => void\n onOpenKeyModal: (k: any) => void\n theme: 'light' | 'dark'\n}\n\nconst GenerateKeyModal: React.FC<GenerateKeyModalProps> = ({ onClose, onGenerated, onOpenKeyModal, theme }) => {\n const [name, setName] = useState('')\n const [role, setRole] = useState<'admin' | 'editor' | 'viewer'>('editor')\n const [expiresDays, setExpiresDays] = useState(30)\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState('')\n\n const handleGenerate = async (e: React.FormEvent) => {\n e.preventDefault()\n if (!name.trim()) return\n setError('')\n setLoading(true)\n try {\n const res = await api.post<any>('/system/api-keys', {\n name: name.trim(),\n role,\n expiresInDays: expiresDays,\n })\n const keyData = res.data.data\n // Show full key in a separate \"done that\" modal\n onOpenKeyModal({ name: keyData.name, key: keyData.key })\n onGenerated(keyData)\n onClose()\n } catch (err: any) {\n setError(err?.response?.data?.error || 'Failed to generate key')\n } finally {\n setLoading(false)\n }\n }\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-[var(--z-bg-modal)] backdrop-blur-sm\">\n <div\n className={cn(\n 'w-full max-w-md border rounded-none-none shadow-2xl',\n theme === 'dark' ? 'bg-app border-z-border' : 'bg-z-panel border-z-border shadow-sm'\n )}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between px-8 py-6 border-b border-z-border\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-10 h-10 rounded-none-none bg-z-panel border border-z-border/20 flex items-center justify-center\">\n <Key size={18} className=\"text-z-secondary \" />\n </div>\n <span className=\"text-sm font-semibold tracking-wide\">\n Generate Access Token\n </span>\n </div>\n <button onClick={onClose} className=\"text-z-secondary hover:text-z-primary transition-colors\">\n <X size={18} />\n </button>\n </div>\n\n <form onSubmit={handleGenerate} className=\"px-8 py-6 space-y-6\">\n {/* Name */}\n <div className=\"space-y-2\">\n <label className=\"text-sm font-semibold text-z-secondary\">\n Token Name\n </label>\n <input\n type=\"text\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n required\n autoFocus\n placeholder=\"e.g. Production Relay\"\n className={cn(\n 'w-full border rounded-none-none py-4 px-5 text-[13px] font-semibold transition-all outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black',\n theme === 'dark'\n ? 'bg-z-hover border-z-border text-z-primary focus:border-z-border/50'\n : 'bg-z-input border-z-border focus:border-z-border'\n )}\n />\n </div>\n\n {/* Role */}\n <div className=\"space-y-2\">\n <label className=\"text-sm font-semibold text-z-secondary\">\n Permissions Tier\n </label>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-2\">\n {(['admin', 'editor', 'viewer'] as const).map((r) => (\n <button\n key={r}\n type=\"button\"\n onClick={() => setRole(r)}\n className={cn(\n 'py-3 text-sm font-semibold border rounded-none-none transition-all',\n role === r\n ? 'border-z-border/40 bg-z-panel text-z-secondary'\n : theme === 'dark'\n ? 'border-z-border text-z-secondary hover:border-z-border'\n : 'border-z-border text-z-muted hover:border-z-border-strong'\n )}\n >\n {r}\n </button>\n ))}\n </div>\n </div>\n\n {/* Expiry */}\n <div className=\"space-y-2\">\n <label className=\"text-sm font-semibold text-z-secondary\">\n Expires After (days)\n </label>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-2\">\n {[7, 30, 90, 365].map((d) => (\n <button\n key={d}\n type=\"button\"\n onClick={() => setExpiresDays(d)}\n className={cn(\n 'py-3 text-sm font-semibold border rounded-none-none transition-all',\n expiresDays === d\n ? 'border-z-border/40 bg-z-panel text-z-secondary'\n : theme === 'dark'\n ? 'border-z-border text-z-secondary hover:border-z-border'\n : 'border-z-border text-z-muted hover:border-z-border-strong'\n )}\n >\n {d}d\n </button>\n ))}\n </div>\n </div>\n\n {error && (\n <p className=\"text-sm text-red-500 font-semibold\">\n {error}\n </p>\n )}\n\n <button\n type=\"submit\"\n disabled={loading || !name.trim()}\n className={cn(\n 'w-full py-4 rounded-none-none text-sm font-semibold shadow-lg transition-all active:scale-95 disabled:opacity-40',\n theme === 'dark'\n ? 'bg-z-border hover:bg-z-accent text-z-primary'\n : 'bg-z-accent hover:brightness-110 text-z-primary'\n )}\n >\n {loading ? (\n <span className=\"flex items-center justify-center gap-2\">\n <Loader2 size={14} className=\"animate-spin\" />\n Generating...\n </span>\n ) : (\n 'Generate Token'\n )}\n </button>\n </form>\n\n <div className=\"px-8 pb-6\">\n <p className=\"text-sm text-z-secondary text-center\">\n Keys are shown only once · store securely\n </p>\n </div>\n </div>\n </div>\n )\n}\n\nexport default GenerateKeyModal\n","import React, { useState } from 'react'\nimport { Terminal, Code, Copy, Check, Info, Server, Database, Sparkles } from 'lucide-react'\nimport { cn } from '../../lib/utils'\n\ninterface ApiIntegrationGuideProps {\n theme: 'light' | 'dark'\n apiKeys: any[]\n}\n\nconst ApiIntegrationGuide: React.FC<ApiIntegrationGuideProps> = ({ theme, apiKeys }) => {\n const [activeLang, setActiveLang] = useState<'fetch' | 'curl' | 'axios'>('fetch')\n const [copied, setCopied] = useState(false)\n const activeSiteId = localStorage.getItem('activeSiteId') || '<YOUR_SITE_ID>'\n\n const baseUrl = window.location.origin\n \n const snippets = {\n fetch: `fetch('${baseUrl}/api/sites/${activeSiteId}/collections/posts/items', {\n headers: {\n 'Authorization': 'Bearer <YOUR_API_KEY>',\n 'X-Zenith-Site-Id': '${activeSiteId}'\n }\n})\n.then(res => res.json())\n.then(data => console.log(data));`,\n curl: `curl -X GET '${baseUrl}/api/sites/${activeSiteId}/collections/posts/items' \\\\\n -H 'Authorization: Bearer <YOUR_API_KEY>' \\\\\n -H 'X-Zenith-Site-Id: ${activeSiteId}'`,\n axios: `import axios from 'axios';\n\naxios.get('${baseUrl}/api/sites/${activeSiteId}/collections/posts/items', {\n headers: {\n 'Authorization': 'Bearer <YOUR_API_KEY>',\n 'X-Zenith-Site-Id': '${activeSiteId}'\n }\n}).then(response => console.log(response.data));`\n }\n\n const handleCopy = () => {\n navigator.clipboard.writeText(snippets[activeLang])\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n }\n\n return (\n <div className=\"mt-12 pt-12 border-t border-z-border space-y-8\">\n <div className=\"flex flex-col gap-2\">\n <h3 className=\"text-xl font-semibold flex items-center gap-3\">\n <Terminal className=\"text-z-secondary \" size={24} />\n Developer Integration Guide\n </h3>\n <p className=\"text-sm text-z-secondary font-bold max-w-2xl\">\n Everything you need to connect your frontend to Zenith CMS. Follow these steps to fetch your content dynamically.\n </p>\n </div>\n\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-6\">\n <div className={cn(\n \"p-6 border rounded-none-none relative overflow-hidden group\",\n theme === 'dark' ? \"bg-z-panel border-z-border\" : \"bg-z-input border-z-border\"\n )}>\n <div className=\"absolute top-0 right-0 p-4 opacity-10 group-hover:opacity-20 transition-opacity\">\n <Server size={48} />\n </div>\n <div className=\"w-10 h-10 bg-z-hover border-z-border-strong text-z-secondary flex items-center justify-center rounded-none-none mb-4 font-semibold\">1</div>\n <h4 className=\"text-[14px] font-semibold mb-2\">Generate a Key</h4>\n <p className=\"text-sm text-z-secondary font-medium leading-relaxed\">\n Create an API key above. Make sure to copy the secret key immediately, as it will only be shown once for security reasons.\n </p>\n </div>\n\n <div className={cn(\n \"p-6 border rounded-none-none relative overflow-hidden group\",\n theme === 'dark' ? \"bg-z-panel border-z-border\" : \"bg-z-input border-z-border\"\n )}>\n <div className=\"absolute top-0 right-0 p-4 opacity-10 group-hover:opacity-20 transition-opacity\">\n <Info size={48} />\n </div>\n <div className=\"w-10 h-10 bg-z-hover border-z-border-strong text-z-secondary flex items-center justify-center rounded-none-none mb-4 font-semibold\">2</div>\n <h4 className=\"text-[14px] font-semibold mb-2\">Site Identification</h4>\n <p className=\"text-sm text-z-secondary font-medium leading-relaxed\">\n Include the <strong>X-Zenith-Site-Id</strong> header in all your requests. Your current site ID is <code className=\"bg-app/20 px-1 py-0.5 rounded-none text-z-secondary \">{activeSiteId}</code>.\n </p>\n </div>\n\n <div className={cn(\n \"p-6 border rounded-none-none relative overflow-hidden group\",\n theme === 'dark' ? \"bg-z-panel border-z-border\" : \"bg-z-input border-z-border\"\n )}>\n <div className=\"absolute top-0 right-0 p-4 opacity-10 group-hover:opacity-20 transition-opacity\">\n <Database size={48} />\n </div>\n <div className=\"w-10 h-10 bg-z-hover border-z-border-strong text-z-secondary flex items-center justify-center rounded-none-none mb-4 font-semibold\">3</div>\n <h4 className=\"text-[14px] font-semibold mb-2\">Fetch Collections</h4>\n <p className=\"text-sm text-z-secondary font-medium leading-relaxed\">\n Query the endpoints to retrieve your data. Replace <code>posts</code> in the URL with the name of your specific collection.\n </p>\n </div>\n </div>\n\n <div className={cn(\n \"border rounded-none-none overflow-hidden mt-8\",\n theme === 'dark' ? \"bg-[#0A0A0A] border-z-border\" : \"bg-z-accent border-z-border\"\n )}>\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-z-border bg-z-panel\">\n <div className=\"flex items-center gap-2\">\n {(['fetch', 'curl', 'axios'] as const).map(lang => (\n <button\n key={lang}\n onClick={() => setActiveLang(lang)}\n className={cn(\n \"px-4 py-1.5 text-sm font-semibold rounded-none-none transition-all\",\n activeLang === lang \n ? \"bg-z-hover border-z-border-strong text-z-secondary border border-z-border/30\" \n : \"text-z-secondary hover:text-z-secondary border border-transparent\"\n )}\n >\n {lang}\n </button>\n ))}\n </div>\n <button\n onClick={handleCopy}\n className=\"text-z-muted hover:text-z-primary transition-colors flex items-center gap-2 text-sm font-bold\"\n >\n {copied ? <Check size={14} className=\"text-z-secondary \" /> : <Copy size={14} />}\n {copied ? 'Copied!' : 'Copy Code'}\n </button>\n </div>\n <div className=\"p-6 overflow-x-auto\">\n <pre className=\"text-[13px] text-z-secondary font-mono leading-relaxed\">\n <code dangerouslySetInnerHTML={{\n __html: snippets[activeLang]\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/'(.*?)'/g, '<span class=\"text-z-secondary\">\\'$1\\'</span>')\n .replace(/<YOUR_API_KEY>/g, '<span class=\"text-amber-400 font-bold\"><YOUR_API_KEY></span>')\n }} />\n </pre>\n </div>\n </div>\n\n <div className={cn(\n \"p-6 border-l-4 border-z-border bg-z-hover mt-6\",\n theme === 'dark' ? \"text-z-primary\" : \"text-z-primary\"\n )}>\n <h4 className=\"flex items-center gap-2 text-[14px] font-semibold mb-2 text-z-secondary \">\n <Sparkles size={16} />\n Pro Tip for Next.js / React Users\n </h4>\n <p className=\"text-sm font-medium leading-relaxed opacity-80\">\n Never expose your API keys in the browser! Always make calls to Zenith CMS from a secure environment like Next.js API Routes, Server Actions, or getServerSideProps. Use environment variables (e.g., <code>process.env.ZENITH_API_KEY</code>) to store your keys safely.\n </p>\n </div>\n </div>\n )\n}\n\nexport default ApiIntegrationGuide\n","import React, { useState } from 'react'\nimport {\n Key, Shield, Loader2, Copy, Check, Clock, Calendar,\n Plus, Trash2, Eye, EyeOff, AlertTriangle, ExternalLink,\n Activity, Globe, ChevronRight, Info\n} from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport api from '../../lib/api'\nimport toast from 'react-hot-toast'\nimport EmptyState from '../../components/EmptyState'\nimport GenerateKeyModal from './GenerateKeyModal'\nimport ApiIntegrationGuide from './ApiIntegrationGuide'\n\ninterface ApiKey {\n _id: string\n name: string\n role: string\n expiresAt: string | number | Date\n createdAt?: string\n lastUsed?: string\n usageCount?: number\n permissions?: Array<{ resource: string; actions: string[] }>\n [key: string]: any\n}\n\ninterface SettingsApiKeysProps {\n apiKeys: ApiKey[]\n theme: 'light' | 'dark'\n fetchData: () => void\n setNewKey: (k: any) => void\n}\n\nfunction getDaysUntilExpiry(expiresAt: string | number | Date): number | null {\n if (!expiresAt) return null\n const exp = new Date(expiresAt).getTime()\n const now = Date.now()\n return Math.ceil((exp - now) / (1000 * 60 * 60 * 24))\n}\n\nfunction ExpiryBadge({ expiresAt, dark }: { expiresAt: string | number | Date; dark: boolean }) {\n const days = getDaysUntilExpiry(expiresAt)\n if (days === null) return null\n if (days < 0) return (\n <span className=\"text-sm font-semibold px-2 py-0.5 border border-red-500/30 bg-red-500/10 text-red-400 flex items-center gap-1\">\n <AlertTriangle size={8} /> Expired\n </span>\n )\n if (days <= 7) return (\n <span className=\"text-sm font-semibold px-2 py-0.5 border border-amber-500/30 bg-amber-500/10 text-amber-400\">\n {days}d left\n </span>\n )\n if (days <= 30) return (\n <span className=\"text-sm font-semibold px-2 py-0.5 border border-yellow-500/30 bg-yellow-500/10 text-yellow-400\">\n {days}d\n </span>\n )\n return (\n <span className=\"text-sm font-semibold px-2 py-0.5 border border-z-active-border bg-z-active-bg text-z-active-text\">\n {days}d\n </span>\n )\n}\n\nconst ROLE_COLORS: Record<string, string> = {\n admin: 'text-red-400 border-red-500/30 bg-red-500/10',\n editor: 'text-amber-400 border-amber-500/30 bg-amber-500/10',\n viewer: 'text-z-active-text border-z-active-border bg-z-active-bg',\n}\n\nconst SettingsApiKeys: React.FC<SettingsApiKeysProps> = ({ apiKeys, theme, fetchData, setNewKey }) => {\n const dark = theme === 'dark'\n const [generateOpen, setGenerateOpen] = useState(false)\n const [revokingId, setRevokingId] = useState<string | null>(null)\n const [copiedId, setCopiedId] = useState<string | null>(null)\n const [expandedId, setExpandedId] = useState<string | null>(null)\n\n const handleRevokeKey = async (id: string) => {\n setRevokingId(id)\n try {\n await api.post(`/system/api-keys/${id}/revoke`)\n toast.success('Token revoked')\n fetchData()\n } catch (err: any) {\n toast.error(err?.response?.data?.error || 'Failed to revoke token')\n } finally {\n setRevokingId(null)\n }\n }\n\n const handleCopyId = (id: string) => {\n navigator.clipboard.writeText(id)\n setCopiedId(id)\n setTimeout(() => setCopiedId(null), 2000)\n toast.success('Key ID copied')\n }\n\n const card = cn(\n 'border rounded-none transition-all shadow-sm group',\n dark ? 'bg-z-panel backdrop-blur-md border-z-border hover:border-z-active-border' : 'bg-z-input border-z-border shadow-sm hover:border-z-active-border'\n )\n\n return (\n <>\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between px-1\">\n <div className=\"flex items-center gap-3\">\n <span className={cn('text-sm font-semibold ', 'text-z-secondary')}>\n {apiKeys.length} Active {apiKeys.length === 1 ? 'Credential' : 'Credentials'}\n </span>\n {apiKeys.some(k => getDaysUntilExpiry(k.expiresAt) !== null && getDaysUntilExpiry(k.expiresAt)! <= 7) && (\n <span className=\"flex items-center gap-1 text-sm text-amber-400 font-semibold\">\n <AlertTriangle size={10} /> Expiring Soon\n </span>\n )}\n </div>\n <button\n onClick={() => setGenerateOpen(true)}\n className={cn('flex items-center gap-2 text-sm font-semibold border px-5 py-2.5 transition-all', dark ? 'border-z-active-border text-z-active-text hover:bg-z-active-bg hover:border-z-accent' : 'border-z-active-border text-z-accent hover:bg-z-active-bg')}\n >\n <Plus size={13} />\n Generate Token\n </button>\n </div>\n\n {/* Key Cards */}\n {apiKeys.length === 0 ? (\n <div className={cn('py-10 border border-dashed', 'border-z-border')}>\n <EmptyState\n icon={Key}\n title=\"No API keys\"\n message=\"Generate an API key to authenticate external applications against the Zenith CMS API\"\n action={\n <button onClick={() => setGenerateOpen(true)} className={cn('flex items-center gap-2 px-6 py-3 text-sm font-semibold border transition-all', dark ? 'border-z-active-border text-z-active-text hover:bg-z-active-bg' : 'border-z-active-border text-z-accent hover:bg-z-active-bg')}>\n <Plus size={12} /> Generate Token\n </button>\n }\n />\n </div>\n ) : (\n <div className=\"space-y-3\">\n {apiKeys.map(key => {\n const isExpanded = expandedId === key._id\n const days = getDaysUntilExpiry(key.expiresAt)\n const roleClass = ROLE_COLORS[key.role] || 'text-z-muted border-z-border bg-z-hover'\n return (\n <div key={key._id} className={card}>\n {/* Header */}\n <div\n className=\"flex items-center gap-4 px-5 py-4 cursor-pointer\"\n onClick={() => setExpandedId(isExpanded ? null : key._id)}\n >\n <div className={cn('w-12 h-12 flex items-center justify-center border flex-shrink-0', dark ? 'bg-z-active-bg text-z-active-text border-z-active-border' : 'bg-z-active-bg text-z-accent border-z-active-border')}>\n <Key size={20} />\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className={cn('text-[13px] font-semibold ', 'text-z-primary')}>{key.name}</span>\n <span className={cn('text-sm font-semibold px-2 py-0.5 border', roleClass)}>{key.role}</span>\n <ExpiryBadge expiresAt={key.expiresAt} dark={dark} />\n </div>\n <div className=\"flex items-center gap-3 mt-1.5 flex-wrap\">\n <span className=\"text-sm text-z-secondary flex items-center gap-1\">\n <Calendar size={9} />\n Expires {new Date(key.expiresAt).toLocaleDateString()}\n </span>\n {key.lastUsed && (\n <span className=\"text-sm text-z-secondary flex items-center gap-1\">\n <Activity size={9} />\n Last used {new Date(key.lastUsed).toLocaleDateString()}\n </span>\n )}\n {key.usageCount !== undefined && (\n <span className=\"text-sm text-z-secondary flex items-center gap-1\">\n <Globe size={9} />\n {key.usageCount} requests\n </span>\n )}\n </div>\n </div>\n <div className=\"flex items-center gap-2 opacity-0 group-hover:opacity-100 transition-opacity\">\n <button\n onClick={e => { e.stopPropagation(); handleCopyId(key._id) }}\n className={cn('p-2.5 transition-colors', dark ? 'text-z-secondary hover:text-z-active-text' : 'text-z-muted hover:text-z-accent')}\n title=\"Copy key ID\"\n >\n {copiedId === key._id ? <Check size={15} className=\"text-z-active-text\" /> : <Copy size={15} />}\n </button>\n <button\n onClick={e => { e.stopPropagation(); handleRevokeKey(key._id) }}\n disabled={revokingId === key._id}\n className={cn('p-2.5 transition-colors disabled:opacity-30', dark ? 'text-z-secondary hover:text-red-400' : 'text-z-muted hover:text-red-600')}\n title=\"Revoke token\"\n >\n {revokingId === key._id ? <Loader2 size={15} className=\"animate-spin\" /> : <Trash2 size={15} />}\n </button>\n <ChevronRight size={14} className={cn('text-z-secondary transition-transform', isExpanded && 'rotate-90')} />\n </div>\n </div>\n\n {/* Expanded Detail */}\n {isExpanded && (\n <div className=\"px-5 pb-5 pt-3 border-t space-y-4\" style={{ borderColor: 'var(--z-border)' }}>\n {/* Key ID */}\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-semibold text-z-secondary\">Key ID (prefix)</label>\n <div className=\"flex items-center gap-2\">\n <code className={cn('flex-1 font-mono text-sm px-3 py-2 border truncate', 'bg-z-panel border-z-border text-z-primary')}>\n {key._id}\n </code>\n <button onClick={() => handleCopyId(key._id)} className={cn('p-2 border transition-all', dark ? 'border-z-border text-z-secondary hover:text-z-primary' : 'border-z-border text-z-secondary')}>\n {copiedId === key._id ? <Check size={13} className=\"text-z-active-text\" /> : <Copy size={13} />}\n </button>\n </div>\n </div>\n\n {/* Permissions */}\n {key.permissions && key.permissions.length > 0 && (\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-semibold text-z-secondary\">Granted Permissions</label>\n <div className=\"flex flex-wrap gap-1.5\">\n {key.permissions.map((perm: any, i: number) => (\n <span key={i} className={cn('text-sm font-semibold px-2 py-1 border', dark ? 'bg-z-hover border-z-border text-z-muted' : 'bg-z-input border-z-border text-z-secondary')}>\n {perm.resource}: {perm.actions.join(', ')}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {/* Usage example */}\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-semibold text-z-secondary\">Usage Example</label>\n <pre className={cn('text-sm font-mono p-3 border overflow-x-auto', 'bg-z-input border-z-border text-z-primary')}>\n{`curl https://api.example.com/api/v1/posts \\\\\n -H \"Authorization: Bearer YOUR_KEY\"`}\n </pre>\n </div>\n </div>\n )}\n </div>\n )\n })}\n </div>\n )}\n\n <ApiIntegrationGuide theme={theme} apiKeys={apiKeys} />\n </div>\n\n {generateOpen && (\n <GenerateKeyModal\n onClose={() => setGenerateOpen(false)}\n onGenerated={keyData => {\n setNewKey(keyData)\n fetchData()\n }}\n onOpenKeyModal={setNewKey}\n theme={theme}\n />\n )}\n </>\n )\n}\n\nexport default SettingsApiKeys\n","import React, { useState, useEffect, useCallback } from 'react'\nimport {\n HardDrive, Layers, Activity, Trash2, RefreshCw, Scan, Loader2,\n Database, Archive, Clock, TrendingUp, AlertTriangle, CheckCircle2,\n Download, Server, Zap, BarChart3, Cpu, Network, FileCode, Terminal\n} from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport api from '../../lib/api'\nimport { useTenantStore } from '../../lib/tenantStore'\nimport toast from 'react-hot-toast'\n\ninterface DBStats {\n size?: number\n storageSize?: number\n freeStorageSize?: number\n documents?: number\n indexes?: number\n avgObjSize?: number\n collections?: number | string\n dbName?: string\n dbVersion?: string\n connections?: number\n adapterType?: string\n collectionDetails?: Array<{ name: string; count: number; sizeMB: string; avgDocSizeB: number; indexes: number }>\n platform?: string\n nodeVersion?: string\n pid?: number\n [key: string]: any\n}\n\ninterface Backup {\n id: string\n filename: string\n size: number\n createdAt: string\n status: 'ready' | 'processing' | 'failed'\n}\n\ninterface SettingsDatabaseProps {\n dbStats: DBStats | null\n theme: 'light' | 'dark'\n}\n\nconst SettingsDatabase: React.FC<SettingsDatabaseProps> = ({ dbStats, theme }) => {\n const dark = theme === 'dark'\n const [sweeping, setSweeping] = useState(false)\n const [testing, setTesting] = useState(false)\n const [creatingBackup, setCreatingBackup] = useState(false)\n const [dbUri, setDbUri] = useState('')\n const [dbDialect, setDbDialect] = useState<'postgres' | 'mongodb'>('mongodb')\n const [backups, setBackups] = useState<Backup[]>([])\n const [backupsLoading, setBackupsLoading] = useState(false)\n const [showBackups, setShowBackups] = useState(false)\n const [slowQueries, setSlowQueries] = useState<any[]>([])\n const [slowQueriesLoading, setSlowQueriesLoading] = useState(false)\n\n const fetchBackups = useCallback(async () => {\n setBackupsLoading(true)\n try {\n const res = await api.get('/system/backup/list')\n setBackups(res.data?.data || [])\n } catch {\n setBackups([])\n } finally {\n setBackupsLoading(false)\n }\n }, [])\n\n const fetchSlowQueries = useCallback(async () => {\n setSlowQueriesLoading(true)\n try {\n const res = await api.get('/system/db/slow-queries')\n setSlowQueries(res.data?.data || [])\n } catch {\n setSlowQueries([])\n } finally {\n setSlowQueriesLoading(false)\n }\n }, [])\n\n useEffect(() => {\n if (showBackups) fetchBackups()\n }, [showBackups, fetchBackups])\n\n const handleMediaSweep = async () => {\n setSweeping(true)\n try {\n const res = await api.post<any>('/system/media/sweep', { pruneUnreferencedMedia: true })\n const result = res.data.data\n toast.success(`Swept ${result.removed || 0} orphans · ${result.retained || 0} retained`)\n } catch (err: any) {\n toast.error(err?.response?.data?.error || 'Sweep failed')\n } finally {\n setSweeping(false)\n }\n }\n\n const handleFlushCache = async () => {\n setSweeping(true)\n try {\n await api.post('/system/cache/flush')\n toast.success('Cache flushed')\n } catch (err: any) {\n toast.error(err?.response?.data?.error || 'Failed to flush cache')\n } finally {\n setSweeping(false)\n }\n }\n\n const handleTestConnection = async (e: React.FormEvent) => {\n e.preventDefault()\n if (!dbUri.trim()) return\n setTesting(true)\n try {\n await api.post('/system/db/test-connection', { uri: dbUri, dialect: dbDialect })\n toast.success('Connection verified')\n } catch (err: any) {\n toast.error(err?.response?.data?.error || 'Connection failed')\n } finally {\n setTesting(false)\n }\n }\n\n const handleCreateBackup = async () => {\n setCreatingBackup(true)\n try {\n await api.post('/system/backup/create')\n toast.success('Backup created')\n fetchBackups()\n } catch (err: any) {\n toast.error(err?.response?.data?.error || 'Backup failed')\n } finally {\n setCreatingBackup(false)\n }\n }\n\n const handleDownloadBackup = async (backup: Backup) => {\n try {\n // Use fetch directly for blob download since api instance does not support responseType\n const token = useTenantStore.getState().token || ''\n const siteId = useTenantStore.getState().activeSiteId || ''\n const apiBase = (import.meta.env.VITE_API_URL || '').replace('/api/v1', '')\n const res = await fetch(`${apiBase}/api/v1/system/backup/download/${backup.id}`, {\n headers: {\n ...(token ? { Authorization: `Bearer ${token}` } : {}),\n ...(siteId ? { 'x-zenith-site-id': siteId } : {}),\n }\n })\n if (!res.ok) throw new Error('Download 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 = backup.filename\n a.click()\n } catch {\n toast.error('Download failed')\n }\n }\n\n const sizeMB = dbStats?.size ? (dbStats.size / 1024 / 1024).toFixed(2) : '0.00'\n const storageMB = dbStats?.storageSize ? (dbStats.storageSize / 1024 / 1024).toFixed(2) : '0.00'\n const freeMB = dbStats?.freeStorageSize ? (dbStats.freeStorageSize / 1024 / 1024).toFixed(2) : null\n const collections = dbStats?.collections || '0'\n const documents = dbStats?.documents || 0\n const indexes = dbStats?.indexes || 0\n const avgObjSize = dbStats?.avgObjSize || 0\n const collDetails = dbStats?.collectionDetails || []\n\n const topStats = [\n { label: 'Data Size', value: `${sizeMB} MB`, icon: HardDrive, color: 'text-z-active-text', bg: 'bg-z-active-bg', border: 'border-z-active-border' },\n { label: 'Storage Used', value: `${storageMB} MB`, icon: HardDrive, color: 'text-pink-400', bg: 'bg-pink-500/10', border: 'border-pink-500/20' },\n { label: 'Collections', value: String(collections), icon: Layers, color: 'text-z-active-text', bg: 'bg-z-accent/10', border: 'border-z-accent/20' },\n { label: 'Documents', value: Number(documents).toLocaleString(), icon: Database, color: 'text-sky-400', bg: 'bg-sky-500/10', border: 'border-sky-500/20' },\n { label: 'Total Indexes', value: String(indexes), icon: BarChart3, color: 'text-amber-400', bg: 'bg-amber-500/10', border: 'border-amber-500/20' },\n { label: 'Avg Doc Size', value: avgObjSize ? `${avgObjSize} B` : '—', icon: Zap, color: 'text-violet-400', bg: 'bg-violet-500/10', border: 'border-violet-500/20' },\n ]\n\n const card = cn(\n 'border rounded-none transition-all',\n dark ? 'bg-z-panel backdrop-blur-md border-z-border shadow-sm' : 'bg-z-input border-z-border shadow-sm'\n )\n\n const inp = cn(\n 'border rounded-none py-3 px-4 text-sm font-mono transition-all outline-none focus:ring-1 focus:ring-z-active-border focus:border-z-accent',\n dark ? 'bg-app/80 border-z-border text-z-primary placeholder:text-z-primary' : 'bg-z-panel border-z-border'\n )\n\n return (\n <div className=\"space-y-6\">\n\n {/* ── Technical Identity ─────────────────────────────────── */}\n <div className={cn(card, 'p-5')}>\n <p className=\"text-sm font-semibold text-z-secondary mb-4 flex items-center gap-2\">\n <Server size={13} /> Database Identity\n </p>\n <div className=\"grid grid-cols-2 md:grid-cols-3 gap-x-8 gap-y-3\">\n {[\n { label: 'Adapter', value: dbStats?.adapterType || '—' },\n { label: 'Database', value: dbStats?.dbName || '—' },\n { label: 'Server Ver.', value: dbStats?.dbVersion || '—' },\n { label: 'Connections', value: dbStats?.connections != null ? String(dbStats.connections) : '—' },\n { label: 'Free Storage', value: freeMB ? `${freeMB} MB` : '—' },\n { label: 'Platform', value: dbStats?.platform || '—' },\n { label: 'Node.js', value: dbStats?.nodeVersion || '—' },\n { label: 'Process PID', value: dbStats?.pid ? String(dbStats.pid) : '—' },\n ].map(({ label, value }) => (\n <div key={label}>\n <p className=\"text-xs font-semibold text-z-secondary uppercase tracking-wide\">{label}</p>\n <p className=\"text-sm font-mono font-semibold text-z-primary mt-0.5\">{value}</p>\n </div>\n ))}\n </div>\n </div>\n\n {/* ── Stat Cards ─────────────────────────────────────────── */}\n <div className=\"grid grid-cols-2 md:grid-cols-3 gap-3\">\n {topStats.map((stat, i) => (\n <div key={i} className={cn(card, 'p-5 flex flex-col gap-3')}>\n <div className=\"flex items-center justify-between\">\n <div className={cn('w-9 h-9 flex items-center justify-center border', stat.bg, stat.border)}>\n <stat.icon size={16} className={stat.color} />\n </div>\n <span className=\"text-xs font-semibold text-emerald-400 flex items-center gap-1\">\n <span className=\"w-1.5 h-1.5 rounded-full bg-emerald-400 animate-pulse inline-block\" />\n Live\n </span>\n </div>\n <div>\n <p className=\"text-xs font-semibold text-z-secondary uppercase tracking-wide\">{stat.label}</p>\n <p className=\"text-xl font-semibold mt-1 text-z-primary tabular-nums\">{stat.value}</p>\n </div>\n </div>\n ))}\n </div>\n\n {/* ── Per-Collection Breakdown ───────────────────────────── */}\n {collDetails.length > 0 && (\n <div className={cn(card, 'overflow-hidden')}>\n <div className=\"flex items-center gap-2 p-4 border-b\" style={{ borderColor: 'var(--z-border)' }}>\n <Terminal size={13} className=\"text-z-secondary\" />\n <p className=\"text-sm font-semibold text-z-primary\">Collection Breakdown</p>\n <span className=\"ml-auto text-xs text-z-secondary\">{collDetails.length} collections</span>\n </div>\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-xs\">\n <thead>\n <tr className={cn('border-b', dark ? 'bg-z-hover border-z-border' : 'bg-z-input border-z-border')}>\n {['Collection', 'Docs', 'Size (MB)', 'Avg Doc', 'Indexes'].map(h => (\n <th key={h} className=\"text-left px-4 py-2.5 font-semibold text-z-secondary uppercase tracking-wide\">{h}</th>\n ))}\n </tr>\n </thead>\n <tbody className=\"divide-y\" style={{ borderColor: 'var(--z-border)' }}>\n {collDetails.map((c) => (\n <tr key={c.name} className={cn('transition-colors', dark ? 'hover:bg-z-hover/40' : 'hover:bg-z-input/60')}>\n <td className=\"px-4 py-2.5 font-mono font-semibold text-z-primary\">\n {c.name.startsWith('z_') ? (\n <span className=\"text-z-secondary\">{c.name}</span>\n ) : c.name}\n </td>\n <td className=\"px-4 py-2.5 tabular-nums text-z-primary\">{c.count.toLocaleString()}</td>\n <td className=\"px-4 py-2.5 tabular-nums text-z-primary\">{c.sizeMB}</td>\n <td className=\"px-4 py-2.5 tabular-nums text-z-secondary\">{c.avgDocSizeB > 0 ? `${c.avgDocSizeB} B` : '—'}</td>\n <td className=\"px-4 py-2.5 tabular-nums\">\n <span className={cn('px-1.5 py-0.5 border font-mono', 'text-amber-400 border-amber-500/20 bg-amber-500/10')}>{c.indexes}</span>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n )}\n\n {/* Test Connection */}\n <div className={cn(card, 'p-6 space-y-4')}>\n <p className=\"text-sm font-semibold text-z-secondary\">Test New Connection</p>\n <form onSubmit={handleTestConnection} className=\"flex flex-wrap gap-3 items-end\">\n <div className=\"flex-1 min-w-[200px] space-y-1\">\n <label className=\"text-sm font-semibold text-z-secondary\">Connection URI</label>\n <input\n type=\"text\"\n value={dbUri}\n onChange={e => setDbUri(e.target.value)}\n placeholder=\"postgres://user:pass@host:5432/db or mongodb://...\"\n className={cn(inp, 'w-full')}\n />\n </div>\n <div className=\"space-y-1\">\n <label className=\"text-sm font-semibold text-z-secondary\">Dialect</label>\n <div className=\"flex gap-2\">\n {(['postgres', 'mongodb'] as const).map(d => (\n <button key={d} type=\"button\" onClick={() => setDbDialect(d)}\n className={cn('px-4 py-3 text-sm font-semibold border transition-all',\n dbDialect === d ? dark ? 'border-z-accent/50 bg-z-accent/20 text-z-active-text' : 'border-z-active-border bg-z-active-bg text-z-accent' : dark ? 'border-z-border text-z-secondary' : 'border-z-border text-z-muted')}>\n {d}\n </button>\n ))}\n </div>\n </div>\n <button type=\"submit\" disabled={testing || !dbUri.trim()}\n className={cn('px-6 py-3 text-sm font-semibold border transition-all disabled:opacity-40 flex items-center gap-2',\n dark ? 'bg-z-accent border-transparent text-z-primary hover:opacity-90 shadow-sm' : 'bg-z-accent border-transparent text-z-primary hover:brightness-110')}>\n {testing ? <Loader2 size={12} className=\"animate-spin\" /> : <RefreshCw size={12} />}\n Validate\n </button>\n </form>\n </div>\n\n {/* Backup Manager */}\n <div className={cn(card, 'overflow-hidden')}>\n <div className=\"flex items-center justify-between p-5\">\n <div className=\"flex items-center gap-3\">\n <Archive size={16} className=\"text-z-secondary\" />\n <div>\n <p className={cn('text-sm font-semibold ', dark ? 'text-z-primary' : 'text-z-primary')}>Database Backups</p>\n <p className=\"text-sm text-z-secondary\">Create and restore database snapshots</p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <button onClick={() => { setShowBackups(!showBackups) }}\n className={cn('text-sm font-semibold px-3 py-2 border transition-all', dark ? 'border-z-border text-z-muted hover:text-z-primary' : 'border-z-border text-z-secondary')}>\n {showBackups ? 'Hide' : 'View'} Backups\n </button>\n <button onClick={handleCreateBackup} disabled={creatingBackup}\n className={cn('flex items-center gap-2 px-4 py-2 text-sm font-semibold border transition-all disabled:opacity-40',\n dark ? 'bg-z-active-bg border-z-active-border text-z-active-text hover:bg-z-active-bg' : 'bg-z-active-bg border-z-active-border text-z-accent')}>\n {creatingBackup ? <Loader2 size={11} className=\"animate-spin\" /> : <Archive size={11} />}\n Create Backup\n </button>\n </div>\n </div>\n {showBackups && (\n <div className=\"border-t\" style={{ borderColor: 'var(--z-border)' }}>\n {backupsLoading ? (\n <div className=\"flex items-center justify-center py-8\">\n <Loader2 size={20} className=\"text-z-active-text animate-spin\" />\n </div>\n ) : backups.length === 0 ? (\n <div className=\"py-8 text-center\">\n <p className=\"text-sm text-z-secondary\">No backups yet — create one above</p>\n </div>\n ) : (\n <div className=\"divide-y\" style={{ borderColor: 'var(--z-border)' }}>\n {backups.map(b => (\n <div key={b.id} className=\"flex items-center gap-4 px-5 py-3\">\n <Archive size={14} className=\"text-z-secondary shrink-0\" />\n <div className=\"flex-1\">\n <p className={cn('text-sm font-semibold', dark ? 'text-z-primary' : 'text-z-primary')}>{b.filename}</p>\n <p className=\"text-sm text-z-secondary\">{new Date(b.createdAt).toLocaleString()} · {(b.size / 1024 / 1024).toFixed(2)} MB</p>\n </div>\n <span className={cn('text-sm font-semibold px-2 py-0.5 border', b.status === 'ready' ? 'text-z-active-text border-z-active-border bg-z-active-bg' : b.status === 'processing' ? 'text-amber-400 border-amber-500/30 bg-amber-500/10' : 'text-red-400 border-red-500/30 bg-red-500/10')}>\n {b.status}\n </span>\n {b.status === 'ready' && (\n <button onClick={() => handleDownloadBackup(b)} className={cn('p-2 transition-colors', dark ? 'text-z-secondary hover:text-z-active-text' : 'text-z-muted hover:text-z-accent')}>\n <Download size={14} />\n </button>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n\n {/* Maintenance Actions */}\n <div className=\"space-y-2\">\n <p className=\"text-sm font-semibold text-z-secondary px-1\">Maintenance Actions</p>\n <div className=\"flex flex-wrap gap-3\">\n <button onClick={handleFlushCache} disabled={sweeping}\n className={cn('flex items-center gap-2 px-6 py-3.5 border text-sm font-semibold transition-all active:scale-95 disabled:opacity-40',\n dark ? 'bg-red-500/10 text-red-400 border-red-500/20 hover:bg-red-500/20' : 'bg-red-50 text-red-600 border-red-200 hover:bg-red-100')}>\n {sweeping ? <Loader2 size={13} className=\"animate-spin\" /> : <Trash2 size={13} />}\n Flush Cache\n </button>\n <button onClick={handleMediaSweep} disabled={sweeping}\n className={cn('flex items-center gap-2 px-6 py-3.5 border text-sm font-semibold transition-all active:scale-95 disabled:opacity-40',\n dark ? 'bg-z-active-bg text-z-active-text border-z-active-border hover:bg-z-active-bg' : 'bg-[var(--z-bg-hover)] text-z-primary border-z-border hover:bg-[var(--z-border)]')}>\n {sweeping ? <Loader2 size={13} className=\"animate-spin\" /> : <Scan size={13} />}\n Sweep Orphan Media\n </button>\n <button onClick={fetchSlowQueries} disabled={slowQueriesLoading}\n className={cn('flex items-center gap-2 px-6 py-3.5 border text-sm font-semibold transition-all active:scale-95 disabled:opacity-40',\n dark ? 'bg-amber-500/10 text-amber-400 border-amber-500/20 hover:bg-amber-500/20' : 'bg-amber-50 text-amber-700 border-amber-200 hover:bg-amber-100')}>\n {slowQueriesLoading ? <Loader2 size={13} className=\"animate-spin\" /> : <TrendingUp size={13} />}\n Analyze Slow Queries\n </button>\n </div>\n </div>\n\n {/* Slow Queries */}\n {slowQueries.length > 0 && (\n <div className={cn(card, 'overflow-hidden')}>\n <div className=\"p-4 border-b\" style={{ borderColor: 'var(--z-border)' }}>\n <p className=\"text-sm font-semibold text-amber-400\">Slow Query Analysis</p>\n </div>\n <div className=\"divide-y\" style={{ borderColor: 'var(--z-border)' }}>\n {slowQueries.slice(0, 5).map((q, i) => (\n <div key={i} className=\"flex items-center gap-4 px-5 py-3\">\n <AlertTriangle size={13} className=\"text-amber-400 shrink-0\" />\n <div className=\"flex-1 min-w-0\">\n <p className={cn('text-sm font-mono truncate', 'text-z-secondary')}>{q.query || q.command || 'Unknown query'}</p>\n <p className=\"text-sm text-z-secondary\">{q.collection || q.table}</p>\n </div>\n <span className=\"text-sm font-semibold text-amber-400 shrink-0\">{q.millis || q.duration}ms</span>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n )\n}\n\nexport default SettingsDatabase\n","import React, { useState, useEffect, useRef } from 'react'\nimport { X, PlusCircle, Loader2, Shield } from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport api from '../../lib/api'\nimport toast from 'react-hot-toast'\n\ninterface CreateRoleModalProps {\n onClose: () => void\n onCreated: (role: any) => void\n theme: 'light' | 'dark'\n}\n\nconst CreateRoleModal: React.FC<CreateRoleModalProps> = ({ onClose, onCreated, theme }) => {\n const [name, setName] = useState('')\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState('')\n const modalRef = useRef<HTMLDivElement>(null)\n\n // Native Escape to close and simple focus management\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose()\n }\n document.addEventListener('keydown', handleKeyDown)\n // Prevent scrolling behind modal\n document.body.style.overflow = 'hidden'\n return () => {\n document.removeEventListener('keydown', handleKeyDown)\n document.body.style.overflow = 'unset'\n }\n }, [onClose])\n\n const handleCreate = async (e: React.FormEvent) => {\n e.preventDefault()\n if (!name.trim()) return\n setError('')\n setLoading(true)\n try {\n const res = await api.post<any>('/roles', {\n roleName: name.trim(),\n description: '',\n permissions: [{ resource: '*', actions: ['read'] }],\n })\n onCreated(res.data.data)\n toast.success(`Role \"${name.trim()}\" created`)\n onClose()\n } catch (err: any) {\n setError(err?.response?.data?.error?.message || 'Failed to create role')\n } finally {\n setLoading(false)\n }\n }\n\n return (\n <div className=\"fixed inset-0 z-[100] flex items-center justify-center bg-[var(--z-bg-modal)] backdrop-blur-sm\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"create-role-title\">\n <div\n ref={modalRef}\n className={cn(\n 'w-full max-w-sm border rounded-none-none shadow-2xl',\n theme === 'dark' ? 'bg-app border-z-border' : 'bg-z-panel border-z-border shadow-sm'\n )}\n >\n <div className=\"flex items-center justify-between px-8 py-6 border-b border-z-border\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-10 h-10 rounded-none-none bg-z-panel border border-z-border/20 flex items-center justify-center\">\n <PlusCircle size={18} className=\"text-z-secondary \" />\n </div>\n <span id=\"create-role-title\" className=\"text-sm font-semibold tracking-wide\">\n New Custom Role\n </span>\n </div>\n <button onClick={onClose} aria-label=\"Close\" className=\"text-z-secondary hover:text-z-primary transition-colors\">\n <X size={18} />\n </button>\n </div>\n\n <form onSubmit={handleCreate} className=\"px-8 py-6 space-y-6\">\n <div className=\"space-y-2\">\n <label className=\"text-sm font-semibold text-z-secondary\">\n Role Name\n </label>\n <input\n type=\"text\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n required\n autoFocus\n placeholder=\"e.g. Content Manager\"\n className={cn(\n 'w-full border rounded-none-none py-4 px-5 text-[13px] font-semibold transition-all outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black',\n theme === 'dark'\n ? 'bg-z-hover border-z-border text-z-primary focus:border-z-border/50'\n : 'bg-z-input border-z-border focus:border-z-border'\n )}\n />\n </div>\n\n <div className=\"p-4 border border-amber-500/10 bg-amber-500/5 rounded-none-none\">\n <div className=\"flex items-start gap-3\">\n <Shield size={14} className=\"text-amber-500 mt-0.5 shrink-0\" />\n <p className=\"text-sm font-bold text-amber-400 leading-relaxed\">\n New roles start with read-only access on all resources. You can customize permissions after creation.\n </p>\n </div>\n </div>\n\n {error && (\n <p className=\"text-sm text-red-500 font-semibold\">\n {error}\n </p>\n )}\n\n <button\n type=\"submit\"\n disabled={loading || !name.trim()}\n className={cn(\n 'w-full py-4 rounded-none-none text-sm font-semibold shadow-lg transition-all active:scale-95 disabled:opacity-40',\n theme === 'dark'\n ? 'bg-z-border hover:bg-z-accent text-z-primary'\n : 'bg-z-accent hover:brightness-110 text-z-primary'\n )}\n >\n {loading ? (\n <span className=\"flex items-center justify-center gap-2\">\n <Loader2 size={14} className=\"animate-spin\" />\n Creating...\n </span>\n ) : (\n 'Create Role'\n )}\n </button>\n </form>\n </div>\n </div>\n )\n}\n\nexport default CreateRoleModal\n\n","import React, { useState } from 'react'\nimport { X, Trash2, Loader2, AlertTriangle } from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport api from '../../lib/api'\nimport toast from 'react-hot-toast'\n\ninterface DeleteRoleConfirmDialogProps {\n role: { _id: string; roleName: string }\n onClose: () => void\n onDeleted: () => void\n theme: 'light' | 'dark'\n}\n\nconst DeleteRoleConfirmDialog: React.FC<DeleteRoleConfirmDialogProps> = ({\n role, onClose, onDeleted, theme,\n}) => {\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState('')\n\n const handleDelete = async () => {\n setLoading(true)\n setError('')\n try {\n await api.delete(`/roles/${role.roleName}`)\n toast.success(`Role \"${role.roleName}\" deleted`)\n onDeleted()\n onClose()\n } catch (err: any) {\n setError(err?.response?.data?.error?.message || 'Failed to delete role')\n } finally {\n setLoading(false)\n }\n }\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-[var(--z-bg-modal)] backdrop-blur-sm\">\n <div\n className={cn(\n 'w-full max-w-sm border rounded-none-none shadow-2xl',\n theme === 'dark' ? 'bg-app border-red-500/10' : 'bg-z-panel border-red-100'\n )}\n >\n <div className=\"flex items-center justify-between px-8 py-6 border-b border-z-border\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-10 h-10 rounded-none-none bg-red-500/10 border border-red-500/20 flex items-center justify-center\">\n <AlertTriangle size={18} className=\"text-red-500\" />\n </div>\n <span className=\"text-sm font-semibold tracking-wide\">\n Delete Role\n </span>\n </div>\n <button onClick={onClose} className=\"text-z-secondary hover:text-z-primary transition-colors\">\n <X size={18} />\n </button>\n </div>\n\n <div className=\"px-8 py-6 space-y-5\">\n <p className=\"text-sm font-semibold text-z-secondary leading-relaxed\">\n Are you sure you want to delete{' '}\n <span className=\"text-z-primary\">\"{role.roleName}\"</span>? This action\n cannot be undone and any users assigned to this role will lose access.\n </p>\n\n {error && (\n <p className=\"text-sm text-red-500 font-semibold\">\n {error}\n </p>\n )}\n\n <div className=\"flex gap-3\">\n <button\n type=\"button\"\n onClick={onClose}\n disabled={loading}\n className={cn(\n 'flex-1 py-3.5 rounded-none-none text-sm font-semibold border transition-all active:scale-95 disabled:opacity-40',\n theme === 'dark'\n ? 'border-z-border text-z-muted hover:border-z-border hover:text-z-primary'\n : 'border-z-border text-z-secondary hover:border-z-border-strong'\n )}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={handleDelete}\n disabled={loading}\n className={cn(\n 'flex-1 py-3.5 rounded-none-none text-sm font-semibold shadow-lg transition-all active:scale-95 disabled:opacity-40 flex items-center justify-center gap-2',\n 'bg-red-500 hover:bg-red-600 text-z-primary shadow-sm/20'\n )}\n >\n {loading ? <Loader2 size={12} className=\"animate-spin\" /> : <Trash2 size={12} />}\n {loading ? 'Deleting...' : 'Delete'}\n </button>\n </div>\n </div>\n </div>\n </div>\n )\n}\n\nexport default DeleteRoleConfirmDialog\n","import React, { useState } from 'react'\nimport { Save, PlusCircle, Copy, Trash2, ChevronDown, ChevronRight, Eye, Edit3, Lock } from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport api from '../../lib/api'\nimport toast from 'react-hot-toast'\nimport CreateRoleModal from './CreateRoleModal'\nimport DeleteRoleConfirmDialog from './DeleteRoleConfirmDialog'\n\ntype FieldPermissionEntry = { read?: boolean; write?: boolean }\n\ninterface Role {\n _id: string\n roleName: string\n roleType: 'admin' | 'editor' | 'viewer' | 'custom'\n description: string\n isSystem: boolean\n permissions: Array<{\n resource: string\n actions: string[]\n fieldPermissions?: Record<string, FieldPermissionEntry>\n }>\n}\n\ninterface SettingsRolesProps {\n roles: Role[]\n setRoles: (r: Role[] | ((prev: Role[]) => Role[])) => void\n editingRole: Role | null\n setEditingRole: (r: Role | null) => void\n roleFilter: 'all' | 'system' | 'custom'\n setRoleFilter: (f: 'all' | 'system' | 'custom') => void\n healthData: any\n users: any[]\n theme: 'light' | 'dark'\n}\n\nconst SettingsRoles: React.FC<SettingsRolesProps> = ({\n roles, setRoles, editingRole, setEditingRole, roleFilter, setRoleFilter, healthData, users, theme,\n}) => {\n const [createOpen, setCreateOpen] = useState(false)\n const [deleteRole, setDeleteRole] = useState<Role | null>(null)\n const [expandedResource, setExpandedResource] = useState<string | null>(null)\n\n const filteredRoles = roleFilter === 'all' ? roles : roleFilter === 'system' ? roles.filter(r => r.isSystem) : roles.filter(r => !r.isSystem)\n\n const availableCollections = [\n { slug: '*', label: 'All Resources' },\n ...(healthData?.collections || []).map((c: any) => ({ slug: c.slug, label: c.label || c.slug })),\n ]\n\n const getCollectionFields = (collectionSlug: string): string[] => {\n if (collectionSlug === '*') return []\n const col = healthData?.collections?.find((c: any) => c.slug === collectionSlug)\n const fields: string[] = []\n const collect = (arr: any[]) => {\n for (const f of arr) {\n fields.push(f.name)\n if (f.fields?.length) collect(f.fields)\n }\n }\n if (col?.fields?.length) collect(col.fields)\n if (fields.length === 0) {\n return ['title', 'slug', 'status', 'publishedAt', 'createdAt', 'updatedAt', 'content', 'description', 'coverImage', 'author']\n }\n return [...new Set(fields)]\n }\n\n const updatePermission = (permIdx: number, patch: Partial<Role['permissions'][0]>) => {\n if (!editingRole || editingRole.isSystem) return\n const updated = [...editingRole.permissions]\n updated[permIdx] = { ...updated[permIdx], ...patch }\n setEditingRole({ ...editingRole, permissions: updated })\n }\n\n const updateFieldPermission = (permIdx: number, fieldName: string, patch: Partial<FieldPermissionEntry>) => {\n if (!editingRole || editingRole.isSystem) return\n const perm = editingRole.permissions[permIdx]\n const existing = perm.fieldPermissions || {}\n const fieldEntry = existing[fieldName] || {}\n const updated = {\n ...perm,\n fieldPermissions: {\n ...existing,\n [fieldName]: { ...fieldEntry, ...patch },\n },\n }\n const perms = [...editingRole.permissions]\n perms[permIdx] = updated\n setEditingRole({ ...editingRole, permissions: perms })\n }\n\n const clearFieldPermission = (permIdx: number, fieldName: string) => {\n if (!editingRole || editingRole.isSystem) return\n const perm = editingRole.permissions[permIdx]\n const existing = perm.fieldPermissions || {}\n const updated = { ...existing }\n delete updated[fieldName]\n const perms = [...editingRole.permissions]\n perms[permIdx] = { ...perm, fieldPermissions: updated }\n setEditingRole({ ...editingRole, permissions: perms })\n }\n\n const toggleField = (permIdx: number, fieldName: string, fieldPerm: FieldPermissionEntry | undefined, action: 'read' | 'write') => {\n if (fieldPerm?.[action]) {\n if (action === 'read' && fieldPerm?.write) {\n updateFieldPermission(permIdx, fieldName, { read: false })\n } else if (action === 'write' && fieldPerm?.read) {\n updateFieldPermission(permIdx, fieldName, { write: false })\n } else {\n clearFieldPermission(permIdx, fieldName)\n }\n } else {\n updateFieldPermission(permIdx, fieldName, { [action]: true })\n }\n }\n\n return (\n <div className=\"col-span-full space-y-6\">\n <div className=\"flex items-center justify-between border-b border-z-border pb-4\">\n <div className=\"flex flex-col\">\n <h3 className=\"text-sm font-semibold\">Roles & Permissions</h3>\n <span className=\"text-sm text-z-secondary font-bold mt-1\">\n Manage team access levels and granular resource permissions\n </span>\n </div>\n <button\n type=\"button\"\n onClick={() => setCreateOpen(true)}\n className=\"flex items-center gap-2 px-4 py-2 border border-z-active-border hover:border-z-accent hover:bg-z-active-bg text-sm font-semibold transition-all text-z-accent dark:text-z-active-text hover:text-z-primary\"\n >\n <PlusCircle size={12} />\n New Custom Role\n </button>\n </div>\n\n {/* Role type filter tabs */}\n <div className=\"flex items-center gap-1 border-b border-z-border pb-0\">\n {(['all', 'system', 'custom'] as const).map((filter) => (\n <button\n key={filter}\n type=\"button\"\n onClick={() => setRoleFilter(filter)}\n className={cn(\n 'px-4 py-2 text-sm font-semibold border-b-2 transition-all',\n roleFilter === filter ? 'border-z-border text-z-primary' : 'border-transparent text-z-secondary hover:text-z-primary'\n )}\n >\n {filter === 'all' ? `All (${roles.length})` : filter === 'system' ? `System (${roles.filter(r => r.isSystem).length})` : `Custom (${roles.filter(r => !r.isSystem).length})`}\n </button>\n ))}\n </div>\n\n <div className=\"grid grid-cols-1 xl:grid-cols-3 gap-8\">\n {/* Role list */}\n <div className=\"xl:col-span-1 space-y-3\">\n {filteredRoles.map((role) => (\n <div\n key={role._id}\n onClick={() => setEditingRole(role)}\n className={cn(\n 'p-4 border rounded-none flex items-center justify-between cursor-pointer transition-all shadow-sm',\n editingRole?._id === role._id\n ? 'bg-z-active-bg border-z-active-border'\n : theme === 'dark' ? 'bg-z-panel backdrop-blur-md border-z-border hover:border-z-active-border' : 'bg-z-input border-z-border'\n )}\n >\n <div className=\"flex flex-col leading-none gap-1.5\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-semibold text-z-primary\">{role.roleName}</span>\n {role.isSystem && (\n <span className=\"text-sm font-semibold px-1.5 py-0.5 border border-amber-500/30 text-amber-500\">SYSTEM</span>\n )}\n <span className={cn(\n 'text-sm font-semibold px-1.5 py-0.5 border',\n role.roleType === 'admin' ? 'border-red-500/30 text-red-400' :\n role.roleType === 'editor' ? 'border-z-border/30 text-z-secondary' :\n 'border-z-border text-z-secondary'\n )}>\n {role.roleType}\n </span>\n </div>\n <span className=\"text-sm font-bold text-z-secondary\">\n {role.permissions?.length || 0} rule{role.permissions?.length !== 1 ? 's' : ''}\n {role.description && ` · ${role.description.slice(0, 40)}`}\n </span>\n </div>\n {!role.isSystem && (\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n title=\"Clone role\"\n onClick={async (e) => {\n e.stopPropagation()\n try {\n const res = await api.post(`/roles/clone/${role._id}`)\n setRoles((prev: Role[]) => [...prev, res.data.data])\n toast.success(`Cloned as \"${res.data.data.roleName}\"`)\n } catch { toast.error('Failed to clone role') }\n }}\n className=\"text-z-secondary hover:text-z-secondary transition-colors\"\n >\n <Copy size={14} />\n </button>\n <button\n type=\"button\"\n title=\"Delete role\"\n onClick={(e) => {\n e.stopPropagation()\n setDeleteRole(role)\n }}\n className=\"text-z-secondary hover:text-red-400 transition-colors\"\n >\n <Trash2 size={14} />\n </button>\n </div>\n )}\n </div>\n ))}\n {filteredRoles.length === 0 && (\n <p className=\"text-sm text-z-secondary font-bold py-4\">No {roleFilter} roles found.</p>\n )}\n </div>\n\n {/* Permission editor */}\n <div className=\"xl:col-span-2\">\n {editingRole ? (\n <div className=\"space-y-6 p-6 border rounded-none shadow-sm transition-all bg-z-panel backdrop-blur-md border-z-border\">\n <div className=\"flex items-center justify-between border-b border-z-border pb-4\">\n <div className=\"flex flex-col\">\n <h4 className=\"text-xs font-semibold text-z-secondary\">{editingRole.roleName}</h4>\n {editingRole.description && (\n <span className=\"text-sm font-bold text-z-secondary mt-0.5\">{editingRole.description}</span>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n {!editingRole.isSystem && (\n <button\n type=\"button\"\n onClick={async () => {\n try {\n const res = await api.patch(`/roles/${editingRole._id}`, {\n roleName: editingRole.roleName,\n description: editingRole.description,\n permissions: editingRole.permissions,\n })\n setRoles((prev: Role[]) => prev.map(r => r._id === editingRole._id ? res.data.data : r))\n setEditingRole(res.data.data)\n toast.success('Permissions saved')\n } catch (err: any) {\n toast.error(err.response?.data?.error?.message || 'Failed to save')\n }\n }}\n className={cn(\"flex items-center gap-2 px-4 py-2 text-z-primary text-sm font-semibold transition-all\", 'bg-z-accent hover:brightness-110 shadow-sm text-z-logo-text')}\n >\n <Save size={12} />\n Save\n </button>\n )}\n </div>\n </div>\n\n {editingRole.isSystem && (\n <div className=\"p-3 border border-amber-500/20 bg-amber-500/5 text-[9.5px] font-bold text-amber-400\">\n System roles cannot be modified. Clone the role to customize its permissions.\n </div>\n )}\n\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-semibold text-z-muted\">Resource Permission Rules</span>\n {!editingRole.isSystem && (\n <button\n type=\"button\"\n onClick={() => setEditingRole({ ...editingRole, permissions: [...(editingRole.permissions || []), { resource: '*', actions: ['read'] }] })}\n className=\"text-sm font-semibold text-z-secondary hover:text-z-secondary flex items-center gap-1\"\n >\n <PlusCircle size={10} />\n Add Rule\n </button>\n )}\n </div>\n\n <div className=\"space-y-3\">\n {(editingRole.permissions || []).map((perm, permIdx) => (\n <div key={permIdx} className=\"border border-z-border bg-z-panel\">\n {/* Rule header */}\n <div className=\"p-4 flex flex-col gap-4\">\n <div className=\"flex items-center gap-3 flex-wrap\">\n <select\n disabled={editingRole.isSystem}\n value={perm.resource}\n onChange={(e) => {\n if (editingRole.isSystem) return\n const updated = [...editingRole.permissions]\n updated[permIdx] = { ...perm, resource: e.target.value }\n setEditingRole({ ...editingRole, permissions: updated })\n }}\n className={cn(\"text-sm font-semibold outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black py-1.5 px-3 rounded-none focus:border-z-accent disabled:opacity-50 border\", 'bg-z-input border-z-border text-z-primary')}\n >\n {availableCollections.map(c => (<option key={c.slug} value={c.slug}>{c.label}</option>))}\n </select>\n <div className=\"flex items-center gap-3 flex-wrap\">\n {['create', 'read', 'update', 'delete'].map((act) => {\n const checked = perm.actions.includes(act)\n return (\n <label key={act} className=\"flex items-center gap-1.5 cursor-pointer\">\n <input\n type=\"checkbox\"\n disabled={editingRole.isSystem}\n checked={checked}\n onChange={(e) => {\n if (editingRole.isSystem) return\n let next = [...perm.actions]\n if (e.target.checked) next.push(act)\n else next = next.filter(a => a !== act)\n const updated = [...editingRole.permissions]\n updated[permIdx] = { ...perm, actions: next }\n setEditingRole({ ...editingRole, permissions: updated })\n }}\n className=\"rounded-none-none border-z-border text-z-secondary focus:ring-0 bg-app cursor-pointer\"\n />\n <span className={cn('text-sm font-semibold ', checked ? 'text-z-secondary' : 'text-z-secondary')}>{act}</span>\n </label>\n )\n })}\n </div>\n </div>\n </div>\n\n {/* Field permissions */}\n {perm.resource !== '*' && (\n <div className=\"border-t border-z-border\">\n <button\n type=\"button\"\n disabled={editingRole.isSystem}\n onClick={() => setExpandedResource(expandedResource === `${editingRole._id}-${permIdx}` ? null : `${editingRole._id}-${permIdx}`)}\n className={cn(\n 'w-full flex items-center gap-2 px-4 py-2.5 text-sm font-semibold transition-all',\n theme === 'dark' ? 'hover:bg-z-hover text-z-muted hover:text-z-secondary' : 'hover:bg-[var(--z-bg-input)] text-z-secondary hover:text-z-primary',\n editingRole.isSystem && 'opacity-50 cursor-not-allowed'\n )}\n >\n {expandedResource === `${editingRole._id}-${permIdx}` ? <ChevronDown size={10} /> : <ChevronRight size={10} />}\n <Lock size={9} />\n Field-Level Access ({Object.keys(perm.fieldPermissions || {}).length} configured)\n </button>\n\n {expandedResource === `${editingRole._id}-${permIdx}` && (\n <div className=\"px-4 pb-4\">\n {(() => {\n const fields = getCollectionFields(perm.resource)\n return (\n <div className=\"space-y-2\">\n <div className=\"grid grid-cols-12 gap-2 border-b border-z-border pb-2\">\n <div className=\"col-span-4 text-sm font-semibold text-z-secondary\">Field</div>\n <div className=\"col-span-4 text-sm font-semibold text-z-secondary flex items-center gap-1 justify-center\"><Eye size={8} /> Read</div>\n <div className=\"col-span-4 text-sm font-semibold text-z-secondary flex items-center gap-1 justify-center\"><Edit3 size={8} /> Write</div>\n </div>\n {fields.map((field) => {\n const fp = perm.fieldPermissions?.[field]\n const readOn = fp?.read\n const writeOn = fp?.write\n return (\n <div key={field} className=\"grid grid-cols-12 gap-2 items-center py-1.5 border-b border-z-border last:border-0\">\n <div className=\"col-span-4\">\n <span className={cn(\n 'text-sm font-semibold ',\n (readOn || writeOn) ? 'text-z-secondary' : 'text-z-secondary'\n )}>\n {field}\n </span>\n </div>\n <div className=\"col-span-4 flex justify-center\">\n <button\n type=\"button\"\n disabled={editingRole.isSystem}\n onClick={() => toggleField(permIdx, field, fp, 'read')}\n className={cn(\n 'w-6 h-6 border rounded-none flex items-center justify-center transition-all',\n readOn\n ? 'bg-z-accent/20 border-z-active-border text-z-active-text'\n : 'bg-transparent border-z-border text-z-secondary hover:border-z-active-border hover:text-z-active-text',\n editingRole.isSystem && 'opacity-50 cursor-not-allowed'\n )}\n >\n {readOn && <Eye size={9} />}\n </button>\n </div>\n <div className=\"col-span-4 flex justify-center\">\n <button\n type=\"button\"\n disabled={editingRole.isSystem}\n onClick={() => toggleField(permIdx, field, fp, 'write')}\n className={cn(\n 'w-6 h-6 border rounded-none flex items-center justify-center transition-all',\n writeOn\n ? 'bg-z-accent/20 border-z-active-border text-z-active-text'\n : 'bg-transparent border-z-border text-z-secondary hover:border-z-active-border hover:text-z-active-text',\n editingRole.isSystem && 'opacity-50 cursor-not-allowed'\n )}\n >\n {writeOn && <Edit3 size={9} />}\n </button>\n </div>\n </div>\n )\n })}\n </div>\n )\n })()}\n </div>\n )}\n </div>\n )}\n </div>\n ))}\n {editingRole.permissions?.length === 0 && (\n <p className=\"text-sm text-z-secondary font-bold text-center py-4\">No permission rules defined. Add a rule above.</p>\n )}\n </div>\n </div>\n\n {/* User assignment */}\n <div className=\"border-t border-z-border pt-5 space-y-3\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-semibold text-z-muted\">\n Assigned Users ({users.filter(u => u.role === editingRole.roleName || u.role === editingRole.roleType).length})\n </span>\n </div>\n <div className=\"space-y-2\">\n {users.filter(u => u.role === editingRole.roleName || u.role === editingRole.roleType).map(u => (\n <div key={u._id} className=\"flex items-center justify-between p-3 border border-z-border bg-z-panel\">\n <div className=\"flex flex-col\">\n <span className=\"text-sm font-semibold text-z-primary\">{u.email}</span>\n <span className=\"text-sm font-bold text-z-secondary\">{u._id}</span>\n </div>\n <span className=\"text-sm font-semibold text-z-secondary border border-z-border/20 px-2 py-1\">{u.role}</span>\n </div>\n ))}\n {users.filter(u => u.role === editingRole.roleName || u.role === editingRole.roleType).length === 0 && (\n <p className=\"text-sm text-z-secondary font-bold text-center py-2\">No users assigned to this role.</p>\n )}\n </div>\n </div>\n </div>\n ) : (\n <div className=\"min-h-[300px] border border-dashed border-z-border flex items-center justify-center text-center p-8\">\n <p className=\"text-sm text-z-secondary font-bold max-w-xs\">\n Select a role on the left to view and edit its permission rules.\n </p>\n </div>\n )}\n </div>\n </div>\n\n {createOpen && (\n <CreateRoleModal\n onClose={() => setCreateOpen(false)}\n onCreated={(newRole) => {\n setRoles((prev: Role[]) => [...prev, newRole])\n setEditingRole(newRole)\n }}\n theme={theme}\n />\n )}\n\n {deleteRole && (\n <DeleteRoleConfirmDialog\n role={deleteRole}\n onClose={() => setDeleteRole(null)}\n onDeleted={() => {\n setRoles((prev: Role[]) => prev.filter(r => r._id !== deleteRole._id))\n if (editingRole?._id === deleteRole._id) setEditingRole(null)\n }}\n theme={theme}\n />\n )}\n </div>\n )\n}\n\nexport default SettingsRoles\n","import React, { useRef } from 'react'\nimport { Paintbrush, Code2, Sun, Moon, Type, Upload, RotateCcw, Check } from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport { useBrand, THEME_PRESETS } from '../../context/BrandContext'\nimport toast from 'react-hot-toast'\n\ninterface Props {\n settings: { customCSS: string; [k: string]: any }\n setSettings: (s: any) => void\n theme: 'light' | 'dark'\n}\n\nconst FONTS = ['Inter', 'Roboto', 'Outfit', 'DM Sans', 'Sora', 'Plus Jakarta Sans', 'Space Grotesk', 'Fira Code', 'Merriweather']\n\nconst card = (dark: boolean) =>\n cn('p-6 border transition-all', 'z-card')\n\nconst inp = (dark: boolean) =>\n cn('w-full border py-2 px-3 text-sm font-semibold outline-none transition-all focus:ring-1 focus:ring-z-active-border focus:border-z-accent',\n 'bg-z-panel border-z-border text-z-primary')\n\nconst label = 'text-sm font-semibold text-z-secondary block mb-2'\n\nexport default function SettingsAppearance({ settings, setSettings, theme }: Props) {\n const dark = theme === 'dark'\n const { brand, preset, setBrand, applyPreset } = useBrand()\n const logoRef = useRef<HTMLInputElement>(null)\n const faviconRef = useRef<HTMLInputElement>(null)\n\n const handleImageUpload = (file: File, field: 'logoUrl' | 'faviconUrl') => {\n if (!file.type.startsWith('image/')) return toast.error('Must be an image file')\n const reader = new FileReader()\n reader.onload = (e) => {\n setBrand({ [field]: e.target?.result as string })\n toast.success(field === 'logoUrl' ? 'Logo updated' : 'Favicon updated')\n }\n reader.readAsDataURL(file)\n }\n\n return (\n <div className=\"space-y-6\">\n\n {/* ── Row 1: Brand Identity + Theme Presets ──────────────────────── */}\n <div className=\"grid grid-cols-1 xl:grid-cols-2 gap-6\">\n\n {/* Brand Identity */}\n <div className={card(dark) + ' space-y-5'}>\n <div className=\"flex items-center gap-3 pb-4 border-b\" style={{ borderColor: 'var(--z-border)' }}>\n <div className=\"w-8 h-8 flex items-center justify-center border\" style={{ background: 'var(--z-active-bg)', borderColor: 'var(--z-active-border)' }}>\n <Paintbrush size={15} className=\"text-z-active-text\" />\n </div>\n <div>\n <h3 className=\"text-sm font-semibold\">Brand Identity</h3>\n <p className={label + ' mt-0.5 mb-0'}>White-label your CMS</p>\n </div>\n </div>\n\n {/* App Name & Tagline */}\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <label className={label}>App Name</label>\n <input\n value={brand.appName}\n onChange={e => setBrand({ appName: e.target.value })}\n className={inp(dark)}\n placeholder=\"Zenith\"\n />\n </div>\n <div>\n <label className={label}>Tagline / Version</label>\n <input\n value={brand.appTagline}\n onChange={e => setBrand({ appTagline: e.target.value })}\n className={inp(dark)}\n placeholder=\"v1.0 Beta\"\n />\n </div>\n </div>\n\n {/* Logo Upload */}\n <div>\n <label className={label}>Logo Image</label>\n <div className=\"flex items-center gap-3\">\n {brand.logoUrl ? (\n <img src={brand.logoUrl} alt=\"Logo\" className=\"w-10 h-10 object-contain border\" style={{ borderColor: dark ? 'rgba(255,255,255,0.08)' : '#e5e7eb' }} />\n ) : (\n <div className=\"w-10 h-10 border flex items-center justify-center text-z-secondary text-sm font-semibold\"\n style={{ borderColor: dark ? 'rgba(255,255,255,0.08)' : '#e5e7eb' }}>\n None\n </div>\n )}\n <div className=\"flex-1 flex gap-2\">\n <button onClick={() => logoRef.current?.click()}\n className={cn('flex-1 flex items-center justify-center gap-2 py-2 border text-sm font-semibold transition-all',\n 'border-z-border text-z-secondary hover:text-z-primary hover:border-z-border-strong')}>\n <Upload size={11} /> Upload\n </button>\n {brand.logoUrl && (\n <button onClick={() => setBrand({ logoUrl: '' })}\n className=\"px-3 py-2 border border-red-500/20 text-red-400 text-sm font-semibold hover:bg-red-500/10 transition-all\">\n <RotateCcw size={11} />\n </button>\n )}\n </div>\n <input ref={logoRef} type=\"file\" accept=\"image/*\" className=\"hidden\" onChange={e => e.target.files?.[0] && handleImageUpload(e.target.files[0], 'logoUrl')} />\n </div>\n </div>\n\n {/* Favicon Upload */}\n <div>\n <label className={label}>Favicon</label>\n <div className=\"flex items-center gap-3\">\n {brand.faviconUrl ? (\n <img src={brand.faviconUrl} alt=\"Favicon\" className=\"w-8 h-8 object-contain border\" style={{ borderColor: dark ? 'rgba(255,255,255,0.08)' : '#e5e7eb' }} />\n ) : (\n <div className=\"w-8 h-8 border flex items-center justify-center text-z-secondary text-sm\"\n style={{ borderColor: dark ? 'rgba(255,255,255,0.08)' : '#e5e7eb' }}>ico</div>\n )}\n <button onClick={() => faviconRef.current?.click()}\n className={cn('flex items-center gap-2 px-4 py-2 border text-sm font-semibold transition-all',\n 'border-z-border text-z-secondary hover:text-z-primary hover:border-z-border-strong')}>\n <Upload size={11} /> Upload\n </button>\n <input ref={faviconRef} type=\"file\" accept=\"image/*\" className=\"hidden\" onChange={e => e.target.files?.[0] && handleImageUpload(e.target.files[0], 'faviconUrl')} />\n </div>\n </div>\n\n {/* Font */}\n <div>\n <label className={label}>Typography</label>\n <div className=\"relative\">\n <Type size={12} className=\"absolute left-3 top-2.5 text-z-secondary\" />\n <select value={brand.fontFamily} onChange={e => setBrand({ fontFamily: e.target.value })} className={cn(inp(dark), 'pl-9')}>\n {FONTS.map(f => <option key={f} value={f}>{f}</option>)}\n </select>\n </div>\n </div>\n\n {/* Default Theme */}\n <div>\n <label className={label}>Default Color Mode</label>\n <div className=\"grid grid-cols-2 gap-2\">\n {['light', 'dark'].map(t => (\n <button key={t} type=\"button\"\n onClick={() => setSettings({ ...settings, theme: t })}\n className={cn('flex items-center justify-center gap-2 py-2.5 border text-sm font-semibold transition-all',\n (settings.theme === t || (!settings.theme && t === 'dark'))\n ? 'border-z-accent bg-z-active-bg text-z-active-text'\n : 'border-z-border text-z-secondary hover:border-z-active-border')}>\n {t === 'light' ? <Sun size={13} /> : <Moon size={13} />}\n {t}\n </button>\n ))}\n </div>\n </div>\n </div>\n\n {/* Theme Presets */}\n <div className={card(dark) + ' space-y-5'}>\n <div className=\"flex items-center gap-3 pb-4 border-b\" style={{ borderColor: 'var(--z-border)' }}>\n <div className=\"w-8 h-8 flex items-center justify-center border\" style={{ background: 'var(--z-active-bg)', borderColor: 'var(--z-active-border)' }}>\n <Paintbrush size={15} className=\"text-z-active-text\" />\n </div>\n <div>\n <h3 className=\"text-sm font-semibold\">Accent Theme</h3>\n <p className={label + ' mt-0.5 mb-0'}>Plug-and-play presets</p>\n </div>\n </div>\n\n <div className=\"grid grid-cols-2 gap-3\">\n {THEME_PRESETS.map(p => {\n const active = brand.themePresetId === p.id\n return (\n <button key={p.id} onClick={() => applyPreset(p.id)}\n className={cn('relative flex items-center gap-3 p-3 border text-left transition-all group',\n active\n ? 'border-z-accent/50 bg-z-accent/5'\n : 'border-z-border hover:border-z-border-strong')}>\n {/* Swatch */}\n <div className=\"w-8 h-8 flex-shrink-0 flex items-center justify-center font-semibold text-sm shadow-lg\"\n style={{ backgroundColor: p.accentHex, color: p.logoIconText }}>\n {p.name[0]}\n </div>\n <div className=\"flex flex-col min-w-0\">\n <span className={cn('text-sm font-semibold truncate', active ? 'text-z-active-text' : 'text-z-secondary')}>{p.name}</span>\n <span className=\"text-sm font-mono text-z-secondary\">{p.accentHex}</span>\n </div>\n {active && <Check size={11} className=\"absolute top-2 right-2 text-z-active-text\" />}\n </button>\n )\n })}\n </div>\n\n {/* Live Preview */}\n <div className=\"space-y-2\">\n <label className={label}>Live Preview</label>\n <div className=\"p-4 border space-y-2\" style={{ borderColor: 'var(--z-border)', background: 'var(--z-panel)' }}>\n {/* Simulated sidebar item active */}\n <div className=\"flex items-center gap-3 px-3 py-2 border\"\n style={{ background: preset.activeBg, borderColor: preset.activeBorder, boxShadow: preset.activeGlow }}>\n <div className=\"w-2 h-2\" style={{ background: preset.activeText }} />\n <span className=\"text-sm font-semibold\" style={{ color: preset.activeText }}>{brand.appName || 'Zenith'}</span>\n </div>\n {/* Simulated sidebar item default */}\n <div className={cn('flex items-center gap-3 px-3 py-2 border', 'border-z-border')}>\n <div className=\"w-2 h-2 bg-z-accent\" />\n <span className={cn('text-sm font-semibold ', 'text-z-secondary')}>Collections</span>\n </div>\n {/* Simulated logo badge */}\n <div className=\"flex items-center gap-2 pt-1\">\n <div className=\"w-7 h-7 flex items-center justify-center font-semibold text-sm\"\n style={{ background: preset.logoIconBg, color: preset.logoIconText }}>\n {(brand.appName || 'Z')[0]}\n </div>\n <span className=\"text-sm font-semibold\" style={{ color: 'var(--z-text-primary)' }}>\n {brand.appName || 'Zenith'}\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n {/* ── Custom CSS ─────────────────────────────────────────────────── */}\n <div className={card(dark) + ' space-y-4'}>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-8 h-8 flex items-center justify-center border\" style={{ background: 'rgba(59,130,246,0.1)', borderColor: 'rgba(59,130,246,0.2)' }}>\n <Code2 size={15} className=\"text-z-active-text\" />\n </div>\n <div>\n <h3 className=\"text-sm font-semibold\">CSS Override</h3>\n <p className={label + ' mt-0.5 mb-0'}>Global stylesheet injection</p>\n </div>\n </div>\n <span className=\"text-sm font-semibold text-z-active-text border border-z-accent/20 bg-z-accent/10 px-2 py-1\">Live</span>\n </div>\n <textarea\n value={settings.customCSS}\n onChange={e => { setSettings({ ...settings, customCSS: e.target.value }); setBrand({ customCSS: e.target.value }) }}\n rows={10}\n spellCheck={false}\n className={cn('w-full border py-4 px-5 text-sm font-mono outline-none transition-all focus:ring-1 focus:ring-z-active-border resize-none',\n 'bg-z-input border-z-border text-z-primary')}\n placeholder={`:root {\\n /* Override brand accent */\\n --brand-accent: var(--z-accent);\\n}\\n\\n/* Custom panel styles */\\n.my-panel {\\n backdrop-filter: blur(12px);\\n}`}\n />\n </div>\n </div>\n )\n}\n","import {\n Bell,\n BellOff,\n CheckCircle2,\n ChevronDown,\n ChevronUp,\n Clock,\n Loader2,\n Plus,\n RotateCcw,\n Send,\n Trash2,\n Webhook,\n XCircle,\n} from 'lucide-react'\nimport React, { useEffect, useRef, useState } from 'react'\nimport toast from 'react-hot-toast'\nimport EmptyState from '../../components/EmptyState'\nimport api from '../../lib/api'\nimport { cn } from '../../lib/utils'\nimport { confirm } from '../../store/confirmStore'\n\ninterface WebhookTarget {\n id: string\n url: string\n secret: string\n events: string[]\n enabled: boolean\n createdAt: string\n}\n\ninterface DeliveryRecord {\n id: string\n collectionSlug?: string\n event: string\n url: string\n success: boolean\n responseStatus?: number\n timestamp: string\n}\n\ninterface SettingsWebhooksProps {\n theme: 'light' | 'dark'\n}\n\nconst AVAILABLE_EVENTS = [\n { value: 'posts.created', label: 'Post Created' },\n { value: 'posts.updated', label: 'Post Updated' },\n { value: 'posts.deleted', label: 'Post Deleted' },\n { value: 'posts.published', label: 'Post Published' },\n { value: 'posts.unpublished', label: 'Post Unpublished' },\n { value: 'authors.created', label: 'Author Created' },\n { value: 'authors.updated', label: 'Author Updated' },\n { value: 'authors.deleted', label: 'Author Deleted' },\n { value: 'products.created', label: 'Product Created' },\n { value: 'products.updated', label: 'Product Updated' },\n { value: 'products.deleted', label: 'Product Deleted' },\n { value: 'media.uploaded', label: 'Media Uploaded' },\n { value: 'media.deleted', label: 'Media Deleted' },\n { value: '*', label: 'All Events' },\n]\n\nconst SettingsWebhooks: React.FC<SettingsWebhooksProps> = ({ theme }) => {\n const [webhooks, setWebhooks] = useState<WebhookTarget[]>([])\n const [loading, setLoading] = useState(true)\n const [fetchError, setFetchError] = useState<string | null>(null)\n const [showForm, setShowForm] = useState(false)\n const [editingId, setEditingId] = useState<string | null>(null)\n const [formUrl, setFormUrl] = useState('')\n const [formSecret, setFormSecret] = useState('')\n const [formEvents, setFormEvents] = useState<string[]>([])\n const [saving, setSaving] = useState(false)\n const [testingId, setTestingId] = useState<string | null>(null)\n const [expandedWebhook, setExpandedWebhook] = useState<string | null>(null)\n const [deliveries, setDeliveries] = useState<Record<string, DeliveryRecord[]>>({})\n const [loadingDeliveries, setLoadingDeliveries] = useState<string | null>(null)\n const [replayingId, setReplayingId] = useState<string | null>(null)\n \n const isMountedRef = useRef(true)\n useEffect(() => {\n return () => {\n isMountedRef.current = false\n }\n }, [])\n\n const fetchWebhooks = async () => {\n if (!isMountedRef.current) return\n setLoading(true)\n setFetchError(null)\n try {\n const res = await api.get('/system/webhooks')\n if (isMountedRef.current) setWebhooks(res.data.data || [])\n } catch (err: any) {\n const msg = err?.response?.data?.error || err?.message || 'Failed to load webhooks'\n if (isMountedRef.current) setFetchError(msg)\n } finally {\n if (isMountedRef.current) setLoading(false)\n }\n }\n\n React.useEffect(() => {\n fetchWebhooks()\n }, [])\n\n const fetchDeliveries = async (webhookId: string, url: string) => {\n if (!isMountedRef.current) return\n setLoadingDeliveries(webhookId)\n try {\n const res = await api.get(`/system/webhooks/${webhookId}/deliveries?limit=25`)\n if (isMountedRef.current) setDeliveries((prev) => ({ ...prev, [url]: res.data.data || [] }))\n } catch {\n if (isMountedRef.current) toast.error('Failed to load delivery log')\n } finally {\n if (isMountedRef.current) setLoadingDeliveries(null)\n }\n }\n\n const toggleExpand = (wh: WebhookTarget) => {\n if (expandedWebhook === wh.id) {\n setExpandedWebhook(null)\n } else {\n setExpandedWebhook(wh.id)\n if (!deliveries[wh.url]) {\n fetchDeliveries(wh.id, wh.url)\n }\n }\n }\n\n const resetForm = () => {\n setFormUrl('')\n setFormSecret('')\n setFormEvents([])\n setEditingId(null)\n setShowForm(false)\n }\n\n const handleEdit = (wh: WebhookTarget) => {\n setEditingId(wh.id)\n setFormUrl(wh.url)\n setFormSecret(wh.secret)\n setFormEvents(wh.events)\n setShowForm(true)\n }\n\n const handleSave = async () => {\n if (!formUrl.trim()) {\n toast.error('URL is required')\n return\n }\n if (formEvents.length === 0) {\n toast.error('Select at least one event')\n return\n }\n setSaving(true)\n try {\n if (editingId) {\n await api.put(`/system/webhooks/${editingId}`, {\n url: formUrl,\n secret: formSecret,\n events: formEvents,\n })\n toast.success('Webhook updated')\n } else {\n await api.post('/system/webhooks', { url: formUrl, secret: formSecret, events: formEvents })\n toast.success('Webhook created')\n }\n resetForm()\n fetchWebhooks()\n } catch (err: any) {\n toast.error(err.response?.data?.message || 'Failed to save webhook')\n } finally {\n setSaving(false)\n }\n }\n\n const handleDelete = async (id: string) => {\n if (!(await confirm({ message: 'Delete this webhook?' }))) return\n try {\n await api.delete(`/system/webhooks/${id}`)\n toast.success('Webhook deleted')\n fetchWebhooks()\n } catch {\n toast.error('Failed to delete webhook')\n }\n }\n\n const handleToggle = async (wh: WebhookTarget) => {\n try {\n await api.put(`/system/webhooks/${wh.id}`, { enabled: !wh.enabled })\n setWebhooks((prev) => prev.map((w) => (w.id === wh.id ? { ...w, enabled: !wh.enabled } : w)))\n toast.success(wh.enabled ? 'Webhook disabled' : 'Webhook enabled')\n } catch {\n toast.error('Failed to toggle webhook')\n }\n }\n\n const handleTest = async (id: string, url: string) => {\n setTestingId(id)\n try {\n const res = await api.post(`/system/webhooks/${id}/test`)\n if (res.data.data.success) {\n toast.success(`Test delivered (status ${res.data.data.status})`)\n } else {\n toast.error(`Test failed: ${res.data.data.error || 'Unknown error'}`)\n }\n // Refresh deliveries after test\n fetchDeliveries(id, url)\n } catch (err: any) {\n toast.error(err.response?.data?.message || 'Test failed')\n } finally {\n setTestingId(null)\n }\n }\n\n const handleRetryDelivery = async (whId: string, whUrl: string) => {\n // Re-send a test event to refresh the delivery log\n await handleTest(whId, whUrl)\n }\n\n const handleReplay = async (whId: string, deliveryId: string, url: string) => {\n setReplayingId(deliveryId)\n try {\n const res = await api.post(`/system/webhooks/${whId}/deliveries/${deliveryId}/replay`)\n if (res.data.data.success) {\n toast.success(`Replay delivered (status ${res.data.data.status})`)\n } else {\n toast.error(`Replay failed: ${res.data.data.error || 'Unknown error'}`)\n }\n fetchDeliveries(whId, url)\n } catch (err: any) {\n toast.error(err.response?.data?.message || 'Replay failed')\n } finally {\n setReplayingId(null)\n }\n }\n\n const toggleEvent = (value: string) => {\n if (value === '*') {\n setFormEvents(['*'])\n return\n }\n setFormEvents((prev) => {\n const next = prev.filter((e) => e !== '*')\n if (next.includes(value)) return next.filter((e) => e !== value)\n return [...next, value]\n })\n }\n\n const formatTimestamp = (ts: string) => {\n try {\n const d = new Date(ts)\n return d.toLocaleString('en-US', {\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n })\n } catch {\n return ts\n }\n }\n\n return (\n <div className=\"col-span-full space-y-6\">\n <div className=\"flex items-center justify-between border-b border-z-border pb-4\">\n <div className=\"flex flex-col\">\n <h3 className=\"text-sm font-semibold flex items-center gap-3\">\n <Webhook size={16} className=\"text-z-secondary\" />\n Webhook Management\n </h3>\n <span className=\"text-sm text-z-secondary font-bold mt-1\">\n Configure HTTP callbacks for content lifecycle events\n </span>\n </div>\n {!showForm && (\n <button\n type=\"button\"\n onClick={() => setShowForm(true)}\n className=\"flex items-center gap-2 px-4 py-2 border border-z-border hover:border-z-active-border hover:bg-z-hover text-sm font-semibold transition-all text-z-secondary hover:text-z-primary\"\n >\n <Plus size={12} />\n Add Webhook\n </button>\n )}\n </div>\n\n {/* Form */}\n {showForm && (\n <div\n className={cn(\n 'p-6 border rounded-none space-y-5 shadow-sm',\n 'bg-z-panel backdrop-blur-md border-z-border'\n )}\n >\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-semibold text-z-secondary\">\n {editingId ? 'Edit Webhook' : 'New Webhook'}\n </span>\n <button\n onClick={resetForm}\n className=\"text-z-secondary hover:text-z-primary text-sm font-semibold\"\n >\n Cancel\n </button>\n </div>\n\n <div className=\"space-y-4\">\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-semibold text-z-secondary\">Endpoint URL</label>\n <input\n type=\"url\"\n value={formUrl}\n onChange={(e) => setFormUrl(e.target.value)}\n placeholder=\"https://example.com/api/webhooks/zenith\"\n className={cn(\n 'w-full border rounded-none py-3 px-4 text-sm font-mono transition-all outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black',\n 'bg-z-panel border-z-border text-z-primary focus:border-z-active-border'\n )}\n />\n </div>\n\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-semibold text-z-secondary\">\n Signing Secret (optional)\n </label>\n <input\n type=\"password\"\n value={formSecret}\n onChange={(e) => setFormSecret(e.target.value)}\n placeholder=\"whsec_...\"\n className={cn(\n 'w-full border rounded-none py-3 px-4 text-sm font-mono transition-all outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black',\n 'bg-z-panel border-z-border text-z-primary focus:border-z-active-border'\n )}\n />\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-sm font-semibold text-z-secondary\">Subscribed Events</label>\n <div\n className={cn(\n 'p-4 border rounded-none flex flex-wrap gap-2 max-h-40 overflow-y-auto',\n 'bg-z-panel border-z-border'\n )}\n >\n {AVAILABLE_EVENTS.map((evt) => {\n const checked = formEvents.includes(evt.value)\n return (\n <button\n key={evt.value}\n type=\"button\"\n onClick={() => toggleEvent(evt.value)}\n className={cn(\n 'px-3 py-1.5 text-sm font-semibold border rounded-none transition-all',\n checked\n ? 'border-z-border/40 bg-z-panel text-z-secondary'\n : 'border-z-border text-z-secondary hover:text-z-primary'\n )}\n >\n {evt.label}\n </button>\n )\n })}\n </div>\n </div>\n </div>\n\n <div className=\"flex justify-end\">\n <button\n onClick={handleSave}\n disabled={saving}\n className={cn(\n 'flex items-center gap-2 px-6 py-3 text-z-primary text-sm font-semibold transition-all disabled:opacity-40',\n 'bg-z-accent hover:brightness-110 shadow-sm text-z-logo-text'\n )}\n >\n {saving ? <Loader2 size={12} className=\"animate-spin\" /> : null}\n {editingId ? 'Update Webhook' : 'Create Webhook'}\n </button>\n </div>\n </div>\n )}\n\n {/* Webhook list */}\n {loading ? (\n <div className=\"flex items-center justify-center py-12\">\n <Loader2 size={24} className=\"text-z-secondary animate-spin\" />\n </div>\n ) : fetchError ? (\n <div className={cn('p-8 border border-dashed text-center space-y-3', 'border-z-border')}>\n <XCircle size={28} className=\"mx-auto text-red-400\" />\n <p className=\"text-sm font-semibold text-z-primary\">Could not load webhooks</p>\n <p className=\"text-xs text-z-secondary\">{fetchError}</p>\n <button\n onClick={fetchWebhooks}\n className=\"inline-flex items-center gap-2 px-4 py-2 border border-z-border hover:border-z-active-border hover:bg-z-hover text-sm font-semibold text-z-secondary hover:text-z-primary transition-all\"\n >\n <RotateCcw size={12} /> Retry\n </button>\n </div>\n ) : webhooks.length === 0 ? (\n <div className=\"py-6\">\n <EmptyState\n icon={Webhook}\n title=\"No webhooks configured\"\n message=\"Add a webhook to receive HTTP callbacks when content events occur\"\n action={\n <button\n type=\"button\"\n onClick={() => setShowForm(true)}\n className=\"flex items-center gap-2 px-4 py-2 border border-z-border hover:border-z-active-border hover:bg-z-hover text-sm font-semibold transition-all text-z-secondary hover:text-z-primary\"\n >\n <Plus size={12} />\n Add Webhook\n </button>\n }\n />\n </div>\n ) : (\n <div className=\"space-y-3\">\n {webhooks.map((wh) => (\n <div key={wh.id} className=\"space-y-0\">\n <div\n className={cn(\n 'p-5 border rounded-none transition-all shadow-sm',\n wh.enabled\n ? 'bg-z-panel backdrop-blur-md border-z-border shadow-sm'\n : 'bg-z-input border-z-border opacity-60'\n )}\n >\n <div className=\"flex items-center justify-between mb-3\">\n <div className=\"flex items-center gap-3\">\n {wh.enabled ? (\n <CheckCircle2 size={14} className=\"text-z-secondary \" />\n ) : (\n <XCircle size={14} className=\"text-z-secondary\" />\n )}\n <span className=\"text-sm font-mono font-bold truncate max-w-md\">{wh.url}</span>\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n onClick={() => handleTest(wh.id, wh.url)}\n disabled={testingId === wh.id || !wh.enabled}\n className={cn(\n 'p-2 border rounded-none-none transition-colors',\n 'border-z-border text-z-secondary hover:text-z-primary'\n )}\n title=\"Send test event\"\n >\n {testingId === wh.id ? (\n <Loader2 size={12} className=\"animate-spin\" />\n ) : (\n <Send size={12} />\n )}\n </button>\n <button\n onClick={() => handleToggle(wh)}\n className={cn(\n 'p-2 border rounded-none-none transition-colors',\n wh.enabled\n ? 'border-z-border text-status-orange hover:brightness-110'\n : 'border-z-border text-z-secondary hover:text-z-primary'\n )}\n title={wh.enabled ? 'Disable' : 'Enable'}\n >\n {wh.enabled ? <Bell size={12} /> : <BellOff size={12} />}\n </button>\n <button\n onClick={() => handleEdit(wh)}\n className={cn(\n 'px-3 py-1.5 text-sm font-semibold border rounded-none-none transition-colors',\n 'border-z-border text-z-secondary hover:text-z-primary'\n )}\n >\n Edit\n </button>\n <button\n onClick={() => handleDelete(wh.id)}\n className={cn(\n 'p-2 border rounded-none-none transition-colors',\n 'border-z-border text-z-secondary hover:text-status-red'\n )}\n title=\"Delete\"\n >\n <Trash2 size={12} />\n </button>\n <button\n onClick={() => toggleExpand(wh)}\n className={cn(\n 'p-2 border rounded-none-none transition-colors',\n expandedWebhook === wh.id\n ? 'border-z-border/40 text-z-secondary'\n : 'border-z-border text-z-secondary hover:text-z-primary'\n )}\n title=\"Delivery log\"\n >\n {expandedWebhook === wh.id ? (\n <ChevronUp size={12} />\n ) : (\n <ChevronDown size={12} />\n )}\n </button>\n </div>\n </div>\n <div className=\"flex items-center gap-2 flex-wrap\">\n {wh.events.map((evt) => (\n <span\n key={evt}\n className={cn(\n 'px-2 py-0.5 text-sm font-semibold border rounded-none-none',\n evt === '*'\n ? 'border-z-border/30 text-z-secondary bg-z-hover'\n : 'border-z-border text-z-secondary'\n )}\n >\n {evt}\n </span>\n ))}\n {wh.secret && (\n <span\n className={cn(\n 'px-2 py-0.5 text-sm font-semibold border rounded-none-none',\n 'border-z-border text-z-secondary'\n )}\n >\n Signed\n </span>\n )}\n </div>\n </div>\n\n {/* Delivery Log Panel */}\n {expandedWebhook === wh.id && (\n <div\n className={cn(\n 'border border-t-0 rounded-none-none p-4',\n 'bg-z-input border-z-border'\n )}\n >\n <div className=\"flex items-center justify-between mb-4\">\n <div className=\"flex items-center gap-2\">\n <Clock size={12} className=\"text-z-secondary\" />\n <span className=\"text-sm font-semibold text-z-secondary\">Delivery Log</span>\n </div>\n <button\n onClick={() => fetchDeliveries(wh.id, wh.url)}\n disabled={loadingDeliveries === wh.id}\n className={cn(\n 'flex items-center gap-1.5 px-3 py-1.5 text-sm font-semibold border rounded-none-none transition-colors',\n 'border-z-border text-z-secondary hover:text-z-primary'\n )}\n >\n {loadingDeliveries === wh.id ? (\n <Loader2 size={9} className=\"animate-spin\" />\n ) : (\n <RotateCcw size={9} />\n )}\n Refresh\n </button>\n </div>\n\n {loadingDeliveries === wh.id ? (\n <div className=\"flex items-center justify-center py-8\">\n <Loader2 size={16} className=\"text-z-secondary animate-spin\" />\n </div>\n ) : !deliveries[wh.url] || deliveries[wh.url].length === 0 ? (\n <div className=\"py-2\">\n <EmptyState\n icon={Clock}\n title=\"No deliveries yet\"\n message=\"Send a test event or wait for a content event to trigger this webhook\"\n />\n </div>\n ) : (\n <div className=\"space-y-2 max-h-80 overflow-y-auto\">\n {/* Header */}\n <div\n className={cn(\n 'grid grid-cols-[1fr_1fr_80px_80px_100px_40px] gap-2 px-3 py-2 text-sm font-semibold border-b',\n 'text-z-secondary border-z-border'\n )}\n >\n <span>Event</span>\n <span>Collection</span>\n <span>Status</span>\n <span>Code</span>\n <span>Time</span>\n <span className=\"text-center\">Action</span>\n </div>\n {deliveries[wh.url].map((d) => (\n <div\n key={d.id}\n className={cn(\n 'grid grid-cols-[1fr_1fr_80px_80px_100px_40px] gap-2 px-3 py-2.5 text-sm font-mono border rounded-none-none transition-colors items-center',\n d.success\n ? 'bg-z-hover border-z-border'\n : 'bg-z-active-bg border-z-active-border'\n )}\n >\n <span className=\"font-bold truncate\">{d.event}</span>\n <span className={cn('truncate', 'text-z-secondary')}>\n {d.collectionSlug || '—'}\n </span>\n <span className=\"flex items-center gap-1\">\n {d.success ? (\n <CheckCircle2 size={9} className=\"text-z-secondary \" />\n ) : (\n <XCircle size={9} className=\"text-red-500\" />\n )}\n <span className={d.success ? 'text-z-secondary ' : 'text-red-500'}>\n {d.success ? 'OK' : 'Failed'}\n </span>\n </span>\n <span\n className={cn(\n 'font-bold',\n d.responseStatus && d.responseStatus >= 200 && d.responseStatus < 300\n ? 'text-z-secondary '\n : d.responseStatus && d.responseStatus >= 400\n ? 'text-red-500'\n : 'text-z-secondary'\n )}\n >\n {d.responseStatus || '—'}\n </span>\n <span className={cn('text-z-secondary')}>\n {formatTimestamp(d.timestamp)}\n </span>\n <div className=\"flex justify-center\">\n <button\n onClick={() => handleReplay(wh.id, d.id, wh.url)}\n disabled={replayingId === d.id}\n className={cn(\n 'p-1.5 border rounded-none-none transition-colors',\n 'border-z-border text-z-secondary hover:text-z-primary hover:border-z-border-strong'\n )}\n title=\"Replay Delivery\"\n >\n {replayingId === d.id ? (\n <Loader2 size={10} className=\"animate-spin\" />\n ) : (\n <RotateCcw size={10} />\n )}\n </button>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n )\n}\n\nexport default SettingsWebhooks\n","import { AnimatePresence, motion } from 'framer-motion'\nimport {\n AlertTriangle,\n CheckCircle2,\n Download,\n ExternalLink,\n Loader2,\n Package,\n Plus,\n Puzzle,\n Search,\n Settings,\n ToggleLeft,\n ToggleRight,\n Trash2,\n XCircle,\n} from 'lucide-react'\nimport React, { useEffect, useRef, useState } from 'react'\nimport toast from 'react-hot-toast'\nimport api from '../../lib/api'\nimport { cn } from '../../lib/utils'\nimport { confirm } from '../../store/confirmStore'\n\ninterface PluginDoc {\n id: string\n name: string\n version: string\n description: string\n author: string\n homepage: string\n packageName: string\n configSchema: Record<\n string,\n {\n type: string\n label: string\n description?: string\n default?: any\n options?: Array<{ label: string; value: string }>\n required?: boolean\n }\n >\n config: any\n enabled: boolean\n installedAt: string\n updatedAt: string\n}\n\ninterface SettingsPluginsProps {\n theme: 'light' | 'dark'\n}\n\nconst SettingsPlugins: React.FC<SettingsPluginsProps> = ({ theme }) => {\n const [plugins, setPlugins] = useState<PluginDoc[]>([])\n const [loading, setLoading] = useState(true)\n const [fetchError, setFetchError] = useState<string | null>(null)\n const [searchQuery, setSearchQuery] = useState('')\n const [expandedId, setExpandedId] = useState<string | null>(null)\n const [saving, setSaving] = useState<string | null>(null)\n const [showInstallForm, setShowInstallForm] = useState(false)\n const [installForm, setInstallForm] = useState({\n id: '',\n name: '',\n version: '1.0.0',\n description: '',\n author: '',\n homepage: '',\n packageName: '',\n })\n const isMountedRef = useRef(true)\n useEffect(() => {\n isMountedRef.current = true\n return () => {\n isMountedRef.current = false\n }\n }, [])\n\n const fetchPlugins = async () => {\n if (!isMountedRef.current) return\n setLoading(true)\n setFetchError(null)\n try {\n const res = await api.get('/system/plugins')\n if (isMountedRef.current) setPlugins(res.data.data || [])\n } catch (err: any) {\n const msg = err?.response?.data?.error || err?.message || 'Failed to load plugins'\n if (isMountedRef.current) setFetchError(msg)\n } finally {\n if (isMountedRef.current) setLoading(false)\n }\n }\n\n React.useEffect(() => {\n fetchPlugins()\n }, [])\n\n const handleToggle = async (plugin: PluginDoc) => {\n setSaving(plugin.id)\n try {\n await api.put(`/system/plugins/${plugin.id}`, { enabled: !plugin.enabled })\n setPlugins((prev) =>\n prev.map((p) => (p.id === plugin.id ? { ...p, enabled: !p.enabled } : p))\n )\n toast.success(plugin.enabled ? 'Plugin disabled' : 'Plugin enabled')\n } catch {\n toast.error('Failed to toggle plugin')\n } finally {\n setSaving(null)\n }\n }\n\n const handleDelete = async (id: string) => {\n if (!(await confirm({ message: 'Uninstall this plugin? Its functionality will be removed.' })))\n return\n setSaving(id)\n try {\n await api.delete(`/system/plugins/${id}`)\n setPlugins((prev) => prev.filter((p) => p.id !== id))\n toast.success('Plugin uninstalled')\n } catch {\n toast.error('Failed to uninstall plugin')\n } finally {\n setSaving(null)\n }\n }\n\n const handleConfigChange = (pluginId: string, key: string, value: any) => {\n setPlugins((prev) =>\n prev.map((p) => {\n if (p.id !== pluginId) return p\n return { ...p, config: { ...p.config, [key]: value } }\n })\n )\n }\n\n const handleSaveConfig = async (plugin: PluginDoc) => {\n setSaving(plugin.id)\n try {\n await api.put(`/system/plugins/${plugin.id}`, { config: plugin.config })\n toast.success('Plugin settings saved')\n } catch {\n toast.error('Failed to save plugin settings')\n } finally {\n setSaving(null)\n }\n }\n\n const handleInstall = async () => {\n if (!installForm.id.trim()) {\n toast.error('Plugin ID is required')\n return\n }\n if (!installForm.name.trim()) {\n toast.error('Plugin name is required')\n return\n }\n setSaving('install')\n try {\n await api.post('/system/plugins', installForm)\n toast.success(`Plugin \"${installForm.name}\" installed`)\n setShowInstallForm(false)\n setInstallForm({\n id: '',\n name: '',\n version: '1.0.0',\n description: '',\n author: '',\n homepage: '',\n packageName: '',\n })\n fetchPlugins()\n } catch (err: any) {\n toast.error(err.response?.data?.message || 'Failed to install plugin')\n } finally {\n setSaving(null)\n }\n }\n\n const filteredPlugins = plugins.filter(\n (p) =>\n p.name.toLowerCase().includes(searchQuery.toLowerCase()) ||\n p.id.toLowerCase().includes(searchQuery.toLowerCase()) ||\n p.description.toLowerCase().includes(searchQuery.toLowerCase())\n )\n\n const enabledCount = plugins.filter((p) => p.enabled).length\n\n return (\n <div className=\"col-span-full space-y-6\">\n {/* Header */}\n <div className=\"flex items-center justify-between border-b border-z-border pb-4\">\n <div className=\"flex flex-col\">\n <h3 className=\"text-sm font-semibold flex items-center gap-3\">\n <Puzzle size={16} className=\"text-z-secondary\" />\n Plugin Registry\n </h3>\n <span className=\"text-sm text-z-secondary font-bold mt-1\">\n {plugins.length} installed · {enabledCount} active · Community extensibility framework\n </span>\n </div>\n <button\n type=\"button\"\n onClick={() => setShowInstallForm(!showInstallForm)}\n className=\"flex items-center gap-2 px-4 py-2 border border-z-active-border hover:border-z-accent hover:bg-z-active-bg text-sm font-semibold transition-all text-z-accent dark:text-z-active-text hover:text-z-primary\"\n >\n <Plus size={12} />\n Install Plugin\n </button>\n </div>\n\n {/* Install form */}\n <AnimatePresence>\n {showInstallForm && (\n <motion.div\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: 'auto' }}\n exit={{ opacity: 0, height: 0 }}\n className={cn(\n 'border rounded-none overflow-hidden shadow-sm',\n 'bg-z-panel backdrop-blur-md border-z-border'\n )}\n >\n <div className=\"p-6 space-y-4\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-semibold text-z-secondary\">Register New Plugin</span>\n <button\n onClick={() => setShowInstallForm(false)}\n className=\"text-z-secondary hover:text-z-primary text-sm font-semibold\"\n >\n Cancel\n </button>\n </div>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-semibold text-z-secondary\">Plugin ID *</label>\n <input\n type=\"text\"\n value={installForm.id}\n onChange={(e) => setInstallForm((prev) => ({ ...prev, id: e.target.value }))}\n placeholder=\"acme-analytics\"\n className={cn(\n 'w-full border rounded-none py-2.5 px-3 text-sm font-mono transition-all outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black',\n 'bg-z-panel border-z-border text-z-primary focus:border-z-active-border'\n )}\n />\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-semibold text-z-secondary\">Display Name *</label>\n <input\n type=\"text\"\n value={installForm.name}\n onChange={(e) => setInstallForm((prev) => ({ ...prev, name: e.target.value }))}\n placeholder=\"ACME Analytics\"\n className={cn(\n 'w-full border rounded-none py-2.5 px-3 text-sm transition-all outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black',\n 'bg-z-panel border-z-border text-z-primary focus:border-z-active-border'\n )}\n />\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-semibold text-z-secondary\">Version</label>\n <input\n type=\"text\"\n value={installForm.version}\n onChange={(e) =>\n setInstallForm((prev) => ({ ...prev, version: e.target.value }))\n }\n placeholder=\"1.0.0\"\n className={cn(\n 'w-full border rounded-none py-2.5 px-3 text-sm font-mono transition-all outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black',\n 'bg-z-panel border-z-border text-z-primary focus:border-z-active-border'\n )}\n />\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-semibold text-z-secondary\">Author</label>\n <input\n type=\"text\"\n value={installForm.author}\n onChange={(e) =>\n setInstallForm((prev) => ({ ...prev, author: e.target.value }))\n }\n placeholder=\"ACME Corp\"\n className={cn(\n 'w-full border rounded-none py-2.5 px-3 text-sm transition-all outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black',\n 'bg-z-panel border-z-border text-z-primary focus:border-z-active-border'\n )}\n />\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-semibold text-z-secondary\">Homepage URL</label>\n <input\n type=\"url\"\n value={installForm.homepage}\n onChange={(e) =>\n setInstallForm((prev) => ({ ...prev, homepage: e.target.value }))\n }\n placeholder=\"https://example.com/plugin\"\n className={cn(\n 'w-full border rounded-none py-2.5 px-3 text-sm font-mono transition-all outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black',\n 'bg-z-panel border-z-border text-z-primary focus:border-z-active-border'\n )}\n />\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-semibold text-z-secondary\">NPM Package</label>\n <input\n type=\"text\"\n value={installForm.packageName}\n onChange={(e) =>\n setInstallForm((prev) => ({ ...prev, packageName: e.target.value }))\n }\n placeholder=\"zenith-plugin-acme-analytics\"\n className={cn(\n 'w-full border rounded-none py-2.5 px-3 text-sm font-mono transition-all outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black',\n 'bg-z-panel border-z-border text-z-primary focus:border-z-active-border'\n )}\n />\n </div>\n </div>\n\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-semibold text-z-secondary\">Description</label>\n <textarea\n value={installForm.description}\n onChange={(e) =>\n setInstallForm((prev) => ({ ...prev, description: e.target.value }))\n }\n placeholder=\"What does this plugin do?\"\n rows={2}\n className={cn(\n 'w-full border rounded-none py-2.5 px-3 text-sm transition-all outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black resize-none',\n theme === 'dark'\n ? 'bg-app border-z-border text-z-primary focus:border-z-accent'\n : 'bg-z-panel border-z-border focus:border-z-accent'\n )}\n />\n </div>\n\n <div className=\"flex justify-end\">\n <button\n onClick={handleInstall}\n disabled={saving === 'install'}\n className={cn(\n 'flex items-center gap-2 px-6 py-3 text-z-primary text-sm font-semibold transition-all disabled:opacity-40',\n 'bg-z-accent hover:brightness-110 shadow-sm text-z-logo-text'\n )}\n >\n {saving === 'install' ? (\n <Loader2 size={12} className=\"animate-spin\" />\n ) : (\n <Download size={12} />\n )}\n Install Plugin\n </button>\n </div>\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n\n {/* Search */}\n <div className=\"relative\">\n <Search size={14} className=\"absolute left-4 top-1/2 -translate-y-1/2 text-z-secondary\" />\n <input\n type=\"text\"\n placeholder=\"Search plugins...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className={cn(\n 'w-full border rounded-none py-3 pl-11 pr-4 text-sm font-bold transition-all outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black',\n theme === 'dark'\n ? 'bg-z-panel border-z-border text-z-primary focus:border-z-accent'\n : 'bg-z-panel border-z-border focus:border-z-accent'\n )}\n />\n </div>\n\n {/* Plugin list */}\n {loading ? (\n <div className=\"flex items-center justify-center py-12\">\n <Loader2 size={24} className=\"text-z-secondary animate-spin\" />\n </div>\n ) : fetchError ? (\n <div\n className={cn(\n 'p-12 border border-dashed rounded-none text-center space-y-4',\n 'border-z-border'\n )}\n >\n <XCircle size={36} className=\"mx-auto text-red-400\" />\n <p className=\"text-sm font-semibold text-z-primary\">Could not load plugins</p>\n <p className=\"text-xs text-z-secondary max-w-xs mx-auto\">{fetchError}</p>\n <button\n onClick={fetchPlugins}\n className=\"inline-flex items-center gap-2 px-4 py-2 border border-z-border hover:border-z-active-border hover:bg-z-hover text-sm font-semibold text-z-secondary hover:text-z-primary transition-all\"\n >\n <AlertTriangle size={12} /> Retry\n </button>\n </div>\n ) : filteredPlugins.length === 0 ? (\n <div\n className={cn(\n 'p-12 border border-dashed rounded-none text-center space-y-4',\n 'border-z-border'\n )}\n >\n <Package size={40} className=\"mx-auto text-z-secondary\" />\n <p className=\"text-sm font-semibold text-z-secondary\">\n {plugins.length === 0 ? 'No plugins installed' : 'No plugins match your search'}\n </p>\n <p className=\"text-sm text-z-secondary\">\n {plugins.length === 0\n ? 'Install plugins to extend Zenith CMS functionality'\n : 'Try a different search term'}\n </p>\n </div>\n ) : (\n <div className=\"space-y-3\">\n {filteredPlugins.map((plugin) => {\n const isExpanded = expandedId === plugin.id\n const hasConfig = plugin.configSchema && Object.keys(plugin.configSchema).length > 0\n return (\n <motion.div\n key={plugin.id}\n layout\n className={cn(\n 'border rounded-none overflow-hidden transition-all shadow-sm',\n plugin.enabled\n ? 'bg-z-panel backdrop-blur-md border-z-border shadow-sm'\n : 'bg-z-input border-z-border opacity-60'\n )}\n >\n {/* Plugin header */}\n <div className=\"px-5 py-4 flex items-center justify-between\">\n <div className=\"flex items-center gap-4\">\n <div\n className={cn(\n 'w-10 h-10 rounded-none border flex items-center justify-center',\n plugin.enabled\n ? 'bg-z-panel/5 border-z-border text-z-secondary'\n : theme === 'dark'\n ? 'bg-z-hover border-z-border text-z-secondary'\n : 'bg-[var(--z-bg-hover)] border-z-border text-z-muted'\n )}\n >\n <Puzzle size={18} />\n </div>\n <div className=\"flex flex-col\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-semibold text-z-primary\">{plugin.name}</span>\n <span className=\"text-sm font-semibold text-z-secondary font-mono\">\n v{plugin.version}\n </span>\n {plugin.enabled ? (\n <CheckCircle2 size={12} className=\"text-z-secondary \" />\n ) : (\n <XCircle size={12} className=\"text-z-secondary\" />\n )}\n </div>\n <div className=\"flex items-center gap-2 mt-0.5\">\n <span className=\"text-sm font-bold text-z-secondary font-mono\">\n {plugin.id}\n </span>\n {plugin.author && (\n <>\n <span className=\"text-z-primary\">·</span>\n <span className=\"text-sm font-bold text-z-secondary\">\n {plugin.author}\n </span>\n </>\n )}\n </div>\n {plugin.description && (\n <p className=\"text-sm text-z-muted mt-1 max-w-lg\">{plugin.description}</p>\n )}\n </div>\n </div>\n\n <div className=\"flex items-center gap-2\">\n {plugin.homepage && (\n <a\n href={plugin.homepage}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\n 'p-2 border rounded-none transition-colors',\n 'border-z-border text-z-secondary hover:text-z-primary'\n )}\n title=\"Plugin homepage\"\n >\n <ExternalLink size={12} />\n </a>\n )}\n <button\n onClick={() => handleToggle(plugin)}\n disabled={saving === plugin.id}\n className={cn(\n 'p-2 border rounded-none transition-colors',\n plugin.enabled\n ? 'border-amber-500/20 text-amber-500 hover:text-amber-400'\n : 'border-z-border text-z-secondary hover:text-z-primary'\n )}\n title={plugin.enabled ? 'Disable' : 'Enable'}\n >\n {saving === plugin.id ? (\n <Loader2 size={14} className=\"animate-spin\" />\n ) : plugin.enabled ? (\n <ToggleRight size={18} />\n ) : (\n <ToggleLeft size={18} />\n )}\n </button>\n {hasConfig && (\n <button\n onClick={() => setExpandedId(isExpanded ? null : plugin.id)}\n className={cn(\n 'p-2 border rounded-none transition-colors',\n isExpanded\n ? 'border-z-border/30 text-z-secondary'\n : theme === 'dark'\n ? 'border-z-border text-z-secondary hover:text-z-primary'\n : 'border-z-border text-z-muted hover:text-z-secondary'\n )}\n title=\"Configure\"\n >\n <Settings size={14} />\n </button>\n )}\n <button\n onClick={() => handleDelete(plugin.id)}\n disabled={saving === plugin.id}\n className={cn(\n 'p-2 border rounded-none transition-colors',\n 'border-z-border text-z-secondary hover:text-status-red'\n )}\n title=\"Uninstall\"\n >\n <Trash2 size={14} />\n </button>\n </div>\n </div>\n\n {/* Config panel */}\n <AnimatePresence>\n {isExpanded && hasConfig && (\n <motion.div\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: 'auto' }}\n exit={{ opacity: 0, height: 0 }}\n className={cn(\n 'border-t px-5 py-4 space-y-4',\n theme === 'dark'\n ? 'border-z-border bg-app/20'\n : 'border-z-border shadow-sm bg-[var(--z-bg-input)]/50'\n )}\n >\n <span className=\"text-sm font-semibold text-z-muted\">Plugin Settings</span>\n {Object.entries(plugin.configSchema).map(([key, schema]) => (\n <div key={key} className=\"space-y-1.5\">\n <label className=\"text-sm font-semibold text-z-secondary\">\n {schema.label}\n {schema.required && <span className=\"text-red-400 ml-1\">*</span>}\n </label>\n {schema.description && (\n <p className=\"text-sm text-z-secondary\">{schema.description}</p>\n )}\n {schema.type === 'boolean' ? (\n <button\n onClick={() =>\n handleConfigChange(plugin.id, key, !plugin.config?.[key])\n }\n className={cn(\n 'flex items-center gap-2 px-3 py-2 border rounded-none transition-colors',\n plugin.config?.[key]\n ? 'border-z-border/30 bg-z-panel text-z-secondary'\n : 'border-z-border text-z-secondary'\n )}\n >\n {plugin.config?.[key] ? (\n <ToggleRight size={16} />\n ) : (\n <ToggleLeft size={16} />\n )}\n <span className=\"text-sm font-semibold\">\n {plugin.config?.[key] ? 'Enabled' : 'Disabled'}\n </span>\n </button>\n ) : schema.type === 'select' ? (\n <select\n value={plugin.config?.[key] || schema.default || ''}\n onChange={(e) => handleConfigChange(plugin.id, key, e.target.value)}\n className={cn(\n 'w-full border rounded-none py-2.5 px-3 text-sm font-bold transition-all outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black',\n 'bg-z-panel border-z-border text-z-primary focus:border-z-active-border'\n )}\n >\n {schema.options?.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n ) : schema.type === 'secret' ? (\n <input\n type=\"password\"\n value={plugin.config?.[key] || ''}\n onChange={(e) => handleConfigChange(plugin.id, key, e.target.value)}\n placeholder=\"••••••••\"\n className={cn(\n 'w-full border rounded-none py-2.5 px-3 text-sm font-mono transition-all outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black',\n 'bg-z-panel border-z-border text-z-primary focus:border-z-active-border'\n )}\n />\n ) : (\n <input\n type={\n schema.type === 'url'\n ? 'url'\n : schema.type === 'number'\n ? 'number'\n : 'text'\n }\n value={plugin.config?.[key] || schema.default || ''}\n onChange={(e) => handleConfigChange(plugin.id, key, e.target.value)}\n className={cn(\n 'w-full border rounded-none py-2.5 px-3 text-sm transition-all outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black',\n 'bg-z-panel border-z-border text-z-primary focus:border-z-active-border'\n )}\n />\n )}\n </div>\n ))}\n <div className=\"flex justify-end pt-2\">\n <button\n onClick={() => handleSaveConfig(plugin)}\n disabled={saving === plugin.id}\n className={cn(\n 'flex items-center gap-2 px-5 py-2.5 text-z-primary text-sm font-semibold transition-all disabled:opacity-40',\n 'bg-z-accent hover:brightness-110 shadow-sm text-z-logo-text'\n )}\n >\n {saving === plugin.id ? (\n <Loader2 size={10} className=\"animate-spin\" />\n ) : null}\n Save Settings\n </button>\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </motion.div>\n )\n })}\n </div>\n )}\n\n {/* Info footer */}\n <div\n className={cn(\n 'p-5 border rounded-none-none space-y-3',\n theme === 'dark'\n ? 'bg-z-hover border-z-border/10'\n : 'bg-[var(--z-bg-input)] border-z-border'\n )}\n >\n <div className=\"flex items-center gap-3\">\n <AlertTriangle size={14} className=\"text-amber-400\" />\n <span className=\"text-sm font-semibold text-amber-400\">Developer Note</span>\n </div>\n <ul className=\"space-y-1.5 text-sm text-z-muted font-bold leading-relaxed\">\n <li>• Plugins are registered in the database and managed via this UI</li>\n <li>• Plugin code must be loaded at engine startup via cms.config.ts</li>\n <li>\n • Community plugins should be published as{' '}\n <code className=\"text-z-secondary font-mono\">zenith-plugin-*</code> on npm\n </li>\n <li>\n • Use <code className=\"text-z-secondary font-mono\">configSchema</code> to expose\n settings that admins can configure here\n </li>\n <li>• Disabled plugins are not applied but remain installed for easy re-enabling</li>\n </ul>\n </div>\n </div>\n )\n}\n\nexport default SettingsPlugins\n","import React from 'react'\nimport { Key, CheckCircle2, Copy } from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport toast from 'react-hot-toast'\nimport { motion } from 'framer-motion'\n\n\ninterface SettingsApiKeyModalProps {\n newKey: any\n setNewKey: any\n theme: 'light' | 'dark'\n}\n\nconst SettingsApiKeyModal: React.FC<SettingsApiKeyModalProps> = ({ newKey, setNewKey, theme }) => {\n return (\n <div className=\"fixed inset-0 z-[100] flex items-center justify-center p-4 bg-[var(--z-bg-modal)] backdrop-blur-sm\">\n <motion.div\n {...({\n initial: { scale: 0.9, opacity: 0 },\n animate: { scale: 1, opacity: 1 },\n exit: { scale: 0.9, opacity: 0 }\n } as any)}\n className={cn(\n 'w-full max-w-md rounded-none-none p-6 border shadow-2xl relative overflow-hidden',\n theme === 'dark' ? 'bg-[#0a0a0a] border-z-border' : 'bg-z-panel border-z-border shadow-sm'\n )}\n >\n <div className=\"absolute top-0 right-0 p-6 text-z-secondary/10 pointer-events-none\">\n <Key size={120} strokeWidth={0.5} />\n </div>\n\n <div className=\"flex items-center gap-4 mb-8\">\n <div className=\"w-12 h-12 rounded-none-none bg-z-panel flex items-center justify-center text-z-secondary border border-z-border/20\">\n <CheckCircle2 size={24} />\n </div>\n <div>\n <h3 className=\"text-lg font-semibold leading-none\">Key Generated</h3>\n <p className=\"text-sm font-bold text-z-secondary mt-2\">\n Vault Node: {newKey.name}\n </p>\n </div>\n </div>\n\n <div className=\"space-y-4 mb-8\">\n <p className=\"text-sm font-semibold text-amber-500 leading-relaxed\">\n CRITICAL: Copy this key now. It will never be displayed again for security integrity.\n </p>\n <div\n className={cn(\n 'p-4 rounded-none-none border flex items-center justify-between gap-4 font-mono text-sm font-bold break-all transition-colors',\n theme === 'dark' ? 'bg-z-hover border-z-border' : 'bg-z-input border-z-border shadow-sm'\n )}\n >\n {newKey.key}\n <button\n onClick={() => {\n navigator.clipboard.writeText(newKey.key)\n toast.success('KEY_COPIED_TO_CLIPBOARD')\n }}\n className=\"p-2.5 rounded-none-none bg-z-border text-z-primary shrink-0 shadow-lg shadow-sm/20 hover:scale-105 active:scale-95 transition-all\"\n >\n <Copy size={14} />\n </button>\n </div>\n </div>\n\n <div className=\"space-y-2 mb-8\">\n <p className=\"text-sm font-bold text-z-muted\">\n Frontend .env Integration:\n </p>\n <div className={cn('p-4 rounded-none-none border font-mono text-sm whitespace-pre transition-colors text-z-secondary', theme === 'dark' ? 'bg-[#0a0a0a] border-z-border' : 'bg-z-accent border-z-border')}>\n{`VITE_CMS_URL=${typeof window !== 'undefined' ? window.location.origin : 'http://localhost:3000'}/api/v1\nVITE_CMS_API_KEY=${newKey.key}\nVITE_CMS_SITE_ID=your_tenant_id`}\n </div>\n </div>\n\n <button\n onClick={() => setNewKey(null)}\n className=\"w-full py-4 rounded-none-none bg-z-panel text-z-primary font-semibold text-sm hover:bg-[var(--z-border)] transition-all\"\n >\n I've copied the key\n </button>\n </motion.div>\n </div>\n )\n}\n\nexport default SettingsApiKeyModal\n","import React, { useState, useEffect, useCallback, useRef } from 'react'\nimport {\n Activity, CheckCircle2, XCircle, Clock, RefreshCw, Loader2,\n ChevronDown, ChevronUp, RotateCcw, Filter, Search, Download,\n AlertTriangle, Zap, Globe, ArrowRight\n} from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport api from '../../lib/api'\nimport toast from 'react-hot-toast'\n\ninterface WebhookDelivery {\n id: string\n webhookId?: string\n event: string\n url: string\n success: boolean\n responseStatus?: number\n responseBody?: string\n requestBody?: string\n requestHeaders?: Record<string, string>\n timestamp: string\n durationMs?: number\n retryCount?: number\n}\n\ninterface SettingsWebhookLogsProps {\n theme?: 'light' | 'dark'\n}\n\nconst STATUS_COLORS: Record<string, string> = {\n '2': 'text-z-active-text bg-z-active-bg border-z-accent/20',\n '3': 'text-z-active-text bg-z-accent/10 border-z-accent/20',\n '4': 'text-amber-400 bg-amber-500/10 border-amber-500/20',\n '5': 'text-red-400 bg-red-500/10 border-red-500/20',\n}\n\nfunction getStatusClass(status?: number): string {\n if (!status) return 'text-z-muted bg-z-hover border-z-border'\n const key = String(Math.floor(status / 100))\n return STATUS_COLORS[key] || 'text-z-muted bg-z-hover border-z-border'\n}\n\nexport default function SettingsWebhookLogs({ theme = 'dark' }: SettingsWebhookLogsProps) {\n const dark = theme === 'dark'\n\n const [logs, setLogs] = useState<WebhookDelivery[]>([])\n const [loading, setLoading] = useState(true)\n const [reloading, setReloading] = useState(false)\n const isMountedRef = useRef(true)\n useEffect(() => {\n return () => {\n isMountedRef.current = false\n }\n }, [])\n const [expandedId, setExpandedId] = useState<string | null>(null)\n const [replayingId, setReplayingId] = useState<string | null>(null)\n const [filter, setFilter] = useState<'all' | 'success' | 'failed'>('all')\n const [search, setSearch] = useState('')\n const [page, setPage] = useState(1)\n const [totalCount, setTotalCount] = useState(0)\n const PAGE_SIZE = 20\n\n const fetchLogs = useCallback(async (silent = false) => {\n if (!silent) setLoading(true)\n else setReloading(true)\n try {\n const params: Record<string, string | number> = { page, limit: PAGE_SIZE }\n if (filter !== 'all') params.status = filter\n if (search.trim()) params.search = search.trim()\n\n const res = await api.get('/system/webhooks/deliveries', { params })\n const data = res.data?.data\n if (Array.isArray(data)) {\n setLogs(data)\n setTotalCount(res.data?.meta?.total || data.length)\n } else if (data?.items) {\n setLogs(data.items)\n setTotalCount(data.total || data.items.length)\n } else {\n // Fallback: build mock data from audit logs\n const auditRes = await api.get('/system/audit-logs', { params: { limit: PAGE_SIZE, page } }).catch(() => null)\n if (auditRes?.data?.data) {\n const auditLogs: WebhookDelivery[] = (auditRes.data.data || []).map((l: any) => ({\n id: l._id || l.id,\n event: l.action || l.event || 'unknown',\n url: l.endpoint || '—',\n success: l.status !== 'error',\n responseStatus: l.statusCode || (l.status === 'error' ? 500 : 200),\n timestamp: l.createdAt || l.timestamp,\n durationMs: l.durationMs,\n }))\n setLogs(auditLogs)\n setTotalCount(auditRes.data?.meta?.total || auditLogs.length)\n }\n }\n } catch {\n // Silent fail — empty state will display\n } finally {\n setLoading(false)\n setReloading(false)\n }\n }, [page, filter, search])\n\n useEffect(() => { fetchLogs() }, [fetchLogs])\n\n const handleReplay = async (log: WebhookDelivery) => {\n if (!log.webhookId) return toast.error('No webhook ID for replay')\n setReplayingId(log.id)\n try {\n await api.post(`/system/webhooks/${log.webhookId}/replay`, { deliveryId: log.id })\n toast.success('Webhook replayed')\n fetchLogs(true)\n } catch (err: any) {\n toast.error(err?.response?.data?.error || 'Replay failed')\n } finally {\n setReplayingId(null)\n }\n }\n\n const handleExport = () => {\n const csv = [\n 'timestamp,event,url,status,duration_ms',\n ...logs.map(l =>\n `\"${l.timestamp}\",\"${l.event}\",\"${l.url}\",${l.success ? 'success' : 'failed'},${l.durationMs || ''}`\n )\n ].join('\\n')\n const blob = new Blob([csv], { type: 'text/csv' })\n const a = document.createElement('a')\n a.href = URL.createObjectURL(blob)\n a.download = `webhook-logs-${new Date().toISOString().split('T')[0]}.csv`\n a.click()\n toast.success('Exported')\n }\n\n const filtered = logs.filter(l => {\n const matchSearch = !search || l.event.includes(search) || l.url.includes(search)\n const matchFilter =\n filter === 'all' || (filter === 'success' && l.success) || (filter === 'failed' && !l.success)\n return matchSearch && matchFilter\n })\n\n const totalPages = Math.max(1, Math.ceil(totalCount / PAGE_SIZE))\n\n const card = cn(\n 'border rounded-none transition-all',\n dark\n ? 'bg-z-panel backdrop-blur-md border-z-border shadow-sm'\n : 'bg-z-panel border-z-border shadow-sm'\n )\n\n const inp = cn(\n 'border rounded-none py-2 px-3 text-sm font-mono outline-none transition-all focus:ring-1 focus:ring-z-active-border focus:border-z-accent',\n 'bg-z-input border-z-border text-z-primary placeholder:text-z-muted'\n )\n\n // Summary stats\n const successCount = logs.filter(l => l.success).length\n const failedCount = logs.filter(l => !l.success).length\n const avgDuration = logs.reduce((s, l) => s + (l.durationMs || 0), 0) / (logs.length || 1)\n\n return (\n <div className=\"space-y-6\">\n {/* Stats Row */}\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-3\">\n {[\n { label: 'Total Events', value: totalCount, icon: Activity, color: 'text-z-active-text' },\n { label: 'Successful', value: successCount, icon: CheckCircle2, color: 'text-z-active-text' },\n { label: 'Failed', value: failedCount, icon: XCircle, color: 'text-red-400' },\n { label: 'Avg Latency', value: `${Math.round(avgDuration)}ms`, icon: Clock, color: 'text-amber-400' },\n ].map(({ label, value, icon: Icon, color }) => (\n <div key={label} className={cn(card, 'p-4 flex items-center gap-3')}>\n <div className={cn('w-9 h-9 flex items-center justify-center border', dark ? 'bg-z-hover border-z-border' : 'bg-z-input border-z-border')}>\n <Icon size={16} className={color} />\n </div>\n <div>\n <div className={cn('text-lg font-semibold', 'text-z-primary')}>{value}</div>\n <div className=\"text-sm font-semibold text-z-secondary\">{label}</div>\n </div>\n </div>\n ))}\n </div>\n\n {/* Toolbar */}\n <div className={cn(card, 'p-4 flex flex-wrap items-center gap-3')}>\n <div className=\"relative flex-1 min-w-[180px]\">\n <Search size={12} className=\"absolute left-3 top-1/2 -translate-y-1/2 text-z-secondary\" />\n <input\n value={search}\n onChange={e => setSearch(e.target.value)}\n placeholder=\"Filter by event or URL...\"\n className={cn(inp, 'pl-8 w-full')}\n />\n </div>\n <div className=\"flex items-center gap-1\">\n {(['all', 'success', 'failed'] as const).map(f => (\n <button\n key={f}\n onClick={() => { setFilter(f); setPage(1) }}\n className={cn(\n 'px-3 py-1.5 text-sm font-semibold border transition-all',\n filter === f\n ? dark ? 'bg-z-accent/20 border-z-active-border text-z-active-text' : 'bg-z-active-bg border-z-active-border text-z-accent'\n : dark ? 'bg-z-hover border-z-border text-z-secondary hover:text-z-secondary' : 'bg-z-input border-z-border text-z-secondary'\n )}\n >\n {f}\n </button>\n ))}\n </div>\n <div className=\"flex items-center gap-2 ml-auto\">\n <button\n onClick={() => fetchLogs(true)}\n disabled={reloading}\n className={cn('p-2 border transition-all', dark ? 'border-z-border text-z-muted hover:text-z-primary hover:border-z-border' : 'border-z-border text-z-secondary hover:text-z-primary')}\n >\n <RefreshCw size={13} className={reloading ? 'animate-spin' : ''} />\n </button>\n <button\n onClick={handleExport}\n className={cn('flex items-center gap-1.5 px-3 py-2 text-sm font-semibold border transition-all', dark ? 'border-z-border text-z-muted hover:text-z-primary hover:border-z-border' : 'border-z-border text-z-secondary hover:text-z-primary')}\n >\n <Download size={11} />\n Export CSV\n </button>\n </div>\n </div>\n\n {/* Log Table */}\n <div className={cn(card, 'overflow-hidden')}>\n {/* Header */}\n <div className={cn('grid grid-cols-12 px-4 py-2 text-sm font-semibold text-z-secondary border-b', 'border-z-border')}>\n <div className=\"col-span-1\">Status</div>\n <div className=\"col-span-3\">Event</div>\n <div className=\"col-span-4\">Endpoint URL</div>\n <div className=\"col-span-2\">Time</div>\n <div className=\"col-span-1\">Latency</div>\n <div className=\"col-span-1\">Actions</div>\n </div>\n\n {loading ? (\n <div className=\"flex items-center justify-center py-16\">\n <Loader2 size={28} className=\"text-z-active-text animate-spin\" />\n </div>\n ) : filtered.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center py-16 gap-4\">\n <div className={cn('w-16 h-16 flex items-center justify-center border', dark ? 'bg-z-hover border-z-border text-z-secondary' : 'bg-z-input border-z-border text-z-muted')}>\n <Activity size={28} />\n </div>\n <div className=\"text-center\">\n <p className={cn('text-sm font-semibold ', dark ? 'text-z-muted' : 'text-z-secondary')}>No Event Logs</p>\n <p className=\"text-sm text-z-secondary mt-1\">Webhook deliveries will appear here</p>\n </div>\n </div>\n ) : (\n <div className=\"divide-y\" style={{ borderColor: 'var(--z-border)' }}>\n {filtered.map(log => {\n const isExpanded = expandedId === log.id\n return (\n <div key={log.id}>\n <div\n className={cn(\n 'grid grid-cols-12 px-4 py-3 items-center cursor-pointer group transition-colors',\n dark ? 'hover:bg-z-panel' : 'hover:bg-[var(--z-bg-input)]'\n )}\n onClick={() => setExpandedId(isExpanded ? null : log.id)}\n >\n {/* Status */}\n <div className=\"col-span-1 flex items-center\">\n {log.success\n ? <CheckCircle2 size={14} className=\"text-z-active-text\" />\n : <XCircle size={14} className=\"text-red-400\" />\n }\n </div>\n {/* Event */}\n <div className=\"col-span-3\">\n <span className={cn('text-sm font-semibold ', dark ? 'text-z-primary' : 'text-z-primary')}>\n {log.event}\n </span>\n {log.responseStatus && (\n <span className={cn('ml-2 text-sm font-semibold px-1.5 py-0.5 border', getStatusClass(log.responseStatus))}>\n {log.responseStatus}\n </span>\n )}\n </div>\n {/* URL */}\n <div className=\"col-span-4\">\n <span className={cn('text-sm font-mono truncate block', 'text-z-secondary')}>\n {log.url || '—'}\n </span>\n </div>\n {/* Time */}\n <div className=\"col-span-2\">\n <span className=\"text-sm text-z-secondary\">\n {log.timestamp ? new Date(log.timestamp).toLocaleString() : '—'}\n </span>\n </div>\n {/* Latency */}\n <div className=\"col-span-1\">\n <span className={cn('text-sm font-mono', log.durationMs && log.durationMs > 1000 ? 'text-amber-400' : 'text-z-secondary')}>\n {log.durationMs ? `${log.durationMs}ms` : '—'}\n </span>\n </div>\n {/* Actions */}\n <div className=\"col-span-1 flex items-center gap-1 opacity-0 group-hover:opacity-100 transition-opacity\">\n {!log.success && log.webhookId && (\n <button\n onClick={e => { e.stopPropagation(); handleReplay(log) }}\n disabled={replayingId === log.id}\n className=\"p-1.5 text-z-secondary hover:text-z-active-text transition-colors\"\n title=\"Replay\"\n >\n {replayingId === log.id ? <Loader2 size={12} className=\"animate-spin\" /> : <RotateCcw size={12} />}\n </button>\n )}\n {isExpanded ? <ChevronUp size={12} className=\"text-z-secondary\" /> : <ChevronDown size={12} className=\"text-z-secondary\" />}\n </div>\n </div>\n\n {/* Expanded Detail */}\n {isExpanded && (\n <div className={cn('px-4 pb-4 pt-2 space-y-3 border-t', dark ? 'border-z-border bg-z-panel' : 'border-z-border bg-[var(--z-bg-input)]')}>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-3\">\n {log.requestBody && (\n <div className=\"space-y-1.5\">\n <p className=\"text-sm font-semibold text-z-secondary\">Request Payload</p>\n <pre className={cn('text-sm font-mono p-3 border overflow-auto max-h-32 rounded-none', dark ? 'bg-app/60 border-z-border text-z-secondary' : 'bg-z-panel border-z-border text-z-primary')}>\n {(() => { try { return JSON.stringify(JSON.parse(log.requestBody), null, 2) } catch { return log.requestBody } })()}\n </pre>\n </div>\n )}\n {log.responseBody && (\n <div className=\"space-y-1.5\">\n <p className=\"text-sm font-semibold text-z-secondary\">Response Body</p>\n <pre className={cn('text-sm font-mono p-3 border overflow-auto max-h-32 rounded-none', dark ? 'bg-app/60 border-z-border text-z-secondary' : 'bg-z-panel border-z-border text-z-primary')}>\n {(() => { try { return JSON.stringify(JSON.parse(log.responseBody), null, 2) } catch { return log.responseBody } })()}\n </pre>\n </div>\n )}\n {!log.requestBody && !log.responseBody && (\n <p className=\"text-sm text-z-secondary italic\">No payload data available for this entry</p>\n )}\n </div>\n {log.retryCount !== undefined && log.retryCount > 0 && (\n <div className=\"flex items-center gap-2\">\n <AlertTriangle size={11} className=\"text-amber-400\" />\n <span className=\"text-sm text-amber-400 font-semibold\">\n {log.retryCount} Retry {log.retryCount === 1 ? 'Attempt' : 'Attempts'}\n </span>\n </div>\n )}\n </div>\n )}\n </div>\n )\n })}\n </div>\n )}\n </div>\n\n {/* Pagination */}\n {totalPages > 1 && (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-z-secondary\">\n Page {page} of {totalPages} · {totalCount} events\n </span>\n <div className=\"flex items-center gap-1\">\n <button\n onClick={() => setPage(p => Math.max(1, p - 1))}\n disabled={page === 1}\n className={cn('px-3 py-1.5 text-sm font-semibold border transition-all disabled:opacity-30', dark ? 'border-z-border text-z-muted hover:text-z-primary' : 'border-z-border text-z-secondary')}\n >\n Prev\n </button>\n <button\n onClick={() => setPage(p => Math.min(totalPages, p + 1))}\n disabled={page === totalPages}\n className={cn('px-3 py-1.5 text-sm font-semibold border transition-all disabled:opacity-30', dark ? 'border-z-border text-z-muted hover:text-z-primary' : 'border-z-border text-z-secondary')}\n >\n Next\n </button>\n </div>\n </div>\n )}\n </div>\n )\n}\n","import React, { useState, useEffect, useCallback } from 'react'\nimport {\n ShieldAlert, Cookie, FileText, Scale, Globe, Mail,\n Database, Download, Trash2, Eye, EyeOff, Loader2,\n CheckCircle2, AlertTriangle, ExternalLink, Clock, Calendar,\n Lock, Shield, Info, ChevronDown, ChevronUp\n} from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport api from '../../lib/api'\nimport toast from 'react-hot-toast'\n\ninterface ComplianceSettings {\n // GDPR / Privacy\n gdprEnabled: boolean\n ccpaEnabled: boolean\n cookieConsentEnabled: boolean\n cookieConsentCategories: string[]\n cookieExpiryDays: number\n // Policy URLs\n privacyPolicyUrl: string\n termsOfServiceUrl: string\n cookiePolicyUrl: string\n // Data Management\n dataRetentionDays: number\n autoDeleteExpiredData: boolean\n // Contact\n dpoEmail: string\n dpoName: string\n companyName: string\n companyAddress: string\n // Compliance Badges\n soc2Compliant: boolean\n iso27001Compliant: boolean\n hipaaCompliant: boolean\n}\n\nconst DEFAULTS: ComplianceSettings = {\n gdprEnabled: false,\n ccpaEnabled: false,\n cookieConsentEnabled: false,\n cookieConsentCategories: ['necessary', 'analytics', 'marketing'],\n cookieExpiryDays: 365,\n privacyPolicyUrl: '',\n termsOfServiceUrl: '',\n cookiePolicyUrl: '',\n dataRetentionDays: 365,\n autoDeleteExpiredData: false,\n dpoEmail: '',\n dpoName: '',\n companyName: '',\n companyAddress: '',\n soc2Compliant: false,\n iso27001Compliant: false,\n hipaaCompliant: false,\n}\n\nconst COOKIE_CATEGORIES = [\n { id: 'necessary', label: 'Necessary', desc: 'Required for the site to function. Cannot be disabled.', forced: true },\n { id: 'analytics', label: 'Analytics', desc: 'Help understand how visitors interact (Google Analytics, Plausible).' },\n { id: 'marketing', label: 'Marketing', desc: 'Used for advertising and retargeting (Facebook Pixel, Google Ads).' },\n { id: 'personalization', label: 'Personalization', desc: 'Remember user preferences and personalize the experience.' },\n { id: 'functional', label: 'Functional', desc: 'Enable additional features like live chat, videos, social media.' },\n]\n\ninterface SettingsLegalProps {\n theme?: 'light' | 'dark'\n}\n\nexport default function SettingsLegal({ theme = 'dark' }: SettingsLegalProps) {\n const dark = theme === 'dark'\n const [settings, setSettings] = useState<ComplianceSettings>(DEFAULTS)\n const [loading, setLoading] = useState(true)\n const [saving, setSaving] = useState(false)\n const [requestLoading, setRequestLoading] = useState(false)\n const [dataRequests, setDataRequests] = useState<any[]>([])\n const [expanded, setExpanded] = useState<string>('gdpr')\n\n const fetchSettings = useCallback(async () => {\n setLoading(true)\n try {\n const res = await api.get('/system/settings/compliance')\n if (res.data?.data) {\n setSettings(prev => ({ ...prev, ...res.data.data }))\n }\n } catch {\n // Use defaults — backend may not have compliance endpoint yet\n } finally {\n setLoading(false)\n }\n }, [])\n\n useEffect(() => { fetchSettings() }, [fetchSettings])\n\n const handleSave = async () => {\n setSaving(true)\n try {\n await api.patch('/system/settings/compliance', settings)\n toast.success('Compliance settings saved')\n } catch (err: any) {\n // Also try saving via main settings endpoint\n try {\n await api.patch('/system/settings', { compliance: settings })\n toast.success('Compliance settings saved')\n } catch {\n toast.error('Failed to save compliance settings')\n }\n } finally {\n setSaving(false)\n }\n }\n\n const card = cn(\n 'border rounded-none transition-all',\n dark\n ? 'bg-z-panel backdrop-blur-md border-z-border shadow-sm'\n : 'bg-z-panel border-z-border shadow-sm'\n )\n\n const inp = cn(\n 'w-full border rounded-none py-2.5 px-4 text-sm font-mono outline-none transition-all focus:ring-1 focus:ring-z-active-border focus:border-z-accent',\n 'bg-z-input border-z-border text-z-primary placeholder:text-z-muted'\n )\n\n const Toggle = ({ checked, onChange }: { checked: boolean; onChange: (v: boolean) => void }) => (\n <label className=\"relative inline-flex items-center cursor-pointer flex-shrink-0\">\n <input type=\"checkbox\" checked={checked} onChange={e => onChange(e.target.checked)} className=\"sr-only peer\" />\n <div className={cn(\"w-11 h-6 rounded-none peer peer-checked:after:translate-x-full after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-[var(--z-bg-hover)] after:rounded-none after:h-5 after:w-5 after:transition-all border shadow-inner\", 'bg-[var(--z-border-strong)] peer-checked:bg-z-accent border-transparent')}></div>\n </label>\n )\n\n const Section = ({ id, icon: Icon, title, desc, children }: { id: string; icon: any; title: string; desc: string; children: React.ReactNode }) => (\n <div className={card}>\n <button\n className=\"w-full flex items-center gap-4 p-5 text-left\"\n onClick={() => setExpanded(expanded === id ? '' : id)}\n >\n <div className={cn('w-10 h-10 flex items-center justify-center border flex-shrink-0', dark ? 'bg-z-active-bg border-z-active-border text-z-active-text' : 'bg-z-active-bg border-z-active-border text-z-accent')}>\n <Icon size={18} />\n </div>\n <div className=\"flex-1 min-w-0\">\n <h3 className={cn('text-sm font-semibold ', 'text-z-primary')}>{title}</h3>\n <p className=\"text-sm text-z-secondary mt-0.5\">{desc}</p>\n </div>\n {expanded === id ? <ChevronUp size={16} className=\"text-z-secondary\" /> : <ChevronDown size={16} className=\"text-z-secondary\" />}\n </button>\n {expanded === id && (\n <div className=\"px-5 pb-5 space-y-4 border-t\" style={{ borderColor: 'var(--z-border)' }}>\n <div className=\"pt-4 space-y-4\">{children}</div>\n </div>\n )}\n </div>\n )\n\n const ToggleRow = ({\n label, desc, value, onChange, disabled = false\n }: { label: string; desc: string; value: boolean; onChange: (v: boolean) => void; disabled?: boolean }) => (\n <div className={cn('flex items-center justify-between p-4 border', 'bg-z-panel border-z-border')}>\n <div>\n <p className={cn('text-sm font-semibold ', dark ? 'text-z-primary' : 'text-z-primary')}>{label}</p>\n <p className=\"text-sm text-z-secondary mt-0.5\">{desc}</p>\n </div>\n <Toggle checked={value} onChange={disabled ? () => {} : onChange} />\n </div>\n )\n\n if (loading) return (\n <div className=\"flex items-center justify-center py-20\">\n <Loader2 size={28} className=\"text-z-active-text animate-spin\" />\n </div>\n )\n\n return (\n <div className=\"space-y-4\">\n {/* Compliance Badges */}\n <div className=\"grid grid-cols-2 md:grid-cols-3 gap-3\">\n {[\n { key: 'gdprEnabled', label: 'GDPR', color: 'violet', icon: Shield },\n { key: 'ccpaEnabled', label: 'CCPA', color: 'blue', icon: Shield },\n { key: 'soc2Compliant', label: 'SOC 2', color: 'emerald', icon: CheckCircle2 },\n { key: 'iso27001Compliant', label: 'ISO 27001', color: 'amber', icon: Lock },\n { key: 'hipaaCompliant', label: 'HIPAA', color: 'pink', icon: Database },\n { key: 'cookieConsentEnabled', label: 'Cookie Consent', color: 'teal', icon: Cookie },\n ].map(({ key, label, color, icon: Icon }) => {\n const enabled = !!(settings as any)[key]\n return (\n <button\n key={key}\n onClick={() => setSettings(prev => ({ ...prev, [key]: !enabled }))}\n className={cn(\n 'flex items-center gap-3 p-4 border text-left transition-all',\n enabled\n ? dark ? `bg-${color}-500/10 border-${color}-500/30 shadow-sm` : `bg-${color}-50 border-${color}-200`\n : 'bg-z-panel border-z-border hover:border-z-active-border'\n )}\n >\n <Icon size={16} className={enabled ? `text-${color}-400` : 'text-z-secondary'} />\n <div>\n <p className={cn('text-sm font-semibold ', enabled ? dark ? `text-${color}-300` : `text-${color}-700` : dark ? 'text-z-muted' : 'text-z-secondary')}>{label}</p>\n <p className=\"text-sm text-z-secondary\">{enabled ? 'Enabled' : 'Disabled'}</p>\n </div>\n </button>\n )\n })}\n </div>\n\n {/* GDPR & Privacy */}\n <Section id=\"gdpr\" icon={ShieldAlert} title=\"GDPR & Privacy Compliance\" desc=\"EU/UK General Data Protection Regulation configuration\">\n <ToggleRow\n label=\"GDPR Mode\"\n desc=\"Enables GDPR-compliant data handling across all system modules\"\n value={settings.gdprEnabled}\n onChange={v => setSettings(prev => ({ ...prev, gdprEnabled: v }))}\n />\n <ToggleRow\n label=\"CCPA Compliance\"\n desc=\"California Consumer Privacy Act — enables opt-out of data sale\"\n value={settings.ccpaEnabled}\n onChange={v => setSettings(prev => ({ ...prev, ccpaEnabled: v }))}\n />\n <ToggleRow\n label=\"Auto-Delete Expired Data\"\n desc=\"Automatically purge user data beyond the retention period\"\n value={settings.autoDeleteExpiredData}\n onChange={v => setSettings(prev => ({ ...prev, autoDeleteExpiredData: v }))}\n />\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-semibold text-z-secondary\">Data Retention Period (days)</label>\n <input\n type=\"number\"\n value={settings.dataRetentionDays}\n onChange={e => setSettings(prev => ({ ...prev, dataRetentionDays: parseInt(e.target.value) || 365 }))}\n className={inp}\n placeholder=\"365\"\n />\n <p className=\"text-sm text-z-secondary\">User content and logs older than this will be eligible for deletion. Default: 365 days.</p>\n </div>\n </Section>\n\n {/* Cookie Consent */}\n <Section id=\"cookies\" icon={Cookie} title=\"Cookie Consent & Tracking\" desc=\"Banner configuration and cookie category management\">\n <ToggleRow\n label=\"Show Cookie Consent Banner\"\n desc=\"Display an EU-compliant consent banner to all visitors on first visit\"\n value={settings.cookieConsentEnabled}\n onChange={v => setSettings(prev => ({ ...prev, cookieConsentEnabled: v }))}\n />\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-semibold text-z-secondary\">Cookie Categories</label>\n <div className=\"space-y-2\">\n {COOKIE_CATEGORIES.map(cat => {\n const isEnabled = settings.cookieConsentCategories.includes(cat.id)\n return (\n <div key={cat.id} className={cn('flex items-start gap-3 p-3 border', 'border-z-border bg-z-hover')}>\n <input\n type=\"checkbox\"\n checked={isEnabled || cat.forced}\n disabled={cat.forced}\n onChange={e => {\n const cats = e.target.checked\n ? [...settings.cookieConsentCategories, cat.id]\n : settings.cookieConsentCategories.filter(c => c !== cat.id)\n setSettings(prev => ({ ...prev, cookieConsentCategories: cats }))\n }}\n className=\"mt-0.5 accent-z-accent\"\n />\n <div>\n <p className={cn('text-sm font-semibold ', dark ? 'text-z-primary' : 'text-z-primary')}>\n {cat.label} {cat.forced && <span className=\"text-z-secondary\">(Required)</span>}\n </p>\n <p className=\"text-sm text-z-secondary mt-0.5\">{cat.desc}</p>\n </div>\n </div>\n )\n })}\n </div>\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-semibold text-z-secondary\">Cookie Expiry (days)</label>\n <input\n type=\"number\"\n value={settings.cookieExpiryDays}\n onChange={e => setSettings(prev => ({ ...prev, cookieExpiryDays: parseInt(e.target.value) || 365 }))}\n className={inp}\n placeholder=\"365\"\n />\n </div>\n </Section>\n\n {/* Legal Documents */}\n <Section id=\"docs\" icon={FileText} title=\"Legal Document URLs\" desc=\"Privacy policy, terms of service, and cookie policy links\">\n {[\n { key: 'privacyPolicyUrl', label: 'Privacy Policy URL', placeholder: 'https://yoursite.com/privacy' },\n { key: 'termsOfServiceUrl', label: 'Terms of Service URL', placeholder: 'https://yoursite.com/terms' },\n { key: 'cookiePolicyUrl', label: 'Cookie Policy URL', placeholder: 'https://yoursite.com/cookies' },\n ].map(({ key, label, placeholder }) => (\n <div key={key} className=\"space-y-1.5\">\n <div className=\"flex items-center justify-between\">\n <label className=\"text-sm font-semibold text-z-secondary\">{label}</label>\n {(settings as any)[key] && (\n <a href={(settings as any)[key]} target=\"_blank\" rel=\"noopener noreferrer\"\n className=\"flex items-center gap-1 text-sm text-z-active-text hover:text-z-active-text\">\n Preview <ExternalLink size={9} />\n </a>\n )}\n </div>\n <input\n type=\"url\"\n value={(settings as any)[key] || ''}\n onChange={e => setSettings(prev => ({ ...prev, [key]: e.target.value }))}\n placeholder={placeholder}\n className={inp}\n />\n </div>\n ))}\n </Section>\n\n {/* DPO Contact */}\n <Section id=\"dpo\" icon={Mail} title=\"Data Protection Officer (DPO)\" desc=\"Required for GDPR compliance — DPO contact details\">\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-3\">\n {[\n { key: 'dpoName', label: 'DPO Full Name', placeholder: 'Jane Doe' },\n { key: 'dpoEmail', label: 'DPO Email Address', placeholder: 'dpo@company.com' },\n { key: 'companyName', label: 'Legal Entity Name', placeholder: 'Acme Corp Ltd.' },\n ].map(({ key, label, placeholder }) => (\n <div key={key} className=\"space-y-1.5\">\n <label className=\"text-sm font-semibold text-z-secondary\">{label}</label>\n <input\n type={key === 'dpoEmail' ? 'email' : 'text'}\n value={(settings as any)[key] || ''}\n onChange={e => setSettings(prev => ({ ...prev, [key]: e.target.value }))}\n placeholder={placeholder}\n className={inp}\n />\n </div>\n ))}\n <div className=\"space-y-1.5 md:col-span-2\">\n <label className=\"text-sm font-semibold text-z-secondary\">Registered Business Address</label>\n <textarea\n value={settings.companyAddress || ''}\n onChange={e => setSettings(prev => ({ ...prev, companyAddress: e.target.value }))}\n rows={2}\n placeholder=\"123 Business St, City, Country\"\n className={cn(inp, 'resize-none')}\n />\n </div>\n </div>\n </Section>\n\n {/* Certification Toggles */}\n <Section id=\"certs\" icon={Scale} title=\"Compliance Certifications\" desc=\"Declare certification status for your enterprise compliance posture\">\n <div className={cn('p-4 border flex items-start gap-3', dark ? 'bg-z-accent/5 border-z-accent/20' : 'bg-z-active-bg border-z-active-border')}>\n <Info size={14} className=\"text-z-active-text mt-0.5 flex-shrink-0\" />\n <p className=\"text-sm text-z-active-text leading-relaxed\">\n These flags are informational declarations only — enabling them does not automatically enforce the certification. Ensure your infrastructure and processes meet the actual certification requirements.\n </p>\n </div>\n <ToggleRow\n label=\"SOC 2 Type II\"\n desc=\"Declare SOC 2 certification for security, availability, and confidentiality\"\n value={settings.soc2Compliant}\n onChange={v => setSettings(prev => ({ ...prev, soc2Compliant: v }))}\n />\n <ToggleRow\n label=\"ISO 27001\"\n desc=\"Information security management system standard compliance\"\n value={settings.iso27001Compliant}\n onChange={v => setSettings(prev => ({ ...prev, iso27001Compliant: v }))}\n />\n <ToggleRow\n label=\"HIPAA\"\n desc=\"Health Insurance Portability and Accountability Act — healthcare data handling\"\n value={settings.hipaaCompliant}\n onChange={v => setSettings(prev => ({ ...prev, hipaaCompliant: v }))}\n />\n </Section>\n\n {/* Data Subject Rights */}\n <Section id=\"rights\" icon={Database} title=\"Data Subject Rights\" desc=\"Handle GDPR data export and deletion requests\">\n <div className={cn('p-4 border flex items-start gap-3', dark ? 'bg-amber-500/5 border-amber-500/20' : 'bg-amber-50 border-amber-200')}>\n <AlertTriangle size={14} className=\"text-amber-400 mt-0.5 flex-shrink-0\" />\n <p className=\"text-sm text-amber-400 leading-relaxed\">\n GDPR Articles 15-17 require you to fulfill data access, portability, and deletion requests within 30 days.\n </p>\n </div>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-3\">\n <button\n onClick={async () => {\n setRequestLoading(true)\n try {\n const res = await api.post('/system/settings/gdpr/export-all')\n toast.success(res.data?.message || 'Export initiated — check your email')\n } catch {\n toast.error('Export request failed')\n } finally {\n setRequestLoading(false)\n }\n }}\n className={cn('flex items-center justify-center gap-2 p-4 border text-sm font-semibold transition-all', dark ? 'bg-z-hover border-z-border text-z-secondary hover:border-z-active-border hover:text-z-active-text' : 'bg-z-input border-z-border text-z-primary hover:bg-z-active-bg hover:text-z-accent')}\n >\n {requestLoading ? <Loader2 size={13} className=\"animate-spin\" /> : <Download size={13} />}\n Export All User Data\n </button>\n <button\n onClick={async () => {\n if (!window.confirm('This will queue deletion of all expired user data. Are you sure?')) return\n setRequestLoading(true)\n try {\n const res = await api.post('/system/settings/gdpr/purge-expired')\n toast.success(res.data?.message || 'Purge queued')\n } catch {\n toast.error('Purge request failed')\n } finally {\n setRequestLoading(false)\n }\n }}\n className={cn('flex items-center justify-center gap-2 p-4 border text-sm font-semibold transition-all', dark ? 'bg-red-500/5 border-red-500/20 text-red-400 hover:bg-red-500/10' : 'bg-red-50 border-red-200 text-red-600 hover:bg-red-100')}\n >\n {requestLoading ? <Loader2 size={13} className=\"animate-spin\" /> : <Trash2 size={13} />}\n Purge Expired Records\n </button>\n </div>\n </Section>\n\n {/* Save Button */}\n <div className=\"flex justify-end pt-2\">\n <button\n onClick={handleSave}\n disabled={saving}\n className={cn(\n 'flex items-center justify-center gap-2 px-6 py-2.5 rounded-lg text-sm font-semibold transition-all shadow-sm hover:scale-105 active:scale-95 disabled:opacity-50 disabled:hover:scale-100',\n dark ? 'bg-emerald-500 hover:bg-emerald-400 text-black' : 'bg-emerald-500 text-white hover:bg-emerald-600'\n )}\n >\n {saving ? <Loader2 size={13} className=\"animate-spin\" /> : <CheckCircle2 size={13} />}\n Save Compliance Config\n </button>\n </div>\n </div>\n )\n}\n","import React, { useState, useEffect, useCallback } from 'react'\nimport {\n Server, RefreshCw, Zap, Cpu, HardDrive, Trash2, Loader2,\n CheckCircle2, AlertTriangle, Activity, Database, Clock,\n Gauge, Terminal, Info, Archive\n} from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport api from '../../lib/api'\nimport toast from 'react-hot-toast'\nimport { confirm } from '../../store/confirmStore'\n\ninterface SettingsSystemProps {\n theme: 'light' | 'dark'\n}\n\nconst SettingsSystem: React.FC<SettingsSystemProps> = ({ theme }) => {\n const dark = theme === 'dark'\n const [runningOperation, setRunningOperation] = useState<string | null>(null)\n const [healthData, setHealthData] = useState<any>(null)\n const [healthLoading, setHealthLoading] = useState(true)\n const [logs, setLogs] = useState<string[]>([])\n const [logsLoading, setLogsLoading] = useState(false)\n const [showLogs, setShowLogs] = useState(false)\n\n // Make uptime active\n useEffect(() => {\n const timer = setInterval(() => {\n setHealthData(prev => prev && prev.uptime != null ? { ...prev, uptime: prev.uptime + 1 } : prev)\n }, 1000)\n return () => clearInterval(timer)\n }, [])\n\n const fetchHealth = useCallback(async () => {\n setHealthLoading(true)\n try {\n const res = await api.get('/system/health')\n setHealthData(res.data?.data || res.data)\n } catch {\n // Use fallback\n } finally {\n setHealthLoading(false)\n }\n }, [])\n\n useEffect(() => { fetchHealth() }, [fetchHealth])\n\n // Auto-refresh health every 30s\n useEffect(() => {\n const interval = setInterval(fetchHealth, 30000)\n return () => clearInterval(interval)\n }, [fetchHealth])\n\n const fetchLogs = async () => {\n setLogsLoading(true)\n try {\n const res = await api.get('/system/ops/logs', { params: { lines: 50 } })\n setLogs(res.data?.data || ['Log streaming not available in current environment'])\n } catch {\n setLogs(['Unable to retrieve server logs. Ensure sufficient permissions.'])\n } finally {\n setLogsLoading(false)\n }\n }\n\n const handleSystemAction = async (actionName: string, endpoint: string, requiresConfirm = true) => {\n if (requiresConfirm) {\n if (!await confirm({ message: `Execute: ${actionName}? This may cause temporary downtime.` })) return\n }\n setRunningOperation(actionName)\n try {\n const res = await api.post(endpoint)\n toast.success(res.data?.message || `${actionName} executed successfully`)\n } catch (err: any) {\n toast.error(err?.response?.data?.message || `Failed to execute ${actionName}`)\n } finally {\n setRunningOperation(null)\n }\n }\n\n const operations = [\n {\n id: 'restart-backend',\n title: 'Restart Backend Node',\n description: 'Gracefully drains active connections and restarts the core Node.js server. PM2/nodemon will catch the exit.',\n icon: Server,\n color: 'text-z-active-text',\n bg: 'bg-z-active-bg',\n border: 'border-z-active-border',\n action: () => handleSystemAction('Restart Backend', '/system/ops/restart-backend'),\n },\n {\n id: 'restart-frontend',\n title: 'Restart Admin UI',\n description: 'Sends a reload signal to the frontend service or triggers a Vercel/PM2 restart for the admin dashboard.',\n icon: Cpu,\n color: 'text-z-active-text',\n bg: 'bg-z-accent/10',\n border: 'border-z-accent/20',\n action: () => handleSystemAction('Restart Frontend', '/system/ops/restart-frontend'),\n },\n {\n id: 'clear-cache',\n title: 'Flush System Cache',\n description: 'Purges Redis / in-memory caches, compiled templates, and temporary files. Forces fresh state.',\n icon: Trash2,\n color: 'text-amber-400',\n bg: 'bg-amber-500/10',\n border: 'border-amber-500/20',\n action: () => handleSystemAction('Clear Cache', '/system/ops/clear-cache', false),\n },\n {\n id: 'rebuild-backend',\n title: 'Rebuild Core API',\n description: 'Runs the TypeScript compiler and rebuilds the backend bundle before an automatic restart.',\n icon: HardDrive,\n color: 'text-z-active-text',\n bg: 'bg-z-active-bg',\n border: 'border-z-accent/20',\n action: () => handleSystemAction('Rebuild Backend', '/system/ops/rebuild-backend'),\n },\n {\n id: 'restart-all',\n title: 'Full Infrastructure Restart',\n description: 'Executes a cold boot of all services, databases, and caches. Use only for critical recovery.',\n icon: Zap,\n color: 'text-red-400',\n bg: 'bg-red-500/10',\n border: 'border-red-500/20',\n action: () => handleSystemAction('Restart All Systems', '/system/ops/restart-all'),\n },\n {\n id: 'create-backup',\n title: 'Create Database Backup',\n description: 'Snapshots the active database to a compressed archive. Download from the Database tab.',\n icon: Archive,\n color: 'text-teal-400',\n bg: 'bg-teal-500/10',\n border: 'border-teal-500/20',\n action: () => handleSystemAction('Create Backup', '/system/backup/create', false),\n }\n ]\n\n // Health metrics\n const memUsage = healthData?.memoryUsage\n const memUsedMB = memUsage?.heapUsed ? (memUsage.heapUsed / 1024 / 1024).toFixed(0) : '—'\n const memTotalMB = memUsage?.heapTotal ? (memUsage.heapTotal / 1024 / 1024).toFixed(0) : '—'\n const uptime = healthData?.uptime\n const uptimeStr = uptime \n ? (uptime < 3600 \n ? `${Math.floor(uptime / 60)}m ${Math.floor(uptime % 60)}s` \n : `${Math.floor(uptime / 3600)}h ${Math.floor((uptime % 3600) / 60)}m ${Math.floor(uptime % 60)}s`)\n : '—'\n const dbStatus = healthData?.database || 'unknown'\n const systemStatus = healthData?.status || 'unknown'\n\n const card = cn(\n 'border rounded-none transition-all shadow-sm',\n dark ? 'bg-z-panel backdrop-blur-md border-z-border' : 'bg-z-input border-z-border shadow-sm'\n )\n\n return (\n <div className=\"space-y-6\">\n {/* Warning Banner */}\n <div className={cn('p-5 border flex items-start gap-4', dark ? 'bg-amber-500/5 border-amber-500/30' : 'bg-amber-50 border-amber-200 shadow-sm')}>\n <AlertTriangle size={20} className=\"text-amber-500 shrink-0 mt-0.5\" />\n <div>\n <h3 className={cn('text-sm font-semibold ', dark ? 'text-amber-400' : 'text-amber-700')}>System Level Operations</h3>\n <p className={cn('text-sm font-bold mt-1', dark ? 'text-z-muted' : 'text-z-secondary')}>\n These operations directly manipulate process management (PM2, Docker) and may cause temporary service interruptions. Ensure all users are offline before executing destructive operations.\n </p>\n </div>\n </div>\n\n {/* Live System Health */}\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between px-1\">\n <p className=\"text-sm font-semibold text-z-secondary\">Live System Health</p>\n <button onClick={fetchHealth} className={cn('flex items-center gap-1 text-sm font-semibold ', dark ? 'text-z-secondary hover:text-z-primary' : 'text-z-muted hover:text-z-primary')}>\n <RefreshCw size={10} className={healthLoading ? 'animate-spin' : ''} />\n Refresh\n </button>\n </div>\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-3\">\n {[\n {\n label: 'System Status',\n value: systemStatus.toUpperCase(),\n icon: Activity,\n color: systemStatus === 'ok' ? 'text-z-active-text' : 'text-red-400',\n bg: systemStatus === 'ok' ? 'bg-z-active-bg' : 'bg-red-500/10',\n border: systemStatus === 'ok' ? 'border-z-accent/20' : 'border-red-500/20',\n },\n {\n label: 'Database',\n value: dbStatus.toUpperCase(),\n icon: Database,\n color: dbStatus === 'ok' ? 'text-z-active-text' : 'text-amber-400',\n bg: dbStatus === 'ok' ? 'bg-z-active-bg' : 'bg-amber-500/10',\n border: dbStatus === 'ok' ? 'border-z-accent/20' : 'border-amber-500/20',\n },\n {\n label: 'Memory',\n value: healthLoading ? '...' : `${memUsedMB}/${memTotalMB} MB`,\n icon: HardDrive,\n color: 'text-z-active-text',\n bg: 'bg-z-accent/10',\n border: 'border-z-accent/20',\n },\n {\n label: 'Uptime',\n value: healthLoading ? '...' : uptimeStr,\n icon: Clock,\n color: 'text-z-active-text',\n bg: 'bg-z-active-bg',\n border: 'border-z-active-border',\n },\n ].map(({ label, value, icon: Icon, color, bg, border }) => (\n <div key={label} className={cn(card, 'p-4 flex items-center gap-3')}>\n <div className={cn('w-9 h-9 flex items-center justify-center border', bg, border)}>\n <Icon size={15} className={color} />\n </div>\n <div>\n <p className={cn('text-sm font-semibold', 'text-z-primary')}>{healthLoading ? '...' : value}</p>\n <p className=\"text-sm font-semibold text-z-secondary\">{label}</p>\n </div>\n </div>\n ))}\n </div>\n\n {/* Version Info */}\n {healthData && (\n <div className={cn(card, 'px-5 py-4 flex flex-wrap gap-4')}>\n {[\n { label: 'CMS Version', value: healthData.version || '—' },\n { label: 'Node.js', value: healthData.nodeVersion || '—' },\n { label: 'Environment', value: (healthData.environment || import.meta.env.MODE || 'production').toUpperCase() },\n { label: 'Platform', value: navigator.platform || '—' },\n ].map(({ label, value }) => (\n <div key={label} className=\"space-y-0.5\">\n <p className=\"text-sm font-semibold text-z-secondary\">{label}</p>\n <p className={cn('text-sm font-mono font-bold', 'text-z-secondary')}>{value}</p>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* Operations Grid */}\n <div className=\"grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-4\">\n {operations.map(op => (\n <div key={op.id} className={cn(card, 'flex flex-col justify-between p-6 group')}>\n <div className=\"space-y-4\">\n <div className={cn('w-12 h-12 flex items-center justify-center border', op.bg, op.border, op.color)}>\n <op.icon size={20} />\n </div>\n <div>\n <h4 className={cn('text-sm font-semibold ', 'text-z-primary')}>{op.title}</h4>\n <p className={cn('text-sm font-bold leading-relaxed mt-2', 'text-z-secondary')}>{op.description}</p>\n </div>\n </div>\n <div className=\"mt-6 pt-4 border-t\" style={{ borderColor: 'var(--z-border)' }}>\n <button\n onClick={op.action}\n disabled={runningOperation !== null}\n className={cn('w-full flex items-center justify-center gap-2 px-4 py-3 text-sm font-semibold transition-all disabled:opacity-40',\n dark ? 'bg-z-hover hover:bg-[var(--z-bg-hover)] text-z-primary border border-z-border hover:border-z-border' : 'bg-[var(--z-border)] hover:bg-z-input text-z-primary border border-transparent')}\n >\n {runningOperation === op.title ? (\n <><Loader2 size={12} className=\"animate-spin\" />Executing...</>\n ) : (\n <><RefreshCw size={12} />Execute</>\n )}\n </button>\n </div>\n </div>\n ))}\n </div>\n\n {/* Server Log Viewer */}\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between px-1\">\n <p className=\"text-sm font-semibold text-z-secondary\">Server Log Stream</p>\n <button\n onClick={() => { setShowLogs(!showLogs); if (!showLogs) fetchLogs() }}\n className={cn('text-sm font-semibold flex items-center gap-1', dark ? 'text-z-active-text hover:text-z-active-text' : 'text-z-accent hover:text-z-active-text')}\n >\n <Terminal size={11} />\n {showLogs ? 'Hide' : 'Show'} Logs\n </button>\n </div>\n {showLogs && (\n <div className={cn('border rounded-none overflow-hidden', dark ? 'bg-app border-z-border' : 'bg-z-accent border-z-border')}>\n <div className=\"flex items-center justify-between px-4 py-2 border-b border-z-border\">\n <span className=\"text-sm font-semibold text-green-400\">● LIVE</span>\n <button onClick={fetchLogs} disabled={logsLoading} className=\"text-sm text-z-secondary hover:text-z-primary\">\n <RefreshCw size={10} className={logsLoading ? 'animate-spin' : ''} />\n </button>\n </div>\n <div className=\"p-4 font-mono text-sm text-green-400/80 max-h-64 overflow-y-auto space-y-0.5\">\n {logsLoading ? (\n <Loader2 size={14} className=\"animate-spin text-green-400\" />\n ) : logs.length === 0 ? (\n <p className=\"text-z-secondary\">No log entries available</p>\n ) : (\n logs.map((line, i) => (\n <p key={i} className=\"leading-5\">{line}</p>\n ))\n )}\n </div>\n </div>\n )}\n </div>\n </div>\n )\n}\n\nexport default SettingsSystem\n","import { useState, useEffect, useCallback } from 'react'\nimport { useLocation } from 'react-router-dom'\nimport {\n Settings as SettingsIcon,\n Save,\n Globe,\n Shield,\n Mail,\n Database,\n Palette,\n Loader2,\n Sparkles,\n Key,\n Users,\n CreditCard,\n Webhook,\n Puzzle,\n Image,\n FileText,\n ScrollText,\n Terminal,\n} from 'lucide-react'\nimport { cn } from '../lib/utils'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport toast from 'react-hot-toast'\nimport { useTheme } from '../context/ThemeContext'\nimport api from '../lib/api'\nimport { usePermissions } from '../hooks/usePermissions'\n\nimport { PageHeader } from '../components/ui/PageHeader'\nimport { ActionPanel } from '../components/ui/ActionPanel'\nimport { Card, CardContent } from '../components/ui/Card'\n\nimport SettingsGeneral from './settings/SettingsGeneral'\nimport SettingsSecurity from './settings/SettingsSecurity'\nimport SettingsNotifications from './settings/SettingsNotifications'\nimport SettingsUsers from './settings/SettingsUsers'\nimport SettingsApiKeys from './settings/SettingsApiKeys'\nimport SettingsDatabase from './settings/SettingsDatabase'\nimport SettingsRoles from './settings/SettingsRoles'\nimport SettingsAppearance from './settings/SettingsAppearance'\nimport SettingsWebhooks from './settings/SettingsWebhooks'\nimport SettingsPlugins from './settings/SettingsPlugins'\nimport SettingsApiKeyModal from './settings/SettingsApiKeyModal'\nimport SettingsWebhookLogs from './settings/SettingsWebhookLogs'\nimport SettingsLegal from './settings/SettingsLegal'\nimport SettingsSystem from './settings/SettingsSystem'\nimport ApiExplorerPage from './ApiExplorerPage'\n\ninterface Settings {\n siteName: string\n siteDescription: string\n logoUrl: string\n faviconUrl: string\n ogImageUrl: string\n publicUrl: string\n maintenanceMode: boolean\n defaultLocale: string\n supportedLocales: string[]\n timezone: string\n dateFormat: string\n enableTelemetry: boolean\n jwtExpiresIn?: string\n passwordMinLength?: number\n allowRegistration?: boolean\n rateLimitWindow?: number\n rateLimitMax?: number\n smtpHost?: string\n smtpPort?: number\n smtpUser?: string\n smtpPass?: string\n fromEmail?: string\n customCSS?: string\n [key: string]: any\n}\ninterface DBStats {\n size?: number\n collections?: number | string\n [key: string]: any\n}\n\ninterface User {\n _id: string\n email: string\n role: string\n [key: string]: any\n}\n\ninterface ApiKey {\n _id: string\n name: string\n role: string\n expiresAt: string | number | Date\n [key: string]: any\n}\n\ninterface NewKey {\n name: string\n key: string\n [key: string]: any\n}\n\ninterface Role {\n _id: string\n roleName: string\n roleType: 'admin' | 'editor' | 'viewer' | 'custom'\n description: string\n isSystem: boolean\n permissions: Array<{ resource: string; actions: string[] }>\n}\n\nconst SettingsPage = () => {\n const { theme } = useTheme()\n const { isAdmin, isEditor } = usePermissions()\n const location = useLocation()\n const queryParams = new URLSearchParams(location.search)\n const [activeTab, setActiveTab] = useState(queryParams.get('tab') || 'general')\n const [settings, setSettings] = useState<Settings>({\n siteName: '',\n siteDescription: '',\n logoUrl: '',\n faviconUrl: '',\n ogImageUrl: '',\n publicUrl: '',\n maintenanceMode: false,\n defaultLocale: 'en',\n supportedLocales: ['en'],\n timezone: 'UTC',\n dateFormat: 'MM/DD/YYYY',\n supportEmail: '',\n mediaProvider: 'local',\n maxUploadSize: 5242880,\n jwtExpiresIn: '7d',\n passwordMinLength: 8,\n allowRegistration: false,\n rateLimitWindow: 15,\n rateLimitMax: 100,\n corsOrigins: [],\n customCSS: '',\n enableTelemetry: true,\n })\n const [loading, setLoading] = useState(true)\n const [saving, setSaving] = useState(false)\n const [testingSmtp, setTestingSmtp] = useState(false)\n const [dbStats, setDbStats] = useState<DBStats | null>(null)\n const [users, setUsers] = useState<User[]>([])\n const [apiKeys, setApiKeys] = useState<ApiKey[]>([])\n const [newKey, setNewKey] = useState<NewKey | null>(null)\n const [activeSite, setActiveSite] = useState<any>(null)\n const [activeSiteId] = useState(localStorage.getItem('activeSiteId'))\n const [healthData, setHealthData] = useState<any>(null)\n const [roles, setRoles] = useState<Role[]>([])\n const [editingRole, setEditingRole] = useState<Role | null>(null)\n const [roleFilter, setRoleFilter] = useState<'all' | 'system' | 'custom'>('all')\n const [plugins, setPlugins] = useState<any[]>([])\n\n const fetchData = useCallback(async () => {\n setLoading(true)\n try {\n const [settingsRes, dbRes, usersRes, keysRes, healthRes, rolesRes, pluginsRes] = await Promise.all([\n api.get('/system/settings'),\n api.get('/system/db/stats'),\n api.get('/system/users'),\n api.get('/system/api-keys'),\n api.get('/system/health'),\n api.get('/roles').catch(() => ({ data: { data: [] } })),\n api.get('/system/plugins').catch(() => ({ data: { data: [] } }))\n ])\n setSettings(settingsRes.data.data)\n setDbStats(dbRes.data.data)\n setUsers(usersRes.data.data)\n setApiKeys(keysRes.data.data)\n setHealthData(healthRes.data.data)\n setRoles(rolesRes.data?.data || [])\n setPlugins(pluginsRes.data?.data || [])\n\n if (activeSiteId) {\n try {\n const siteRes = await api.get(`/sites/${activeSiteId}`)\n setActiveSite(siteRes.data.data)\n } catch (e) {\n console.error('Failed to load active site details', e)\n toast.error('Failed to load site details')\n }\n }\n } catch {\n console.error('Failed to fetch system parameters')\n toast.error('Failed to fetch system parameters')\n } finally {\n setTimeout(() => setLoading(false), 300)\n }\n }, [activeSiteId])\n\n useEffect(() => {\n const timer = setTimeout(() => { fetchData() }, 0)\n return () => clearTimeout(timer)\n }, [fetchData])\n\n useEffect(() => {\n const tab = queryParams.get('tab')\n if (tab) { setTimeout(() => setActiveTab(tab), 0) }\n }, [location.search])\n\n const handleSave = async () => {\n setSaving(true)\n try {\n await api.patch('/system/settings', settings)\n if (activeSite && activeSiteId) {\n await api.patch(`/sites/${activeSiteId}`, {\n billingEnabled: activeSite.billingEnabled,\n paymentProvider: activeSite.paymentProvider,\n stripePublicKey: activeSite.stripePublicKey,\n stripeSecretKey: activeSite.stripeSecretKey,\n stripeWebhookSecret: activeSite.stripeWebhookSecret,\n paypalClientId: activeSite.paypalClientId,\n paypalClientSecret: activeSite.paypalClientSecret,\n paypalWebhookId: activeSite.paypalWebhookId,\n razorpayKeyId: activeSite.razorpayKeyId,\n razorpayKeySecret: activeSite.razorpayKeySecret,\n razorpayWebhookSecret: activeSite.razorpayWebhookSecret,\n currency: activeSite.currency,\n pricingPlans: activeSite.pricingPlans,\n })\n }\n toast.success('Settings committed successfully')\n } catch (err: any) {\n toast.error('Failed to commit settings')\n } finally {\n setSaving(false)\n }\n }\n\n const tabGroups = [\n {\n label: 'Environment Settings',\n tabs: [\n { id: 'general', label: 'General Info', icon: Globe, sub: 'Site Profile', adminOnly: true },\n { id: 'appearance', label: 'Appearance', icon: Palette, sub: 'White-Label', adminOnly: true },\n ]\n },\n {\n label: 'Access Management',\n tabs: [\n { id: 'users', label: 'Users', icon: Users, sub: 'Admin Registry', adminOnly: true },\n { id: 'roles', label: 'Roles & Permissions', icon: Shield, sub: 'Granular Access', adminOnly: true },\n { id: 'keys', label: 'API Keys', icon: Key, sub: 'Access Tokens', adminOnly: true },\n ]\n },\n {\n label: 'Core Services',\n tabs: [\n { id: 'security', label: 'Security Policies', icon: Shield, sub: 'Access Control', adminOnly: true },\n { id: 'api-explorer', label: 'API Explorer', icon: Terminal, sub: 'GraphQL & REST' },\n { id: 'database', label: 'Database', icon: Database, sub: 'Storage Stats', adminOnly: true },\n ...(plugins.some(p => p.id.includes('email') || p.id.includes('smtp') || p.name.toLowerCase().includes('email'))\n ? [{ id: 'notifications', label: 'Email Relay', icon: Mail, sub: 'Email Delivery', adminOnly: true }]\n : []),\n ...(plugins.some(p => p.id.includes('webhook') || p.name.toLowerCase().includes('webhook'))\n ? [\n { id: 'webhooks', label: 'Webhooks', icon: Webhook, sub: 'HTTP Callbacks', adminOnly: true },\n { id: 'webhook-logs', label: 'Event Logs', icon: Webhook, sub: 'Webhook History', adminOnly: true }\n ]\n : []),\n { id: 'plugins', label: 'Plugins', icon: Puzzle, sub: 'Extensions', adminOnly: true },\n { id: 'system', label: 'System Ops', icon: SettingsIcon, sub: 'Restart & Maintenance', adminOnly: true },\n ]\n },\n {\n label: 'Legal & Compliance',\n tabs: [\n { id: 'legal', label: 'Compliance', icon: FileText, sub: 'Privacy & GDPR' },\n ]\n }\n ]\n\n const activeTabDetails = tabGroups.flatMap(g => g.tabs).find(t => t.id === activeTab)\n\n const renderTab = () => {\n switch (activeTab) {\n case 'general':\n return <SettingsGeneral settings={settings} setSettings={setSettings} theme={theme} />\n case 'security':\n return <SettingsSecurity settings={settings as any} setSettings={setSettings as any} theme={theme} />\n case 'notifications':\n return <SettingsNotifications settings={settings as any} setSettings={setSettings as any} theme={theme} testingSmtp={testingSmtp} setTestingSmtp={setTestingSmtp} />\n case 'users':\n return <SettingsUsers users={users} theme={theme} fetchData={fetchData} />\n case 'keys':\n return <SettingsApiKeys apiKeys={apiKeys} theme={theme} fetchData={fetchData} setNewKey={setNewKey} />\n case 'database':\n return <SettingsDatabase dbStats={dbStats} theme={theme} />\n case 'roles':\n return <SettingsRoles roles={roles} setRoles={setRoles} editingRole={editingRole} setEditingRole={setEditingRole} roleFilter={roleFilter} setRoleFilter={setRoleFilter} healthData={healthData} users={users} theme={theme} />\n case 'appearance':\n return <SettingsAppearance settings={settings as any} setSettings={setSettings as any} theme={theme} />\n case 'api-explorer':\n return <ApiExplorerPage />\n case 'webhooks':\n return <SettingsWebhooks theme={theme} />\n case 'plugins':\n return <SettingsPlugins theme={theme} />\n case 'webhook-logs':\n return <SettingsWebhookLogs theme={theme} />\n case 'legal':\n return <SettingsLegal theme={theme} />\n case 'system':\n return <SettingsSystem theme={theme} />\n default:\n return null\n }\n }\n\n if (loading) {\n return (\n <div className=\"min-h-[80vh] flex items-center justify-center\">\n <Loader2 size={32} className=\"text-z-secondary animate-spin\" />\n </div>\n )\n }\n\n return (\n <div className=\"flex flex-col h-[calc(100vh-64px)] overflow-hidden\">\n <PageHeader \n title=\"Settings\"\n description=\"Configure environment preferences, integrations, and access control.\"\n icon={<SettingsIcon size={24} />}\n backLink={{ to: '/', label: 'Dashboard' }}\n actions={\n <button\n onClick={handleSave}\n disabled={saving}\n className={cn(\n 'flex items-center justify-center gap-2 px-6 py-2.5 rounded-lg text-sm font-semibold transition-all shadow-sm hover:scale-105 active:scale-95 disabled:opacity-50 disabled:hover:scale-100',\n theme === 'dark' ? 'bg-emerald-500 hover:bg-emerald-400 text-black' : 'bg-emerald-500 text-white hover:bg-emerald-600'\n )}\n >\n {saving ? <Loader2 size={16} className=\"animate-spin\" /> : <Save size={16} />}\n Save Changes\n </button>\n }\n />\n\n <ActionPanel\n sidebarPosition=\"left\"\n sidebarWidth=\"w-full lg:w-[320px]\"\n className=\"flex-1 min-h-0\"\n sidebar={\n <div className=\"p-6 space-y-8 h-full overflow-y-auto pb-24\">\n {tabGroups.map((group) => (\n <div key={group.label}>\n <h3 className=\"text-sm font-semibold text-z-muted mb-3 px-3\">\n {group.label}\n </h3>\n <div className=\"space-y-1\">\n {group.tabs.filter(tab => !tab.adminOnly || isAdmin).map((tab) => (\n <button\n key={tab.id}\n onClick={() => setActiveTab(tab.id)}\n className={cn(\n 'w-full flex items-center gap-3 px-3 py-2.5 rounded-none transition-all group border',\n activeTab === tab.id\n ? 'bg-z-active-bg border-z-active-border text-z-active-text shadow-sm transform scale-[1.02]'\n : 'text-z-secondary border-transparent hover:bg-z-hover hover:text-z-primary'\n )}\n >\n <div className={cn(\n \"w-8 h-8 flex items-center justify-center transition-colors shadow-sm\",\n activeTab === tab.id ? \"bg-z-accent text-z-logo-text\" : \"bg-z-hover text-z-secondary group-hover:text-z-primary\"\n )}>\n <tab.icon size={16} />\n </div>\n <div className=\"flex flex-col items-start leading-tight\">\n <span className=\"text-sm font-semibold\">{tab.label}</span>\n </div>\n </button>\n ))}\n </div>\n </div>\n ))}\n </div>\n }\n >\n <div className={cn(\"flex-1 overflow-y-auto p-6 lg:p-10 pb-32 lg:pb-32\", theme === 'dark' && 'bg-app')}>\n <div className={cn(\"min-h-[600px] border mb-16\", 'z-card p-8')}>\n <AnimatePresence mode=\"wait\">\n <motion.div\n key={activeTab}\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -10 }}\n className=\"space-y-8 relative z-10\"\n >\n <div className=\"flex items-center gap-4 border-b pb-6\" style={{ borderColor: 'var(--z-border)' }}>\n <div className=\"w-10 h-10 bg-z-active-bg flex items-center justify-center text-z-active-text\">\n {activeTabDetails?.icon && <activeTabDetails.icon size={20} />}\n </div>\n <div>\n <h2 className={cn(\"text-xl font-bold \", 'text-z-primary')}>\n {activeTabDetails?.label}\n </h2>\n <p className={cn(\"text-xs mt-1\", theme === 'dark' ? 'text-z-muted' : 'text-z-secondary')}>{activeTabDetails?.sub}</p>\n </div>\n </div>\n \n <div className=\"space-y-6 w-full\">\n {renderTab()}\n </div>\n </motion.div>\n </AnimatePresence>\n </div>\n </div>\n </ActionPanel>\n\n <AnimatePresence>\n {newKey && <SettingsApiKeyModal newKey={newKey} setNewKey={setNewKey} theme={theme} />}\n </AnimatePresence>\n </div>\n )\n}\n\nexport default SettingsPage\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SettingsPage-DYYNnxkV.js","names":[],"sources":["../../src/hooks/usePermissions.ts","../../src/components/ui/ActionPanel.tsx","../../src/pages/settings/SettingsGeneral.tsx","../../src/pages/settings/SettingsSecurity.tsx","../../src/pages/settings/SettingsNotifications.tsx","../../src/pages/settings/InviteUserModal.tsx","../../src/pages/settings/EditUserModal.tsx","../../src/pages/settings/SettingsUsers.tsx","../../src/pages/settings/GenerateKeyModal.tsx","../../src/pages/settings/ApiIntegrationGuide.tsx","../../src/pages/settings/SettingsApiKeys.tsx","../../src/pages/settings/SettingsDatabase.tsx","../../src/pages/settings/CreateRoleModal.tsx","../../src/pages/settings/DeleteRoleConfirmDialog.tsx","../../src/pages/settings/SettingsRoles.tsx","../../src/pages/settings/SettingsAppearance.tsx","../../src/pages/settings/SettingsWebhooks.tsx","../../src/pages/settings/SettingsPlugins.tsx","../../src/pages/settings/SettingsApiKeyModal.tsx","../../src/pages/settings/SettingsWebhookLogs.tsx","../../src/pages/settings/SettingsLegal.tsx","../../src/pages/settings/SettingsSystem.tsx","../../src/pages/SettingsPage.tsx"],"sourcesContent":["/**\n * usePermissions\n *\n * A role-based UI access hook. Components import this to conditionally\n * render actions based on the currently authenticated user's role.\n *\n * Roles in order of least → most privilege:\n * viewer → editor → admin\n *\n * Usage:\n * const { can } = usePermissions()\n * if (can('publish')) { ... }\n * <PermissionGate action=\"delete\"><button>Delete</button></PermissionGate>\n */\n\nimport React from 'react'\nimport { useAuthStore } from '../store/authStore'\n\ntype Role = 'admin' | 'editor' | 'viewer'\n\ntype Action =\n | 'view'\n | 'create'\n | 'edit'\n | 'delete'\n | 'publish'\n | 'unpublish'\n | 'manage_users'\n | 'manage_settings'\n | 'manage_plugins'\n | 'manage_schema'\n | 'manage_api_keys'\n | 'download_backup'\n | 'view_audit_log'\n | 'manage_redirects'\n\n/** Map each action to the minimum role required */\nconst PERMISSION_MAP: Record<Action, Role> = {\n view: 'viewer',\n create: 'editor',\n edit: 'editor',\n publish: 'editor',\n unpublish: 'editor',\n delete: 'editor',\n view_audit_log: 'editor',\n manage_redirects: 'editor',\n manage_schema: 'admin',\n manage_settings: 'admin',\n manage_plugins: 'admin',\n manage_users: 'admin',\n manage_api_keys: 'admin',\n download_backup: 'admin',\n}\n\nconst ROLE_HIERARCHY: Record<Role, number> = {\n viewer: 0,\n editor: 1,\n admin: 2,\n}\n\nfunction hasPermission(userRole: Role | undefined, action: Action): boolean {\n if (!userRole) return false\n const requiredLevel = ROLE_HIERARCHY[PERMISSION_MAP[action]] ?? 999\n const userLevel = ROLE_HIERARCHY[userRole] ?? -1\n return userLevel >= requiredLevel\n}\n\n/** Hook that returns a `can(action)` helper based on the logged-in user's role */\nexport function usePermissions() {\n const user = useAuthStore((s) => s.user)\n const role = (user?.role ?? 'viewer') as Role\n\n return {\n role,\n /** Returns true if the current user can perform the given action */\n can: (action: Action) => hasPermission(role, action),\n /** Returns true if the current user is an admin */\n isAdmin: role === 'admin',\n /** Returns true if the current user is an editor or above */\n isEditor: ROLE_HIERARCHY[role] >= ROLE_HIERARCHY['editor'],\n }\n}\n\n/** HOC: renders children only if the current user can perform the given action */\nexport function PermissionGate({\n action,\n children,\n fallback = null,\n}: {\n action: Action\n children: React.ReactNode\n fallback?: React.ReactNode\n}): React.ReactElement | null {\n const { can } = usePermissions()\n return can(action) ? (children as React.ReactElement) : (fallback as React.ReactElement | null)\n}\n","import React from 'react';\nimport { cn } from '../../lib/utils';\nimport { useTheme } from '../../context/ThemeContext';\n\nexport interface ActionPanelProps extends React.HTMLAttributes<HTMLDivElement> {\n sidebar?: React.ReactNode;\n sidebarPosition?: 'left' | 'right';\n sidebarWidth?: string;\n}\n\nexport function ActionPanel({ \n children, \n sidebar, \n sidebarPosition = 'right',\n sidebarWidth = 'w-[320px]',\n className,\n ...props \n}: ActionPanelProps) {\n const { theme } = useTheme();\n\n return (\n <div \n className={cn(\n \"flex flex-col lg:flex-row h-full min-h-[calc(100vh-65px)]\",\n className\n )}\n {...props}\n >\n {sidebarPosition === 'left' && sidebar && (\n <div className={cn(\n \"shrink-0 border-b lg:border-b-0 lg:border-r flex flex-col\",\n sidebarWidth,\n theme === 'dark' ? 'border-z-border bg-[#050505]' : 'border-z-border bg-[var(--z-bg-input)]/30'\n )}>\n {sidebar}\n </div>\n )}\n \n <div className=\"flex-1 flex flex-col min-w-0\">\n {children}\n </div>\n\n {sidebarPosition === 'right' && sidebar && (\n <div className={cn(\n \"shrink-0 border-t lg:border-t-0 lg:border-l flex flex-col\",\n sidebarWidth,\n theme === 'dark' ? 'border-z-border bg-[#050505]' : 'border-z-border bg-[var(--z-bg-input)]/30'\n )}>\n {sidebar}\n </div>\n )}\n </div>\n );\n}\n","import React, { useState, useEffect, useCallback } from 'react'\nimport {\n Globe, Palette, Upload, Image, Check, Copy, Link2, MapPin,\n Clock, Mail, Loader2, Eye, ExternalLink, Calendar, Tag\n} from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport api from '../../lib/api'\nimport toast from 'react-hot-toast'\n\n// IANA Timezone list — abbreviated\nconst TIMEZONES = [\n 'UTC', 'America/New_York', 'America/Chicago', 'America/Denver', 'America/Los_Angeles',\n 'America/Anchorage', 'America/Honolulu', 'America/Sao_Paulo', 'America/Toronto', 'America/Vancouver',\n 'Europe/London', 'Europe/Paris', 'Europe/Berlin', 'Europe/Amsterdam', 'Europe/Rome',\n 'Europe/Madrid', 'Europe/Stockholm', 'Europe/Athens', 'Europe/Warsaw', 'Europe/Prague',\n 'Asia/Dubai', 'Asia/Kolkata', 'Asia/Singapore', 'Asia/Tokyo', 'Asia/Shanghai',\n 'Asia/Seoul', 'Asia/Bangkok', 'Asia/Jakarta', 'Asia/Karachi', 'Asia/Tehran',\n 'Africa/Cairo', 'Africa/Lagos', 'Africa/Johannesburg', 'Africa/Nairobi',\n 'Australia/Sydney', 'Australia/Melbourne', 'Pacific/Auckland',\n]\n\nconst LOCALES = [\n { value: 'en', label: 'English (en)' },\n { value: 'en-US', label: 'English US (en-US)' },\n { value: 'en-GB', label: 'English UK (en-GB)' },\n { value: 'fr', label: 'French (fr)' },\n { value: 'de', label: 'German (de)' },\n { value: 'es', label: 'Spanish (es)' },\n { value: 'it', label: 'Italian (it)' },\n { value: 'pt', label: 'Portuguese (pt)' },\n { value: 'ar', label: 'Arabic (ar)' },\n { value: 'zh', label: 'Chinese (zh)' },\n { value: 'ja', label: 'Japanese (ja)' },\n { value: 'ko', label: 'Korean (ko)' },\n { value: 'hi', label: 'Hindi (hi)' },\n { value: 'ru', label: 'Russian (ru)' },\n { value: 'nl', label: 'Dutch (nl)' },\n { value: 'pl', label: 'Polish (pl)' },\n { value: 'tr', label: 'Turkish (tr)' },\n]\n\ninterface SettingsGeneralProps {\n settings: {\n siteName: string\n siteDescription: string\n logoUrl: string\n faviconUrl: string\n publicUrl: string\n defaultLocale: string\n supportedLocales: string[]\n maintenanceMode: boolean\n timezone?: string\n supportEmail?: string\n dateFormat?: string\n ogImageUrl?: string\n [key: string]: any\n }\n setSettings: (s: any) => void\n theme: 'light' | 'dark'\n}\n\nconst SettingsGeneral: React.FC<SettingsGeneralProps> = ({ settings, setSettings, theme }) => {\n const dark = theme === 'dark'\n const [copied, setCopied] = useState(false)\n const [uploadingLogo, setUploadingLogo] = useState(false)\n const [uploadingFavicon, setUploadingFavicon] = useState(false)\n const [uploadingOg, setUploadingOg] = useState(false)\n\n const activeSiteId = localStorage.getItem('activeSiteId') || ''\n const activeSiteName = localStorage.getItem('activeSiteName') || 'Unknown Site'\n\n const handleCopy = () => {\n if (!activeSiteId) return\n navigator.clipboard.writeText(activeSiteId).then(() => {\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n })\n }\n\n const handleImageUpload = async (\n file: File,\n field: 'logoUrl' | 'faviconUrl' | 'ogImageUrl',\n setUploading: (v: boolean) => void\n ) => {\n setUploading(true)\n try {\n const form = new FormData()\n form.append('file', file)\n const res = await api.post('/upload', form, { headers: { 'Content-Type': 'multipart/form-data' } })\n const url = res.data?.data?.url || res.data?.url\n if (url) {\n setSettings({ ...settings, [field]: url })\n toast.success('Image uploaded')\n }\n } catch {\n toast.error('Upload failed')\n } finally {\n setUploading(false)\n }\n }\n\n const card = cn(\n 'p-5 border rounded-none transition-all space-y-3',\n dark ? 'bg-z-panel backdrop-blur-md border-z-border shadow-sm' : 'bg-[var(--z-bg-input)]/50 border-z-border shadow-sm'\n )\n\n const inp = cn(\n 'w-full border rounded-none py-2.5 px-4 text-sm transition-all outline-none focus:ring-1 focus:ring-z-active-border focus:border-z-accent',\n dark ? 'bg-app/80 border-z-border text-z-primary placeholder:text-z-primary' : 'bg-z-panel border-z-border'\n )\n\n const ImageUploadField = ({\n field, label, value, uploading, setUploading\n }: { field: 'logoUrl' | 'faviconUrl' | 'ogImageUrl'; label: string; value: string; uploading: boolean; setUploading: (v: boolean) => void }) => (\n <div className={card}>\n <label className=\"text-sm font-semibold text-z-secondary\">{label}</label>\n <div className=\"flex gap-3 items-start\">\n {/* Preview */}\n <div className={cn('w-16 h-16 flex-shrink-0 border flex items-center justify-center overflow-hidden', dark ? 'bg-app/80 border-z-border' : 'bg-[var(--z-bg-hover)] border-z-border')}>\n {value ? (\n <img src={value} alt={label} className=\"w-full h-full object-contain\" onError={e => { (e.target as any).style.display = 'none' }} />\n ) : (\n <Image size={20} className=\"text-z-secondary\" />\n )}\n </div>\n <div className=\"flex-1 space-y-2\">\n <input\n type=\"url\"\n value={value || ''}\n onChange={e => setSettings({ ...settings, [field]: e.target.value })}\n placeholder=\"https://...\"\n className={inp}\n />\n <label className={cn('flex items-center gap-2 cursor-pointer text-sm font-semibold border px-3 py-2 w-fit transition-all', dark ? 'border-z-border text-z-muted hover:text-z-primary hover:border-z-border' : 'border-z-border text-z-secondary hover:text-z-primary')}>\n {uploading ? <Loader2 size={12} className=\"animate-spin\" /> : <Upload size={12} />}\n Upload File\n <input\n type=\"file\"\n accept=\"image/*\"\n className=\"hidden\"\n onChange={e => {\n const file = e.target.files?.[0]\n if (file) handleImageUpload(file, field, setUploading)\n }}\n />\n </label>\n </div>\n </div>\n </div>\n )\n\n return (\n <div className=\"space-y-4\">\n {/* Site ID Banner */}\n <div className={cn('p-5 border space-y-3', dark ? 'bg-z-panel backdrop-blur-md border-z-border shadow-sm' : 'bg-z-input border-z-border')}>\n <div className=\"flex items-center gap-2\">\n <Link2 size={12} className=\"text-z-secondary\" />\n <span className=\"text-sm font-semibold text-z-secondary\">Site Identifier</span>\n <span className=\"ml-auto text-sm text-z-secondary\">{activeSiteName}</span>\n </div>\n <div className=\"flex items-center gap-3\">\n <code className={cn('flex-1 font-mono text-sm px-3 py-2 border truncate', 'bg-z-panel border-z-border text-z-primary')}>\n {activeSiteId || <span className=\"opacity-40\">No site selected</span>}\n </code>\n <button\n onClick={handleCopy}\n disabled={!activeSiteId}\n className={cn('flex items-center gap-2 px-4 py-2 text-xs font-bold border transition-all', activeSiteId\n ? dark ? 'bg-z-accent hover:brightness-110 text-z-logo-text border-transparent shadow-sm' : 'bg-z-base text-z-primary border-transparent hover:bg-z-base'\n : 'bg-z-hover text-z-secondary cursor-not-allowed border-z-border')}\n >\n {copied ? <Check size={13} /> : <Copy size={13} />}\n {copied ? 'Copied!' : 'Copy'}\n </button>\n </div>\n <p className={cn('text-sm leading-relaxed', 'text-z-secondary')}>\n Use this as <code className=\"px-1 py-0.5 bg-z-panel/10\">VITE_CMS_SITE_ID</code> in template <code className=\"px-1 py-0.5 bg-z-panel/10\">.env</code> files to connect storefronts to this site.\n </p>\n </div>\n\n {/* Core Identity */}\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div className={card}>\n <label className=\"text-sm font-semibold text-z-secondary\">Application Name</label>\n <input type=\"text\" value={settings.siteName || ''} onChange={e => setSettings({ ...settings, siteName: e.target.value })} className={inp} placeholder=\"My CMS\" />\n </div>\n <div className={card}>\n <label className=\"text-sm font-semibold text-z-secondary\">Support Email</label>\n <input type=\"email\" value={settings.supportEmail || ''} onChange={e => setSettings({ ...settings, supportEmail: e.target.value })} className={inp} placeholder=\"support@company.com\" />\n </div>\n </div>\n\n <div className={card}>\n <label className=\"text-sm font-semibold text-z-secondary\">Site Description</label>\n <textarea value={settings.siteDescription || ''} onChange={e => setSettings({ ...settings, siteDescription: e.target.value })} rows={3} className={cn(inp, 'resize-none')} placeholder=\"A short description of your platform...\" />\n </div>\n\n <div className={card}>\n <label className=\"text-sm font-semibold text-z-secondary\">Public API Endpoint</label>\n <input type=\"url\" value={settings.publicUrl || ''} onChange={e => setSettings({ ...settings, publicUrl: e.target.value })} className={inp} placeholder=\"https://api.yoursite.com\" />\n <p className=\"text-sm text-z-secondary\">The publicly-accessible URL where your CMS API is hosted.</p>\n </div>\n\n {/* Media Branding */}\n <div className=\"space-y-1.5\">\n <p className=\"text-sm font-semibold text-z-secondary px-1\">Branding Assets</p>\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <ImageUploadField field=\"logoUrl\" label=\"Site Logo\" value={settings.logoUrl} uploading={uploadingLogo} setUploading={setUploadingLogo} />\n <ImageUploadField field=\"faviconUrl\" label=\"Favicon\" value={settings.faviconUrl} uploading={uploadingFavicon} setUploading={setUploadingFavicon} />\n <ImageUploadField field=\"ogImageUrl\" label=\"OG Share Image\" value={settings.ogImageUrl || ''} uploading={uploadingOg} setUploading={setUploadingOg} />\n </div>\n </div>\n\n {/* Localization */}\n <div className=\"space-y-1.5\">\n <p className=\"text-sm font-semibold text-z-secondary px-1\">Localization</p>\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <div className={card}>\n <label className=\"text-sm font-semibold text-z-secondary\">Default Locale</label>\n <select value={settings.defaultLocale || 'en'} onChange={e => setSettings({ ...settings, defaultLocale: e.target.value })} className={inp}>\n {LOCALES.map(l => <option key={l.value} value={l.value}>{l.label}</option>)}\n </select>\n </div>\n <div className={card}>\n <label className=\"text-sm font-semibold text-z-secondary\">Timezone</label>\n <select value={settings.timezone || 'UTC'} onChange={e => setSettings({ ...settings, timezone: e.target.value })} className={inp}>\n {TIMEZONES.map(tz => <option key={tz} value={tz}>{tz}</option>)}\n </select>\n </div>\n <div className={card}>\n <label className=\"text-sm font-semibold text-z-secondary\">Date Format</label>\n <select value={settings.dateFormat || 'MM/DD/YYYY'} onChange={e => setSettings({ ...settings, dateFormat: e.target.value })} className={inp}>\n {['MM/DD/YYYY', 'DD/MM/YYYY', 'YYYY-MM-DD', 'MMMM D, YYYY', 'D MMMM YYYY'].map(f => (\n <option key={f} value={f}>{f}</option>\n ))}\n </select>\n </div>\n </div>\n </div>\n\n {/* Maintenance Mode */}\n <div className={cn('p-5 border flex items-center justify-between transition-all group rounded-lg', \n settings.maintenanceMode \n ? (dark ? 'bg-red-950/20 border-red-900/50 shadow-[0_0_15px_rgba(220,38,38,0.15)]' : 'bg-red-50 border-red-200 shadow-sm')\n : (dark ? 'bg-z-panel backdrop-blur-md border-z-border shadow-sm' : 'bg-[var(--z-bg-input)]/50 border-z-border shadow-sm')\n )}>\n <div>\n <div className=\"flex items-center gap-2\">\n <span className={cn('text-sm font-bold', settings.maintenanceMode ? 'text-red-500' : (dark ? 'text-z-primary' : 'text-z-primary'))}>\n Maintenance Protocol\n </span>\n {settings.maintenanceMode && (\n <span className=\"px-2 py-0.5 rounded text-[10px] font-bold uppercase tracking-wider bg-red-500 text-white animate-pulse\">Active</span>\n )}\n </div>\n <p className={cn(\"text-sm mt-1\", settings.maintenanceMode ? 'text-red-500/80' : 'text-z-secondary')}>Restrict public access to the system while active. Admins can still log in.</p>\n </div>\n <label className=\"relative inline-flex items-center cursor-pointer flex-shrink-0\">\n <input type=\"checkbox\" checked={settings.maintenanceMode} onChange={e => setSettings({ ...settings, maintenanceMode: e.target.checked })} className=\"sr-only peer\" />\n <div className={cn(\n \"w-11 h-6 rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all shadow-inner\", \n dark ? 'bg-gray-700 peer-checked:bg-red-600' : 'bg-gray-300 peer-checked:bg-red-500'\n )}></div>\n </label>\n </div>\n\n {/* Danger Zone */}\n <div className=\"pt-6 mt-6 border-t border-red-900/30\">\n <h4 className=\"text-sm font-bold text-red-500 uppercase tracking-wider mb-4\">Danger Zone</h4>\n <div className={cn('p-5 border flex items-center justify-between transition-all border-red-500/20', dark ? 'bg-red-950/10' : 'bg-red-50')}>\n <div>\n <span className=\"text-sm font-semibold text-red-500\">Delete Site Workspace</span>\n <p className=\"text-sm text-red-400/80 mt-1\">Permanently delete this site and all its content, media, and configurations. This action cannot be undone.</p>\n </div>\n <button\n onClick={() => {\n if (window.confirm('Are you absolutely sure you want to permanently delete this site? This action cannot be undone.')) {\n api.delete(`/sites/${activeSiteId}`).then(() => {\n toast.success('Site deleted')\n window.location.href = '/'\n }).catch(err => {\n toast.error(err.response?.data?.error?.message || 'Failed to delete site')\n })\n }\n }}\n className=\"px-4 py-2 border border-red-500 text-red-500 hover:bg-red-500 hover:text-z-logo-text transition-colors text-sm font-medium\"\n >\n Delete Site\n </button>\n </div>\n </div>\n </div>\n )\n}\n\nexport default SettingsGeneral\n","import React, { useState, useEffect } from 'react'\nimport {\n Shield, ShieldCheck, ShieldAlert, Loader2, AlertTriangle, Globe,\n Lock, Clock, Users, Wifi, Eye, EyeOff, XCircle, Trash2, RefreshCw,\n Info, CheckCircle2, Server, Activity\n} from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport api from '../../lib/api'\nimport toast from 'react-hot-toast'\nimport { useAuthStore } from '../../store/authStore'\nimport { useShallow } from 'zustand/react/shallow'\n\ninterface SettingsSecurityProps {\n settings: {\n jwtExpiresIn: string\n passwordMinLength: number\n allowRegistration: boolean\n rateLimitWindow?: number\n rateLimitMax?: number\n [key: string]: any\n }\n setSettings: (s: any) => void\n theme: 'light' | 'dark'\n}\n\ninterface Session {\n id: string\n userId: string\n ipAddress: string\n userAgent: string\n createdAt: string\n lastActivityAt?: string\n current?: boolean\n}\n\nconst SettingsSecurity: React.FC<SettingsSecurityProps> = ({ settings, setSettings, theme }) => {\n const dark = theme === 'dark'\n const { user } = useAuthStore(useShallow(state => ({ user: state.user })))\n const [setupState, setSetupState] = useState<'idle' | 'loading' | 'qrcode'>('idle')\n const [qrCode, setQrCode] = useState<string | null>(null)\n const [token, setToken] = useState('')\n const [verifying, setVerifying] = useState(false)\n const [enabled, setEnabled] = useState(user?.twoFactorEnabled || false)\n const [showCorsInput, setShowCorsInput] = useState(false)\n const [sessions, setSessions] = useState<Session[]>([])\n const [sessionsLoading, setSessionsLoading] = useState(false)\n const [revokingSessionId, setRevokingSessionId] = useState<string | null>(null)\n\n const fetchSessions = async () => {\n setSessionsLoading(true)\n try {\n const res = await api.get('/auth/sessions')\n const data = res.data?.data || res.data\n setSessions(Array.isArray(data) ? data : [])\n } catch {\n setSessions([])\n } finally {\n setSessionsLoading(false)\n }\n }\n\n useEffect(() => { fetchSessions() }, [])\n\n const handleSetup = async () => {\n setSetupState('loading')\n try {\n const res = await api.post('/auth/2fa/setup')\n setQrCode(res.data.data.qrCodeImage)\n setSetupState('qrcode')\n } catch {\n toast.error('Failed to initiate 2FA setup')\n setSetupState('idle')\n }\n }\n\n const handleVerify = async () => {\n if (!token) return toast.error('Enter the 6-digit code')\n setVerifying(true)\n try {\n await api.post('/auth/2fa/verify-setup', { token })\n toast.success('2FA successfully enabled')\n setEnabled(true)\n setSetupState('idle')\n } catch {\n toast.error('Invalid token')\n } finally {\n setVerifying(false)\n }\n }\n\n const handleRevokeSession = async (id: string) => {\n setRevokingSessionId(id)\n try {\n await api.delete(`/auth/sessions/${id}`)\n setSessions(prev => prev.filter(s => s.id !== id))\n toast.success('Session revoked')\n } catch {\n toast.error('Failed to revoke session')\n } finally {\n setRevokingSessionId(null)\n }\n }\n\n const card = cn(\n 'p-5 border rounded-none transition-all space-y-3',\n dark ? 'bg-z-panel backdrop-blur-md border-z-border shadow-sm' : 'bg-[var(--z-bg-input)]/50 border-z-border shadow-sm'\n )\n\n const inp = cn(\n 'w-full border rounded-none py-2.5 px-4 text-sm font-mono outline-none transition-all focus:ring-1 focus:ring-z-active-border focus:border-z-accent',\n dark ? 'bg-app/80 border-z-border text-z-primary placeholder:text-z-primary' : 'bg-z-panel border-z-border'\n )\n\n const Toggle = ({ checked, onChange }: { checked: boolean; onChange: (v: boolean) => void }) => (\n <label className=\"relative inline-flex items-center cursor-pointer flex-shrink-0\">\n <input type=\"checkbox\" checked={checked} onChange={e => onChange(e.target.checked)} className=\"sr-only peer\" />\n <div className={cn(\"w-11 h-6 rounded-none peer peer-checked:after:translate-x-full after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-[var(--z-bg-hover)] after:rounded-none after:h-5 after:w-5 after:transition-all border shadow-inner\", 'bg-[var(--z-border-strong)] peer-checked:bg-z-accent border-transparent')}></div>\n </label>\n )\n\n return (\n <div className=\"space-y-5\">\n {/* Authentication Controls */}\n <div className=\"space-y-1.5\">\n <p className=\"text-sm font-semibold text-z-secondary px-1\">Authentication</p>\n <div className={cn('border rounded-none divide-y', dark ? 'border-z-border divide-z-border' : 'border-z-border divide-z-border')}>\n {/* Open Registration */}\n <div className={cn('flex items-center justify-between p-5', dark ? 'bg-z-panel backdrop-blur-md' : 'bg-z-panel')}>\n <div>\n <p className={cn('text-sm font-semibold ', dark ? 'text-z-primary' : 'text-z-primary')}>Open Registration</p>\n <p className=\"text-sm text-z-secondary mt-1\">Allow anyone to sign up. When off, users must be explicitly invited.</p>\n </div>\n <Toggle checked={settings.allowRegistration} onChange={v => setSettings({ ...settings, allowRegistration: v })} />\n </div>\n {/* Token Lifetime */}\n <div className=\"p-5 space-y-2\">\n <div className=\"flex items-center gap-2\">\n <Clock size={13} className=\"text-z-secondary\" />\n <label className={cn('text-sm font-semibold ', dark ? 'text-z-primary' : 'text-z-primary')}>Session Token Lifetime</label>\n </div>\n <div className=\"flex gap-2\">\n {['1h', '12h', '24h', '7d', '30d'].map(opt => (\n <button\n key={opt}\n onClick={() => setSettings({ ...settings, jwtExpiresIn: opt })}\n className={cn('px-3 py-2 text-sm font-semibold border transition-all', settings.jwtExpiresIn === opt\n ? dark ? 'bg-z-accent/20 border-z-active-border text-z-active-text' : 'bg-z-active-bg border-z-active-border text-z-accent'\n : dark ? 'bg-z-hover border-z-border text-z-secondary hover:text-z-secondary' : 'bg-z-input border-z-border text-z-secondary'\n )}\n >\n {opt}\n </button>\n ))}\n <input\n type=\"text\"\n value={settings.jwtExpiresIn}\n onChange={e => setSettings({ ...settings, jwtExpiresIn: e.target.value })}\n placeholder=\"Custom (e.g. 2d)\"\n className={cn(inp, 'max-w-32 py-2')}\n />\n </div>\n <p className=\"text-sm text-z-secondary\">Format: 1h, 7d, 30m etc. Tokens will expire after this duration.</p>\n </div>\n {/* Password Policy */}\n <div className=\"p-5 space-y-2\">\n <div className=\"flex items-center gap-2\">\n <Lock size={13} className=\"text-z-secondary\" />\n <label className={cn('text-sm font-semibold ', dark ? 'text-z-primary' : 'text-z-primary')}>Minimum Password Length</label>\n </div>\n <div className=\"flex items-center gap-3\">\n <input\n type=\"range\"\n min={6} max={32}\n value={settings.passwordMinLength || 8}\n onChange={e => setSettings({ ...settings, passwordMinLength: Number(e.target.value) })}\n className=\"flex-1 accent-z-accent\"\n />\n <span className={cn('text-lg font-semibold min-w-[3ch] text-right', dark ? 'text-z-active-text' : 'text-z-accent')}>\n {settings.passwordMinLength || 8}\n </span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Rate Limiting */}\n <div className=\"space-y-1.5\">\n <p className=\"text-sm font-semibold text-z-secondary px-1\">Rate Limiting</p>\n <div className={cn('border rounded-none', 'z-panel')}>\n <div className=\"grid grid-cols-2 gap-4 p-5\">\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-semibold text-z-secondary\">Window (minutes)</label>\n <input\n type=\"number\"\n value={settings.rateLimitWindow || 15}\n onChange={e => setSettings({ ...settings, rateLimitWindow: parseInt(e.target.value) || 15 })}\n className={inp}\n placeholder=\"15\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-semibold text-z-secondary\">Max Requests / Window</label>\n <input\n type=\"number\"\n value={settings.rateLimitMax || 100}\n onChange={e => setSettings({ ...settings, rateLimitMax: parseInt(e.target.value) || 100 })}\n className={inp}\n placeholder=\"100\"\n />\n </div>\n </div>\n <div className={cn('px-5 pb-4 text-sm text-z-secondary flex items-center gap-2 border-t', 'border-z-border')}>\n <Info size={11} className=\"text-z-active-text mt-0.5 shrink-0\" />\n <p className=\"mt-3\">Requests exceeding {settings.rateLimitMax || 100} per {settings.rateLimitWindow || 15} minutes will receive a 429 Too Many Requests error. Applies per IP address.</p>\n </div>\n </div>\n </div>\n\n {/* CORS Origins */}\n <div className=\"space-y-1.5\">\n <p className=\"text-sm font-semibold text-z-secondary px-1\">CORS & Origins</p>\n <div className={cn(card)}>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <Globe size={13} className=\"text-z-secondary\" />\n <label className={cn('text-sm font-semibold ', dark ? 'text-z-primary' : 'text-z-primary')}>Allowed Origins</label>\n </div>\n <button onClick={() => setShowCorsInput(!showCorsInput)} className=\"text-sm text-z-active-text hover:text-z-active-text font-semibold\">\n {showCorsInput ? 'Collapse' : 'Configure'}\n </button>\n </div>\n {showCorsInput && (\n <div className=\"space-y-2 pt-2\">\n <textarea\n value={(settings.corsOrigins || []).join('\\n')}\n onChange={e => setSettings({ ...settings, corsOrigins: e.target.value.split('\\n').map((s: string) => s.trim()).filter(Boolean) })}\n rows={4}\n placeholder={'https://yoursite.com\\nhttps://app.yoursite.com\\nhttp://localhost:3000'}\n className={cn(inp, 'resize-none font-mono')}\n />\n <p className=\"text-sm text-z-secondary\">One origin per line. Use * to allow all (not recommended in production).</p>\n </div>\n )}\n </div>\n </div>\n\n {/* 2FA */}\n <div className=\"space-y-1.5\">\n <p className=\"text-sm font-semibold text-z-secondary px-1\">Two-Factor Authentication</p>\n <div className={cn('border rounded-none p-6 space-y-6', dark ? 'bg-z-panel backdrop-blur-md border-z-border shadow-sm' : 'bg-z-panel border-z-border')}>\n <div className=\"flex items-center gap-4\">\n <div className={cn('p-3', dark ? 'bg-z-accent/20 text-z-active-text' : 'bg-z-active-bg text-z-accent')}>\n {enabled ? <ShieldCheck size={24} /> : <ShieldAlert size={24} />}\n </div>\n <div>\n <h3 className={cn('text-sm font-semibold ', 'text-z-primary')}>Two-Factor Authentication (TOTP)</h3>\n <p className=\"text-sm text-z-secondary mt-1\">Secure your admin account with an authenticator app (Google Authenticator, Authy, 1Password)</p>\n </div>\n </div>\n\n {enabled ? (\n <div className={cn('flex items-center gap-2 text-sm font-semibold ', dark ? 'text-z-active-text' : 'text-z-accent')}>\n <ShieldCheck size={16} /> 2FA is Active on your account\n </div>\n ) : setupState === 'idle' ? (\n <button\n onClick={handleSetup}\n className={cn('px-6 py-3 text-z-primary text-sm font-semibold border transition-all',\n dark ? 'bg-z-accent border-transparent hover:opacity-90 shadow-sm' : 'bg-z-accent border-transparent hover:brightness-110')}\n >\n Enable 2FA\n </button>\n ) : setupState === 'loading' ? (\n <Loader2 className={cn('animate-spin', dark ? 'text-z-active-text' : 'text-z-secondary')} size={24} />\n ) : (\n <div className=\"space-y-5\">\n <div className=\"space-y-2\">\n <p className={cn('text-sm font-semibold ', dark ? 'text-z-muted' : 'text-z-secondary')}>1. Scan this QR code with your authenticator app</p>\n {qrCode && <img src={qrCode} alt=\"2FA QR Code\" className=\"w-48 h-48 border-4 border-z-border rounded-none\" />}\n </div>\n <div className=\"space-y-2\">\n <p className={cn('text-sm font-semibold ', dark ? 'text-z-muted' : 'text-z-secondary')}>2. Enter the 6-digit code to verify</p>\n <div className=\"flex gap-3 items-center\">\n <input\n type=\"text\"\n placeholder=\"000000\"\n maxLength={6}\n value={token}\n onChange={e => setToken(e.target.value.replace(/\\D/g, ''))}\n className={cn(inp, 'max-w-[140px] text-center text-2xl font-mono')}\n />\n <button\n onClick={handleVerify}\n disabled={token.length !== 6 || verifying}\n className={cn('px-6 py-3 disabled:opacity-50 text-z-primary text-sm font-semibold border flex items-center gap-2',\n dark ? 'bg-z-accent border-transparent hover:opacity-90' : 'bg-z-accent border-transparent hover:brightness-110')}\n >\n {verifying ? <Loader2 size={13} className=\"animate-spin\" /> : <CheckCircle2 size={13} />}\n Verify & Enable\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* Active Sessions */}\n <div className=\"space-y-1.5\">\n <div className=\"flex items-center justify-between px-1\">\n <p className=\"text-sm font-semibold text-z-secondary\">Active Sessions</p>\n <button onClick={fetchSessions} className=\"text-sm text-z-active-text hover:text-z-active-text font-semibold flex items-center gap-1\">\n <RefreshCw size={10} /> Refresh\n </button>\n </div>\n <div className={cn('border rounded-none overflow-hidden', 'z-panel')}>\n {sessionsLoading ? (\n <div className=\"flex items-center justify-center py-8\">\n <Loader2 size={20} className=\"text-z-active-text animate-spin\" />\n </div>\n ) : sessions.length === 0 ? (\n <div className=\"py-8 text-center\">\n <p className=\"text-sm text-z-secondary\">No active session data available</p>\n <p className=\"text-sm text-z-primary mt-1\">Sessions are tracked automatically on login</p>\n </div>\n ) : (\n <div className=\"divide-y\" style={{ borderColor: 'var(--z-border)' }}>\n {sessions.map(session => (\n <div key={session.id} className=\"flex items-center gap-4 px-5 py-3\">\n <div className={cn('w-8 h-8 flex items-center justify-center flex-shrink-0', dark ? 'bg-z-hover text-z-muted' : 'bg-[var(--z-bg-input)] text-z-secondary')}>\n <Server size={14} />\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className={cn('text-sm font-semibold truncate', dark ? 'text-z-primary' : 'text-z-primary')}>\n {session.ipAddress || 'Unknown IP'}\n {session.current && <span className=\"ml-2 text-sm text-z-active-text font-semibold px-1.5 border border-z-active-border bg-z-active-bg\">CURRENT</span>}\n </p>\n <p className=\"text-sm text-z-secondary truncate\">{session.userAgent || 'Unknown device'}</p>\n <p className=\"text-sm text-z-primary mt-0.5\">\n {session.lastActivityAt ? `Active ${new Date(session.lastActivityAt).toLocaleString()}` : `Created ${new Date(session.createdAt).toLocaleString()}`}\n </p>\n </div>\n {!session.current && (\n <button\n onClick={() => handleRevokeSession(session.id)}\n disabled={revokingSessionId === session.id}\n className=\"p-2 text-z-secondary hover:text-red-400 transition-colors disabled:opacity-40\"\n title=\"Revoke session\"\n >\n {revokingSessionId === session.id ? <Loader2 size={14} className=\"animate-spin\" /> : <XCircle size={14} />}\n </button>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n </div>\n )\n}\n\nexport default SettingsSecurity\n","import React, { useState, useEffect, useRef, useCallback } from 'react'\nimport {\n Mail, Send, Eye, EyeOff, RefreshCw, Loader2, CheckCircle2,\n AlertTriangle, Info, Zap, Lock, Server, Clock, Shield\n} from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport api from '../../lib/api'\nimport toast from 'react-hot-toast'\n\ninterface SettingsNotificationsProps {\n settings: {\n smtpHost: string\n smtpPort: number\n smtpUser: string\n smtpPass: string\n fromEmail: string\n smtpSecure?: boolean\n smtpFromName?: string\n emailSubjectPrefix?: string\n [key: string]: any\n }\n setSettings: (s: any) => void\n theme: 'light' | 'dark'\n testingSmtp: boolean\n setTestingSmtp: (v: boolean) => void\n}\n\nconst SMTP_PROVIDERS = [\n { id: 'custom', label: 'Custom SMTP', host: '', port: 587 },\n { id: 'gmail', label: 'Gmail', host: 'smtp.gmail.com', port: 587 },\n { id: 'sendgrid', label: 'SendGrid', host: 'smtp.sendgrid.net', port: 587 },\n { id: 'mailgun', label: 'Mailgun', host: 'smtp.mailgun.org', port: 587 },\n { id: 'ses', label: 'Amazon SES', host: 'email-smtp.us-east-1.amazonaws.com', port: 587 },\n { id: 'outlook', label: 'Outlook / Office365', host: 'smtp.office365.com', port: 587 },\n { id: 'zoho', label: 'Zoho Mail', host: 'smtp.zoho.com', port: 587 },\n { id: 'postmark', label: 'Postmark', host: 'smtp.postmarkapp.com', port: 587 },\n { id: 'resend', label: 'Resend', host: 'smtp.resend.com', port: 587 },\n]\n\nconst SettingsNotifications: React.FC<SettingsNotificationsProps> = ({\n settings, setSettings, theme, testingSmtp, setTestingSmtp,\n}) => {\n const dark = theme === 'dark'\n const [showPass, setShowPass] = useState(false)\n const [selectedProvider, setSelectedProvider] = useState('custom')\n const [testEmail, setTestEmail] = useState('')\n const [testEmailOpen, setTestEmailOpen] = useState(false)\n const [sendingTest, setSendingTest] = useState(false)\n const [lastTestResult, setLastTestResult] = useState<{ ok: boolean; msg: string } | null>(null)\n \n const isMountedRef = useRef(true)\n useEffect(() => {\n return () => {\n isMountedRef.current = false\n }\n }, [])\n\n const handlePresetSelect = (providerId: string) => {\n const preset = SMTP_PROVIDERS.find(p => p.id === providerId)\n if (!preset) return\n setSelectedProvider(providerId)\n if (preset.host) {\n setSettings({ ...settings, smtpHost: preset.host, smtpPort: preset.port })\n }\n }\n\n const handleTestSmtp = async () => {\n setTestingSmtp(true)\n setLastTestResult(null)\n try {\n const res = await api.post('/system/smtp/test', {\n smtpHost: settings.smtpHost,\n smtpPort: settings.smtpPort,\n smtpUser: settings.smtpUser,\n smtpPass: settings.smtpPass,\n resendKey: settings.resendKey,\n fromEmail: settings.fromEmail,\n smtpSecure: settings.smtpSecure,\n })\n setLastTestResult({ ok: true, msg: res.data?.message || 'Connection successful' })\n toast.success(res.data?.message || 'SMTP connected successfully')\n } catch (err: any) {\n const msg = err?.response?.data?.error || err?.response?.data?.message || 'SMTP connection failed'\n setLastTestResult({ ok: false, msg })\n toast.error('SMTP connection failed')\n } finally {\n setTestingSmtp(false)\n }\n }\n\n const handleSendTestEmail = async () => {\n if (!testEmail.trim()) return toast.error('Enter a recipient email')\n setSendingTest(true)\n try {\n await api.post('/system/smtp/send-test', {\n to: testEmail,\n smtpHost: settings.smtpHost,\n smtpPort: settings.smtpPort,\n smtpUser: settings.smtpUser,\n smtpPass: settings.smtpPass,\n resendKey: settings.resendKey,\n fromEmail: settings.fromEmail,\n })\n toast.success(`Test email sent to ${testEmail}`)\n setTestEmailOpen(false)\n } catch {\n toast.error('Failed to send test email')\n } finally {\n setSendingTest(false)\n }\n }\n\n const card = cn(\n 'p-5 border rounded-none transition-all',\n dark ? 'bg-z-panel backdrop-blur-md border-z-border shadow-sm' : 'bg-[var(--z-bg-input)]/50 border-z-border shadow-sm'\n )\n\n const inp = cn(\n 'w-full border rounded-none py-2.5 px-4 text-sm outline-none transition-all focus:ring-1 focus:ring-z-active-border focus:border-z-accent',\n dark ? 'bg-app/80 border-z-border text-z-primary placeholder:text-z-primary' : 'bg-z-panel border-z-border'\n )\n\n const portMode = settings.smtpPort === 465 ? 'SSL' : settings.smtpPort === 587 ? 'TLS/STARTTLS' : 'Custom'\n\n return (\n <div className=\"space-y-5\">\n {/* Provider Presets */}\n <div className=\"space-y-2\">\n <p className=\"text-sm font-semibold text-z-secondary px-1\">Quick Configure</p>\n <div className=\"flex flex-wrap gap-2\">\n {SMTP_PROVIDERS.map(p => (\n <button\n key={p.id}\n onClick={() => handlePresetSelect(p.id)}\n className={cn(\n 'px-3 py-1.5 text-sm font-semibold border transition-all',\n selectedProvider === p.id\n ? dark ? 'bg-z-accent/20 border-z-active-border text-z-active-text' : 'bg-z-active-bg border-z-active-border text-z-accent'\n : dark ? 'bg-z-hover border-z-border text-z-secondary hover:text-z-secondary' : 'bg-z-input border-z-border text-z-secondary'\n )}\n >\n {p.label}\n </button>\n ))}\n </div>\n </div>\n\n {/* Main Config */}\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {/* Host */}\n <div className={cn(card, 'space-y-2')}>\n <label className=\"text-sm font-semibold text-z-secondary\">SMTP Relay Host</label>\n <div className=\"flex items-center gap-2\">\n <Server size={12} className=\"text-z-secondary shrink-0\" />\n <input type=\"text\" value={settings.smtpHost || ''} onChange={e => setSettings({ ...settings, smtpHost: e.target.value })} className={inp} placeholder=\"smtp.example.com\" />\n </div>\n </div>\n\n {/* Port + TLS */}\n <div className={cn(card, 'space-y-2')}>\n <div className=\"flex items-center justify-between\">\n <label className=\"text-sm font-semibold text-z-secondary\">Port & Encryption</label>\n <span className={cn('text-sm font-semibold px-2 py-0.5 border', portMode === 'SSL' ? 'text-z-active-text border-z-active-border bg-z-active-bg' : portMode === 'TLS/STARTTLS' ? 'text-z-active-text border-z-accent/30 bg-z-accent/10' : 'text-z-secondary border-z-border bg-z-hover')}>{portMode}</span>\n </div>\n <div className=\"flex gap-2\">\n {[25, 465, 587, 2525].map(p => (\n <button key={p} onClick={() => setSettings({ ...settings, smtpPort: p })}\n className={cn('px-3 py-2 text-sm font-semibold border transition-all', settings.smtpPort === p ? dark ? 'bg-z-accent/20 border-z-active-border text-z-active-text' : 'bg-z-active-bg border-z-active-border text-z-accent' : dark ? 'bg-z-hover border-z-border text-z-secondary' : 'bg-z-input border-z-border text-z-secondary')}>\n {p}\n </button>\n ))}\n <input type=\"number\" value={settings.smtpPort || 587} onChange={e => setSettings({ ...settings, smtpPort: parseInt(e.target.value) || 587 })} className={cn(inp, 'max-w-20')} />\n </div>\n </div>\n\n {/* User */}\n <div className={cn(card, 'space-y-2')}>\n <label className=\"text-sm font-semibold text-z-secondary\">SMTP Username</label>\n <input type=\"text\" value={settings.smtpUser || ''} onChange={e => setSettings({ ...settings, smtpUser: e.target.value })} className={inp} placeholder=\"user@example.com\" />\n </div>\n\n {/* Password */}\n <div className={cn(card, 'space-y-2')}>\n <label className=\"text-sm font-semibold text-z-secondary\">SMTP Password</label>\n <div className=\"relative\">\n <input type={showPass ? 'text' : 'password'} value={settings.smtpPass || ''} onChange={e => setSettings({ ...settings, smtpPass: e.target.value })} className={cn(inp, 'pr-10')} placeholder=\"••••••••\" />\n <button onClick={() => setShowPass(!showPass)} type=\"button\" className=\"absolute right-3 top-1/2 -translate-y-1/2 text-z-secondary hover:text-z-secondary transition-colors\">\n {showPass ? <EyeOff size={13} /> : <Eye size={13} />}\n </button>\n </div>\n </div>\n\n {/* Resend API Key */}\n <div className={cn(card, 'space-y-2 md:col-span-2 mt-4')}>\n <div className=\"flex items-center gap-2 mb-1\">\n <Zap size={14} className=\"text-z-accent\" />\n <label className=\"text-sm font-semibold text-z-primary\">Resend Integration</label>\n </div>\n <p className=\"text-xs text-z-secondary mb-2\">If provided, Zenith will use Resend instead of custom SMTP.</p>\n <div className=\"relative\">\n <input type={showPass ? 'text' : 'password'} value={settings.resendKey || ''} onChange={e => setSettings({ ...settings, resendKey: e.target.value })} className={cn(inp, 'pr-10')} placeholder=\"re_123456789\" />\n <button onClick={() => setShowPass(!showPass)} type=\"button\" className=\"absolute right-3 top-1/2 -translate-y-1/2 text-z-secondary hover:text-z-secondary transition-colors\">\n {showPass ? <EyeOff size={13} /> : <Eye size={13} />}\n </button>\n </div>\n </div>\n\n {/* From Email */}\n <div className={cn(card, 'space-y-2')}>\n <label className=\"text-sm font-semibold text-z-secondary\">From Email Address</label>\n <input type=\"email\" value={settings.fromEmail || ''} onChange={e => setSettings({ ...settings, fromEmail: e.target.value })} className={inp} placeholder=\"noreply@yoursite.com\" />\n </div>\n\n {/* From Name */}\n <div className={cn(card, 'space-y-2')}>\n <label className=\"text-sm font-semibold text-z-secondary\">From Display Name</label>\n <input type=\"text\" value={settings.smtpFromName || ''} onChange={e => setSettings({ ...settings, smtpFromName: e.target.value })} className={inp} placeholder=\"Zenith CMS\" />\n </div>\n </div>\n\n {/* Subject Prefix */}\n <div className={cn(card, 'space-y-2')}>\n <label className=\"text-sm font-semibold text-z-secondary\">Email Subject Prefix (optional)</label>\n <input type=\"text\" value={settings.emailSubjectPrefix || ''} onChange={e => setSettings({ ...settings, emailSubjectPrefix: e.target.value })} className={inp} placeholder=\"[MyApp] \" />\n <p className=\"text-sm text-z-secondary\">Prepended to all outgoing email subjects, e.g. \"[Zenith] Password Reset\"</p>\n </div>\n\n {/* SSL Toggle */}\n <div className={cn('flex items-center justify-between p-4 border', 'bg-z-panel border-z-border')}>\n <div>\n <p className={cn('text-sm font-semibold ', dark ? 'text-z-primary' : 'text-z-primary')}>Force SSL/TLS</p>\n <p className=\"text-sm text-z-secondary mt-0.5\">Use implicit TLS (port 465). Disable for STARTTLS (port 587)</p>\n </div>\n <label className=\"relative inline-flex items-center cursor-pointer\">\n <input type=\"checkbox\" checked={!!settings.smtpSecure} onChange={e => setSettings({ ...settings, smtpSecure: e.target.checked, smtpPort: e.target.checked ? 465 : 587 })} className=\"sr-only peer\" />\n <div className={cn(\"w-11 h-6 rounded-none peer peer-checked:after:translate-x-full after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-z-panel after:rounded-none after:h-5 after:w-5 after:transition-all border shadow-inner\", 'bg-z-input peer-checked:bg-z-accent border-z-border')}></div>\n </label>\n </div>\n\n {/* Test Result */}\n {lastTestResult && (\n <div className={cn('flex items-center gap-3 p-4 border', lastTestResult.ok ? dark ? 'bg-z-accent/5 border-z-accent/20' : 'bg-z-active-bg border-z-active-border' : dark ? 'bg-red-500/5 border-red-500/20' : 'bg-red-50 border-red-200')}>\n {lastTestResult.ok ? <CheckCircle2 size={14} className=\"text-z-active-text shrink-0\" /> : <AlertTriangle size={14} className=\"text-red-400 shrink-0\" />}\n <p className={cn('text-sm font-semibold ', lastTestResult.ok ? 'text-z-active-text' : 'text-red-400')}>{lastTestResult.msg}</p>\n </div>\n )}\n\n {/* Actions */}\n <div className=\"flex flex-wrap items-center gap-3\">\n <button\n onClick={handleTestSmtp}\n disabled={testingSmtp}\n className={cn('flex items-center gap-2 px-6 py-3 text-sm font-semibold border transition-all active:scale-95',\n dark ? 'bg-z-accent border-transparent text-z-primary hover:opacity-90 shadow-sm' : 'bg-z-accent text-z-primary border-transparent hover:brightness-110')}\n >\n {testingSmtp ? <Loader2 size={13} className=\"animate-spin\" /> : <Zap size={13} />}\n Test Connection\n </button>\n <button\n onClick={() => setTestEmailOpen(!testEmailOpen)}\n className={cn('flex items-center gap-2 px-4 py-3 text-sm font-semibold border transition-all',\n dark ? 'border-z-border text-z-muted hover:text-z-primary' : 'border-z-border text-z-secondary')}\n >\n <Send size={12} />\n Send Test Email\n </button>\n </div>\n\n {/* Test Email Inline Form */}\n {testEmailOpen && (\n <div className={cn('p-4 border space-y-3', dark ? 'bg-z-panel border-z-border' : 'bg-z-input border-z-border')}>\n <label className=\"text-sm font-semibold text-z-secondary\">Test Recipient Email</label>\n <div className=\"flex gap-3\">\n <input\n type=\"email\"\n value={testEmail}\n onChange={e => setTestEmail(e.target.value)}\n placeholder=\"you@example.com\"\n className={cn(inp, 'flex-1')}\n onKeyDown={e => e.key === 'Enter' && handleSendTestEmail()}\n />\n <button\n onClick={handleSendTestEmail}\n disabled={sendingTest || !testEmail.trim()}\n className={cn('flex items-center gap-2 px-5 py-2.5 text-sm font-semibold border transition-all disabled:opacity-40',\n dark ? 'bg-z-accent text-z-logo-text border-transparent hover:opacity-90' : 'bg-z-accent text-z-primary border-transparent hover:brightness-110')}\n >\n {sendingTest ? <Loader2 size={12} className=\"animate-spin\" /> : <Send size={12} />}\n Send\n </button>\n </div>\n <p className=\"text-sm text-z-secondary\">A sample email will be sent using the SMTP settings above.</p>\n </div>\n )}\n </div>\n )\n}\n\nexport default SettingsNotifications\n","import React, { useState, useRef, useEffect } from 'react'\nimport { X, Users, Loader2 } from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport api from '../../lib/api'\nimport toast from 'react-hot-toast'\n\ninterface InviteUserModalProps {\n onClose: () => void\n onInvited: () => void\n theme: 'light' | 'dark'\n}\n\nconst InviteUserModal: React.FC<InviteUserModalProps> = ({ onClose, onInvited, theme }) => {\n const [email, setEmail] = useState('')\n const [role, setRole] = useState<string>('editor')\n const [availableRoles, setAvailableRoles] = useState<string[]>(['admin', 'editor', 'viewer'])\n const [loading, setLoading] = useState(false)\n const [sent, setSent] = useState(false)\n const isMountedRef = useRef(true)\n useEffect(() => { \n const fetchRoles = async () => {\n try {\n const res = await api.get('/system/roles')\n if (res.data?.data) {\n const roles = res.data.data.map((r: any) => r.roleName)\n setAvailableRoles((prev) => Array.from(new Set([...prev, ...roles])))\n }\n } catch (e) {\n // use defaults\n }\n }\n fetchRoles()\n return () => { isMountedRef.current = false } \n }, [])\n\n const handleInvite = async (e: React.FormEvent) => {\n e.preventDefault()\n if (!email.trim()) return\n\n setLoading(true)\n try {\n await api.post('/system/members', { email: email.trim(), role })\n toast.success(`Invitation sent to ${email}`)\n setSent(true)\n onInvited()\n setTimeout(() => { if (isMountedRef.current) onClose() }, 1200)\n } catch (err: any) {\n toast.error(err?.response?.data?.error || 'Failed to send invitation')\n } finally {\n setLoading(false)\n }\n }\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-[var(--z-bg-modal)] backdrop-blur-sm\">\n <div\n className={cn(\n 'w-full max-w-md border rounded-none-none shadow-2xl',\n theme === 'dark'\n ? 'bg-app border-z-border'\n : 'bg-z-panel border-z-border shadow-sm shadow-[var(--z-border)]'\n )}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between px-8 py-6 border-b border-z-border\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-10 h-10 rounded-none-none bg-z-panel border border-z-border/20 flex items-center justify-center\">\n <Users size={18} className=\"text-z-secondary \" />\n </div>\n <span className=\"text-sm font-semibold tracking-wide\">\n Initialize Operator\n </span>\n </div>\n <button onClick={onClose} className=\"text-z-secondary hover:text-z-primary transition-colors\">\n <X size={18} />\n </button>\n </div>\n\n {sent ? (\n <div className=\"px-8 py-12 text-center space-y-4\">\n <div className=\"w-16 h-16 mx-auto rounded-none-none bg-z-panel border border-z-border/20 flex items-center justify-center\">\n <Users size={28} className=\"text-z-secondary \" />\n </div>\n <p className=\"text-sm font-semibold text-z-secondary \">\n Invitation Dispatched\n </p>\n <p className=\"text-sm text-z-secondary\">\n {email} — check inbox for password reset link\n </p>\n </div>\n ) : (\n <form onSubmit={handleInvite} className=\"px-8 py-6 space-y-6\">\n {/* Email */}\n <div className=\"space-y-2\">\n <label className=\"text-sm font-semibold text-z-secondary\">\n Operator Email\n </label>\n <input\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n required\n autoFocus\n placeholder=\"operator@example.com\"\n className={cn(\n 'w-full border rounded-none-none py-4 px-5 text-[13px] font-semibold transition-all outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black',\n theme === 'dark'\n ? 'bg-z-hover border-z-border text-z-primary focus:border-z-border/50'\n : 'bg-z-input border-z-border focus:border-z-border'\n )}\n />\n </div>\n\n {/* Role */}\n <div className=\"space-y-2\">\n <label className=\"text-sm font-semibold text-z-secondary\">\n Auth Tier\n </label>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-2\">\n {availableRoles.map((r) => (\n <button\n key={r}\n type=\"button\"\n onClick={() => setRole(r)}\n className={cn(\n 'py-3 text-sm font-semibold border rounded-none-none transition-all',\n role === r\n ? 'border-z-border/40 bg-z-panel text-z-secondary'\n : theme === 'dark'\n ? 'border-z-border text-z-secondary hover:border-z-border'\n : 'border-z-border text-z-muted hover:border-z-border-strong'\n )}\n >\n {r}\n </button>\n ))}\n </div>\n </div>\n\n {/* Submit */}\n <button\n type=\"submit\"\n disabled={loading || !email.trim()}\n className={cn(\n 'w-full py-4 rounded-none-none text-sm font-semibold shadow-lg transition-all active:scale-95 disabled:opacity-40',\n theme === 'dark'\n ? 'bg-z-border hover:bg-z-accent text-z-primary'\n : 'bg-z-accent hover:brightness-110 text-z-primary'\n )}\n >\n {loading ? (\n <span className=\"flex items-center justify-center gap-2\">\n <Loader2 size={14} className=\"animate-spin\" />\n Dispatching Invite...\n </span>\n ) : (\n 'Dispatch Invitation'\n )}\n </button>\n </form>\n )}\n\n <div className=\"px-8 pb-6\">\n <p className=\"text-sm text-z-secondary text-center\">\n 48h expiring token · sent via SMTP relay · password set on first login\n </p>\n </div>\n </div>\n </div>\n )\n}\n\nexport default InviteUserModal\n","import React, { useState, useRef, useEffect } from 'react'\nimport { createPortal } from 'react-dom'\nimport { X, UserCog, Loader2, Check } from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport api from '../../lib/api'\nimport toast from 'react-hot-toast'\nimport { useSystemMetadata } from '../../hooks/useQueries'\n\ninterface EditUserModalProps {\n user: any\n onClose: () => void\n onUpdated: () => void\n theme: 'light' | 'dark'\n}\n\nconst PRESET_COLORS = [\n 'var(--z-accent)', // Emerald\n '#3B82F6', // Blue\n '#F59E0B', // Amber\n '#EF4444', // Red\n '#EC4899', // Pink\n 'var(--z-accent)', // Purple\n '#06B6D4', // Cyan\n '#64748B', // Slate\n]\n\nconst EditUserModal: React.FC<EditUserModalProps> = ({ user, onClose, onUpdated, theme }) => {\n const { data: health } = useSystemMetadata()\n const collections = health?.collections || []\n const globals = health?.globals || []\n\n const [sites, setSites] = useState<any[]>([])\n \n // Combine collections, globals, and sites into scopes\n const availableScopes = [\n ...sites.map(s => ({ id: `site:${s.slug}`, label: `Site: ${s.name}` })),\n ...collections.map((c: any) => ({ id: `col:${c.slug}`, label: `Collection: ${c.name}` })),\n ...globals.map((g: any) => ({ id: `glb:${g.slug}`, label: `Global: ${g.name}` })),\n ]\n\n const [role, setRole] = useState<string>(user.role || 'viewer')\n const [color, setColor] = useState<string>(user.color || '')\n \n const [specialAccess, setSpecialAccess] = useState<Set<string>>(\n new Set(user.specialAccess && Array.isArray(user.specialAccess) ? user.specialAccess : [])\n )\n \n const [availableRoles, setAvailableRoles] = useState<string[]>(['admin', 'editor', 'viewer'])\n const [loading, setLoading] = useState(false)\n const isMountedRef = useRef(true)\n\n useEffect(() => {\n const fetchRolesAndSites = async () => {\n try {\n const [rolesRes, sitesRes] = await Promise.all([\n api.get('/roles').catch(() => ({ data: { data: [] } })),\n api.get('/sites').catch(() => ({ data: { data: [] } }))\n ])\n \n if (rolesRes.data?.data) {\n const roles = rolesRes.data.data.map((r: any) => r.roleName.toLowerCase())\n // Ensure base roles are always present\n const baseRoles = ['admin', 'editor', 'viewer']\n setAvailableRoles(Array.from(new Set([...baseRoles, ...roles])))\n }\n \n if (sitesRes.data?.data) {\n setSites(sitesRes.data.data)\n }\n } catch (e) {\n // use defaults\n }\n }\n fetchRolesAndSites()\n return () => {\n isMountedRef.current = false\n }\n }, [])\n\n const toggleScope = (scopeId: string) => {\n setSpecialAccess(prev => {\n const newSet = new Set(prev)\n if (newSet.has(scopeId)) newSet.delete(scopeId)\n else newSet.add(scopeId)\n return newSet\n })\n }\n\n const handleUpdate = async (e: React.FormEvent) => {\n e.preventDefault()\n setLoading(true)\n try {\n const payload: any = { role }\n if (color) payload.color = color\n \n payload.specialAccess = Array.from(specialAccess)\n\n await api.patch(`/system/users/${user._id}`, payload)\n toast.success('Operator profile updated')\n onUpdated()\n if (isMountedRef.current) onClose()\n } catch (err: any) {\n toast.error(err?.response?.data?.error || 'Failed to update operator')\n } finally {\n if (isMountedRef.current) setLoading(false)\n }\n }\n\n const modalContent = (\n <div className=\"fixed inset-0 z-[9999] flex items-center justify-center bg-[var(--z-bg-modal)] backdrop-blur-sm p-4\">\n <div\n className={cn(\n 'w-full max-w-md border rounded-none-none shadow-2xl max-h-[90vh] flex flex-col',\n theme === 'dark' ? 'bg-app border-z-border' : 'bg-z-panel border-z-border shadow-sm shadow-[var(--z-border)]'\n )}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between px-8 py-6 border-b border-z-border shrink-0\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-10 h-10 rounded-none-none bg-z-panel border border-z-border/20 flex items-center justify-center\">\n <UserCog size={18} className=\"text-z-secondary \" />\n </div>\n <span className=\"text-sm font-semibold tracking-wide text-inherit\">Edit Operator</span>\n </div>\n <button onClick={onClose} className=\"text-z-secondary hover:text-z-active-text transition-colors\">\n <X size={18} />\n </button>\n </div>\n\n <div className=\"flex-1 overflow-y-auto\">\n <form onSubmit={handleUpdate} className=\"px-8 py-6 space-y-8\">\n <div className=\"space-y-1\">\n <p className=\"text-[14px] font-semibold\">{user.email}</p>\n <p className=\"text-sm text-z-secondary\">\n ID: {user._id}\n </p>\n </div>\n\n {/* Role */}\n <div className=\"space-y-3\">\n <label className=\"text-sm font-semibold text-z-secondary\">\n Auth Tier\n </label>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-2\">\n {availableRoles.map((r) => (\n <button\n key={r}\n type=\"button\"\n onClick={() => setRole(r)}\n className={cn(\n 'py-3 text-sm font-semibold border rounded-none-none transition-all',\n role === r\n ? 'border-z-accent/40 bg-z-active-bg text-z-active-text'\n : theme === 'dark'\n ? 'border-z-border text-z-secondary hover:border-z-border'\n : 'border-z-border text-z-muted hover:border-z-border-strong'\n )}\n >\n {r}\n </button>\n ))}\n </div>\n </div>\n\n {/* Color */}\n <div className=\"space-y-3\">\n <label className=\"text-sm font-semibold text-z-secondary\">\n Profile Color\n </label>\n <div className=\"flex items-center gap-3 flex-wrap\">\n {PRESET_COLORS.map((c) => (\n <button\n key={c}\n type=\"button\"\n onClick={() => setColor(c)}\n className={cn(\n 'w-8 h-8 rounded-none-none border-2 transition-transform hover:scale-110 flex items-center justify-center',\n color === c ? 'border-z-border shadow-[0_0_10px_rgba(255,255,255,0.3)]' : 'border-transparent'\n )}\n style={{ backgroundColor: c }}\n title={`Select color ${c}`}\n >\n {color === c && <Check size={12} className=\"text-z-primary mix-blend-difference\" />}\n </button>\n ))}\n <input\n type=\"color\"\n value={color || '#000000'}\n onChange={(e) => setColor(e.target.value)}\n className=\"w-8 h-8 cursor-pointer rounded-none-none bg-transparent border-0 p-0\"\n title=\"Custom Color\"\n />\n </div>\n {!color && (\n <p className=\"text-sm text-z-secondary\">\n Currently auto-assigned deterministically\n </p>\n )}\n </div>\n\n {/* Special Access Scopes */}\n <div className=\"space-y-3\">\n <label className=\"text-sm font-semibold text-z-secondary\">\n Restrict Content Access\n </label>\n <p className=\"text-sm text-z-secondary mb-2\">\n Select exactly which collections this operator can view/edit. If none are selected, they default to standard role constraints.\n </p>\n <div className=\"space-y-2 max-h-48 overflow-y-auto pr-2 custom-scrollbar\">\n {availableScopes.length > 0 ? availableScopes.map(scope => (\n <button\n key={scope.id}\n type=\"button\"\n onClick={() => toggleScope(scope.id)}\n className={cn(\n 'w-full flex items-center justify-between p-3 border rounded-none-none transition-all text-left',\n specialAccess.has(scope.id)\n ? theme === 'dark'\n ? 'border-amber-500/30 bg-amber-500/5'\n : 'border-amber-500/30 bg-amber-50'\n : theme === 'dark'\n ? 'border-z-border hover:border-z-border-strong'\n : 'border-z-border hover:border-z-border-strong'\n )}\n >\n <span className={cn(\n 'text-sm font-semibold ',\n specialAccess.has(scope.id) \n ? 'text-amber-500' \n : 'text-z-secondary'\n )}>\n {scope.label}\n </span>\n <div className={cn(\n 'w-4 h-4 border rounded-none-none flex items-center justify-center transition-colors',\n specialAccess.has(scope.id)\n ? 'bg-amber-500 border-amber-500 text-z-primary'\n : 'border-z-border/30 text-transparent'\n )}>\n <Check size={10} strokeWidth={4} />\n </div>\n </button>\n )) : (\n <p className=\"text-sm text-z-secondary\">No collections available to restrict.</p>\n )}\n </div>\n </div>\n\n {/* Submit */}\n <div className=\"pt-4\">\n <button\n type=\"submit\"\n disabled={loading}\n className={cn(\n 'w-full py-4 rounded-none-none text-sm font-semibold shadow-lg transition-all active:scale-95 disabled:opacity-40',\n theme === 'dark'\n ? 'bg-z-accent hover:bg-z-accent text-z-primary'\n : 'bg-z-accent hover:brightness-110 text-z-logo-text'\n )}\n >\n {loading ? (\n <span className=\"flex items-center justify-center gap-2\">\n <Loader2 size={14} className=\"animate-spin\" />\n Updating Profile...\n </span>\n ) : (\n 'Save Operator Profile'\n )}\n </button>\n </div>\n </form>\n </div>\n </div>\n </div>\n )\n\n return createPortal(modalContent, document.body)\n}\n\nexport default EditUserModal\n","import React, { useState } from 'react'\nimport {\n Users, Trash2, Loader2, UserCog, Search, Filter, Mail,\n CheckCircle2, XCircle, Clock, Shield, UserPlus, UserX, RefreshCw,\n ChevronDown, Activity\n} from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport api from '../../lib/api'\nimport toast from 'react-hot-toast'\nimport InviteUserModal from './InviteUserModal'\nimport EditUserModal from './EditUserModal'\n\ninterface User {\n _id: string\n email: string\n role: string\n status?: 'active' | 'suspended' | 'pending'\n lastLogin?: string\n createdAt?: string\n firstName?: string\n lastName?: string\n [key: string]: any\n}\n\ninterface SettingsUsersProps {\n users: User[]\n theme: 'light' | 'dark'\n fetchData: () => void\n}\n\nconst ROLE_OPTIONS = ['admin', 'editor', 'viewer']\n\nconst STATUS_BADGE: Record<string, string> = {\n active: 'text-z-active-text border-z-active-border bg-z-active-bg',\n suspended: 'text-red-400 border-red-500/30 bg-red-500/10',\n pending: 'text-amber-400 border-amber-500/30 bg-amber-500/10',\n}\n\nconst ROLE_BADGE: Record<string, string> = {\n admin: 'text-red-400 border-red-500/30 bg-red-500/10',\n editor: 'text-amber-400 border-amber-500/30 bg-amber-500/10',\n viewer: 'text-z-active-text border-z-active-border bg-z-active-bg',\n}\n\nconst SettingsUsers: React.FC<SettingsUsersProps> = ({ users, theme, fetchData }) => {\n const dark = theme === 'dark'\n const [inviteOpen, setInviteOpen] = useState(false)\n const [editingUser, setEditingUser] = useState<User | null>(null)\n const [deletingId, setDeletingId] = useState<string | null>(null)\n const [suspendingId, setSuspendingId] = useState<string | null>(null)\n const [resetEmailId, setResetEmailId] = useState<string | null>(null)\n const [updatingRoleId, setUpdatingRoleId] = useState<string | null>(null)\n const [search, setSearch] = useState('')\n const [filterRole, setFilterRole] = useState<string>('all')\n const [filterStatus, setFilterStatus] = useState<string>('all')\n const [selectedIds, setSelectedIds] = useState<string[]>([])\n const [bulkDeleting, setBulkDeleting] = useState(false)\n\n const handleDeleteUser = async (id: string) => {\n setDeletingId(id)\n try {\n await api.delete(`/system/users/${id}`)\n toast.success('Operator removed')\n fetchData()\n } catch (err: any) {\n toast.error(err?.response?.data?.error || 'Failed to remove operator')\n } finally {\n setDeletingId(null)\n }\n }\n\n const handleSuspend = async (user: User) => {\n setSuspendingId(user._id)\n try {\n const isSuspended = user.status === 'suspended'\n await api.patch(`/system/users/${user._id}`, { status: isSuspended ? 'active' : 'suspended' })\n toast.success(isSuspended ? 'User reactivated' : 'User suspended')\n fetchData()\n } catch {\n toast.error('Action failed')\n } finally {\n setSuspendingId(null)\n }\n }\n\n const handleSendPasswordReset = async (user: User) => {\n setResetEmailId(user._id)\n try {\n await api.post('/auth/forgot-password', { email: user.email })\n toast.success(`Password reset sent to ${user.email}`)\n } catch {\n toast.error('Failed to send reset email')\n } finally {\n setResetEmailId(null)\n }\n }\n\n const handleRoleChange = async (user: User, newRole: string) => {\n setUpdatingRoleId(user._id)\n try {\n await api.patch(`/system/users/${user._id}`, { role: newRole })\n toast.success(`Role updated to ${newRole}`)\n fetchData()\n } catch {\n toast.error('Failed to update role')\n } finally {\n setUpdatingRoleId(null)\n }\n }\n\n const handleBulkDelete = async () => {\n if (!selectedIds.length) return\n if (!window.confirm(`Delete ${selectedIds.length} user(s)?`)) return\n setBulkDeleting(true)\n try {\n await Promise.all(selectedIds.map(id => api.delete(`/system/users/${id}`)))\n toast.success(`${selectedIds.length} users removed`)\n setSelectedIds([])\n fetchData()\n } catch {\n toast.error('Bulk delete failed')\n } finally {\n setBulkDeleting(false)\n }\n }\n\n const toggleSelect = (id: string) => {\n setSelectedIds(prev => prev.includes(id) ? prev.filter(x => x !== id) : [...prev, id])\n }\n\n const filtered = users.filter(u => {\n const matchSearch = !search || u.email.toLowerCase().includes(search.toLowerCase()) || (u.firstName || '').toLowerCase().includes(search.toLowerCase())\n const matchRole = filterRole === 'all' || u.role === filterRole\n const matchStatus = filterStatus === 'all' || (u.status || 'active') === filterStatus\n return matchSearch && matchRole && matchStatus\n })\n\n const card = cn(\n 'border rounded-none transition-all group',\n dark ? 'bg-z-panel backdrop-blur-md border-z-border hover:border-z-active-border shadow-sm' : 'bg-z-panel border-z-border shadow-sm hover:border-z-active-border'\n )\n\n const inp = cn(\n 'border rounded-none py-2 px-3 text-sm outline-none transition-all focus:ring-1 focus:ring-z-active-border focus:border-z-accent',\n dark ? 'bg-app/80 border-z-border text-z-primary placeholder:text-z-primary' : 'bg-z-panel border-z-border'\n )\n\n return (\n <>\n <div className=\"space-y-4\">\n {/* Toolbar */}\n <div className=\"flex flex-wrap items-center gap-3\">\n <div className=\"relative flex-1 min-w-[200px]\">\n <Search size={12} className=\"absolute left-3 top-1/2 -translate-y-1/2 text-z-secondary\" />\n <input\n value={search}\n onChange={e => setSearch(e.target.value)}\n placeholder=\"Search by email or name...\"\n className={cn(inp, 'pl-8 w-full')}\n />\n </div>\n <select value={filterRole} onChange={e => setFilterRole(e.target.value)} className={cn(inp, 'min-w-[110px]')}>\n <option value=\"all\">All Roles</option>\n {ROLE_OPTIONS.map(r => <option key={r} value={r}>{r}</option>)}\n </select>\n <select value={filterStatus} onChange={e => setFilterStatus(e.target.value)} className={cn(inp, 'min-w-[110px]')}>\n <option value=\"all\">All Status</option>\n <option value=\"active\">Active</option>\n <option value=\"suspended\">Suspended</option>\n <option value=\"pending\">Pending</option>\n </select>\n <div className=\"flex items-center gap-2 ml-auto\">\n {selectedIds.length > 0 && (\n <button onClick={handleBulkDelete} disabled={bulkDeleting}\n className={cn('flex items-center gap-2 px-3 py-2 text-sm font-semibold border transition-all', dark ? 'bg-red-500/10 border-red-500/30 text-red-400 hover:bg-red-500/20' : 'bg-red-50 border-red-200 text-red-600')}>\n {bulkDeleting ? <Loader2 size={11} className=\"animate-spin\" /> : <Trash2 size={11} />}\n Delete ({selectedIds.length})\n </button>\n )}\n <span className={cn('text-sm font-semibold ', 'text-z-secondary')}>\n {filtered.length}/{users.length} users\n </span>\n <button onClick={() => setInviteOpen(true)}\n className={cn('flex items-center gap-2 text-sm font-semibold border px-5 py-2.5 transition-all', dark ? 'border-z-active-border text-z-active-text hover:bg-z-active-bg' : 'border-z-active-border text-z-accent hover:bg-z-active-bg')}>\n <UserPlus size={13} />\n Invite User\n </button>\n </div>\n </div>\n\n {/* User Cards */}\n <div className=\"space-y-2\">\n {filtered.length === 0 ? (\n <div className={cn('py-12 border border-dashed text-center', 'border-z-border')}>\n <Users size={28} className=\"text-z-secondary mx-auto mb-3\" />\n <p className=\"text-sm text-z-secondary\">No users match your filters</p>\n </div>\n ) : (\n filtered.map(user => {\n const status = user.status || 'active'\n const isSuspended = status === 'suspended'\n return (\n <div key={user._id} className={card}>\n <div className=\"flex items-center gap-4 p-4\">\n {/* Checkbox */}\n <input\n type=\"checkbox\"\n checked={selectedIds.includes(user._id)}\n onChange={() => toggleSelect(user._id)}\n className=\"accent-z-accent w-3.5 h-3.5 flex-shrink-0\"\n onClick={e => e.stopPropagation()}\n />\n {/* Avatar */}\n <div className={cn('w-10 h-10 flex items-center justify-center text-sm font-semibold flex-shrink-0 border', isSuspended ? dark ? 'bg-red-500/10 text-red-400 border-red-500/20' : 'bg-red-50 text-red-500 border-red-200' : dark ? 'bg-z-active-bg text-z-active-text border-z-active-border' : 'bg-z-active-bg text-z-accent border-z-active-border')}>\n {(user.firstName?.[0] || user.email[0]).toUpperCase()}\n </div>\n {/* Info */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className={cn('text-sm font-semibold leading-none', 'text-z-primary')}>\n {user.firstName ? `${user.firstName} ${user.lastName || ''}`.trim() : user.email}\n </span>\n <span className={cn('text-sm font-semibold px-1.5 py-0.5 border', ROLE_BADGE[user.role] || 'text-z-muted border-z-border bg-z-hover')}>\n {user.role}\n </span>\n <span className={cn('text-sm font-semibold px-1.5 py-0.5 border', STATUS_BADGE[status] || STATUS_BADGE.active)}>\n {status}\n </span>\n </div>\n <div className=\"flex items-center gap-3 mt-1.5 flex-wrap\">\n {user.firstName && (\n <span className=\"text-sm text-z-secondary\">{user.email}</span>\n )}\n {user.lastLogin && (\n <span className=\"text-sm text-z-secondary flex items-center gap-1\">\n <Clock size={8} /> Last login {new Date(user.lastLogin).toLocaleDateString()}\n </span>\n )}\n {user.createdAt && (\n <span className=\"text-sm text-z-secondary\">Joined {new Date(user.createdAt).toLocaleDateString()}</span>\n )}\n </div>\n </div>\n\n {/* Actions (visible on hover) */}\n <div className=\"flex items-center gap-1 opacity-0 group-hover:opacity-100 transition-opacity\">\n {/* Inline role change */}\n <div className=\"relative\">\n <select\n value={user.role}\n onChange={e => handleRoleChange(user, e.target.value)}\n disabled={updatingRoleId === user._id}\n className={cn('text-sm font-semibold border py-1.5 px-2 outline-none transition-all cursor-pointer', dark ? 'bg-app/80 border-z-border text-z-muted hover:border-z-active-border' : 'bg-z-panel border-z-border text-z-secondary')}\n onClick={e => e.stopPropagation()}\n >\n {ROLE_OPTIONS.map(r => <option key={r} value={r}>{r}</option>)}\n </select>\n </div>\n {/* Password Reset */}\n <button\n onClick={() => handleSendPasswordReset(user)}\n disabled={resetEmailId === user._id}\n className={cn('p-2 transition-colors', dark ? 'text-z-secondary hover:text-z-active-text' : 'text-z-muted hover:text-z-active-text')}\n title=\"Send password reset\"\n >\n {resetEmailId === user._id ? <Loader2 size={14} className=\"animate-spin\" /> : <Mail size={14} />}\n </button>\n {/* Edit */}\n <button\n onClick={() => setEditingUser(user)}\n className={cn('p-2 transition-colors', dark ? 'text-z-secondary hover:text-z-active-text' : 'text-z-muted hover:text-z-accent')}\n title=\"Edit user\"\n >\n <UserCog size={14} />\n </button>\n {/* Suspend/Activate */}\n <button\n onClick={() => handleSuspend(user)}\n disabled={suspendingId === user._id}\n className={cn('p-2 transition-colors disabled:opacity-30', isSuspended ? dark ? 'text-z-secondary hover:text-z-active-text' : 'text-z-muted hover:text-z-accent' : dark ? 'text-z-secondary hover:text-amber-400' : 'text-z-muted hover:text-amber-600')}\n title={isSuspended ? 'Reactivate' : 'Suspend'}\n >\n {suspendingId === user._id ? <Loader2 size={14} className=\"animate-spin\" /> : isSuspended ? <CheckCircle2 size={14} /> : <UserX size={14} />}\n </button>\n {/* Delete */}\n <button\n onClick={() => handleDeleteUser(user._id)}\n disabled={deletingId === user._id}\n className={cn('p-2 transition-colors disabled:opacity-30', dark ? 'text-z-secondary hover:text-red-400' : 'text-z-muted hover:text-red-600')}\n title=\"Delete user\"\n >\n {deletingId === user._id ? <Loader2 size={14} className=\"animate-spin\" /> : <Trash2 size={14} />}\n </button>\n </div>\n </div>\n </div>\n )\n })\n )}\n </div>\n </div>\n\n {inviteOpen && (\n <InviteUserModal onClose={() => setInviteOpen(false)} onInvited={fetchData} theme={theme} />\n )}\n {editingUser && (\n <EditUserModal user={editingUser} onClose={() => setEditingUser(null)} onUpdated={fetchData} theme={theme} />\n )}\n </>\n )\n}\n\nexport default SettingsUsers\n","import React, { useState } from 'react'\nimport { X, Key, Loader2 } from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport api from '../../lib/api'\n\ninterface GenerateKeyModalProps {\n onClose: () => void\n onGenerated: (key: any) => void\n onOpenKeyModal: (k: any) => void\n theme: 'light' | 'dark'\n}\n\nconst GenerateKeyModal: React.FC<GenerateKeyModalProps> = ({ onClose, onGenerated, onOpenKeyModal, theme }) => {\n const [name, setName] = useState('')\n const [role, setRole] = useState<'admin' | 'editor' | 'viewer'>('editor')\n const [expiresDays, setExpiresDays] = useState(30)\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState('')\n\n const handleGenerate = async (e: React.FormEvent) => {\n e.preventDefault()\n if (!name.trim()) return\n setError('')\n setLoading(true)\n try {\n const res = await api.post<any>('/system/api-keys', {\n name: name.trim(),\n role,\n expiresInDays: expiresDays,\n })\n const keyData = res.data.data\n // Show full key in a separate \"done that\" modal\n onOpenKeyModal({ name: keyData.name, key: keyData.key })\n onGenerated(keyData)\n onClose()\n } catch (err: any) {\n setError(err?.response?.data?.error || 'Failed to generate key')\n } finally {\n setLoading(false)\n }\n }\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-[var(--z-bg-modal)] backdrop-blur-sm\">\n <div\n className={cn(\n 'w-full max-w-md border rounded-none-none shadow-2xl',\n theme === 'dark' ? 'bg-app border-z-border' : 'bg-z-panel border-z-border shadow-sm'\n )}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between px-8 py-6 border-b border-z-border\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-10 h-10 rounded-none-none bg-z-panel border border-z-border/20 flex items-center justify-center\">\n <Key size={18} className=\"text-z-secondary \" />\n </div>\n <span className=\"text-sm font-semibold tracking-wide\">\n Generate Access Token\n </span>\n </div>\n <button onClick={onClose} className=\"text-z-secondary hover:text-z-primary transition-colors\">\n <X size={18} />\n </button>\n </div>\n\n <form onSubmit={handleGenerate} className=\"px-8 py-6 space-y-6\">\n {/* Name */}\n <div className=\"space-y-2\">\n <label className=\"text-sm font-semibold text-z-secondary\">\n Token Name\n </label>\n <input\n type=\"text\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n required\n autoFocus\n placeholder=\"e.g. Production Relay\"\n className={cn(\n 'w-full border rounded-none-none py-4 px-5 text-[13px] font-semibold transition-all outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black',\n theme === 'dark'\n ? 'bg-z-hover border-z-border text-z-primary focus:border-z-border/50'\n : 'bg-z-input border-z-border focus:border-z-border'\n )}\n />\n </div>\n\n {/* Role */}\n <div className=\"space-y-2\">\n <label className=\"text-sm font-semibold text-z-secondary\">\n Permissions Tier\n </label>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-2\">\n {(['admin', 'editor', 'viewer'] as const).map((r) => (\n <button\n key={r}\n type=\"button\"\n onClick={() => setRole(r)}\n className={cn(\n 'py-3 text-sm font-semibold border rounded-none-none transition-all',\n role === r\n ? 'border-z-border/40 bg-z-panel text-z-secondary'\n : theme === 'dark'\n ? 'border-z-border text-z-secondary hover:border-z-border'\n : 'border-z-border text-z-muted hover:border-z-border-strong'\n )}\n >\n {r}\n </button>\n ))}\n </div>\n </div>\n\n {/* Expiry */}\n <div className=\"space-y-2\">\n <label className=\"text-sm font-semibold text-z-secondary\">\n Expires After (days)\n </label>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-2\">\n {[7, 30, 90, 365].map((d) => (\n <button\n key={d}\n type=\"button\"\n onClick={() => setExpiresDays(d)}\n className={cn(\n 'py-3 text-sm font-semibold border rounded-none-none transition-all',\n expiresDays === d\n ? 'border-z-border/40 bg-z-panel text-z-secondary'\n : theme === 'dark'\n ? 'border-z-border text-z-secondary hover:border-z-border'\n : 'border-z-border text-z-muted hover:border-z-border-strong'\n )}\n >\n {d}d\n </button>\n ))}\n </div>\n </div>\n\n {error && (\n <p className=\"text-sm text-red-500 font-semibold\">\n {error}\n </p>\n )}\n\n <button\n type=\"submit\"\n disabled={loading || !name.trim()}\n className={cn(\n 'w-full py-4 rounded-none-none text-sm font-semibold shadow-lg transition-all active:scale-95 disabled:opacity-40',\n theme === 'dark'\n ? 'bg-z-border hover:bg-z-accent text-z-primary'\n : 'bg-z-accent hover:brightness-110 text-z-primary'\n )}\n >\n {loading ? (\n <span className=\"flex items-center justify-center gap-2\">\n <Loader2 size={14} className=\"animate-spin\" />\n Generating...\n </span>\n ) : (\n 'Generate Token'\n )}\n </button>\n </form>\n\n <div className=\"px-8 pb-6\">\n <p className=\"text-sm text-z-secondary text-center\">\n Keys are shown only once · store securely\n </p>\n </div>\n </div>\n </div>\n )\n}\n\nexport default GenerateKeyModal\n","import React, { useState } from 'react'\nimport { Terminal, Code, Copy, Check, Info, Server, Database, Sparkles } from 'lucide-react'\nimport { cn } from '../../lib/utils'\n\ninterface ApiIntegrationGuideProps {\n theme: 'light' | 'dark'\n apiKeys: any[]\n}\n\nconst ApiIntegrationGuide: React.FC<ApiIntegrationGuideProps> = ({ theme, apiKeys }) => {\n const [activeLang, setActiveLang] = useState<'fetch' | 'curl' | 'axios'>('fetch')\n const [copied, setCopied] = useState(false)\n const activeSiteId = localStorage.getItem('activeSiteId') || '<YOUR_SITE_ID>'\n\n const baseUrl = window.location.origin\n \n const snippets = {\n fetch: `fetch('${baseUrl}/api/sites/${activeSiteId}/collections/posts/items', {\n headers: {\n 'Authorization': 'Bearer <YOUR_API_KEY>',\n 'X-Zenith-Site-Id': '${activeSiteId}'\n }\n})\n.then(res => res.json())\n.then(data => console.log(data));`,\n curl: `curl -X GET '${baseUrl}/api/sites/${activeSiteId}/collections/posts/items' \\\\\n -H 'Authorization: Bearer <YOUR_API_KEY>' \\\\\n -H 'X-Zenith-Site-Id: ${activeSiteId}'`,\n axios: `import axios from 'axios';\n\naxios.get('${baseUrl}/api/sites/${activeSiteId}/collections/posts/items', {\n headers: {\n 'Authorization': 'Bearer <YOUR_API_KEY>',\n 'X-Zenith-Site-Id': '${activeSiteId}'\n }\n}).then(response => console.log(response.data));`\n }\n\n const handleCopy = () => {\n navigator.clipboard.writeText(snippets[activeLang])\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n }\n\n return (\n <div className=\"mt-12 pt-12 border-t border-z-border space-y-8\">\n <div className=\"flex flex-col gap-2\">\n <h3 className=\"text-xl font-semibold flex items-center gap-3\">\n <Terminal className=\"text-z-secondary \" size={24} />\n Developer Integration Guide\n </h3>\n <p className=\"text-sm text-z-secondary font-bold max-w-2xl\">\n Everything you need to connect your frontend to Zenith CMS. Follow these steps to fetch your content dynamically.\n </p>\n </div>\n\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-6\">\n <div className={cn(\n \"p-6 border rounded-none-none relative overflow-hidden group\",\n theme === 'dark' ? \"bg-z-panel border-z-border\" : \"bg-z-input border-z-border\"\n )}>\n <div className=\"absolute top-0 right-0 p-4 opacity-10 group-hover:opacity-20 transition-opacity\">\n <Server size={48} />\n </div>\n <div className=\"w-10 h-10 bg-z-hover border-z-border-strong text-z-secondary flex items-center justify-center rounded-none-none mb-4 font-semibold\">1</div>\n <h4 className=\"text-[14px] font-semibold mb-2\">Generate a Key</h4>\n <p className=\"text-sm text-z-secondary font-medium leading-relaxed\">\n Create an API key above. Make sure to copy the secret key immediately, as it will only be shown once for security reasons.\n </p>\n </div>\n\n <div className={cn(\n \"p-6 border rounded-none-none relative overflow-hidden group\",\n theme === 'dark' ? \"bg-z-panel border-z-border\" : \"bg-z-input border-z-border\"\n )}>\n <div className=\"absolute top-0 right-0 p-4 opacity-10 group-hover:opacity-20 transition-opacity\">\n <Info size={48} />\n </div>\n <div className=\"w-10 h-10 bg-z-hover border-z-border-strong text-z-secondary flex items-center justify-center rounded-none-none mb-4 font-semibold\">2</div>\n <h4 className=\"text-[14px] font-semibold mb-2\">Site Identification</h4>\n <p className=\"text-sm text-z-secondary font-medium leading-relaxed\">\n Include the <strong>X-Zenith-Site-Id</strong> header in all your requests. Your current site ID is <code className=\"bg-app/20 px-1 py-0.5 rounded-none text-z-secondary \">{activeSiteId}</code>.\n </p>\n </div>\n\n <div className={cn(\n \"p-6 border rounded-none-none relative overflow-hidden group\",\n theme === 'dark' ? \"bg-z-panel border-z-border\" : \"bg-z-input border-z-border\"\n )}>\n <div className=\"absolute top-0 right-0 p-4 opacity-10 group-hover:opacity-20 transition-opacity\">\n <Database size={48} />\n </div>\n <div className=\"w-10 h-10 bg-z-hover border-z-border-strong text-z-secondary flex items-center justify-center rounded-none-none mb-4 font-semibold\">3</div>\n <h4 className=\"text-[14px] font-semibold mb-2\">Fetch Collections</h4>\n <p className=\"text-sm text-z-secondary font-medium leading-relaxed\">\n Query the endpoints to retrieve your data. Replace <code>posts</code> in the URL with the name of your specific collection.\n </p>\n </div>\n </div>\n\n <div className={cn(\n \"border rounded-none-none overflow-hidden mt-8\",\n theme === 'dark' ? \"bg-[#0A0A0A] border-z-border\" : \"bg-z-accent border-z-border\"\n )}>\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-z-border bg-z-panel\">\n <div className=\"flex items-center gap-2\">\n {(['fetch', 'curl', 'axios'] as const).map(lang => (\n <button\n key={lang}\n onClick={() => setActiveLang(lang)}\n className={cn(\n \"px-4 py-1.5 text-sm font-semibold rounded-none-none transition-all\",\n activeLang === lang \n ? \"bg-z-hover border-z-border-strong text-z-secondary border border-z-border/30\" \n : \"text-z-secondary hover:text-z-secondary border border-transparent\"\n )}\n >\n {lang}\n </button>\n ))}\n </div>\n <button\n onClick={handleCopy}\n className=\"text-z-muted hover:text-z-primary transition-colors flex items-center gap-2 text-sm font-bold\"\n >\n {copied ? <Check size={14} className=\"text-z-secondary \" /> : <Copy size={14} />}\n {copied ? 'Copied!' : 'Copy Code'}\n </button>\n </div>\n <div className=\"p-6 overflow-x-auto\">\n <pre className=\"text-[13px] text-z-secondary font-mono leading-relaxed\">\n <code dangerouslySetInnerHTML={{\n __html: snippets[activeLang]\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/'(.*?)'/g, '<span class=\"text-z-secondary\">\\'$1\\'</span>')\n .replace(/<YOUR_API_KEY>/g, '<span class=\"text-amber-400 font-bold\"><YOUR_API_KEY></span>')\n }} />\n </pre>\n </div>\n </div>\n\n <div className={cn(\n \"p-6 border-l-4 border-z-border bg-z-hover mt-6\",\n theme === 'dark' ? \"text-z-primary\" : \"text-z-primary\"\n )}>\n <h4 className=\"flex items-center gap-2 text-[14px] font-semibold mb-2 text-z-secondary \">\n <Sparkles size={16} />\n Pro Tip for Next.js / React Users\n </h4>\n <p className=\"text-sm font-medium leading-relaxed opacity-80\">\n Never expose your API keys in the browser! Always make calls to Zenith CMS from a secure environment like Next.js API Routes, Server Actions, or getServerSideProps. Use environment variables (e.g., <code>process.env.ZENITH_API_KEY</code>) to store your keys safely.\n </p>\n </div>\n </div>\n )\n}\n\nexport default ApiIntegrationGuide\n","import React, { useState } from 'react'\nimport {\n Key, Shield, Loader2, Copy, Check, Clock, Calendar,\n Plus, Trash2, Eye, EyeOff, AlertTriangle, ExternalLink,\n Activity, Globe, ChevronRight, Info\n} from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport api from '../../lib/api'\nimport toast from 'react-hot-toast'\nimport EmptyState from '../../components/EmptyState'\nimport GenerateKeyModal from './GenerateKeyModal'\nimport ApiIntegrationGuide from './ApiIntegrationGuide'\n\ninterface ApiKey {\n _id: string\n name: string\n role: string\n expiresAt: string | number | Date\n createdAt?: string\n lastUsed?: string\n usageCount?: number\n permissions?: Array<{ resource: string; actions: string[] }>\n [key: string]: any\n}\n\ninterface SettingsApiKeysProps {\n apiKeys: ApiKey[]\n theme: 'light' | 'dark'\n fetchData: () => void\n setNewKey: (k: any) => void\n}\n\nfunction getDaysUntilExpiry(expiresAt: string | number | Date): number | null {\n if (!expiresAt) return null\n const exp = new Date(expiresAt).getTime()\n const now = Date.now()\n return Math.ceil((exp - now) / (1000 * 60 * 60 * 24))\n}\n\nfunction ExpiryBadge({ expiresAt, dark }: { expiresAt: string | number | Date; dark: boolean }) {\n const days = getDaysUntilExpiry(expiresAt)\n if (days === null) return null\n if (days < 0) return (\n <span className=\"text-sm font-semibold px-2 py-0.5 border border-red-500/30 bg-red-500/10 text-red-400 flex items-center gap-1\">\n <AlertTriangle size={8} /> Expired\n </span>\n )\n if (days <= 7) return (\n <span className=\"text-sm font-semibold px-2 py-0.5 border border-amber-500/30 bg-amber-500/10 text-amber-400\">\n {days}d left\n </span>\n )\n if (days <= 30) return (\n <span className=\"text-sm font-semibold px-2 py-0.5 border border-yellow-500/30 bg-yellow-500/10 text-yellow-400\">\n {days}d\n </span>\n )\n return (\n <span className=\"text-sm font-semibold px-2 py-0.5 border border-z-active-border bg-z-active-bg text-z-active-text\">\n {days}d\n </span>\n )\n}\n\nconst ROLE_COLORS: Record<string, string> = {\n admin: 'text-red-400 border-red-500/30 bg-red-500/10',\n editor: 'text-amber-400 border-amber-500/30 bg-amber-500/10',\n viewer: 'text-z-active-text border-z-active-border bg-z-active-bg',\n}\n\nconst SettingsApiKeys: React.FC<SettingsApiKeysProps> = ({ apiKeys, theme, fetchData, setNewKey }) => {\n const dark = theme === 'dark'\n const [generateOpen, setGenerateOpen] = useState(false)\n const [revokingId, setRevokingId] = useState<string | null>(null)\n const [copiedId, setCopiedId] = useState<string | null>(null)\n const [expandedId, setExpandedId] = useState<string | null>(null)\n\n const handleRevokeKey = async (id: string) => {\n setRevokingId(id)\n try {\n await api.post(`/system/api-keys/${id}/revoke`)\n toast.success('Token revoked')\n fetchData()\n } catch (err: any) {\n toast.error(err?.response?.data?.error || 'Failed to revoke token')\n } finally {\n setRevokingId(null)\n }\n }\n\n const handleCopyId = (id: string) => {\n navigator.clipboard.writeText(id)\n setCopiedId(id)\n setTimeout(() => setCopiedId(null), 2000)\n toast.success('Key ID copied')\n }\n\n const card = cn(\n 'border rounded-none transition-all shadow-sm group',\n dark ? 'bg-z-panel backdrop-blur-md border-z-border hover:border-z-active-border' : 'bg-z-input border-z-border shadow-sm hover:border-z-active-border'\n )\n\n return (\n <>\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between px-1\">\n <div className=\"flex items-center gap-3\">\n <span className={cn('text-sm font-semibold ', 'text-z-secondary')}>\n {apiKeys.length} Active {apiKeys.length === 1 ? 'Credential' : 'Credentials'}\n </span>\n {apiKeys.some(k => getDaysUntilExpiry(k.expiresAt) !== null && getDaysUntilExpiry(k.expiresAt)! <= 7) && (\n <span className=\"flex items-center gap-1 text-sm text-amber-400 font-semibold\">\n <AlertTriangle size={10} /> Expiring Soon\n </span>\n )}\n </div>\n <button\n onClick={() => setGenerateOpen(true)}\n className={cn('flex items-center gap-2 text-sm font-semibold border px-5 py-2.5 transition-all', dark ? 'border-z-active-border text-z-active-text hover:bg-z-active-bg hover:border-z-accent' : 'border-z-active-border text-z-accent hover:bg-z-active-bg')}\n >\n <Plus size={13} />\n Generate Token\n </button>\n </div>\n\n {/* Key Cards */}\n {apiKeys.length === 0 ? (\n <div className={cn('py-10 border border-dashed', 'border-z-border')}>\n <EmptyState\n icon={Key}\n title=\"No API keys\"\n message=\"Generate an API key to authenticate external applications against the Zenith CMS API\"\n action={\n <button onClick={() => setGenerateOpen(true)} className={cn('flex items-center gap-2 px-6 py-3 text-sm font-semibold border transition-all', dark ? 'border-z-active-border text-z-active-text hover:bg-z-active-bg' : 'border-z-active-border text-z-accent hover:bg-z-active-bg')}>\n <Plus size={12} /> Generate Token\n </button>\n }\n />\n </div>\n ) : (\n <div className=\"space-y-3\">\n {apiKeys.map(key => {\n const isExpanded = expandedId === key._id\n const days = getDaysUntilExpiry(key.expiresAt)\n const roleClass = ROLE_COLORS[key.role] || 'text-z-muted border-z-border bg-z-hover'\n return (\n <div key={key._id} className={card}>\n {/* Header */}\n <div\n className=\"flex items-center gap-4 px-5 py-4 cursor-pointer\"\n onClick={() => setExpandedId(isExpanded ? null : key._id)}\n >\n <div className={cn('w-12 h-12 flex items-center justify-center border flex-shrink-0', dark ? 'bg-z-active-bg text-z-active-text border-z-active-border' : 'bg-z-active-bg text-z-accent border-z-active-border')}>\n <Key size={20} />\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className={cn('text-[13px] font-semibold ', 'text-z-primary')}>{key.name}</span>\n <span className={cn('text-sm font-semibold px-2 py-0.5 border', roleClass)}>{key.role}</span>\n <ExpiryBadge expiresAt={key.expiresAt} dark={dark} />\n </div>\n <div className=\"flex items-center gap-3 mt-1.5 flex-wrap\">\n <span className=\"text-sm text-z-secondary flex items-center gap-1\">\n <Calendar size={9} />\n Expires {new Date(key.expiresAt).toLocaleDateString()}\n </span>\n {key.lastUsed && (\n <span className=\"text-sm text-z-secondary flex items-center gap-1\">\n <Activity size={9} />\n Last used {new Date(key.lastUsed).toLocaleDateString()}\n </span>\n )}\n {key.usageCount !== undefined && (\n <span className=\"text-sm text-z-secondary flex items-center gap-1\">\n <Globe size={9} />\n {key.usageCount} requests\n </span>\n )}\n </div>\n </div>\n <div className=\"flex items-center gap-2 opacity-0 group-hover:opacity-100 transition-opacity\">\n <button\n onClick={e => { e.stopPropagation(); handleCopyId(key._id) }}\n className={cn('p-2.5 transition-colors', dark ? 'text-z-secondary hover:text-z-active-text' : 'text-z-muted hover:text-z-accent')}\n title=\"Copy key ID\"\n >\n {copiedId === key._id ? <Check size={15} className=\"text-z-active-text\" /> : <Copy size={15} />}\n </button>\n <button\n onClick={e => { e.stopPropagation(); handleRevokeKey(key._id) }}\n disabled={revokingId === key._id}\n className={cn('p-2.5 transition-colors disabled:opacity-30', dark ? 'text-z-secondary hover:text-red-400' : 'text-z-muted hover:text-red-600')}\n title=\"Revoke token\"\n >\n {revokingId === key._id ? <Loader2 size={15} className=\"animate-spin\" /> : <Trash2 size={15} />}\n </button>\n <ChevronRight size={14} className={cn('text-z-secondary transition-transform', isExpanded && 'rotate-90')} />\n </div>\n </div>\n\n {/* Expanded Detail */}\n {isExpanded && (\n <div className=\"px-5 pb-5 pt-3 border-t space-y-4\" style={{ borderColor: 'var(--z-border)' }}>\n {/* Key ID */}\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-semibold text-z-secondary\">Key ID (prefix)</label>\n <div className=\"flex items-center gap-2\">\n <code className={cn('flex-1 font-mono text-sm px-3 py-2 border truncate', 'bg-z-panel border-z-border text-z-primary')}>\n {key._id}\n </code>\n <button onClick={() => handleCopyId(key._id)} className={cn('p-2 border transition-all', dark ? 'border-z-border text-z-secondary hover:text-z-primary' : 'border-z-border text-z-secondary')}>\n {copiedId === key._id ? <Check size={13} className=\"text-z-active-text\" /> : <Copy size={13} />}\n </button>\n </div>\n </div>\n\n {/* Permissions */}\n {key.permissions && key.permissions.length > 0 && (\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-semibold text-z-secondary\">Granted Permissions</label>\n <div className=\"flex flex-wrap gap-1.5\">\n {key.permissions.map((perm: any, i: number) => (\n <span key={i} className={cn('text-sm font-semibold px-2 py-1 border', dark ? 'bg-z-hover border-z-border text-z-muted' : 'bg-z-input border-z-border text-z-secondary')}>\n {perm.resource}: {perm.actions.join(', ')}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {/* Usage example */}\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-semibold text-z-secondary\">Usage Example</label>\n <pre className={cn('text-sm font-mono p-3 border overflow-x-auto', 'bg-z-input border-z-border text-z-primary')}>\n{`curl https://api.example.com/api/v1/posts \\\\\n -H \"Authorization: Bearer YOUR_KEY\"`}\n </pre>\n </div>\n </div>\n )}\n </div>\n )\n })}\n </div>\n )}\n\n <ApiIntegrationGuide theme={theme} apiKeys={apiKeys} />\n </div>\n\n {generateOpen && (\n <GenerateKeyModal\n onClose={() => setGenerateOpen(false)}\n onGenerated={keyData => {\n setNewKey(keyData)\n fetchData()\n }}\n onOpenKeyModal={setNewKey}\n theme={theme}\n />\n )}\n </>\n )\n}\n\nexport default SettingsApiKeys\n","import React, { useState, useEffect, useCallback } from 'react'\nimport {\n HardDrive, Layers, Activity, Trash2, RefreshCw, Scan, Loader2,\n Database, Archive, Clock, TrendingUp, AlertTriangle, CheckCircle2,\n Download, Server, Zap, BarChart3, Cpu, Network, FileCode, Terminal\n} from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport api from '../../lib/api'\nimport { useTenantStore } from '../../lib/tenantStore'\nimport toast from 'react-hot-toast'\n\ninterface DBStats {\n size?: number\n storageSize?: number\n freeStorageSize?: number\n documents?: number\n indexes?: number\n avgObjSize?: number\n collections?: number | string\n dbName?: string\n dbVersion?: string\n connections?: number\n adapterType?: string\n collectionDetails?: Array<{ name: string; count: number; sizeMB: string; avgDocSizeB: number; indexes: number }>\n platform?: string\n nodeVersion?: string\n pid?: number\n [key: string]: any\n}\n\ninterface Backup {\n id: string\n filename: string\n size: number\n createdAt: string\n status: 'ready' | 'processing' | 'failed'\n}\n\ninterface SettingsDatabaseProps {\n dbStats: DBStats | null\n theme: 'light' | 'dark'\n}\n\nconst SettingsDatabase: React.FC<SettingsDatabaseProps> = ({ dbStats, theme }) => {\n const dark = theme === 'dark'\n const [sweeping, setSweeping] = useState(false)\n const [testing, setTesting] = useState(false)\n const [creatingBackup, setCreatingBackup] = useState(false)\n const [dbUri, setDbUri] = useState('')\n const [dbDialect, setDbDialect] = useState<'postgres' | 'mongodb'>('mongodb')\n const [backups, setBackups] = useState<Backup[]>([])\n const [backupsLoading, setBackupsLoading] = useState(false)\n const [showBackups, setShowBackups] = useState(false)\n const [slowQueries, setSlowQueries] = useState<any[]>([])\n const [slowQueriesLoading, setSlowQueriesLoading] = useState(false)\n\n const fetchBackups = useCallback(async () => {\n setBackupsLoading(true)\n try {\n const res = await api.get('/system/backup/list')\n setBackups(res.data?.data || [])\n } catch {\n setBackups([])\n } finally {\n setBackupsLoading(false)\n }\n }, [])\n\n const fetchSlowQueries = useCallback(async () => {\n setSlowQueriesLoading(true)\n try {\n const res = await api.get('/system/db/slow-queries')\n setSlowQueries(res.data?.data || [])\n } catch {\n setSlowQueries([])\n } finally {\n setSlowQueriesLoading(false)\n }\n }, [])\n\n useEffect(() => {\n if (showBackups) fetchBackups()\n }, [showBackups, fetchBackups])\n\n const handleMediaSweep = async () => {\n setSweeping(true)\n try {\n const res = await api.post<any>('/system/media/sweep', { pruneUnreferencedMedia: true })\n const result = res.data.data\n toast.success(`Swept ${result.removed || 0} orphans · ${result.retained || 0} retained`)\n } catch (err: any) {\n toast.error(err?.response?.data?.error || 'Sweep failed')\n } finally {\n setSweeping(false)\n }\n }\n\n const handleFlushCache = async () => {\n setSweeping(true)\n try {\n await api.post('/system/cache/flush')\n toast.success('Cache flushed')\n } catch (err: any) {\n toast.error(err?.response?.data?.error || 'Failed to flush cache')\n } finally {\n setSweeping(false)\n }\n }\n\n const handleTestConnection = async (e: React.FormEvent) => {\n e.preventDefault()\n if (!dbUri.trim()) return\n setTesting(true)\n try {\n await api.post('/system/db/test-connection', { uri: dbUri, dialect: dbDialect })\n toast.success('Connection verified')\n } catch (err: any) {\n toast.error(err?.response?.data?.error || 'Connection failed')\n } finally {\n setTesting(false)\n }\n }\n\n const handleCreateBackup = async () => {\n setCreatingBackup(true)\n try {\n await api.post('/system/backup/create')\n toast.success('Backup created')\n fetchBackups()\n } catch (err: any) {\n toast.error(err?.response?.data?.error || 'Backup failed')\n } finally {\n setCreatingBackup(false)\n }\n }\n\n const handleDownloadBackup = async (backup: Backup) => {\n try {\n // Use fetch directly for blob download since api instance does not support responseType\n const token = useTenantStore.getState().token || ''\n const siteId = useTenantStore.getState().activeSiteId || ''\n const apiBase = (import.meta.env.VITE_API_URL || '').replace('/api/v1', '')\n const res = await fetch(`${apiBase}/api/v1/system/backup/download/${backup.id}`, {\n headers: {\n ...(token ? { Authorization: `Bearer ${token}` } : {}),\n ...(siteId ? { 'x-zenith-site-id': siteId } : {}),\n }\n })\n if (!res.ok) throw new Error('Download 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 = backup.filename\n a.click()\n } catch {\n toast.error('Download failed')\n }\n }\n\n const sizeMB = dbStats?.size ? (dbStats.size / 1024 / 1024).toFixed(2) : '0.00'\n const storageMB = dbStats?.storageSize ? (dbStats.storageSize / 1024 / 1024).toFixed(2) : '0.00'\n const freeMB = dbStats?.freeStorageSize ? (dbStats.freeStorageSize / 1024 / 1024).toFixed(2) : null\n const collections = dbStats?.collections || '0'\n const documents = dbStats?.documents || 0\n const indexes = dbStats?.indexes || 0\n const avgObjSize = dbStats?.avgObjSize || 0\n const collDetails = dbStats?.collectionDetails || []\n\n const topStats = [\n { label: 'Data Size', value: `${sizeMB} MB`, icon: HardDrive, color: 'text-z-active-text', bg: 'bg-z-active-bg', border: 'border-z-active-border' },\n { label: 'Storage Used', value: `${storageMB} MB`, icon: HardDrive, color: 'text-pink-400', bg: 'bg-pink-500/10', border: 'border-pink-500/20' },\n { label: 'Collections', value: String(collections), icon: Layers, color: 'text-z-active-text', bg: 'bg-z-accent/10', border: 'border-z-accent/20' },\n { label: 'Documents', value: Number(documents).toLocaleString(), icon: Database, color: 'text-sky-400', bg: 'bg-sky-500/10', border: 'border-sky-500/20' },\n { label: 'Total Indexes', value: String(indexes), icon: BarChart3, color: 'text-amber-400', bg: 'bg-amber-500/10', border: 'border-amber-500/20' },\n { label: 'Avg Doc Size', value: avgObjSize ? `${avgObjSize} B` : '—', icon: Zap, color: 'text-violet-400', bg: 'bg-violet-500/10', border: 'border-violet-500/20' },\n ]\n\n const card = cn(\n 'border rounded-none transition-all',\n dark ? 'bg-z-panel backdrop-blur-md border-z-border shadow-sm' : 'bg-z-input border-z-border shadow-sm'\n )\n\n const inp = cn(\n 'border rounded-none py-3 px-4 text-sm font-mono transition-all outline-none focus:ring-1 focus:ring-z-active-border focus:border-z-accent',\n dark ? 'bg-app/80 border-z-border text-z-primary placeholder:text-z-primary' : 'bg-z-panel border-z-border'\n )\n\n return (\n <div className=\"space-y-6\">\n\n {/* ── Technical Identity ─────────────────────────────────── */}\n <div className={cn(card, 'p-5')}>\n <p className=\"text-sm font-semibold text-z-secondary mb-4 flex items-center gap-2\">\n <Server size={13} /> Database Identity\n </p>\n <div className=\"grid grid-cols-2 md:grid-cols-3 gap-x-8 gap-y-3\">\n {[\n { label: 'Adapter', value: dbStats?.adapterType || '—' },\n { label: 'Database', value: dbStats?.dbName || '—' },\n { label: 'Server Ver.', value: dbStats?.dbVersion || '—' },\n { label: 'Connections', value: dbStats?.connections != null ? String(dbStats.connections) : '—' },\n { label: 'Free Storage', value: freeMB ? `${freeMB} MB` : '—' },\n { label: 'Platform', value: dbStats?.platform || '—' },\n { label: 'Node.js', value: dbStats?.nodeVersion || '—' },\n { label: 'Process PID', value: dbStats?.pid ? String(dbStats.pid) : '—' },\n ].map(({ label, value }) => (\n <div key={label}>\n <p className=\"text-xs font-semibold text-z-secondary uppercase tracking-wide\">{label}</p>\n <p className=\"text-sm font-mono font-semibold text-z-primary mt-0.5\">{value}</p>\n </div>\n ))}\n </div>\n </div>\n\n {/* ── Stat Cards ─────────────────────────────────────────── */}\n <div className=\"grid grid-cols-2 md:grid-cols-3 gap-3\">\n {topStats.map((stat, i) => (\n <div key={i} className={cn(card, 'p-5 flex flex-col gap-3')}>\n <div className=\"flex items-center justify-between\">\n <div className={cn('w-9 h-9 flex items-center justify-center border', stat.bg, stat.border)}>\n <stat.icon size={16} className={stat.color} />\n </div>\n <span className=\"text-xs font-semibold text-emerald-400 flex items-center gap-1\">\n <span className=\"w-1.5 h-1.5 rounded-full bg-emerald-400 animate-pulse inline-block\" />\n Live\n </span>\n </div>\n <div>\n <p className=\"text-xs font-semibold text-z-secondary uppercase tracking-wide\">{stat.label}</p>\n <p className=\"text-xl font-semibold mt-1 text-z-primary tabular-nums\">{stat.value}</p>\n </div>\n </div>\n ))}\n </div>\n\n {/* ── Per-Collection Breakdown ───────────────────────────── */}\n {collDetails.length > 0 && (\n <div className={cn(card, 'overflow-hidden')}>\n <div className=\"flex items-center gap-2 p-4 border-b\" style={{ borderColor: 'var(--z-border)' }}>\n <Terminal size={13} className=\"text-z-secondary\" />\n <p className=\"text-sm font-semibold text-z-primary\">Collection Breakdown</p>\n <span className=\"ml-auto text-xs text-z-secondary\">{collDetails.length} collections</span>\n </div>\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-xs\">\n <thead>\n <tr className={cn('border-b', dark ? 'bg-z-hover border-z-border' : 'bg-z-input border-z-border')}>\n {['Collection', 'Docs', 'Size (MB)', 'Avg Doc', 'Indexes'].map(h => (\n <th key={h} className=\"text-left px-4 py-2.5 font-semibold text-z-secondary uppercase tracking-wide\">{h}</th>\n ))}\n </tr>\n </thead>\n <tbody className=\"divide-y\" style={{ borderColor: 'var(--z-border)' }}>\n {collDetails.map((c) => (\n <tr key={c.name} className={cn('transition-colors', dark ? 'hover:bg-z-hover/40' : 'hover:bg-z-input/60')}>\n <td className=\"px-4 py-2.5 font-mono font-semibold text-z-primary\">\n {c.name.startsWith('z_') ? (\n <span className=\"text-z-secondary\">{c.name}</span>\n ) : c.name}\n </td>\n <td className=\"px-4 py-2.5 tabular-nums text-z-primary\">{c.count.toLocaleString()}</td>\n <td className=\"px-4 py-2.5 tabular-nums text-z-primary\">{c.sizeMB}</td>\n <td className=\"px-4 py-2.5 tabular-nums text-z-secondary\">{c.avgDocSizeB > 0 ? `${c.avgDocSizeB} B` : '—'}</td>\n <td className=\"px-4 py-2.5 tabular-nums\">\n <span className={cn('px-1.5 py-0.5 border font-mono', 'text-amber-400 border-amber-500/20 bg-amber-500/10')}>{c.indexes}</span>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n )}\n\n {/* Test Connection */}\n <div className={cn(card, 'p-6 space-y-4')}>\n <p className=\"text-sm font-semibold text-z-secondary\">Test New Connection</p>\n <form onSubmit={handleTestConnection} className=\"flex flex-wrap gap-3 items-end\">\n <div className=\"flex-1 min-w-[200px] space-y-1\">\n <label className=\"text-sm font-semibold text-z-secondary\">Connection URI</label>\n <input\n type=\"text\"\n value={dbUri}\n onChange={e => setDbUri(e.target.value)}\n placeholder=\"postgres://user:pass@host:5432/db or mongodb://...\"\n className={cn(inp, 'w-full')}\n />\n </div>\n <div className=\"space-y-1\">\n <label className=\"text-sm font-semibold text-z-secondary\">Dialect</label>\n <div className=\"flex gap-2\">\n {(['postgres', 'mongodb'] as const).map(d => (\n <button key={d} type=\"button\" onClick={() => setDbDialect(d)}\n className={cn('px-4 py-3 text-sm font-semibold border transition-all',\n dbDialect === d ? dark ? 'border-z-accent/50 bg-z-accent/20 text-z-active-text' : 'border-z-active-border bg-z-active-bg text-z-accent' : dark ? 'border-z-border text-z-secondary' : 'border-z-border text-z-muted')}>\n {d}\n </button>\n ))}\n </div>\n </div>\n <button type=\"submit\" disabled={testing || !dbUri.trim()}\n className={cn('px-6 py-3 text-sm font-semibold border transition-all disabled:opacity-40 flex items-center gap-2',\n dark ? 'bg-z-accent border-transparent text-z-primary hover:opacity-90 shadow-sm' : 'bg-z-accent border-transparent text-z-primary hover:brightness-110')}>\n {testing ? <Loader2 size={12} className=\"animate-spin\" /> : <RefreshCw size={12} />}\n Validate\n </button>\n </form>\n </div>\n\n {/* Backup Manager */}\n <div className={cn(card, 'overflow-hidden')}>\n <div className=\"flex items-center justify-between p-5\">\n <div className=\"flex items-center gap-3\">\n <Archive size={16} className=\"text-z-secondary\" />\n <div>\n <p className={cn('text-sm font-semibold ', dark ? 'text-z-primary' : 'text-z-primary')}>Database Backups</p>\n <p className=\"text-sm text-z-secondary\">Create and restore database snapshots</p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <button onClick={() => { setShowBackups(!showBackups) }}\n className={cn('text-sm font-semibold px-3 py-2 border transition-all', dark ? 'border-z-border text-z-muted hover:text-z-primary' : 'border-z-border text-z-secondary')}>\n {showBackups ? 'Hide' : 'View'} Backups\n </button>\n <button onClick={handleCreateBackup} disabled={creatingBackup}\n className={cn('flex items-center gap-2 px-4 py-2 text-sm font-semibold border transition-all disabled:opacity-40',\n dark ? 'bg-z-active-bg border-z-active-border text-z-active-text hover:bg-z-active-bg' : 'bg-z-active-bg border-z-active-border text-z-accent')}>\n {creatingBackup ? <Loader2 size={11} className=\"animate-spin\" /> : <Archive size={11} />}\n Create Backup\n </button>\n </div>\n </div>\n {showBackups && (\n <div className=\"border-t\" style={{ borderColor: 'var(--z-border)' }}>\n {backupsLoading ? (\n <div className=\"flex items-center justify-center py-8\">\n <Loader2 size={20} className=\"text-z-active-text animate-spin\" />\n </div>\n ) : backups.length === 0 ? (\n <div className=\"py-8 text-center\">\n <p className=\"text-sm text-z-secondary\">No backups yet — create one above</p>\n </div>\n ) : (\n <div className=\"divide-y\" style={{ borderColor: 'var(--z-border)' }}>\n {backups.map(b => (\n <div key={b.id} className=\"flex items-center gap-4 px-5 py-3\">\n <Archive size={14} className=\"text-z-secondary shrink-0\" />\n <div className=\"flex-1\">\n <p className={cn('text-sm font-semibold', dark ? 'text-z-primary' : 'text-z-primary')}>{b.filename}</p>\n <p className=\"text-sm text-z-secondary\">{new Date(b.createdAt).toLocaleString()} · {(b.size / 1024 / 1024).toFixed(2)} MB</p>\n </div>\n <span className={cn('text-sm font-semibold px-2 py-0.5 border', b.status === 'ready' ? 'text-z-active-text border-z-active-border bg-z-active-bg' : b.status === 'processing' ? 'text-amber-400 border-amber-500/30 bg-amber-500/10' : 'text-red-400 border-red-500/30 bg-red-500/10')}>\n {b.status}\n </span>\n {b.status === 'ready' && (\n <button onClick={() => handleDownloadBackup(b)} className={cn('p-2 transition-colors', dark ? 'text-z-secondary hover:text-z-active-text' : 'text-z-muted hover:text-z-accent')}>\n <Download size={14} />\n </button>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n\n {/* Maintenance Actions */}\n <div className=\"space-y-2\">\n <p className=\"text-sm font-semibold text-z-secondary px-1\">Maintenance Actions</p>\n <div className=\"flex flex-wrap gap-3\">\n <button onClick={handleFlushCache} disabled={sweeping}\n className={cn('flex items-center gap-2 px-6 py-3.5 border text-sm font-semibold transition-all active:scale-95 disabled:opacity-40',\n dark ? 'bg-red-500/10 text-red-400 border-red-500/20 hover:bg-red-500/20' : 'bg-red-50 text-red-600 border-red-200 hover:bg-red-100')}>\n {sweeping ? <Loader2 size={13} className=\"animate-spin\" /> : <Trash2 size={13} />}\n Flush Cache\n </button>\n <button onClick={handleMediaSweep} disabled={sweeping}\n className={cn('flex items-center gap-2 px-6 py-3.5 border text-sm font-semibold transition-all active:scale-95 disabled:opacity-40',\n dark ? 'bg-z-active-bg text-z-active-text border-z-active-border hover:bg-z-active-bg' : 'bg-[var(--z-bg-hover)] text-z-primary border-z-border hover:bg-[var(--z-border)]')}>\n {sweeping ? <Loader2 size={13} className=\"animate-spin\" /> : <Scan size={13} />}\n Sweep Orphan Media\n </button>\n <button onClick={fetchSlowQueries} disabled={slowQueriesLoading}\n className={cn('flex items-center gap-2 px-6 py-3.5 border text-sm font-semibold transition-all active:scale-95 disabled:opacity-40',\n dark ? 'bg-amber-500/10 text-amber-400 border-amber-500/20 hover:bg-amber-500/20' : 'bg-amber-50 text-amber-700 border-amber-200 hover:bg-amber-100')}>\n {slowQueriesLoading ? <Loader2 size={13} className=\"animate-spin\" /> : <TrendingUp size={13} />}\n Analyze Slow Queries\n </button>\n </div>\n </div>\n\n {/* Slow Queries */}\n {slowQueries.length > 0 && (\n <div className={cn(card, 'overflow-hidden')}>\n <div className=\"p-4 border-b\" style={{ borderColor: 'var(--z-border)' }}>\n <p className=\"text-sm font-semibold text-amber-400\">Slow Query Analysis</p>\n </div>\n <div className=\"divide-y\" style={{ borderColor: 'var(--z-border)' }}>\n {slowQueries.slice(0, 5).map((q, i) => (\n <div key={i} className=\"flex items-center gap-4 px-5 py-3\">\n <AlertTriangle size={13} className=\"text-amber-400 shrink-0\" />\n <div className=\"flex-1 min-w-0\">\n <p className={cn('text-sm font-mono truncate', 'text-z-secondary')}>{q.query || q.command || 'Unknown query'}</p>\n <p className=\"text-sm text-z-secondary\">{q.collection || q.table}</p>\n </div>\n <span className=\"text-sm font-semibold text-amber-400 shrink-0\">{q.millis || q.duration}ms</span>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n )\n}\n\nexport default SettingsDatabase\n","import React, { useState, useEffect, useRef } from 'react'\nimport { X, PlusCircle, Loader2, Shield } from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport api from '../../lib/api'\nimport toast from 'react-hot-toast'\n\ninterface CreateRoleModalProps {\n onClose: () => void\n onCreated: (role: any) => void\n theme: 'light' | 'dark'\n}\n\nconst CreateRoleModal: React.FC<CreateRoleModalProps> = ({ onClose, onCreated, theme }) => {\n const [name, setName] = useState('')\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState('')\n const modalRef = useRef<HTMLDivElement>(null)\n\n // Native Escape to close and simple focus management\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose()\n }\n document.addEventListener('keydown', handleKeyDown)\n // Prevent scrolling behind modal\n document.body.style.overflow = 'hidden'\n return () => {\n document.removeEventListener('keydown', handleKeyDown)\n document.body.style.overflow = 'unset'\n }\n }, [onClose])\n\n const handleCreate = async (e: React.FormEvent) => {\n e.preventDefault()\n if (!name.trim()) return\n setError('')\n setLoading(true)\n try {\n const res = await api.post<any>('/roles', {\n roleName: name.trim(),\n description: '',\n permissions: [{ resource: '*', actions: ['read'] }],\n })\n onCreated(res.data.data)\n toast.success(`Role \"${name.trim()}\" created`)\n onClose()\n } catch (err: any) {\n setError(err?.response?.data?.error?.message || 'Failed to create role')\n } finally {\n setLoading(false)\n }\n }\n\n return (\n <div className=\"fixed inset-0 z-[100] flex items-center justify-center bg-[var(--z-bg-modal)] backdrop-blur-sm\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"create-role-title\">\n <div\n ref={modalRef}\n className={cn(\n 'w-full max-w-sm border rounded-none-none shadow-2xl',\n theme === 'dark' ? 'bg-app border-z-border' : 'bg-z-panel border-z-border shadow-sm'\n )}\n >\n <div className=\"flex items-center justify-between px-8 py-6 border-b border-z-border\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-10 h-10 rounded-none-none bg-z-panel border border-z-border/20 flex items-center justify-center\">\n <PlusCircle size={18} className=\"text-z-secondary \" />\n </div>\n <span id=\"create-role-title\" className=\"text-sm font-semibold tracking-wide\">\n New Custom Role\n </span>\n </div>\n <button onClick={onClose} aria-label=\"Close\" className=\"text-z-secondary hover:text-z-primary transition-colors\">\n <X size={18} />\n </button>\n </div>\n\n <form onSubmit={handleCreate} className=\"px-8 py-6 space-y-6\">\n <div className=\"space-y-2\">\n <label className=\"text-sm font-semibold text-z-secondary\">\n Role Name\n </label>\n <input\n type=\"text\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n required\n autoFocus\n placeholder=\"e.g. Content Manager\"\n className={cn(\n 'w-full border rounded-none-none py-4 px-5 text-[13px] font-semibold transition-all outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black',\n theme === 'dark'\n ? 'bg-z-hover border-z-border text-z-primary focus:border-z-border/50'\n : 'bg-z-input border-z-border focus:border-z-border'\n )}\n />\n </div>\n\n <div className=\"p-4 border border-amber-500/10 bg-amber-500/5 rounded-none-none\">\n <div className=\"flex items-start gap-3\">\n <Shield size={14} className=\"text-amber-500 mt-0.5 shrink-0\" />\n <p className=\"text-sm font-bold text-amber-400 leading-relaxed\">\n New roles start with read-only access on all resources. You can customize permissions after creation.\n </p>\n </div>\n </div>\n\n {error && (\n <p className=\"text-sm text-red-500 font-semibold\">\n {error}\n </p>\n )}\n\n <button\n type=\"submit\"\n disabled={loading || !name.trim()}\n className={cn(\n 'w-full py-4 rounded-none-none text-sm font-semibold shadow-lg transition-all active:scale-95 disabled:opacity-40',\n theme === 'dark'\n ? 'bg-z-border hover:bg-z-accent text-z-primary'\n : 'bg-z-accent hover:brightness-110 text-z-primary'\n )}\n >\n {loading ? (\n <span className=\"flex items-center justify-center gap-2\">\n <Loader2 size={14} className=\"animate-spin\" />\n Creating...\n </span>\n ) : (\n 'Create Role'\n )}\n </button>\n </form>\n </div>\n </div>\n )\n}\n\nexport default CreateRoleModal\n\n","import React, { useState } from 'react'\nimport { X, Trash2, Loader2, AlertTriangle } from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport api from '../../lib/api'\nimport toast from 'react-hot-toast'\n\ninterface DeleteRoleConfirmDialogProps {\n role: { _id: string; roleName: string }\n onClose: () => void\n onDeleted: () => void\n theme: 'light' | 'dark'\n}\n\nconst DeleteRoleConfirmDialog: React.FC<DeleteRoleConfirmDialogProps> = ({\n role, onClose, onDeleted, theme,\n}) => {\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState('')\n\n const handleDelete = async () => {\n setLoading(true)\n setError('')\n try {\n await api.delete(`/roles/${role.roleName}`)\n toast.success(`Role \"${role.roleName}\" deleted`)\n onDeleted()\n onClose()\n } catch (err: any) {\n setError(err?.response?.data?.error?.message || 'Failed to delete role')\n } finally {\n setLoading(false)\n }\n }\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-[var(--z-bg-modal)] backdrop-blur-sm\">\n <div\n className={cn(\n 'w-full max-w-sm border rounded-none-none shadow-2xl',\n theme === 'dark' ? 'bg-app border-red-500/10' : 'bg-z-panel border-red-100'\n )}\n >\n <div className=\"flex items-center justify-between px-8 py-6 border-b border-z-border\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-10 h-10 rounded-none-none bg-red-500/10 border border-red-500/20 flex items-center justify-center\">\n <AlertTriangle size={18} className=\"text-red-500\" />\n </div>\n <span className=\"text-sm font-semibold tracking-wide\">\n Delete Role\n </span>\n </div>\n <button onClick={onClose} className=\"text-z-secondary hover:text-z-primary transition-colors\">\n <X size={18} />\n </button>\n </div>\n\n <div className=\"px-8 py-6 space-y-5\">\n <p className=\"text-sm font-semibold text-z-secondary leading-relaxed\">\n Are you sure you want to delete{' '}\n <span className=\"text-z-primary\">\"{role.roleName}\"</span>? This action\n cannot be undone and any users assigned to this role will lose access.\n </p>\n\n {error && (\n <p className=\"text-sm text-red-500 font-semibold\">\n {error}\n </p>\n )}\n\n <div className=\"flex gap-3\">\n <button\n type=\"button\"\n onClick={onClose}\n disabled={loading}\n className={cn(\n 'flex-1 py-3.5 rounded-none-none text-sm font-semibold border transition-all active:scale-95 disabled:opacity-40',\n theme === 'dark'\n ? 'border-z-border text-z-muted hover:border-z-border hover:text-z-primary'\n : 'border-z-border text-z-secondary hover:border-z-border-strong'\n )}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={handleDelete}\n disabled={loading}\n className={cn(\n 'flex-1 py-3.5 rounded-none-none text-sm font-semibold shadow-lg transition-all active:scale-95 disabled:opacity-40 flex items-center justify-center gap-2',\n 'bg-red-500 hover:bg-red-600 text-z-primary shadow-sm/20'\n )}\n >\n {loading ? <Loader2 size={12} className=\"animate-spin\" /> : <Trash2 size={12} />}\n {loading ? 'Deleting...' : 'Delete'}\n </button>\n </div>\n </div>\n </div>\n </div>\n )\n}\n\nexport default DeleteRoleConfirmDialog\n","import React, { useState } from 'react'\nimport { Save, PlusCircle, Copy, Trash2, ChevronDown, ChevronRight, Eye, Edit3, Lock } from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport api from '../../lib/api'\nimport toast from 'react-hot-toast'\nimport CreateRoleModal from './CreateRoleModal'\nimport DeleteRoleConfirmDialog from './DeleteRoleConfirmDialog'\n\ntype FieldPermissionEntry = { read?: boolean; write?: boolean }\n\ninterface Role {\n _id: string\n roleName: string\n roleType: 'admin' | 'editor' | 'viewer' | 'custom'\n description: string\n isSystem: boolean\n permissions: Array<{\n resource: string\n actions: string[]\n fieldPermissions?: Record<string, FieldPermissionEntry>\n }>\n}\n\ninterface SettingsRolesProps {\n roles: Role[]\n setRoles: (r: Role[] | ((prev: Role[]) => Role[])) => void\n editingRole: Role | null\n setEditingRole: (r: Role | null) => void\n roleFilter: 'all' | 'system' | 'custom'\n setRoleFilter: (f: 'all' | 'system' | 'custom') => void\n healthData: any\n users: any[]\n theme: 'light' | 'dark'\n}\n\nconst SettingsRoles: React.FC<SettingsRolesProps> = ({\n roles, setRoles, editingRole, setEditingRole, roleFilter, setRoleFilter, healthData, users, theme,\n}) => {\n const [createOpen, setCreateOpen] = useState(false)\n const [deleteRole, setDeleteRole] = useState<Role | null>(null)\n const [expandedResource, setExpandedResource] = useState<string | null>(null)\n\n const filteredRoles = roleFilter === 'all' ? roles : roleFilter === 'system' ? roles.filter(r => r.isSystem) : roles.filter(r => !r.isSystem)\n\n const availableCollections = [\n { slug: '*', label: 'All Resources' },\n ...(healthData?.collections || []).map((c: any) => ({ slug: c.slug, label: c.label || c.slug })),\n ]\n\n const getCollectionFields = (collectionSlug: string): string[] => {\n if (collectionSlug === '*') return []\n const col = healthData?.collections?.find((c: any) => c.slug === collectionSlug)\n const fields: string[] = []\n const collect = (arr: any[]) => {\n for (const f of arr) {\n fields.push(f.name)\n if (f.fields?.length) collect(f.fields)\n }\n }\n if (col?.fields?.length) collect(col.fields)\n if (fields.length === 0) {\n return ['title', 'slug', 'status', 'publishedAt', 'createdAt', 'updatedAt', 'content', 'description', 'coverImage', 'author']\n }\n return [...new Set(fields)]\n }\n\n const updatePermission = (permIdx: number, patch: Partial<Role['permissions'][0]>) => {\n if (!editingRole || editingRole.isSystem) return\n const updated = [...editingRole.permissions]\n updated[permIdx] = { ...updated[permIdx], ...patch }\n setEditingRole({ ...editingRole, permissions: updated })\n }\n\n const updateFieldPermission = (permIdx: number, fieldName: string, patch: Partial<FieldPermissionEntry>) => {\n if (!editingRole || editingRole.isSystem) return\n const perm = editingRole.permissions[permIdx]\n const existing = perm.fieldPermissions || {}\n const fieldEntry = existing[fieldName] || {}\n const updated = {\n ...perm,\n fieldPermissions: {\n ...existing,\n [fieldName]: { ...fieldEntry, ...patch },\n },\n }\n const perms = [...editingRole.permissions]\n perms[permIdx] = updated\n setEditingRole({ ...editingRole, permissions: perms })\n }\n\n const clearFieldPermission = (permIdx: number, fieldName: string) => {\n if (!editingRole || editingRole.isSystem) return\n const perm = editingRole.permissions[permIdx]\n const existing = perm.fieldPermissions || {}\n const updated = { ...existing }\n delete updated[fieldName]\n const perms = [...editingRole.permissions]\n perms[permIdx] = { ...perm, fieldPermissions: updated }\n setEditingRole({ ...editingRole, permissions: perms })\n }\n\n const toggleField = (permIdx: number, fieldName: string, fieldPerm: FieldPermissionEntry | undefined, action: 'read' | 'write') => {\n if (fieldPerm?.[action]) {\n if (action === 'read' && fieldPerm?.write) {\n updateFieldPermission(permIdx, fieldName, { read: false })\n } else if (action === 'write' && fieldPerm?.read) {\n updateFieldPermission(permIdx, fieldName, { write: false })\n } else {\n clearFieldPermission(permIdx, fieldName)\n }\n } else {\n updateFieldPermission(permIdx, fieldName, { [action]: true })\n }\n }\n\n return (\n <div className=\"col-span-full space-y-6\">\n <div className=\"flex items-center justify-between border-b border-z-border pb-4\">\n <div className=\"flex flex-col\">\n <h3 className=\"text-sm font-semibold\">Roles & Permissions</h3>\n <span className=\"text-sm text-z-secondary font-bold mt-1\">\n Manage team access levels and granular resource permissions\n </span>\n </div>\n <button\n type=\"button\"\n onClick={() => setCreateOpen(true)}\n className=\"flex items-center gap-2 px-4 py-2 border border-z-active-border hover:border-z-accent hover:bg-z-active-bg text-sm font-semibold transition-all text-z-accent dark:text-z-active-text hover:text-z-primary\"\n >\n <PlusCircle size={12} />\n New Custom Role\n </button>\n </div>\n\n {/* Role type filter tabs */}\n <div className=\"flex items-center gap-1 border-b border-z-border pb-0\">\n {(['all', 'system', 'custom'] as const).map((filter) => (\n <button\n key={filter}\n type=\"button\"\n onClick={() => setRoleFilter(filter)}\n className={cn(\n 'px-4 py-2 text-sm font-semibold border-b-2 transition-all',\n roleFilter === filter ? 'border-z-border text-z-primary' : 'border-transparent text-z-secondary hover:text-z-primary'\n )}\n >\n {filter === 'all' ? `All (${roles.length})` : filter === 'system' ? `System (${roles.filter(r => r.isSystem).length})` : `Custom (${roles.filter(r => !r.isSystem).length})`}\n </button>\n ))}\n </div>\n\n <div className=\"grid grid-cols-1 xl:grid-cols-3 gap-8\">\n {/* Role list */}\n <div className=\"xl:col-span-1 space-y-3\">\n {filteredRoles.map((role) => (\n <div\n key={role._id}\n onClick={() => setEditingRole(role)}\n className={cn(\n 'p-4 border rounded-none flex items-center justify-between cursor-pointer transition-all shadow-sm',\n editingRole?._id === role._id\n ? 'bg-z-active-bg border-z-active-border'\n : theme === 'dark' ? 'bg-z-panel backdrop-blur-md border-z-border hover:border-z-active-border' : 'bg-z-input border-z-border'\n )}\n >\n <div className=\"flex flex-col leading-none gap-1.5\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-semibold text-z-primary\">{role.roleName}</span>\n {role.isSystem && (\n <span className=\"text-sm font-semibold px-1.5 py-0.5 border border-amber-500/30 text-amber-500\">SYSTEM</span>\n )}\n <span className={cn(\n 'text-sm font-semibold px-1.5 py-0.5 border',\n role.roleType === 'admin' ? 'border-red-500/30 text-red-400' :\n role.roleType === 'editor' ? 'border-z-border/30 text-z-secondary' :\n 'border-z-border text-z-secondary'\n )}>\n {role.roleType}\n </span>\n </div>\n <span className=\"text-sm font-bold text-z-secondary\">\n {role.permissions?.length || 0} rule{role.permissions?.length !== 1 ? 's' : ''}\n {role.description && ` · ${role.description.slice(0, 40)}`}\n </span>\n </div>\n {!role.isSystem && (\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n title=\"Clone role\"\n onClick={async (e) => {\n e.stopPropagation()\n try {\n const res = await api.post(`/roles/clone/${role._id}`)\n setRoles((prev: Role[]) => [...prev, res.data.data])\n toast.success(`Cloned as \"${res.data.data.roleName}\"`)\n } catch { toast.error('Failed to clone role') }\n }}\n className=\"text-z-secondary hover:text-z-secondary transition-colors\"\n >\n <Copy size={14} />\n </button>\n <button\n type=\"button\"\n title=\"Delete role\"\n onClick={(e) => {\n e.stopPropagation()\n setDeleteRole(role)\n }}\n className=\"text-z-secondary hover:text-red-400 transition-colors\"\n >\n <Trash2 size={14} />\n </button>\n </div>\n )}\n </div>\n ))}\n {filteredRoles.length === 0 && (\n <p className=\"text-sm text-z-secondary font-bold py-4\">No {roleFilter} roles found.</p>\n )}\n </div>\n\n {/* Permission editor */}\n <div className=\"xl:col-span-2\">\n {editingRole ? (\n <div className=\"space-y-6 p-6 border rounded-none shadow-sm transition-all bg-z-panel backdrop-blur-md border-z-border\">\n <div className=\"flex items-center justify-between border-b border-z-border pb-4\">\n <div className=\"flex flex-col\">\n <h4 className=\"text-xs font-semibold text-z-secondary\">{editingRole.roleName}</h4>\n {editingRole.description && (\n <span className=\"text-sm font-bold text-z-secondary mt-0.5\">{editingRole.description}</span>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n {!editingRole.isSystem && (\n <button\n type=\"button\"\n onClick={async () => {\n try {\n const res = await api.patch(`/roles/${editingRole._id}`, {\n roleName: editingRole.roleName,\n description: editingRole.description,\n permissions: editingRole.permissions,\n })\n setRoles((prev: Role[]) => prev.map(r => r._id === editingRole._id ? res.data.data : r))\n setEditingRole(res.data.data)\n toast.success('Permissions saved')\n } catch (err: any) {\n toast.error(err.response?.data?.error?.message || 'Failed to save')\n }\n }}\n className={cn(\"flex items-center gap-2 px-4 py-2 text-z-primary text-sm font-semibold transition-all\", 'bg-z-accent hover:brightness-110 shadow-sm text-z-logo-text')}\n >\n <Save size={12} />\n Save\n </button>\n )}\n </div>\n </div>\n\n {editingRole.isSystem && (\n <div className=\"p-3 border border-amber-500/20 bg-amber-500/5 text-[9.5px] font-bold text-amber-400\">\n System roles cannot be modified. Clone the role to customize its permissions.\n </div>\n )}\n\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-semibold text-z-muted\">Resource Permission Rules</span>\n {!editingRole.isSystem && (\n <button\n type=\"button\"\n onClick={() => setEditingRole({ ...editingRole, permissions: [...(editingRole.permissions || []), { resource: '*', actions: ['read'] }] })}\n className=\"text-sm font-semibold text-z-secondary hover:text-z-secondary flex items-center gap-1\"\n >\n <PlusCircle size={10} />\n Add Rule\n </button>\n )}\n </div>\n\n <div className=\"space-y-3\">\n {(editingRole.permissions || []).map((perm, permIdx) => (\n <div key={permIdx} className=\"border border-z-border bg-z-panel\">\n {/* Rule header */}\n <div className=\"p-4 flex flex-col gap-4\">\n <div className=\"flex items-center gap-3 flex-wrap\">\n <select\n disabled={editingRole.isSystem}\n value={perm.resource}\n onChange={(e) => {\n if (editingRole.isSystem) return\n const updated = [...editingRole.permissions]\n updated[permIdx] = { ...perm, resource: e.target.value }\n setEditingRole({ ...editingRole, permissions: updated })\n }}\n className={cn(\"text-sm font-semibold outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black py-1.5 px-3 rounded-none focus:border-z-accent disabled:opacity-50 border\", 'bg-z-input border-z-border text-z-primary')}\n >\n {availableCollections.map(c => (<option key={c.slug} value={c.slug}>{c.label}</option>))}\n </select>\n <div className=\"flex items-center gap-3 flex-wrap\">\n {['create', 'read', 'update', 'delete'].map((act) => {\n const checked = perm.actions.includes(act)\n return (\n <label key={act} className=\"flex items-center gap-1.5 cursor-pointer\">\n <input\n type=\"checkbox\"\n disabled={editingRole.isSystem}\n checked={checked}\n onChange={(e) => {\n if (editingRole.isSystem) return\n let next = [...perm.actions]\n if (e.target.checked) next.push(act)\n else next = next.filter(a => a !== act)\n const updated = [...editingRole.permissions]\n updated[permIdx] = { ...perm, actions: next }\n setEditingRole({ ...editingRole, permissions: updated })\n }}\n className=\"rounded-none-none border-z-border text-z-secondary focus:ring-0 bg-app cursor-pointer\"\n />\n <span className={cn('text-sm font-semibold ', checked ? 'text-z-secondary' : 'text-z-secondary')}>{act}</span>\n </label>\n )\n })}\n </div>\n </div>\n </div>\n\n {/* Field permissions */}\n {perm.resource !== '*' && (\n <div className=\"border-t border-z-border\">\n <button\n type=\"button\"\n disabled={editingRole.isSystem}\n onClick={() => setExpandedResource(expandedResource === `${editingRole._id}-${permIdx}` ? null : `${editingRole._id}-${permIdx}`)}\n className={cn(\n 'w-full flex items-center gap-2 px-4 py-2.5 text-sm font-semibold transition-all',\n theme === 'dark' ? 'hover:bg-z-hover text-z-muted hover:text-z-secondary' : 'hover:bg-[var(--z-bg-input)] text-z-secondary hover:text-z-primary',\n editingRole.isSystem && 'opacity-50 cursor-not-allowed'\n )}\n >\n {expandedResource === `${editingRole._id}-${permIdx}` ? <ChevronDown size={10} /> : <ChevronRight size={10} />}\n <Lock size={9} />\n Field-Level Access ({Object.keys(perm.fieldPermissions || {}).length} configured)\n </button>\n\n {expandedResource === `${editingRole._id}-${permIdx}` && (\n <div className=\"px-4 pb-4\">\n {(() => {\n const fields = getCollectionFields(perm.resource)\n return (\n <div className=\"space-y-2\">\n <div className=\"grid grid-cols-12 gap-2 border-b border-z-border pb-2\">\n <div className=\"col-span-4 text-sm font-semibold text-z-secondary\">Field</div>\n <div className=\"col-span-4 text-sm font-semibold text-z-secondary flex items-center gap-1 justify-center\"><Eye size={8} /> Read</div>\n <div className=\"col-span-4 text-sm font-semibold text-z-secondary flex items-center gap-1 justify-center\"><Edit3 size={8} /> Write</div>\n </div>\n {fields.map((field) => {\n const fp = perm.fieldPermissions?.[field]\n const readOn = fp?.read\n const writeOn = fp?.write\n return (\n <div key={field} className=\"grid grid-cols-12 gap-2 items-center py-1.5 border-b border-z-border last:border-0\">\n <div className=\"col-span-4\">\n <span className={cn(\n 'text-sm font-semibold ',\n (readOn || writeOn) ? 'text-z-secondary' : 'text-z-secondary'\n )}>\n {field}\n </span>\n </div>\n <div className=\"col-span-4 flex justify-center\">\n <button\n type=\"button\"\n disabled={editingRole.isSystem}\n onClick={() => toggleField(permIdx, field, fp, 'read')}\n className={cn(\n 'w-6 h-6 border rounded-none flex items-center justify-center transition-all',\n readOn\n ? 'bg-z-accent/20 border-z-active-border text-z-active-text'\n : 'bg-transparent border-z-border text-z-secondary hover:border-z-active-border hover:text-z-active-text',\n editingRole.isSystem && 'opacity-50 cursor-not-allowed'\n )}\n >\n {readOn && <Eye size={9} />}\n </button>\n </div>\n <div className=\"col-span-4 flex justify-center\">\n <button\n type=\"button\"\n disabled={editingRole.isSystem}\n onClick={() => toggleField(permIdx, field, fp, 'write')}\n className={cn(\n 'w-6 h-6 border rounded-none flex items-center justify-center transition-all',\n writeOn\n ? 'bg-z-accent/20 border-z-active-border text-z-active-text'\n : 'bg-transparent border-z-border text-z-secondary hover:border-z-active-border hover:text-z-active-text',\n editingRole.isSystem && 'opacity-50 cursor-not-allowed'\n )}\n >\n {writeOn && <Edit3 size={9} />}\n </button>\n </div>\n </div>\n )\n })}\n </div>\n )\n })()}\n </div>\n )}\n </div>\n )}\n </div>\n ))}\n {editingRole.permissions?.length === 0 && (\n <p className=\"text-sm text-z-secondary font-bold text-center py-4\">No permission rules defined. Add a rule above.</p>\n )}\n </div>\n </div>\n\n {/* User assignment */}\n <div className=\"border-t border-z-border pt-5 space-y-3\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-semibold text-z-muted\">\n Assigned Users ({users.filter(u => u.role === editingRole.roleName || u.role === editingRole.roleType).length})\n </span>\n </div>\n <div className=\"space-y-2\">\n {users.filter(u => u.role === editingRole.roleName || u.role === editingRole.roleType).map(u => (\n <div key={u._id} className=\"flex items-center justify-between p-3 border border-z-border bg-z-panel\">\n <div className=\"flex flex-col\">\n <span className=\"text-sm font-semibold text-z-primary\">{u.email}</span>\n <span className=\"text-sm font-bold text-z-secondary\">{u._id}</span>\n </div>\n <span className=\"text-sm font-semibold text-z-secondary border border-z-border/20 px-2 py-1\">{u.role}</span>\n </div>\n ))}\n {users.filter(u => u.role === editingRole.roleName || u.role === editingRole.roleType).length === 0 && (\n <p className=\"text-sm text-z-secondary font-bold text-center py-2\">No users assigned to this role.</p>\n )}\n </div>\n </div>\n </div>\n ) : (\n <div className=\"min-h-[300px] border border-dashed border-z-border flex items-center justify-center text-center p-8\">\n <p className=\"text-sm text-z-secondary font-bold max-w-xs\">\n Select a role on the left to view and edit its permission rules.\n </p>\n </div>\n )}\n </div>\n </div>\n\n {createOpen && (\n <CreateRoleModal\n onClose={() => setCreateOpen(false)}\n onCreated={(newRole) => {\n setRoles((prev: Role[]) => [...prev, newRole])\n setEditingRole(newRole)\n }}\n theme={theme}\n />\n )}\n\n {deleteRole && (\n <DeleteRoleConfirmDialog\n role={deleteRole}\n onClose={() => setDeleteRole(null)}\n onDeleted={() => {\n setRoles((prev: Role[]) => prev.filter(r => r._id !== deleteRole._id))\n if (editingRole?._id === deleteRole._id) setEditingRole(null)\n }}\n theme={theme}\n />\n )}\n </div>\n )\n}\n\nexport default SettingsRoles\n","import React, { useRef } from 'react'\nimport { Paintbrush, Code2, Sun, Moon, Type, Upload, RotateCcw, Check } from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport { useBrand, THEME_PRESETS } from '../../context/BrandContext'\nimport toast from 'react-hot-toast'\n\ninterface Props {\n settings: { customCSS: string; [k: string]: any }\n setSettings: (s: any) => void\n theme: 'light' | 'dark'\n}\n\nconst FONTS = ['Inter', 'Roboto', 'Outfit', 'DM Sans', 'Sora', 'Plus Jakarta Sans', 'Space Grotesk', 'Fira Code', 'Merriweather']\n\nconst card = (dark: boolean) =>\n cn('p-6 border transition-all', 'z-card')\n\nconst inp = (dark: boolean) =>\n cn('w-full border py-2 px-3 text-sm font-semibold outline-none transition-all focus:ring-1 focus:ring-z-active-border focus:border-z-accent',\n 'bg-z-panel border-z-border text-z-primary')\n\nconst label = 'text-sm font-semibold text-z-secondary block mb-2'\n\nexport default function SettingsAppearance({ settings, setSettings, theme }: Props) {\n const dark = theme === 'dark'\n const { brand, preset, setBrand, applyPreset } = useBrand()\n const logoRef = useRef<HTMLInputElement>(null)\n const faviconRef = useRef<HTMLInputElement>(null)\n\n const handleImageUpload = (file: File, field: 'logoUrl' | 'faviconUrl') => {\n if (!file.type.startsWith('image/')) return toast.error('Must be an image file')\n const reader = new FileReader()\n reader.onload = (e) => {\n setBrand({ [field]: e.target?.result as string })\n toast.success(field === 'logoUrl' ? 'Logo updated' : 'Favicon updated')\n }\n reader.readAsDataURL(file)\n }\n\n return (\n <div className=\"space-y-6\">\n\n {/* ── Row 1: Brand Identity + Theme Presets ──────────────────────── */}\n <div className=\"grid grid-cols-1 xl:grid-cols-2 gap-6\">\n\n {/* Brand Identity */}\n <div className={card(dark) + ' space-y-5'}>\n <div className=\"flex items-center gap-3 pb-4 border-b\" style={{ borderColor: 'var(--z-border)' }}>\n <div className=\"w-8 h-8 flex items-center justify-center border\" style={{ background: 'var(--z-active-bg)', borderColor: 'var(--z-active-border)' }}>\n <Paintbrush size={15} className=\"text-z-active-text\" />\n </div>\n <div>\n <h3 className=\"text-sm font-semibold\">Brand Identity</h3>\n <p className={label + ' mt-0.5 mb-0'}>White-label your CMS</p>\n </div>\n </div>\n\n {/* App Name & Tagline */}\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <label className={label}>App Name</label>\n <input\n value={brand.appName}\n onChange={e => setBrand({ appName: e.target.value })}\n className={inp(dark)}\n placeholder=\"Zenith\"\n />\n </div>\n <div>\n <label className={label}>Tagline / Version</label>\n <input\n value={brand.appTagline}\n onChange={e => setBrand({ appTagline: e.target.value })}\n className={inp(dark)}\n placeholder=\"v1.0 Beta\"\n />\n </div>\n </div>\n\n {/* Logo Upload */}\n <div>\n <label className={label}>Logo Image</label>\n <div className=\"flex items-center gap-3\">\n {brand.logoUrl ? (\n <img src={brand.logoUrl} alt=\"Logo\" className=\"w-10 h-10 object-contain border\" style={{ borderColor: dark ? 'rgba(255,255,255,0.08)' : '#e5e7eb' }} />\n ) : (\n <div className=\"w-10 h-10 border flex items-center justify-center text-z-secondary text-sm font-semibold\"\n style={{ borderColor: dark ? 'rgba(255,255,255,0.08)' : '#e5e7eb' }}>\n None\n </div>\n )}\n <div className=\"flex-1 flex gap-2\">\n <button onClick={() => logoRef.current?.click()}\n className={cn('flex-1 flex items-center justify-center gap-2 py-2 border text-sm font-semibold transition-all',\n 'border-z-border text-z-secondary hover:text-z-primary hover:border-z-border-strong')}>\n <Upload size={11} /> Upload\n </button>\n {brand.logoUrl && (\n <button onClick={() => setBrand({ logoUrl: '' })}\n className=\"px-3 py-2 border border-red-500/20 text-red-400 text-sm font-semibold hover:bg-red-500/10 transition-all\">\n <RotateCcw size={11} />\n </button>\n )}\n </div>\n <input ref={logoRef} type=\"file\" accept=\"image/*\" className=\"hidden\" onChange={e => e.target.files?.[0] && handleImageUpload(e.target.files[0], 'logoUrl')} />\n </div>\n </div>\n\n {/* Favicon Upload */}\n <div>\n <label className={label}>Favicon</label>\n <div className=\"flex items-center gap-3\">\n {brand.faviconUrl ? (\n <img src={brand.faviconUrl} alt=\"Favicon\" className=\"w-8 h-8 object-contain border\" style={{ borderColor: dark ? 'rgba(255,255,255,0.08)' : '#e5e7eb' }} />\n ) : (\n <div className=\"w-8 h-8 border flex items-center justify-center text-z-secondary text-sm\"\n style={{ borderColor: dark ? 'rgba(255,255,255,0.08)' : '#e5e7eb' }}>ico</div>\n )}\n <button onClick={() => faviconRef.current?.click()}\n className={cn('flex items-center gap-2 px-4 py-2 border text-sm font-semibold transition-all',\n 'border-z-border text-z-secondary hover:text-z-primary hover:border-z-border-strong')}>\n <Upload size={11} /> Upload\n </button>\n <input ref={faviconRef} type=\"file\" accept=\"image/*\" className=\"hidden\" onChange={e => e.target.files?.[0] && handleImageUpload(e.target.files[0], 'faviconUrl')} />\n </div>\n </div>\n\n {/* Font */}\n <div>\n <label className={label}>Typography</label>\n <div className=\"relative\">\n <Type size={12} className=\"absolute left-3 top-2.5 text-z-secondary\" />\n <select value={brand.fontFamily} onChange={e => setBrand({ fontFamily: e.target.value })} className={cn(inp(dark), 'pl-9')}>\n {FONTS.map(f => <option key={f} value={f}>{f}</option>)}\n </select>\n </div>\n </div>\n\n {/* Default Theme */}\n <div>\n <label className={label}>Default Color Mode</label>\n <div className=\"grid grid-cols-2 gap-2\">\n {['light', 'dark'].map(t => (\n <button key={t} type=\"button\"\n onClick={() => setSettings({ ...settings, theme: t })}\n className={cn('flex items-center justify-center gap-2 py-2.5 border text-sm font-semibold transition-all',\n (settings.theme === t || (!settings.theme && t === 'dark'))\n ? 'border-z-accent bg-z-active-bg text-z-active-text'\n : 'border-z-border text-z-secondary hover:border-z-active-border')}>\n {t === 'light' ? <Sun size={13} /> : <Moon size={13} />}\n {t}\n </button>\n ))}\n </div>\n </div>\n </div>\n\n {/* Theme Presets */}\n <div className={card(dark) + ' space-y-5'}>\n <div className=\"flex items-center gap-3 pb-4 border-b\" style={{ borderColor: 'var(--z-border)' }}>\n <div className=\"w-8 h-8 flex items-center justify-center border\" style={{ background: 'var(--z-active-bg)', borderColor: 'var(--z-active-border)' }}>\n <Paintbrush size={15} className=\"text-z-active-text\" />\n </div>\n <div>\n <h3 className=\"text-sm font-semibold\">Accent Theme</h3>\n <p className={label + ' mt-0.5 mb-0'}>Plug-and-play presets</p>\n </div>\n </div>\n\n <div className=\"grid grid-cols-2 gap-3\">\n {THEME_PRESETS.map(p => {\n const active = brand.themePresetId === p.id\n return (\n <button key={p.id} onClick={() => applyPreset(p.id)}\n className={cn('relative flex items-center gap-3 p-3 border text-left transition-all group',\n active\n ? 'border-z-accent/50 bg-z-accent/5'\n : 'border-z-border hover:border-z-border-strong')}>\n {/* Swatch */}\n <div className=\"w-8 h-8 flex-shrink-0 flex items-center justify-center font-semibold text-sm shadow-lg\"\n style={{ backgroundColor: p.accentHex, color: p.logoIconText }}>\n {p.name[0]}\n </div>\n <div className=\"flex flex-col min-w-0\">\n <span className={cn('text-sm font-semibold truncate', active ? 'text-z-active-text' : 'text-z-secondary')}>{p.name}</span>\n <span className=\"text-sm font-mono text-z-secondary\">{p.accentHex}</span>\n </div>\n {active && <Check size={11} className=\"absolute top-2 right-2 text-z-active-text\" />}\n </button>\n )\n })}\n </div>\n\n {/* Live Preview */}\n <div className=\"space-y-2\">\n <label className={label}>Live Preview</label>\n <div className=\"p-4 border space-y-2\" style={{ borderColor: 'var(--z-border)', background: 'var(--z-panel)' }}>\n {/* Simulated sidebar item active */}\n <div className=\"flex items-center gap-3 px-3 py-2 border\"\n style={{ background: preset.activeBg, borderColor: preset.activeBorder, boxShadow: preset.activeGlow }}>\n <div className=\"w-2 h-2\" style={{ background: preset.activeText }} />\n <span className=\"text-sm font-semibold\" style={{ color: preset.activeText }}>{brand.appName || 'Zenith'}</span>\n </div>\n {/* Simulated sidebar item default */}\n <div className={cn('flex items-center gap-3 px-3 py-2 border', 'border-z-border')}>\n <div className=\"w-2 h-2 bg-z-accent\" />\n <span className={cn('text-sm font-semibold ', 'text-z-secondary')}>Collections</span>\n </div>\n {/* Simulated logo badge */}\n <div className=\"flex items-center gap-2 pt-1\">\n <div className=\"w-7 h-7 flex items-center justify-center font-semibold text-sm\"\n style={{ background: preset.logoIconBg, color: preset.logoIconText }}>\n {(brand.appName || 'Z')[0]}\n </div>\n <span className=\"text-sm font-semibold\" style={{ color: 'var(--z-text-primary)' }}>\n {brand.appName || 'Zenith'}\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n {/* ── Custom CSS ─────────────────────────────────────────────────── */}\n <div className={card(dark) + ' space-y-4'}>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-8 h-8 flex items-center justify-center border\" style={{ background: 'rgba(59,130,246,0.1)', borderColor: 'rgba(59,130,246,0.2)' }}>\n <Code2 size={15} className=\"text-z-active-text\" />\n </div>\n <div>\n <h3 className=\"text-sm font-semibold\">CSS Override</h3>\n <p className={label + ' mt-0.5 mb-0'}>Global stylesheet injection</p>\n </div>\n </div>\n <span className=\"text-sm font-semibold text-z-active-text border border-z-accent/20 bg-z-accent/10 px-2 py-1\">Live</span>\n </div>\n <textarea\n value={settings.customCSS}\n onChange={e => { setSettings({ ...settings, customCSS: e.target.value }); setBrand({ customCSS: e.target.value }) }}\n rows={10}\n spellCheck={false}\n className={cn('w-full border py-4 px-5 text-sm font-mono outline-none transition-all focus:ring-1 focus:ring-z-active-border resize-none',\n 'bg-z-input border-z-border text-z-primary')}\n placeholder={`:root {\\n /* Override brand accent */\\n --brand-accent: var(--z-accent);\\n}\\n\\n/* Custom panel styles */\\n.my-panel {\\n backdrop-filter: blur(12px);\\n}`}\n />\n </div>\n </div>\n )\n}\n","import {\n Bell,\n BellOff,\n CheckCircle2,\n ChevronDown,\n ChevronUp,\n Clock,\n Loader2,\n Plus,\n RotateCcw,\n Send,\n Trash2,\n Webhook,\n XCircle,\n} from 'lucide-react'\nimport React, { useEffect, useRef, useState } from 'react'\nimport toast from 'react-hot-toast'\nimport EmptyState from '../../components/EmptyState'\nimport api from '../../lib/api'\nimport { cn } from '../../lib/utils'\nimport { confirm } from '../../store/confirmStore'\n\ninterface WebhookTarget {\n id: string\n url: string\n secret: string\n events: string[]\n enabled: boolean\n createdAt: string\n}\n\ninterface DeliveryRecord {\n id: string\n collectionSlug?: string\n event: string\n url: string\n success: boolean\n responseStatus?: number\n timestamp: string\n}\n\ninterface SettingsWebhooksProps {\n theme: 'light' | 'dark'\n}\n\nconst AVAILABLE_EVENTS = [\n { value: 'posts.created', label: 'Post Created' },\n { value: 'posts.updated', label: 'Post Updated' },\n { value: 'posts.deleted', label: 'Post Deleted' },\n { value: 'posts.published', label: 'Post Published' },\n { value: 'posts.unpublished', label: 'Post Unpublished' },\n { value: 'authors.created', label: 'Author Created' },\n { value: 'authors.updated', label: 'Author Updated' },\n { value: 'authors.deleted', label: 'Author Deleted' },\n { value: 'products.created', label: 'Product Created' },\n { value: 'products.updated', label: 'Product Updated' },\n { value: 'products.deleted', label: 'Product Deleted' },\n { value: 'media.uploaded', label: 'Media Uploaded' },\n { value: 'media.deleted', label: 'Media Deleted' },\n { value: '*', label: 'All Events' },\n]\n\nconst SettingsWebhooks: React.FC<SettingsWebhooksProps> = ({ theme }) => {\n const [webhooks, setWebhooks] = useState<WebhookTarget[]>([])\n const [loading, setLoading] = useState(true)\n const [fetchError, setFetchError] = useState<string | null>(null)\n const [showForm, setShowForm] = useState(false)\n const [editingId, setEditingId] = useState<string | null>(null)\n const [formUrl, setFormUrl] = useState('')\n const [formSecret, setFormSecret] = useState('')\n const [formEvents, setFormEvents] = useState<string[]>([])\n const [saving, setSaving] = useState(false)\n const [testingId, setTestingId] = useState<string | null>(null)\n const [expandedWebhook, setExpandedWebhook] = useState<string | null>(null)\n const [deliveries, setDeliveries] = useState<Record<string, DeliveryRecord[]>>({})\n const [loadingDeliveries, setLoadingDeliveries] = useState<string | null>(null)\n const [replayingId, setReplayingId] = useState<string | null>(null)\n \n const isMountedRef = useRef(true)\n useEffect(() => {\n return () => {\n isMountedRef.current = false\n }\n }, [])\n\n const fetchWebhooks = async () => {\n if (!isMountedRef.current) return\n setLoading(true)\n setFetchError(null)\n try {\n const res = await api.get('/system/webhooks')\n if (isMountedRef.current) setWebhooks(res.data.data || [])\n } catch (err: any) {\n const msg = err?.response?.data?.error || err?.message || 'Failed to load webhooks'\n if (isMountedRef.current) setFetchError(msg)\n } finally {\n if (isMountedRef.current) setLoading(false)\n }\n }\n\n React.useEffect(() => {\n fetchWebhooks()\n }, [])\n\n const fetchDeliveries = async (webhookId: string, url: string) => {\n if (!isMountedRef.current) return\n setLoadingDeliveries(webhookId)\n try {\n const res = await api.get(`/system/webhooks/${webhookId}/deliveries?limit=25`)\n if (isMountedRef.current) setDeliveries((prev) => ({ ...prev, [url]: res.data.data || [] }))\n } catch {\n if (isMountedRef.current) toast.error('Failed to load delivery log')\n } finally {\n if (isMountedRef.current) setLoadingDeliveries(null)\n }\n }\n\n const toggleExpand = (wh: WebhookTarget) => {\n if (expandedWebhook === wh.id) {\n setExpandedWebhook(null)\n } else {\n setExpandedWebhook(wh.id)\n if (!deliveries[wh.url]) {\n fetchDeliveries(wh.id, wh.url)\n }\n }\n }\n\n const resetForm = () => {\n setFormUrl('')\n setFormSecret('')\n setFormEvents([])\n setEditingId(null)\n setShowForm(false)\n }\n\n const handleEdit = (wh: WebhookTarget) => {\n setEditingId(wh.id)\n setFormUrl(wh.url)\n setFormSecret(wh.secret)\n setFormEvents(wh.events)\n setShowForm(true)\n }\n\n const handleSave = async () => {\n if (!formUrl.trim()) {\n toast.error('URL is required')\n return\n }\n if (formEvents.length === 0) {\n toast.error('Select at least one event')\n return\n }\n setSaving(true)\n try {\n if (editingId) {\n await api.put(`/system/webhooks/${editingId}`, {\n url: formUrl,\n secret: formSecret,\n events: formEvents,\n })\n toast.success('Webhook updated')\n } else {\n await api.post('/system/webhooks', { url: formUrl, secret: formSecret, events: formEvents })\n toast.success('Webhook created')\n }\n resetForm()\n fetchWebhooks()\n } catch (err: any) {\n toast.error(err.response?.data?.message || 'Failed to save webhook')\n } finally {\n setSaving(false)\n }\n }\n\n const handleDelete = async (id: string) => {\n if (!(await confirm({ message: 'Delete this webhook?' }))) return\n try {\n await api.delete(`/system/webhooks/${id}`)\n toast.success('Webhook deleted')\n fetchWebhooks()\n } catch {\n toast.error('Failed to delete webhook')\n }\n }\n\n const handleToggle = async (wh: WebhookTarget) => {\n try {\n await api.put(`/system/webhooks/${wh.id}`, { enabled: !wh.enabled })\n setWebhooks((prev) => prev.map((w) => (w.id === wh.id ? { ...w, enabled: !wh.enabled } : w)))\n toast.success(wh.enabled ? 'Webhook disabled' : 'Webhook enabled')\n } catch {\n toast.error('Failed to toggle webhook')\n }\n }\n\n const handleTest = async (id: string, url: string) => {\n setTestingId(id)\n try {\n const res = await api.post(`/system/webhooks/${id}/test`)\n if (res.data.data.success) {\n toast.success(`Test delivered (status ${res.data.data.status})`)\n } else {\n toast.error(`Test failed: ${res.data.data.error || 'Unknown error'}`)\n }\n // Refresh deliveries after test\n fetchDeliveries(id, url)\n } catch (err: any) {\n toast.error(err.response?.data?.message || 'Test failed')\n } finally {\n setTestingId(null)\n }\n }\n\n const handleRetryDelivery = async (whId: string, whUrl: string) => {\n // Re-send a test event to refresh the delivery log\n await handleTest(whId, whUrl)\n }\n\n const handleReplay = async (whId: string, deliveryId: string, url: string) => {\n setReplayingId(deliveryId)\n try {\n const res = await api.post(`/system/webhooks/${whId}/deliveries/${deliveryId}/replay`)\n if (res.data.data.success) {\n toast.success(`Replay delivered (status ${res.data.data.status})`)\n } else {\n toast.error(`Replay failed: ${res.data.data.error || 'Unknown error'}`)\n }\n fetchDeliveries(whId, url)\n } catch (err: any) {\n toast.error(err.response?.data?.message || 'Replay failed')\n } finally {\n setReplayingId(null)\n }\n }\n\n const toggleEvent = (value: string) => {\n if (value === '*') {\n setFormEvents(['*'])\n return\n }\n setFormEvents((prev) => {\n const next = prev.filter((e) => e !== '*')\n if (next.includes(value)) return next.filter((e) => e !== value)\n return [...next, value]\n })\n }\n\n const formatTimestamp = (ts: string) => {\n try {\n const d = new Date(ts)\n return d.toLocaleString('en-US', {\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n })\n } catch {\n return ts\n }\n }\n\n return (\n <div className=\"col-span-full space-y-6\">\n <div className=\"flex items-center justify-between border-b border-z-border pb-4\">\n <div className=\"flex flex-col\">\n <h3 className=\"text-sm font-semibold flex items-center gap-3\">\n <Webhook size={16} className=\"text-z-secondary\" />\n Webhook Management\n </h3>\n <span className=\"text-sm text-z-secondary font-bold mt-1\">\n Configure HTTP callbacks for content lifecycle events\n </span>\n </div>\n {!showForm && (\n <button\n type=\"button\"\n onClick={() => setShowForm(true)}\n className=\"flex items-center gap-2 px-4 py-2 border border-z-border hover:border-z-active-border hover:bg-z-hover text-sm font-semibold transition-all text-z-secondary hover:text-z-primary\"\n >\n <Plus size={12} />\n Add Webhook\n </button>\n )}\n </div>\n\n {/* Form */}\n {showForm && (\n <div\n className={cn(\n 'p-6 border rounded-none space-y-5 shadow-sm',\n 'bg-z-panel backdrop-blur-md border-z-border'\n )}\n >\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-semibold text-z-secondary\">\n {editingId ? 'Edit Webhook' : 'New Webhook'}\n </span>\n <button\n onClick={resetForm}\n className=\"text-z-secondary hover:text-z-primary text-sm font-semibold\"\n >\n Cancel\n </button>\n </div>\n\n <div className=\"space-y-4\">\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-semibold text-z-secondary\">Endpoint URL</label>\n <input\n type=\"url\"\n value={formUrl}\n onChange={(e) => setFormUrl(e.target.value)}\n placeholder=\"https://example.com/api/webhooks/zenith\"\n className={cn(\n 'w-full border rounded-none py-3 px-4 text-sm font-mono transition-all outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black',\n 'bg-z-panel border-z-border text-z-primary focus:border-z-active-border'\n )}\n />\n </div>\n\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-semibold text-z-secondary\">\n Signing Secret (optional)\n </label>\n <input\n type=\"password\"\n value={formSecret}\n onChange={(e) => setFormSecret(e.target.value)}\n placeholder=\"whsec_...\"\n className={cn(\n 'w-full border rounded-none py-3 px-4 text-sm font-mono transition-all outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black',\n 'bg-z-panel border-z-border text-z-primary focus:border-z-active-border'\n )}\n />\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-sm font-semibold text-z-secondary\">Subscribed Events</label>\n <div\n className={cn(\n 'p-4 border rounded-none flex flex-wrap gap-2 max-h-40 overflow-y-auto',\n 'bg-z-panel border-z-border'\n )}\n >\n {AVAILABLE_EVENTS.map((evt) => {\n const checked = formEvents.includes(evt.value)\n return (\n <button\n key={evt.value}\n type=\"button\"\n onClick={() => toggleEvent(evt.value)}\n className={cn(\n 'px-3 py-1.5 text-sm font-semibold border rounded-none transition-all',\n checked\n ? 'border-z-border/40 bg-z-panel text-z-secondary'\n : 'border-z-border text-z-secondary hover:text-z-primary'\n )}\n >\n {evt.label}\n </button>\n )\n })}\n </div>\n </div>\n </div>\n\n <div className=\"flex justify-end\">\n <button\n onClick={handleSave}\n disabled={saving}\n className={cn(\n 'flex items-center gap-2 px-6 py-3 text-z-primary text-sm font-semibold transition-all disabled:opacity-40',\n 'bg-z-accent hover:brightness-110 shadow-sm text-z-logo-text'\n )}\n >\n {saving ? <Loader2 size={12} className=\"animate-spin\" /> : null}\n {editingId ? 'Update Webhook' : 'Create Webhook'}\n </button>\n </div>\n </div>\n )}\n\n {/* Webhook list */}\n {loading ? (\n <div className=\"flex items-center justify-center py-12\">\n <Loader2 size={24} className=\"text-z-secondary animate-spin\" />\n </div>\n ) : fetchError ? (\n <div className={cn('p-8 border border-dashed text-center space-y-3', 'border-z-border')}>\n <XCircle size={28} className=\"mx-auto text-red-400\" />\n <p className=\"text-sm font-semibold text-z-primary\">Could not load webhooks</p>\n <p className=\"text-xs text-z-secondary\">{fetchError}</p>\n <button\n onClick={fetchWebhooks}\n className=\"inline-flex items-center gap-2 px-4 py-2 border border-z-border hover:border-z-active-border hover:bg-z-hover text-sm font-semibold text-z-secondary hover:text-z-primary transition-all\"\n >\n <RotateCcw size={12} /> Retry\n </button>\n </div>\n ) : webhooks.length === 0 ? (\n <div className=\"py-6\">\n <EmptyState\n icon={Webhook}\n title=\"No webhooks configured\"\n message=\"Add a webhook to receive HTTP callbacks when content events occur\"\n action={\n <button\n type=\"button\"\n onClick={() => setShowForm(true)}\n className=\"flex items-center gap-2 px-4 py-2 border border-z-border hover:border-z-active-border hover:bg-z-hover text-sm font-semibold transition-all text-z-secondary hover:text-z-primary\"\n >\n <Plus size={12} />\n Add Webhook\n </button>\n }\n />\n </div>\n ) : (\n <div className=\"space-y-3\">\n {webhooks.map((wh) => (\n <div key={wh.id} className=\"space-y-0\">\n <div\n className={cn(\n 'p-5 border rounded-none transition-all shadow-sm',\n wh.enabled\n ? 'bg-z-panel backdrop-blur-md border-z-border shadow-sm'\n : 'bg-z-input border-z-border opacity-60'\n )}\n >\n <div className=\"flex items-center justify-between mb-3\">\n <div className=\"flex items-center gap-3\">\n {wh.enabled ? (\n <CheckCircle2 size={14} className=\"text-z-secondary \" />\n ) : (\n <XCircle size={14} className=\"text-z-secondary\" />\n )}\n <span className=\"text-sm font-mono font-bold truncate max-w-md\">{wh.url}</span>\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n onClick={() => handleTest(wh.id, wh.url)}\n disabled={testingId === wh.id || !wh.enabled}\n className={cn(\n 'p-2 border rounded-none-none transition-colors',\n 'border-z-border text-z-secondary hover:text-z-primary'\n )}\n title=\"Send test event\"\n >\n {testingId === wh.id ? (\n <Loader2 size={12} className=\"animate-spin\" />\n ) : (\n <Send size={12} />\n )}\n </button>\n <button\n onClick={() => handleToggle(wh)}\n className={cn(\n 'p-2 border rounded-none-none transition-colors',\n wh.enabled\n ? 'border-z-border text-status-orange hover:brightness-110'\n : 'border-z-border text-z-secondary hover:text-z-primary'\n )}\n title={wh.enabled ? 'Disable' : 'Enable'}\n >\n {wh.enabled ? <Bell size={12} /> : <BellOff size={12} />}\n </button>\n <button\n onClick={() => handleEdit(wh)}\n className={cn(\n 'px-3 py-1.5 text-sm font-semibold border rounded-none-none transition-colors',\n 'border-z-border text-z-secondary hover:text-z-primary'\n )}\n >\n Edit\n </button>\n <button\n onClick={() => handleDelete(wh.id)}\n className={cn(\n 'p-2 border rounded-none-none transition-colors',\n 'border-z-border text-z-secondary hover:text-status-red'\n )}\n title=\"Delete\"\n >\n <Trash2 size={12} />\n </button>\n <button\n onClick={() => toggleExpand(wh)}\n className={cn(\n 'p-2 border rounded-none-none transition-colors',\n expandedWebhook === wh.id\n ? 'border-z-border/40 text-z-secondary'\n : 'border-z-border text-z-secondary hover:text-z-primary'\n )}\n title=\"Delivery log\"\n >\n {expandedWebhook === wh.id ? (\n <ChevronUp size={12} />\n ) : (\n <ChevronDown size={12} />\n )}\n </button>\n </div>\n </div>\n <div className=\"flex items-center gap-2 flex-wrap\">\n {wh.events.map((evt) => (\n <span\n key={evt}\n className={cn(\n 'px-2 py-0.5 text-sm font-semibold border rounded-none-none',\n evt === '*'\n ? 'border-z-border/30 text-z-secondary bg-z-hover'\n : 'border-z-border text-z-secondary'\n )}\n >\n {evt}\n </span>\n ))}\n {wh.secret && (\n <span\n className={cn(\n 'px-2 py-0.5 text-sm font-semibold border rounded-none-none',\n 'border-z-border text-z-secondary'\n )}\n >\n Signed\n </span>\n )}\n </div>\n </div>\n\n {/* Delivery Log Panel */}\n {expandedWebhook === wh.id && (\n <div\n className={cn(\n 'border border-t-0 rounded-none-none p-4',\n 'bg-z-input border-z-border'\n )}\n >\n <div className=\"flex items-center justify-between mb-4\">\n <div className=\"flex items-center gap-2\">\n <Clock size={12} className=\"text-z-secondary\" />\n <span className=\"text-sm font-semibold text-z-secondary\">Delivery Log</span>\n </div>\n <button\n onClick={() => fetchDeliveries(wh.id, wh.url)}\n disabled={loadingDeliveries === wh.id}\n className={cn(\n 'flex items-center gap-1.5 px-3 py-1.5 text-sm font-semibold border rounded-none-none transition-colors',\n 'border-z-border text-z-secondary hover:text-z-primary'\n )}\n >\n {loadingDeliveries === wh.id ? (\n <Loader2 size={9} className=\"animate-spin\" />\n ) : (\n <RotateCcw size={9} />\n )}\n Refresh\n </button>\n </div>\n\n {loadingDeliveries === wh.id ? (\n <div className=\"flex items-center justify-center py-8\">\n <Loader2 size={16} className=\"text-z-secondary animate-spin\" />\n </div>\n ) : !deliveries[wh.url] || deliveries[wh.url].length === 0 ? (\n <div className=\"py-2\">\n <EmptyState\n icon={Clock}\n title=\"No deliveries yet\"\n message=\"Send a test event or wait for a content event to trigger this webhook\"\n />\n </div>\n ) : (\n <div className=\"space-y-2 max-h-80 overflow-y-auto\">\n {/* Header */}\n <div\n className={cn(\n 'grid grid-cols-[1fr_1fr_80px_80px_100px_40px] gap-2 px-3 py-2 text-sm font-semibold border-b',\n 'text-z-secondary border-z-border'\n )}\n >\n <span>Event</span>\n <span>Collection</span>\n <span>Status</span>\n <span>Code</span>\n <span>Time</span>\n <span className=\"text-center\">Action</span>\n </div>\n {deliveries[wh.url].map((d) => (\n <div\n key={d.id}\n className={cn(\n 'grid grid-cols-[1fr_1fr_80px_80px_100px_40px] gap-2 px-3 py-2.5 text-sm font-mono border rounded-none-none transition-colors items-center',\n d.success\n ? 'bg-z-hover border-z-border'\n : 'bg-z-active-bg border-z-active-border'\n )}\n >\n <span className=\"font-bold truncate\">{d.event}</span>\n <span className={cn('truncate', 'text-z-secondary')}>\n {d.collectionSlug || '—'}\n </span>\n <span className=\"flex items-center gap-1\">\n {d.success ? (\n <CheckCircle2 size={9} className=\"text-z-secondary \" />\n ) : (\n <XCircle size={9} className=\"text-red-500\" />\n )}\n <span className={d.success ? 'text-z-secondary ' : 'text-red-500'}>\n {d.success ? 'OK' : 'Failed'}\n </span>\n </span>\n <span\n className={cn(\n 'font-bold',\n d.responseStatus && d.responseStatus >= 200 && d.responseStatus < 300\n ? 'text-z-secondary '\n : d.responseStatus && d.responseStatus >= 400\n ? 'text-red-500'\n : 'text-z-secondary'\n )}\n >\n {d.responseStatus || '—'}\n </span>\n <span className={cn('text-z-secondary')}>\n {formatTimestamp(d.timestamp)}\n </span>\n <div className=\"flex justify-center\">\n <button\n onClick={() => handleReplay(wh.id, d.id, wh.url)}\n disabled={replayingId === d.id}\n className={cn(\n 'p-1.5 border rounded-none-none transition-colors',\n 'border-z-border text-z-secondary hover:text-z-primary hover:border-z-border-strong'\n )}\n title=\"Replay Delivery\"\n >\n {replayingId === d.id ? (\n <Loader2 size={10} className=\"animate-spin\" />\n ) : (\n <RotateCcw size={10} />\n )}\n </button>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n )\n}\n\nexport default SettingsWebhooks\n","import { AnimatePresence, motion } from 'framer-motion'\nimport {\n AlertTriangle,\n CheckCircle2,\n Download,\n ExternalLink,\n Loader2,\n Package,\n Plus,\n Puzzle,\n Search,\n Settings,\n ToggleLeft,\n ToggleRight,\n Trash2,\n XCircle,\n} from 'lucide-react'\nimport React, { useEffect, useRef, useState } from 'react'\nimport toast from 'react-hot-toast'\nimport api from '../../lib/api'\nimport { cn } from '../../lib/utils'\nimport { confirm } from '../../store/confirmStore'\n\ninterface PluginDoc {\n id: string\n name: string\n version: string\n description: string\n author: string\n homepage: string\n packageName: string\n configSchema: Record<\n string,\n {\n type: string\n label: string\n description?: string\n default?: any\n options?: Array<{ label: string; value: string }>\n required?: boolean\n }\n >\n config: any\n enabled: boolean\n installedAt: string\n updatedAt: string\n}\n\ninterface SettingsPluginsProps {\n theme: 'light' | 'dark'\n}\n\nconst SettingsPlugins: React.FC<SettingsPluginsProps> = ({ theme }) => {\n const [plugins, setPlugins] = useState<PluginDoc[]>([])\n const [loading, setLoading] = useState(true)\n const [fetchError, setFetchError] = useState<string | null>(null)\n const [searchQuery, setSearchQuery] = useState('')\n const [expandedId, setExpandedId] = useState<string | null>(null)\n const [saving, setSaving] = useState<string | null>(null)\n const [showInstallForm, setShowInstallForm] = useState(false)\n const [installForm, setInstallForm] = useState({\n id: '',\n name: '',\n version: '1.0.0',\n description: '',\n author: '',\n homepage: '',\n packageName: '',\n })\n const isMountedRef = useRef(true)\n useEffect(() => {\n isMountedRef.current = true\n return () => {\n isMountedRef.current = false\n }\n }, [])\n\n const fetchPlugins = async () => {\n if (!isMountedRef.current) return\n setLoading(true)\n setFetchError(null)\n try {\n const res = await api.get('/system/plugins')\n if (isMountedRef.current) setPlugins(res.data.data || [])\n } catch (err: any) {\n const msg = err?.response?.data?.error || err?.message || 'Failed to load plugins'\n if (isMountedRef.current) setFetchError(msg)\n } finally {\n if (isMountedRef.current) setLoading(false)\n }\n }\n\n React.useEffect(() => {\n fetchPlugins()\n }, [])\n\n const handleToggle = async (plugin: PluginDoc) => {\n setSaving(plugin.id)\n try {\n await api.put(`/system/plugins/${plugin.id}`, { enabled: !plugin.enabled })\n setPlugins((prev) =>\n prev.map((p) => (p.id === plugin.id ? { ...p, enabled: !p.enabled } : p))\n )\n toast.success(plugin.enabled ? 'Plugin disabled' : 'Plugin enabled')\n } catch {\n toast.error('Failed to toggle plugin')\n } finally {\n setSaving(null)\n }\n }\n\n const handleDelete = async (id: string) => {\n if (!(await confirm({ message: 'Uninstall this plugin? Its functionality will be removed.' })))\n return\n setSaving(id)\n try {\n await api.delete(`/system/plugins/${id}`)\n setPlugins((prev) => prev.filter((p) => p.id !== id))\n toast.success('Plugin uninstalled')\n } catch {\n toast.error('Failed to uninstall plugin')\n } finally {\n setSaving(null)\n }\n }\n\n const handleConfigChange = (pluginId: string, key: string, value: any) => {\n setPlugins((prev) =>\n prev.map((p) => {\n if (p.id !== pluginId) return p\n return { ...p, config: { ...p.config, [key]: value } }\n })\n )\n }\n\n const handleSaveConfig = async (plugin: PluginDoc) => {\n setSaving(plugin.id)\n try {\n await api.put(`/system/plugins/${plugin.id}`, { config: plugin.config })\n toast.success('Plugin settings saved')\n } catch {\n toast.error('Failed to save plugin settings')\n } finally {\n setSaving(null)\n }\n }\n\n const handleInstall = async () => {\n if (!installForm.id.trim()) {\n toast.error('Plugin ID is required')\n return\n }\n if (!installForm.name.trim()) {\n toast.error('Plugin name is required')\n return\n }\n setSaving('install')\n try {\n await api.post('/system/plugins', installForm)\n toast.success(`Plugin \"${installForm.name}\" installed`)\n setShowInstallForm(false)\n setInstallForm({\n id: '',\n name: '',\n version: '1.0.0',\n description: '',\n author: '',\n homepage: '',\n packageName: '',\n })\n fetchPlugins()\n } catch (err: any) {\n toast.error(err.response?.data?.message || 'Failed to install plugin')\n } finally {\n setSaving(null)\n }\n }\n\n const filteredPlugins = plugins.filter(\n (p) =>\n p.name.toLowerCase().includes(searchQuery.toLowerCase()) ||\n p.id.toLowerCase().includes(searchQuery.toLowerCase()) ||\n p.description.toLowerCase().includes(searchQuery.toLowerCase())\n )\n\n const enabledCount = plugins.filter((p) => p.enabled).length\n\n return (\n <div className=\"col-span-full space-y-6\">\n {/* Header */}\n <div className=\"flex items-center justify-between border-b border-z-border pb-4\">\n <div className=\"flex flex-col\">\n <h3 className=\"text-sm font-semibold flex items-center gap-3\">\n <Puzzle size={16} className=\"text-z-secondary\" />\n Plugin Registry\n </h3>\n <span className=\"text-sm text-z-secondary font-bold mt-1\">\n {plugins.length} installed · {enabledCount} active · Community extensibility framework\n </span>\n </div>\n <button\n type=\"button\"\n onClick={() => setShowInstallForm(!showInstallForm)}\n className=\"flex items-center gap-2 px-4 py-2 border border-z-active-border hover:border-z-accent hover:bg-z-active-bg text-sm font-semibold transition-all text-z-accent dark:text-z-active-text hover:text-z-primary\"\n >\n <Plus size={12} />\n Install Plugin\n </button>\n </div>\n\n {/* Install form */}\n <AnimatePresence>\n {showInstallForm && (\n <motion.div\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: 'auto' }}\n exit={{ opacity: 0, height: 0 }}\n className={cn(\n 'border rounded-none overflow-hidden shadow-sm',\n 'bg-z-panel backdrop-blur-md border-z-border'\n )}\n >\n <div className=\"p-6 space-y-4\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-semibold text-z-secondary\">Register New Plugin</span>\n <button\n onClick={() => setShowInstallForm(false)}\n className=\"text-z-secondary hover:text-z-primary text-sm font-semibold\"\n >\n Cancel\n </button>\n </div>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-semibold text-z-secondary\">Plugin ID *</label>\n <input\n type=\"text\"\n value={installForm.id}\n onChange={(e) => setInstallForm((prev) => ({ ...prev, id: e.target.value }))}\n placeholder=\"acme-analytics\"\n className={cn(\n 'w-full border rounded-none py-2.5 px-3 text-sm font-mono transition-all outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black',\n 'bg-z-panel border-z-border text-z-primary focus:border-z-active-border'\n )}\n />\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-semibold text-z-secondary\">Display Name *</label>\n <input\n type=\"text\"\n value={installForm.name}\n onChange={(e) => setInstallForm((prev) => ({ ...prev, name: e.target.value }))}\n placeholder=\"ACME Analytics\"\n className={cn(\n 'w-full border rounded-none py-2.5 px-3 text-sm transition-all outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black',\n 'bg-z-panel border-z-border text-z-primary focus:border-z-active-border'\n )}\n />\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-semibold text-z-secondary\">Version</label>\n <input\n type=\"text\"\n value={installForm.version}\n onChange={(e) =>\n setInstallForm((prev) => ({ ...prev, version: e.target.value }))\n }\n placeholder=\"1.0.0\"\n className={cn(\n 'w-full border rounded-none py-2.5 px-3 text-sm font-mono transition-all outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black',\n 'bg-z-panel border-z-border text-z-primary focus:border-z-active-border'\n )}\n />\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-semibold text-z-secondary\">Author</label>\n <input\n type=\"text\"\n value={installForm.author}\n onChange={(e) =>\n setInstallForm((prev) => ({ ...prev, author: e.target.value }))\n }\n placeholder=\"ACME Corp\"\n className={cn(\n 'w-full border rounded-none py-2.5 px-3 text-sm transition-all outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black',\n 'bg-z-panel border-z-border text-z-primary focus:border-z-active-border'\n )}\n />\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-semibold text-z-secondary\">Homepage URL</label>\n <input\n type=\"url\"\n value={installForm.homepage}\n onChange={(e) =>\n setInstallForm((prev) => ({ ...prev, homepage: e.target.value }))\n }\n placeholder=\"https://example.com/plugin\"\n className={cn(\n 'w-full border rounded-none py-2.5 px-3 text-sm font-mono transition-all outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black',\n 'bg-z-panel border-z-border text-z-primary focus:border-z-active-border'\n )}\n />\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-semibold text-z-secondary\">NPM Package</label>\n <input\n type=\"text\"\n value={installForm.packageName}\n onChange={(e) =>\n setInstallForm((prev) => ({ ...prev, packageName: e.target.value }))\n }\n placeholder=\"zenith-plugin-acme-analytics\"\n className={cn(\n 'w-full border rounded-none py-2.5 px-3 text-sm font-mono transition-all outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black',\n 'bg-z-panel border-z-border text-z-primary focus:border-z-active-border'\n )}\n />\n </div>\n </div>\n\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-semibold text-z-secondary\">Description</label>\n <textarea\n value={installForm.description}\n onChange={(e) =>\n setInstallForm((prev) => ({ ...prev, description: e.target.value }))\n }\n placeholder=\"What does this plugin do?\"\n rows={2}\n className={cn(\n 'w-full border rounded-none py-2.5 px-3 text-sm transition-all outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black resize-none',\n theme === 'dark'\n ? 'bg-app border-z-border text-z-primary focus:border-z-accent'\n : 'bg-z-panel border-z-border focus:border-z-accent'\n )}\n />\n </div>\n\n <div className=\"flex justify-end\">\n <button\n onClick={handleInstall}\n disabled={saving === 'install'}\n className={cn(\n 'flex items-center gap-2 px-6 py-3 text-z-primary text-sm font-semibold transition-all disabled:opacity-40',\n 'bg-z-accent hover:brightness-110 shadow-sm text-z-logo-text'\n )}\n >\n {saving === 'install' ? (\n <Loader2 size={12} className=\"animate-spin\" />\n ) : (\n <Download size={12} />\n )}\n Install Plugin\n </button>\n </div>\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n\n {/* Search */}\n <div className=\"relative\">\n <Search size={14} className=\"absolute left-4 top-1/2 -translate-y-1/2 text-z-secondary\" />\n <input\n type=\"text\"\n placeholder=\"Search plugins...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className={cn(\n 'w-full border rounded-none py-3 pl-11 pr-4 text-sm font-bold transition-all outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black',\n theme === 'dark'\n ? 'bg-z-panel border-z-border text-z-primary focus:border-z-accent'\n : 'bg-z-panel border-z-border focus:border-z-accent'\n )}\n />\n </div>\n\n {/* Plugin list */}\n {loading ? (\n <div className=\"flex items-center justify-center py-12\">\n <Loader2 size={24} className=\"text-z-secondary animate-spin\" />\n </div>\n ) : fetchError ? (\n <div\n className={cn(\n 'p-12 border border-dashed rounded-none text-center space-y-4',\n 'border-z-border'\n )}\n >\n <XCircle size={36} className=\"mx-auto text-red-400\" />\n <p className=\"text-sm font-semibold text-z-primary\">Could not load plugins</p>\n <p className=\"text-xs text-z-secondary max-w-xs mx-auto\">{fetchError}</p>\n <button\n onClick={fetchPlugins}\n className=\"inline-flex items-center gap-2 px-4 py-2 border border-z-border hover:border-z-active-border hover:bg-z-hover text-sm font-semibold text-z-secondary hover:text-z-primary transition-all\"\n >\n <AlertTriangle size={12} /> Retry\n </button>\n </div>\n ) : filteredPlugins.length === 0 ? (\n <div\n className={cn(\n 'p-12 border border-dashed rounded-none text-center space-y-4',\n 'border-z-border'\n )}\n >\n <Package size={40} className=\"mx-auto text-z-secondary\" />\n <p className=\"text-sm font-semibold text-z-secondary\">\n {plugins.length === 0 ? 'No plugins installed' : 'No plugins match your search'}\n </p>\n <p className=\"text-sm text-z-secondary\">\n {plugins.length === 0\n ? 'Install plugins to extend Zenith CMS functionality'\n : 'Try a different search term'}\n </p>\n </div>\n ) : (\n <div className=\"space-y-3\">\n {filteredPlugins.map((plugin) => {\n const isExpanded = expandedId === plugin.id\n const hasConfig = plugin.configSchema && Object.keys(plugin.configSchema).length > 0\n return (\n <motion.div\n key={plugin.id}\n layout\n className={cn(\n 'border rounded-none overflow-hidden transition-all shadow-sm',\n plugin.enabled\n ? 'bg-z-panel backdrop-blur-md border-z-border shadow-sm'\n : 'bg-z-input border-z-border opacity-60'\n )}\n >\n {/* Plugin header */}\n <div className=\"px-5 py-4 flex items-center justify-between\">\n <div className=\"flex items-center gap-4\">\n <div\n className={cn(\n 'w-10 h-10 rounded-none border flex items-center justify-center',\n plugin.enabled\n ? 'bg-z-panel/5 border-z-border text-z-secondary'\n : theme === 'dark'\n ? 'bg-z-hover border-z-border text-z-secondary'\n : 'bg-[var(--z-bg-hover)] border-z-border text-z-muted'\n )}\n >\n <Puzzle size={18} />\n </div>\n <div className=\"flex flex-col\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-semibold text-z-primary\">{plugin.name}</span>\n <span className=\"text-sm font-semibold text-z-secondary font-mono\">\n v{plugin.version}\n </span>\n {plugin.enabled ? (\n <CheckCircle2 size={12} className=\"text-z-secondary \" />\n ) : (\n <XCircle size={12} className=\"text-z-secondary\" />\n )}\n </div>\n <div className=\"flex items-center gap-2 mt-0.5\">\n <span className=\"text-sm font-bold text-z-secondary font-mono\">\n {plugin.id}\n </span>\n {plugin.author && (\n <>\n <span className=\"text-z-primary\">·</span>\n <span className=\"text-sm font-bold text-z-secondary\">\n {plugin.author}\n </span>\n </>\n )}\n </div>\n {plugin.description && (\n <p className=\"text-sm text-z-muted mt-1 max-w-lg\">{plugin.description}</p>\n )}\n </div>\n </div>\n\n <div className=\"flex items-center gap-2\">\n {plugin.homepage && (\n <a\n href={plugin.homepage}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\n 'p-2 border rounded-none transition-colors',\n 'border-z-border text-z-secondary hover:text-z-primary'\n )}\n title=\"Plugin homepage\"\n >\n <ExternalLink size={12} />\n </a>\n )}\n <button\n onClick={() => handleToggle(plugin)}\n disabled={saving === plugin.id}\n className={cn(\n 'p-2 border rounded-none transition-colors',\n plugin.enabled\n ? 'border-amber-500/20 text-amber-500 hover:text-amber-400'\n : 'border-z-border text-z-secondary hover:text-z-primary'\n )}\n title={plugin.enabled ? 'Disable' : 'Enable'}\n >\n {saving === plugin.id ? (\n <Loader2 size={14} className=\"animate-spin\" />\n ) : plugin.enabled ? (\n <ToggleRight size={18} />\n ) : (\n <ToggleLeft size={18} />\n )}\n </button>\n {hasConfig && (\n <button\n onClick={() => setExpandedId(isExpanded ? null : plugin.id)}\n className={cn(\n 'p-2 border rounded-none transition-colors',\n isExpanded\n ? 'border-z-border/30 text-z-secondary'\n : theme === 'dark'\n ? 'border-z-border text-z-secondary hover:text-z-primary'\n : 'border-z-border text-z-muted hover:text-z-secondary'\n )}\n title=\"Configure\"\n >\n <Settings size={14} />\n </button>\n )}\n <button\n onClick={() => handleDelete(plugin.id)}\n disabled={saving === plugin.id}\n className={cn(\n 'p-2 border rounded-none transition-colors',\n 'border-z-border text-z-secondary hover:text-status-red'\n )}\n title=\"Uninstall\"\n >\n <Trash2 size={14} />\n </button>\n </div>\n </div>\n\n {/* Config panel */}\n <AnimatePresence>\n {isExpanded && hasConfig && (\n <motion.div\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: 'auto' }}\n exit={{ opacity: 0, height: 0 }}\n className={cn(\n 'border-t px-5 py-4 space-y-4',\n theme === 'dark'\n ? 'border-z-border bg-app/20'\n : 'border-z-border shadow-sm bg-[var(--z-bg-input)]/50'\n )}\n >\n <span className=\"text-sm font-semibold text-z-muted\">Plugin Settings</span>\n {Object.entries(plugin.configSchema).map(([key, schema]) => (\n <div key={key} className=\"space-y-1.5\">\n <label className=\"text-sm font-semibold text-z-secondary\">\n {schema.label}\n {schema.required && <span className=\"text-red-400 ml-1\">*</span>}\n </label>\n {schema.description && (\n <p className=\"text-sm text-z-secondary\">{schema.description}</p>\n )}\n {schema.type === 'boolean' ? (\n <button\n onClick={() =>\n handleConfigChange(plugin.id, key, !plugin.config?.[key])\n }\n className={cn(\n 'flex items-center gap-2 px-3 py-2 border rounded-none transition-colors',\n plugin.config?.[key]\n ? 'border-z-border/30 bg-z-panel text-z-secondary'\n : 'border-z-border text-z-secondary'\n )}\n >\n {plugin.config?.[key] ? (\n <ToggleRight size={16} />\n ) : (\n <ToggleLeft size={16} />\n )}\n <span className=\"text-sm font-semibold\">\n {plugin.config?.[key] ? 'Enabled' : 'Disabled'}\n </span>\n </button>\n ) : schema.type === 'select' ? (\n <select\n value={plugin.config?.[key] || schema.default || ''}\n onChange={(e) => handleConfigChange(plugin.id, key, e.target.value)}\n className={cn(\n 'w-full border rounded-none py-2.5 px-3 text-sm font-bold transition-all outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black',\n 'bg-z-panel border-z-border text-z-primary focus:border-z-active-border'\n )}\n >\n {schema.options?.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n ) : schema.type === 'secret' ? (\n <input\n type=\"password\"\n value={plugin.config?.[key] || ''}\n onChange={(e) => handleConfigChange(plugin.id, key, e.target.value)}\n placeholder=\"••••••••\"\n className={cn(\n 'w-full border rounded-none py-2.5 px-3 text-sm font-mono transition-all outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black',\n 'bg-z-panel border-z-border text-z-primary focus:border-z-active-border'\n )}\n />\n ) : (\n <input\n type={\n schema.type === 'url'\n ? 'url'\n : schema.type === 'number'\n ? 'number'\n : 'text'\n }\n value={plugin.config?.[key] || schema.default || ''}\n onChange={(e) => handleConfigChange(plugin.id, key, e.target.value)}\n className={cn(\n 'w-full border rounded-none py-2.5 px-3 text-sm transition-all outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black',\n 'bg-z-panel border-z-border text-z-primary focus:border-z-active-border'\n )}\n />\n )}\n </div>\n ))}\n <div className=\"flex justify-end pt-2\">\n <button\n onClick={() => handleSaveConfig(plugin)}\n disabled={saving === plugin.id}\n className={cn(\n 'flex items-center gap-2 px-5 py-2.5 text-z-primary text-sm font-semibold transition-all disabled:opacity-40',\n 'bg-z-accent hover:brightness-110 shadow-sm text-z-logo-text'\n )}\n >\n {saving === plugin.id ? (\n <Loader2 size={10} className=\"animate-spin\" />\n ) : null}\n Save Settings\n </button>\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </motion.div>\n )\n })}\n </div>\n )}\n\n {/* Info footer */}\n <div\n className={cn(\n 'p-5 border rounded-none-none space-y-3',\n theme === 'dark'\n ? 'bg-z-hover border-z-border/10'\n : 'bg-[var(--z-bg-input)] border-z-border'\n )}\n >\n <div className=\"flex items-center gap-3\">\n <AlertTriangle size={14} className=\"text-amber-400\" />\n <span className=\"text-sm font-semibold text-amber-400\">Developer Note</span>\n </div>\n <ul className=\"space-y-1.5 text-sm text-z-muted font-bold leading-relaxed\">\n <li>• Plugins are registered in the database and managed via this UI</li>\n <li>• Plugin code must be loaded at engine startup via cms.config.ts</li>\n <li>\n • Community plugins should be published as{' '}\n <code className=\"text-z-secondary font-mono\">zenith-plugin-*</code> on npm\n </li>\n <li>\n • Use <code className=\"text-z-secondary font-mono\">configSchema</code> to expose\n settings that admins can configure here\n </li>\n <li>• Disabled plugins are not applied but remain installed for easy re-enabling</li>\n </ul>\n </div>\n </div>\n )\n}\n\nexport default SettingsPlugins\n","import React from 'react'\nimport { Key, CheckCircle2, Copy } from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport toast from 'react-hot-toast'\nimport { motion } from 'framer-motion'\n\n\ninterface SettingsApiKeyModalProps {\n newKey: any\n setNewKey: any\n theme: 'light' | 'dark'\n}\n\nconst SettingsApiKeyModal: React.FC<SettingsApiKeyModalProps> = ({ newKey, setNewKey, theme }) => {\n return (\n <div className=\"fixed inset-0 z-[100] flex items-center justify-center p-4 bg-[var(--z-bg-modal)] backdrop-blur-sm\">\n <motion.div\n {...({\n initial: { scale: 0.9, opacity: 0 },\n animate: { scale: 1, opacity: 1 },\n exit: { scale: 0.9, opacity: 0 }\n } as any)}\n className={cn(\n 'w-full max-w-md rounded-none-none p-6 border shadow-2xl relative overflow-hidden',\n theme === 'dark' ? 'bg-[#0a0a0a] border-z-border' : 'bg-z-panel border-z-border shadow-sm'\n )}\n >\n <div className=\"absolute top-0 right-0 p-6 text-z-secondary/10 pointer-events-none\">\n <Key size={120} strokeWidth={0.5} />\n </div>\n\n <div className=\"flex items-center gap-4 mb-8\">\n <div className=\"w-12 h-12 rounded-none-none bg-z-panel flex items-center justify-center text-z-secondary border border-z-border/20\">\n <CheckCircle2 size={24} />\n </div>\n <div>\n <h3 className=\"text-lg font-semibold leading-none\">Key Generated</h3>\n <p className=\"text-sm font-bold text-z-secondary mt-2\">\n Vault Node: {newKey.name}\n </p>\n </div>\n </div>\n\n <div className=\"space-y-4 mb-8\">\n <p className=\"text-sm font-semibold text-amber-500 leading-relaxed\">\n CRITICAL: Copy this key now. It will never be displayed again for security integrity.\n </p>\n <div\n className={cn(\n 'p-4 rounded-none-none border flex items-center justify-between gap-4 font-mono text-sm font-bold break-all transition-colors',\n theme === 'dark' ? 'bg-z-hover border-z-border' : 'bg-z-input border-z-border shadow-sm'\n )}\n >\n {newKey.key}\n <button\n onClick={() => {\n navigator.clipboard.writeText(newKey.key)\n toast.success('KEY_COPIED_TO_CLIPBOARD')\n }}\n className=\"p-2.5 rounded-none-none bg-z-border text-z-primary shrink-0 shadow-lg shadow-sm/20 hover:scale-105 active:scale-95 transition-all\"\n >\n <Copy size={14} />\n </button>\n </div>\n </div>\n\n <div className=\"space-y-2 mb-8\">\n <p className=\"text-sm font-bold text-z-muted\">\n Frontend .env Integration:\n </p>\n <div className={cn('p-4 rounded-none-none border font-mono text-sm whitespace-pre transition-colors text-z-secondary', theme === 'dark' ? 'bg-[#0a0a0a] border-z-border' : 'bg-z-accent border-z-border')}>\n{`VITE_CMS_URL=${typeof window !== 'undefined' ? window.location.origin : 'http://localhost:3000'}/api/v1\nVITE_CMS_API_KEY=${newKey.key}\nVITE_CMS_SITE_ID=your_tenant_id`}\n </div>\n </div>\n\n <button\n onClick={() => setNewKey(null)}\n className=\"w-full py-4 rounded-none-none bg-z-panel text-z-primary font-semibold text-sm hover:bg-[var(--z-border)] transition-all\"\n >\n I've copied the key\n </button>\n </motion.div>\n </div>\n )\n}\n\nexport default SettingsApiKeyModal\n","import React, { useState, useEffect, useCallback, useRef } from 'react'\nimport {\n Activity, CheckCircle2, XCircle, Clock, RefreshCw, Loader2,\n ChevronDown, ChevronUp, RotateCcw, Filter, Search, Download,\n AlertTriangle, Zap, Globe, ArrowRight\n} from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport api from '../../lib/api'\nimport toast from 'react-hot-toast'\n\ninterface WebhookDelivery {\n id: string\n webhookId?: string\n event: string\n url: string\n success: boolean\n responseStatus?: number\n responseBody?: string\n requestBody?: string\n requestHeaders?: Record<string, string>\n timestamp: string\n durationMs?: number\n retryCount?: number\n}\n\ninterface SettingsWebhookLogsProps {\n theme?: 'light' | 'dark'\n}\n\nconst STATUS_COLORS: Record<string, string> = {\n '2': 'text-z-active-text bg-z-active-bg border-z-accent/20',\n '3': 'text-z-active-text bg-z-accent/10 border-z-accent/20',\n '4': 'text-amber-400 bg-amber-500/10 border-amber-500/20',\n '5': 'text-red-400 bg-red-500/10 border-red-500/20',\n}\n\nfunction getStatusClass(status?: number): string {\n if (!status) return 'text-z-muted bg-z-hover border-z-border'\n const key = String(Math.floor(status / 100))\n return STATUS_COLORS[key] || 'text-z-muted bg-z-hover border-z-border'\n}\n\nexport default function SettingsWebhookLogs({ theme = 'dark' }: SettingsWebhookLogsProps) {\n const dark = theme === 'dark'\n\n const [logs, setLogs] = useState<WebhookDelivery[]>([])\n const [loading, setLoading] = useState(true)\n const [reloading, setReloading] = useState(false)\n const isMountedRef = useRef(true)\n useEffect(() => {\n return () => {\n isMountedRef.current = false\n }\n }, [])\n const [expandedId, setExpandedId] = useState<string | null>(null)\n const [replayingId, setReplayingId] = useState<string | null>(null)\n const [filter, setFilter] = useState<'all' | 'success' | 'failed'>('all')\n const [search, setSearch] = useState('')\n const [page, setPage] = useState(1)\n const [totalCount, setTotalCount] = useState(0)\n const PAGE_SIZE = 20\n\n const fetchLogs = useCallback(async (silent = false) => {\n if (!silent) setLoading(true)\n else setReloading(true)\n try {\n const params: Record<string, string | number> = { page, limit: PAGE_SIZE }\n if (filter !== 'all') params.status = filter\n if (search.trim()) params.search = search.trim()\n\n const res = await api.get('/system/webhooks/deliveries', { params })\n const data = res.data?.data\n if (Array.isArray(data)) {\n setLogs(data)\n setTotalCount(res.data?.meta?.total || data.length)\n } else if (data?.items) {\n setLogs(data.items)\n setTotalCount(data.total || data.items.length)\n } else {\n // Fallback: build mock data from audit logs\n const auditRes = await api.get('/system/audit-logs', { params: { limit: PAGE_SIZE, page } }).catch(() => null)\n if (auditRes?.data?.data) {\n const auditLogs: WebhookDelivery[] = (auditRes.data.data || []).map((l: any) => ({\n id: l._id || l.id,\n event: l.action || l.event || 'unknown',\n url: l.endpoint || '—',\n success: l.status !== 'error',\n responseStatus: l.statusCode || (l.status === 'error' ? 500 : 200),\n timestamp: l.createdAt || l.timestamp,\n durationMs: l.durationMs,\n }))\n setLogs(auditLogs)\n setTotalCount(auditRes.data?.meta?.total || auditLogs.length)\n }\n }\n } catch {\n // Silent fail — empty state will display\n } finally {\n setLoading(false)\n setReloading(false)\n }\n }, [page, filter, search])\n\n useEffect(() => { fetchLogs() }, [fetchLogs])\n\n const handleReplay = async (log: WebhookDelivery) => {\n if (!log.webhookId) return toast.error('No webhook ID for replay')\n setReplayingId(log.id)\n try {\n await api.post(`/system/webhooks/${log.webhookId}/replay`, { deliveryId: log.id })\n toast.success('Webhook replayed')\n fetchLogs(true)\n } catch (err: any) {\n toast.error(err?.response?.data?.error || 'Replay failed')\n } finally {\n setReplayingId(null)\n }\n }\n\n const handleExport = () => {\n const csv = [\n 'timestamp,event,url,status,duration_ms',\n ...logs.map(l =>\n `\"${l.timestamp}\",\"${l.event}\",\"${l.url}\",${l.success ? 'success' : 'failed'},${l.durationMs || ''}`\n )\n ].join('\\n')\n const blob = new Blob([csv], { type: 'text/csv' })\n const a = document.createElement('a')\n a.href = URL.createObjectURL(blob)\n a.download = `webhook-logs-${new Date().toISOString().split('T')[0]}.csv`\n a.click()\n toast.success('Exported')\n }\n\n const filtered = logs.filter(l => {\n const matchSearch = !search || l.event.includes(search) || l.url.includes(search)\n const matchFilter =\n filter === 'all' || (filter === 'success' && l.success) || (filter === 'failed' && !l.success)\n return matchSearch && matchFilter\n })\n\n const totalPages = Math.max(1, Math.ceil(totalCount / PAGE_SIZE))\n\n const card = cn(\n 'border rounded-none transition-all',\n dark\n ? 'bg-z-panel backdrop-blur-md border-z-border shadow-sm'\n : 'bg-z-panel border-z-border shadow-sm'\n )\n\n const inp = cn(\n 'border rounded-none py-2 px-3 text-sm font-mono outline-none transition-all focus:ring-1 focus:ring-z-active-border focus:border-z-accent',\n 'bg-z-input border-z-border text-z-primary placeholder:text-z-muted'\n )\n\n // Summary stats\n const successCount = logs.filter(l => l.success).length\n const failedCount = logs.filter(l => !l.success).length\n const avgDuration = logs.reduce((s, l) => s + (l.durationMs || 0), 0) / (logs.length || 1)\n\n return (\n <div className=\"space-y-6\">\n {/* Stats Row */}\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-3\">\n {[\n { label: 'Total Events', value: totalCount, icon: Activity, color: 'text-z-active-text' },\n { label: 'Successful', value: successCount, icon: CheckCircle2, color: 'text-z-active-text' },\n { label: 'Failed', value: failedCount, icon: XCircle, color: 'text-red-400' },\n { label: 'Avg Latency', value: `${Math.round(avgDuration)}ms`, icon: Clock, color: 'text-amber-400' },\n ].map(({ label, value, icon: Icon, color }) => (\n <div key={label} className={cn(card, 'p-4 flex items-center gap-3')}>\n <div className={cn('w-9 h-9 flex items-center justify-center border', dark ? 'bg-z-hover border-z-border' : 'bg-z-input border-z-border')}>\n <Icon size={16} className={color} />\n </div>\n <div>\n <div className={cn('text-lg font-semibold', 'text-z-primary')}>{value}</div>\n <div className=\"text-sm font-semibold text-z-secondary\">{label}</div>\n </div>\n </div>\n ))}\n </div>\n\n {/* Toolbar */}\n <div className={cn(card, 'p-4 flex flex-wrap items-center gap-3')}>\n <div className=\"relative flex-1 min-w-[180px]\">\n <Search size={12} className=\"absolute left-3 top-1/2 -translate-y-1/2 text-z-secondary\" />\n <input\n value={search}\n onChange={e => setSearch(e.target.value)}\n placeholder=\"Filter by event or URL...\"\n className={cn(inp, 'pl-8 w-full')}\n />\n </div>\n <div className=\"flex items-center gap-1\">\n {(['all', 'success', 'failed'] as const).map(f => (\n <button\n key={f}\n onClick={() => { setFilter(f); setPage(1) }}\n className={cn(\n 'px-3 py-1.5 text-sm font-semibold border transition-all',\n filter === f\n ? dark ? 'bg-z-accent/20 border-z-active-border text-z-active-text' : 'bg-z-active-bg border-z-active-border text-z-accent'\n : dark ? 'bg-z-hover border-z-border text-z-secondary hover:text-z-secondary' : 'bg-z-input border-z-border text-z-secondary'\n )}\n >\n {f}\n </button>\n ))}\n </div>\n <div className=\"flex items-center gap-2 ml-auto\">\n <button\n onClick={() => fetchLogs(true)}\n disabled={reloading}\n className={cn('p-2 border transition-all', dark ? 'border-z-border text-z-muted hover:text-z-primary hover:border-z-border' : 'border-z-border text-z-secondary hover:text-z-primary')}\n >\n <RefreshCw size={13} className={reloading ? 'animate-spin' : ''} />\n </button>\n <button\n onClick={handleExport}\n className={cn('flex items-center gap-1.5 px-3 py-2 text-sm font-semibold border transition-all', dark ? 'border-z-border text-z-muted hover:text-z-primary hover:border-z-border' : 'border-z-border text-z-secondary hover:text-z-primary')}\n >\n <Download size={11} />\n Export CSV\n </button>\n </div>\n </div>\n\n {/* Log Table */}\n <div className={cn(card, 'overflow-hidden')}>\n {/* Header */}\n <div className={cn('grid grid-cols-12 px-4 py-2 text-sm font-semibold text-z-secondary border-b', 'border-z-border')}>\n <div className=\"col-span-1\">Status</div>\n <div className=\"col-span-3\">Event</div>\n <div className=\"col-span-4\">Endpoint URL</div>\n <div className=\"col-span-2\">Time</div>\n <div className=\"col-span-1\">Latency</div>\n <div className=\"col-span-1\">Actions</div>\n </div>\n\n {loading ? (\n <div className=\"flex items-center justify-center py-16\">\n <Loader2 size={28} className=\"text-z-active-text animate-spin\" />\n </div>\n ) : filtered.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center py-16 gap-4\">\n <div className={cn('w-16 h-16 flex items-center justify-center border', dark ? 'bg-z-hover border-z-border text-z-secondary' : 'bg-z-input border-z-border text-z-muted')}>\n <Activity size={28} />\n </div>\n <div className=\"text-center\">\n <p className={cn('text-sm font-semibold ', dark ? 'text-z-muted' : 'text-z-secondary')}>No Event Logs</p>\n <p className=\"text-sm text-z-secondary mt-1\">Webhook deliveries will appear here</p>\n </div>\n </div>\n ) : (\n <div className=\"divide-y\" style={{ borderColor: 'var(--z-border)' }}>\n {filtered.map(log => {\n const isExpanded = expandedId === log.id\n return (\n <div key={log.id}>\n <div\n className={cn(\n 'grid grid-cols-12 px-4 py-3 items-center cursor-pointer group transition-colors',\n dark ? 'hover:bg-z-panel' : 'hover:bg-[var(--z-bg-input)]'\n )}\n onClick={() => setExpandedId(isExpanded ? null : log.id)}\n >\n {/* Status */}\n <div className=\"col-span-1 flex items-center\">\n {log.success\n ? <CheckCircle2 size={14} className=\"text-z-active-text\" />\n : <XCircle size={14} className=\"text-red-400\" />\n }\n </div>\n {/* Event */}\n <div className=\"col-span-3\">\n <span className={cn('text-sm font-semibold ', dark ? 'text-z-primary' : 'text-z-primary')}>\n {log.event}\n </span>\n {log.responseStatus && (\n <span className={cn('ml-2 text-sm font-semibold px-1.5 py-0.5 border', getStatusClass(log.responseStatus))}>\n {log.responseStatus}\n </span>\n )}\n </div>\n {/* URL */}\n <div className=\"col-span-4\">\n <span className={cn('text-sm font-mono truncate block', 'text-z-secondary')}>\n {log.url || '—'}\n </span>\n </div>\n {/* Time */}\n <div className=\"col-span-2\">\n <span className=\"text-sm text-z-secondary\">\n {log.timestamp ? new Date(log.timestamp).toLocaleString() : '—'}\n </span>\n </div>\n {/* Latency */}\n <div className=\"col-span-1\">\n <span className={cn('text-sm font-mono', log.durationMs && log.durationMs > 1000 ? 'text-amber-400' : 'text-z-secondary')}>\n {log.durationMs ? `${log.durationMs}ms` : '—'}\n </span>\n </div>\n {/* Actions */}\n <div className=\"col-span-1 flex items-center gap-1 opacity-0 group-hover:opacity-100 transition-opacity\">\n {!log.success && log.webhookId && (\n <button\n onClick={e => { e.stopPropagation(); handleReplay(log) }}\n disabled={replayingId === log.id}\n className=\"p-1.5 text-z-secondary hover:text-z-active-text transition-colors\"\n title=\"Replay\"\n >\n {replayingId === log.id ? <Loader2 size={12} className=\"animate-spin\" /> : <RotateCcw size={12} />}\n </button>\n )}\n {isExpanded ? <ChevronUp size={12} className=\"text-z-secondary\" /> : <ChevronDown size={12} className=\"text-z-secondary\" />}\n </div>\n </div>\n\n {/* Expanded Detail */}\n {isExpanded && (\n <div className={cn('px-4 pb-4 pt-2 space-y-3 border-t', dark ? 'border-z-border bg-z-panel' : 'border-z-border bg-[var(--z-bg-input)]')}>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-3\">\n {log.requestBody && (\n <div className=\"space-y-1.5\">\n <p className=\"text-sm font-semibold text-z-secondary\">Request Payload</p>\n <pre className={cn('text-sm font-mono p-3 border overflow-auto max-h-32 rounded-none', dark ? 'bg-app/60 border-z-border text-z-secondary' : 'bg-z-panel border-z-border text-z-primary')}>\n {(() => { try { return JSON.stringify(JSON.parse(log.requestBody), null, 2) } catch { return log.requestBody } })()}\n </pre>\n </div>\n )}\n {log.responseBody && (\n <div className=\"space-y-1.5\">\n <p className=\"text-sm font-semibold text-z-secondary\">Response Body</p>\n <pre className={cn('text-sm font-mono p-3 border overflow-auto max-h-32 rounded-none', dark ? 'bg-app/60 border-z-border text-z-secondary' : 'bg-z-panel border-z-border text-z-primary')}>\n {(() => { try { return JSON.stringify(JSON.parse(log.responseBody), null, 2) } catch { return log.responseBody } })()}\n </pre>\n </div>\n )}\n {!log.requestBody && !log.responseBody && (\n <p className=\"text-sm text-z-secondary italic\">No payload data available for this entry</p>\n )}\n </div>\n {log.retryCount !== undefined && log.retryCount > 0 && (\n <div className=\"flex items-center gap-2\">\n <AlertTriangle size={11} className=\"text-amber-400\" />\n <span className=\"text-sm text-amber-400 font-semibold\">\n {log.retryCount} Retry {log.retryCount === 1 ? 'Attempt' : 'Attempts'}\n </span>\n </div>\n )}\n </div>\n )}\n </div>\n )\n })}\n </div>\n )}\n </div>\n\n {/* Pagination */}\n {totalPages > 1 && (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-z-secondary\">\n Page {page} of {totalPages} · {totalCount} events\n </span>\n <div className=\"flex items-center gap-1\">\n <button\n onClick={() => setPage(p => Math.max(1, p - 1))}\n disabled={page === 1}\n className={cn('px-3 py-1.5 text-sm font-semibold border transition-all disabled:opacity-30', dark ? 'border-z-border text-z-muted hover:text-z-primary' : 'border-z-border text-z-secondary')}\n >\n Prev\n </button>\n <button\n onClick={() => setPage(p => Math.min(totalPages, p + 1))}\n disabled={page === totalPages}\n className={cn('px-3 py-1.5 text-sm font-semibold border transition-all disabled:opacity-30', dark ? 'border-z-border text-z-muted hover:text-z-primary' : 'border-z-border text-z-secondary')}\n >\n Next\n </button>\n </div>\n </div>\n )}\n </div>\n )\n}\n","import React, { useState, useEffect, useCallback } from 'react'\nimport {\n ShieldAlert, Cookie, FileText, Scale, Globe, Mail,\n Database, Download, Trash2, Eye, EyeOff, Loader2,\n CheckCircle2, AlertTriangle, ExternalLink, Clock, Calendar,\n Lock, Shield, Info, ChevronDown, ChevronUp\n} from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport api from '../../lib/api'\nimport toast from 'react-hot-toast'\n\ninterface ComplianceSettings {\n // GDPR / Privacy\n gdprEnabled: boolean\n ccpaEnabled: boolean\n cookieConsentEnabled: boolean\n cookieConsentCategories: string[]\n cookieExpiryDays: number\n // Policy URLs\n privacyPolicyUrl: string\n termsOfServiceUrl: string\n cookiePolicyUrl: string\n // Data Management\n dataRetentionDays: number\n autoDeleteExpiredData: boolean\n // Contact\n dpoEmail: string\n dpoName: string\n companyName: string\n companyAddress: string\n // Compliance Badges\n soc2Compliant: boolean\n iso27001Compliant: boolean\n hipaaCompliant: boolean\n}\n\nconst DEFAULTS: ComplianceSettings = {\n gdprEnabled: false,\n ccpaEnabled: false,\n cookieConsentEnabled: false,\n cookieConsentCategories: ['necessary', 'analytics', 'marketing'],\n cookieExpiryDays: 365,\n privacyPolicyUrl: '',\n termsOfServiceUrl: '',\n cookiePolicyUrl: '',\n dataRetentionDays: 365,\n autoDeleteExpiredData: false,\n dpoEmail: '',\n dpoName: '',\n companyName: '',\n companyAddress: '',\n soc2Compliant: false,\n iso27001Compliant: false,\n hipaaCompliant: false,\n}\n\nconst COOKIE_CATEGORIES = [\n { id: 'necessary', label: 'Necessary', desc: 'Required for the site to function. Cannot be disabled.', forced: true },\n { id: 'analytics', label: 'Analytics', desc: 'Help understand how visitors interact (Google Analytics, Plausible).' },\n { id: 'marketing', label: 'Marketing', desc: 'Used for advertising and retargeting (Facebook Pixel, Google Ads).' },\n { id: 'personalization', label: 'Personalization', desc: 'Remember user preferences and personalize the experience.' },\n { id: 'functional', label: 'Functional', desc: 'Enable additional features like live chat, videos, social media.' },\n]\n\ninterface SettingsLegalProps {\n theme?: 'light' | 'dark'\n}\n\nexport default function SettingsLegal({ theme = 'dark' }: SettingsLegalProps) {\n const dark = theme === 'dark'\n const [settings, setSettings] = useState<ComplianceSettings>(DEFAULTS)\n const [loading, setLoading] = useState(true)\n const [saving, setSaving] = useState(false)\n const [requestLoading, setRequestLoading] = useState(false)\n const [dataRequests, setDataRequests] = useState<any[]>([])\n const [expanded, setExpanded] = useState<string>('gdpr')\n\n const fetchSettings = useCallback(async () => {\n setLoading(true)\n try {\n const res = await api.get('/system/settings/compliance')\n if (res.data?.data) {\n setSettings(prev => ({ ...prev, ...res.data.data }))\n }\n } catch {\n // Use defaults — backend may not have compliance endpoint yet\n } finally {\n setLoading(false)\n }\n }, [])\n\n useEffect(() => { fetchSettings() }, [fetchSettings])\n\n const handleSave = async () => {\n setSaving(true)\n try {\n await api.patch('/system/settings/compliance', settings)\n toast.success('Compliance settings saved')\n } catch (err: any) {\n // Also try saving via main settings endpoint\n try {\n await api.patch('/system/settings', { compliance: settings })\n toast.success('Compliance settings saved')\n } catch {\n toast.error('Failed to save compliance settings')\n }\n } finally {\n setSaving(false)\n }\n }\n\n const card = cn(\n 'border rounded-none transition-all',\n dark\n ? 'bg-z-panel backdrop-blur-md border-z-border shadow-sm'\n : 'bg-z-panel border-z-border shadow-sm'\n )\n\n const inp = cn(\n 'w-full border rounded-none py-2.5 px-4 text-sm font-mono outline-none transition-all focus:ring-1 focus:ring-z-active-border focus:border-z-accent',\n 'bg-z-input border-z-border text-z-primary placeholder:text-z-muted'\n )\n\n const Toggle = ({ checked, onChange }: { checked: boolean; onChange: (v: boolean) => void }) => (\n <label className=\"relative inline-flex items-center cursor-pointer flex-shrink-0\">\n <input type=\"checkbox\" checked={checked} onChange={e => onChange(e.target.checked)} className=\"sr-only peer\" />\n <div className={cn(\"w-11 h-6 rounded-none peer peer-checked:after:translate-x-full after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-[var(--z-bg-hover)] after:rounded-none after:h-5 after:w-5 after:transition-all border shadow-inner\", 'bg-[var(--z-border-strong)] peer-checked:bg-z-accent border-transparent')}></div>\n </label>\n )\n\n const Section = ({ id, icon: Icon, title, desc, children }: { id: string; icon: any; title: string; desc: string; children: React.ReactNode }) => (\n <div className={card}>\n <button\n className=\"w-full flex items-center gap-4 p-5 text-left\"\n onClick={() => setExpanded(expanded === id ? '' : id)}\n >\n <div className={cn('w-10 h-10 flex items-center justify-center border flex-shrink-0', dark ? 'bg-z-active-bg border-z-active-border text-z-active-text' : 'bg-z-active-bg border-z-active-border text-z-accent')}>\n <Icon size={18} />\n </div>\n <div className=\"flex-1 min-w-0\">\n <h3 className={cn('text-sm font-semibold ', 'text-z-primary')}>{title}</h3>\n <p className=\"text-sm text-z-secondary mt-0.5\">{desc}</p>\n </div>\n {expanded === id ? <ChevronUp size={16} className=\"text-z-secondary\" /> : <ChevronDown size={16} className=\"text-z-secondary\" />}\n </button>\n {expanded === id && (\n <div className=\"px-5 pb-5 space-y-4 border-t\" style={{ borderColor: 'var(--z-border)' }}>\n <div className=\"pt-4 space-y-4\">{children}</div>\n </div>\n )}\n </div>\n )\n\n const ToggleRow = ({\n label, desc, value, onChange, disabled = false\n }: { label: string; desc: string; value: boolean; onChange: (v: boolean) => void; disabled?: boolean }) => (\n <div className={cn('flex items-center justify-between p-4 border', 'bg-z-panel border-z-border')}>\n <div>\n <p className={cn('text-sm font-semibold ', dark ? 'text-z-primary' : 'text-z-primary')}>{label}</p>\n <p className=\"text-sm text-z-secondary mt-0.5\">{desc}</p>\n </div>\n <Toggle checked={value} onChange={disabled ? () => {} : onChange} />\n </div>\n )\n\n if (loading) return (\n <div className=\"flex items-center justify-center py-20\">\n <Loader2 size={28} className=\"text-z-active-text animate-spin\" />\n </div>\n )\n\n return (\n <div className=\"space-y-4\">\n {/* Compliance Badges */}\n <div className=\"grid grid-cols-2 md:grid-cols-3 gap-3\">\n {[\n { key: 'gdprEnabled', label: 'GDPR', color: 'violet', icon: Shield },\n { key: 'ccpaEnabled', label: 'CCPA', color: 'blue', icon: Shield },\n { key: 'soc2Compliant', label: 'SOC 2', color: 'emerald', icon: CheckCircle2 },\n { key: 'iso27001Compliant', label: 'ISO 27001', color: 'amber', icon: Lock },\n { key: 'hipaaCompliant', label: 'HIPAA', color: 'pink', icon: Database },\n { key: 'cookieConsentEnabled', label: 'Cookie Consent', color: 'teal', icon: Cookie },\n ].map(({ key, label, color, icon: Icon }) => {\n const enabled = !!(settings as any)[key]\n return (\n <button\n key={key}\n onClick={() => setSettings(prev => ({ ...prev, [key]: !enabled }))}\n className={cn(\n 'flex items-center gap-3 p-4 border text-left transition-all',\n enabled\n ? dark ? `bg-${color}-500/10 border-${color}-500/30 shadow-sm` : `bg-${color}-50 border-${color}-200`\n : 'bg-z-panel border-z-border hover:border-z-active-border'\n )}\n >\n <Icon size={16} className={enabled ? `text-${color}-400` : 'text-z-secondary'} />\n <div>\n <p className={cn('text-sm font-semibold ', enabled ? dark ? `text-${color}-300` : `text-${color}-700` : dark ? 'text-z-muted' : 'text-z-secondary')}>{label}</p>\n <p className=\"text-sm text-z-secondary\">{enabled ? 'Enabled' : 'Disabled'}</p>\n </div>\n </button>\n )\n })}\n </div>\n\n {/* GDPR & Privacy */}\n <Section id=\"gdpr\" icon={ShieldAlert} title=\"GDPR & Privacy Compliance\" desc=\"EU/UK General Data Protection Regulation configuration\">\n <ToggleRow\n label=\"GDPR Mode\"\n desc=\"Enables GDPR-compliant data handling across all system modules\"\n value={settings.gdprEnabled}\n onChange={v => setSettings(prev => ({ ...prev, gdprEnabled: v }))}\n />\n <ToggleRow\n label=\"CCPA Compliance\"\n desc=\"California Consumer Privacy Act — enables opt-out of data sale\"\n value={settings.ccpaEnabled}\n onChange={v => setSettings(prev => ({ ...prev, ccpaEnabled: v }))}\n />\n <ToggleRow\n label=\"Auto-Delete Expired Data\"\n desc=\"Automatically purge user data beyond the retention period\"\n value={settings.autoDeleteExpiredData}\n onChange={v => setSettings(prev => ({ ...prev, autoDeleteExpiredData: v }))}\n />\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-semibold text-z-secondary\">Data Retention Period (days)</label>\n <input\n type=\"number\"\n value={settings.dataRetentionDays}\n onChange={e => setSettings(prev => ({ ...prev, dataRetentionDays: parseInt(e.target.value) || 365 }))}\n className={inp}\n placeholder=\"365\"\n />\n <p className=\"text-sm text-z-secondary\">User content and logs older than this will be eligible for deletion. Default: 365 days.</p>\n </div>\n </Section>\n\n {/* Cookie Consent */}\n <Section id=\"cookies\" icon={Cookie} title=\"Cookie Consent & Tracking\" desc=\"Banner configuration and cookie category management\">\n <ToggleRow\n label=\"Show Cookie Consent Banner\"\n desc=\"Display an EU-compliant consent banner to all visitors on first visit\"\n value={settings.cookieConsentEnabled}\n onChange={v => setSettings(prev => ({ ...prev, cookieConsentEnabled: v }))}\n />\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-semibold text-z-secondary\">Cookie Categories</label>\n <div className=\"space-y-2\">\n {COOKIE_CATEGORIES.map(cat => {\n const isEnabled = settings.cookieConsentCategories.includes(cat.id)\n return (\n <div key={cat.id} className={cn('flex items-start gap-3 p-3 border', 'border-z-border bg-z-hover')}>\n <input\n type=\"checkbox\"\n checked={isEnabled || cat.forced}\n disabled={cat.forced}\n onChange={e => {\n const cats = e.target.checked\n ? [...settings.cookieConsentCategories, cat.id]\n : settings.cookieConsentCategories.filter(c => c !== cat.id)\n setSettings(prev => ({ ...prev, cookieConsentCategories: cats }))\n }}\n className=\"mt-0.5 accent-z-accent\"\n />\n <div>\n <p className={cn('text-sm font-semibold ', dark ? 'text-z-primary' : 'text-z-primary')}>\n {cat.label} {cat.forced && <span className=\"text-z-secondary\">(Required)</span>}\n </p>\n <p className=\"text-sm text-z-secondary mt-0.5\">{cat.desc}</p>\n </div>\n </div>\n )\n })}\n </div>\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-semibold text-z-secondary\">Cookie Expiry (days)</label>\n <input\n type=\"number\"\n value={settings.cookieExpiryDays}\n onChange={e => setSettings(prev => ({ ...prev, cookieExpiryDays: parseInt(e.target.value) || 365 }))}\n className={inp}\n placeholder=\"365\"\n />\n </div>\n </Section>\n\n {/* Legal Documents */}\n <Section id=\"docs\" icon={FileText} title=\"Legal Document URLs\" desc=\"Privacy policy, terms of service, and cookie policy links\">\n {[\n { key: 'privacyPolicyUrl', label: 'Privacy Policy URL', placeholder: 'https://yoursite.com/privacy' },\n { key: 'termsOfServiceUrl', label: 'Terms of Service URL', placeholder: 'https://yoursite.com/terms' },\n { key: 'cookiePolicyUrl', label: 'Cookie Policy URL', placeholder: 'https://yoursite.com/cookies' },\n ].map(({ key, label, placeholder }) => (\n <div key={key} className=\"space-y-1.5\">\n <div className=\"flex items-center justify-between\">\n <label className=\"text-sm font-semibold text-z-secondary\">{label}</label>\n {(settings as any)[key] && (\n <a href={(settings as any)[key]} target=\"_blank\" rel=\"noopener noreferrer\"\n className=\"flex items-center gap-1 text-sm text-z-active-text hover:text-z-active-text\">\n Preview <ExternalLink size={9} />\n </a>\n )}\n </div>\n <input\n type=\"url\"\n value={(settings as any)[key] || ''}\n onChange={e => setSettings(prev => ({ ...prev, [key]: e.target.value }))}\n placeholder={placeholder}\n className={inp}\n />\n </div>\n ))}\n </Section>\n\n {/* DPO Contact */}\n <Section id=\"dpo\" icon={Mail} title=\"Data Protection Officer (DPO)\" desc=\"Required for GDPR compliance — DPO contact details\">\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-3\">\n {[\n { key: 'dpoName', label: 'DPO Full Name', placeholder: 'Jane Doe' },\n { key: 'dpoEmail', label: 'DPO Email Address', placeholder: 'dpo@company.com' },\n { key: 'companyName', label: 'Legal Entity Name', placeholder: 'Acme Corp Ltd.' },\n ].map(({ key, label, placeholder }) => (\n <div key={key} className=\"space-y-1.5\">\n <label className=\"text-sm font-semibold text-z-secondary\">{label}</label>\n <input\n type={key === 'dpoEmail' ? 'email' : 'text'}\n value={(settings as any)[key] || ''}\n onChange={e => setSettings(prev => ({ ...prev, [key]: e.target.value }))}\n placeholder={placeholder}\n className={inp}\n />\n </div>\n ))}\n <div className=\"space-y-1.5 md:col-span-2\">\n <label className=\"text-sm font-semibold text-z-secondary\">Registered Business Address</label>\n <textarea\n value={settings.companyAddress || ''}\n onChange={e => setSettings(prev => ({ ...prev, companyAddress: e.target.value }))}\n rows={2}\n placeholder=\"123 Business St, City, Country\"\n className={cn(inp, 'resize-none')}\n />\n </div>\n </div>\n </Section>\n\n {/* Certification Toggles */}\n <Section id=\"certs\" icon={Scale} title=\"Compliance Certifications\" desc=\"Declare certification status for your enterprise compliance posture\">\n <div className={cn('p-4 border flex items-start gap-3', dark ? 'bg-z-accent/5 border-z-accent/20' : 'bg-z-active-bg border-z-active-border')}>\n <Info size={14} className=\"text-z-active-text mt-0.5 flex-shrink-0\" />\n <p className=\"text-sm text-z-active-text leading-relaxed\">\n These flags are informational declarations only — enabling them does not automatically enforce the certification. Ensure your infrastructure and processes meet the actual certification requirements.\n </p>\n </div>\n <ToggleRow\n label=\"SOC 2 Type II\"\n desc=\"Declare SOC 2 certification for security, availability, and confidentiality\"\n value={settings.soc2Compliant}\n onChange={v => setSettings(prev => ({ ...prev, soc2Compliant: v }))}\n />\n <ToggleRow\n label=\"ISO 27001\"\n desc=\"Information security management system standard compliance\"\n value={settings.iso27001Compliant}\n onChange={v => setSettings(prev => ({ ...prev, iso27001Compliant: v }))}\n />\n <ToggleRow\n label=\"HIPAA\"\n desc=\"Health Insurance Portability and Accountability Act — healthcare data handling\"\n value={settings.hipaaCompliant}\n onChange={v => setSettings(prev => ({ ...prev, hipaaCompliant: v }))}\n />\n </Section>\n\n {/* Data Subject Rights */}\n <Section id=\"rights\" icon={Database} title=\"Data Subject Rights\" desc=\"Handle GDPR data export and deletion requests\">\n <div className={cn('p-4 border flex items-start gap-3', dark ? 'bg-amber-500/5 border-amber-500/20' : 'bg-amber-50 border-amber-200')}>\n <AlertTriangle size={14} className=\"text-amber-400 mt-0.5 flex-shrink-0\" />\n <p className=\"text-sm text-amber-400 leading-relaxed\">\n GDPR Articles 15-17 require you to fulfill data access, portability, and deletion requests within 30 days.\n </p>\n </div>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-3\">\n <button\n onClick={async () => {\n setRequestLoading(true)\n try {\n const res = await api.post('/system/settings/gdpr/export-all')\n toast.success(res.data?.message || 'Export initiated — check your email')\n } catch {\n toast.error('Export request failed')\n } finally {\n setRequestLoading(false)\n }\n }}\n className={cn('flex items-center justify-center gap-2 p-4 border text-sm font-semibold transition-all', dark ? 'bg-z-hover border-z-border text-z-secondary hover:border-z-active-border hover:text-z-active-text' : 'bg-z-input border-z-border text-z-primary hover:bg-z-active-bg hover:text-z-accent')}\n >\n {requestLoading ? <Loader2 size={13} className=\"animate-spin\" /> : <Download size={13} />}\n Export All User Data\n </button>\n <button\n onClick={async () => {\n if (!window.confirm('This will queue deletion of all expired user data. Are you sure?')) return\n setRequestLoading(true)\n try {\n const res = await api.post('/system/settings/gdpr/purge-expired')\n toast.success(res.data?.message || 'Purge queued')\n } catch {\n toast.error('Purge request failed')\n } finally {\n setRequestLoading(false)\n }\n }}\n className={cn('flex items-center justify-center gap-2 p-4 border text-sm font-semibold transition-all', dark ? 'bg-red-500/5 border-red-500/20 text-red-400 hover:bg-red-500/10' : 'bg-red-50 border-red-200 text-red-600 hover:bg-red-100')}\n >\n {requestLoading ? <Loader2 size={13} className=\"animate-spin\" /> : <Trash2 size={13} />}\n Purge Expired Records\n </button>\n </div>\n </Section>\n\n {/* Save Button */}\n <div className=\"flex justify-end pt-2\">\n <button\n onClick={handleSave}\n disabled={saving}\n className={cn(\n 'flex items-center justify-center gap-2 px-6 py-2.5 rounded-lg text-sm font-semibold transition-all shadow-sm hover:scale-105 active:scale-95 disabled:opacity-50 disabled:hover:scale-100',\n dark ? 'bg-emerald-500 hover:bg-emerald-400 text-black' : 'bg-emerald-500 text-white hover:bg-emerald-600'\n )}\n >\n {saving ? <Loader2 size={13} className=\"animate-spin\" /> : <CheckCircle2 size={13} />}\n Save Compliance Config\n </button>\n </div>\n </div>\n )\n}\n","import React, { useState, useEffect, useCallback } from 'react'\nimport {\n Server, RefreshCw, Zap, Cpu, HardDrive, Trash2, Loader2,\n CheckCircle2, AlertTriangle, Activity, Database, Clock,\n Gauge, Terminal, Info, Archive\n} from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport api from '../../lib/api'\nimport toast from 'react-hot-toast'\nimport { confirm } from '../../store/confirmStore'\n\ninterface SettingsSystemProps {\n theme: 'light' | 'dark'\n}\n\nconst SettingsSystem: React.FC<SettingsSystemProps> = ({ theme }) => {\n const dark = theme === 'dark'\n const [runningOperation, setRunningOperation] = useState<string | null>(null)\n const [healthData, setHealthData] = useState<any>(null)\n const [healthLoading, setHealthLoading] = useState(true)\n const [logs, setLogs] = useState<string[]>([])\n const [logsLoading, setLogsLoading] = useState(false)\n const [showLogs, setShowLogs] = useState(false)\n\n // Make uptime active\n useEffect(() => {\n const timer = setInterval(() => {\n setHealthData(prev => prev && prev.uptime != null ? { ...prev, uptime: prev.uptime + 1 } : prev)\n }, 1000)\n return () => clearInterval(timer)\n }, [])\n\n const fetchHealth = useCallback(async () => {\n setHealthLoading(true)\n try {\n const res = await api.get('/system/health')\n setHealthData(res.data?.data || res.data)\n } catch {\n // Use fallback\n } finally {\n setHealthLoading(false)\n }\n }, [])\n\n useEffect(() => { fetchHealth() }, [fetchHealth])\n\n // Auto-refresh health every 30s\n useEffect(() => {\n const interval = setInterval(fetchHealth, 30000)\n return () => clearInterval(interval)\n }, [fetchHealth])\n\n const fetchLogs = async () => {\n setLogsLoading(true)\n try {\n const res = await api.get('/system/ops/logs', { params: { lines: 50 } })\n setLogs(res.data?.data || ['Log streaming not available in current environment'])\n } catch {\n setLogs(['Unable to retrieve server logs. Ensure sufficient permissions.'])\n } finally {\n setLogsLoading(false)\n }\n }\n\n const handleSystemAction = async (actionName: string, endpoint: string, requiresConfirm = true) => {\n if (requiresConfirm) {\n if (!await confirm({ message: `Execute: ${actionName}? This may cause temporary downtime.` })) return\n }\n setRunningOperation(actionName)\n try {\n const res = await api.post(endpoint)\n toast.success(res.data?.message || `${actionName} executed successfully`)\n } catch (err: any) {\n toast.error(err?.response?.data?.message || `Failed to execute ${actionName}`)\n } finally {\n setRunningOperation(null)\n }\n }\n\n const operations = [\n {\n id: 'restart-backend',\n title: 'Restart Backend Node',\n description: 'Gracefully drains active connections and restarts the core Node.js server. PM2/nodemon will catch the exit.',\n icon: Server,\n color: 'text-z-active-text',\n bg: 'bg-z-active-bg',\n border: 'border-z-active-border',\n action: () => handleSystemAction('Restart Backend', '/system/ops/restart-backend'),\n },\n {\n id: 'restart-frontend',\n title: 'Restart Admin UI',\n description: 'Sends a reload signal to the frontend service or triggers a Vercel/PM2 restart for the admin dashboard.',\n icon: Cpu,\n color: 'text-z-active-text',\n bg: 'bg-z-accent/10',\n border: 'border-z-accent/20',\n action: () => handleSystemAction('Restart Frontend', '/system/ops/restart-frontend'),\n },\n {\n id: 'clear-cache',\n title: 'Flush System Cache',\n description: 'Purges Redis / in-memory caches, compiled templates, and temporary files. Forces fresh state.',\n icon: Trash2,\n color: 'text-amber-400',\n bg: 'bg-amber-500/10',\n border: 'border-amber-500/20',\n action: () => handleSystemAction('Clear Cache', '/system/ops/clear-cache', false),\n },\n {\n id: 'rebuild-backend',\n title: 'Rebuild Core API',\n description: 'Runs the TypeScript compiler and rebuilds the backend bundle before an automatic restart.',\n icon: HardDrive,\n color: 'text-z-active-text',\n bg: 'bg-z-active-bg',\n border: 'border-z-accent/20',\n action: () => handleSystemAction('Rebuild Backend', '/system/ops/rebuild-backend'),\n },\n {\n id: 'restart-all',\n title: 'Full Infrastructure Restart',\n description: 'Executes a cold boot of all services, databases, and caches. Use only for critical recovery.',\n icon: Zap,\n color: 'text-red-400',\n bg: 'bg-red-500/10',\n border: 'border-red-500/20',\n action: () => handleSystemAction('Restart All Systems', '/system/ops/restart-all'),\n },\n {\n id: 'create-backup',\n title: 'Create Database Backup',\n description: 'Snapshots the active database to a compressed archive. Download from the Database tab.',\n icon: Archive,\n color: 'text-teal-400',\n bg: 'bg-teal-500/10',\n border: 'border-teal-500/20',\n action: () => handleSystemAction('Create Backup', '/system/backup/create', false),\n }\n ]\n\n // Health metrics\n const memUsage = healthData?.memoryUsage\n const memUsedMB = memUsage?.heapUsed ? (memUsage.heapUsed / 1024 / 1024).toFixed(0) : '—'\n const memTotalMB = memUsage?.heapTotal ? (memUsage.heapTotal / 1024 / 1024).toFixed(0) : '—'\n const uptime = healthData?.uptime\n const uptimeStr = uptime \n ? (uptime < 3600 \n ? `${Math.floor(uptime / 60)}m ${Math.floor(uptime % 60)}s` \n : `${Math.floor(uptime / 3600)}h ${Math.floor((uptime % 3600) / 60)}m ${Math.floor(uptime % 60)}s`)\n : '—'\n const dbStatus = healthData?.database || 'unknown'\n const systemStatus = healthData?.status || 'unknown'\n\n const card = cn(\n 'border rounded-none transition-all shadow-sm',\n dark ? 'bg-z-panel backdrop-blur-md border-z-border' : 'bg-z-input border-z-border shadow-sm'\n )\n\n return (\n <div className=\"space-y-6\">\n {/* Warning Banner */}\n <div className={cn('p-5 border flex items-start gap-4', dark ? 'bg-amber-500/5 border-amber-500/30' : 'bg-amber-50 border-amber-200 shadow-sm')}>\n <AlertTriangle size={20} className=\"text-amber-500 shrink-0 mt-0.5\" />\n <div>\n <h3 className={cn('text-sm font-semibold ', dark ? 'text-amber-400' : 'text-amber-700')}>System Level Operations</h3>\n <p className={cn('text-sm font-bold mt-1', dark ? 'text-z-muted' : 'text-z-secondary')}>\n These operations directly manipulate process management (PM2, Docker) and may cause temporary service interruptions. Ensure all users are offline before executing destructive operations.\n </p>\n </div>\n </div>\n\n {/* Live System Health */}\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between px-1\">\n <p className=\"text-sm font-semibold text-z-secondary\">Live System Health</p>\n <button onClick={fetchHealth} className={cn('flex items-center gap-1 text-sm font-semibold ', dark ? 'text-z-secondary hover:text-z-primary' : 'text-z-muted hover:text-z-primary')}>\n <RefreshCw size={10} className={healthLoading ? 'animate-spin' : ''} />\n Refresh\n </button>\n </div>\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-3\">\n {[\n {\n label: 'System Status',\n value: systemStatus.toUpperCase(),\n icon: Activity,\n color: systemStatus === 'ok' ? 'text-z-active-text' : 'text-red-400',\n bg: systemStatus === 'ok' ? 'bg-z-active-bg' : 'bg-red-500/10',\n border: systemStatus === 'ok' ? 'border-z-accent/20' : 'border-red-500/20',\n },\n {\n label: 'Database',\n value: dbStatus.toUpperCase(),\n icon: Database,\n color: dbStatus === 'ok' ? 'text-z-active-text' : 'text-amber-400',\n bg: dbStatus === 'ok' ? 'bg-z-active-bg' : 'bg-amber-500/10',\n border: dbStatus === 'ok' ? 'border-z-accent/20' : 'border-amber-500/20',\n },\n {\n label: 'Memory',\n value: healthLoading ? '...' : `${memUsedMB}/${memTotalMB} MB`,\n icon: HardDrive,\n color: 'text-z-active-text',\n bg: 'bg-z-accent/10',\n border: 'border-z-accent/20',\n },\n {\n label: 'Uptime',\n value: healthLoading ? '...' : uptimeStr,\n icon: Clock,\n color: 'text-z-active-text',\n bg: 'bg-z-active-bg',\n border: 'border-z-active-border',\n },\n ].map(({ label, value, icon: Icon, color, bg, border }) => (\n <div key={label} className={cn(card, 'p-4 flex items-center gap-3')}>\n <div className={cn('w-9 h-9 flex items-center justify-center border', bg, border)}>\n <Icon size={15} className={color} />\n </div>\n <div>\n <p className={cn('text-sm font-semibold', 'text-z-primary')}>{healthLoading ? '...' : value}</p>\n <p className=\"text-sm font-semibold text-z-secondary\">{label}</p>\n </div>\n </div>\n ))}\n </div>\n\n {/* Version Info */}\n {healthData && (\n <div className={cn(card, 'px-5 py-4 flex flex-wrap gap-4')}>\n {[\n { label: 'CMS Version', value: healthData.version || '—' },\n { label: 'Node.js', value: healthData.nodeVersion || '—' },\n { label: 'Environment', value: (healthData.environment || import.meta.env.MODE || 'production').toUpperCase() },\n { label: 'Platform', value: navigator.platform || '—' },\n ].map(({ label, value }) => (\n <div key={label} className=\"space-y-0.5\">\n <p className=\"text-sm font-semibold text-z-secondary\">{label}</p>\n <p className={cn('text-sm font-mono font-bold', 'text-z-secondary')}>{value}</p>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* Operations Grid */}\n <div className=\"grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-4\">\n {operations.map(op => (\n <div key={op.id} className={cn(card, 'flex flex-col justify-between p-6 group')}>\n <div className=\"space-y-4\">\n <div className={cn('w-12 h-12 flex items-center justify-center border', op.bg, op.border, op.color)}>\n <op.icon size={20} />\n </div>\n <div>\n <h4 className={cn('text-sm font-semibold ', 'text-z-primary')}>{op.title}</h4>\n <p className={cn('text-sm font-bold leading-relaxed mt-2', 'text-z-secondary')}>{op.description}</p>\n </div>\n </div>\n <div className=\"mt-6 pt-4 border-t\" style={{ borderColor: 'var(--z-border)' }}>\n <button\n onClick={op.action}\n disabled={runningOperation !== null}\n className={cn('w-full flex items-center justify-center gap-2 px-4 py-3 text-sm font-semibold transition-all disabled:opacity-40',\n dark ? 'bg-z-hover hover:bg-[var(--z-bg-hover)] text-z-primary border border-z-border hover:border-z-border' : 'bg-[var(--z-border)] hover:bg-z-input text-z-primary border border-transparent')}\n >\n {runningOperation === op.title ? (\n <><Loader2 size={12} className=\"animate-spin\" />Executing...</>\n ) : (\n <><RefreshCw size={12} />Execute</>\n )}\n </button>\n </div>\n </div>\n ))}\n </div>\n\n {/* Server Log Viewer */}\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between px-1\">\n <p className=\"text-sm font-semibold text-z-secondary\">Server Log Stream</p>\n <button\n onClick={() => { setShowLogs(!showLogs); if (!showLogs) fetchLogs() }}\n className={cn('text-sm font-semibold flex items-center gap-1', dark ? 'text-z-active-text hover:text-z-active-text' : 'text-z-accent hover:text-z-active-text')}\n >\n <Terminal size={11} />\n {showLogs ? 'Hide' : 'Show'} Logs\n </button>\n </div>\n {showLogs && (\n <div className={cn('border rounded-none overflow-hidden', dark ? 'bg-app border-z-border' : 'bg-z-accent border-z-border')}>\n <div className=\"flex items-center justify-between px-4 py-2 border-b border-z-border\">\n <span className=\"text-sm font-semibold text-green-400\">● LIVE</span>\n <button onClick={fetchLogs} disabled={logsLoading} className=\"text-sm text-z-secondary hover:text-z-primary\">\n <RefreshCw size={10} className={logsLoading ? 'animate-spin' : ''} />\n </button>\n </div>\n <div className=\"p-4 font-mono text-sm text-green-400/80 max-h-64 overflow-y-auto space-y-0.5\">\n {logsLoading ? (\n <Loader2 size={14} className=\"animate-spin text-green-400\" />\n ) : logs.length === 0 ? (\n <p className=\"text-z-secondary\">No log entries available</p>\n ) : (\n logs.map((line, i) => (\n <p key={i} className=\"leading-5\">{line}</p>\n ))\n )}\n </div>\n </div>\n )}\n </div>\n </div>\n )\n}\n\nexport default SettingsSystem\n","import { useState, useEffect, useCallback } from 'react'\nimport { useLocation } from 'react-router-dom'\nimport {\n Settings as SettingsIcon,\n Save,\n Globe,\n Shield,\n Mail,\n Database,\n Palette,\n Loader2,\n Sparkles,\n Key,\n Users,\n CreditCard,\n Webhook,\n Puzzle,\n Image,\n FileText,\n ScrollText,\n Terminal,\n} from 'lucide-react'\nimport { cn } from '../lib/utils'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport toast from 'react-hot-toast'\nimport { useTheme } from '../context/ThemeContext'\nimport api from '../lib/api'\nimport { usePermissions } from '../hooks/usePermissions'\n\nimport { PageHeader } from '../components/ui/PageHeader'\nimport { ActionPanel } from '../components/ui/ActionPanel'\nimport { Card, CardContent } from '../components/ui/Card'\n\nimport SettingsGeneral from './settings/SettingsGeneral'\nimport SettingsSecurity from './settings/SettingsSecurity'\nimport SettingsNotifications from './settings/SettingsNotifications'\nimport SettingsUsers from './settings/SettingsUsers'\nimport SettingsApiKeys from './settings/SettingsApiKeys'\nimport SettingsDatabase from './settings/SettingsDatabase'\nimport SettingsRoles from './settings/SettingsRoles'\nimport SettingsAppearance from './settings/SettingsAppearance'\nimport SettingsWebhooks from './settings/SettingsWebhooks'\nimport SettingsPlugins from './settings/SettingsPlugins'\nimport SettingsApiKeyModal from './settings/SettingsApiKeyModal'\nimport SettingsWebhookLogs from './settings/SettingsWebhookLogs'\nimport SettingsLegal from './settings/SettingsLegal'\nimport SettingsSystem from './settings/SettingsSystem'\nimport ApiExplorerPage from './ApiExplorerPage'\n\ninterface Settings {\n siteName: string\n siteDescription: string\n logoUrl: string\n faviconUrl: string\n ogImageUrl: string\n publicUrl: string\n maintenanceMode: boolean\n defaultLocale: string\n supportedLocales: string[]\n timezone: string\n dateFormat: string\n enableTelemetry: boolean\n jwtExpiresIn?: string\n passwordMinLength?: number\n allowRegistration?: boolean\n rateLimitWindow?: number\n rateLimitMax?: number\n smtpHost?: string\n smtpPort?: number\n smtpUser?: string\n smtpPass?: string\n fromEmail?: string\n customCSS?: string\n [key: string]: any\n}\ninterface DBStats {\n size?: number\n collections?: number | string\n [key: string]: any\n}\n\ninterface User {\n _id: string\n email: string\n role: string\n [key: string]: any\n}\n\ninterface ApiKey {\n _id: string\n name: string\n role: string\n expiresAt: string | number | Date\n [key: string]: any\n}\n\ninterface NewKey {\n name: string\n key: string\n [key: string]: any\n}\n\ninterface Role {\n _id: string\n roleName: string\n roleType: 'admin' | 'editor' | 'viewer' | 'custom'\n description: string\n isSystem: boolean\n permissions: Array<{ resource: string; actions: string[] }>\n}\n\nconst SettingsPage = () => {\n const { theme } = useTheme()\n const { isAdmin, isEditor } = usePermissions()\n const location = useLocation()\n const queryParams = new URLSearchParams(location.search)\n const [activeTab, setActiveTab] = useState(queryParams.get('tab') || 'general')\n const [settings, setSettings] = useState<Settings>({\n siteName: '',\n siteDescription: '',\n logoUrl: '',\n faviconUrl: '',\n ogImageUrl: '',\n publicUrl: '',\n maintenanceMode: false,\n defaultLocale: 'en',\n supportedLocales: ['en'],\n timezone: 'UTC',\n dateFormat: 'MM/DD/YYYY',\n supportEmail: '',\n mediaProvider: 'local',\n maxUploadSize: 5242880,\n jwtExpiresIn: '7d',\n passwordMinLength: 8,\n allowRegistration: false,\n rateLimitWindow: 15,\n rateLimitMax: 100,\n corsOrigins: [],\n customCSS: '',\n enableTelemetry: true,\n })\n const [loading, setLoading] = useState(true)\n const [saving, setSaving] = useState(false)\n const [testingSmtp, setTestingSmtp] = useState(false)\n const [dbStats, setDbStats] = useState<DBStats | null>(null)\n const [users, setUsers] = useState<User[]>([])\n const [apiKeys, setApiKeys] = useState<ApiKey[]>([])\n const [newKey, setNewKey] = useState<NewKey | null>(null)\n const [activeSite, setActiveSite] = useState<any>(null)\n const [activeSiteId] = useState(localStorage.getItem('activeSiteId'))\n const [healthData, setHealthData] = useState<any>(null)\n const [roles, setRoles] = useState<Role[]>([])\n const [editingRole, setEditingRole] = useState<Role | null>(null)\n const [roleFilter, setRoleFilter] = useState<'all' | 'system' | 'custom'>('all')\n const [plugins, setPlugins] = useState<any[]>([])\n\n const fetchData = useCallback(async () => {\n setLoading(true)\n try {\n const [settingsRes, dbRes, usersRes, keysRes, healthRes, rolesRes, pluginsRes] = await Promise.all([\n api.get('/system/settings'),\n api.get('/system/db/stats'),\n api.get('/system/users'),\n api.get('/system/api-keys'),\n api.get('/system/health'),\n api.get('/roles').catch(() => ({ data: { data: [] } })),\n api.get('/system/plugins').catch(() => ({ data: { data: [] } }))\n ])\n setSettings(settingsRes.data.data)\n setDbStats(dbRes.data.data)\n setUsers(usersRes.data.data)\n setApiKeys(keysRes.data.data)\n setHealthData(healthRes.data.data)\n setRoles(rolesRes.data?.data || [])\n setPlugins(pluginsRes.data?.data || [])\n\n if (activeSiteId) {\n try {\n const siteRes = await api.get(`/sites/${activeSiteId}`)\n setActiveSite(siteRes.data.data)\n } catch (e) {\n console.error('Failed to load active site details', e)\n toast.error('Failed to load site details')\n }\n }\n } catch {\n console.error('Failed to fetch system parameters')\n toast.error('Failed to fetch system parameters')\n } finally {\n setTimeout(() => setLoading(false), 300)\n }\n }, [activeSiteId])\n\n useEffect(() => {\n const timer = setTimeout(() => { fetchData() }, 0)\n return () => clearTimeout(timer)\n }, [fetchData])\n\n useEffect(() => {\n const tab = queryParams.get('tab')\n if (tab) { setTimeout(() => setActiveTab(tab), 0) }\n }, [location.search])\n\n const handleSave = async () => {\n setSaving(true)\n try {\n await api.patch('/system/settings', settings)\n if (activeSite && activeSiteId) {\n await api.patch(`/sites/${activeSiteId}`, {\n billingEnabled: activeSite.billingEnabled,\n paymentProvider: activeSite.paymentProvider,\n stripePublicKey: activeSite.stripePublicKey,\n stripeSecretKey: activeSite.stripeSecretKey,\n stripeWebhookSecret: activeSite.stripeWebhookSecret,\n paypalClientId: activeSite.paypalClientId,\n paypalClientSecret: activeSite.paypalClientSecret,\n paypalWebhookId: activeSite.paypalWebhookId,\n razorpayKeyId: activeSite.razorpayKeyId,\n razorpayKeySecret: activeSite.razorpayKeySecret,\n razorpayWebhookSecret: activeSite.razorpayWebhookSecret,\n currency: activeSite.currency,\n pricingPlans: activeSite.pricingPlans,\n })\n }\n toast.success('Settings committed successfully')\n } catch (err: any) {\n toast.error('Failed to commit settings')\n } finally {\n setSaving(false)\n }\n }\n\n const tabGroups = [\n {\n label: 'Environment Settings',\n tabs: [\n { id: 'general', label: 'General Info', icon: Globe, sub: 'Site Profile', adminOnly: true },\n { id: 'appearance', label: 'Appearance', icon: Palette, sub: 'White-Label', adminOnly: true },\n ]\n },\n {\n label: 'Access Management',\n tabs: [\n { id: 'users', label: 'Users', icon: Users, sub: 'Admin Registry', adminOnly: true },\n { id: 'roles', label: 'Roles & Permissions', icon: Shield, sub: 'Granular Access', adminOnly: true },\n { id: 'keys', label: 'API Keys', icon: Key, sub: 'Access Tokens', adminOnly: true },\n ]\n },\n {\n label: 'Core Services',\n tabs: [\n { id: 'security', label: 'Security Policies', icon: Shield, sub: 'Access Control', adminOnly: true },\n { id: 'api-explorer', label: 'API Explorer', icon: Terminal, sub: 'GraphQL & REST' },\n { id: 'database', label: 'Database', icon: Database, sub: 'Storage Stats', adminOnly: true },\n ...(plugins.some(p => p.id.includes('email') || p.id.includes('smtp') || p.name.toLowerCase().includes('email'))\n ? [{ id: 'notifications', label: 'Email Relay', icon: Mail, sub: 'Email Delivery', adminOnly: true }]\n : []),\n ...(plugins.some(p => p.id.includes('webhook') || p.name.toLowerCase().includes('webhook'))\n ? [\n { id: 'webhooks', label: 'Webhooks', icon: Webhook, sub: 'HTTP Callbacks', adminOnly: true },\n { id: 'webhook-logs', label: 'Event Logs', icon: Webhook, sub: 'Webhook History', adminOnly: true }\n ]\n : []),\n { id: 'plugins', label: 'Plugins', icon: Puzzle, sub: 'Extensions', adminOnly: true },\n { id: 'system', label: 'System Ops', icon: SettingsIcon, sub: 'Restart & Maintenance', adminOnly: true },\n ]\n },\n {\n label: 'Legal & Compliance',\n tabs: [\n { id: 'legal', label: 'Compliance', icon: FileText, sub: 'Privacy & GDPR' },\n ]\n }\n ]\n\n const activeTabDetails = tabGroups.flatMap(g => g.tabs).find(t => t.id === activeTab)\n\n const renderTab = () => {\n switch (activeTab) {\n case 'general':\n return <SettingsGeneral settings={settings} setSettings={setSettings} theme={theme} />\n case 'security':\n return <SettingsSecurity settings={settings as any} setSettings={setSettings as any} theme={theme} />\n case 'notifications':\n return <SettingsNotifications settings={settings as any} setSettings={setSettings as any} theme={theme} testingSmtp={testingSmtp} setTestingSmtp={setTestingSmtp} />\n case 'users':\n return <SettingsUsers users={users} theme={theme} fetchData={fetchData} />\n case 'keys':\n return <SettingsApiKeys apiKeys={apiKeys} theme={theme} fetchData={fetchData} setNewKey={setNewKey} />\n case 'database':\n return <SettingsDatabase dbStats={dbStats} theme={theme} />\n case 'roles':\n return <SettingsRoles roles={roles} setRoles={setRoles} editingRole={editingRole} setEditingRole={setEditingRole} roleFilter={roleFilter} setRoleFilter={setRoleFilter} healthData={healthData} users={users} theme={theme} />\n case 'appearance':\n return <SettingsAppearance settings={settings as any} setSettings={setSettings as any} theme={theme} />\n case 'api-explorer':\n return <ApiExplorerPage />\n case 'webhooks':\n return <SettingsWebhooks theme={theme} />\n case 'plugins':\n return <SettingsPlugins theme={theme} />\n case 'webhook-logs':\n return <SettingsWebhookLogs theme={theme} />\n case 'legal':\n return <SettingsLegal theme={theme} />\n case 'system':\n return <SettingsSystem theme={theme} />\n default:\n return null\n }\n }\n\n if (loading) {\n return (\n <div className=\"min-h-[80vh] flex items-center justify-center\">\n <Loader2 size={32} className=\"text-z-secondary animate-spin\" />\n </div>\n )\n }\n\n return (\n <div className=\"flex flex-col h-[calc(100vh-64px)] overflow-hidden\">\n <PageHeader \n title=\"Settings\"\n description=\"Configure environment preferences, integrations, and access control.\"\n icon={<SettingsIcon size={24} />}\n backLink={{ to: '/', label: 'Dashboard' }}\n actions={\n <button\n onClick={handleSave}\n disabled={saving}\n className={cn(\n 'flex items-center justify-center gap-2 px-6 py-2.5 rounded-lg text-sm font-semibold transition-all shadow-sm hover:scale-105 active:scale-95 disabled:opacity-50 disabled:hover:scale-100',\n theme === 'dark' ? 'bg-emerald-500 hover:bg-emerald-400 text-black' : 'bg-emerald-500 text-white hover:bg-emerald-600'\n )}\n >\n {saving ? <Loader2 size={16} className=\"animate-spin\" /> : <Save size={16} />}\n Save Changes\n </button>\n }\n />\n\n <ActionPanel\n sidebarPosition=\"left\"\n sidebarWidth=\"w-full lg:w-[320px]\"\n className=\"flex-1 min-h-0\"\n sidebar={\n <div className=\"p-6 space-y-8 h-full overflow-y-auto pb-24\">\n {tabGroups.map((group) => (\n <div key={group.label}>\n <h3 className=\"text-sm font-semibold text-z-muted mb-3 px-3\">\n {group.label}\n </h3>\n <div className=\"space-y-1\">\n {group.tabs.filter(tab => !tab.adminOnly || isAdmin).map((tab) => (\n <button\n key={tab.id}\n onClick={() => setActiveTab(tab.id)}\n className={cn(\n 'w-full flex items-center gap-3 px-3 py-2.5 rounded-none transition-all group border',\n activeTab === tab.id\n ? 'bg-z-active-bg border-z-active-border text-z-active-text shadow-sm transform scale-[1.02]'\n : 'text-z-secondary border-transparent hover:bg-z-hover hover:text-z-primary'\n )}\n >\n <div className={cn(\n \"w-8 h-8 flex items-center justify-center transition-colors shadow-sm\",\n activeTab === tab.id ? \"bg-z-accent text-z-logo-text\" : \"bg-z-hover text-z-secondary group-hover:text-z-primary\"\n )}>\n <tab.icon size={16} />\n </div>\n <div className=\"flex flex-col items-start leading-tight\">\n <span className=\"text-sm font-semibold\">{tab.label}</span>\n </div>\n </button>\n ))}\n </div>\n </div>\n ))}\n </div>\n }\n >\n <div className={cn(\"flex-1 overflow-y-auto p-6 lg:p-10 pb-32 lg:pb-32\", theme === 'dark' && 'bg-app')}>\n <div className={cn(\"min-h-[600px] border mb-16\", 'z-card p-8')}>\n <AnimatePresence mode=\"wait\">\n <motion.div\n key={activeTab}\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -10 }}\n className=\"space-y-8 relative z-10\"\n >\n <div className=\"flex items-center gap-4 border-b pb-6\" style={{ borderColor: 'var(--z-border)' }}>\n <div className=\"w-10 h-10 bg-z-active-bg flex items-center justify-center text-z-active-text\">\n {activeTabDetails?.icon && <activeTabDetails.icon size={20} />}\n </div>\n <div>\n <h2 className={cn(\"text-xl font-bold \", 'text-z-primary')}>\n {activeTabDetails?.label}\n </h2>\n <p className={cn(\"text-xs mt-1\", theme === 'dark' ? 'text-z-muted' : 'text-z-secondary')}>{activeTabDetails?.sub}</p>\n </div>\n </div>\n \n <div className=\"space-y-6 w-full\">\n {renderTab()}\n </div>\n </motion.div>\n </AnimatePresence>\n </div>\n </div>\n </ActionPanel>\n\n <AnimatePresence>\n {newKey && <SettingsApiKeyModal newKey={newKey} setNewKey={setNewKey} theme={theme} />}\n </AnimatePresence>\n </div>\n )\n}\n\nexport default SettingsPage\n"],"mappings":"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"}
|