@zenith-open/zenithcms-admin 1.0.0-beta.2 → 1.0.0-beta.32

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.
Files changed (47) hide show
  1. package/dist/assets/{ApiExplorerPage-UJpoKRI0.js → ApiExplorerPage-85UWt1EW.js} +1 -1
  2. package/dist/assets/{ApiExplorerPage-UJpoKRI0.js.map → ApiExplorerPage-85UWt1EW.js.map} +1 -1
  3. package/dist/assets/{AuditLogPage-8xYlRl1I.js → AuditLogPage-CwULx1tr.js} +1 -1
  4. package/dist/assets/{AuditLogPage-8xYlRl1I.js.map → AuditLogPage-CwULx1tr.js.map} +1 -1
  5. package/dist/assets/{BlockBuilderPage-DcOo3Vnt.js → BlockBuilderPage-XD1IjOgx.js} +1 -1
  6. package/dist/assets/{BlockBuilderPage-DcOo3Vnt.js.map → BlockBuilderPage-XD1IjOgx.js.map} +1 -1
  7. package/dist/assets/{CollectionHooksPage-Dn_ujtlp.js → CollectionHooksPage-DIaSrKDj.js} +1 -1
  8. package/dist/assets/{CollectionHooksPage-Dn_ujtlp.js.map → CollectionHooksPage-DIaSrKDj.js.map} +1 -1
  9. package/dist/assets/{CollectionsPage-BSPHf7H2.js → CollectionsPage-CL_t5JRI.js} +1 -1
  10. package/dist/assets/{CollectionsPage-BSPHf7H2.js.map → CollectionsPage-CL_t5JRI.js.map} +1 -1
  11. package/dist/assets/{ComponentBuilderPage-CT6S12LA.js → ComponentBuilderPage-C58Rr1cu.js} +1 -1
  12. package/dist/assets/{ComponentBuilderPage-CT6S12LA.js.map → ComponentBuilderPage-C58Rr1cu.js.map} +1 -1
  13. package/dist/assets/{DashboardBuilder-Cbi9Ddiu.js → DashboardBuilder-Chjyqyb7.js} +1 -1
  14. package/dist/assets/{DashboardBuilder-Cbi9Ddiu.js.map → DashboardBuilder-Chjyqyb7.js.map} +1 -1
  15. package/dist/assets/{PluginsPage-5YRpbP-N.js → PluginsPage-DAR4Fsz-.js} +1 -1
  16. package/dist/assets/{PluginsPage-5YRpbP-N.js.map → PluginsPage-DAR4Fsz-.js.map} +1 -1
  17. package/dist/assets/{RedirectsPage-D_4jAdaI.js → RedirectsPage-DfMTJsac.js} +1 -1
  18. package/dist/assets/{RedirectsPage-D_4jAdaI.js.map → RedirectsPage-DfMTJsac.js.map} +1 -1
  19. package/dist/assets/{SchemaBuilderPage-EFA5XIAa.js → SchemaBuilderPage-BYprOkEv.js} +1 -1
  20. package/dist/assets/{SchemaBuilderPage-EFA5XIAa.js.map → SchemaBuilderPage-BYprOkEv.js.map} +1 -1
  21. package/dist/assets/{SettingsPage-BRpcMw48.js → SettingsPage-B2r_uNVc.js} +1 -1
  22. package/dist/assets/{SettingsPage-BRpcMw48.js.map → SettingsPage-B2r_uNVc.js.map} +1 -1
  23. package/dist/assets/SetupWizard-CBA43yJr.js +62 -0
  24. package/dist/assets/SetupWizard-CBA43yJr.js.map +1 -0
  25. package/dist/assets/SpatialEditor-BohlovfE.js +3 -0
  26. package/dist/assets/SpatialEditor-BohlovfE.js.map +1 -0
  27. package/dist/assets/{TemplatesPage-B-nNYv3o.js → TemplatesPage-BplB2ksb.js} +1 -1
  28. package/dist/assets/{TemplatesPage-B-nNYv3o.js.map → TemplatesPage-BplB2ksb.js.map} +1 -1
  29. package/dist/assets/{TrashPage-Ccusal1w.js → TrashPage-BIhKrs5x.js} +1 -1
  30. package/dist/assets/{TrashPage-Ccusal1w.js.map → TrashPage-BIhKrs5x.js.map} +1 -1
  31. package/dist/assets/index-Umj4hIVD.css +1 -0
  32. package/dist/assets/{index-ChcKY5Xe.js → index-yE_3fruG.js} +3 -3
  33. package/dist/assets/index-yE_3fruG.js.map +1 -0
  34. package/dist/index.html +48 -6
  35. package/dist/manifest.webmanifest +1 -0
  36. package/dist/sw.js +1 -1
  37. package/dist/sw.js.map +1 -1
  38. package/dist/{workbox-9c191d2f.js → workbox-2fbc6a65.js} +3 -3
  39. package/dist/workbox-2fbc6a65.js.map +1 -0
  40. package/package.json +4 -4
  41. package/dist/assets/SetupWizard-D57HIkrs.js +0 -62
  42. package/dist/assets/SetupWizard-D57HIkrs.js.map +0 -1
  43. package/dist/assets/SpatialEditor-CPgS7Zrd.js +0 -3
  44. package/dist/assets/SpatialEditor-CPgS7Zrd.js.map +0 -1
  45. package/dist/assets/index-ChcKY5Xe.js.map +0 -1
  46. package/dist/assets/index-CxhwdV2K.css +0 -1
  47. package/dist/workbox-9c191d2f.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"SetupWizard-D57HIkrs.js","names":[],"sources":["../../src/components/ConnectSnippet.tsx","../../src/pages/SetupWizard.tsx"],"sourcesContent":["import { useState } from 'react'\nimport { Copy, Check, CheckCircle2, Loader2, Globe } from 'lucide-react'\nimport { cn } from '../lib/utils'\nimport api from '../lib/api'\n\ninterface Props {\n apiKey: string\n publicUrl: string\n theme: 'dark' | 'light'\n}\n\ntype Lang = 'javascript' | 'typescript' | 'nextjs' | 'curl'\n\nconst TABS: { id: Lang; label: string }[] = [\n { id: 'javascript', label: 'JavaScript' },\n { id: 'typescript', label: 'TypeScript' },\n { id: 'nextjs', label: 'Next.js' },\n { id: 'curl', label: 'curl' },\n]\n\nfunction buildSnippet(lang: Lang, apiKey: string, publicUrl: string): string {\n const url = publicUrl.replace(/\\/$/, '')\n switch (lang) {\n case 'javascript':\n return `// zenith.js\nconst ZENITH_URL = '${url}';\nconst ZENITH_KEY = '${apiKey}';\n\nasync function getContent(collection, query = {}) {\n const params = new URLSearchParams(query);\n const res = await fetch(\\`\\${ZENITH_URL}/api/v1/\\${collection}?\\${params}\\`, {\n headers: { 'x-api-key': ZENITH_KEY }\n });\n if (!res.ok) throw new Error('Zenith API error: ' + res.status);\n return res.json();\n}\n\n// Usage\nconst { data: posts } = await getContent('posts', { status: 'published' });`\n\n case 'typescript':\n return `// lib/zenith.ts\nconst BASE = '${url}/api/v1';\nconst KEY = process.env.ZENITH_API_KEY!; // '${apiKey}'\n\ntype ZenithResponse<T> = { data: T; meta?: { total: number; page: number } };\n\nexport const zenith = {\n get: <T = any>(collection: string, query: Record<string, string> = {}): Promise<ZenithResponse<T>> =>\n fetch(\\`\\${BASE}/\\${collection}?\\${new URLSearchParams(query)}\\`, {\n headers: { 'x-api-key': KEY, 'Content-Type': 'application/json' },\n }).then(r => { if (!r.ok) throw new Error(r.statusText); return r.json(); }),\n};\n\n// Usage\nconst { data: posts } = await zenith.get<Post[]>('posts', { status: 'published' });`\n\n case 'nextjs':\n return `// lib/zenith.ts\nexport const zenith = {\n get: (collection: string, query: Record<string, string> = {}, revalidate = 60) =>\n fetch(\\`${url}/api/v1/\\${collection}?\\${new URLSearchParams(query)}\\`, {\n headers: { 'x-api-key': process.env.ZENITH_API_KEY! },\n next: { revalidate }, // ISR — refresh every 60s\n }).then(r => r.json()),\n};\n\n// .env.local\n// ZENITH_API_KEY=${apiKey}\n\n// app/blog/page.tsx\nimport { zenith } from '@/lib/zenith';\nexport default async function BlogPage() {\n const { data: posts } = await zenith.get('posts', { status: 'published' });\n return (\n <main>\n {posts.map((p: any) => <h2 key={p._id}>{p.title}</h2>)}\n </main>\n );\n}`\n\n case 'curl':\n return `# Fetch all published posts\ncurl '${url}/api/v1/posts?status=published' \\\\\n -H 'x-api-key: ${apiKey}'\n\n# Fetch a single document by ID\ncurl '${url}/api/v1/posts/DOCUMENT_ID' \\\\\n -H 'x-api-key: ${apiKey}'\n\n# Create a document (requires editor or admin key)\ncurl -X POST '${url}/api/v1/posts' \\\\\n -H 'x-api-key: ${apiKey}' \\\\\n -H 'Content-Type: application/json' \\\\\n -d '{\"title\":\"Hello World\",\"status\":\"published\"}'`\n\n default:\n return ''\n }\n}\n\nexport default function ConnectSnippet({ apiKey, publicUrl, theme }: Props) {\n const [tab, setTab] = useState<Lang>('javascript')\n const [copied, setCopied] = useState(false)\n const [testing, setTesting] = useState(false)\n const [testResult, setTestResult] = useState<'idle' | 'ok' | 'error'>('idle')\n const isDark = theme === 'dark'\n\n const snippet = buildSnippet(tab, apiKey, publicUrl)\n\n const copySnippet = () => {\n navigator.clipboard.writeText(snippet)\n setCopied(true)\n setTimeout(() => setCopied(false), 2500)\n }\n\n const testConnection = async () => {\n setTesting(true)\n setTestResult('idle')\n try {\n await api.get('/system/health', { headers: { 'x-api-key': apiKey } })\n setTestResult('ok')\n } catch {\n setTestResult('error')\n } finally {\n setTesting(false)\n }\n }\n\n return (\n <div className=\"space-y-4\">\n {/* Tab bar */}\n <div className=\"flex gap-1 border-b border-z-border\">\n {TABS.map((t) => (\n <button\n key={t.id}\n onClick={() => setTab(t.id)}\n className={cn(\n 'px-4 py-2 text-sm font-semibold border-b-2 -mb-px transition-all',\n tab === t.id\n ? 'border-z-border text-z-secondary'\n : 'border-transparent text-z-secondary hover:text-z-secondary'\n )}\n >\n {t.label}\n </button>\n ))}\n </div>\n\n {/* Code block */}\n <div\n className={cn(\n 'relative rounded-none-none border overflow-hidden',\n isDark ? 'bg-app border-z-border' : 'bg-z-accent border-z-border'\n )}\n >\n <pre className=\"overflow-x-auto p-5 text-sm font-mono text-z-secondary leading-relaxed\">\n <code>{snippet}</code>\n </pre>\n <button\n onClick={copySnippet}\n className={cn(\n 'absolute top-3 right-3 p-2 border rounded-none-none text-sm font-semibold transition-all',\n copied\n ? 'border-z-border text-z-secondary bg-z-panel'\n : 'border-z-border text-z-muted hover:border-z-border bg-app/40'\n )}\n >\n {copied ? <Check size={13} /> : <Copy size={13} />}\n </button>\n </div>\n\n {/* Live test */}\n <div className=\"flex items-center gap-3\">\n <button\n onClick={testConnection}\n disabled={testing || !apiKey}\n className={cn(\n 'flex items-center gap-2 px-5 py-2.5 border text-sm font-semibold rounded-none-none transition-all',\n isDark\n ? 'border-z-border text-z-muted hover:border-z-border/40 hover:text-z-secondary'\n : 'border-z-border text-z-secondary hover:border-z-border-strong'\n )}\n >\n {testing ? <Loader2 size={13} className=\"animate-spin\" /> : <Globe size={13} />}\n Test Connection\n </button>\n\n {testResult === 'ok' && (\n <span className=\"flex items-center gap-2 text-sm font-semibold text-z-secondary \">\n <CheckCircle2 size={13} /> Connected successfully\n </span>\n )}\n {testResult === 'error' && (\n <div className=\"text-sm font-semibold text-red-400 space-y-1\">\n <p>Connection failed. Check that:</p>\n <ul className=\"list-disc list-inside text-z-secondary normal-case not- font-medium space-y-0.5\">\n <li>\n Your CMS is running at <code className=\"text-z-secondary\">{publicUrl}</code>\n </li>\n <li>The API key is not expired or revoked</li>\n <li>This origin is in Settings → Allowed Origins</li>\n </ul>\n </div>\n )}\n </div>\n </div>\n )\n}\n","import { useState } from 'react'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport { useNavigate } from 'react-router-dom'\nimport { toast } from 'react-hot-toast'\nimport {\n ArrowRight,\n ArrowLeft,\n CheckCircle2,\n Loader2,\n Copy,\n Globe,\n Database,\n Key,\n Zap,\n Layers,\n Check,\n X,\n Server,\n Cpu,\n Info,\n HelpCircle,\n} from 'lucide-react'\nimport api from '../lib/api'\nimport { cn } from '../lib/utils'\nimport { useTheme } from '../context/ThemeContext'\nimport ConnectSnippet from '../components/ConnectSnippet'\n\nconst TOTAL_STEPS = 8\n\nconst PROJECT_TYPES = [\n {\n id: 'blog',\n label: 'Blog / Media',\n icon: '',\n collections: ['posts', 'categories', 'authors'],\n },\n {\n id: 'ecommerce',\n label: 'E-Commerce',\n icon: '',\n collections: ['products', 'categories', 'orders'],\n },\n {\n id: 'portfolio',\n label: 'Portfolio',\n icon: '',\n collections: ['projects', 'skills', 'testimonials'],\n },\n { id: 'saas', label: 'SaaS / App', icon: '', collections: ['pages', 'team', 'faqs'] },\n { id: 'custom', label: 'Custom', icon: '️', collections: [] },\n]\n\nconst STARTER_COLLECTIONS = [\n { id: 'posts', label: 'Blog Posts', icon: '' },\n { id: 'pages', label: 'Pages', icon: '' },\n { id: 'products', label: 'Products', icon: '' },\n { id: 'categories', label: 'Categories', icon: '️' },\n { id: 'team', label: 'Team Members', icon: '' },\n { id: 'faqs', label: 'FAQs', icon: '' },\n { id: 'testimonials', label: 'Testimonials', icon: '' },\n { id: 'projects', label: 'Projects', icon: '' },\n]\n\ninterface WizardState {\n projectName: string\n projectType: string\n publicUrl: string\n selectedCollections: string[]\n keyName: string\n generatedKey: string\n keyCopied: boolean\n\n // Database\n dbDialect: 'mongodb' | 'postgres'\n dbUri: string\n dbTestStatus: 'idle' | 'testing' | 'success' | 'failed'\n dbTestMessage: string\n dbSaved: boolean\n\n // Admin Account\n adminName: string\n adminEmail: string\n adminPassword: string\n adminPasswordConfirm: string\n adminCreated: boolean\n adminError: string\n\n // AI keys\n openRouterApiKey: string\n openaiApiKey: string\n anthropicApiKey: string\n xaiApiKey: string\n}\n\nexport default function SetupWizard() {\n const { theme } = useTheme()\n const navigate = useNavigate()\n const [step, setStep] = useState(0)\n const [loading, setLoading] = useState(false)\n const [state, setState] = useState<WizardState>({\n projectName: '',\n projectType: '',\n publicUrl: '',\n selectedCollections: [],\n keyName: 'My Website',\n generatedKey: '',\n keyCopied: false,\n\n dbDialect: 'mongodb',\n dbUri: 'mongodb://localhost:27017/zenith',\n dbTestStatus: 'idle',\n dbTestMessage: '',\n dbSaved: false,\n\n adminName: '',\n adminEmail: '',\n adminPassword: '',\n adminPasswordConfirm: '',\n adminCreated: false,\n adminError: '',\n\n openRouterApiKey: '',\n openaiApiKey: '',\n anthropicApiKey: '',\n xaiApiKey: '',\n })\n\n const patch = (updates: Partial<WizardState>) => setState((s) => ({ ...s, ...updates }))\n\n // Persist step to backend\n const persistStep = async (currentStep: number, answers: Partial<WizardState>) => {\n await api.post('/system/onboarding', { currentStep, answers }).catch(() => {})\n }\n\n const next = async () => {\n await persistStep(step + 1, state)\n setStep((s) => Math.min(s + 1, TOTAL_STEPS - 1))\n }\n const back = () => setStep((s) => Math.max(s - 1, 0))\n\n const skip = async () => {\n await api.post('/system/onboarding', { skipped: true }).catch(() => {})\n navigate('/login')\n }\n\n const testDbConnection = async () => {\n patch({ dbTestStatus: 'testing', dbTestMessage: '' })\n try {\n const res = await api.post('/system/db/test-connection', {\n uri: state.dbUri,\n dialect: state.dbDialect,\n })\n if (res.data?.success) {\n patch({ dbTestStatus: 'success', dbTestMessage: 'Connection successful!' })\n toast.success('Database connection verified!')\n } else {\n throw new Error(res.data?.error?.message || 'Verification failed')\n }\n } catch (e: any) {\n const msg = e.response?.data?.error?.message || (e instanceof Error ? e.message : String(e)) || 'Database verification failed'\n patch({ dbTestStatus: 'failed', dbTestMessage: msg })\n toast.error(msg)\n }\n }\n\n const saveDbConnection = async () => {\n try {\n const res = await api.post('/system/db/save-connection', {\n uri: state.dbUri,\n dialect: state.dbDialect,\n })\n if (res.data?.success) {\n patch({ dbSaved: true })\n toast.success('Database configuration saved to .env!')\n } else {\n throw new Error(res.data?.error?.message || 'Save failed')\n }\n } catch (e: any) {\n const msg = e.response?.data?.error?.message || (e instanceof Error ? e.message : String(e)) || 'Database save failed'\n toast.error(msg)\n }\n }\n\n const handleComplete = async () => {\n setLoading(true)\n try {\n // First save onboarding answers so the complete endpoint gets all state answers (including DB and AI keys)\n await api.post('/system/onboarding', { currentStep: step, answers: state }).catch(() => {})\n\n // Attempt to create admin user via the register endpoint\n if (state.adminEmail && state.adminPassword && !state.adminCreated) {\n await api.post('/auth/register', {\n name: state.adminName || 'Super Admin',\n email: state.adminEmail,\n password: state.adminPassword,\n role: 'admin',\n }).catch(() => {})\n }\n\n const r = await api.post('/system/onboarding/complete', { keyName: state.keyName })\n patch({ generatedKey: r.data?.data?.apiKey || '' })\n await next()\n } catch {\n toast.error('Failed to generate API key. Please try again.')\n } finally {\n setLoading(false)\n }\n }\n\n const copyKey = () => {\n navigator.clipboard.writeText(state.generatedKey)\n patch({ keyCopied: true })\n toast.success('API key copied!')\n setTimeout(() => patch({ keyCopied: false }), 3000)\n }\n\n const isDark = theme === 'dark'\n const bg = isDark ? 'bg-app text-z-primary' : 'bg-[var(--z-bg-input)] text-z-primary'\n const card = isDark ? 'bg-[#0a0a0a] border-z-border' : 'bg-z-panel border-z-border shadow-sm shadow-sm'\n const input = isDark\n ? 'bg-z-hover border-z-border text-z-primary placeholder:text-z-muted focus:border-z-border'\n : 'bg-z-panel border-z-border text-z-primary placeholder:text-z-muted focus:border-z-border'\n\n const STEPS = [\n {\n title: 'Welcome to Zenith',\n subtitle: \"Let's get your CMS set up in under 2 minutes.\",\n icon: <Zap size={28} className=\"text-z-secondary\" />,\n content: (\n <div className=\"space-y-6\">\n <div className=\"space-y-3\">\n <label className=\"text-sm font-semibold text-z-muted\">\n Your Project Name\n </label>\n <input\n value={state.projectName}\n onChange={(e) => patch({ projectName: e.target.value })}\n placeholder=\"e.g. Acme Corp CMS\"\n className={cn(\n 'w-full px-4 py-3 border rounded-none-none outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black text-[13px] font-medium transition-colors',\n input\n )}\n />\n <p className=\"text-sm text-z-secondary\">This will appear in your admin panel header.</p>\n </div>\n <div className=\"space-y-3\">\n <label className=\"text-sm font-semibold text-z-muted\">\n Your Website URL\n </label>\n <input\n value={state.publicUrl}\n onChange={(e) => patch({ publicUrl: e.target.value })}\n placeholder=\"https://mywebsite.com\"\n className={cn(\n 'w-full px-4 py-3 border rounded-none-none outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black text-[13px] font-medium transition-colors',\n input\n )}\n />\n <p className=\"text-sm text-z-secondary\">\n Where your website or app is hosted. Used to configure CORS.\n </p>\n </div>\n </div>\n ),\n canNext: state.projectName.trim().length >= 2,\n },\n {\n title: 'What are you building?',\n subtitle: \"We'll pre-select relevant content types for you.\",\n icon: <Globe size={28} className=\"text-z-secondary\" />,\n content: (\n <div className=\"grid grid-cols-1 md:grid-cols-2 sm:grid-cols-3 gap-3\">\n {PROJECT_TYPES.map((pt) => (\n <button\n key={pt.id}\n onClick={() => {\n patch({ projectType: pt.id, selectedCollections: pt.collections })\n }}\n className={cn(\n 'flex flex-col items-center gap-3 p-5 border rounded-none-none transition-all text-center',\n state.projectType === pt.id\n ? 'border-z-border bg-z-panel'\n : isDark\n ? 'border-z-border hover:border-z-border'\n : 'border-z-border shadow-sm hover:border-z-border'\n )}\n >\n <span className=\"text-2xl\">{pt.icon}</span>\n <span className=\"text-sm font-semibold\">{pt.label}</span>\n </button>\n ))}\n </div>\n ),\n canNext: !!state.projectType,\n },\n {\n title: 'Choose your content types',\n subtitle: 'Select the collections you want to start with.',\n icon: <Layers size={28} className=\"text-z-secondary\" />,\n content: (\n <div className=\"space-y-3\">\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-2\">\n {STARTER_COLLECTIONS.map((col) => {\n const selected = state.selectedCollections.includes(col.id)\n return (\n <button\n key={col.id}\n onClick={() => {\n patch({\n selectedCollections: selected\n ? state.selectedCollections.filter((c) => c !== col.id)\n : [...state.selectedCollections, col.id],\n })\n }}\n className={cn(\n 'flex items-center gap-3 px-4 py-3 border rounded-none-none text-left transition-all',\n selected\n ? 'border-z-border bg-z-panel'\n : isDark\n ? 'border-z-border hover:border-z-border'\n : 'border-z-border shadow-sm hover:border-z-border'\n )}\n >\n <span>{col.icon}</span>\n <span className=\"text-sm font-semibold\">{col.label}</span>\n {selected && <Check size={12} className=\"text-z-secondary ml-auto shrink-0\" />}\n </button>\n )\n })}\n </div>\n {state.selectedCollections.length === 0 && (\n <p className=\"text-sm text-amber-500 font-semibold text-center py-2\">\n No collections selected — you can add them later from the Collections menu.\n </p>\n )}\n </div>\n ),\n canNext: true,\n },\n {\n title: 'Database Setup',\n subtitle: 'Configure your database connection and write it to .env.',\n icon: <Database size={28} className=\"text-z-secondary\" />,\n content: (\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <label className=\"text-sm font-semibold text-z-muted\">\n Database Dialect\n </label>\n <div className=\"flex gap-2\">\n {['mongodb', 'postgres'].map((dialect) => (\n <button\n key={dialect}\n type=\"button\"\n onClick={() => {\n const defaultUri =\n dialect === 'mongodb'\n ? 'mongodb://localhost:27017/zenith'\n : 'postgres://postgres:postgres@localhost:5432/zenith'\n patch({\n dbDialect: dialect as any,\n dbUri: defaultUri,\n dbTestStatus: 'idle',\n dbTestMessage: '',\n dbSaved: false,\n })\n }}\n className={cn(\n 'flex-1 py-3 border text-sm font-semibold rounded-none-none transition-all',\n state.dbDialect === dialect\n ? 'border-z-border bg-z-panel text-z-primary'\n : 'border-z-border hover:border-z-border text-z-muted'\n )}\n >\n {dialect === 'mongodb' ? 'MongoDB / Mongoose' : 'PostgreSQL / Drizzle'}\n </button>\n ))}\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-sm font-semibold text-z-muted\">\n Connection URL\n </label>\n <input\n value={state.dbUri}\n onChange={(e) => patch({ dbUri: e.target.value, dbTestStatus: 'idle', dbSaved: false })}\n placeholder={\n state.dbDialect === 'mongodb'\n ? 'mongodb://localhost:27017/zenith'\n : 'postgresql://postgres:postgres@localhost:5432/zenith'\n }\n className={cn(\n 'w-full px-4 py-3 border rounded-none-none outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black text-sm font-mono transition-colors',\n input\n )}\n />\n </div>\n\n <div className=\"flex gap-3 pt-2\">\n <button\n type=\"button\"\n onClick={testDbConnection}\n disabled={state.dbTestStatus === 'testing'}\n className=\"flex-1 py-3 border border-z-border hover:border-z-border text-sm font-semibold rounded-none-none transition-all flex items-center justify-center gap-2\"\n >\n {state.dbTestStatus === 'testing' ? (\n <Loader2 size={12} className=\"animate-spin\" />\n ) : (\n <Check size={12} />\n )}\n Test Connection\n </button>\n <button\n type=\"button\"\n onClick={saveDbConnection}\n disabled={state.dbTestStatus !== 'success' || state.dbSaved}\n className={cn(\n 'flex-1 py-3 text-sm font-semibold rounded-none-none transition-all flex items-center justify-center gap-2',\n state.dbTestStatus === 'success' && !state.dbSaved\n ? 'bg-z-accent hover:bg-z-base text-z-primary shadow-lg shadow-[var(--z-border)]'\n : 'bg-z-hover border border-z-border text-z-secondary cursor-not-allowed'\n )}\n >\n Save Configuration\n </button>\n </div>\n\n {state.dbTestStatus !== 'idle' && (\n <div\n className={cn(\n 'p-4 border rounded-none-none text-sm font-bold tracking-wide ',\n state.dbTestStatus === 'success'\n ? 'bg-z-hover border-z-border/20 text-z-secondary'\n : state.dbTestStatus === 'testing'\n ? 'bg-z-hover border-z-border/10 text-z-secondary'\n : 'bg-red-500/5 border-red-500/20 text-red-400'\n )}\n >\n {state.dbTestStatus === 'testing' && 'Testing database connectivity...'}\n {state.dbTestStatus === 'success' && ' Connection verified! Click Save to apply to .env.'}\n {state.dbTestStatus === 'failed' && ` ${state.dbTestMessage}`}\n </div>\n )}\n </div>\n ),\n canNext: true,\n },\n {\n title: 'AI Integration Engine',\n subtitle: 'Integrate state-of-the-art AI features natively into your CMS.',\n icon: <Cpu size={28} className=\"text-z-secondary\" />,\n content: (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div className=\"space-y-2\">\n <div className=\"flex justify-between items-center\">\n <label className=\"text-sm font-semibold text-z-muted\">\n OpenRouter API Key\n </label>\n <a\n href=\"https://openrouter.ai/keys\"\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"text-sm font-bold text-z-secondary hover:underline flex items-center gap-0.5\"\n >\n Get Key <HelpCircle size={8} />\n </a>\n </div>\n <input\n type=\"password\"\n value={state.openRouterApiKey}\n onChange={(e) => patch({ openRouterApiKey: e.target.value })}\n placeholder=\"sk-or-...\"\n className={cn(\n 'w-full px-3 py-2.5 border rounded-none-none outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black text-sm font-mono transition-colors',\n input\n )}\n />\n </div>\n\n <div className=\"space-y-2\">\n <div className=\"flex justify-between items-center\">\n <label className=\"text-sm font-semibold text-z-muted\">\n OpenAI API Key\n </label>\n <a\n href=\"https://platform.openai.com/api-keys\"\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"text-sm font-bold text-z-secondary hover:underline flex items-center gap-0.5\"\n >\n Get Key <HelpCircle size={8} />\n </a>\n </div>\n <input\n type=\"password\"\n value={state.openaiApiKey}\n onChange={(e) => patch({ openaiApiKey: e.target.value })}\n placeholder=\"sk-proj-...\"\n className={cn(\n 'w-full px-3 py-2.5 border rounded-none-none outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black text-sm font-mono transition-colors',\n input\n )}\n />\n </div>\n\n <div className=\"space-y-2\">\n <div className=\"flex justify-between items-center\">\n <label className=\"text-sm font-semibold text-z-muted\">\n Anthropic API Key\n </label>\n <a\n href=\"https://console.anthropic.com/settings/keys\"\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"text-sm font-bold text-z-secondary hover:underline flex items-center gap-0.5\"\n >\n Get Key <HelpCircle size={8} />\n </a>\n </div>\n <input\n type=\"password\"\n value={state.anthropicApiKey}\n onChange={(e) => patch({ anthropicApiKey: e.target.value })}\n placeholder=\"sk-ant-...\"\n className={cn(\n 'w-full px-3 py-2.5 border rounded-none-none outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black text-sm font-mono transition-colors',\n input\n )}\n />\n </div>\n\n <div className=\"space-y-2\">\n <div className=\"flex justify-between items-center\">\n <label className=\"text-sm font-semibold text-z-muted\">\n xAI (Grok) API Key\n </label>\n <a\n href=\"https://console.x.ai\"\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"text-sm font-bold text-z-secondary hover:underline flex items-center gap-0.5\"\n >\n Get Key <HelpCircle size={8} />\n </a>\n </div>\n <input\n type=\"password\"\n value={state.xaiApiKey}\n onChange={(e) => patch({ xaiApiKey: e.target.value })}\n placeholder=\"xai-...\"\n className={cn(\n 'w-full px-3 py-2.5 border rounded-none-none outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black text-sm font-mono transition-colors',\n input\n )}\n />\n </div>\n </div>\n\n <div className=\"p-3 border border-z-border/20 bg-z-border/[0.03] rounded-none-none flex items-start gap-2.5\">\n <Info size={14} className=\"text-z-secondary shrink-0 mt-0.5\" />\n <div>\n <p className=\"text-sm font-semibold text-z-secondary\">\n Free AI Keys Available\n </p>\n <p className=\"text-sm text-z-muted leading-normal mt-1\">\n Need keys? Get a key from{' '}\n <a\n href=\"https://openrouter.ai\"\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"underline hover:text-z-primary\"\n >\n OpenRouter\n </a>\n . They offer free models (like Llama 3 and Gemma 2) that can power all of Zenith's features\n completely free of charge.\n </p>\n </div>\n </div>\n\n <div className=\"pt-2\">\n <p className=\"text-sm font-semibold text-z-secondary mb-2\">\n NATIVE AI CAPABILITIES INTEGRATED\n </p>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-3\">\n {[\n {\n title: 'Schema Architect',\n desc: 'Autogenerate rich collection structures via prompts',\n icon: '️',\n },\n {\n title: 'SEO Analyzer',\n desc: 'Real-time keyword density & readability auditing',\n icon: '',\n },\n {\n title: 'Alt-Text Generator',\n desc: 'Auto semantic accessibility description for media uploads',\n icon: '️',\n },\n {\n title: 'Metadata Optimizer',\n desc: 'Auto CTR optimized SEO title and description generator',\n icon: '',\n },\n ].map((feat, i) => (\n <div key={i} className=\"p-2.5 border border-z-border bg-z-panel rounded-none-none flex gap-2\">\n <span className=\"text-base\">{feat.icon}</span>\n <div>\n <p className=\"text-sm font-semibold leading-none\">{feat.title}</p>\n <p className=\"text-[7.5px] text-z-secondary leading-tight mt-1\">{feat.desc}</p>\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\n ),\n canNext: true,\n },\n {\n title: 'Create your Admin Account',\n subtitle: 'Set up the Super Admin credentials you will use to log into Zenith.',\n icon: <Key size={28} className=\"text-z-secondary\" />,\n content: (\n <div className=\"space-y-5\">\n {state.adminCreated ? (\n <div className={cn('flex items-center gap-3 p-4 border rounded-none', isDark ? 'bg-green-950/20 border-green-900/40 text-green-400' : 'bg-green-50 border-green-200 text-green-700')}>\n <CheckCircle2 size={18} />\n <div>\n <p className=\"text-sm font-bold\">Admin account created successfully!</p>\n <p className=\"text-xs mt-0.5 opacity-80\">{state.adminEmail}</p>\n </div>\n </div>\n ) : (\n <>\n <div className=\"space-y-2\">\n <label className=\"text-sm font-semibold text-z-muted\">Full Name</label>\n <input\n value={state.adminName}\n onChange={(e) => patch({ adminName: e.target.value })}\n placeholder=\"e.g. Jane Smith\"\n className={cn('w-full px-4 py-3 border rounded-none-none outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black text-[13px] font-medium transition-colors', input)}\n />\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-sm font-semibold text-z-muted\">Admin Email</label>\n <input\n type=\"email\"\n value={state.adminEmail}\n onChange={(e) => patch({ adminEmail: e.target.value, adminError: '' })}\n placeholder=\"admin@yourcompany.com\"\n className={cn('w-full px-4 py-3 border rounded-none-none outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black text-[13px] font-medium transition-colors', input)}\n />\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-sm font-semibold text-z-muted\">Password</label>\n <input\n type=\"password\"\n value={state.adminPassword}\n onChange={(e) => patch({ adminPassword: e.target.value, adminError: '' })}\n placeholder=\"Minimum 8 characters\"\n className={cn('w-full px-4 py-3 border rounded-none-none outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black text-[13px] font-medium transition-colors', input)}\n />\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-sm font-semibold text-z-muted\">Confirm Password</label>\n <input\n type=\"password\"\n value={state.adminPasswordConfirm}\n onChange={(e) => patch({ adminPasswordConfirm: e.target.value, adminError: '' })}\n placeholder=\"Re-enter your password\"\n className={cn('w-full px-4 py-3 border rounded-none-none outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black text-[13px] font-medium transition-colors', input)}\n />\n </div>\n {state.adminError && (\n <p className=\"text-sm text-red-500 font-medium\">{state.adminError}</p>\n )}\n <button\n disabled={loading || !state.adminEmail || !state.adminPassword || state.adminPassword !== state.adminPasswordConfirm}\n onClick={async () => {\n if (state.adminPassword !== state.adminPasswordConfirm) {\n patch({ adminError: 'Passwords do not match.' })\n return\n }\n if (state.adminPassword.length < 8) {\n patch({ adminError: 'Password must be at least 8 characters.' })\n return\n }\n setLoading(true)\n try {\n await api.post('/auth/register', {\n name: state.adminName || 'Super Admin',\n email: state.adminEmail,\n password: state.adminPassword,\n role: 'admin',\n })\n patch({ adminCreated: true, adminError: '' })\n toast.success('Admin account created!')\n } catch (e: any) {\n const msg = e.response?.data?.error?.message || 'Failed to create admin account.'\n patch({ adminError: msg })\n toast.error(msg)\n } finally {\n setLoading(false)\n }\n }}\n className=\"w-full flex items-center justify-center gap-2 px-4 py-3 bg-z-accent hover:opacity-90 text-z-primary text-sm font-semibold rounded-none transition-all disabled:opacity-40 disabled:cursor-not-allowed\"\n >\n {loading ? <Loader2 size={16} className=\"animate-spin\" /> : <CheckCircle2 size={16} />}\n Create Admin Account\n </button>\n </>\n )}\n </div>\n ),\n canNext: state.adminCreated || (!!state.adminEmail && !!state.adminPassword && state.adminPassword === state.adminPasswordConfirm && state.adminPassword.length >= 8),\n },\n {\n title: 'Generate your API key',\n subtitle: 'This key lets your website fetch content from Zenith.',\n icon: <Key size={28} className=\"text-z-secondary\" />,\n content: (\n <div className=\"space-y-5\">\n {!state.generatedKey ? (\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <label className=\"text-sm font-semibold text-z-muted\">\n Key Name\n </label>\n <input\n value={state.keyName}\n onChange={(e) => patch({ keyName: e.target.value })}\n placeholder=\"My Website\"\n className={cn(\n 'w-full px-4 py-3 border rounded-none-none outline-none focus-visible:ring-2 focus-visible:ring-z-active-border focus-visible:ring-offset-1 focus-visible:ring-offset-black text-[13px] font-medium transition-colors',\n input\n )}\n />\n <p className=\"text-sm text-z-secondary\">\n Give it a name so you can identify it later (e.g. \"Production Site\").\n </p>\n </div>\n <button\n onClick={handleComplete}\n disabled={loading}\n className=\"w-full flex items-center justify-center gap-3 py-4 bg-z-accent hover:bg-z-base text-z-primary text-sm font-semibold rounded-none-none transition-all shadow-lg shadow-[var(--z-border)]\"\n >\n {loading ? <Loader2 size={16} className=\"animate-spin\" /> : <Key size={16} />}\n {loading ? 'Generating...' : 'Generate API Key'}\n </button>\n </div>\n ) : (\n <div className=\"space-y-4\">\n <div\n className={cn(\n 'p-4 border rounded-none-none space-y-3',\n isDark\n ? 'bg-z-hover border-z-border/20'\n : 'bg-[var(--z-bg-input)] border-z-border'\n )}\n >\n <p className=\"text-sm font-semibold text-z-secondary \">\n Key generated — copy it now. It will not be shown again.\n </p>\n <div\n className={cn(\n 'flex items-center gap-3 p-3 border rounded-none-none font-mono text-sm break-all',\n isDark ? 'bg-app border-z-border' : 'bg-[var(--z-bg-hover)] border-z-border'\n )}\n >\n <span className=\"flex-1\">{state.generatedKey}</span>\n <button\n onClick={copyKey}\n className={cn(\n 'shrink-0 px-3 py-1.5 border rounded-none-none text-sm font-semibold transition-all',\n state.keyCopied\n ? 'border-z-border text-z-secondary '\n : isDark\n ? 'border-z-border hover:border-z-border'\n : 'border-z-border-strong hover:border-z-border'\n )}\n >\n {state.keyCopied ? <Check size={13} /> : <Copy size={13} />}\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n ),\n canNext: !!state.generatedKey,\n },\n {\n title: 'Connect your app',\n subtitle: 'Use these snippets to start pulling content from Zenith.',\n icon: <Server size={28} className=\"text-z-secondary\" />,\n content: (\n <ConnectSnippet\n apiKey={state.generatedKey}\n publicUrl={(import.meta.env.VITE_API_URL || '').replace(\n /\\/api\\/v1\\/?$/,\n ''\n )}\n theme={theme}\n />\n ),\n canNext: true,\n },\n ]\n\n const current = STEPS[step]\n const completedSteps = step\n\n const STEP_LABELS = [\n { label: 'Project Setup', desc: 'Name & URL' },\n { label: 'Project Type', desc: 'What you are building' },\n { label: 'Content Types', desc: 'Starter collections' },\n { label: 'Database', desc: 'Connection & adapter' },\n { label: 'AI Configuration', desc: 'Optional AI keys' },\n { label: 'Admin Account', desc: 'Super Admin credentials' },\n { label: 'API Key', desc: 'Authorize your frontend' },\n { label: 'Connect App', desc: 'Integration snippets' },\n ]\n\n return (\n <div className={cn('flex w-full min-h-screen', isDark ? 'bg-[#080808] text-z-primary' : 'bg-gray-50 text-z-primary')}>\n\n {/* ── LEFT SIDEBAR ── */}\n <aside className={cn(\n 'hidden lg:flex flex-col w-72 shrink-0 border-r h-screen sticky top-0',\n isDark ? 'bg-[#0a0a0a] border-z-border' : 'bg-white border-gray-200'\n )}>\n {/* Brand */}\n <div className={cn('px-8 py-8 border-b', isDark ? 'border-z-border' : 'border-gray-100')}>\n <div className=\"flex items-center gap-3\">\n <div className={cn('w-8 h-8 rounded flex items-center justify-center text-xs font-black', isDark ? 'bg-z-accent text-z-logo-text' : 'bg-z-accent text-white')}>Z</div>\n <div>\n <p className=\"text-sm font-bold tracking-tight\">Zenith CMS</p>\n <p className={cn('text-[11px] font-medium', isDark ? 'text-z-muted' : 'text-gray-400')}>Setup Wizard</p>\n </div>\n </div>\n </div>\n\n {/* Step Navigator */}\n <nav className=\"flex-1 px-4 py-6 space-y-1 overflow-y-auto\">\n {STEP_LABELS.map((s, i) => {\n const isCompleted = i < completedSteps\n const isActive = i === step\n return (\n <div\n key={i}\n className={cn(\n 'flex items-center gap-3 px-4 py-3 rounded transition-all',\n isActive\n ? (isDark ? 'bg-z-panel border border-z-border' : 'bg-gray-50 border border-gray-200')\n : 'border border-transparent'\n )}\n >\n <div className={cn(\n 'w-6 h-6 rounded-full flex items-center justify-center text-[10px] font-bold shrink-0 transition-all',\n isCompleted\n ? 'bg-emerald-500 text-white'\n : isActive\n ? (isDark ? 'bg-z-accent text-z-logo-text' : 'bg-z-accent text-white')\n : (isDark ? 'bg-z-hover text-z-muted border border-z-border' : 'bg-gray-100 text-gray-400 border border-gray-200')\n )}>\n {isCompleted ? <Check size={10} strokeWidth={3} /> : i + 1}\n </div>\n <div className=\"min-w-0\">\n <p className={cn('text-[13px] font-semibold truncate', isActive ? '' : (isDark ? 'text-z-muted' : 'text-gray-500'))}>{s.label}</p>\n <p className={cn('text-[11px] truncate', isDark ? 'text-z-muted/60' : 'text-gray-400')}>{s.desc}</p>\n </div>\n </div>\n )\n })}\n </nav>\n\n {/* Footer */}\n <div className={cn('px-8 py-6 border-t', isDark ? 'border-z-border' : 'border-gray-100')}>\n <button\n onClick={skip}\n className={cn('text-[12px] font-medium hover:underline transition-colors', isDark ? 'text-z-muted hover:text-z-secondary' : 'text-gray-400 hover:text-gray-600')}\n >\n Skip setup and go to login\n </button>\n </div>\n </aside>\n\n {/* ── MAIN CONTENT ── */}\n <main className=\"flex-1 flex flex-col min-h-screen overflow-y-auto\">\n\n {/* Top Bar */}\n <header className={cn(\n 'sticky top-0 z-10 flex items-center justify-between px-8 py-4 border-b backdrop-blur-sm',\n isDark ? 'bg-[#080808]/80 border-z-border' : 'bg-white/80 border-gray-200'\n )}>\n <div className=\"flex items-center gap-3\">\n {/* Mobile progress indicator */}\n <div className={cn('flex gap-1 lg:hidden')}>\n {STEPS.map((_, i) => (\n <div\n key={i}\n className={cn(\n 'h-1 rounded-full transition-all duration-300',\n i <= step ? 'w-5 bg-z-accent' : 'w-2 bg-z-hover'\n )}\n />\n ))}\n </div>\n <span className={cn('text-[13px] font-semibold hidden lg:block', isDark ? 'text-z-muted' : 'text-gray-500')}>\n Step {step + 1} of {TOTAL_STEPS} — <span className={isDark ? 'text-z-primary' : 'text-gray-900'}>{current.title}</span>\n </span>\n </div>\n\n {/* Progress % */}\n <div className=\"flex items-center gap-3\">\n <div className={cn('hidden sm:flex items-center gap-2')}>\n <div className={cn('w-32 h-1.5 rounded-full overflow-hidden', isDark ? 'bg-z-hover' : 'bg-gray-200')}>\n <div\n className=\"h-full bg-z-accent rounded-full transition-all duration-500\"\n style={{ width: `${((step + 1) / TOTAL_STEPS) * 100}%` }}\n />\n </div>\n <span className={cn('text-[12px] font-bold tabular-nums', isDark ? 'text-z-muted' : 'text-gray-400')}>\n {Math.round(((step + 1) / TOTAL_STEPS) * 100)}%\n </span>\n </div>\n <button\n onClick={skip}\n className={cn('lg:hidden flex items-center gap-1 text-[12px] font-semibold', isDark ? 'text-z-muted' : 'text-gray-400')}\n >\n Skip <X size={11} />\n </button>\n </div>\n </header>\n\n {/* Step Content */}\n <div className=\"flex-1 flex flex-col justify-center px-8 py-10 max-w-2xl w-full mx-auto\">\n\n <AnimatePresence mode=\"wait\">\n <motion.div\n key={step}\n initial={{ opacity: 0, y: 16 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -16 }}\n transition={{ duration: 0.22, ease: 'easeOut' }}\n className=\"space-y-8\"\n >\n {/* Step Header */}\n <div className=\"flex items-start gap-5\">\n <div className={cn(\n 'w-14 h-14 rounded-xl flex items-center justify-center shrink-0 border',\n isDark ? 'bg-z-panel border-z-border' : 'bg-white border-gray-200 shadow-sm'\n )}>\n {current.icon}\n </div>\n <div className=\"pt-1\">\n <h1 className=\"text-2xl font-bold tracking-tight leading-tight\">{current.title}</h1>\n <p className={cn('text-[14px] mt-1.5', isDark ? 'text-z-muted' : 'text-gray-500')}>{current.subtitle}</p>\n </div>\n </div>\n\n {/* Step Body */}\n <div className={cn(\n 'rounded-xl border p-6',\n isDark ? 'bg-[#0d0d0d] border-z-border' : 'bg-white border-gray-200 shadow-sm'\n )}>\n {current.content}\n </div>\n </motion.div>\n </AnimatePresence>\n </div>\n\n {/* Footer Navigation */}\n <footer className={cn(\n 'sticky bottom-0 border-t px-8 py-4 flex items-center justify-between backdrop-blur-sm',\n isDark ? 'bg-[#080808]/90 border-z-border' : 'bg-white/90 border-gray-200'\n )}>\n <button\n onClick={back}\n disabled={step === 0}\n className={cn(\n 'flex items-center gap-2 px-5 py-2.5 border rounded text-sm font-semibold transition-all',\n step === 0\n ? 'opacity-20 cursor-not-allowed border-z-border'\n : isDark\n ? 'border-z-border hover:bg-z-hover'\n : 'border-gray-200 hover:bg-gray-50 text-gray-700'\n )}\n >\n <ArrowLeft size={14} /> Back\n </button>\n\n <div className=\"flex items-center gap-3\">\n {step === TOTAL_STEPS - 1 ? (\n <button\n onClick={() => { navigate('/login') }}\n className=\"flex items-center gap-2 px-8 py-2.5 bg-emerald-600 hover:bg-emerald-700 text-white text-sm font-bold rounded transition-all shadow-md\"\n >\n <CheckCircle2 size={15} /> Enter Admin Dashboard\n </button>\n ) : (\n <button\n onClick={next}\n disabled={!current.canNext}\n className={cn(\n 'flex items-center gap-2 px-8 py-2.5 text-sm font-bold rounded transition-all shadow-md',\n current.canNext\n ? 'bg-z-accent hover:opacity-90 text-z-primary'\n : 'opacity-30 cursor-not-allowed bg-z-accent text-z-primary'\n )}\n >\n Continue <ArrowRight size={14} />\n </button>\n )}\n </div>\n </footer>\n </main>\n </div>\n )\n}\n"],"mappings":"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"}