@adminforge/core 0.3.1
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/.turbo/turbo-build.log +56 -0
- package/CHANGELOG.md +32 -0
- package/LICENSE +21 -0
- package/bin/adminforge.js +317 -0
- package/dist/auth-client.cjs +45 -0
- package/dist/auth-client.cjs.map +1 -0
- package/dist/auth-client.d.cts +17 -0
- package/dist/auth-client.d.ts +17 -0
- package/dist/auth-client.js +20 -0
- package/dist/auth-client.js.map +1 -0
- package/dist/auth.cjs +65 -0
- package/dist/auth.cjs.map +1 -0
- package/dist/auth.d.cts +21 -0
- package/dist/auth.d.ts +21 -0
- package/dist/auth.js +36 -0
- package/dist/auth.js.map +1 -0
- package/dist/client-D0cjJVsn.d.ts +20 -0
- package/dist/client-sRnmZ-Y9.d.cts +20 -0
- package/dist/index-CyzxaE7n.d.cts +124 -0
- package/dist/index-CyzxaE7n.d.ts +124 -0
- package/dist/index.cjs +453 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +65 -0
- package/dist/index.d.ts +65 -0
- package/dist/index.js +410 -0
- package/dist/index.js.map +1 -0
- package/dist/next.cjs +839 -0
- package/dist/next.cjs.map +1 -0
- package/dist/next.d.cts +84 -0
- package/dist/next.d.ts +84 -0
- package/dist/next.js +800 -0
- package/dist/next.js.map +1 -0
- package/dist/styles.css +763 -0
- package/dist/styles.css.map +1 -0
- package/dist/styles.d.cts +2 -0
- package/dist/styles.d.ts +2 -0
- package/dist/ui.cjs +2500 -0
- package/dist/ui.cjs.map +1 -0
- package/dist/ui.d.cts +119 -0
- package/dist/ui.d.ts +119 -0
- package/dist/ui.js +2448 -0
- package/dist/ui.js.map +1 -0
- package/eslint.config.js +35 -0
- package/package.json +99 -0
- package/src/api/controller.ts +234 -0
- package/src/api/index.ts +4 -0
- package/src/api/next.ts +281 -0
- package/src/api/security/agent-auth.ts +134 -0
- package/src/auth/config.ts +20 -0
- package/src/auth/index.ts +3 -0
- package/src/auth/middleware.ts +15 -0
- package/src/auth/provider.tsx +28 -0
- package/src/core/fields/index.ts +119 -0
- package/src/core/hooks/index.ts +60 -0
- package/src/core/index.ts +43 -0
- package/src/core/registry/index.ts +22 -0
- package/src/core/schema/collection.ts +12 -0
- package/src/core/schema/config.ts +11 -0
- package/src/core/schema/normalize.ts +32 -0
- package/src/core/types/index.ts +114 -0
- package/src/db/client.ts +146 -0
- package/src/db/index.ts +3 -0
- package/src/db/schema-generator.ts +104 -0
- package/src/fields/index.ts +1 -0
- package/src/index.ts +4 -0
- package/src/next.ts +3 -0
- package/src/styles/adminforge.css +840 -0
- package/src/ui/AdminDashboard.tsx +176 -0
- package/src/ui/AdminForgeContext.tsx +64 -0
- package/src/ui/components/AdminLayout.tsx +107 -0
- package/src/ui/form-engine/FormEngine.tsx +250 -0
- package/src/ui/form-engine/ImageUpload.tsx +68 -0
- package/src/ui/form-engine/RelationInput.tsx +215 -0
- package/src/ui/form-engine/RichTextEditor.tsx +708 -0
- package/src/ui/index.ts +18 -0
- package/src/ui/screens/AdminPage.tsx +162 -0
- package/src/ui/screens/AgentTokenPage.tsx +232 -0
- package/src/ui/screens/CollectionFormPage.tsx +135 -0
- package/src/ui/screens/CollectionListPage.tsx +170 -0
- package/src/ui/screens/CollectionSchemaPage.tsx +180 -0
- package/src/ui/screens/RoleDetailPage.tsx +147 -0
- package/src/ui/screens/RolesListPage.tsx +57 -0
- package/src/ui/table-engine/TableEngine.tsx +157 -0
- package/src/ui.ts +3 -0
- package/tsconfig.json +10 -0
- package/tsup.config.ts +54 -0
package/dist/ui.cjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ui.ts","../src/ui/components/AdminLayout.tsx","../src/ui/AdminDashboard.tsx","../src/ui/screens/AdminPage.tsx","../src/auth/provider.tsx","../src/ui/table-engine/TableEngine.tsx","../src/ui/screens/CollectionListPage.tsx","../src/ui/form-engine/FormEngine.tsx","../src/ui/form-engine/RichTextEditor.tsx","../src/ui/form-engine/ImageUpload.tsx","../src/ui/AdminForgeContext.tsx","../src/ui/form-engine/RelationInput.tsx","../src/ui/screens/CollectionFormPage.tsx","../src/ui/screens/CollectionSchemaPage.tsx","../src/ui/screens/RolesListPage.tsx","../src/ui/screens/RoleDetailPage.tsx","../src/ui/screens/AgentTokenPage.tsx"],"sourcesContent":["\"use client\";\nexport * from \"./ui/index.js\";\n\n","import type { AdminForgeConfig } from \"../../core\";\nimport Link from \"next/link\";\n\ninterface AdminLayoutProps {\n config: AdminForgeConfig;\n children: React.ReactNode;\n currentPath?: string;\n role?: string;\n}\n\nconst iconMap: Record<string, string> = {\n posts: \"article\",\n categories: \"category\",\n tags: \"sell\",\n users: \"person\",\n};\n\nexport function AdminLayout({ config, children, currentPath, role }: AdminLayoutProps) {\n return (\n <div className=\"adminforge-layout\">\n <nav className=\"adminforge-sidebar\">\n <div className=\"adminforge-sidebar-header\">\n <Link href=\"/admin\">\n <h1>AdminForge</h1>\n </Link>\n <p className=\"adminforge-sidebar-subtitle\">Collections Manager</p>\n </div>\n <ul className=\"adminforge-nav\">\n <li>\n <Link href=\"/admin\" className={`adminforge-nav-link ${currentPath === \"/admin\" ? \"active\" : \"\"}`}>\n <div className=\"adminforge-nav-item-content\">\n <span className=\"material-symbols-outlined adminforge-nav-icon\">dashboard</span>\n <span>Overview</span>\n </div>\n </Link>\n </li>\n {config.collections.map((collection) => {\n const a = collection.access;\n if (a?.read && (!role || !a.read.includes(role))) return null;\n const href = `/admin/${collection.name}`;\n const icon = collection.icon || \"database\";\n return (\n <li key={collection.name} className=\"adminforge-nav-item\">\n <Link href={href} className={`adminforge-nav-link ${currentPath === href ? \"active\" : \"\"}`}>\n <div className=\"adminforge-nav-item-content\">\n <span className=\"material-symbols-outlined adminforge-nav-icon\">{icon}</span>\n <span>{collection.label}</span>\n </div>\n </Link>\n <Link href={`${href}/new`} className=\"adminforge-nav-quick-create\" title={`Create New ${collection.label}`}>\n <span className=\"material-symbols-outlined\" style={{ fontSize: '18px' }}>add</span>\n </Link>\n </li>\n );\n })}\n \n <li className=\"adminforge-nav-section-title\" style={{ marginTop: '24px', padding: '8px 16px', fontSize: '11px', fontWeight: 700, color: '#94a3b8', textTransform: 'uppercase', letterSpacing: '0.05em' }}>\n Access Control\n </li>\n <li>\n <Link href=\"/admin/roles\" className={`adminforge-nav-link ${currentPath?.startsWith(\"/admin/roles\") ? \"active\" : \"\"}`}>\n <div className=\"adminforge-nav-item-content\">\n <span className=\"material-symbols-outlined adminforge-nav-icon\">shield_person</span>\n <span>Roles</span>\n </div>\n </Link>\n </li>\n\n <li className=\"adminforge-nav-section-title\" style={{ marginTop: '24px', padding: '8px 16px', fontSize: '11px', fontWeight: 700, color: '#94a3b8', textTransform: 'uppercase', letterSpacing: '0.05em' }}>\n AI & Agents\n </li>\n <li>\n <Link href=\"/admin/settings/agent-tokens\" className={`adminforge-nav-link ${currentPath === \"/admin/settings/agent-tokens\" ? \"active\" : \"\"}`}>\n <div className=\"adminforge-nav-item-content\">\n <span className=\"material-symbols-outlined adminforge-nav-icon\">smart_toy</span>\n <span>Agent Tokens</span>\n </div>\n </Link>\n </li>\n </ul>\n </nav>\n <main className=\"adminforge-content\">\n <header className=\"adminforge-topbar\">\n <h2 style={{ fontSize: \"1.125rem\", fontWeight: 600 }}>\n {currentPath === \"/admin\" ? \"Dashboard\" : \"Management\"}\n </h2>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"16px\" }}>\n {role && (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"8px\" }}>\n <div style={{ width: \"8px\", height: \"8px\", borderRadius: \"50%\", background: \"#10b981\" }}></div>\n <span style={{ fontSize: \"13px\", fontWeight: 500, color: \"var(--color-text-secondary)\" }}>{role}</span>\n </div>\n )}\n {config.auth?.enabled && (\n <form action=\"/api/logout\" method=\"POST\">\n <button type=\"submit\" className=\"adminforge-btn adminforge-btn-secondary\" style={{ padding: \"6px 12px\", fontSize: \"13px\" }}>\n Log Out\n </button>\n </form>\n )}\n </div>\n </header>\n <div className=\"adminforge-main-canvas\">{children}</div>\n </main>\n </div>\n );\n}\n","\"use client\";\nimport React from \"react\";\nimport { AdminLayout } from \"./components/AdminLayout.js\";\nimport { AdminPage } from \"./screens/AdminPage.js\";\nimport { CollectionListPage } from \"./screens/CollectionListPage.js\";\nimport { CollectionFormPage } from \"./screens/CollectionFormPage.js\";\nimport { CollectionSchemaPage } from \"./screens/CollectionSchemaPage.js\";\nimport { RolesListPage } from \"./screens/RolesListPage.js\";\nimport { RoleDetailPage } from \"./screens/RoleDetailPage.js\";\nimport { AgentTokenPage } from \"./screens/AgentTokenPage.js\";\nimport type { AdminForgeConfig } from \"../core/index.js\";\nimport { useAdminForge, AdminForgeProvider } from \"./AdminForgeContext.js\";\nimport { useAdminSession } from \"../auth/provider.js\";\nimport { useSearchParams } from \"next/navigation.js\";\n\ninterface AdminDashboardProps {\n config?: AdminForgeConfig;\n params?: { admin?: string[] } | Promise<{ admin?: string[] }>;\n apiBase?: string;\n}\n\nexport function AdminDashboard({ config: initialConfig, params: initialParams, apiBase: initialApiBase }: AdminDashboardProps) {\n const ctx = useAdminForge();\n const config = initialConfig ?? ctx.config;\n const apiBase = initialApiBase ?? ctx.apiBase;\n const searchParams = useSearchParams();\n const queryStr = searchParams.toString();\n\n const [adminParams, setAdminParams] = React.useState<string[]>([]);\n const [data, setData] = React.useState<any>(null);\n const [record, setRecord] = React.useState<any>(null);\n const [unauthorized, setUnauthorized] = React.useState(false);\n\n React.useEffect(() => {\n async function resolveParams() {\n // If params is a promise (Next.js 15+), wait for it\n const resolved = initialParams instanceof Promise ? await initialParams : initialParams;\n \n if (resolved?.admin) {\n setAdminParams(resolved.admin);\n } else if (typeof window !== \"undefined\") {\n // Fallback to window.location if params are missing\n const path = window.location.pathname;\n const segments = path.split(\"/admin/\").pop()?.split(\"/\") || [];\n setAdminParams(segments.filter(Boolean));\n }\n }\n \n resolveParams();\n }, [initialParams]);\n\n const [segment, actionOrId] = adminParams;\n\n React.useEffect(() => {\n if (!config || !segment) return;\n const isCollection = config.collections.some((c: any) => c.name === segment);\n if (!isCollection) return;\n\n const query = queryStr ? `?${queryStr}` : \"\";\n\n if (!actionOrId) {\n fetch(`${apiBase}/${segment}${query}`)\n .then(async res => {\n if (res.status === 401) {\n setUnauthorized(true);\n return null;\n }\n if (!res.ok) throw new Error(`${res.status} ${res.statusText}`);\n const text = await res.text();\n return text ? JSON.parse(text) : {};\n })\n .then(res => setData(res))\n .catch(e => console.error(`[AdminForge] Failed to fetch ${apiBase}/${segment}:`, e));\n } else if (actionOrId !== \"new\" && actionOrId !== \"schema\") {\n fetch(`${apiBase}/${segment}/${actionOrId}${query}`)\n .then(async res => {\n if (res.status === 401) {\n setUnauthorized(true);\n return null;\n }\n if (!res.ok) throw new Error(`${res.status} ${res.statusText}`);\n const text = await res.text();\n return text ? JSON.parse(text) : {};\n })\n .then(res => setRecord(res))\n .catch(e => console.error(`[AdminForge] Failed to fetch ${apiBase}/${segment}/${actionOrId}:`, e));\n }\n }, [segment, actionOrId, apiBase, config, queryStr]);\n\n return (\n <AdminForgeProvider config={config} apiBase={apiBase}>\n <AdminDashboardContent \n config={config} \n adminParams={adminParams}\n unauthorized={unauthorized} \n data={data}\n record={record}\n />\n </AdminForgeProvider>\n );\n}\n\nfunction AdminDashboardContent({ config: _config, adminParams, unauthorized: localUnauthorized, data, record }: any) {\n const { config: ctxConfig, unauthorized: ctxUnauthorized } = useAdminForge();\n const config = _config ?? ctxConfig;\n const session = useAdminSession();\n const noSession = config?.auth?.enabled && !session?.user;\n const unauthorized = localUnauthorized || ctxUnauthorized || noSession;\n\n if (unauthorized) {\n return (\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', height: '100vh', background: '#f8fafc', padding: '20px' }}>\n <div style={{ background: '#fff', padding: '40px', borderRadius: '16px', boxShadow: '0 20px 25px -5px rgba(0,0,0,0.1)', maxWidth: '400px', width: '100%', textAlign: 'center' }}>\n <div style={{ width: '64px', height: '64px', background: '#eff6ff', borderRadius: '50%', display: 'flex', alignItems: 'center', justifyContent: 'center', margin: '0 auto 24px' }}>\n <span className=\"material-symbols-outlined\" style={{ color: '#3b82f6', fontSize: '32px' }}>lock</span>\n </div>\n <h2 style={{ fontSize: '24px', fontWeight: 700, color: '#0f172a', marginBottom: '8px' }}>Login Required</h2>\n <p style={{ color: '#64748b', fontSize: '15px', marginBottom: '32px', lineHeight: 1.6 }}>Please sign in to access the AdminForge dashboard.</p>\n <form action=\"/api/auth/signin\" method=\"GET\">\n <button className=\"adminforge-btn adminforge-btn-primary\" style={{ width: '100%', height: '48px', fontSize: '16px' }}>\n Sign In to Admin\n </button>\n </form>\n </div>\n </div>\n );\n }\n\n if (config) {\n const [segment, actionOrId] = adminParams;\n\n if (adminParams.length === 0) return <AdminPage config={config} />;\n\n if (segment === \"roles\") {\n if (actionOrId) return <RoleDetailPage config={config} roleId={actionOrId} />;\n return <RolesListPage config={config} />;\n }\n\n if (segment === \"settings\" && actionOrId === \"agent-tokens\") {\n return <AgentTokenPage config={config} />;\n }\n\n const collection = config.collections.find((c: any) => c.name === segment);\n if (collection) {\n if (actionOrId === \"new\") return <CollectionFormPage config={config} collection={collection} isNew />;\n if (actionOrId === \"schema\") return <CollectionSchemaPage config={config} collection={collection} />;\n if (actionOrId) return <CollectionFormPage config={config} collection={collection} isNew={false} record={record} />;\n\n return (\n <CollectionListPage\n config={config}\n collection={collection}\n data={data?.data || []}\n total={data?.total || 0}\n page={data?.page || 1}\n pageSize={data?.pageSize || 10}\n />\n );\n }\n\n return <AdminPage config={config} />;\n }\n\n return (\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', height: '100vh', background: '#f8fafc' }}>\n <div style={{ textAlign: 'center' }}>\n <div className=\"adminforge-spinner\" style={{ width: '40px', height: '40px', border: '3px solid #e2e8f0', borderTopColor: '#3b82f6', borderRadius: '50%', margin: '0 auto 16px' }}></div>\n <p style={{ color: '#64748b', fontSize: '14px', fontWeight: 500 }}>Loading AdminForge...</p>\n </div>\n <style>{`\n .adminforge-spinner { animation: spin 0.8s linear infinite; }\n @keyframes spin { to { transform: rotate(360deg); } }\n `}</style>\n </div>\n );\n}\n","\"use client\";\nimport { useState, useEffect } from \"react\";\nimport type { AdminForgeConfig } from \"../../core\";\nimport { AdminLayout } from \"../components/AdminLayout.js\";\nimport Link from \"next/link\";\nimport { useAdminSession } from \"../../auth/provider.js\";\n\ninterface AdminPageProps {\n config: AdminForgeConfig;\n role?: string;\n}\n\nconst iconMap: Record<string, string> = {\n posts: \"article\",\n categories: \"category\",\n tags: \"sell\",\n users: \"person\",\n};\n\nfunction formatRelativeTime(date: Date) {\n const diff = Date.now() - date.getTime();\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (isNaN(date.getTime())) return \"Invalid date\";\n if (minutes < 1) return \"Just now\";\n if (minutes < 60) return `${minutes}m ago`;\n if (hours < 24) return `${hours}h ago`;\n return `${days}d ago`;\n}\n\nfunction CollectionActivity({ activity }: { activity?: { createdAt: string, updatedAt: string } }) {\n if (!activity) return <span style={{ color: '#94a3b8', fontSize: '13px' }}>-</span>;\n \n const createdAt = new Date(activity.createdAt);\n const updatedAt = new Date(activity.updatedAt);\n const isUpdated = updatedAt.getTime() > createdAt.getTime() + 1000;\n const date = isUpdated ? updatedAt : createdAt;\n const label = isUpdated ? \"Updated\" : \"Created\";\n\n return (\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px', fontSize: '13px' }}>\n <span \n style={{ \n fontSize: '9px', \n padding: '1px 6px', \n borderRadius: '10px',\n background: isUpdated ? '#fef3c7' : '#92400e20',\n color: isUpdated ? '#92400e' : '#166534',\n fontWeight: 700,\n textTransform: 'uppercase',\n border: '1px solid',\n borderColor: isUpdated ? '#fde68a' : '#bbf7d0'\n }}\n >\n {label}\n </span>\n <span style={{ fontWeight: 500, color: 'var(--color-text)' }}>{formatRelativeTime(date)}</span>\n </div>\n );\n}\n\nexport function AdminPage({ config, role: propRole }: AdminPageProps) {\n const session = useAdminSession();\n const role = propRole || session?.role || session?.user?.role;\n const schemaActivity = config.collections?.[0] && (config.collections[0] as any)?.schemaActivity;\n\n return (\n <AdminLayout config={config} currentPath=\"/admin\" role={role}>\n <div className=\"adminforge-dashboard\">\n <div className=\"mb-10\">\n <div style={{ display: 'flex', alignItems: 'center', gap: '16px', marginBottom: '8px' }}>\n <h2 className=\"adminforge-display-title\" style={{ marginBottom: 0 }}>Collection Registry</h2>\n </div>\n <p className=\"adminforge-display-subtitle\" style={{ marginBottom: '32px' }}>\n Index of all data models defined in your system.\n </p>\n </div>\n\n {schemaActivity && (\n <div style={{ \n display: 'flex', \n alignItems: 'center', \n gap: '12px', \n padding: '12px 20px', \n background: '#f0f9ff', \n border: '1px solid #bae6fd', \n borderRadius: '12px', \n marginBottom: '24px',\n boxShadow: '0 1px 2px rgba(0,0,0,0.05)'\n }}>\n <span className=\"material-symbols-outlined\" style={{ color: '#0284c7', fontSize: '20px' }}>sync</span>\n <div style={{ fontSize: '14px', color: '#0369a1' }}>\n <span style={{ fontWeight: 600 }}>Schema Synced:</span> Your definitions from <code style={{ background: '#e0f2fe', padding: '2px 4px', borderRadius: '4px' }}>adminforge.ts</code> were last updated <span style={{ fontWeight: 500 }}>{formatRelativeTime(new Date(schemaActivity.updatedAt))}</span>\n </div>\n </div>\n )}\n\n <div className=\"adminforge-table-wrapper\">\n <div style={{ padding: '24px', borderBottom: '1px solid var(--color-border)', display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n <h3 style={{ fontSize: '18px', fontWeight: 600 }}>Registered Collections</h3>\n </div>\n <table className=\"adminforge-table\">\n <thead>\n <tr>\n <th style={{ width: 'auto' }}>Collection Name</th>\n <th style={{ width: '180px' }}>Field Definitions</th>\n <th style={{ width: '120px', textAlign: 'right' }}>Actions</th>\n </tr>\n </thead>\n <tbody>\n {config.collections\n .filter((collection) => {\n const a = collection.access;\n if (!a?.read) return true;\n if (!role) return false;\n return a.read.includes(role);\n })\n .map((collection) => {\n return (\n <tr key={collection.name}>\n <td>\n <div style={{ display: 'flex', alignItems: 'center', gap: '12px' }}>\n <div style={{ width: '36px', height: '36px', borderRadius: '8px', background: '#f1f5f9', display: 'flex', alignItems: 'center', justifyContent: 'center', color: '#64748b' }}>\n <span className=\"material-symbols-outlined\" style={{ fontSize: '20px' }}>\n {collection.icon || 'database'}\n </span>\n </div>\n <span style={{ fontWeight: 600, color: 'var(--color-text)', fontSize: '15px' }}>{collection.label}</span>\n </div>\n </td>\n <td>\n <span className=\"adminforge-badge adminforge-badge-secondary\" style={{ padding: '4px 10px' }}>\n {Object.keys(collection.fields).length} mapped fields\n </span>\n </td>\n <td style={{ textAlign: 'right' }}>\n <div style={{ display: 'flex', gap: '8px', justifyContent: 'flex-end' }}>\n <Link href={`/admin/${collection.name}`} className=\"adminforge-btn-icon\" title=\"View Data\">\n <span className=\"material-symbols-outlined\" style={{ fontSize: '20px' }}>database</span>\n </Link>\n <Link href={`/admin/${collection.name}/schema`} className=\"adminforge-btn-icon\" title=\"View Schema\">\n <span className=\"material-symbols-outlined\" style={{ fontSize: '20px' }}>visibility</span>\n </Link>\n </div>\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n <div style={{ padding: '20px 24px', background: '#fcfcfd', borderTop: '1px solid var(--color-border)', display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n <p style={{ fontSize: '13px', color: 'var(--color-text-secondary)' }}>\n Showing {config.collections.length} models from your current configuration.\n </p>\n </div>\n </div>\n </div>\n </AdminLayout>\n );\n}\n","\"use client\";\n\nimport { createContext, useContext } from \"react\";\n\ninterface AdminSession {\n user: { id: string; email: string; role?: string } | null;\n role?: string;\n}\n\nconst AdminSessionContext = createContext<AdminSession | null>(null);\n\nexport function AuthProvider({\n children,\n session,\n}: {\n children: React.ReactNode;\n session: AdminSession | null;\n}) {\n return (\n <AdminSessionContext.Provider value={session}>\n {children}\n </AdminSessionContext.Provider>\n );\n}\n\nexport function useAdminSession(): AdminSession | null {\n return useContext(AdminSessionContext);\n}\n","\"use client\";\n\nimport type { CollectionDefinition, AccessConfig } from \"../../core\";\nimport Link from \"next/link\";\n\ninterface TableEngineProps {\n collection: CollectionDefinition;\n data: unknown[];\n basePath: string;\n role?: string;\n}\n\nfunction hasAccess(access: AccessConfig | undefined, operation: string, role?: string): boolean {\n if (!access) return true;\n const allowed = access[operation as keyof AccessConfig];\n if (!allowed || !Array.isArray(allowed)) return true;\n if (!role) return false;\n return allowed.includes(role);\n}\n\nfunction formatRelativeTime(date: Date) {\n const diff = Date.now() - date.getTime();\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (isNaN(date.getTime())) return \"Invalid date\";\n if (minutes < 1) return \"Just now\";\n if (minutes < 60) return `${minutes}m ago`;\n if (hours < 24) return `${hours}h ago`;\n return `${days}d ago`;\n}\n\nfunction ActivityCell({ record }: { record: Record<string, unknown> }) {\n const createdAtStr = (record.createdAt || record.created_at) as string;\n const updatedAtStr = (record.updatedAt || record.updated_at) as string;\n \n const createdAt = createdAtStr ? new Date(createdAtStr) : null;\n const updatedAt = updatedAtStr ? new Date(updatedAtStr) : null;\n \n const isUpdated = updatedAt && createdAt && updatedAt.getTime() > createdAt.getTime() + 1000;\n const date = isUpdated ? updatedAt : createdAt;\n const label = isUpdated ? \"Updated\" : \"Created\";\n \n if (!date) return <span style={{ color: '#94a3b8', fontSize: '13px' }}>No activity</span>;\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '2px', minWidth: '120px' }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px', fontSize: '13px' }}>\n <span \n style={{ \n fontSize: '10px', \n padding: '1px 6px', \n borderRadius: '10px',\n background: isUpdated ? '#fef3c7' : '#dcfce7',\n color: isUpdated ? '#92400e' : '#166534',\n fontWeight: 700,\n textTransform: 'uppercase'\n }}\n >\n {label}\n </span>\n <span style={{ fontWeight: 500, color: 'var(--color-text)' }}>{formatRelativeTime(date)}</span>\n </div>\n <div style={{ fontSize: '11px', color: '#64748b' }}>\n by <span style={{ color: '#0f172a', fontWeight: 600 }}>Admin</span>\n </div>\n </div>\n );\n}\n\nexport function TableEngine({ collection, data, basePath, role }: TableEngineProps) {\n const records = data as Record<string, unknown>[];\n const fieldKeys = Object.keys(collection.fields);\n const displayKeys = [\"id\", ...fieldKeys.slice(0, 4)]; // Show up to 4 fields + ID + Activity\n const canDelete = hasAccess(collection.access, \"delete\", role);\n const canUpdate = hasAccess(collection.access, \"update\", role);\n\n return (\n <div className=\"adminforge-table-wrapper\">\n <table className=\"adminforge-table\">\n <thead>\n <tr>\n {displayKeys.map((key) => <th key={key}>{key}</th>)}\n <th>Activity</th>\n <th style={{ textAlign: 'right', paddingRight: '20px' }}>Actions</th>\n </tr>\n </thead>\n <tbody>\n {records.map((record) => (\n <tr key={record.id as string}>\n {displayKeys.map((key) => (\n <td key={key}>\n {key === 'id' ? (\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n <span className=\"adminforge-id-badge\" title={String(record[key])}>\n {String(record[key]).substring(0, 8)}...\n </span>\n <button \n type=\"button\"\n className=\"adminforge-btn-icon\" \n style={{ width: '24px', height: '24px', minWidth: '24px' }}\n title=\"Copy ID\"\n onClick={(e) => {\n e.stopPropagation();\n navigator.clipboard.writeText(String(record[key]));\n }}\n >\n <span className=\"material-symbols-outlined\" style={{ fontSize: '14px' }}>content_copy</span>\n </button>\n </div>\n ) : (\n <div style={{ maxWidth: '140px', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\n {String(record[key] ?? \"\")}\n </div>\n )}\n </td>\n ))}\n <td>\n <ActivityCell record={record} />\n </td>\n <td style={{ textAlign: 'right', paddingRight: '20px' }}>\n <div style={{ display: 'flex', gap: '4px', justifyContent: 'flex-end' }}>\n {canUpdate && (\n <Link href={`${basePath}/${record.id}`} className=\"adminforge-btn-icon\" title=\"Edit\">\n <span className=\"material-symbols-outlined\" style={{ fontSize: '20px' }}>edit</span>\n </Link>\n )}\n {canDelete && (\n <button\n className=\"adminforge-btn-icon adminforge-btn-icon-danger\"\n title=\"Delete\"\n onClick={async () => {\n if (confirm(\"Are you sure you want to delete this item?\")) {\n const res = await fetch(`/api/${collection.name}/${record.id}`, { method: 'DELETE' });\n if (res.ok) {\n window.location.reload();\n } else {\n const err = await res.json();\n alert(err.error || \"Failed to delete item\");\n }\n }\n }}\n >\n <span className=\"material-symbols-outlined\" style={{ fontSize: '20px' }}>delete</span>\n </button>\n )}\n </div>\n </td>\n </tr>\n ))}\n {records.length === 0 && <tr><td colSpan={displayKeys.length + 1}>No records found</td></tr>}\n </tbody>\n </table>\n </div>\n );\n}\n","\"use client\";\n\nimport type { AdminForgeConfig, CollectionDefinition, AccessConfig } from \"../../core\";\nimport { AdminLayout } from \"../components/AdminLayout.js\";\nimport { TableEngine } from \"../table-engine/TableEngine.js\";\nimport Link from \"next/link\";\nimport { useState, useCallback } from \"react\";\nimport { useRouter } from \"next/navigation\";\nimport { useAdminSession } from \"../../auth/provider.js\";\n\ninterface CollectionListPageProps {\n config: AdminForgeConfig;\n collection: CollectionDefinition;\n data: unknown[];\n total: number;\n page: number;\n pageSize: number;\n role?: string;\n}\n\nfunction hasAccess(access: AccessConfig | undefined, operation: string, role?: string): boolean {\n if (!access) return true;\n const allowed = access[operation as keyof AccessConfig];\n if (!allowed || !Array.isArray(allowed)) return true;\n if (!role) return false;\n return allowed.includes(role);\n}\n\nexport function CollectionListPage({ config, collection, data, total, page, pageSize, role: propRole }: CollectionListPageProps) {\n const router = useRouter();\n const session = useAdminSession();\n const role = propRole || session?.role || session?.user?.role;\n \n const [searchQuery, setSearchQuery] = useState(\"\");\n const canCreate = hasAccess(collection.access, \"create\", role);\n\n const updateParams = useCallback((newParams: Record<string, string | number>) => {\n const params = new URLSearchParams(window.location.search);\n Object.entries(newParams).forEach(([key, value]) => {\n if (value) params.set(key, String(value));\n else params.delete(key);\n });\n router.push(`/admin/${collection.name}?${params.toString()}`);\n }, [collection.name, router]);\n\n const handleSearch = (e: React.FormEvent) => {\n e.preventDefault();\n updateParams({ search: searchQuery, page: 1 });\n };\n\n const totalPages = Math.ceil(total / pageSize);\n const startEntry = (page - 1) * pageSize + 1;\n const endEntry = Math.min(page * pageSize, total);\n\n return (\n <AdminLayout config={config} currentPath={`/admin/${collection.name}`} role={role}>\n <div className=\"adminforge-collection-page\">\n <div className=\"adminforge-page-header\">\n <div style={{ display: 'flex', alignItems: 'center', gap: '16px' }}>\n <h2 style={{ fontSize: '24px', fontWeight: 700, margin: 0 }}>{collection.label}</h2>\n <span className=\"adminforge-badge\" style={{ background: '#f8fafc', color: '#64748b', borderColor: '#e2e8f0', fontSize: '11px', fontWeight: 600 }}>\n {total} total records\n </span>\n </div>\n {canCreate && (\n <Link href={`/admin/${collection.name}/new`} className=\"adminforge-btn adminforge-btn-primary\">\n <span className=\"material-symbols-outlined\" style={{ fontSize: '20px', marginRight: '8px' }}>add</span>\n Create New\n </Link>\n )}\n </div>\n\n <div style={{ background: 'var(--color-surface)', border: '1px solid var(--color-border)', borderRadius: 'var(--radius-lg)', overflow: 'hidden', boxShadow: 'var(--shadow-sm)' }}>\n <div style={{ padding: '20px', borderBottom: '1px solid var(--color-border)', background: '#fcfcfd' }}>\n <form onSubmit={handleSearch} style={{ maxWidth: '400px', position: 'relative' }}>\n <span className=\"material-symbols-outlined\" style={{ position: 'absolute', left: '12px', top: '50%', transform: 'translateY(-50%)', color: '#94a3b8', fontSize: '20px' }}>search</span>\n <input \n type=\"text\" \n className=\"adminforge-search-input\" \n placeholder={`Search ${(collection.label || collection.name).toLowerCase()}...`} \n value={searchQuery} \n onChange={(e) => setSearchQuery(e.target.value)}\n style={{ paddingLeft: '40px', width: '100%' }}\n />\n </form>\n </div>\n\n <TableEngine collection={collection} data={data} basePath={`/admin/${collection.name}`} role={role} />\n\n {/* Pagination Footer */}\n <div style={{ padding: '16px 24px', borderTop: '1px solid var(--color-border)', display: 'flex', justifyContent: 'space-between', alignItems: 'center', background: '#fcfcfd' }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '16px' }}>\n <div style={{ fontSize: '14px', color: 'var(--color-text-secondary)' }}>\n Showing <span style={{ fontWeight: 600, color: 'var(--color-text)' }}>{startEntry}</span> to <span style={{ fontWeight: 600, color: 'var(--color-text)' }}>{endEntry}</span> of <span style={{ fontWeight: 600, color: 'var(--color-text)' }}>{total}</span> results\n </div>\n <select \n value={pageSize} \n onChange={(e) => updateParams({ pageSize: e.target.value, page: 1 })}\n style={{\n padding: '4px 8px',\n borderRadius: '6px',\n border: '1px solid var(--color-border)',\n fontSize: '12px',\n background: 'white',\n color: 'var(--color-text)',\n cursor: 'pointer',\n outline: 'none'\n }}\n >\n {[10, 25, 50, 100].map(size => (\n <option key={size} value={size}>{size} / page</option>\n ))}\n </select>\n </div>\n <div style={{ display: 'flex', gap: '8px' }}>\n <button \n onClick={() => updateParams({ page: page - 1 })}\n disabled={page <= 1}\n className=\"adminforge-btn-icon\"\n style={{ border: '1px solid var(--color-border)', background: 'white' }}\n >\n <span className=\"material-symbols-outlined\">chevron_left</span>\n </button>\n \n {[...Array(totalPages)].map((_, i) => {\n const p = i + 1;\n // Simple logic to show only current, first, last and surrounding pages if many\n if (totalPages > 7 && p > 1 && p < totalPages && Math.abs(p - page) > 1) {\n if (p === 2 || p === totalPages - 1) return <span key={p} style={{ padding: '0 4px' }}>...</span>;\n return null;\n }\n return (\n <button\n key={p}\n onClick={() => updateParams({ page: p })}\n style={{\n width: '36px',\n height: '36px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: '6px',\n border: '1px solid',\n borderColor: p === page ? 'var(--color-primary)' : 'var(--color-border)',\n background: p === page ? 'var(--color-primary)' : 'white',\n color: p === page ? 'white' : 'var(--color-text)',\n fontWeight: p === page ? 600 : 400,\n cursor: 'pointer'\n }}\n >\n {p}\n </button>\n );\n })}\n\n <button \n onClick={() => updateParams({ page: page + 1 })}\n disabled={page >= totalPages}\n className=\"adminforge-btn-icon\"\n style={{ border: '1px solid var(--color-border)', background: 'white' }}\n >\n <span className=\"material-symbols-outlined\">chevron_right</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n </AdminLayout>\n );\n}\n","\"use client\";\n\nimport type { CollectionDefinition, FieldDefinition, AccessConfig } from \"../../core\";\nimport { useCallback, useRef, useState, useEffect } from \"react\";\nimport { RichTextEditor } from \"./RichTextEditor.js\";\nimport { ImageUpload } from \"./ImageUpload.js\";\nimport { RelationInput } from \"./RelationInput.js\";\n\ninterface FormEngineProps {\n collection: CollectionDefinition;\n record?: Record<string, unknown> | null;\n isNew: boolean;\n role?: string;\n}\n\nfunction hasAccess(access: AccessConfig | undefined, operation: string, role?: string): boolean {\n if (!access) return true;\n const allowed = access[operation as keyof AccessConfig];\n if (!allowed || !Array.isArray(allowed)) return true;\n if (!role) return false;\n return allowed.includes(role);\n}\n\nfunction FieldRenderer({\n name, field, value, onChange, onRelationChange, error, role, checked, onCheckedChange,\n}: {\n name: string; field: FieldDefinition; value?: unknown; onChange?: (val: string) => void;\n onRelationChange?: (val: string | string[]) => void; error?: string; role?: string;\n checked?: boolean; onCheckedChange?: (checked: boolean) => void;\n}) {\n const { component, props } = field.ui;\n if (props?.hidden) return null;\n if (!hasAccess(field.access, \"read\", role)) return null;\n\n const errorClass = error ? \"adminforge-input-error\" : \"\";\n const resolvedValue = value !== undefined ? value : field.db?.default;\n const isReadOnly = Boolean(props?.readOnly) || !hasAccess(field.access, \"update\", role);\n\n switch (component) {\n case \"text\": case \"slug\": case \"date\":\n return (\n <div className=\"adminforge-field\">\n <label htmlFor={name}>{(props?.label as string) ?? name}</label>\n <input id={name} name={name} type={component === \"date\" ? \"datetime-local\" : \"text\"}\n className={`adminforge-input ${errorClass}`} required={!field.db?.nullable}\n defaultValue={typeof resolvedValue === \"string\" ? resolvedValue : \"\"} readOnly={isReadOnly} />\n {error && <span className=\"adminforge-field-err\">{error}</span>}\n </div>\n );\n case \"boolean\":\n return (\n <div className=\"adminforge-field adminforge-field-checkbox\">\n <label htmlFor={name}>\n <input id={name} name={name} type=\"checkbox\"\n checked={!!checked}\n onChange={(e) => onCheckedChange?.(e.target.checked)}\n disabled={isReadOnly} />\n {(props?.label as string) ?? name}\n </label>\n {error && <span className=\"adminforge-field-err\">{error}</span>}\n </div>\n );\n case \"relation\":\n return (\n <div className=\"adminforge-field\">\n <label>{(props?.label as string) ?? name}</label>\n <RelationInput name={name} to={props?.to as string} relationType={props?.relationType as string}\n value={resolvedValue as string | string[] | undefined} onChange={onRelationChange} error={error} disabled={isReadOnly} />\n {error && <span className=\"adminforge-field-err\">{error}</span>}\n </div>\n );\n case \"richText\":\n return (\n <div className=\"adminforge-field\">\n <label>{(props?.label as string) ?? name}</label>\n <RichTextEditor name={name} value={typeof resolvedValue === \"string\" ? resolvedValue : \"\"}\n onChange={(val) => !isReadOnly && onChange?.(val)} />\n <input type=\"hidden\" name={name} id={`${name}-hidden`} defaultValue={typeof resolvedValue === \"string\" ? resolvedValue : \"\"} />\n {error && <span className=\"adminforge-field-err\">{error}</span>}\n </div>\n );\n case \"image\":\n return <ImageUpload name={name} value={typeof resolvedValue === \"string\" ? resolvedValue : \"\"}\n onChange={(val) => !isReadOnly && onChange?.(val)} />;\n default:\n return (\n <div className=\"adminforge-field\">\n <label htmlFor={name}>{(props?.label as string) ?? name}</label>\n <input id={name} name={name} type=\"text\" className={`adminforge-input ${errorClass}`}\n defaultValue={typeof resolvedValue === \"string\" ? resolvedValue : \"\"} readOnly={isReadOnly} />\n {error && <span className=\"adminforge-field-err\">{error}</span>}\n </div>\n );\n }\n}\n\nexport function FormEngine({ collection, record, isNew, role }: FormEngineProps) {\n const formRef = useRef<HTMLFormElement>(null);\n const [richTextValues, setRichTextValues] = useState<Record<string, string>>({});\n const [relationValues, setRelationValues] = useState<Record<string, string | string[]>>({});\n const [booleanValues, setBooleanValues] = useState<Record<string, boolean>>({});\n const [fieldErrors, setFieldErrors] = useState<Record<string, string>>({});\n const [submitError, setSubmitError] = useState<string | null>(null);\n\n const canSave = isNew\n ? hasAccess(collection.access, \"create\", role)\n : hasAccess(collection.access, \"update\", role);\n\n useEffect(() => {\n if (record && !isNew) {\n const rt: Record<string, string> = {};\n const rv: Record<string, string | string[]> = {};\n const bv: Record<string, boolean> = {};\n for (const [key, value] of Object.entries(record)) {\n const field = collection.fields[key];\n if (field?.type === \"richText\" && typeof value === \"string\") rt[key] = value;\n if (field?.type === \"relation\") {\n if (Array.isArray(value)) rv[key] = value.map((v: any) => (typeof v === \"string\" ? v : v.id));\n else if (typeof value === \"string\") rv[key] = value;\n else if (value && typeof value === \"object\" && (value as any).id) rv[key] = (value as any).id;\n }\n if (field?.type === \"boolean\") bv[key] = !!value;\n }\n setRichTextValues(rt);\n setRelationValues(rv);\n setBooleanValues(bv);\n }\n }, [record, isNew, collection.fields]);\n\n useEffect(() => {\n if (!isNew) return;\n const form = formRef.current;\n if (!form) return;\n const listeners: { input: HTMLInputElement; fn: EventListener }[] = [];\n Object.entries(collection.fields).forEach(([name, field]) => {\n if (field.type === \"slug\" && field.ui.props?.from) {\n const src = form.querySelector(`[name=\"${field.ui.props.from}\"]`) as HTMLInputElement | null;\n const dst = form.querySelector(`[name=\"${name}\"]`) as HTMLInputElement | null;\n if (src && dst) {\n const fn = (e: Event) => {\n const val = (e.target as HTMLInputElement).value;\n dst.value = val.toLowerCase().replace(/\\s+/g, \"-\").replace(/[^a-z0-9-]/g, \"\");\n };\n src.addEventListener(\"input\", fn);\n listeners.push({ input: src, fn });\n }\n }\n });\n return () => listeners.forEach((l) => l.input.removeEventListener(\"input\", l.fn));\n }, [isNew, collection.fields]);\n\n const handleSubmit = useCallback(async (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n if (!canSave) return;\n setFieldErrors({});\n setSubmitError(null);\n const form = e.currentTarget;\n const formData = new FormData(form);\n const data: Record<string, unknown> = {};\n for (const [key, value] of formData.entries()) {\n if (value instanceof File) continue;\n const field = collection.fields[key];\n if (!hasAccess(field?.access, isNew ? \"create\" : \"update\", role)) continue;\n if (richTextValues[key]) { data[key] = richTextValues[key]; }\n else if (field?.type === \"boolean\") { continue; } // handled below from state\n else if (field?.type === \"relation\") { continue; }\n else { data[key] = value.toString(); }\n }\n // Merge boolean values from controlled state\n for (const [name, field] of Object.entries(collection.fields)) {\n if (field.type === \"boolean\" && hasAccess(field.access, isNew ? \"create\" : \"update\", role)) {\n data[name] = booleanValues[name] ?? false;\n }\n }\n for (const [key, val] of Object.entries(relationValues)) {\n if (collection.fields[key] && hasAccess(collection.fields[key]?.access, isNew ? \"create\" : \"update\", role)) {\n data[key] = val;\n }\n }\n const url = isNew ? `/api/${collection.name}` : `/api/${collection.name}/${record?.id}`;\n const method = isNew ? \"POST\" : \"PATCH\";\n const res = await fetch(url, { method, headers: { \"Content-Type\": \"application/json\" }, body: JSON.stringify(data) });\n if (res.ok) { window.location.href = `/admin/${collection.name}`; }\n else {\n const err = await res.json().catch(() => ({ error: \"Request failed\" }));\n if (err.fields) {\n const errors: Record<string, string> = {};\n for (const f of err.fields as { path: string; message: string }[]) errors[f.path] = f.message;\n setFieldErrors(errors);\n }\n setSubmitError(err.error ?? \"An error occurred\");\n }\n }, [collection, isNew, record?.id, richTextValues, relationValues, booleanValues, role, canSave]);\n\n const handleRichTextChange = useCallback((name: string, value: string) => {\n setRichTextValues((prev) => {\n const next = { ...prev, [name]: value };\n const hidden = formRef.current?.querySelector(`#${name}-hidden`) as HTMLInputElement | null;\n if (hidden) hidden.value = value;\n return next;\n });\n }, []);\n\n return (\n <form ref={formRef} onSubmit={handleSubmit} className=\"adminforge-form\">\n {submitError && <div className=\"adminforge-form-error\">{submitError}</div>}\n \n {!isNew && !!record?.id && (\n <div className=\"adminforge-field\">\n <label>Internal ID</label>\n <div style={{ display: 'flex', gap: '8px', alignItems: 'center' }}>\n <input \n type=\"text\" \n className=\"adminforge-input\" \n value={String(record.id)} \n readOnly \n style={{ background: '#f8fafc', color: '#64748b', fontFamily: 'monospace' }} \n />\n <button \n type=\"button\" \n className=\"adminforge-btn-icon\" \n title=\"Copy ID\"\n onClick={() => navigator.clipboard.writeText(String(record.id))}\n >\n <span className=\"material-symbols-outlined\">content_copy</span>\n </button>\n </div>\n </div>\n )}\n {Object.entries(collection.fields).map(([name, field]) => {\n const fv = field.type === \"relation\" && relationValues[name] !== undefined ? relationValues[name] : record?.[name];\n return (\n <FieldRenderer key={name} name={name} field={field} value={fv}\n onChange={(val) => handleRichTextChange(name, val)}\n onRelationChange={(val) => setRelationValues((prev) => ({ ...prev, [name]: val }))}\n checked={field.type === \"boolean\" ? (booleanValues[name] ?? false) : undefined}\n onCheckedChange={field.type === \"boolean\" ? (checked) => setBooleanValues((prev) => ({ ...prev, [name]: checked })) : undefined}\n error={fieldErrors[name]} role={role} />\n );\n })}\n {canSave && (\n <div className=\"adminforge-form-actions\">\n <button type=\"submit\" className=\"adminforge-btn adminforge-btn-primary\">\n {isNew ? \"Create\" : \"Save\"}\n </button>\n </div>\n )}\n </form>\n );\n}\n","\"use client\";\n\nimport { useEditor, EditorContent, Editor } from \"@tiptap/react\";\nimport { BubbleMenu } from \"@tiptap/react/menus\";\nimport StarterKit from \"@tiptap/starter-kit\";\nimport Link from \"@tiptap/extension-link\";\nimport Underline from \"@tiptap/extension-underline\";\nimport TextAlign from \"@tiptap/extension-text-align\";\nimport Placeholder from \"@tiptap/extension-placeholder\";\nimport Highlight from \"@tiptap/extension-highlight\";\nimport Subscript from \"@tiptap/extension-subscript\";\nimport Superscript from \"@tiptap/extension-superscript\";\nimport TaskList from \"@tiptap/extension-task-list\";\nimport TaskItem from \"@tiptap/extension-task-item\";\nimport HorizontalRule from \"@tiptap/extension-horizontal-rule\";\nimport Typography from \"@tiptap/extension-typography\";\nimport BubbleMenuExtension from \"@tiptap/extension-bubble-menu\";\nimport Image from \"@tiptap/extension-image\";\nimport { EditorView } from \"@tiptap/pm/view\";\nimport { Slice } from \"@tiptap/pm/model\";\nimport { useEffect, useState, useCallback } from \"react\";\n\ninterface RichTextEditorProps {\n name: string;\n value?: string;\n onChange: (value: string) => void;\n}\n\nfunction MenuButton({ \n onClick, \n isActive = false, \n disabled = false, \n icon, \n title \n}: { \n onClick: () => void; \n isActive?: boolean; \n disabled?: boolean; \n icon: string; \n title: string;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n className={`adminforge-editor-btn ${isActive ? \"active\" : \"\"}`}\n title={title}\n >\n <span className=\"material-symbols-outlined\" style={{ fontSize: '18px' }}>{icon}</span>\n </button>\n );\n}\n\nfunction Toolbar({ editor }: { editor: Editor | null }) {\n const setLink = useCallback(() => {\n if (!editor) return;\n const previousUrl = editor.getAttributes('link').href;\n const url = window.prompt('URL', previousUrl);\n\n if (url === null) return;\n if (url === '') {\n editor.chain().focus().extendMarkRange('link').unsetLink().run();\n return;\n }\n\n editor.chain().focus().extendMarkRange('link').setLink({ href: url }).run();\n }, [editor]);\n\n const addImage = useCallback(() => {\n if (!editor) return;\n \n const input = document.createElement('input');\n input.type = 'file';\n input.accept = 'image/*';\n input.onchange = async () => {\n const file = input.files?.[0];\n if (!file) return;\n\n const formData = new FormData();\n formData.append('file', file);\n\n try {\n const res = await fetch('/api/upload', {\n method: 'POST',\n body: formData,\n });\n if (!res.ok) throw new Error('Upload failed');\n const data = await res.json();\n editor.chain().focus().setImage({ src: data.url }).run();\n } catch (err) {\n alert('Failed to upload image');\n }\n };\n input.click();\n }, [editor]);\n\n if (!editor) return null;\n\n return (\n <div className=\"adminforge-editor-toolbar\">\n <div className=\"adminforge-editor-toolbar-group\">\n <MenuButton \n onClick={() => editor.chain().focus().undo().run()} \n disabled={!editor.can().undo()}\n icon=\"undo\" \n title=\"Undo\" \n />\n <MenuButton \n onClick={() => editor.chain().focus().redo().run()} \n disabled={!editor.can().redo()}\n icon=\"redo\" \n title=\"Redo\" \n />\n </div>\n\n <div className=\"adminforge-editor-toolbar-separator\" />\n\n <div className=\"adminforge-editor-toolbar-group\">\n <MenuButton \n onClick={() => editor.chain().focus().toggleHeading({ level: 1 }).run()} \n isActive={editor.isActive(\"heading\", { level: 1 })}\n icon=\"format_h1\" \n title=\"Heading 1\" \n />\n <MenuButton \n onClick={() => editor.chain().focus().toggleHeading({ level: 2 }).run()} \n isActive={editor.isActive(\"heading\", { level: 2 })}\n icon=\"format_h2\" \n title=\"Heading 2\" \n />\n <MenuButton \n onClick={() => editor.chain().focus().toggleHeading({ level: 3 }).run()} \n isActive={editor.isActive(\"heading\", { level: 3 })}\n icon=\"format_h3\" \n title=\"Heading 3\" \n />\n </div>\n\n <div className=\"adminforge-editor-toolbar-separator\" />\n\n <div className=\"adminforge-editor-toolbar-group\">\n <MenuButton \n onClick={() => editor.chain().focus().toggleBold().run()} \n isActive={editor.isActive(\"bold\")}\n icon=\"format_bold\" \n title=\"Bold\" \n />\n <MenuButton \n onClick={() => editor.chain().focus().toggleItalic().run()} \n isActive={editor.isActive(\"italic\")}\n icon=\"format_italic\" \n title=\"Italic\" \n />\n <MenuButton \n onClick={() => editor.chain().focus().toggleUnderline().run()} \n isActive={editor.isActive(\"underline\")}\n icon=\"format_underlined\" \n title=\"Underline\" \n />\n <MenuButton \n onClick={() => editor.chain().focus().toggleStrike().run()} \n isActive={editor.isActive(\"strike\")}\n icon=\"format_strikethrough\" \n title=\"Strikethrough\" \n />\n <MenuButton \n onClick={() => editor.chain().focus().toggleCode().run()} \n isActive={editor.isActive(\"code\")}\n icon=\"code\" \n title=\"Code\" \n />\n <MenuButton \n onClick={() => editor.chain().focus().toggleHighlight().run()} \n isActive={editor.isActive(\"highlight\")}\n icon=\"format_ink_highlighter\" \n title=\"Highlight\" \n />\n </div>\n\n <div className=\"adminforge-editor-toolbar-separator\" />\n\n <div className=\"adminforge-editor-toolbar-group\">\n <MenuButton \n onClick={setLink} \n isActive={editor.isActive(\"link\")}\n icon=\"link\" \n title=\"Link\" \n />\n <MenuButton \n onClick={addImage} \n icon=\"add_photo_alternate\" \n title=\"Add Image\" \n />\n <MenuButton \n onClick={() => editor.chain().focus().toggleSubscript().run()} \n isActive={editor.isActive(\"subscript\")}\n icon=\"subscript\" \n title=\"Subscript\" \n />\n <MenuButton \n onClick={() => editor.chain().focus().toggleSuperscript().run()} \n isActive={editor.isActive(\"superscript\")}\n icon=\"superscript\" \n title=\"Superscript\" \n />\n </div>\n\n <div className=\"adminforge-editor-toolbar-separator\" />\n\n <div className=\"adminforge-editor-toolbar-group\">\n <MenuButton \n onClick={() => editor.chain().focus().setTextAlign('left').run()} \n isActive={editor.isActive({ textAlign: 'left' })}\n icon=\"format_align_left\" \n title=\"Align Left\" \n />\n <MenuButton \n onClick={() => editor.chain().focus().setTextAlign('center').run()} \n isActive={editor.isActive({ textAlign: 'center' })}\n icon=\"format_align_center\" \n title=\"Align Center\" \n />\n <MenuButton \n onClick={() => editor.chain().focus().setTextAlign('right').run()} \n isActive={editor.isActive({ textAlign: 'right' })}\n icon=\"format_align_right\" \n title=\"Align Right\" \n />\n <MenuButton \n onClick={() => editor.chain().focus().setTextAlign('justify').run()} \n isActive={editor.isActive({ textAlign: 'justify' })}\n icon=\"format_align_justify\" \n title=\"Justify\" \n />\n </div>\n\n <div className=\"adminforge-editor-toolbar-separator\" />\n\n <div className=\"adminforge-editor-toolbar-group\">\n <MenuButton \n onClick={() => editor.chain().focus().toggleBulletList().run()} \n isActive={editor.isActive(\"bulletList\")}\n icon=\"format_list_bulleted\" \n title=\"Bullet List\" \n />\n <MenuButton \n onClick={() => editor.chain().focus().toggleOrderedList().run()} \n isActive={editor.isActive(\"orderedList\")}\n icon=\"format_list_numbered\" \n title=\"Ordered List\" \n />\n <MenuButton \n onClick={() => editor.chain().focus().toggleTaskList().run()} \n isActive={editor.isActive(\"taskList\")}\n icon=\"checklist\" \n title=\"Task List\" \n />\n </div>\n\n <div className=\"adminforge-editor-toolbar-separator\" />\n\n <div className=\"adminforge-editor-toolbar-group\">\n <MenuButton \n onClick={() => editor.chain().focus().toggleBlockquote().run()} \n isActive={editor.isActive(\"blockquote\")}\n icon=\"format_quote\" \n title=\"Blockquote\" \n />\n <MenuButton \n onClick={() => editor.chain().focus().toggleCodeBlock().run()} \n isActive={editor.isActive(\"codeBlock\")}\n icon=\"terminal\" \n title=\"Code Block\" \n />\n <MenuButton \n onClick={() => editor.chain().focus().setHorizontalRule().run()} \n icon=\"horizontal_rule\" \n title=\"Horizontal Rule\" \n />\n </div>\n </div>\n );\n}\n\nexport function RichTextEditor({ name, value = \"\", onChange }: RichTextEditorProps) {\n const editor = useEditor({\n extensions: [\n StarterKit.configure({\n horizontalRule: false,\n }),\n Link.configure({\n openOnClick: false,\n HTMLAttributes: {\n class: 'adminforge-editor-link',\n },\n }),\n Underline,\n TextAlign.configure({\n types: ['heading', 'paragraph', 'image'],\n }),\n Placeholder.configure({\n placeholder: 'Write something amazing...',\n }),\n Highlight,\n Subscript,\n Superscript,\n TaskList,\n TaskItem.configure({\n nested: true,\n }),\n HorizontalRule,\n Typography,\n BubbleMenuExtension,\n Image.extend({\n addAttributes() {\n return {\n ...this.parent?.(),\n width: {\n default: '100%',\n renderHTML: attributes => {\n return {\n style: `width: ${attributes.width}; height: auto;`,\n }\n }\n },\n textAlign: {\n default: 'left',\n parseHTML: element => element.style.textAlign || element.getAttribute('data-text-align'),\n renderHTML: attributes => {\n return {\n 'data-align': attributes.textAlign,\n }\n }\n }\n }\n }\n }).configure({\n allowBase64: true,\n HTMLAttributes: {\n class: 'adminforge-editor-image',\n },\n }),\n ],\n content: value,\n immediatelyRender: false,\n editorProps: {\n handleDrop: (view: EditorView, event: DragEvent, slice: Slice, moved: boolean) => {\n if (!moved && event.dataTransfer && event.dataTransfer.files && event.dataTransfer.files[0]) {\n const file = event.dataTransfer.files[0];\n if (file.type.startsWith('image/')) {\n const formData = new FormData();\n formData.append('file', file);\n fetch('/api/upload', { method: 'POST', body: formData })\n .then(res => res.json())\n .then(data => {\n if (data.url) {\n const { schema } = view.state;\n const coordinates = view.posAtCoords({ left: event.clientX, top: event.clientY });\n const node = schema.nodes.image.create({ src: data.url });\n const transaction = view.state.tr.insert(coordinates?.pos ?? 0, node);\n view.dispatch(transaction);\n }\n })\n .catch(() => alert('Upload failed'));\n return true;\n }\n }\n return false;\n },\n handlePaste: (view: EditorView, event: ClipboardEvent) => {\n if (event.clipboardData && event.clipboardData.files && event.clipboardData.files[0]) {\n const file = event.clipboardData.files[0];\n if (file.type.startsWith('image/')) {\n const formData = new FormData();\n formData.append('file', file);\n fetch('/api/upload', { method: 'POST', body: formData })\n .then(res => res.json())\n .then(data => {\n if (data.url) {\n const { schema } = view.state;\n const node = schema.nodes.image.create({ src: data.url });\n const transaction = view.state.tr.replaceSelectionWith(node);\n view.dispatch(transaction);\n }\n })\n .catch(() => alert('Upload failed'));\n return true;\n }\n }\n return false;\n },\n },\n onUpdate: ({ editor }: { editor: Editor }) => {\n onChange(editor.getHTML());\n },\n });\n\n useEffect(() => {\n if (editor && value !== editor.getHTML()) {\n editor.commands.setContent(value);\n }\n }, [value, editor]);\n\n if (!editor) {\n return null;\n }\n\n return (\n <div className=\"adminforge-editor-container\">\n <Toolbar editor={editor} />\n \n {editor && (\n <>\n {editor && (\n <BubbleMenu \n editor={editor} \n shouldShow={({ editor, state }) => {\n // Show if image is active or if we have a node selection on an image\n const isImage = editor.isActive('image') || (state.selection.content().content.firstChild?.type.name === 'image');\n return isImage || !state.selection.empty;\n }}\n options={{ duration: 100, zIndex: 9999 } as any}\n >\n <div className=\"adminforge-editor-bubble-menu\" style={{ zIndex: 10000 }}>\n {editor.isActive('image') ? (\n <>\n <button\n type=\"button\"\n onClick={() => editor.chain().focus().setTextAlign('left').run()}\n className={editor.isActive({ textAlign: 'left' }) ? 'active' : ''}\n >\n <span className=\"material-symbols-outlined\">format_align_left</span>\n </button>\n <button\n type=\"button\"\n onClick={() => editor.chain().focus().setTextAlign('center').run()}\n className={editor.isActive({ textAlign: 'center' }) ? 'active' : ''}\n >\n <span className=\"material-symbols-outlined\">format_align_center</span>\n </button>\n <button\n type=\"button\"\n onClick={() => editor.chain().focus().setTextAlign('right').run()}\n className={editor.isActive({ textAlign: 'right' }) ? 'active' : ''}\n >\n <span className=\"material-symbols-outlined\">format_align_right</span>\n </button>\n <div style={{ width: '1px', background: 'rgba(255,255,255,0.2)', margin: '4px 2px' }} />\n <button\n type=\"button\"\n onClick={() => editor.chain().focus().updateAttributes('image', { width: 'calc(25% - 1rem)' }).run()}\n style={{ fontSize: '11px', fontWeight: 'bold' }}\n >\n 25%\n </button>\n <button\n type=\"button\"\n onClick={() => editor.chain().focus().updateAttributes('image', { width: 'calc(50% - 1rem)' }).run()}\n style={{ fontSize: '11px', fontWeight: 'bold' }}\n >\n 50%\n </button>\n <button\n type=\"button\"\n onClick={() => editor.chain().focus().updateAttributes('image', { width: '100%' }).run()}\n style={{ fontSize: '11px', fontWeight: 'bold' }}\n >\n 100%\n </button>\n <div style={{ width: '1px', background: 'rgba(255,255,255,0.2)', margin: '4px 2px' }} />\n <button\n type=\"button\"\n onClick={() => editor.chain().focus().deleteSelection().run()}\n style={{ color: '#f87171' }}\n >\n <span className=\"material-symbols-outlined\">delete</span>\n </button>\n </>\n ) : (\n <>\n <button\n type=\"button\"\n onClick={() => editor.chain().focus().toggleBold().run()}\n className={editor.isActive('bold') ? 'active' : ''}\n >\n <span className=\"material-symbols-outlined\">format_bold</span>\n </button>\n <button\n type=\"button\"\n onClick={() => editor.chain().focus().toggleItalic().run()}\n className={editor.isActive('italic') ? 'active' : ''}\n >\n <span className=\"material-symbols-outlined\">format_italic</span>\n </button>\n <button\n type=\"button\"\n onClick={() => editor.chain().focus().toggleStrike().run()}\n className={editor.isActive('strike') ? 'active' : ''}\n >\n <span className=\"material-symbols-outlined\">format_strikethrough</span>\n </button>\n <button\n type=\"button\"\n onClick={() => editor.chain().focus().toggleHighlight().run()}\n className={editor.isActive('highlight') ? 'active' : ''}\n >\n <span className=\"material-symbols-outlined\">format_ink_highlighter</span>\n </button>\n </>\n )}\n </div>\n </BubbleMenu>\n )}\n </>\n )}\n\n <div className=\"adminforge-editor-content\">\n <EditorContent editor={editor} />\n </div>\n \n <style dangerouslySetInnerHTML={{ __html: `\n .adminforge-editor-container {\n border: 1px solid #e5e7eb;\n border-radius: 8px;\n overflow: hidden;\n background: white;\n display: flex;\n flex-direction: column;\n min-height: 400px;\n }\n \n .adminforge-editor-toolbar {\n display: flex;\n flex-wrap: wrap;\n padding: 8px;\n background: #f9fafb;\n border-bottom: 1px solid #e5e7eb;\n gap: 4px;\n }\n \n .adminforge-editor-toolbar-group {\n display: flex;\n gap: 2px;\n }\n \n .adminforge-editor-toolbar-separator {\n width: 1px;\n background: #e5e7eb;\n margin: 4px 2px;\n }\n \n .adminforge-editor-btn {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n border: none;\n background: transparent;\n color: #4b5563;\n cursor: pointer;\n transition: all 0.2s;\n }\n \n .adminforge-editor-btn:hover {\n background: #f3f4f6;\n color: #111827;\n }\n \n .adminforge-editor-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n \n .adminforge-editor-btn.active {\n background: #e5e7eb;\n color: #2563eb;\n }\n \n .adminforge-editor-content {\n padding: 16px;\n flex: 1;\n overflow-y: auto;\n }\n \n .ProseMirror {\n min-height: 300px;\n outline: none;\n }\n \n .ProseMirror p.is-editor-empty:first-child::before {\n content: attr(data-placeholder);\n float: left;\n color: #9ca3af;\n pointer-events: none;\n height: 0;\n }\n \n .adminforge-editor-link {\n color: #2563eb;\n text-decoration: underline;\n cursor: pointer;\n }\n \n .adminforge-editor-bubble-menu {\n display: flex;\n background: #1f2937;\n padding: 4px;\n border-radius: 6px;\n box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);\n gap: 2px;\n }\n \n .adminforge-editor-bubble-menu button {\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: transparent;\n color: white;\n border-radius: 4px;\n cursor: pointer;\n }\n \n .adminforge-editor-bubble-menu button:hover {\n background: #374151;\n }\n \n .adminforge-editor-bubble-menu button.active {\n color: #60a5fa;\n background: #374151;\n }\n \n .adminforge-editor-bubble-menu .material-symbols-outlined {\n font-size: 16px;\n }\n\n /* Task list styles */\n ul[data-type=\"taskList\"] {\n list-style: none;\n padding: 0;\n }\n\n ul[data-type=\"taskList\"] li {\n display: flex;\n align-items: flex-start;\n margin-bottom: 0.5rem;\n }\n\n ul[data-type=\"taskList\"] li > label {\n margin-right: 0.5rem;\n user-select: none;\n }\n\n ul[data-type=\"taskList\"] li > div {\n flex: 1;\n }\n\n .adminforge-editor-image {\n max-width: 100% !important;\n height: auto !important;\n border-radius: 8px;\n margin: 0.5rem;\n display: inline-block;\n vertical-align: middle;\n transition: all 0.2s;\n }\n\n /* Float logic for text wrapping and alignment */\n .adminforge-editor-image[data-align=\"left\"] {\n float: left;\n margin-left: 0;\n margin-right: 1.5rem;\n display: block; /* block + float is standard */\n }\n \n .adminforge-editor-image[data-align=\"right\"] {\n float: right;\n margin-right: 0;\n margin-left: 1.5rem;\n display: block;\n }\n \n .adminforge-editor-image[data-align=\"center\"] {\n display: block;\n margin-left: auto;\n margin-right: auto;\n float: none;\n }\n\n /* Clearfix for the parent paragraph to contain floats */\n .ProseMirror p::after {\n content: \"\";\n display: table;\n clear: both;\n }\n\n .adminforge-editor-image.ProseMirror-selectednode {\n outline: 3px solid #2563eb;\n }\n ` }} />\n </div>\n );\n}\n","\"use client\";\n\nimport { useState, useRef } from \"react\";\nimport { useAdminForge } from \"../AdminForgeContext.js\";\n\ninterface ImageUploadProps {\n name: string;\n value?: string;\n onChange: (value: string) => void;\n}\n\nexport function ImageUpload({ name, value, onChange }: ImageUploadProps) {\n const { apiBase } = useAdminForge();\n const [uploading, setUploading] = useState(false);\n const [preview, setPreview] = useState(value ?? \"\");\n const inputRef = useRef<HTMLInputElement>(null);\n\n async function handleFile(e: React.ChangeEvent<HTMLInputElement>) {\n const file = e.target.files?.[0];\n if (!file) return;\n\n setUploading(true);\n const formData = new FormData();\n formData.append(\"file\", file);\n\n try {\n const res = await fetch(`${apiBase}/_media`, {\n method: \"POST\",\n body: formData,\n });\n if (!res.ok) throw new Error(\"Upload failed\");\n const data = await res.json();\n onChange(data.url);\n setPreview(data.url);\n } catch {\n alert(\"Upload failed\");\n } finally {\n setUploading(false);\n }\n }\n\n return (\n <div className=\"adminforge-field\">\n <label>{(name.charAt(0).toUpperCase() + name.slice(1))} Image</label>\n <input\n ref={inputRef}\n type=\"file\"\n accept=\"image/*\"\n onChange={handleFile}\n style={{ display: \"none\" }}\n />\n <div className=\"adminforge-image-upload\">\n {preview && (\n <img src={preview} alt=\"Preview\" className=\"adminforge-image-preview\" />\n )}\n <button\n type=\"button\"\n className=\"adminforge-btn adminforge-btn-secondary\"\n onClick={() => inputRef.current?.click()}\n disabled={uploading}\n >\n {uploading ? \"Uploading...\" : preview ? \"Replace Image\" : \"Choose Image\"}\n </button>\n </div>\n <input type=\"hidden\" name={name} value={preview} />\n </div>\n );\n}\n","\"use client\";\n\nimport React, { createContext, useContext } from \"react\";\nimport type { AdminForgeConfig } from \"../core/index.js\";\n\ninterface AdminForgeContextType {\n config: AdminForgeConfig | undefined;\n apiBase: string;\n unauthorized: boolean;\n}\n\nconst AdminForgeContext = createContext<AdminForgeContextType>({ \n config: undefined, \n apiBase: \"/api/adminforge\",\n unauthorized: false \n});\n\nexport function AdminForgeProvider({ \n children, \n config: initialConfig, \n apiBase = \"/api\" \n}: { \n children: React.ReactNode; \n config?: AdminForgeConfig;\n apiBase?: string;\n}) {\n const [config, setConfig] = React.useState<AdminForgeConfig | undefined>(initialConfig);\n const [unauthorized, setUnauthorized] = React.useState(false);\n\n React.useEffect(() => {\n // 1. Inject Material Symbols if missing\n if (typeof document !== \"undefined\" && !document.getElementById(\"adminforge-fonts\")) {\n const link = document.createElement(\"link\");\n link.id = \"adminforge-fonts\";\n link.rel = \"stylesheet\";\n link.href = \"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200\";\n document.head.appendChild(link);\n }\n\n // 2. Auto-fetch config if not provided\n if (!config) {\n fetch(`${apiBase}/_config`)\n .then(res => {\n if (res.status === 401) {\n setUnauthorized(true);\n return null;\n }\n return res.ok ? res.json() : null;\n })\n .then(cfg => cfg?.collections ? setConfig(cfg) : null)\n .catch(e => console.error(\"[AdminForge] Failed to fetch config:\", e));\n }\n }, [config, apiBase]);\n\n return (\n <AdminForgeContext.Provider value={{ config, apiBase, unauthorized }}>\n {children}\n </AdminForgeContext.Provider>\n );\n}\n\nexport function useAdminForge() {\n return useContext(AdminForgeContext);\n}\n","import { useEffect, useState, useRef } from \"react\";\n\ninterface RelationInputProps {\n name: string;\n to: string;\n relationType?: string;\n value?: string | string[];\n onChange?: (val: string | string[]) => void;\n error?: string;\n disabled?: boolean;\n}\n\nexport function RelationInput({ name, to, relationType, value, onChange, error, disabled }: RelationInputProps) {\n const [options, setOptions] = useState<any[]>([]);\n const [loading, setLoading] = useState(true);\n const [search, setSearch] = useState(\"\");\n const [open, setOpen] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n setOpen(false);\n }\n }\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, []);\n\n const isMulti = relationType === \"many-to-many\" || relationType === \"one-to-many\";\n \n // Normalize value to array of strings for easier handling\n const rawValueArray = Array.isArray(value) ? value : value ? [value] : [];\n const selectedIds = rawValueArray.map((v: any) => typeof v === \"object\" && v !== null ? v.id : v).filter(Boolean);\n\n useEffect(() => {\n let mounted = true;\n async function fetchOptions() {\n try {\n setLoading(true);\n const res = await fetch(`/api/${to}?pageSize=100`);\n const json = await res.json();\n if (mounted && json.data) {\n const uniqueOptions = [];\n const seen = new Set();\n const getLbl = (opt: any) => opt.name || opt.title || opt.label || opt.id;\n for (const opt of json.data) {\n const lbl = getLbl(opt);\n if (!seen.has(lbl)) {\n seen.add(lbl);\n uniqueOptions.push(opt);\n }\n }\n setOptions(uniqueOptions);\n }\n } catch (err) {\n console.error(\"Failed to fetch relations\", err);\n } finally {\n if (mounted) setLoading(false);\n }\n }\n fetchOptions();\n return () => {\n mounted = false;\n };\n }, [to]);\n\n const getLabel = (opt: any) => opt.name || opt.title || opt.label || opt.id;\n\n const filteredOptions = options.filter((o) =>\n getLabel(o).toLowerCase().includes(search.toLowerCase())\n );\n\n const toggleOption = (id: string) => {\n if (isMulti) {\n const newIds = selectedIds.includes(id)\n ? selectedIds.filter(v => v !== id)\n : [...selectedIds, id];\n onChange?.(newIds);\n } else {\n onChange?.(id);\n setOpen(false);\n setSearch(\"\");\n }\n };\n\n const removeOption = (e: React.MouseEvent, id: string) => {\n e.stopPropagation();\n if (disabled) return;\n onChange?.(selectedIds.filter(v => v !== id));\n };\n\n return (\n <div className=\"adminforge-relation\" ref={containerRef} style={{ position: \"relative\" }}>\n {/* Hidden inputs for native form submission */}\n {selectedIds.length === 0 && <input type=\"hidden\" name={name} value=\"\" />}\n {selectedIds.map(id => (\n <input key={id} type=\"hidden\" name={name} value={id} />\n ))}\n \n <div \n className={`adminforge-input ${error ? \"adminforge-input-error\" : \"\"}`}\n style={{ \n position: \"relative\", \n cursor: disabled ? \"not-allowed\" : \"pointer\", \n minHeight: \"38px\", \n display: \"flex\", \n alignItems: \"center\",\n flexWrap: \"wrap\",\n gap: \"4px\",\n padding: \"4px 8px\",\n opacity: disabled ? 0.6 : 1,\n }}\n onClick={() => !disabled && setOpen(!open)}\n >\n {selectedIds.length > 0 ? (\n selectedIds.map(id => {\n const opt = options.find(o => o.id === id);\n const label = opt ? getLabel(opt) : id;\n if (isMulti) {\n return (\n <span key={id} style={{\n background: \"#e0e0e0\",\n padding: \"2px 6px\",\n borderRadius: \"4px\",\n fontSize: \"14px\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"4px\"\n }}>\n {label}\n <button\n type=\"button\"\n onClick={(e) => removeOption(e, id)}\n style={{ background: \"none\", border: \"none\", cursor: \"pointer\", padding: \"0 2px\", fontWeight: \"bold\" }}\n >×</button>\n </span>\n );\n }\n return <span key={id}>{label}</span>;\n })\n ) : (\n <span style={{ color: \"#888\" }}>Select...</span>\n )}\n </div>\n\n {open && (\n <div \n style={{\n position: \"absolute\",\n zIndex: 10,\n background: \"white\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n marginTop: \"4px\",\n width: \"100%\",\n maxHeight: \"250px\",\n overflowY: \"auto\",\n boxShadow: \"0 4px 6px rgba(0,0,0,0.1)\"\n }}\n >\n <div style={{ padding: \"8px\", borderBottom: \"1px solid #eee\" }}>\n <input\n type=\"text\"\n placeholder=\"Search...\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n onClick={(e) => e.stopPropagation()}\n style={{\n width: \"100%\",\n padding: \"4px 8px\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\"\n }}\n />\n </div>\n {loading ? (\n <div style={{ padding: \"8px\", color: \"#888\" }}>Loading...</div>\n ) : filteredOptions.length === 0 ? (\n <div style={{ padding: \"8px\", color: \"#888\" }}>No options found</div>\n ) : (\n <ul style={{ listStyle: \"none\", margin: 0, padding: 0 }}>\n {filteredOptions.map((opt) => {\n const isSelected = selectedIds.includes(opt.id);\n return (\n <li\n key={opt.id}\n style={{\n padding: \"8px 12px\",\n cursor: \"pointer\",\n background: isSelected ? \"#f0f0f0\" : \"transparent\",\n display: \"flex\",\n justifyContent: \"space-between\"\n }}\n onMouseEnter={(e) => (e.currentTarget.style.background = \"#f9f9f9\")}\n onMouseLeave={(e) => (e.currentTarget.style.background = isSelected ? \"#f0f0f0\" : \"transparent\")}\n onClick={(e) => {\n e.stopPropagation();\n toggleOption(opt.id);\n }}\n >\n {getLabel(opt)}\n {isSelected && isMulti && <span style={{ color: \"#417690\" }}>✓</span>}\n </li>\n );\n })}\n </ul>\n )}\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport type { AdminForgeConfig, CollectionDefinition } from \"../../core\";\nimport { AdminLayout } from \"../components/AdminLayout.js\";\nimport { FormEngine } from \"../form-engine/FormEngine.js\";\nimport Link from \"next/link\";\nimport { useAdminSession } from \"../../auth/provider.js\";\n\ninterface CollectionFormPageProps {\n config: AdminForgeConfig;\n collection: CollectionDefinition;\n record?: Record<string, unknown> | null;\n isNew: boolean;\n role?: string;\n}\n\nfunction formatDate(date: Date) {\n if (isNaN(date.getTime())) return \"Invalid date\";\n return date.toLocaleString('en-US', { \n month: 'short', \n day: 'numeric', \n year: 'numeric', \n hour: 'numeric', \n minute: '2-digit',\n hour12: true \n });\n}\n\nexport function CollectionFormPage({ config, collection, record, isNew, role: propRole }: CollectionFormPageProps) {\n const session = useAdminSession();\n const role = propRole || session?.role || session?.user?.role;\n\n return (\n <AdminLayout config={config} currentPath={`/admin/${collection.name}`} role={role}>\n <div className=\"adminforge-collection-page\">\n <div className=\"adminforge-page-header\">\n <div style={{ display: 'flex', alignItems: 'center', gap: '16px' }}>\n <h2 style={{ fontSize: '24px', fontWeight: 700, margin: 0 }}>{isNew ? `Create ${collection.label}` : `Edit ${collection.label}`}</h2>\n {!isNew && (\n <span className=\"adminforge-badge\" style={{ background: '#f8fafc', color: '#64748b', borderColor: '#e2e8f0', fontSize: '11px' }}>\n ID: {String(record?.id).substring(0, 8)}...\n </span>\n )}\n </div>\n <div style={{ display: 'flex', gap: '12px' }}>\n {!isNew && (\n <button\n className=\"adminforge-btn adminforge-btn-danger\"\n onClick={async () => {\n if (confirm(\"Are you sure you want to delete this item?\")) {\n const res = await fetch(`/api/${collection.name}/${record?.id}`, { method: 'DELETE' });\n if (res.ok) {\n window.location.href = `/admin/${collection.name}`;\n } else {\n const err = await res.json();\n alert(err.error || \"Failed to delete item\");\n }\n }\n }}\n >\n <span className=\"material-symbols-outlined\" style={{ fontSize: '20px', marginRight: '8px' }}>delete</span>\n Delete\n </button>\n )}\n <Link href={`/admin/${collection.name}`} className=\"adminforge-btn adminforge-btn-secondary\">\n <span className=\"material-symbols-outlined\" style={{ fontSize: '20px', marginRight: '8px' }}>arrow_back</span>\n Back\n </Link>\n </div>\n </div>\n\n <div style={{ display: 'flex', flexDirection: 'column', gap: '24px' }}>\n <FormEngine collection={collection} record={record} isNew={isNew} role={role} />\n \n {!isNew && record && (\n <div style={{ \n padding: '24px', \n background: 'var(--color-surface)', \n border: '1px solid var(--color-border)', \n borderRadius: 'var(--radius-lg)',\n boxShadow: 'var(--shadow-sm)'\n }}>\n <h3 style={{ \n fontSize: '14px', \n fontWeight: 600, \n color: '#64748b', \n marginBottom: '20px', \n display: 'flex', \n alignItems: 'center', \n gap: '10px',\n textTransform: 'uppercase',\n letterSpacing: '0.025em'\n }}>\n <span className=\"material-symbols-outlined\" style={{ fontSize: '20px', color: 'var(--color-primary)' }}>info</span>\n System Information\n </h3>\n \n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(280px, 1fr))', gap: '32px' }}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n <div style={{ fontSize: '11px', fontWeight: 700, color: '#94a3b8', textTransform: 'uppercase' }}>Created</div>\n <div style={{ display: 'flex', alignItems: 'center', gap: '12px' }}>\n <div style={{ width: '32px', height: '32px', borderRadius: '50%', background: '#f1f5f9', display: 'flex', alignItems: 'center', justifyContent: 'center', color: '#64748b' }}>\n <span className=\"material-symbols-outlined\" style={{ fontSize: '18px' }}>person</span>\n </div>\n <div>\n <div style={{ fontSize: '14px', color: 'var(--color-text)', fontWeight: 500 }}>Admin</div>\n <div style={{ fontSize: '12px', color: '#64748b' }}>\n {record.createdAt ? formatDate(new Date(record.createdAt as string)) : 'Unknown date'}\n </div>\n </div>\n </div>\n </div>\n\n <div style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n <div style={{ fontSize: '11px', fontWeight: 700, color: '#94a3b8', textTransform: 'uppercase' }}>Last Updated</div>\n <div style={{ display: 'flex', alignItems: 'center', gap: '12px' }}>\n <div style={{ width: '32px', height: '32px', borderRadius: '50%', background: '#f0f9ff', display: 'flex', alignItems: 'center', justifyContent: 'center', color: '#0284c7' }}>\n <span className=\"material-symbols-outlined\" style={{ fontSize: '18px' }}>edit_note</span>\n </div>\n <div>\n <div style={{ fontSize: '14px', color: 'var(--color-text)', fontWeight: 500 }}>Admin</div>\n <div style={{ fontSize: '12px', color: '#64748b' }}>\n {(record.updatedAt || record.createdAt) ? formatDate(new Date((record.updatedAt || record.createdAt) as string)) : 'Unknown date'}\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n </AdminLayout>\n );\n}\n","\"use client\";\n\nimport type { AdminForgeConfig, CollectionDefinition, FieldDefinition } from \"../../core\";\nimport { AdminLayout } from \"../components/AdminLayout.js\";\nimport Link from \"next/link\";\nimport { useEffect, useState } from \"react\";\n\ninterface CollectionSchemaPageProps {\n config: AdminForgeConfig;\n collection: CollectionDefinition;\n role?: string;\n}\n\nfunction formatFullTimestamp(date: Date) {\n if (isNaN(date.getTime())) return \"Unknown\";\n return new Intl.DateTimeFormat('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n hour12: true\n }).format(date);\n}\n\nexport function CollectionSchemaPage({ config, collection, role }: CollectionSchemaPageProps) {\n const [lastActivity, setLastActivity] = useState<string>(\"Loading...\");\n\n useEffect(() => {\n fetch(`/api/${collection.name}?pageSize=1`)\n .then(res => res.json())\n .then(result => {\n const item = result.data?.[0];\n if (item) {\n const dateStr = item.updatedAt || item.updated_at || item.createdAt || item.created_at;\n if (dateStr) {\n setLastActivity(formatFullTimestamp(new Date(dateStr)));\n } else {\n setLastActivity(\"No date info\");\n }\n } else {\n setLastActivity(\"No activity\");\n }\n })\n .catch(() => setLastActivity(\"Unknown\"));\n }, [collection.name]);\n\n const getFieldIcon = (type: string) => {\n switch (type) {\n case \"text\": return \"text_fields\";\n case \"slug\": return \"link\";\n case \"richText\": return \"description\";\n case \"boolean\": return \"toggle_on\";\n case \"image\": return \"image\";\n case \"relation\": return \"account_tree\";\n case \"date\": return \"calendar_today\";\n default: return \"label\";\n }\n };\n\n return (\n <AdminLayout config={config} currentPath={`/admin/${collection.name}`} role={role}>\n <div className=\"adminforge-schema-page\">\n <div style={{ marginBottom: '32px', display: 'flex', justifyContent: 'space-between', alignItems: 'flex-end' }}>\n <div>\n <Link href=\"/admin\" style={{ display: 'flex', alignItems: 'center', gap: '4px', fontSize: '14px', color: 'var(--color-text-secondary)', marginBottom: '16px', textDecoration: 'none' }}>\n <span className=\"material-symbols-outlined\" style={{ fontSize: '18px' }}>arrow_back</span>\n Back to Collection Registry\n </Link>\n <div style={{ display: 'flex', alignItems: 'center', gap: '12px' }}>\n <h1 style={{ fontSize: '32px', fontWeight: 700 }}>{collection.label} Schema</h1>\n <span className=\"adminforge-badge\" style={{ background: '#f8fafc', color: '#64748b', borderColor: '#e2e8f0', fontSize: '11px', fontWeight: 600 }}>\n defined in adminforge.ts\n </span>\n </div>\n </div>\n </div>\n\n <div style={{ display: 'grid', gridTemplateColumns: '1fr 340px', gap: '24px', alignItems: 'start' }}>\n <div className=\"adminforge-card\" style={{ border: '1px solid var(--color-border)', borderRadius: 'var(--radius-lg)', overflow: 'hidden' }}>\n <div style={{ padding: '24px', borderBottom: '1px solid var(--color-border)' }}>\n <h3 style={{ fontSize: '18px', fontWeight: 600 }}>Field Definitions</h3>\n </div>\n <table className=\"adminforge-table\">\n <thead>\n <tr>\n <th style={{ fontSize: '12px', color: 'var(--color-text-secondary)' }}>FIELD NAME</th>\n <th style={{ fontSize: '12px', color: 'var(--color-text-secondary)' }}>TYPE</th>\n <th style={{ fontSize: '12px', color: 'var(--color-text-secondary)' }}>PROPERTIES</th>\n </tr>\n </thead>\n <tbody>\n {Object.entries(collection.fields).map(([name, field]) => (\n <tr key={name}>\n <td style={{ fontWeight: 600 }}>{name}</td>\n <td>\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n <span className=\"material-symbols-outlined\" style={{ fontSize: '20px', color: 'var(--color-text-secondary)' }}>\n {getFieldIcon(field.type)}\n </span>\n <span>{field.type}</span>\n </div>\n </td>\n <td>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: '4px' }}>\n {field.meta?.required && <span className=\"adminforge-badge adminforge-badge-danger\" style={{ fontSize: '11px' }}>required</span>}\n {field.meta?.unique && <span className=\"adminforge-badge adminforge-badge-primary\" style={{ fontSize: '11px' }}>unique</span>}\n {!!field.ui.props?.from && <span className=\"adminforge-badge adminforge-badge-secondary\" style={{ fontSize: '11px' }}>from: {String(field.ui.props.from)}</span>}\n {!!field.ui.props?.to && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '2px' }}>\n <span style={{ fontSize: '12px' }}>to: <strong>{String(field.ui.props.to)}</strong></span>\n <span className=\"adminforge-badge adminforge-badge-secondary\" style={{ fontSize: '10px', alignSelf: 'flex-start' }}>{String(field.ui.props.relationType)}</span>\n </div>\n )}\n {field.meta?.default !== undefined && <span style={{ fontSize: '12px', color: 'var(--color-text-secondary)' }}>default: <code>{JSON.stringify(field.meta.default)}</code></span>}\n {!field.meta?.required && !field.meta?.unique && !field.ui.props?.from && !field.ui.props?.to && <span style={{ color: 'var(--color-text-secondary)' }}>-</span>}\n </div>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n\n <div className=\"adminforge-card\" style={{ padding: '24px', border: '1px solid var(--color-border)', borderRadius: 'var(--radius-lg)' }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '12px', marginBottom: '24px' }}>\n <span className=\"material-symbols-outlined\" style={{ color: 'var(--color-text-secondary)' }}>info</span>\n <h3 style={{ fontSize: '18px', fontWeight: 600 }}>Collection Meta</h3>\n </div>\n\n <div style={{ marginBottom: '20px' }}>\n <label style={{ fontSize: '12px', fontWeight: 700, color: 'var(--color-text-secondary)', textTransform: 'uppercase', marginBottom: '8px', display: 'block' }}>Collection Name</label>\n <code style={{ background: '#f1f5f9', padding: '4px 8px', borderRadius: '4px', fontSize: '14px' }}>{collection.name}</code>\n </div>\n\n <div style={{ marginBottom: '20px' }}>\n <label style={{ fontSize: '12px', fontWeight: 700, color: 'var(--color-text-secondary)', textTransform: 'uppercase', marginBottom: '8px', display: 'block' }}>UI Label</label>\n <span style={{ fontSize: '16px', fontWeight: 500 }}>{collection.label}</span>\n </div>\n\n <div style={{ marginBottom: '24px', paddingBottom: '24px', borderBottom: '1px solid var(--color-border)' }}>\n <label style={{ fontSize: '12px', fontWeight: 700, color: 'var(--color-text-secondary)', textTransform: 'uppercase', marginBottom: '8px', display: 'block' }}>Last Activity</label>\n <span style={{ fontSize: '14px', color: 'var(--color-text-secondary)' }}>{lastActivity}</span>\n </div>\n\n <div>\n <label style={{ fontSize: '12px', fontWeight: 700, color: 'var(--color-text-secondary)', textTransform: 'uppercase', marginBottom: '16px', display: 'block' }}>Access Rules</label>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '12px' }}>\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n <span style={{ fontSize: '14px' }}>Create</span>\n <div style={{ display: 'flex', gap: '4px' }}>\n {(collection.access?.create || ['admin']).map(role => (\n <span key={role} className=\"adminforge-badge adminforge-badge-secondary\" style={{ fontSize: '11px' }}>{role}</span>\n ))}\n </div>\n </div>\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n <span style={{ fontSize: '14px' }}>Update</span>\n <div style={{ display: 'flex', gap: '4px' }}>\n {(collection.access?.update || ['admin']).map(role => (\n <span key={role} className=\"adminforge-badge adminforge-badge-secondary\" style={{ fontSize: '11px' }}>{role}</span>\n ))}\n </div>\n </div>\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n <span style={{ fontSize: '14px' }}>Delete</span>\n <div style={{ display: 'flex', gap: '4px' }}>\n {(collection.access?.delete || ['admin']).map(role => (\n <span key={role} className=\"adminforge-badge adminforge-badge-danger\" style={{ fontSize: '11px', background: '#fee2e2', color: '#b91c1c' }}>{role}</span>\n ))}\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </AdminLayout>\n );\n}\n","\"use client\";\n\nimport type { AdminForgeConfig } from \"../../core\";\nimport { AdminLayout } from \"../components/AdminLayout.js\";\nimport Link from \"next/link\";\n\ninterface RolesListPageProps {\n config: AdminForgeConfig;\n role?: string;\n}\n\nexport function RolesListPage({ config, role }: RolesListPageProps) {\n const roles = Object.entries(config.auth?.roles || {});\n\n return (\n <AdminLayout config={config} currentPath=\"/admin/roles\" role={role}>\n <div className=\"adminforge-collection-page\">\n <div className=\"adminforge-page-header\">\n <h2 style={{ fontSize: '24px', fontWeight: 700, margin: 0 }}>Roles</h2>\n </div>\n\n <div style={{ background: 'var(--color-surface)', border: '1px solid var(--color-border)', borderRadius: 'var(--radius-lg)', overflow: 'hidden', boxShadow: 'var(--shadow-sm)' }}>\n <table className=\"adminforge-table\" style={{ width: '100%', borderCollapse: 'collapse' }}>\n <thead>\n <tr style={{ background: '#fcfcfd', borderBottom: '1px solid var(--color-border)' }}>\n <th style={{ textAlign: 'left', padding: '16px 24px', fontSize: '13px', fontWeight: 600, color: '#64748b', textTransform: 'uppercase', letterSpacing: '0.05em' }}>Role Name</th>\n <th style={{ textAlign: 'left', padding: '16px 24px', fontSize: '13px', fontWeight: 600, color: '#64748b', textTransform: 'uppercase', letterSpacing: '0.05em' }}>Label</th>\n <th style={{ textAlign: 'right', padding: '16px 24px', fontSize: '13px', fontWeight: 600, color: '#64748b', textTransform: 'uppercase', letterSpacing: '0.05em' }}>Actions</th>\n </tr>\n </thead>\n <tbody>\n {roles.map(([key, roleDef]) => (\n <tr key={key} style={{ borderBottom: '1px solid var(--color-border)' }}>\n <td style={{ padding: '16px 24px', fontSize: '14px', color: 'var(--color-text)', fontWeight: 500 }}>\n <code>{key}</code>\n </td>\n <td style={{ padding: '16px 24px', fontSize: '14px', color: 'var(--color-text-secondary)' }}>\n {roleDef.label}\n </td>\n <td style={{ padding: '16px 24px', textAlign: 'right' }}>\n <Link \n href={`/admin/roles/${key}`} \n className=\"adminforge-btn adminforge-btn-secondary\"\n style={{ padding: '6px 12px', fontSize: '13px' }}\n >\n View Permissions\n </Link>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n </AdminLayout>\n );\n}\n","\"use client\";\n\nimport type { AdminForgeConfig, CollectionDefinition, AccessConfig } from \"../../core\";\nimport { AdminLayout } from \"../components/AdminLayout.js\";\nimport Link from \"next/link\";\n\ninterface RoleDetailPageProps {\n config: AdminForgeConfig;\n roleId: string;\n role?: string;\n}\n\nfunction hasAccess(access: AccessConfig | undefined, operation: string, roleName: string): boolean {\n if (!access) return true;\n const allowed = access[operation as keyof AccessConfig];\n if (!allowed || !Array.isArray(allowed)) return true;\n return allowed.includes(roleName);\n}\n\nexport function RoleDetailPage({ config, roleId, role }: RoleDetailPageProps) {\n const roleDef = config.auth?.roles?.[roleId];\n if (!roleDef) {\n return (\n <AdminLayout config={config} currentPath=\"/admin/roles\" role={role}>\n <div className=\"adminforge-collection-page\">\n <div className=\"adminforge-page-header\">\n <h2 style={{ fontSize: '24px', fontWeight: 700, margin: 0 }}>Role not found</h2>\n </div>\n <Link href=\"/admin/roles\" className=\"adminforge-btn adminforge-btn-secondary\">Back to Roles</Link>\n </div>\n </AdminLayout>\n );\n }\n\n return (\n <AdminLayout config={config} currentPath=\"/admin/roles\" role={role}>\n <div className=\"adminforge-collection-page\">\n <div className=\"adminforge-page-header\">\n <div style={{ display: 'flex', alignItems: 'center', gap: '16px' }}>\n <Link href=\"/admin/roles\" className=\"adminforge-btn-icon\" style={{ border: '1px solid var(--color-border)', background: 'white' }}>\n <span className=\"material-symbols-outlined\">arrow_back</span>\n </Link>\n <h2 style={{ fontSize: '24px', fontWeight: 700, margin: 0 }}>Role: {roleDef.label || roleId}</h2>\n </div>\n <div className=\"adminforge-badge\" style={{ background: '#f8fafc', color: '#64748b', borderColor: '#e2e8f0', fontSize: '11px', fontWeight: 600 }}>\n Read-only Config\n </div>\n </div>\n\n <div style={{ marginBottom: '32px' }}>\n <h3 style={{ fontSize: '16px', fontWeight: 600, marginBottom: '16px', color: 'var(--color-text)' }}>Permissions Matrix</h3>\n <div style={{ background: 'var(--color-surface)', border: '1px solid var(--color-border)', borderRadius: 'var(--radius-lg)', overflow: 'hidden', boxShadow: 'var(--shadow-sm)' }}>\n <table className=\"adminforge-table\" style={{ width: '100%', borderCollapse: 'collapse' }}>\n <thead>\n <tr style={{ background: '#fcfcfd', borderBottom: '1px solid var(--color-border)' }}>\n <th style={{ textAlign: 'left', padding: '16px 24px', fontSize: '13px', fontWeight: 600, color: '#64748b', textTransform: 'uppercase', letterSpacing: '0.05em' }}>Collection</th>\n <th style={{ textAlign: 'center', padding: '16px 24px', fontSize: '13px', fontWeight: 600, color: '#64748b', textTransform: 'uppercase', letterSpacing: '0.05em' }}>Read</th>\n <th style={{ textAlign: 'center', padding: '16px 24px', fontSize: '13px', fontWeight: 600, color: '#64748b', textTransform: 'uppercase', letterSpacing: '0.05em' }}>Create</th>\n <th style={{ textAlign: 'center', padding: '16px 24px', fontSize: '13px', fontWeight: 600, color: '#64748b', textTransform: 'uppercase', letterSpacing: '0.05em' }}>Update</th>\n <th style={{ textAlign: 'center', padding: '16px 24px', fontSize: '13px', fontWeight: 600, color: '#64748b', textTransform: 'uppercase', letterSpacing: '0.05em' }}>Delete</th>\n </tr>\n </thead>\n <tbody>\n {config.collections.map((collection) => {\n const canRead = hasAccess(collection.access, 'read', roleId);\n const canCreate = hasAccess(collection.access, 'create', roleId);\n const canUpdate = hasAccess(collection.access, 'update', roleId);\n const canDelete = hasAccess(collection.access, 'delete', roleId);\n\n return (\n <tr key={collection.name} style={{ borderBottom: '1px solid var(--color-border)' }}>\n <td style={{ padding: '16px 24px', fontSize: '14px', fontWeight: 600, color: 'var(--color-text)' }}>\n {collection.label || collection.name}\n </td>\n <td style={{ padding: '16px 24px', textAlign: 'center' }}>\n <PermissionStatus allowed={canRead} />\n </td>\n <td style={{ padding: '16px 24px', textAlign: 'center' }}>\n <PermissionStatus allowed={canCreate} />\n </td>\n <td style={{ padding: '16px 24px', textAlign: 'center' }}>\n <PermissionStatus allowed={canUpdate} />\n </td>\n <td style={{ padding: '16px 24px', textAlign: 'center' }}>\n <PermissionStatus allowed={canDelete} />\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n </div>\n\n <div>\n <h3 style={{ fontSize: '16px', fontWeight: 600, marginBottom: '16px', color: 'var(--color-text)' }}>Field-Level Overrides</h3>\n {config.collections.map((collection) => {\n const fieldsWithAccess = Object.entries(collection.fields).filter(([_, field]) => field.access);\n if (fieldsWithAccess.length === 0) return null;\n\n return (\n <div key={collection.name} style={{ marginBottom: '24px', padding: '20px', border: '1px solid var(--color-border)', borderRadius: 'var(--radius-lg)', background: 'white' }}>\n <h4 style={{ fontSize: '14px', fontWeight: 600, marginBottom: '12px', color: 'var(--color-text-secondary)' }}>{collection.label || collection.name}</h4>\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fill, minmax(250px, 1fr))', gap: '12px' }}>\n {fieldsWithAccess.map(([name, field]) => {\n const canRead = hasAccess(field.access, 'read', roleId);\n const canCreate = hasAccess(field.access, 'create', roleId);\n const canUpdate = hasAccess(field.access, 'update', roleId);\n\n return (\n <div key={name} style={{ padding: '12px', border: '1px solid #f1f5f9', borderRadius: '8px', background: '#f8fafc' }}>\n <div style={{ fontSize: '13px', fontWeight: 600, marginBottom: '8px' }}><code>{name}</code></div>\n <div style={{ display: 'flex', gap: '8px', fontSize: '11px' }}>\n <span style={{ display: 'flex', alignItems: 'center', gap: '4px', color: canRead ? '#10b981' : '#ef4444' }}>\n <span className=\"material-symbols-outlined\" style={{ fontSize: '14px' }}>{canRead ? 'check_circle' : 'cancel'}</span> read\n </span>\n <span style={{ display: 'flex', alignItems: 'center', gap: '4px', color: canCreate ? '#10b981' : '#ef4444' }}>\n <span className=\"material-symbols-outlined\" style={{ fontSize: '14px' }}>{canCreate ? 'check_circle' : 'cancel'}</span> create\n </span>\n <span style={{ display: 'flex', alignItems: 'center', gap: '4px', color: canUpdate ? '#10b981' : '#ef4444' }}>\n <span className=\"material-symbols-outlined\" style={{ fontSize: '14px' }}>{canUpdate ? 'check_circle' : 'cancel'}</span> update\n </span>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n </AdminLayout>\n );\n}\n\nfunction PermissionStatus({ allowed }: { allowed: boolean }) {\n return (\n <span className=\"material-symbols-outlined\" style={{ \n color: allowed ? '#10b981' : '#ef4444',\n fontSize: '20px',\n fontWeight: 'bold'\n }}>\n {allowed ? 'check' : 'close'}\n </span>\n );\n}\n","\"use client\";\n\nimport React, { useState } from \"react\";\nimport { AdminLayout } from \"../components/AdminLayout.js\";\nimport type { AdminForgeConfig } from \"../../core/index.js\";\nimport { useAdminSession } from \"../../auth/provider.js\";\nimport { useAdminForge } from \"../AdminForgeContext.js\";\n\ninterface AgentTokenPageProps {\n config: AdminForgeConfig;\n}\n\nexport function AgentTokenPage({ config }: AgentTokenPageProps) {\n const { apiBase } = useAdminForge();\n const session = useAdminSession();\n const [selectedScopes, setSelectedScopes] = useState<string[]>([]);\n const [expiresIn, setExpiresIn] = useState(600); // Default 10 min\n const [token, setToken] = useState<string | null>(null);\n const [loading, setLoading] = useState(false);\n\n const toggleScope = (scope: string) => {\n setSelectedScopes(prev => \n prev.includes(scope) ? prev.filter(s => s !== scope) : [...prev, scope]\n );\n };\n\n const handleGenerate = async () => {\n setLoading(true);\n try {\n const res = await fetch(`${apiBase}/_tokens`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ scope: selectedScopes, expiresIn }),\n });\n const data = await res.json();\n if (data.token) {\n setToken(data.token);\n } else {\n alert(data.error || \"Failed to generate token\");\n }\n } catch (e: any) {\n alert(\"Error connecting to API: \" + e.message);\n } finally {\n setLoading(false);\n }\n };\n\n const role = session?.role || (session?.user as any)?.role;\n\n return (\n <AdminLayout config={config} currentPath=\"/admin/settings/agent-tokens\" role={role}>\n <div className=\"adminforge-collection-page\">\n <div className=\"adminforge-page-header\" style={{ marginBottom: '40px' }}>\n <div>\n <h1 style={{ fontSize: '24px', fontWeight: 700, margin: 0 }}>Agent Token Generator</h1>\n <p style={{ color: '#64748b', fontSize: '14px', marginTop: '4px' }}>Issue secure, scoped passes for your AI agents.</p>\n </div>\n </div>\n\n {token ? (\n <div style={{ \n background: '#f0fdf4', \n border: '1px solid #10b981', \n borderRadius: '12px', \n padding: '32px',\n boxShadow: '0 4px 6px -1px rgba(0, 0, 0, 0.1)'\n }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '12px', marginBottom: '20px' }}>\n <span className=\"material-symbols-outlined\" style={{ color: '#059669', fontSize: '32px' }}>verified_user</span>\n <h2 style={{ fontSize: '20px', fontWeight: 700, color: '#064e3b', margin: 0 }}>Token Generated Successfully</h2>\n </div>\n \n <div style={{ background: '#dcfce7', padding: '16px', borderRadius: '8px', marginBottom: '24px', border: '1px solid #10b98140' }}>\n <p style={{ fontSize: '14px', color: '#166534', lineHeight: 1.6, margin: 0 }}>\n <strong>⚠️ Security Alert:</strong> Copy this token now. It is never stored and will only be shown once. \n It will expire in <strong>{expiresIn / 60} minutes</strong>.\n </p>\n </div>\n\n <div style={{ display: 'flex', gap: '12px' }}>\n <input \n readOnly \n value={token} \n className=\"adminforge-input\"\n style={{ fontFamily: 'monospace', fontSize: '12px', flex: 1, height: '48px', background: 'white' }}\n />\n <button \n onClick={() => {\n navigator.clipboard.writeText(token);\n alert(\"Copied to clipboard!\");\n }}\n className=\"adminforge-btn adminforge-btn-primary\"\n style={{ height: '48px', padding: '0 24px' }}\n >\n <span className=\"material-symbols-outlined\">content_copy</span>\n Copy\n </button>\n </div>\n \n <button \n onClick={() => setToken(null)}\n className=\"adminforge-btn-text\"\n style={{ marginTop: '24px', display: 'flex', alignItems: 'center', gap: '8px', color: '#059669', background: 'none', border: 'none', cursor: 'pointer', fontWeight: 600 }}\n >\n <span className=\"material-symbols-outlined\" style={{ fontSize: '18px' }}>refresh</span>\n Generate another token\n </button>\n </div>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '32px' }}>\n <div className=\"adminforge-table-wrapper\">\n <table className=\"adminforge-table\">\n <thead>\n <tr>\n <th>Collection</th>\n <th style={{ textAlign: 'center' }}>Create</th>\n <th style={{ textAlign: 'center' }}>Read</th>\n <th style={{ textAlign: 'center' }}>Update</th>\n <th style={{ textAlign: 'center' }}>Delete</th>\n </tr>\n </thead>\n <tbody>\n {config.collections.map(c => (\n <tr key={c.name}>\n <td style={{ fontWeight: 600 }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '10px' }}>\n <span className=\"material-symbols-outlined\" style={{ fontSize: '20px', color: '#94a3b8' }}>{c.icon || 'database'}</span>\n {c.label}\n </div>\n </td>\n {[\"create\", \"read\", \"update\", \"delete\"].map(action => {\n const scope = `${c.name}:${action}`;\n return (\n <td key={action} style={{ textAlign: 'center' }}>\n <div style={{ display: 'flex', justifyContent: 'center' }}>\n <input \n type=\"checkbox\"\n checked={selectedScopes.includes(scope)}\n onChange={() => toggleScope(scope)}\n style={{ width: '18px', height: '18px', cursor: 'pointer' }}\n />\n </div>\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n\n <div style={{ \n display: 'flex', \n justifyContent: 'space-between', \n alignItems: 'center',\n background: '#fff',\n padding: '24px',\n borderRadius: '12px',\n border: '1px solid var(--color-border)',\n boxShadow: 'var(--shadow-sm)'\n }}>\n <div>\n <div style={{ marginBottom: '16px' }}>\n <p style={{ fontWeight: 700, fontSize: '16px', color: 'var(--color-text)', marginBottom: '8px', margin: 0 }}>\n {selectedScopes.length} scopes selected\n </p>\n <div style={{ display: 'flex', gap: '8px', marginTop: '12px' }}>\n {[\n { label: '10m', val: 600 },\n { label: '30m', val: 1800 },\n { label: '1h', val: 3600 }\n ].map(opt => (\n <button\n key={opt.val}\n onClick={() => setExpiresIn(opt.val)}\n style={{\n padding: '6px 12px',\n fontSize: '12px',\n fontWeight: 600,\n borderRadius: '6px',\n border: '1px solid',\n background: expiresIn === opt.val ? 'var(--color-primary)' : '#fff',\n color: expiresIn === opt.val ? '#fff' : 'var(--color-text)',\n borderColor: expiresIn === opt.val ? 'var(--color-primary)' : 'var(--color-border)',\n cursor: 'pointer',\n transition: 'all 0.2s'\n }}\n >\n {opt.label}\n </button>\n ))}\n </div>\n </div>\n <p style={{ fontSize: '13px', color: '#64748b', margin: 0 }}>\n Token will expire in {expiresIn / 60} minutes.\n </p>\n </div>\n <button \n onClick={handleGenerate}\n disabled={loading || selectedScopes.length === 0}\n className=\"adminforge-btn adminforge-btn-primary\"\n style={{ padding: '12px 32px', fontSize: '15px' }}\n >\n {loading ? \"Generating...\" : \"Generate Agent Token\"}\n </button>\n </div>\n\n <div style={{ marginTop: '24px' }}>\n <h3 style={{ fontSize: '11px', fontWeight: 700, color: '#94a3b8', textTransform: 'uppercase', letterSpacing: '0.05em', marginBottom: '16px', margin: 0 }}>\n Security Protocol\n </h3>\n <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: '24px', marginTop: '16px' }}>\n <div style={{ background: '#fff', padding: '20px', borderRadius: '8px', border: '1px solid var(--color-border)' }}>\n <p style={{ fontSize: '13px', fontWeight: 600, marginBottom: '8px', margin: 0 }}>Short-Lived Keys</p>\n <p style={{ fontSize: '13px', color: '#64748b', lineHeight: 1.6, margin: 0 }}>\n Tokens expire after 10 minutes. This reduces the risk of long-term credential leakage.\n </p>\n </div>\n <div style={{ background: '#fff', padding: '20px', borderRadius: '8px', border: '1px solid var(--color-border)' }}>\n <p style={{ fontSize: '13px', fontWeight: 600, marginBottom: '8px', margin: 0 }}>Scoped Authority</p>\n <p style={{ fontSize: '13px', color: '#64748b', lineHeight: 1.6, margin: 0 }}>\n Agents are strictly limited to the checkboxes above. They cannot bypass RBAC rules.\n </p>\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n </AdminLayout>\n );\n}\n"],"mappings":"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","names":["Link","import_react","import_link","import_jsx_runtime","import_jsx_runtime","Link","import_link","import_jsx_runtime","formatRelativeTime","Link","import_link","import_react","import_jsx_runtime","hasAccess","Link","import_react","import_react","import_jsx_runtime","StarterKit","Link","Underline","TextAlign","Placeholder","Highlight","Subscript","Superscript","TaskList","TaskItem","HorizontalRule","Typography","BubbleMenuExtension","Image","editor","import_react","import_react","import_jsx_runtime","React","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","hasAccess","import_link","import_jsx_runtime","Link","import_link","import_react","import_jsx_runtime","Link","role","import_link","import_jsx_runtime","Link","import_link","import_jsx_runtime","hasAccess","Link","import_react","import_jsx_runtime","import_navigation","import_jsx_runtime","React"]}
|
package/dist/ui.d.cts
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { A as AdminForgeConfig, C as CollectionDefinition } from './index-CyzxaE7n.cjs';
|
|
3
|
+
import React$1 from 'react';
|
|
4
|
+
export { AuthProvider, useAdminSession } from './auth-client.cjs';
|
|
5
|
+
import 'zod';
|
|
6
|
+
|
|
7
|
+
interface AdminLayoutProps {
|
|
8
|
+
config: AdminForgeConfig;
|
|
9
|
+
children: React.ReactNode;
|
|
10
|
+
currentPath?: string;
|
|
11
|
+
role?: string;
|
|
12
|
+
}
|
|
13
|
+
declare function AdminLayout({ config, children, currentPath, role }: AdminLayoutProps): react_jsx_runtime.JSX.Element;
|
|
14
|
+
|
|
15
|
+
interface AdminDashboardProps {
|
|
16
|
+
config?: AdminForgeConfig;
|
|
17
|
+
params?: {
|
|
18
|
+
admin?: string[];
|
|
19
|
+
} | Promise<{
|
|
20
|
+
admin?: string[];
|
|
21
|
+
}>;
|
|
22
|
+
apiBase?: string;
|
|
23
|
+
}
|
|
24
|
+
declare function AdminDashboard({ config: initialConfig, params: initialParams, apiBase: initialApiBase }: AdminDashboardProps): react_jsx_runtime.JSX.Element;
|
|
25
|
+
|
|
26
|
+
interface AdminPageProps {
|
|
27
|
+
config: AdminForgeConfig;
|
|
28
|
+
role?: string;
|
|
29
|
+
}
|
|
30
|
+
declare function AdminPage({ config, role: propRole }: AdminPageProps): react_jsx_runtime.JSX.Element;
|
|
31
|
+
|
|
32
|
+
interface CollectionListPageProps {
|
|
33
|
+
config: AdminForgeConfig;
|
|
34
|
+
collection: CollectionDefinition;
|
|
35
|
+
data: unknown[];
|
|
36
|
+
total: number;
|
|
37
|
+
page: number;
|
|
38
|
+
pageSize: number;
|
|
39
|
+
role?: string;
|
|
40
|
+
}
|
|
41
|
+
declare function CollectionListPage({ config, collection, data, total, page, pageSize, role: propRole }: CollectionListPageProps): react_jsx_runtime.JSX.Element;
|
|
42
|
+
|
|
43
|
+
interface CollectionFormPageProps {
|
|
44
|
+
config: AdminForgeConfig;
|
|
45
|
+
collection: CollectionDefinition;
|
|
46
|
+
record?: Record<string, unknown> | null;
|
|
47
|
+
isNew: boolean;
|
|
48
|
+
role?: string;
|
|
49
|
+
}
|
|
50
|
+
declare function CollectionFormPage({ config, collection, record, isNew, role: propRole }: CollectionFormPageProps): react_jsx_runtime.JSX.Element;
|
|
51
|
+
|
|
52
|
+
interface CollectionSchemaPageProps {
|
|
53
|
+
config: AdminForgeConfig;
|
|
54
|
+
collection: CollectionDefinition;
|
|
55
|
+
role?: string;
|
|
56
|
+
}
|
|
57
|
+
declare function CollectionSchemaPage({ config, collection, role }: CollectionSchemaPageProps): react_jsx_runtime.JSX.Element;
|
|
58
|
+
|
|
59
|
+
interface RolesListPageProps {
|
|
60
|
+
config: AdminForgeConfig;
|
|
61
|
+
role?: string;
|
|
62
|
+
}
|
|
63
|
+
declare function RolesListPage({ config, role }: RolesListPageProps): react_jsx_runtime.JSX.Element;
|
|
64
|
+
|
|
65
|
+
interface RoleDetailPageProps {
|
|
66
|
+
config: AdminForgeConfig;
|
|
67
|
+
roleId: string;
|
|
68
|
+
role?: string;
|
|
69
|
+
}
|
|
70
|
+
declare function RoleDetailPage({ config, roleId, role }: RoleDetailPageProps): react_jsx_runtime.JSX.Element;
|
|
71
|
+
|
|
72
|
+
interface AgentTokenPageProps {
|
|
73
|
+
config: AdminForgeConfig;
|
|
74
|
+
}
|
|
75
|
+
declare function AgentTokenPage({ config }: AgentTokenPageProps): react_jsx_runtime.JSX.Element;
|
|
76
|
+
|
|
77
|
+
interface FormEngineProps {
|
|
78
|
+
collection: CollectionDefinition;
|
|
79
|
+
record?: Record<string, unknown> | null;
|
|
80
|
+
isNew: boolean;
|
|
81
|
+
role?: string;
|
|
82
|
+
}
|
|
83
|
+
declare function FormEngine({ collection, record, isNew, role }: FormEngineProps): react_jsx_runtime.JSX.Element;
|
|
84
|
+
|
|
85
|
+
interface TableEngineProps {
|
|
86
|
+
collection: CollectionDefinition;
|
|
87
|
+
data: unknown[];
|
|
88
|
+
basePath: string;
|
|
89
|
+
role?: string;
|
|
90
|
+
}
|
|
91
|
+
declare function TableEngine({ collection, data, basePath, role }: TableEngineProps): react_jsx_runtime.JSX.Element;
|
|
92
|
+
|
|
93
|
+
interface RichTextEditorProps {
|
|
94
|
+
name: string;
|
|
95
|
+
value?: string;
|
|
96
|
+
onChange: (value: string) => void;
|
|
97
|
+
}
|
|
98
|
+
declare function RichTextEditor({ name, value, onChange }: RichTextEditorProps): react_jsx_runtime.JSX.Element | null;
|
|
99
|
+
|
|
100
|
+
interface ImageUploadProps {
|
|
101
|
+
name: string;
|
|
102
|
+
value?: string;
|
|
103
|
+
onChange: (value: string) => void;
|
|
104
|
+
}
|
|
105
|
+
declare function ImageUpload({ name, value, onChange }: ImageUploadProps): react_jsx_runtime.JSX.Element;
|
|
106
|
+
|
|
107
|
+
interface AdminForgeContextType {
|
|
108
|
+
config: AdminForgeConfig | undefined;
|
|
109
|
+
apiBase: string;
|
|
110
|
+
unauthorized: boolean;
|
|
111
|
+
}
|
|
112
|
+
declare function AdminForgeProvider({ children, config: initialConfig, apiBase }: {
|
|
113
|
+
children: React$1.ReactNode;
|
|
114
|
+
config?: AdminForgeConfig;
|
|
115
|
+
apiBase?: string;
|
|
116
|
+
}): react_jsx_runtime.JSX.Element;
|
|
117
|
+
declare function useAdminForge(): AdminForgeContextType;
|
|
118
|
+
|
|
119
|
+
export { AdminDashboard, AdminForgeProvider, AdminLayout, AdminPage, AgentTokenPage, CollectionFormPage, CollectionListPage, CollectionSchemaPage, FormEngine, ImageUpload, RichTextEditor, RoleDetailPage, RolesListPage, TableEngine, useAdminForge };
|