@kyro-cms/admin 0.3.2 → 0.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/EditorClient-XEUOVAAC.js +466 -0
- package/dist/EditorClient-XEUOVAAC.js.map +1 -0
- package/dist/EditorClient-YLCGVDXY.cjs +468 -0
- package/dist/EditorClient-YLCGVDXY.cjs.map +1 -0
- package/dist/chunk-7KPIUCGT.js +384 -0
- package/dist/chunk-7KPIUCGT.js.map +1 -0
- package/dist/chunk-GOACG6R7.cjs +473 -0
- package/dist/chunk-GOACG6R7.cjs.map +1 -0
- package/dist/index.cjs +14861 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.css +1661 -0
- package/dist/index.css.map +1 -0
- package/dist/index.d.ts +563 -0
- package/dist/index.js +14784 -0
- package/dist/index.js.map +1 -0
- package/package.json +19 -19
- package/src/components/ActionBar.tsx +7 -43
- package/src/components/Admin.tsx +138 -277
- package/src/components/ApiKeysManager.tsx +428 -419
- package/src/components/AuditLogsPage.tsx +35 -39
- package/src/components/AuthBridge.tsx +51 -0
- package/src/components/AutoForm.tsx +495 -1230
- package/src/components/BrandingHub.tsx +18 -19
- package/src/components/BulkActionsBar.tsx +1 -1
- package/src/components/CreateView.tsx +22 -36
- package/src/components/Dashboard.tsx +60 -84
- package/src/components/DetailView.tsx +113 -91
- package/src/components/DeveloperCenter.tsx +200 -198
- package/src/components/FieldRenderer.tsx +206 -0
- package/src/components/GraphQLPlayground.tsx +340 -480
- package/src/components/ListView.tsx +828 -254
- package/src/components/LoginPage.tsx +3 -4
- package/src/components/MarketplaceManager.tsx +254 -0
- package/src/components/MediaGallery.tsx +856 -1192
- package/src/components/PluginsManager.tsx +277 -0
- package/src/components/RestPlayground.tsx +398 -560
- package/src/components/SessionsManager.tsx +211 -0
- package/src/components/Sidebar.astro +179 -151
- package/src/components/ThemeProvider.tsx +7 -161
- package/src/components/UserManagement.tsx +162 -146
- package/src/components/UserMenu.tsx +110 -0
- package/src/components/WebhookManager.tsx +305 -367
- package/src/components/blocks/AccordionBlock.tsx +4 -4
- package/src/components/blocks/ArrayBlock.tsx +3 -3
- package/src/components/blocks/BlockEditModal.tsx +8 -8
- package/src/components/blocks/BlockWrapper.tsx +61 -0
- package/src/components/blocks/ButtonBlock.tsx +4 -4
- package/src/components/blocks/ChildBlocksTree.tsx +23 -25
- package/src/components/blocks/CodeBlock.tsx +15 -15
- package/src/components/blocks/ColumnsBlock.tsx +6 -44
- package/src/components/blocks/DividerBlock.tsx +3 -3
- package/src/components/blocks/FileBlock.tsx +4 -4
- package/src/components/blocks/HeadingBlock.tsx +6 -38
- package/src/components/blocks/HeroBlock.tsx +4 -4
- package/src/components/blocks/ImageBlock.tsx +4 -4
- package/src/components/blocks/LinkBlock.tsx +4 -4
- package/src/components/blocks/ListBlock.tsx +3 -3
- package/src/components/blocks/ParagraphBlock.tsx +12 -42
- package/src/components/blocks/RelationshipBlock.tsx +4 -4
- package/src/components/blocks/RichTextBlock.tsx +4 -4
- package/src/components/blocks/VStackBlock.tsx +5 -37
- package/src/components/blocks/VideoBlock.tsx +4 -4
- package/src/components/blocks/types.ts +11 -0
- package/src/components/fields/AccordionField.tsx +1 -1
- package/src/components/fields/ArrayField.tsx +2 -2
- package/src/components/fields/ArrayLayout.tsx +93 -0
- package/src/components/fields/BlocksField.tsx +122 -111
- package/src/components/fields/ButtonField.tsx +1 -1
- package/src/components/fields/CheckboxField.tsx +14 -15
- package/src/components/fields/ChildrenField.tsx +2 -2
- package/src/components/fields/CodeField.tsx +3 -3
- package/src/components/fields/ColumnsField.tsx +2 -2
- package/src/components/fields/DateField.tsx +13 -26
- package/src/components/fields/EditorClient.tsx +26 -28
- package/src/components/fields/FieldLayout.tsx +52 -0
- package/src/components/fields/GroupLayout.tsx +35 -0
- package/src/components/fields/JSONField.tsx +7 -7
- package/src/components/fields/LinkField.tsx +1 -1
- package/src/components/fields/MarkdownField.tsx +1 -1
- package/src/components/fields/NumberField.tsx +13 -26
- package/src/components/fields/PortableTextField.tsx +4 -4
- package/src/components/fields/PortableTextRenderer.tsx +1 -1
- package/src/components/fields/RelationshipBlockField.tsx +31 -23
- package/src/components/fields/RelationshipField.tsx +14 -14
- package/src/components/fields/SelectField.tsx +17 -26
- package/src/components/fields/TabsLayout.tsx +69 -0
- package/src/components/fields/TextField.tsx +85 -38
- package/src/components/fields/UploadField.tsx +71 -41
- package/src/components/fields/VideoField.tsx +1 -1
- package/src/components/fields/extensions/blockComponents.tsx +2 -2
- package/src/components/fields/extensions/blocksStore.ts +207 -193
- package/src/components/fields/types.ts +22 -0
- package/src/components/layout/Layout.tsx +1 -1
- package/src/components/ui/ActionMenu.tsx +63 -0
- package/src/components/ui/Badge.tsx +59 -5
- package/src/components/ui/BlockDrawer.tsx +4 -5
- package/src/components/ui/CommandPalette.tsx +58 -36
- package/src/components/ui/CommandPaletteWrapper.tsx +18 -17
- package/src/components/ui/Dropdown.tsx +18 -16
- package/src/components/ui/EmptyState.tsx +25 -0
- package/src/components/ui/GlobalModal.tsx +49 -0
- package/src/components/ui/IconButton.tsx +44 -0
- package/src/components/ui/Modal.tsx +19 -20
- package/src/components/ui/PageHeader.tsx +158 -0
- package/src/components/ui/Pagination.tsx +61 -0
- package/src/components/ui/PromptModal.tsx +1 -1
- package/src/components/ui/SearchInput.tsx +57 -0
- package/src/components/ui/SeoPreview.tsx +31 -0
- package/src/components/ui/SessionModal.tsx +0 -0
- package/src/components/ui/SlidePanel.tsx +2 -0
- package/src/components/ui/Toast.tsx +65 -122
- package/src/components/ui/Toaster.tsx +18 -0
- package/src/components/ui/icons.tsx +112 -0
- package/src/components/users/UserDetail.tsx +290 -0
- package/src/components/users/UserForm.tsx +242 -0
- package/src/components/users/UsersList.tsx +338 -0
- package/src/env.d.ts +13 -13
- package/src/fields/index.ts +2 -1
- package/src/global.d.ts +7 -0
- package/src/hooks/data.ts +2 -9
- package/src/hooks/useAsyncData.ts +36 -0
- package/src/hooks/useAutoFormState.ts +527 -0
- package/src/hooks/useSelection.ts +49 -0
- package/src/hooks/useSession.ts +0 -0
- package/src/index.ts +11 -1
- package/src/integration.ts +86 -11
- package/src/kyro-cms.d.ts +209 -0
- package/src/layouts/AdminLayout.astro +128 -11
- package/src/layouts/AuthLayout.astro +21 -5
- package/src/lib/api.ts +175 -55
- package/src/lib/autoform-store.ts +435 -0
- package/src/lib/config.ts +82 -34
- package/src/lib/createRegistry.ts +29 -0
- package/src/lib/default-kyro-config.ts +4 -0
- package/src/lib/globals.ts +50 -0
- package/src/lib/media-utils.ts +18 -0
- package/src/lib/object-utils.ts +77 -0
- package/src/lib/paths.ts +61 -0
- package/src/lib/stores/index.ts +370 -0
- package/src/lib/types.ts +43 -0
- package/src/lib/useResourceManager.ts +105 -0
- package/src/pages/403.astro +67 -0
- package/src/pages/[collection]/[id].astro +14 -180
- package/src/pages/[collection]/index.astro +11 -6
- package/src/pages/api-explorer.astro +173 -0
- package/src/pages/audit/index.astro +2 -0
- package/src/pages/auth/login.astro +122 -0
- package/src/pages/auth/register.astro +167 -0
- package/src/pages/graphql-explorer.astro +59 -0
- package/src/pages/{admin/graphql.astro → graphql.astro} +51 -17
- package/src/pages/index.astro +577 -0
- package/src/pages/index_ALT.astro +3 -0
- package/src/pages/keys.astro +11 -0
- package/src/pages/marketplace.astro +11 -0
- package/src/pages/media.astro +3 -0
- package/src/pages/plugins.astro +8 -0
- package/src/pages/preview/[collection]/[id].astro +188 -123
- package/src/pages/rest-playground.astro +62 -0
- package/src/pages/roles/index.astro +183 -76
- package/src/pages/sessions.astro +8 -0
- package/src/pages/settings/[slug].astro +92 -114
- package/src/pages/settings/index.astro +5 -3
- package/src/pages/users/[id].astro +25 -154
- package/src/pages/users/index.astro +19 -130
- package/src/pages/users/new.astro +9 -86
- package/src/pages/webhooks.astro +11 -0
- package/src/routes.ts +80 -0
- package/src/styles/main.css +119 -79
- package/src/theme/tokens.ts +1 -0
- package/src/vite-env.d.ts +14 -0
- package/src/collections/auth/index.ts +0 -155
- package/src/collections/portfolio/index.ts +0 -343
- package/src/components/ApiExplorer.tsx +0 -325
- package/src/components/EnhancedListView.tsx +0 -889
- package/src/components/GraphQLExplorer.tsx +0 -675
- package/src/components/Icons.tsx +0 -23
- package/src/components/StatusBadge.tsx +0 -76
- package/src/lib/MediaService.ts +0 -541
- package/src/lib/auth/sqlite-adapter.ts +0 -319
- package/src/lib/dataStore.ts +0 -226
- package/src/lib/db/adapter.ts +0 -54
- package/src/lib/db/drizzle-mysql-adapter.ts +0 -194
- package/src/lib/db/drizzle-mysql-auth-adapter.ts +0 -327
- package/src/lib/db/drizzle-postgres-adapter.ts +0 -202
- package/src/lib/db/drizzle-postgres-auth-adapter.ts +0 -304
- package/src/lib/db/drizzle-sqlite-adapter.ts +0 -227
- package/src/lib/db/drizzle-sqlite-auth-adapter.ts +0 -548
- package/src/lib/db/index.ts +0 -449
- package/src/lib/db/mongodb-adapter.ts +0 -207
- package/src/lib/db/mongodb-auth-adapter.ts +0 -305
- package/src/lib/db/schema/mysql-auth.ts +0 -113
- package/src/lib/db/schema/mysql-content.ts +0 -20
- package/src/lib/db/schema/postgres-auth.ts +0 -116
- package/src/lib/db/schema/postgres-content.ts +0 -35
- package/src/lib/db/schema/postgres-media.ts +0 -52
- package/src/lib/db/schema/postgres-settings.ts +0 -11
- package/src/lib/db/schema/sqlite-auth.ts +0 -112
- package/src/lib/db/schema/sqlite-content.ts +0 -20
- package/src/lib/db/version-adapter.ts +0 -248
- package/src/lib/graphql/index.ts +0 -1
- package/src/lib/graphql/schema.ts +0 -443
- package/src/lib/rate-limit.ts +0 -267
- package/src/lib/storage.ts +0 -374
- package/src/lib/store.ts +0 -85
- package/src/middleware.ts +0 -177
- package/src/pages/admin/api-explorer.astro +0 -98
- package/src/pages/admin/graphql-explorer.astro +0 -40
- package/src/pages/admin/index.astro +0 -286
- package/src/pages/admin/keys.astro +0 -8
- package/src/pages/admin/rest-playground.astro +0 -44
- package/src/pages/admin/webhooks.astro +0 -8
- package/src/pages/api/[collection]/[id]/publish.ts +0 -52
- package/src/pages/api/[collection]/[id]/unpublish.ts +0 -42
- package/src/pages/api/[collection]/[id]/versions.ts +0 -66
- package/src/pages/api/[collection]/[id].ts +0 -213
- package/src/pages/api/[collection]/index.ts +0 -209
- package/src/pages/api/auth/[id].ts +0 -121
- package/src/pages/api/auth/audit-logs.ts +0 -57
- package/src/pages/api/auth/login.ts +0 -211
- package/src/pages/api/auth/logout.ts +0 -66
- package/src/pages/api/auth/me.ts +0 -36
- package/src/pages/api/auth/refresh.ts +0 -119
- package/src/pages/api/auth/register.ts +0 -188
- package/src/pages/api/auth/users.ts +0 -97
- package/src/pages/api/collections.ts +0 -59
- package/src/pages/api/globals/[slug].ts +0 -42
- package/src/pages/api/graphql.ts +0 -90
- package/src/pages/api/health.ts +0 -426
- package/src/pages/api/keys/[id].ts +0 -26
- package/src/pages/api/keys/index.ts +0 -75
- package/src/pages/api/media/[id].ts +0 -309
- package/src/pages/api/media/folders.ts +0 -609
- package/src/pages/api/media/index.ts +0 -146
- package/src/pages/api/media/resize.ts +0 -267
- package/src/pages/api/search.ts +0 -82
- package/src/pages/api/slug-availability.ts +0 -70
- package/src/pages/api/storage-config.ts +0 -20
- package/src/pages/api/storage-status.ts +0 -206
- package/src/pages/api/upload.ts +0 -334
- package/src/pages/api/webhooks/index.ts +0 -71
- package/src/pages/login.astro +0 -82
- package/src/pages/register.astro +0 -102
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Admin.tsx","../src/lib/paths.ts","../src/lib/stores/index.ts","../src/lib/api.ts","../src/components/ListView.tsx","../src/components/ui/Spinner.tsx","../src/components/ui/PageHeader.tsx","../src/components/DetailView.tsx","../src/components/AutoForm.tsx","../src/lib/config.ts","../src/lib/autoform-store.ts","../../node_modules/.pnpm/destr@2.0.5/node_modules/destr/dist/index.mjs","../../node_modules/.pnpm/unstorage@1.17.5_idb-keyval@6.2.2_ioredis@5.10.1/node_modules/unstorage/dist/shared/unstorage.zVDD2mZo.mjs","../../node_modules/.pnpm/unstorage@1.17.5_idb-keyval@6.2.2_ioredis@5.10.1/node_modules/unstorage/dist/index.mjs","../../node_modules/.pnpm/unstorage@1.17.5_idb-keyval@6.2.2_ioredis@5.10.1/node_modules/unstorage/drivers/utils/index.mjs","../../node_modules/.pnpm/unstorage@1.17.5_idb-keyval@6.2.2_ioredis@5.10.1/node_modules/unstorage/drivers/indexedb.mjs","../src/hooks/useAutoFormState.ts","../src/lib/slugify.ts","../src/components/fields/RelationshipBlockField.tsx","../src/components/fields/UploadField.tsx","../src/components/fields/PortableTextField.tsx","../src/components/fields/PortableTextRenderer.tsx","../src/components/fields/CodeField.tsx","../src/theme/ThemeProvider.tsx","../src/theme/tokens.ts","../src/components/fields/JSONField.tsx","../src/components/fields/MarkdownField.tsx","../src/components/fields/FieldLayout.tsx","../src/components/fields/TextField.tsx","../src/components/fields/NumberField.tsx","../src/components/fields/CheckboxField.tsx","../src/components/fields/DateField.tsx","../src/components/fields/SelectField.tsx","../src/components/fields/RelationshipField.tsx","../src/components/fields/BlocksField.tsx","../src/components/fields/extensions/blocksStore.ts","../src/components/ui/BlockDrawer.tsx","../src/components/ui/SlidePanel.tsx","../src/components/blocks/ChildBlocksTree.tsx","../src/components/blocks/BlockEditModal.tsx","../src/components/fields/ColumnsField.tsx","../src/components/blocks/BlockWrapper.tsx","../src/components/blocks/ColumnsBlock.tsx","../src/components/fields/HeadingField.tsx","../src/components/blocks/HeadingBlock.tsx","../src/components/blocks/ParagraphBlock.tsx","../src/components/blocks/DividerBlock.tsx","../src/components/blocks/ImageBlock.tsx","../src/components/fields/VideoField.tsx","../src/components/blocks/VideoBlock.tsx","../src/components/fields/ListField.tsx","../src/components/blocks/ListBlock.tsx","../src/components/blocks/CodeBlock.tsx","../src/components/fields/LinkField.tsx","../src/components/blocks/LinkBlock.tsx","../src/components/blocks/FileBlock.tsx","../src/components/fields/ChildrenField.tsx","../src/components/blocks/VStackBlock.tsx","../src/components/fields/ButtonField.tsx","../src/components/blocks/ButtonBlock.tsx","../src/components/fields/AccordionField.tsx","../src/components/blocks/AccordionBlock.tsx","../src/components/blocks/RichTextBlock.tsx","../src/components/fields/HeroField.tsx","../src/components/blocks/HeroBlock.tsx","../src/components/fields/ArrayField.tsx","../src/components/blocks/ArrayBlock.tsx","../src/components/blocks/RelationshipBlock.tsx","../src/components/fields/extensions/blockComponents.tsx","../src/components/FieldRenderer.tsx","../src/components/fields/TabsLayout.tsx","../src/components/ui/SeoPreview.tsx","../src/components/fields/GroupLayout.tsx","../src/components/fields/ArrayLayout.tsx","../src/components/ui/Dropdown.tsx","../src/components/ActionBar.tsx","../src/components/ui/Toast.tsx","../src/components/ui/Badge.tsx","../src/components/CreateView.tsx","../src/components/LoginPage.tsx","../src/components/Dashboard.tsx","../src/components/UserManagement.tsx","../src/components/BrandingHub.tsx","../src/components/DeveloperCenter.tsx","../src/components/ui/Modal.tsx","../src/components/WebhookManager.tsx","../src/lib/useResourceManager.ts","../src/components/MediaGallery.tsx","../src/components/ui/PromptModal.tsx","../src/components/ui/CommandPalette.tsx","../src/components/ui/GlobalModal.tsx","../src/components/BulkActionsBar.tsx","../src/components/VersionHistoryPanel.tsx","../src/components/layout/Header.tsx","../src/components/ui/Button.tsx","../src/hooks/lifecycle.ts","../src/hooks/data.ts","../src/plugins/registry.ts","../src/plugins/examples/sample-plugin.ts","../src/plugins/examples/sample-plugin-2.ts","../src/blocks/registry.ts","../src/blocks/examples/sample-block.tsx","../src/blocks/examples/sample-block-2.tsx","../src/fields/registry.tsx","../src/fields/examples/sample-field.tsx","../src/fields/examples/sample-field-2.tsx","../src/fields/index.ts","../src/integration.ts"],"names":["useState","useEffect","useMemo","set","block","get","fields","jsx","jsxs","field","useCallback","useRef","collections","globals","create","persist","keys","defineDriver","DRIVER_NAME","path","blocks","Suspense","lazy","React","useStore","createStore","createContext","useContext","createPortal","Fragment","items","statusConfig","formatDate","toast","aura","API_BASE","getFileType","json","apiPath"],"mappings":"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","sourcesContent":["import { useState, useEffect, useMemo } from \"react\";\nimport { apiPost } from \"../lib/api\";\nimport { useToastStore, toast, useAuthStore, type AuthUser } from \"../lib/stores\";\nimport type { CollectionConfig, GlobalConfig } from \"@kyro-cms/core/client\";\nimport { ListView } from \"./ListView\";\nimport { DetailView } from \"./DetailView\";\nimport { CreateView } from \"./CreateView\";\nimport { LoginPage } from \"./LoginPage\";\nimport { Dashboard } from \"./Dashboard\";\nimport { UserManagement } from \"./UserManagement\";\nimport { BrandingHub } from \"./BrandingHub\";\nimport { DeveloperCenter } from \"./DeveloperCenter\";\nimport { WebhookManager } from \"./WebhookManager\";\nimport { MediaGallery } from \"./MediaGallery\";\nimport { CommandPalette } from \"./ui/CommandPalette\";\nimport { GlobalModal } from \"./ui/GlobalModal\";\nimport { Toast, ToastProvider } from \"./ui/Toast\";\nimport { ThemeProvider, type ThemeMode } from \"./ThemeProvider\";\nimport { toArray, toCollectionMap, toGlobalMap } from \"../lib/config\";\nimport \"../styles/main.css\";\n\ntype View =\n | \"list\"\n | \"detail\"\n | \"create\"\n | \"settings\"\n | \"users\"\n | \"roles\"\n | \"audit\"\n | \"media\"\n | \"branding\"\n | \"developer\"\n | \"webhooks\";\n\nexport interface KyroAdminConfig {\n collections?: CollectionConfig[] | Record<string, CollectionConfig>;\n globals?: GlobalConfig[] | Record<string, GlobalConfig>;\n adapter?: unknown;\n name?: string;\n}\n\ninterface AdminProps {\n config: KyroAdminConfig;\n theme?: ThemeMode;\n onThemeChange?: (mode: ThemeMode) => void;\n}\n\nexport function Admin({ config, theme = \"light\", onThemeChange }: AdminProps) {\n const [authenticated, setAuthenticated] = useState(false);\n const [currentUser, setCurrentUser] = useState<AuthUser | null>(null);\n\n const collections = useMemo(\n () => toCollectionMap(toArray(config.collections)),\n [config.collections],\n );\n\n const globals = useMemo(\n () => toGlobalMap(toArray(config.globals)),\n [config.globals],\n );\n\n const [activeCollection, setActiveCollection] = useState<string | null>(null);\n const [activeGlobal, setActiveGlobal] = useState<string | null>(null);\n const [currentView, setCurrentView] = useState<View>(\"list\");\n const [activeDocumentId, setActiveDocumentId] = useState<string | null>(null);\n const [isCommandPaletteOpen, setIsCommandPaletteOpen] = useState(false);\n\nconst toasts = useToastStore((state) => state.toasts);\n const removeToast = useToastStore((state) => state.removeToast);\n\n useEffect(() => {\n // Basic session check\n const checkAuth = async () => {\n try {\n const response = await fetch(\"/api/users/me\");\n if (response.ok) {\n const user = await response.json();\n setCurrentUser(user);\n setAuthenticated(true);\n }\n } catch (err) {\n console.error(\"Auth check failed\", err);\n }\n };\n checkAuth();\n }, []);\n\n useEffect(() => {\n if (authenticated && !activeCollection) {\n const firstCol = Object.keys(collections)[0];\n if (firstCol) setActiveCollection(firstCol);\n }\n }, [authenticated, collections, activeCollection]);\n\n const handleNavigate = (view: View, collection: string | null = null, id: string | null = null) => {\n setCurrentView(view);\n if (collection) setActiveCollection(collection);\n if (id) setActiveDocumentId(id);\n setIsCommandPaletteOpen(false);\n };\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if ((e.metaKey || e.ctrlKey) && e.key === \"k\") {\n e.preventDefault();\n setIsCommandPaletteOpen((prev) => !prev);\n }\n };\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, []);\n\n const handleLogin = async (data: Record<string, unknown>) => {\n try {\n const response = await apiPost<any>(\"/api/users/login\", data);\n if (response.user) {\n setCurrentUser(response.user);\n setAuthenticated(true);\n toast.success(\"Welcome back!\");\n }\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : \"Login failed\";\n toast.error(message || \"Login failed\");\n }\n };\n\n if (!authenticated) {\n return (\n <LoginPage\n onAuth={(token, user) => {\n setCurrentUser(user as any);\n setAuthenticated(true);\n }}\n theme={theme as any}\n />\n );\n }\n\n const renderContent = () => {\n const collection = activeCollection ? collections[activeCollection] : null;\n\n switch (currentView) {\n case \"create\":\n return collection ? (\n <CreateView\n config={config as any}\n collection={collection}\n onSuccess={() => setCurrentView(\"list\")}\n onCancel={() => setCurrentView(\"list\")}\n onError={(msg) => toast.error(msg)}\n />\n ) : null;\n\n case \"detail\":\n return collection && activeDocumentId ? (\n <DetailView\n config={config as any}\n collection={collection}\n documentId={activeDocumentId}\n onBack={() => setCurrentView(\"list\")}\n onSave={() => toast.success(\"Changes saved\")}\n onError={(msg) => toast.error(msg)}\n />\n ) : null;\n\n case \"users\":\n return <UserManagement />;\n\n case \"media\":\n return <MediaGallery />;\n\n case \"branding\":\n return <BrandingHub />;\n\n case \"developer\":\n return <DeveloperCenter collections={collections as any} />;\n\n case \"webhooks\":\n return <WebhookManager />;\n\n case \"list\":\n default:\n return collection ? (\n <ListView\n config={config as any}\n collection={collection}\n onCreate={() => setCurrentView(\"create\")}\n onEdit={(id: string) => handleNavigate(\"detail\", activeCollection, id)}\n />\n ) : (\n <Dashboard \n onNavigate={handleNavigate as any} \n collections={collections as any}\n user={currentUser as any}\n />\n );\n }\n };\n\n return (\n <ThemeProvider {...({ mode: theme, onChange: onThemeChange } as any)}>\n <ToastProvider>\n <div className=\"kyro-admin min-h-screen bg-[var(--kyro-bg)] text-[var(--kyro-text-primary)]\">\n <div className=\"flex h-screen overflow-hidden\">\n <main className=\"flex-1 flex flex-col min-w-0 overflow-hidden\">\n <div className=\"flex-1 overflow-y-auto\">\n <CommandPalette \n isOpen={isCommandPaletteOpen}\n onClose={() => setIsCommandPaletteOpen(false)}\n collections={collections as any}\n globals={globals as any}\n onNavigate={handleNavigate as any} \n />\n {renderContent()}\n </div>\n </main>\n </div>\n <GlobalModal />\n \n <div className=\"kyro-toasts-container\">\n {toasts.map((t) => (\n <Toast\n key={t.id}\n type={t.type}\n message={t.message}\n onClose={() => removeToast(t.id)}\n />\n ))}\n </div>\n </div>\n </ToastProvider>\n </ThemeProvider>\n );\n}\n","declare const __KYRO_ADMIN_PATH__: string;\ndeclare const __KYRO_API_PATH__: string;\n\nexport const adminPath =\n typeof __KYRO_ADMIN_PATH__ !== \"undefined\" ? __KYRO_ADMIN_PATH__ : \"/admin\";\nexport const apiPath =\n typeof __KYRO_API_PATH__ !== \"undefined\" ? __KYRO_API_PATH__ : \"/api\";\n\nexport function resolveApi(url: string): string {\n // If URL is already absolute or prefixed with the correct apiPath, return as is\n if (url.startsWith(\"http\") || url.startsWith(apiPath)) return url;\n \n // If it starts with the standard \"/api/\", map it to the configured apiPath\n if (url.startsWith(\"/api/\")) {\n return apiPath + url.slice(4);\n }\n \n // Otherwise, prepend the apiPath\n const separator = url.startsWith(\"/\") ? \"\" : \"/\";\n return `${apiPath}${separator}${url}`;\n}\n\n\nexport function resolveAdmin(url: string): string {\n // If URL is already absolute or prefixed with the correct adminPath, return as is\n if (url.startsWith(\"http\") || url.startsWith(adminPath)) return url;\n \n // If it's a standard \"/admin/\" path, map it to the configured adminPath\n if (url.startsWith(\"/admin/\")) {\n return adminPath + url.slice(6);\n }\n \n // Otherwise, prepend the adminPath if it looks like a relative path\n if (url.startsWith(\"/\")) {\n return adminPath + url;\n }\n \n return url;\n}\n\n\nexport function resolveMedia(url: string): string {\n if (!url) return \"\";\n // Absolute URLs, blob URLs, and data URLs are returned as-is\n if (url.startsWith(\"http\") || url.startsWith(\"blob:\") || url.startsWith(\"data:\")) {\n return url;\n }\n \n // For relative paths, ensure they start with a single slash\n // These are relative to the site root (where /uploads/ usually lives)\n return url.startsWith(\"/\") ? url : `/${url}`;\n}\n\n\nexport const paths = {\n admin: adminPath,\n api: apiPath,\n resolveApi,\n resolveAdmin,\n resolveMedia,\n} as const;\n","import { create } from \"zustand\";\nimport { persist } from \"zustand/middleware\";\nimport { apiPath, adminPath } from \"../paths\";\n\n// ============================================================\n// AUTH STORE\n// ============================================================\n\nexport interface AuthUser {\n id: string;\n email: string;\n role: string;\n tenantId?: string;\n [key: string]: unknown;\n}\n\nexport interface Permissions {\n collections?: Record<string, { read: boolean; create: boolean; update: boolean; delete: boolean }>;\n globals?: Record<string, { read: boolean; update: boolean }>;\n media?: { read: boolean; create: boolean; update: boolean; delete: boolean };\n users?: { read: boolean; create: boolean; update: boolean; delete: boolean };\n [key: string]: unknown;\n}\n\ninterface AuthState {\n user: AuthUser | null;\n permissions: Permissions | null;\n isAuthenticated: boolean;\n isLoading: boolean;\n error: string | null;\n setUser: (user: AuthUser | null, permissions?: Permissions | null) => void;\n setLoading: (loading: boolean) => void;\n setError: (error: string | null) => void;\n logout: () => void;\n}\n\nexport const useAuthStore = create<AuthState>((set) => ({\n user: null,\n permissions: null,\n isAuthenticated: false,\n isLoading: true,\n error: null,\n\n setUser: (user, permissions = null) =>\n set({\n user,\n permissions,\n isAuthenticated: !!user,\n isLoading: false,\n error: null,\n }),\n\n setLoading: (isLoading) => set({ isLoading }),\n\n setError: (error) =>\n set({\n error,\n isLoading: false,\n isAuthenticated: false,\n user: null,\n permissions: null,\n }),\n\n logout: () =>\n set({\n user: null,\n permissions: null,\n isAuthenticated: false,\n isLoading: false,\n error: null,\n }),\n}));\n\nconst API_BASE = apiPath;\nconst ADMIN_BASE = adminPath;\n\nexport async function verifyAuth(): Promise<{\n user: AuthUser | null;\n permissions: Permissions | null;\n}> {\n try {\n const [meRes, accessRes] = await Promise.all([\n fetch(`${API_BASE}/auth/me`, { credentials: \"include\" }),\n fetch(`${API_BASE}/auth/access`, { credentials: \"include\" }),\n ]);\n\n if (!meRes.ok) {\n return { user: null, permissions: null };\n }\n\n const [meData, accessData] = await Promise.all([\n meRes.json(),\n accessRes.ok ? accessRes.json() : Promise.resolve(null),\n ]);\n\n return {\n user: meData.user || null,\n permissions: accessData || null,\n };\n } catch {\n return { user: null, permissions: null };\n }\n}\n\nexport async function doLogout(): Promise<void> {\n try {\n await fetch(`${API_BASE}/auth/logout`, {\n method: \"POST\",\n credentials: \"include\",\n });\n } finally {\n useAuthStore.getState().logout();\n }\n}\n\nexport function redirectToLogin(): void {\n window.location.href = `${ADMIN_BASE}/login`;\n}\n\n\n// ============================================================\n// TOAST STORE\n// ============================================================\n\nexport interface Toast {\n id: string;\n type: \"success\" | \"error\" | \"warning\" | \"info\";\n message: string;\n}\n\ninterface ToastState {\n toasts: Toast[];\n addToast: (type: Toast[\"type\"], message: string) => void;\n removeToast: (id: string) => void;\n clearToasts: () => void;\n}\n\nexport const useToastStore = create<ToastState>((set) => ({\n toasts: [],\n\n addToast: (type, message) => {\n const id = Math.random().toString(36).substring(7);\n set((state) => ({\n toasts: [...state.toasts, { id, type, message }],\n }));\n },\n\n removeToast: (id) =>\n set((state) => ({\n toasts: state.toasts.filter((t) => t.id !== id),\n })),\n\n clearToasts: () => set({ toasts: [] }),\n}));\n\nexport const toast = {\n success: (message: string) =>\n useToastStore.getState().addToast(\"success\", message),\n error: (message: string) =>\n useToastStore.getState().addToast(\"error\", message),\n warning: (message: string) =>\n useToastStore.getState().addToast(\"warning\", message),\n info: (message: string) =>\n useToastStore.getState().addToast(\"info\", message),\n};\n\n// ============================================================\n// THEME STORE\n// ============================================================\n\nexport type ThemeMode = \"light\" | \"dark\";\n\ninterface ThemeState {\n mode: ThemeMode;\n setMode: (mode: ThemeMode) => void;\n toggleMode: () => void;\n}\n\nexport const useThemeStore = create<ThemeState>()(\n persist(\n (set) => ({\n mode: \"light\",\n\n setMode: (mode) => set({ mode }),\n\n toggleMode: () =>\n set((state) => ({ mode: state.mode === \"light\" ? \"dark\" : \"light\" })),\n }),\n {\n name: \"kyro-theme\",\n },\n ),\n);\n\n// ============================================================\n// UI STORE\n// ============================================================\n\nexport interface ModalConfig {\n title: string;\n message: string;\n confirmLabel?: string;\n cancelLabel?: string;\n onConfirm?: () => void | Promise<void>;\n onCancel?: () => void;\n variant?: \"default\" | \"danger\" | \"success\" | \"warning\";\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n}\n\ninterface UIState {\n sidebarOpen: boolean;\n toggleSidebar: () => void;\n setSidebarOpen: (open: boolean) => void;\n\n modal: {\n open: boolean;\n config: ModalConfig | null;\n };\n confirm: (config: ModalConfig) => void;\n alert: (config: Omit<ModalConfig, \"onConfirm\" | \"cancelLabel\">) => void;\n closeModal: () => void;\n\n activeModal: string | null; // Legacy for specific hardcoded modals\n openModal: (modal: string) => void;\n}\n\nexport const useUIStore = create<UIState>((set) => ({\n sidebarOpen: true,\n toggleSidebar: () => set((state) => ({ sidebarOpen: !state.sidebarOpen })),\n setSidebarOpen: (open) => set({ sidebarOpen: open }),\n\n modal: {\n open: false,\n config: null,\n },\n confirm: (config) => set({\n modal: {\n open: true,\n config: { ...config, variant: config.variant || \"default\" },\n }\n }),\n alert: (config) => set({\n modal: {\n open: true,\n config: { \n ...config, \n variant: config.variant || \"default\",\n confirmLabel: config.confirmLabel || \"OK\",\n onConfirm: () => set((s) => ({ modal: { ...s.modal, open: false } }))\n },\n }\n }),\n closeModal: () => set((state) => ({\n modal: { ...state.modal, open: false },\n activeModal: null\n })),\n\n activeModal: null,\n openModal: (modal) => set({ activeModal: modal }),\n}));\n\n// ============================================================\n// EDITOR STORE\n// ============================================================\n\ninterface EditorState {\n editor: unknown;\n setEditor: (editor: unknown) => void;\n\n blockDrawerOpen: boolean;\n openBlockDrawer: (options?: { targetColumn?: number }) => void;\n closeBlockDrawer: () => void;\n toggleBlockDrawer: () => void;\n\n selectedBlock: string | null;\n setSelectedBlock: (block: string | null) => void;\n\n pendingInsert: {\n pos: number | null;\n column: number | null;\n };\n setPendingInsert: (pos: number | null, column?: number) => void;\n clearPendingInsert: () => void;\n}\n\nexport const useEditorStore = create<EditorState>((set) => ({\n editor: null,\n setEditor: (editor) => set({ editor }),\n\n blockDrawerOpen: false,\n openBlockDrawer: (options) =>\n set({\n blockDrawerOpen: true,\n pendingInsert: { pos: null, column: options?.targetColumn ?? null },\n }),\n closeBlockDrawer: () =>\n set({\n blockDrawerOpen: false,\n pendingInsert: { pos: null, column: null },\n }),\n toggleBlockDrawer: () =>\n set((state) => ({ blockDrawerOpen: !state.blockDrawerOpen })),\n\n selectedBlock: null,\n setSelectedBlock: (block) => set({ selectedBlock: block }),\n\n pendingInsert: { pos: null, column: null },\n setPendingInsert: (pos, column) =>\n set({ pendingInsert: { pos, column: column ?? null } }),\n clearPendingInsert: () => set({ pendingInsert: { pos: null, column: null } }),\n}));\n\n// ============================================================\n// DATA STORE\n// ============================================================\n\ninterface DataCache<T> {\n data: T | null;\n loading: boolean;\n error: string | null;\n lastFetch: number | null;\n}\n\ninterface DataStore {\n cache: Record<string, DataCache<unknown>>;\n setCache: (key: string, data: unknown) => void;\n setLoading: (key: string, loading: boolean) => void;\n setError: (key: string, error: string) => void;\n getCache: (key: string) => DataCache<unknown> | null;\n invalidateCache: (key?: string) => void;\n}\n\nexport const useDataStore = create<DataStore>((set, get) => ({\n cache: {},\n\n setCache: (key, data) =>\n set((state) => ({\n cache: {\n ...state.cache,\n [key]: { data, loading: false, error: null, lastFetch: Date.now() },\n },\n })),\n\n setLoading: (key, loading) =>\n set((state) => ({\n cache: {\n ...state.cache,\n [key]: { ...state.cache[key], loading, error: null },\n },\n })),\n\n setError: (key, error) =>\n set((state) => ({\n cache: {\n ...state.cache,\n [key]: { data: null, loading: false, error, lastFetch: null },\n },\n })),\n\n getCache: (key) => get().cache[key] || null,\n\n invalidateCache: (key) =>\n set((state) => {\n if (key) {\n const { [key]: _, ...rest } = state.cache;\n return { cache: rest };\n }\n return { cache: {} };\n }),\n}));\n","import { apiPath, adminPath, resolveApi, resolveAdmin, resolveMedia } from \"./paths\";\nimport { toast } from \"./stores\";\n\nexport interface ApiResponse<T = unknown> {\n docs?: T[];\n doc?: T;\n totalDocs?: number;\n error?: string;\n}\n\nexport { resolveApi as resolveApi, resolveAdmin as resolveAdminUrl, resolveApi as resolveUrl, resolveMedia as resolveMedia };\n\nconst API_BASE = apiPath;\nconst ADMIN_BASE = adminPath;\n\nconst TOKEN_REFRESH_URL = \"/api/auth/refresh\";\n\nasync function refreshToken(): Promise<boolean> {\n try {\n const response = await fetch(resolveApi(TOKEN_REFRESH_URL), {\n method: \"POST\",\n credentials: \"include\",\n });\n return response.ok;\n } catch {\n return false;\n }\n}\n\nexport async function fetchWithAuth(\n url: string,\n options: RequestInit = {},\n): Promise<Response> {\n const headers: Record<string, string> = {};\n if (!(options.body instanceof FormData)) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n Object.assign(headers, options.headers as Record<string, string> | undefined);\n\n const response = await fetch(resolveApi(url), {\n ...options,\n credentials: \"include\",\n headers,\n });\n\n if (response.status === 401) {\n const refreshed = await refreshToken();\n if (refreshed) {\n const retryHeaders: Record<string, string> = {};\n if (!(options.body instanceof FormData)) {\n retryHeaders[\"Content-Type\"] = \"application/json\";\n }\n Object.assign(retryHeaders, options.headers as Record<string, string> | undefined);\n const retryResponse = await fetch(resolveApi(url), {\n ...options,\n credentials: \"include\",\n headers: retryHeaders,\n });\n return retryResponse;\n }\n window.location.href = \"/admin/login\";\n }\n\n return response;\n}\n\nexport async function apiGet<T = unknown>(\n url: string,\n options?: RequestInit & { autoToast?: boolean },\n): Promise<T> {\n const { autoToast = true, ...fetchOptions } = options || {};\n const response = await fetchWithAuth(url, fetchOptions);\n if (!response.ok) {\n const errorMsg = `GET Failed: ${response.status}`;\n if (autoToast) toast.error(errorMsg);\n throw new Error(errorMsg);\n }\n return response.json();\n}\n\nexport async function apiPost<T = unknown>(\n url: string,\n body?: unknown,\n options?: RequestInit & { autoToast?: boolean },\n): Promise<T> {\n const { autoToast = true, ...fetchOptions } = options || {};\n const response = await fetchWithAuth(url, {\n method: \"POST\",\n body: body ? JSON.stringify(body) : undefined,\n ...fetchOptions,\n });\n if (!response.ok) {\n let errorMessage = `POST Failed: ${response.status}`;\n try {\n const errorData = await response.json();\n if (errorData.error) errorMessage = errorData.error;\n } catch {}\n if (autoToast) toast.error(errorMessage);\n throw new Error(errorMessage);\n }\n return response.json();\n}\n\nexport async function apiPatch<T = unknown>(\n url: string,\n body?: unknown,\n options?: RequestInit & { autoToast?: boolean },\n): Promise<T> {\n const { autoToast = true, ...fetchOptions } = options || {};\n const response = await fetchWithAuth(url, {\n method: \"PATCH\",\n body: body ? JSON.stringify(body) : undefined,\n ...fetchOptions,\n });\n if (!response.ok) {\n let errorMessage = `Update Failed: ${response.status}`;\n try {\n const errorData = await response.json();\n if (errorData.error) errorMessage = errorData.error;\n } catch {}\n if (autoToast) toast.error(errorMessage);\n throw new Error(errorMessage);\n }\n return response.json();\n}\n\nexport async function apiPatchNoThrow<T = unknown>(\n url: string,\n body?: unknown,\n): Promise<{ ok: boolean; data?: T; error?: string }> {\n const response = await fetchWithAuth(url, {\n method: \"PATCH\",\n body: body ? JSON.stringify(body) : undefined,\n });\n if (!response.ok) {\n return { ok: false, error: `Error: ${response.status}` };\n }\n const data = await response.json();\n return { ok: true, data };\n}\n\nexport async function apiDelete<T = unknown>(\n url: string,\n options?: RequestInit & { autoToast?: boolean },\n): Promise<T> {\n const { autoToast = true, ...fetchOptions } = options || {};\n const response = await fetchWithAuth(url, {\n method: \"DELETE\",\n ...fetchOptions,\n });\n if (!response.ok) {\n let errorMessage = `Delete Failed: ${response.status}`;\n try {\n const errorData = await response.json();\n if (errorData.error) errorMessage = errorData.error;\n } catch {}\n if (autoToast) toast.error(errorMessage);\n throw new Error(errorMessage);\n }\n const text = await response.text();\n if (!text) return {} as T;\n return JSON.parse(text);\n}\n\nexport function buildQueryString(params: Record<string, unknown>): string {\n const urlParams = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null && value !== \"\") {\n urlParams.set(key, String(value));\n }\n }\n return urlParams.toString();\n}\n\nexport function withCacheBust(url: string): string {\n const separator = url.includes(\"?\") ? \"&\" : \"?\";\n return `${url}${separator}t=${Date.now()}`;\n}\n\nexport function buildSearchQuery(\n search: string,\n fields: string[],\n limit: number = 50,\n): string {\n if (!search || fields.length === 0) {\n return `limit=${limit}`;\n }\n const searchQuery = fields\n .map((f) => `where[${f}][contains]=${encodeURIComponent(search)}`)\n .join(\"&\");\n return `${searchQuery}&limit=${limit}`;\n}\n\nexport function buildCollectionUrl(\n collection: string,\n params?: Record<string, unknown>,\n): string {\n let url = `${API_BASE}/${collection}`;\n if (params) {\n const query = buildQueryString(params);\n if (query) url += `?${query}`;\n }\n return withCacheBust(url);\n}\n\nexport function buildDocumentUrl(\n collection: string,\n id: string,\n params?: Record<string, unknown>,\n): string {\n let url = `${API_BASE}/${collection}/${id}`;\n if (params) {\n const query = buildQueryString(params);\n if (query) url += `?${query}`;\n }\n return url;\n}\n\nexport async function apiUpload<T = unknown>(\n url: string,\n body: FormData,\n onProgress?: (percent: number) => void,\n): Promise<T> {\n if (!onProgress) {\n // Fast path: no progress tracking needed\n const response = await fetchWithAuth(url, {\n method: \"POST\",\n body,\n });\n if (!response.ok) {\n throw new Error(`Upload Error: ${response.status}`);\n }\n return response.json();\n }\n\n // Use XHR for upload progress events\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.open(\"POST\", resolveApi(url));\n xhr.withCredentials = true;\n\n xhr.upload.addEventListener(\"progress\", (e) => {\n if (e.lengthComputable) {\n onProgress(Math.round((e.loaded / e.total) * 100));\n }\n });\n\n xhr.addEventListener(\"load\", () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n try {\n resolve(JSON.parse(xhr.responseText));\n } catch {\n reject(new Error(\"Invalid JSON response\"));\n }\n } else if (xhr.status === 401) {\n // Attempt token refresh then retry once\n refreshToken().then((refreshed) => {\n if (!refreshed) { reject(new Error(`Upload Error: ${xhr.status}`)); return; }\n const xhr2 = new XMLHttpRequest();\n xhr2.open(\"POST\", resolveApi(url));\n xhr2.withCredentials = true;\n xhr2.upload.addEventListener(\"progress\", (e) => {\n if (e.lengthComputable) onProgress(Math.round((e.loaded / e.total) * 100));\n });\n xhr2.addEventListener(\"load\", () => {\n if (xhr2.status >= 200 && xhr2.status < 300) {\n try { resolve(JSON.parse(xhr2.responseText)); } catch { reject(new Error(\"Invalid JSON\")); }\n } else {\n reject(new Error(`Upload Error: ${xhr2.status}`));\n }\n });\n xhr2.addEventListener(\"error\", () => reject(new Error(\"Network error\")));\n xhr2.send(body);\n });\n } else {\n reject(new Error(`Upload Error: ${xhr.status}`));\n }\n });\n\n xhr.addEventListener(\"error\", () => reject(new Error(\"Network error during upload\")));\n xhr.send(body);\n });\n}","import { useState, useEffect, useMemo, useCallback, useRef } from \"react\";\nimport { Spinner } from \"./ui/Spinner\";\nimport { Plus } from \"./ui/icons\";\nimport { apiGet, apiDelete, withCacheBust } from \"../lib/api\";\n\nimport { useAuthStore } from \"../lib/stores\";\nimport { useUIStore } from \"../lib/stores\";\nimport { adminPath as ADMIN_BASE } from \"../lib/paths\";\nimport { PageHeader } from \"./ui/PageHeader\";\nimport { Badge } from \"./ui/Badge\";\n\n\nimport type { CollectionConfig, Field } from \"@kyro-cms/core\";\n\ntype FieldConfig = Field;\n\ninterface FilterConfig {\n field: string;\n operator:\n | \"equals\"\n | \"contains\"\n | \"gt\"\n | \"lt\"\n | \"gte\"\n | \"lte\"\n | \"between\"\n | \"in\";\n value: string;\n}\n\ninterface SortConfig {\n field: string;\n direction: \"asc\" | \"desc\";\n}\n\ninterface ListViewProps {\n collection: CollectionConfig;\n collectionSlug?: string;\n initialDocs?: any[];\n initialTotal?: number;\n onCreate?: () => void;\n onEdit?: (id: string) => void;\n // For legacy Admin.tsx compatibility\n config?: any;\n}\n\n/**\n * Unified ListView component used across both SPA (Admin.tsx) and MPA (Astro pages) modes.\n */\nexport function ListView({\n collection,\n collectionSlug: providedSlug,\n initialDocs = [],\n initialTotal = 0,\n onCreate: providedOnCreate,\n onEdit: providedOnEdit,\n config,\n}: ListViewProps) {\n const collectionSlug = providedSlug || collection.slug;\n const { permissions } = useAuthStore();\n const canCreate = permissions?.collections?.[collectionSlug]?.create !== false;\n const canDelete = permissions?.collections?.[collectionSlug]?.delete !== false;\n const canUpdate = permissions?.collections?.[collectionSlug]?.update !== false;\n\n const handleCreate = () => {\n if (!canCreate) return;\n if (providedOnCreate) {\n providedOnCreate();\n } else {\n window.location.href = `${ADMIN_BASE}/${collectionSlug}/new`;\n }\n };\n\n const handleEdit = (id: string) => {\n if (providedOnEdit) {\n providedOnEdit(id);\n } else {\n window.location.href = `${ADMIN_BASE}/${collectionSlug}/${id}`;\n }\n };\n\n const [docs, setDocs] = useState<any[]>(initialDocs);\n const [totalDocs, setTotalDocs] = useState(initialTotal);\n const [loading, setLoading] = useState(false);\n const [page, setPage] = useState(1);\n const [limit, setLimit] = useState(10);\n const [selectedIds, setSelectedIds] = useState<Set<string>>(new Set());\n const [search, setSearch] = useState(\"\");\n const [filters, setFilters] = useState<FilterConfig[]>([]);\n const { confirm, alert } = useUIStore();\n\n const addFilter = () => {\n setFilters([...filters, { field: \"\", operator: \"equals\", value: \"\" }]);\n };\n\n const clearAll = () => {\n setSearch(\"\");\n setFilters([]);\n setSort(null);\n };\n\n const removeFilter = (index: number) => {\n setFilters(filters.filter((_, i) => i !== index));\n };\n\n const updateFilter = (index: number, updates: Partial<FilterConfig>) => {\n setFilters(filters.map((f, i) => (i === index ? { ...f, ...updates } : f)));\n };\n const [sort, setSort] = useState<SortConfig | null>(null);\n const [showFilters, setShowFilters] = useState(false);\n const [showColumns, setShowColumns] = useState(false);\n\n function flattenFields(fields: FieldConfig[]): FieldConfig[] {\n const result: FieldConfig[] = [];\n for (const field of fields || []) {\n if (!field.name || field.admin?.hidden || field.name === \"id\") continue;\n if (field.type === \"tabs\" && field.tabs) {\n for (const tab of field.tabs) {\n if (tab.fields) {\n result.push(...flattenFields(tab.fields));\n }\n }\n } else if (\n (field.type === \"row\" || field.type === \"collapsible\") &&\n field.fields\n ) {\n result.push(...flattenFields(field.fields));\n } else {\n result.push(field);\n }\n }\n return result;\n }\n\n const allFields = useMemo(\n () => flattenFields(collection.fields),\n [collection.fields],\n );\n\n const titleField: string | undefined =\n typeof collection.admin?.useAsTitle === \"string\"\n ? collection.admin.useAsTitle\n : allFields.find((f) => f.type !== \"group\" && typeof f.name === \"string\")?.name;\n\n const [visibleColumns, setVisibleColumns] = useState<Set<string>>(() => {\n let cols: string[];\n if (collection.admin?.defaultColumns) {\n cols = [...(collection.admin?.defaultColumns as string[] || [])];\n } else {\n cols = allFields.slice(0, 4).map((f) => f.name).filter((n): n is string => !!n);\n }\n\n if (titleField && cols.includes(titleField)) {\n cols = [titleField, ...cols.filter((c) => c !== titleField)];\n }\n\n if (!cols.includes(\"updatedAt\")) {\n cols.push(\"updatedAt\");\n }\n\n return new Set(cols);\n });\n\n const toggleColumn = useCallback((fieldName: string) => {\n setVisibleColumns((prev) => {\n const next = new Set(prev);\n if (next.has(fieldName)) {\n next.delete(fieldName);\n } else {\n next.add(fieldName);\n }\n return next;\n });\n }, []);\n\n function resolveSortField(fieldName: string): string {\n const field = allFields.find((f) => f.name === fieldName);\n if (!field) return fieldName;\n if (field.type === \"group\" && field.fields?.[0]?.name) {\n return `${fieldName}.${field.fields[0].name}`;\n }\n return fieldName;\n }\n\n const handleSort = useCallback((fieldName: string) => {\n const resolvedField = resolveSortField(fieldName);\n setSort((prev) => {\n if (prev && prev.field === resolvedField) {\n return {\n field: resolvedField,\n direction: prev.direction === \"asc\" ? \"desc\" : \"asc\",\n };\n }\n return { field: resolvedField, direction: \"asc\" };\n });\n }, []);\n\n const displayFields = useMemo(\n () => allFields.filter((f): f is typeof f & { name: string } => !!f.name && visibleColumns.has(f.name)),\n [allFields, visibleColumns],\n );\n\n function fieldContainsTitle(field: FieldConfig): boolean {\n if (!field.name || !titleField) return false;\n if (field.name === titleField) return true;\n if (field.type === \"group\" && field.fields?.[0]?.name === titleField)\n return true;\n return false;\n }\n\n function extractFieldValue(doc: any, field: FieldConfig): any {\n if (!field.name) return null;\n if (doc[field.name] !== undefined && doc[field.name] !== null) {\n return doc[field.name];\n }\n if (field.type === \"group\" && typeof doc[field.name] === \"object\") {\n const firstFieldName = field.fields?.[0]?.name;\n if (\n firstFieldName &&\n doc[field.name][firstFieldName] !== undefined\n ) {\n return doc[field.name][firstFieldName];\n }\n const firstKey = Object.keys(doc[field.name] || {})[0];\n if (firstKey) return doc[field.name][firstKey];\n }\n return null;\n }\n\n const fetchDocs = useCallback(async () => {\n setLoading(true);\n try {\n const params = new URLSearchParams({\n page: page.toString(),\n limit: limit.toString(),\n });\n\n if (search) params.append(\"search\", search);\n if (sort) params.append(\"sort\", sort.field);\n if (sort) params.append(\"order\", sort.direction);\n if (filters.length > 0) {\n params.append(\"filters\", JSON.stringify(filters));\n }\n\n const result = (await apiGet(\n withCacheBust(`/api/${collectionSlug}?${params}`),\n { autoToast: false },\n ) as { docs?: Record<string, unknown>[]; totalDocs?: number });\n setDocs(result.docs || []);\n setTotalDocs(result.totalDocs || 0);\n } catch (error) {\n console.error(\"Failed to load docs:\", error);\n } finally {\n setLoading(false);\n }\n }, [collectionSlug, page, limit, search, sort, filters]);\n\n // Initial fetch only if not provided with initialDocs or if empty\n useEffect(() => {\n if (docs.length === 0 && initialTotal === 0) {\n fetchDocs();\n }\n }, []);\n\n // Subsequent fetches on filter/pagination changes\n const isFirstRender = useRef(true);\n useEffect(() => {\n if (isFirstRender.current) {\n isFirstRender.current = false;\n return;\n }\n fetchDocs();\n }, [page, limit, search, sort, filters]);\n\n const handleSelectAll = () => {\n if (selectedIds.size === docs.length) {\n setSelectedIds(new Set());\n } else {\n setSelectedIds(new Set(docs.map((d) => d.id)));\n }\n };\n\n const handleSelectOne = (id: string) => {\n const newSet = new Set(selectedIds);\n if (newSet.has(id)) {\n newSet.delete(id);\n } else {\n newSet.add(id);\n }\n setSelectedIds(newSet);\n };\n\n const handleBulkDelete = () => {\n confirm({\n title: \"Delete Documents\",\n message: `Are you sure you want to delete ${selectedIds.size} document(s)? This cannot be undone.`,\n variant: \"danger\",\n onConfirm: async () => {\n try {\n for (const id of Array.from(selectedIds)) {\n await apiDelete(`/api/${collectionSlug}/${id}`);\n }\n setSelectedIds(new Set());\n fetchDocs();\n } catch (error) {\n console.error(\"Bulk delete failed:\", error);\n alert({ title: \"Error\", message: \"Failed to delete some documents\" });\n }\n }\n });\n };\n\n const handleDeleteSingle = (id: string) => {\n confirm({\n title: \"Delete Document\",\n message: \"Are you sure you want to delete this document? This cannot be undone.\",\n variant: \"danger\",\n onConfirm: async () => {\n try {\n await apiDelete(`/api/${collectionSlug}/${id}`);\n fetchDocs();\n } catch (error) {\n console.error(\"Delete failed:\", error);\n alert({ title: \"Error\", message: \"Failed to delete document\" });\n }\n }\n });\n };\n\n const totalPages = Math.ceil(totalDocs / limit);\n const hasActiveFilters = search || filters.length > 0 || sort;\n\n return (\n <div className=\"space-y-6\">\n <PageHeader\n title={collection.label || collectionSlug}\n description={collection.admin?.description || `Manage your ${collection.label || collectionSlug}`}\n metadata={totalDocs > 0 ? [\n <span key=\"count\" className=\"text-xs font-bold opacity-60\">\n {totalDocs} documents\n </span>\n ] : undefined}\n action={canCreate ? {\n label: `Create ${collection.singularLabel || collection.label || collectionSlug}`,\n onClick: handleCreate,\n icon: Plus,\n } : undefined}\n\n />\n\n\n {/* Toolbar */}\n <div className=\"surface-tile p-4 flex flex-col lg:flex-row gap-4 items-start lg:items-center\">\n {/* Search */}\n <div className=\"relative flex-1 max-w-md\">\n <svg\n className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--kyro-text-secondary)]\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\"\n />\n </svg>\n <input\n type=\"text\"\n placeholder=\"Search...\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"w-full pl-10 pr-4 py-2.5 bg-[var(--kyro-bg)] border border-[var(--kyro-border)] rounded-xl text-sm font-medium text-[var(--kyro-text-primary)] placeholder:text-[var(--kyro-text-muted)] focus:outline-none focus:ring-2 focus:ring-[var(--kyro-sidebar-active)] focus:border-transparent\"\n />\n </div>\n\n <div className=\"flex items-center gap-2 flex-wrap\">\n {/* Filter Toggle */}\n <button\n type=\"button\"\n onClick={() => setShowFilters(!showFilters)}\n className={`flex items-center gap-2 px-4 py-2 rounded-xl font-bold text-sm transition-all ${showFilters || filters.length > 0\n ? \"bg-[var(--kyro-sidebar-active)] text-[var(--kyro-sidebar-text-active)]\"\n : \"bg-[var(--kyro-surface-accent)] text-[var(--kyro-text-secondary)] hover:text-[var(--kyro-text-primary)]\"\n }`}\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M3 4a1 1 0 011-1h16a1 1 0 011 1v2.586a1 1 0 01-.293.707l-6.414 6.414a1 1 0 00-.293.707V17l-4 4v-6.586a1 1 0 00-.293-.707L3.293 7.293A1 1 0 013 6.586V4z\"\n />\n </svg>\n Filters\n {filters.length > 0 && (\n <span className=\"ml-1 px-1.5 py-0.5 bg-[var(--kyro-sidebar-text-active)] text-[var(--kyro-sidebar-active)] rounded-full text-xs\">\n {filters.length}\n </span>\n )}\n </button>\n\n {/* Column Toggle */}\n <div className=\"relative\">\n <button\n type=\"button\"\n onClick={() => setShowColumns(!showColumns)}\n className=\"flex items-center gap-2 px-4 py-2 rounded-xl font-bold text-sm bg-[var(--kyro-surface-accent)] text-[var(--kyro-text-secondary)] hover:text-[var(--kyro-text-primary)] transition-all\"\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M9 17V7m0 10a2 2 0 01-2 2H5a2 2 0 01-2-2V7a2 2 0 012-2h2a2 2 0 012 2m0 10a2 2 0 002 2h2a2 2 0 002-2M9 7a2 2 0 012-2h2a2 2 0 012 2m0 10V7m0 10a2 2 0 002 2h2a2 2 0 002-2V7a2 2 0 00-2-2h-2a2 2 0 00-2 2\"\n />\n </svg>\n Columns\n </button>\n {showColumns && (\n <div className=\"absolute right-0 top-full mt-2 w-56 surface-tile border border-[var(--kyro-border)] rounded-lg shadow-xl z-50 overflow-hidden\">\n <div className=\"p-3 border-b border-[var(--kyro-border)]\">\n <span className=\"text-xs font-bold tracking-wider text-[var(--kyro-text-secondary)]\">\n Toggle Columns\n </span>\n </div>\n <div className=\"p-2 max-h-64 overflow-y-auto\">\n {allFields.map((field) => {\n if (!field.name) return null;\n return (\n <label\n key={field.name}\n className=\"flex items-center gap-3 px-3 py-2 rounded-lg hover:bg-[var(--kyro-surface-accent)] cursor-pointer\"\n >\n <input\n type=\"checkbox\"\n checked={visibleColumns.has(field.name)}\n onChange={() => toggleColumn(field.name!)}\n className=\"w-4 h-4 rounded border-[var(--kyro-border)] text-[var(--kyro-sidebar-active)] focus:ring-[var(--kyro-sidebar-active)]\"\n />\n <span className=\"text-sm font-medium text-[var(--kyro-text-primary)]\">\n {field.label || field.name}\n </span>\n </label>\n );\n })}\n </div>\n </div>\n )}\n </div>\n\n {/* Clear All */}\n {hasActiveFilters && (\n <button\n type=\"button\"\n onClick={clearAll}\n className=\"px-4 py-2 rounded-xl font-bold text-sm text-red-500 hover:bg-red-50 dark:hover:bg-red-500/10 transition-all\"\n >\n Clear All\n </button>\n )}\n </div>\n </div>\n\n {/* Filter Panel */}\n {showFilters && (\n <div className=\"surface-tile p-4 border-l-4 border-[var(--kyro-sidebar-active)]\">\n <div className=\"flex items-center justify-between mb-4\">\n <h3 className=\"font-medium text-[var(--kyro-text-primary)]\">\n Advanced Filters\n </h3>\n <button\n type=\"button\"\n onClick={addFilter}\n className=\"flex items-center gap-2 px-3 py-1.5 text-sm font-bold text-[var(--kyro-sidebar-active)] hover:bg-[var(--kyro-surface-accent)] rounded-lg transition-all\"\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M12 5v14M5 12h14\"\n />\n </svg>\n Add Filter\n </button>\n </div>\n <div className=\"space-y-3\">\n {filters.map((filter, index) => (\n <div key={index} className=\"flex flex-wrap gap-2 items-center\">\n <select\n value={filter.field}\n onChange={(e) =>\n updateFilter(index, { field: e.target.value })\n }\n className=\"px-3 py-2 bg-[var(--kyro-bg)] border border-[var(--kyro-border)] rounded-lg text-sm font-medium text-[var(--kyro-text-primary)]\"\n >\n {allFields.map((field) => (\n <option key={field.name} value={field.name}>\n {field.label || field.name}\n </option>\n ))}\n </select>\n <select\n value={filter.operator}\n onChange={(e) =>\n updateFilter(index, {\n operator: e.target.value as FilterConfig[\"operator\"],\n })\n }\n className=\"px-3 py-2 bg-[var(--kyro-bg)] border border-[var(--kyro-border)] rounded-lg text-sm font-medium text-[var(--kyro-text-primary)]\"\n >\n <option value=\"equals\">Equals</option>\n <option value=\"contains\">Contains</option>\n <option value=\"gt\">Greater than</option>\n <option value=\"lt\">Less than</option>\n <option value=\"gte\">Greater or equal</option>\n <option value=\"lte\">Less or equal</option>\n </select>\n <input\n type=\"text\"\n value={filter.value}\n onChange={(e) =>\n updateFilter(index, { value: e.target.value })\n }\n placeholder=\"Value...\"\n className=\"flex-1 min-w-[150px] px-3 py-2 bg-[var(--kyro-bg)] border border-[var(--kyro-border)] rounded-lg text-sm font-medium text-[var(--kyro-text-primary)]\"\n />\n <button\n type=\"button\"\n onClick={() => removeFilter(index)}\n className=\"p-2 text-[var(--kyro-text-muted)] hover:text-red-500 transition-colors\"\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n </div>\n ))}\n {filters.length === 0 && (\n <p className=\"text-sm text-[var(--kyro-text-muted)]\">\n No filters applied. Click \"Add Filter\" to create one.\n </p>\n )}\n </div>\n </div>\n )}\n\n {/* Bulk Actions */}\n {selectedIds.size > 0 && (\n <div className=\"surface-tile p-4 flex items-center justify-between border-l-4 border-[var(--kyro-sidebar-active)]\">\n <span className=\"text-sm font-medium text-[var(--kyro-text-primary)]\">\n {selectedIds.size} selected\n </span>\n <div className=\"flex gap-2\">\n {canDelete && (\n <button\n type=\"button\"\n onClick={handleBulkDelete}\n className=\"flex items-center gap-2 px-4 py-2 bg-red-500 text-white rounded-lg font-bold text-sm hover:bg-red-600 transition-all\"\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\"\n />\n </svg>\n Delete Selected\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => setSelectedIds(new Set())}\n className=\"px-4 py-2 text-[var(--kyro-text-secondary)] hover:text-[var(--kyro-text-primary)] font-bold text-sm transition-all\"\n >\n Cancel\n </button>\n </div>\n </div>\n )}\n\n {/* Data Table */}\n <div className=\"surface-tile overflow-hidden\">\n {loading ? (\n <div className=\"flex items-center justify-center py-20\">\n <Spinner />\n </div>\n ) : docs.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center py-16 px-8\">\n <div className=\"w-16 h-16 rounded-2xl bg-[var(--kyro-surface-accent)] flex items-center justify-center mb-4\">\n <svg\n className=\"w-8 h-8 text-[var(--kyro-text-muted)]\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"1.5\"\n d=\"M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10\"\n />\n </svg>\n </div>\n <p className=\"font-medium text-[var(--kyro-text-primary)] text-base\">\n No documents found\n </p>\n <p className=\"text-sm text-[var(--kyro-text-secondary)] mt-1\">\n {hasActiveFilters\n ? \"Try adjusting your filters or search query.\"\n : `Get started by creating your first ${((collection.singularLabel || collection.label || collectionSlug) as string).toLowerCase()}.`}\n </p>\n {!hasActiveFilters && canCreate && (\n <button\n type=\"button\"\n onClick={handleCreate}\n className=\"mt-4 kyro-btn kyro-btn-md kyro-btn-primary shadow-md flex items-center gap-2\"\n >\n <svg\n className=\"w-3.5 h-3.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2.5\"\n d=\"M12 5v14M5 12h14\"\n />\n </svg>\n Create{\" \"}\n{String(collection.singularLabel || collection.label || collectionSlug)}\n </button>\n )}\n </div>\n ) : (\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-left\">\n <thead>\n <tr className=\"text-[var(--kyro-text-secondary)] font-bold text-[10px] tracking-[0.3em] border-b border-[var(--kyro-border)]\">\n <th className=\"px-4 py-4 w-10\">\n <input\n type=\"checkbox\"\n checked={\n selectedIds.size === docs.length && docs.length > 0\n }\n onChange={handleSelectAll}\n className=\"w-4 h-4 rounded border-[var(--kyro-border-strong)] text-[var(--kyro-sidebar-active)] focus:ring-[var(--kyro-sidebar-active)]\"\n />\n </th>\n {displayFields.map((field) => (\n <th\n key={field.name}\n className=\"px-4 py-4 cursor-pointer hover:text-[var(--kyro-text-primary)] transition-colors\"\n onClick={() => handleSort(field.name)}\n >\n <div className=\"flex items-center gap-2\">\n {checkTabbedValue(displayFields, field.type) ??\n (field.label || field.name)}\n {sort && sort.field === field.name && (\n <svg\n className={`w-3 h-3 ${sort.direction === \"desc\" ? \"rotate-180\" : \"\"}`}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M5 15l7-7 7 7\"\n />\n </svg>\n )}\n </div>\n </th>\n ))}\n {collection.timestamps ? (\n <th className=\"px-4 py-4\">Created</th>\n ) : null}\n <th className=\"px-4 py-4 text-right\">Actions</th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-[var(--kyro-border)]\">\n {docs.map((doc) => (\n <tr\n key={doc.id}\n className=\"hover:bg-[var(--kyro-surface-accent)] transition-colors cursor-pointer group\"\n onClick={() => handleEdit(doc.id)}\n >\n <td\n className=\"px-4 py-3\"\n onClick={(e) => e.stopPropagation()}\n >\n <input\n type=\"checkbox\"\n checked={selectedIds.has(doc.id)}\n onChange={() => handleSelectOne(doc.id)}\n className=\"w-4 h-4 rounded border-[var(--kyro-border-strong)] text-[var(--kyro-sidebar-active)] focus:ring-[var(--kyro-sidebar-active)]\"\n />\n </td>\n {displayFields.map((field) => {\n const rawValue = extractFieldValue(doc, field);\n const cellValue =\n field.type === \"select\" && rawValue\n ? field.options?.find((o: any) => o.value === rawValue)\n ?.label || rawValue\n : formatCellValue(rawValue, field.type);\n return (\n <td\n key={field.name}\n className={`px-4 py-3 ${fieldContainsTitle(field) ? \"font-medium text-[var(--kyro-text-primary)]\" : \"text-[var(--kyro-text-secondary)]\"}`}\n >\n {cellValue}\n </td>\n );\n })}\n {collection.timestamps ? (\n <td className=\"px-4 py-3 text-sm text-[var(--kyro-text-secondary)]\">\n {doc.createdAt\n ? new Date(doc.createdAt as string).toLocaleDateString(\n \"en-US\",\n {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n },\n )\n : \"—\"}\n </td>\n ) : null}\n <td\n className=\"px-4 py-3 text-right\"\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"flex items-center justify-end gap-1 opacity-0 group-hover:opacity-100 transition-opacity\">\n <button\n type=\"button\"\n onClick={() => handleEdit(doc.id)}\n className=\"flex items-center gap-2 px-3 py-1.5 hover:bg-[var(--kyro-surface-accent)] rounded-lg text-sm font-bold text-[var(--kyro-text-secondary)] hover:text-[var(--kyro-text-primary)] transition-all\"\n title={canUpdate ? \"Edit\" : \"View\"}\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z\"\n />\n </svg>\n </button>\n {canDelete && (\n <button\n type=\"button\"\n onClick={() => handleDeleteSingle(doc.id)}\n className=\"inline-flex items-center justify-center w-8 h-8 rounded-md text-[var(--kyro-text-muted)] hover:bg-red-50 hover:text-red-500 dark:hover:bg-red-500/10 transition-colors\"\n title=\"Delete\"\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\"\n />\n </svg>\n </button>\n )}\n </div>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </div>\n\n {/* Pagination */}\n {totalDocs > limit && (\n <div className=\"flex flex-col lg:flex-row items-center justify-between gap-4 px-2\">\n <div className=\"flex items-center gap-4\">\n <span className=\"text-sm text-[var(--kyro-text-secondary)] font-medium\">\n Showing{\" \"}\n <span className=\"text-[var(--kyro-text-primary)] font-bold\">\n {(page - 1) * limit + 1}\n </span>{\" \"}\n to{\" \"}\n <span className=\"text-[var(--kyro-text-primary)] font-bold\">\n {Math.min(page * limit, totalDocs)}\n </span>{\" \"}\n of{\" \"}\n <span className=\"text-[var(--kyro-text-primary)] font-bold\">\n {totalDocs}\n </span>\n </span>\n <select\n value={limit}\n onChange={(e) => {\n setLimit(Number(e.target.value));\n setPage(1);\n }}\n className=\"px-2 py-1 bg-[var(--kyro-bg)] border border-[var(--kyro-border)] rounded-lg text-sm font-medium text-[var(--kyro-text-primary)]\"\n >\n <option value={10}>10 / page</option>\n <option value={25}>25 / page</option>\n <option value={50}>50 / page</option>\n <option value={100}>100 / page</option>\n </select>\n </div>\n <div className=\"flex gap-2\">\n {page > 1 && (\n <button\n type=\"button\"\n onClick={() => setPage(page - 1)}\n className=\"px-4 py-2 border border-[var(--kyro-border)] rounded-lg text-sm font-medium text-[var(--kyro-text-primary)] hover:bg-[var(--kyro-surface-accent)] transition-colors\"\n >\n ← Previous\n </button>\n )}\n {page < totalPages && (\n <button\n type=\"button\"\n onClick={() => setPage(page + 1)}\n className=\"px-4 py-2 bg-[var(--kyro-sidebar-active)] text-[var(--kyro-sidebar-text-active)] rounded-lg text-sm font-bold hover:opacity-90 transition-all\"\n >\n Next →\n </button>\n )}\n </div>\n </div>\n )}\n </div>\n );\n}\n\nfunction formatCellValue(value: any, type?: string): string {\n if (value === null || value === undefined) return \"—\";\n if (typeof value === \"boolean\") return value ? \"Yes\" : \"No\";\n if (type === \"number\" || type === \"price\") return String(value);\n if (type === \"date\" || type === \"datetime\") {\n return new Date(value).toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n }\n\n if (typeof value === \"object\") {\n if (value.title) return value.title;\n if (value.name) return value.name;\n if (value.email) return value.email;\n return JSON.stringify(value).slice(0, 50);\n }\n return String(value).slice(0, 60);\n}\n\nfunction checkTabbedValue(data: any[], type: string): string | undefined {\n if (type !== \"tabs\") return;\n const label = data[0]?.tabs?.[0]?.fields?.[0]?.label;\n return label;\n}\n","interface SpinnerProps {\n size?: \"sm\" | \"md\" | \"lg\";\n className?: string;\n}\n\nexport function Spinner({ size = \"md\", className = \"\" }: SpinnerProps) {\n return (\n <svg\n className={`kyro-spinner kyro-spinner-${size} ${className}`}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeDasharray=\"40 20\"\n />\n </svg>\n );\n}\n","import React, { type ReactNode } from \"react\";\nimport type { IconType } from \"react-icons\";\n\ninterface Breadcrumb {\n label: string;\n href?: string;\n onClick?: () => void;\n}\n\ninterface Action {\n label: string;\n onClick: () => void;\n icon?: IconType;\n variant?: \"primary\" | \"outline\" | \"ghost\";\n className?: string;\n}\n\ninterface PageHeaderProps {\n title?: string;\n description?: string;\n icon?: IconType;\n breadcrumbs?: Breadcrumb[];\n metadata?: ReactNode[];\n back?: { label?: string; href?: string; onClick?: () => void };\n action?: Action;\n actions?: ReactNode | Action[];\n children?: ReactNode;\n}\n\nexport function PageHeader({\n title,\n description,\n icon: Icon,\n breadcrumbs,\n metadata,\n back,\n action,\n actions,\n children,\n}: PageHeaderProps) {\n return (\n <div className=\"flex flex-col lg:flex-row lg:items-center surface-tile justify-between gap-6 pt-4 mb-8\">\n <div className=\"min-w-0 flex-1\">\n {/* Breadcrumbs / Back */}\n {(breadcrumbs || back) && (\n <div className=\"flex items-center gap-2 mb-3\">\n {back && (\n <a\n href={back.href}\n onClick={(e) => {\n if (back.onClick) {\n e.preventDefault();\n back.onClick();\n }\n }}\n className=\"p-1.5 rounded-lg hover:bg-[var(--kyro-surface-accent)] text-[var(--kyro-text-secondary)] transition-all\"\n >\n <svg className=\"w-4 h-4\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\">\n <path d=\"M19 12H5M12 19l-7-7 7-7\" />\n </svg>\n </a>\n )}\n {breadcrumbs?.map((crumb: Breadcrumb, i: number) => (\n <React.Fragment key={i}>\n {i > 0 && <span className=\"opacity-20 text-[10px]\">/</span>}\n {crumb.href || crumb.onClick ? (\n <a\n href={crumb.href}\n onClick={(e) => {\n if (crumb.onClick) {\n e.preventDefault();\n crumb.onClick();\n }\n }}\n className=\"text-[10px] font-bold tracking-widest text-[var(--kyro-text-secondary)] hover:text-[var(--kyro-primary)] transition-all\"\n >\n {crumb.label}\n </a>\n ) : (\n <span className=\"text-[10px] font-bold tracking-widest opacity-40\">\n {crumb.label}\n </span>\n )}\n </React.Fragment>\n ))}\n </div>\n )}\n\n <div className=\"flex items-center gap-3\">\n {Icon && <Icon className=\"w-6 h-6 text-[var(--kyro-primary)]\" />}\n {title && (\n <h1 className=\"text-xl font-bold tracking-tighter text-[var(--kyro-text-primary)] truncate\">\n {title}\n </h1>\n )}\n </div>\n\n {description && (\n <div className=\"flex items-center gap-2 mt-1\">\n <p className=\"text-[var(--kyro-text-secondary)] font-medium opacity-60 line-clamp-1\">\n {description}\n </p>\n {metadata && (\n <div className=\"flex items-center gap-2\">\n {metadata.map((item: ReactNode, i: number) => (\n <React.Fragment key={i}>\n {i === 0 && <span className=\"opacity-20 ml-1\">·</span>}\n {item}\n </React.Fragment>\n ))}\n </div>\n )}\n {children}\n </div>\n )}\n </div>\n\n <div className=\"flex items-center gap-3\">\n {actions && (\n Array.isArray(actions) ? (\n <div className=\"flex items-center gap-3\">\n {actions.map((act, i) => (\n <button\n key={i}\n type=\"button\"\n onClick={act.onClick}\n className={`flex items-center gap-2 px-6 py-2.5 rounded-xl font-bold text-sm transition-all shadow-lg shadow-[var(--kyro-primary)]/10 ${\n act.variant === \"outline\"\n ? \"border border-[var(--kyro-border)] text-[var(--kyro-text-secondary)] hover:bg-[var(--kyro-surface-accent)]\"\n : act.variant === \"ghost\"\n ? \"text-[var(--kyro-text-secondary)] hover:bg-[var(--kyro-surface-accent)] shadow-none\"\n : \"bg-[var(--kyro-primary)] text-white hover:opacity-90\"\n } ${act.className || \"\"}`}\n >\n {act.icon && <act.icon className=\"w-4 h-4\" />}\n {act.label}\n </button>\n ))}\n </div>\n ) : (\n actions\n )\n )}\n {action && (\n <button\n type=\"button\"\n onClick={action.onClick}\n className={`flex items-center gap-2 px-6 py-2.5 rounded-xl font-bold text-sm bg-[var(--kyro-primary)] text-white hover:opacity-90 transition-all shadow-lg shadow-[var(--kyro-primary)]/10 ${action.className || \"\"}`}\n >\n {action.icon && <action.icon className=\"w-4 h-4\" />}\n {action.label}\n </button>\n )}\n </div>\n </div>\n );\n}\n\n","import React, { useState, useEffect, useCallback } from \"react\";\nimport { apiGet, apiPatch, apiPost, apiDelete } from \"../lib/api\";\nimport type {\n KyroConfig,\n CollectionConfig,\n GlobalConfig,\n} from \"@kyro-cms/core/client\";\nimport { AutoForm } from \"./AutoForm\";\nimport { ActionBar, type DocumentStatus, type SaveStatus } from \"./ActionBar\";\nimport { Spinner } from \"./ui/Spinner\";\nimport { useToast } from \"./ui/Toast\";\nimport { useUIStore } from \"../lib/stores\";\nimport { PageHeader } from \"./ui/PageHeader\";\nimport { Badge } from \"./ui/Badge\";\nimport { adminPath } from \"../lib/paths\";\n\n\ninterface DetailViewProps {\n config: KyroConfig;\n collection?: CollectionConfig;\n global?: GlobalConfig;\n documentId?: string;\n onBack: () => void;\n onSave: () => void;\n onDelete?: () => void;\n onError: (message: string) => void;\n mode?: \"collection\" | \"global\";\n}\n\nexport function DetailView({\n config,\n collection,\n global,\n documentId,\n onBack,\n onSave,\n onDelete,\n onError,\n mode = \"collection\",\n}: DetailViewProps) {\n const { addToast } = useToast();\n const { confirm, alert } = useUIStore();\n const [data, setData] = useState<Record<string, unknown>>({});\n const [originalData, setOriginalData] = useState<Record<string, unknown>>({});\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n const [saveStatus, setSaveStatus] = useState<SaveStatus>(\"idle\");\n const [deleting, setDeleting] = useState(false);\n const [status, setStatus] = useState<DocumentStatus>(\"draft\");\n const [createdAt, setCreatedAt] = useState<string | null>(null);\n const [updatedAt, setUpdatedAt] = useState<string | null>(null);\n const [publishedAt, setPublishedAt] = useState<string | null>(null);\n const [justSaved, setJustSaved] = useState(false);\n\n const fields = global?.fields || collection?.fields || [];\n const label = global?.label || collection?.label || \"Document\";\n const slug = global?.slug || collection?.slug || \"\";\n\n const hasChanges = JSON.stringify(data) !== JSON.stringify(originalData);\n\n // Auto-set status to draft when there are changes from a published state\n useEffect(() => {\n if (hasChanges && status === \"published\") {\n setStatus(\"draft\");\n }\n }, [hasChanges, status]);\n\n useEffect(() => {\n if (hasChanges && saveStatus === \"saved\") {\n setSaveStatus(\"idle\");\n }\n }, [hasChanges, saveStatus]);\n\n useEffect(() => {\n if (mode === \"global\") {\n loadGlobal();\n } else if (documentId) {\n loadDocument();\n }\n }, [documentId, mode, slug]);\n\n\n const loadDocument = async () => {\n try {\n setLoading(true);\n const result = (await apiGet(`/api/${slug}/${documentId}`, { autoToast: false }) as {\n data?: Record<string, unknown>;\n status?: string;\n createdAt?: string;\n updatedAt?: string;\n publishedAt?: string;\n });\n const docData = result.data || {};\n setData(docData);\n setOriginalData(docData);\n setStatus((result.status || \"draft\") as DocumentStatus);\n setCreatedAt(result.createdAt || null);\n setUpdatedAt(result.updatedAt || null);\n setPublishedAt(result.publishedAt || null);\n } catch {\n onError(\"Failed to load document\");\n } finally {\n setLoading(false);\n }\n };\n\n const loadGlobal = async () => {\n try {\n setLoading(true);\n const result = (await apiGet(`/api/globals/${slug}`, { autoToast: false }) as {\n data?: Record<string, unknown>;\n createdAt?: string;\n updatedAt?: string;\n });\n const globalData = result.data || {};\n setData(globalData);\n setOriginalData(globalData);\n setCreatedAt(result.createdAt || null);\n setUpdatedAt(result.updatedAt || null);\n } catch {\n onError(\"Failed to load global\");\n } finally {\n setLoading(false);\n }\n };\n\n const handleSave = useCallback(\n async (isAutosave = false) => {\n try {\n setSaveStatus(\"saving\");\n const endpoint =\n mode === \"global\"\n ? `/api/globals/${slug}`\n : `/api/${slug}/${documentId}`;\n\n const result = (await apiPatch(endpoint, data) as { data?: Record<string, unknown> });\n const savedData = (result && (result.data || result)) || data;\n\n if (!isAutosave) {\n setOriginalData(savedData);\n onSave();\n }\n\n setData(savedData);\n setSaveStatus(\"saved\");\n setUpdatedAt(new Date().toISOString());\n\n // Show green border for 3 seconds after any save\n setJustSaved(true);\n setTimeout(() => setJustSaved(false), 3000);\n\n if (!isAutosave) {\n addToast?.(\"success\", \"Saved successfully\");\n }\n\n setTimeout(() => {\n setSaveStatus(\"idle\");\n }, 2000);\n } catch {\n setSaveStatus(\"error\");\n if (!isAutosave) {\n onError(\"Failed to save changes\");\n addToast?.(\"error\", \"Failed to save changes\");\n }\n } finally {\n setSaving(false);\n }\n },\n [data, mode, slug, documentId, onSave, onError],\n );\n\n const handlePublish = async () => {\n try {\n setSaving(true);\n await apiPost(`/api/${slug}/${documentId}/publish`);\n setStatus(\"published\");\n setPublishedAt(new Date().toISOString());\n addToast?.(\"success\", \"Published successfully\");\n } catch {\n onError(\"Failed to publish\");\n addToast?.(\"error\", \"Failed to publish\");\n } finally {\n setSaving(false);\n }\n };\n\n const handleUnpublish = async () => {\n try {\n setSaving(true);\n await apiPost(`/api/${slug}/${documentId}/unpublish`);\n setStatus(\"draft\");\n } catch {\n onError(\"Failed to unpublish\");\n } finally {\n setSaving(false);\n }\n };\n\n const handleDuplicate = async () => {\n try {\n console.log(`[Duplicate] Calling /api/${slug}/${documentId}/duplicate`);\n const result = await apiPost(`/api/${slug}/${documentId}/duplicate`);\n console.log(\"[Duplicate] Success:\", result);\n onError(\"Document duplicated successfully\");\n} catch (err: unknown) {\n console.error(\"[Duplicate] Error:\", err);\n const message = err instanceof Error ? err.message : \"Failed to duplicate document\";\n onError(message);\n }\n };\n\n const handleDeleteTrigger = () => {\n confirm({\n title: `Delete ${label}?`,\n message: \"This action cannot be undone.\",\n variant: \"danger\",\n onConfirm: async () => {\n try {\n setDeleting(true);\n await apiDelete(`/api/${slug}/${documentId}`);\n onDelete?.();\n} catch (err: unknown) {\n console.error(\"[Delete] Error:\", err);\n const message = err instanceof Error ? err.message : \"Failed to delete document\";\n alert({ title: \"Error\", message });\n } finally {\n setDeleting(false);\n }\n }\n });\n };\n\n if (loading) {\n return (\n <div className=\"kyro-detail\">\n <div className=\"kyro-loading\">\n <Spinner />\n </div>\n </div>\n );\n }\n\n const isSingleLayout =\n mode === \"global\" || collection?.admin?.layout === \"single\";\n\n return (\n <div className=\"kyro-detail\">\n <PageHeader\n back={{ onClick: onBack }}\n breadcrumbs={[\n { label: mode === \"global\" ? \"Globals\" : \"Collections\" },\n {\n label: label,\n href: mode === \"collection\" ? `${adminPath}/${slug}` : undefined\n },\n { label: mode === \"global\" ? \"Edit\" : documentId ? \"Edit\" : \"New\" }\n ]}\n title={\n (mode === \"global\" ? label : (data[collection?.admin?.useAsTitle || \"title\"] as string || data.name as string || documentId || `New ${collection?.singularLabel || label}`))\n }\n metadata={[\n <Badge\n key=\"status\"\n variant={status === \"published\" ? \"success\" : \"warning\"}\n dot\n className=\"text-[10px] font-bold \"\n >\n {status}\n </Badge>\n ]}\n />\n\n {!isSingleLayout && (\n\n <ActionBar\n status={status}\n saveStatus={saveStatus}\n hasChanges={hasChanges}\n onSave={() => handleSave(false)}\n onPublish={handlePublish}\n onUnpublish={status === \"published\" ? handleUnpublish : undefined}\n onDuplicate={handleDuplicate}\n onViewHistory={() => {\n window.dispatchEvent(new CustomEvent('kyro:show-version-history'));\n }}\n onPreview={() =>\n window.open(`/preview/${slug}/${documentId}`, \"_blank\")\n }\n onDelete={handleDeleteTrigger}\n publishedAt={publishedAt}\n updatedAt={updatedAt}\n />\n )}\n\n <div\n className={\n isSingleLayout\n ? \"w-full pb-32 pt-8\"\n : \"w-full mx-auto grid grid-cols-1 lg:grid-cols-[1fr_360px] gap-8 pb-32\"\n }\n >\n <div className=\"space-y-8 min-w-0\">\n <div className=\"surface-tile p-8\">\n <div className=\"flex items-center justify-between mb-8 px-1\">\n <h2 className=\"text-[10px] font-bold tracking-[0.2em] opacity-40\">\n Core Configuration\n </h2>\n <div className=\"h-px flex-1 bg-[var(--kyro-border)] ml-6 opacity-30\" />\n </div>\n <AutoForm\n config={\n collection\n ? { ...collection, fields: fields }\n : ({ slug: \"unknown\", fields: fields } as CollectionConfig)\n }\n data={data}\n onChange={setData}\n layout={isSingleLayout ? \"single\" : \"split\"}\n globalSlug={mode === \"global\" ? slug : undefined}\n collectionSlug={mode === \"collection\" ? slug : undefined}\n onActionSuccess={(message) => addToast?.(\"success\", message)}\n onActionError={(message) => addToast?.(\"error\", message)}\n documentStatus={status}\n justSaved={justSaved}\n />\n {isSingleLayout && (\n <div className=\"mt-8 pt-8 border-t border-[var(--kyro-border)] flex justify-end gap-3\">\n {mode === \"collection\" && documentId && (\n <button\n type=\"button\"\n onClick={handleDeleteTrigger}\n className=\"kyro-btn kyro-btn-lg kyro-btn-ghost text-[var(--kyro-error)]\"\n >\n Delete\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => handleSave(false)}\n disabled={saving}\n className=\"kyro-btn kyro-btn-lg kyro-btn-primary shadow-xl flex items-center gap-2\"\n >\n {saving ? (\n <svg\n className=\"w-4 h-4 animate-spin\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </svg>\n ) : (\n <svg\n className=\"w-4 h-4\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z\" />\n <polyline points=\"17 21 17 13 7 13 7 21\" />\n <polyline points=\"7 3 7 8 15 8\" />\n </svg>\n )}\n {saving\n ? \"Saving...\"\n : mode === \"global\"\n ? \"Save Configuration\"\n : \"Save Document\"}\n </button>\n </div>\n )}\n </div>\n </div>\n\n {!isSingleLayout && (\n <div className=\"space-y-6 animate-in fade-in slide-in-from-right-4 duration-500\">\n <div className=\"surface-tile p-8\">\n <h3 className=\"text-[10px] font-bold tracking-[0.2em] opacity-40 mb-6\">\n Metadata\n </h3>\n <div className=\"space-y-6\">\n <div className=\"flex flex-col gap-2\">\n <span className=\"text-[10px] font-bold tracking-widest opacity-40\">\n Dynamic Status\n </span>\n <div>\n <span\n className={`inline-flex items-center px-3 py-1 rounded-full text-[9px] font-bold tracking-widest ${status === \"published\" ? \"bg-green-500/10 text-green-500\" : \"bg-amber-500/10 text-amber-500\"}`}\n >\n {status || \"draft\"}\n </span>\n </div>\n </div>\n <div className=\"flex flex-col gap-2\">\n <span className=\"text-[10px] font-bold tracking-widest opacity-40\">\n Date Created\n </span>\n <span className=\"text-sm font-bold text-[var(--kyro-text-secondary)]\">\n {createdAt\n ? new Date(createdAt).toLocaleString(\"en-US\", {\n dateStyle: \"medium\",\n timeStyle: \"short\",\n })\n : \"N/A\"}\n </span>\n </div>\n <div className=\"flex flex-col gap-2\">\n <span className=\"text-[10px] font-bold tracking-widest opacity-40\">\n Last Modified\n </span>\n <span className=\"text-sm font-bold text-[var(--kyro-text-secondary)]\">\n {updatedAt\n ? new Date(updatedAt).toLocaleString(\"en-US\", {\n dateStyle: \"medium\",\n timeStyle: \"short\",\n })\n : \"Just now\"}\n </span>\n </div>\n {publishedAt && (\n <div className=\"flex flex-col gap-2\">\n <span className=\"text-[10px] font-bold tracking-widest opacity-40\">\n Public At\n </span>\n <span className=\"text-sm font-bold text-[var(--kyro-text-secondary)]\">\n {new Date(publishedAt).toLocaleString(\"en-US\", {\n dateStyle: \"medium\",\n timeStyle: \"short\",\n })}\n </span>\n </div>\n )}\n </div>\n </div>\n\n <div className=\"surface-tile p-8 bg-[var(--kyro-bg-secondary)]\">\n <h3 className=\"text-[10px] font-bold tracking-[0.2em] opacity-40 mb-4\">\n Quick Links\n </h3>\n <div className=\"space-y-3\">\n <button\n type=\"button\"\n onClick={handleDuplicate}\n className=\"kyro-btn kyro-btn-sm kyro-btn-ghost w-full justify-start\"\n >\n Duplicate Document\n </button>\n <button\n type=\"button\"\n onClick={() => window.open(`/preview/${slug}/${documentId}`, \"_blank\")}\n className=\"kyro-btn kyro-btn-sm kyro-btn-ghost w-full justify-start\"\n >\n View Public Page\n </button>\n <button\n type=\"button\"\n onClick={handleDeleteTrigger}\n className=\"kyro-btn kyro-btn-sm kyro-btn-ghost w-full justify-start text-[var(--kyro-error)] hover:bg-[var(--kyro-danger-bg)]\"\n >\n Delete Entry\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { useState, useRef, useEffect } from \"react\";\nimport type {\n CollectionConfig,\n GlobalConfig,\n Field,\n Block,\n} from \"@kyro-cms/core/client\";\n\ntype View = \"edit\" | \"version\" | \"api\";\nimport { UploadField } from \"./fields/UploadField\";\nimport { CodeField } from \"./fields\";\nimport NumberField from \"./fields/NumberField\";\nimport CheckboxField from \"./fields/CheckboxField\";\nimport SelectField from \"./fields/SelectField\";\nimport DateField from \"./fields/DateField\";\nimport { MarkdownField } from \"./fields/MarkdownField\";\nimport TextField from \"./fields/TextField\";\nimport { globals, collections } from \"../lib/config\";\nimport { slugifyText } from \"../lib/slugify\";\nimport { resolveUrl, apiDelete, fetchWithAuth } from \"../lib/api\";\nimport { useAutoFormStore } from \"../lib/autoform-store\";\nimport { useAutoFormState } from \"../hooks/useAutoFormState\";\nimport { useUIStore } from \"../lib/stores\";\n\nimport { adminPath as ADMIN_BASE, apiPath as API_BASE } from \"../lib/paths\";\n\nimport { BlocksField } from \"./fields/BlocksField\";\nimport PortableTextField from \"./fields/PortableTextField\";\nimport { ConfirmModal, Modal as UIModal } from \"./ui/Modal\";\nimport { ListField } from \"./fields/ListField\";\nimport { RelationshipBlockField } from \"./fields/RelationshipBlockField\";\nimport { FieldRenderer } from \"./FieldRenderer\";\nimport { TabsLayout } from \"./fields/TabsLayout\";\nimport { GroupLayout } from \"./fields/GroupLayout\";\nimport { ArrayLayout } from \"./fields/ArrayLayout\";\n\ninterface AutoFormProps {\n config: CollectionConfig | GlobalConfig;\n data?: Record<string, unknown>;\n errors?: Record<string, string>;\n onChange?: (data: Record<string, unknown>) => void;\n disabled?: boolean;\n collectionSlug?: string;\n globalSlug?: string;\n documentName?: string;\n layout?: \"split\" | \"single\";\n onActionSuccess?: (message: string) => void;\n onActionError?: (message: string) => void;\n justSaved?: boolean;\n documentStatus?: string;\n}\n\nexport function AutoForm({\n config: propConfig,\n data: initialData = {},\n errors = {},\n onChange,\n disabled: propDisabled,\n collectionSlug,\n globalSlug,\n documentName,\n layout = \"split\",\n onActionSuccess,\n onActionError,\n justSaved,\n}: AutoFormProps) {\n // Resolve the \"live\" config to preserve functions (admin.condition) lost during prop serialization\n const activeConfig = globalSlug\n ? globals[globalSlug]\n : collectionSlug\n ? collections[collectionSlug]\n : propConfig;\n const config = activeConfig || propConfig;\n\n\n const { confirm, alert } = useUIStore();\n\n const {\n formData,\n lastSavedData,\n hasUnsavedChanges,\n isAutoSaving,\n autoSaveStatus,\n sidebarCollapsed,\n setSidebarCollapsed,\n activeTab,\n setActiveTab,\n isSlugLocked,\n setIsSlugLocked,\n view,\n setView,\n isDropdownOpen,\n setIsDropdownOpen,\n versions,\n loadingVersions,\n showPreview,\n setShowPreview,\n isMenuOpen,\n setIsMenuOpen,\n loadingFields,\n setLoadingFields,\n compareMode,\n setCompareMode,\n compareSelected,\n setCompareSelected,\n compareDiffs,\n setCompareDiffs,\n loadingDiffs,\n setLoadingDiffs,\n setField,\n setFormData,\n markSaved,\n setLastSavedData,\n setAutoSaveStatus,\n fetchVersions,\n saveDocument,\n publishDocument,\n clearDraftArtifacts,\n autoSaveSkipRef,\n lastAutoSaveTimeRef,\n documentStatus,\n hasUnpublishedChanges,\n versionsEnabled,\n } = useAutoFormState({\n config,\n initialData,\n collectionSlug,\n globalSlug,\n onChange,\n onActionSuccess,\n onActionError,\n });\n\n const menuRef = useRef<HTMLDivElement>(null);\n const disabled = propDisabled;\n\n const handleRestoreVersion = (versionId: string) => {\n confirm({\n title: \"Restore Version\",\n message: \"Are you sure you want to restore this version? This will overwrite your current changes.\",\n onConfirm: async () => {\n try {\n const url = globalSlug\n ? resolveUrl(`/api/globals/${globalSlug}/versions/${versionId}/restore`)\n : resolveUrl(`/api/${collectionSlug}/${formData.id}/versions/${versionId}/restore`);\n\n // Try RESTful URL first\n let resp = await fetchWithAuth(url, { method: \"POST\" });\n\n // Fallback to legacy action-based URL for Collections if needed\n if (!resp.ok && collectionSlug) {\n resp = await fetchWithAuth(\n resolveUrl(`/api/${collectionSlug}/${formData.id}/versions`),\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ versionId, action: \"restore\" }),\n },\n );\n }\n\n const result = await resp.json();\n if (result.data) {\n setFormData(result.data);\n useAutoFormStore.getState().loadDocument(result.data, result.data);\n onActionSuccess?.(\"Version restored successfully\");\n fetchVersions();\n setView(\"edit\");\n } else {\n alert({ title: \"Error\", message: result.error || \"Failed to restore version\" });\n }\n } catch (err) {\n console.error(\"Failed to restore version:\", err);\n alert({ title: \"Error\", message: \"Failed to restore version\" });\n }\n }\n });\n };\n\n const handleCompareVersions = async () => {\n if (compareSelected.length !== 2) return;\n setLoadingDiffs(true);\n try {\n const resp = await fetchWithAuth(\n resolveUrl(`/api/${collectionSlug}/${formData.id}/versions?compareA=${compareSelected[0]}&compareB=${compareSelected[1]}`),\n );\n const data = await resp.json();\n setCompareDiffs(data.diffs || []);\n } catch (e) {\n console.error(\"Compare failed:\", e);\n setCompareDiffs([]);\n } finally {\n setLoadingDiffs(false);\n }\n };\n\n const toggleCompareSelection = (versionId: string) => {\n setCompareSelected((prev) => {\n if (prev.includes(versionId)) {\n return prev.filter((id) => id !== versionId);\n }\n if (prev.length >= 2) {\n return [prev[1], versionId];\n }\n return [...prev, versionId];\n });\n };\n\n useEffect(() => {\n const handleShortcuts = (e: KeyboardEvent) => {\n // Cmd/Ctrl + S = Publish\n if ((e.metaKey || e.ctrlKey) && e.key === \"s\") {\n e.preventDefault();\n (document.getElementById(\"btn-save\") as HTMLButtonElement | null)?.click();\n }\n // Cmd/Ctrl + P = Toggle Preview\n if ((e.metaKey || e.ctrlKey) && e.key === \"p\") {\n e.preventDefault();\n setShowPreview((prev) => !prev);\n }\n // Keys 1, 2, 3 = Tab Switching\n if (\n document.activeElement?.tagName !== \"INPUT\" &&\n document.activeElement?.tagName !== \"TEXTAREA\"\n ) {\n if (e.key === \"1\") setView(\"edit\");\n if (e.key === \"2\") setView(\"version\");\n if (e.key === \"3\") setView(\"api\");\n }\n };\n window.addEventListener(\"keydown\", handleShortcuts);\n return () => window.removeEventListener(\"keydown\", handleShortcuts);\n }, []);\n\n // Listen for external \"View History\" trigger from ActionBar\n useEffect(() => {\n const handler = () => setView(\"version\");\n window.addEventListener(\"kyro:show-version-history\", handler);\n return () => window.removeEventListener(\"kyro:show-version-history\", handler);\n }, []);\n\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(e.target as Node)) {\n setIsMenuOpen(false);\n }\n };\n if (isMenuOpen) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () =>\n document.addEventListener(\"mousedown\", handleClickOutside);\n }\n }, [isMenuOpen]);\n\n const handleCreateNew = () => {\n if (hasUnsavedChanges) {\n confirm({\n title: \"Unsaved Changes\",\n message: \"You have unsaved changes. Save before creating new?\",\n onConfirm: async () => {\n (document.getElementById(\"btn-save\") as HTMLButtonElement | null)?.click();\n await new Promise((r) => setTimeout(r, 1000));\n window.location.href = `${ADMIN_BASE}/${collectionSlug}/new`;\n },\n });\n } else {\n window.location.href = `${ADMIN_BASE}/${collectionSlug}/new`;\n }\n };\n\n const handleDuplicate = () => {\n confirm({\n title: \"Duplicate Document\",\n message: \"Are you sure you want to duplicate this document?\",\n onConfirm: async () => {\n try {\n const { id, createdAt, updatedAt, ...duplicateData } = formData;\n const response = await fetchWithAuth(`/api/${collectionSlug}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n ...duplicateData,\n title: `${duplicateData.title || duplicateData.name || \"Copy\"} (Copy)`,\n slug: `${duplicateData.slug || \"copy\"}-${Date.now()}`,\n status: \"draft\",\n }),\n });\n\n if (response.ok) {\n const result = await response.json();\n onActionSuccess?.(\"Document duplicated successfully\");\n if (result.data?.id) {\n window.location.href = `${ADMIN_BASE}/${collectionSlug}/${result.data.id}`;\n }\n } else {\n const error = await response.json();\n alert({\n title: \"Error\",\n message: error.error || \"Failed to duplicate document\",\n });\n }\n } catch (err) {\n alert({\n title: \"Error\",\n message: \"Failed to duplicate document\",\n });\n }\n },\n });\n };\n\n const handleDelete = () => {\n confirm({\n title: \"Delete Document\",\n message: \"Delete this document? This cannot be undone. Are you absolutely sure?\",\n variant: \"danger\",\n onConfirm: async () => {\n try {\n await apiDelete(`/api/${collectionSlug}/${formData.id}`);\n window.location.href = `${ADMIN_BASE}/${collectionSlug}`;\n } catch (err) {\n alert({\n title: \"Error\",\n message: (err as Error).message || \"Failed to delete document\",\n });\n }\n },\n });\n };\n\n const handleUnpublish = () => {\n confirm({\n title: \"Unpublish Document\",\n message: \"Unpublish this document?\",\n onConfirm: async () => {\n try {\n const response = await fetchWithAuth(\n resolveUrl(`/api/${collectionSlug}/${formData.id}/unpublish`),\n {\n method: \"POST\",\n },\n );\n if (response.ok) {\n onActionSuccess?.(\"Document unpublished successfully\");\n location.reload();\n } else {\n const error = await response.json();\n alert({\n title: \"Error\",\n message: error.error || \"Failed to unpublish\",\n });\n }\n } catch (err) {\n alert({\n title: \"Error\",\n message: \"Failed to unpublish\",\n });\n }\n },\n });\n };\n\n const handleFieldChange = (fieldName: string, value: unknown) => {\n setField(fieldName, value);\n };\n\n const renderField = (\n field: Field,\n parentData?: Record<string, unknown>,\n onParentChange?: (val: unknown) => void,\n ): React.ReactNode => {\n if (field.admin?.hidden) return null;\n\n const currentData = parentData !== undefined ? parentData : formData;\n\n // Evaluate display condition if present\n // For conditional fields, pass formData as the root context (first arg)\n // and currentData as the sibling context (second arg)\n if (field.admin?.condition && typeof field.admin.condition === \"function\") {\n try {\n const shouldShow = field.admin.condition(formData, currentData);\n if (!shouldShow) {\n return null;\n }\n } catch (e) {\n console.warn(`Condition error for field ${field.name}:`, e);\n // Show the field if there's an error evaluating the condition\n }\n }\n\n const value = currentData[field.name!];\n const error = errors[field.name!];\n\n const onFieldChange = (val: unknown) => {\n if (onParentChange) {\n onParentChange({ ...currentData, [field.name!]: val });\n } else {\n handleFieldChange(field.name!, val);\n }\n };\n\nif (field.type === \"row\" && \"fields\" in field) {\n const rowFields = (field as Field & { fields?: Field[] }).fields;\n return (\n <div\n key={field.name || `row-${Math.random()}`}\n className=\"kyro-form-row flex gap-6 items-end\"\n >\n {rowFields?.map((f: Field) => {\n const fAdmin = f.admin || {};\n const actionUrl = fAdmin?.action as string | undefined;\n\n if (f.type === \"button\" && actionUrl) {\n const siblingEmailField = rowFields?.find(\n (ff: Field) => ff.type === \"email\",\n );\n return (\n <div key={f.name} className=\"flex-shrink-0\">\n <button\n type=\"button\"\n onClick={async () => {\n const rowName = field.name as string | undefined;\n const emailFieldName = siblingEmailField?.name as string | undefined;\n let emailValue = emailFieldName ? formData[emailFieldName] : undefined;\n if (!emailValue && rowName && typeof rowName === \"string\" && emailFieldName) {\n emailValue = (formData[rowName] as Record<string, unknown>)?.[emailFieldName] as string | undefined;\n }\n if (!emailValue) return;\n\n setLoadingFields((prev) => ({\n ...prev,\n [f.name as string]: true,\n }));\n try {\n const response = await fetchWithAuth(resolveUrl(actionUrl), {\n method: (fAdmin.method as string) || \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ email: emailValue }),\n });\n let result: { success?: boolean; message?: string; error?: string } = {};\n try {\n result = await response.json() as typeof result;\n } catch {\n result = {};\n }\n if (response.ok && result.success) {\n onActionSuccess?.(\n result.message || \"Action completed successfully\",\n );\n } else {\n const errorMsg =\n result.error ||\n `Request failed (${response.status})`;\n onActionError?.(errorMsg);\n }\n } catch (err: unknown) {\n onActionError?.(\n err instanceof Error ? err.message : \"Error connecting to server\",\n );\n } finally {\n setLoadingFields((prev) => ({\n ...prev,\n [f.name as string]: false,\n }));\n }\n }}\n //@ts-ignore\n disabled={loadingFields[f.name as string] || disabled}\n className=\"bg-[var(--kyro-primary)] text-white px-4 py-2 rounded-lg font-medium hover:opacity-90 transition-opacity disabled:opacity-50\"\n >\n {loadingFields[f.name as string] ? \"Sending...\" : f.label || \"Click\"}\n </button>\n </div>\n );\n }\n\n return (\n <div\n key={f.name}\n className={f.type === \"button\" ? \"flex-shrink-0\" : \"flex-1\"}\n style={\n fAdmin?.width ? { width: fAdmin.width as string, flex: \"none\" } : {}\n }\n >\n {renderField(f, parentData, onParentChange)}\n </div>\n );\n })}\n </div>\n );\n }\n\n switch (field.type) {\n case \"tabs\":\n return (\n <TabsLayout\n key={field.name || `tabs-${Math.random()}`}\n field={field}\n formData={formData}\n onTabDataChange={(newTabData) => {\n const updateTabData = useAutoFormStore.getState().updateTabData;\n updateTabData(field.name as string, newTabData);\n }}\n renderField={renderField}\n />\n );\n\n case \"group\":\n return (\n <GroupLayout\n key={field.name}\n field={field}\n value={value as Record<string, unknown> | null}\n onChange={onFieldChange}\n renderField={renderField}\n />\n );\n\n case \"array\":\n return (\n <ArrayLayout\n key={field.name}\n field={field}\n value={value as unknown[]}\n onChange={onFieldChange}\n renderField={renderField}\n disabled={disabled}\n />\n );\n\n\n case \"button\": {\n const fieldName = field.name as string;\n const isLoading = loadingFields[fieldName];\n return (\n <div key={fieldName} className=\"kyro-form-field\">\n <button\n type=\"button\"\n disabled={isLoading || disabled}\n onClick={async () => {\n const action = (field.admin?.action || (field as Record<string, unknown>).action) as string | undefined;\n const method =\n (field.admin?.method || (field as Record<string, unknown>).method || \"POST\") as string;\n if (action) {\n setLoadingFields((prev) => ({\n ...prev,\n [fieldName]: true,\n }));\n try {\n const response = await fetchWithAuth(action, {\n method,\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(formData),\n });\n await response.json();\n if (response.ok) {\n // handle result\n } else {\n // handle error\n }\n } catch (err) {\n console.error(\"Error executing action:\", err);\n } finally {\n setLoadingFields((prev) => ({\n ...prev,\n [fieldName]: false,\n }));\n }\n }\n }}\n className={`kyro-btn kyro-btn-md kyro-btn-secondary transition-all active:scale-95 whitespace-nowrap flex items-center gap-2 ${isLoading ? \"opacity-70 cursor-not-allowed\" : \"\"}`}\n >\n {isLoading && (\n <svg\n className=\"animate-spin h-3 w-3 text-white\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n ></circle>\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n ></path>\n </svg>\n )}\n {isLoading ? \"Processing...\" : field.label || \"Click\"}\n </button>\n </div>\n );\n }\n\n case \"relationship-block\":\n return (\n <div key={field.name} className=\"kyro-form-field\">\n <label className=\"kyro-form-label\">\n {field.label || field.name}\n {field.required && (\n <span className=\"kyro-form-label-required\">*</span>\n )}\n </label>\n <RelationshipBlockField\n relationTo={field.relationTo as string}\n hasMany={field.hasMany as boolean}\n selectedIds={Array.isArray(value) ? value : value ? [value] : []}\n onChange={(_field: string, newValue: unknown) => {\n onFieldChange(newValue);\n }}\n compact\n />\n {field.admin?.description ? (\n <p className=\"kyro-form-help\">{String(field.admin?.description)}</p>\n ) : null}\n </div>\n );\n\n default:\n return (\n <FieldRenderer\n key={field.name || Math.random().toString()}\n field={field}\n value={value}\n onChange={onFieldChange}\n error={error}\n disabled={disabled}\n />\n );\n }\n };\n\n const renderHeader = () => {\n const docTitle = String(\n (formData.mainTabs as { title?: string })?.title ||\n formData.title ||\n formData.name ||\n \"Untitled\",\n );\n // Use _status from the document (set by the new draft/publish system)\n const docStatus = documentStatus ?? formData._status ?? formData.status ?? 'draft';\n const isNew = !formData.id;\n const lastModified = formData.updatedAt\n ? new Date(formData.updatedAt as string).toLocaleString()\n : \"Just now\";\n const createdAt = formData.createdAt\n ? new Date(formData.createdAt as string).toLocaleString()\n : \"Just now\";\n\n // Status label shown in the header\n const statusLabel = hasUnpublishedChanges\n ? docStatus === 'draft' && !formData._prevStatus\n ? 'Draft'\n : 'Published (unpublished changes)'\n : docStatus === 'published'\n ? 'Published'\n : 'Draft';\n\n const statusColor = docStatus === 'published' && !hasUnpublishedChanges\n ? 'bg-[var(--kyro-success)]'\n : hasUnpublishedChanges\n ? 'bg-[var(--kyro-warning)]'\n : 'bg-[var(--kyro-text-muted)]';\n\n return (\n <header className=\"surface-tile px-8 py-6 flex items-center justify-between sticky top-0 z-50 border-b border-[var(--kyro-border)] mb-8 bg-[var(--kyro-surface)] backdrop-blur-md\">\n <div className=\"flex flex-col gap-1\">\n <div className=\"flex items-center gap-4\">\n <a\n href={`/${collectionSlug}`}\n className=\"p-2 border border-[var(--kyro-border)] rounded-xl hover:bg-[var(--kyro-bg-secondary)] transition-colors\"\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2.5\"\n d=\"M15 19l-7-7 7-7\"\n />\n </svg>\n </a>\n <h1 className=\"text-xl font-bold tracking-tighter\">{docTitle}</h1>\n </div>\n <div className=\"flex items-center gap-4 text-[11px] font-medium tracking-wide opacity-60 ml-12\">\n <span className=\"flex items-center gap-1.5 capitalize\">\n <span\n className={`h-1.5 w-1.5 rounded-full ${statusColor}`}\n />\n {statusLabel}\n </span>\n {autoSaveStatus === \"saving\" && (\n <span className=\"flex items-center gap-1.5 text-[var(--kyro-text-muted)]\">\n <svg\n className=\"animate-spin h-3 w-3\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\"\n />\n </svg>\n Saving draft...\n </span>\n )}\n {autoSaveStatus === \"success\" && (\n <span className=\"text-[var(--kyro-success)] flex items-center gap-1\">\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n >\n <path d=\"M20 6L9 17l-5-5\" />\n </svg>\n Draft saved\n </span>\n )}\n {autoSaveStatus === \"error\" && (\n <span className=\"text-[var(--kyro-danger)]\">Draft save failed</span>\n )}\n {autoSaveStatus === \"conflict\" && (\n <span className=\"text-[var(--kyro-danger)]\">Conflict detected</span>\n )}\n {hasUnsavedChanges && autoSaveStatus !== \"saving\" && (\n <>\n <span className=\"opacity-30\">—</span>\n <button\n type=\"button\"\n onClick={async () => {\n setFormData(lastSavedData);\n markSaved();\n await clearDraftArtifacts();\n }}\n className=\"text-[var(--kyro-primary)] hover:underline\"\n >\n Revert changes\n </button>\n </>\n )}\n <span className=\"border-l border-[var(--kyro-border)] pl-4\">\n Modified {lastModified}\n </span>\n <span className=\"border-l border-[var(--kyro-border)] pl-4\">\n Created {createdAt}\n </span>\n </div>\n </div>\n\n <div className=\"flex items-center gap-6\">\n <div className=\"flex items-center gap-1 bg-[var(--kyro-bg-secondary)] p-1 rounded-xl border border-[var(--kyro-border)]\">\n {[\"edit\", \"version\", \"api\"].map((v) => (\n <button\n key={v}\n type=\"button\"\n onClick={() => setView(v as View)}\n className={`px-5 py-2 text-xs font-bold rounded-lg transition-all ${view === v ? \"bg-[var(--kyro-surface)] shadow-sm border border-[var(--kyro-border)] text-[var(--kyro-text-primary)]\" : \"text-[var(--kyro-text-secondary)] opacity-50 hover:opacity-100\"}`}\n >\n {v.toUpperCase()}\n </button>\n ))}\n </div>\n\n <div className=\"h-8 w-px bg-[var(--kyro-border)] mx-2\" />\n\n <div className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={() => setShowPreview(!showPreview)}\n className={`p-2.5 rounded-xl transition-all flex items-center gap-2 ${showPreview ? \"bg-[var(--kyro-primary)] text-white shadow-lg\" : \"text-[var(--kyro-text-secondary)] hover:bg-[var(--kyro-bg-secondary)]\"}`}\n title=\"Live Preview\"\n >\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6M15 3h6v6M10 14L21 3\" />\n </svg>\n {showPreview && (\n <span className=\"text-[10px] font-bold tracking-widest pr-1\">\n Active\n </span>\n )}\n </button>\n <button\n type=\"button\"\n onClick={() => {\n window.dispatchEvent(new CustomEvent(\"toggle-sidebar\"));\n }}\n className={`p-2.5 rounded-xl transition-all ${sidebarCollapsed ? \"bg-[var(--kyro-primary)] text-white\" : \"text-[var(--kyro-text-secondary)] hover:bg-[var(--kyro-bg-secondary)]\"}`}\n title=\"Toggle Sidebar\"\n >\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\" />\n <line x1=\"9\" y1=\"3\" x2=\"9\" y2=\"21\" />\n </svg>\n </button>\n\n <button\n id=\"btn-save\"\n type=\"button\"\n onClick={async () => {\n autoSaveSkipRef.current = true;\n const hiddenInput = document.getElementById(\n \"form-data\",\n ) as HTMLInputElement;\n if (!hiddenInput || !hiddenInput.value) return;\n\n const btn = document.getElementById(\n \"btn-save\",\n ) as HTMLButtonElement;\n const originalText = btn?.textContent || \"\";\n if (btn) {\n btn.textContent = \"Saving...\";\n btn.setAttribute(\"disabled\", \"true\");\n }\n\n try {\n const data = JSON.parse(hiddenInput.value);\n const isPost = isNew && !globalSlug;\n\n const response = isPost\n ? await fetchWithAuth(`/api/${collectionSlug}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(data),\n })\n : await saveDocument(data);\n\n if (response.ok) {\n const result = await response.json();\n setFormData(result.data || data);\n setLastSavedData(result.data || data);\n lastAutoSaveTimeRef.current = Date.now();\n setAutoSaveStatus(\"success\");\n await clearDraftArtifacts();\n if (versionsEnabled) fetchVersions();\n setTimeout(() => setAutoSaveStatus(\"idle\"), 2000);\n onActionSuccess?.(\n isPost ? \"Document created successfully\" : \"Changes saved\",\n );\n if (globalSlug) {\n setTimeout(() => {\n window.location.reload();\n }, 1000);\n }\n if (isPost) {\n setTimeout(() => {\n window.location.href = `/${collectionSlug}`;\n }, 800);\n }\n } else {\n const error = await response.json();\n if (response.status === 409) {\n setAutoSaveStatus(\"conflict\");\n }\n alert({\n title: response.status === 409 ? \"Conflict detected\" : \"Error\",\n message: error.error || \"Failed to save\",\n });\n }\n } catch (err) {\n alert({\n title: \"Error\",\n message: \"Failed to save document\",\n });\n } finally {\n autoSaveSkipRef.current = false;\n if (btn) {\n btn.textContent = originalText;\n btn.removeAttribute(\"disabled\");\n }\n }\n }}\n className=\"kyro-btn kyro-btn-primary px-6 py-2.5 text-xs rounded-xl shadow-lg transition-all\"\n >\n {isNew ? (globalSlug ? \"Save\" : \"Create\") : hasUnsavedChanges ? (versionsEnabled ? \"Save Draft\" : \"Save\") : \"Saved\"}\n </button>\n\n {!isNew && versionsEnabled && documentStatus === \"draft\" && (\n <button\n id=\"btn-publish\"\n type=\"button\"\n onClick={async () => {\n autoSaveSkipRef.current = true;\n const btn = document.getElementById(\n \"btn-publish\",\n ) as HTMLButtonElement;\n const originalText = btn?.textContent || \"\";\n if (btn) {\n btn.textContent = \"Publishing...\";\n btn.setAttribute(\"disabled\", \"true\");\n }\n\n try {\n if (hasUnsavedChanges) {\n const saveResponse = await saveDocument(formData);\n if (!saveResponse.ok) {\n const saveError = await saveResponse.json().catch(() => ({}));\n if (saveResponse.status === 409) {\n setAutoSaveStatus(\"conflict\");\n }\n alert({\n title:\n saveResponse.status === 409\n ? \"Conflict detected\"\n : \"Error\",\n message: saveError.error || \"Failed to save latest draft before publishing\",\n });\n return;\n }\n\n const saveResult = await saveResponse.json();\n setFormData(saveResult.data || formData);\n setLastSavedData(saveResult.data || formData);\n }\n\n const response = await publishDocument();\n\n if (response.ok) {\n await clearDraftArtifacts();\n onActionSuccess?.(\"Published successfully\");\n location.reload();\n } else {\n const error = await response.json();\n if (response.status === 409) {\n setAutoSaveStatus(\"conflict\");\n }\n alert({\n title: response.status === 409 ? \"Conflict detected\" : \"Error\",\n message: error.error || \"Failed to publish\",\n });\n }\n } catch (err) {\n alert({\n title: \"Error\",\n message: \"Failed to publish\",\n });\n } finally {\n autoSaveSkipRef.current = false;\n if (btn) {\n btn.textContent = originalText;\n btn.removeAttribute(\"disabled\");\n }\n }\n }}\n className=\"px-6 py-2.5 text-xs font-bold rounded-xl border-2 border-[var(--kyro-border)] text-[var(--kyro-text-primary)] hover:border-[var(--kyro-primary)] hover:bg-[var(--kyro-primary)] hover:text-white transition-all\"\n >\n {formData._prevStatus === 'published' ? 'Publish Changes' : 'Publish'}\n </button>\n )}\n\n <div ref={menuRef} className=\"relative\">\n <button\n type=\"button\"\n onClick={() => setIsMenuOpen(!isMenuOpen)}\n className=\"p-2.5 text-[var(--kyro-text-secondary)] hover:bg-[var(--kyro-bg-secondary)] rounded-xl transition-all\"\n >\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"12\" cy=\"5\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"12\" cy=\"19\" r=\"1.5\" fill=\"currentColor\" />\n </svg>\n </button>\n {isMenuOpen && (\n <div className=\"absolute right-0 mt-2 w-48 rounded-lg border border-[var(--kyro-border)] bg-[var(--kyro-surface)] shadow-2xl z-50 overflow-hidden\">\n <button\n type=\"button\"\n onClick={() => {\n handleCreateNew();\n setIsMenuOpen(false);\n }}\n className=\"w-full px-4 py-2.5 text-left text-xs font-medium text-[var(--kyro-text-primary)] hover:bg-[var(--kyro-surface-accent)] flex items-center gap-3 transition-colors\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"></line>\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"></line>\n </svg>\n Create New\n </button>\n {!isNew && (\n <>\n <button\n type=\"button\"\n onClick={() => {\n handleDuplicate();\n setIsMenuOpen(false);\n }}\n className=\"w-full px-4 py-2.5 text-left text-xs font-medium text-[var(--kyro-text-primary)] hover:bg-[var(--kyro-surface-accent)] flex items-center gap-3 transition-colors\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <rect\n x=\"9\"\n y=\"9\"\n width=\"13\"\n height=\"13\"\n rx=\"2\"\n ry=\"2\"\n ></rect>\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"></path>\n </svg>\n Duplicate\n </button>\n {formData._status === \"published\" && (\n <button\n type=\"button\"\n onClick={() => {\n handleUnpublish();\n setIsMenuOpen(false);\n }}\n className=\"w-full px-4 py-2.5 text-left text-xs font-medium text-[var(--kyro-text-primary)] hover:bg-[var(--kyro-surface-accent)] flex items-center gap-3 transition-colors\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24\"></path>\n <line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\"></line>\n </svg>\n Unpublish\n </button>\n )}\n <div className=\"h-px bg-[var(--kyro-border)]\" />\n <button\n type=\"button\"\n onClick={() => {\n handleDelete();\n setIsMenuOpen(false);\n }}\n className=\"w-full px-4 py-2.5 text-left text-xs font-medium text-red-600 hover:bg-red-50 flex items-center gap-3 transition-colors\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <polyline points=\"3 6 5 6 21 6\"></polyline>\n <path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\"></path>\n </svg>\n Delete\n </button>\n </>\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n </header>\n );\n };\n\n const renderEditView = () => {\n // Single layout: no split grid, no sidebar column — just a clean field list\n if (layout === \"single\") {\n return (\n <div className=\"w-full space-y-8\">\n <div className=\"surface-tile p-8 space-y-8\">\n {config.fields.map((f: Field) => renderField(f))}\n </div>\n </div>\n );\n }\n\n // Default split layout\n const showRightColumn = !sidebarCollapsed && !showPreview;\n const hasSidebarFields =\n config.fields.some((f: Field) => f.admin?.position === \"sidebar\") &&\n !showPreview;\n\n return (\n <div\n className={`w-full mx-auto grid gap-8 pb-32 transition-all duration-700 ${showPreview\n ? \"grid-cols-1 lg:grid-cols-2\"\n : sidebarCollapsed || !hasSidebarFields\n ? \"grid-cols-1\"\n : \"grid-cols-1 lg:grid-cols-[1fr_380px]\"\n }`}\n >\n <div className=\"space-y-8 animate-in fade-in slide-in-from-left-4 duration-500\">\n {config.tabs ? (\n renderField({ type: \"tabs\", tabs: config.tabs } as Field)\n ) : (\n <div className=\"surface-tile p-8 space-y-8\">\n {config.fields\n .filter(\n (f: Field) => !f.admin?.position || f.admin.position === \"main\",\n )\n .map((f: Field) => renderField(f))}\n </div>\n )}\n </div>\n\n {showPreview ? (\n <div className=\"sticky top-36 h-[calc(100vh-280px)] animate-in fade-in slide-in-from-right-10 duration-700\">\n <div className=\"w-full h-full rounded-3xl border border-[var(--kyro-border)] bg-[var(--kyro-bg-secondary)] shadow-2xl overflow-hidden relative group\">\n <div className=\"absolute top-4 left-4 z-10 flex items-center gap-2\">\n <div className=\"h-2 w-2 rounded-full bg-green-500 animate-pulse\" />\n <span className=\"text-[10px] font-bold tracking-widest text-white/60\">\n Live Preview Mode\n </span>\n </div>\n <iframe\n src={`/${collectionSlug}/${formData.slug || formData.id}?preview=true`}\n className=\"w-full h-full border-none\"\n title=\"Live Preview\"\n />\n <div className=\"absolute inset-0 bg-transparent pointer-events-none border-[12px] border-[var(--kyro-surface)] rounded-3xl\" />\n </div>\n </div>\n ) : sidebarCollapsed ? null : (\n <div className=\"space-y-6 animate-in fade-in slide-in-from-right-4 duration-500\">\n {config.fields.some((f: Field) => f.admin?.position === \"sidebar\") && (\n <div className=\"surface-tile p-6 space-y-6\">\n <h3 className=\"text-[10px] font-bold tracking-[0.2em] opacity-40\">\n Settings\n </h3>\n {config.fields\n .filter((f: Field) => f.admin?.position === \"sidebar\")\n .map((f: Field) => renderField(f))}\n </div>\n )}\n </div>\n )}\n </div>\n );\n };\n\n const renderVersionView = () => (\n <div className=\"w-full animate-in fade-in slide-in-from-bottom-4 pb-12\">\n <div className=\"surface-tile p-0 overflow-hidden\">\n <div className=\"px-6 py-4 border-b border-[var(--kyro-border)] flex items-center justify-between\">\n <div>\n <h2 className=\"text-lg font-bold text-[var(--kyro-text-primary)]\">\n Version History\n </h2>\n <p className=\"text-[11px] text-[var(--kyro-text-muted)] mt-0.5\">\n {compareMode\n ? `Select 2 versions · ${compareSelected.length}/2 chosen`\n : `${versions.length} snapshot${versions.length !== 1 ? \"s\" : \"\"} · Auto-saved`}\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n {compareMode && compareSelected.length === 2 && (\n <button\n type=\"button\"\n onClick={handleCompareVersions}\n disabled={loadingDiffs}\n className=\"px-3 py-1.5 rounded-lg bg-[var(--kyro-primary)] text-white text-[11px] font-bold tracking-wider hover:opacity-90 disabled:opacity-50\"\n >\n {loadingDiffs ? \"Comparing...\" : \"Compare\"}\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => {\n setCompareMode(!compareMode);\n setCompareSelected([]);\n setCompareDiffs([]);\n }}\n className={`px-3 py-1.5 rounded-lg text-[11px] font-bold tracking-wider transition-all ${compareMode\n ? \"bg-[var(--kyro-surface-accent)] text-[var(--kyro-text-secondary)] hover:text-[var(--kyro-text-primary)]\"\n : \"border border-[var(--kyro-border)] text-[var(--kyro-text-secondary)] hover:text-[var(--kyro-text-primary)]\"\n }`}\n >\n {compareMode ? \"Done\" : \"Compare\"}\n </button>\n </div>\n </div>\n\n {compareDiffs.length > 0 && (\n <div className=\"border-b border-[var(--kyro-border)]\">\n <div className=\"px-6 py-3 flex items-center justify-between\">\n <span className=\"text-[11px] font-bold text-[var(--kyro-text-primary)] tracking-wider\">\n {compareDiffs.length} change\n {compareDiffs.length !== 1 ? \"s\" : \"\"}\n </span>\n <button\n type=\"button\"\n onClick={() => setCompareDiffs([])}\n className=\"p-1 rounded hover:bg-[var(--kyro-surface-accent)] text-[var(--kyro-text-muted)]\"\n >\n <svg\n className=\"w-3.5 h-3.5\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n >\n <path d=\"M18 6L6 18M6 6l12 12\" />\n </svg>\n </button>\n </div>\n <div className=\"max-h-[400px] overflow-y-auto\">\n {compareDiffs.map((d, i) => (\n <div\n key={i}\n className=\"grid grid-cols-4 gap-3 px-6 py-2.5 text-[11px] font-mono border-t border-[var(--kyro-border)] hover:bg-[var(--kyro-bg-secondary)]\"\n >\n <div className=\"text-[var(--kyro-text-muted)] truncate\">\n {d.field}\n </div>\n <div className=\"text-[var(--kyro-text-muted)] truncate\">\n {typeof d.oldValue === \"object\"\n ? JSON.stringify(d.oldValue)\n : String(d.oldValue ?? \"null\")}\n </div>\n <div className=\"col-span-2 text-[var(--kyro-text-primary)] truncate\">\n {typeof d.newValue === \"object\"\n ? JSON.stringify(d.newValue)\n : String(d.newValue ?? \"null\")}\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {loadingVersions ? (\n <div className=\"flex justify-center py-16\">\n <span className=\"animate-spin text-[var(--kyro-primary)]\">⌛</span>\n </div>\n ) : versions.length === 0 ? (\n <div className=\"text-center py-16 text-[var(--kyro-text-muted)] text-sm italic\">\n No versions yet.\n </div>\n ) : (\n <div className=\"divide-y divide-[var(--kyro-border)]\">\n {versions.map((v, i) => {\n const isSelected = compareSelected.includes(v.id);\n const isDraftVersion = v.status === \"draft\";\n const isAutoSaved = (v.changeDescription || \"\")\n .toLowerCase()\n .includes(\"auto\");\n\n return (\n <div\n key={v.id}\n onClick={\n compareMode ? () => toggleCompareSelection(v.id) : undefined\n }\n className={`grid grid-cols-12 gap-3 px-6 py-3 items-center transition-all ${compareMode\n ? isSelected\n ? \"bg-[var(--kyro-primary)]/5 cursor-pointer\"\n : \"hover:bg-[var(--kyro-bg-secondary)] cursor-pointer\"\n : \"hover:bg-[var(--kyro-bg-secondary)]\"\n } ${isDraftVersion ? \"\" : \"\"}`}\n >\n <div className=\"col-span-1 flex items-center gap-2\">\n {compareMode ? (\n <div\n className={`w-4 h-4 rounded-full border ${isSelected\n ? \"border-[var(--kyro-primary)] bg-[var(--kyro-primary)]\"\n : \"border-[var(--kyro-border)]\"\n }`}\n >\n {isSelected && (\n <svg\n className=\"w-full h-full text-white p-0.5\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n >\n <path d=\"M20 6L9 17l-5-5\" />\n </svg>\n )}\n </div>\n ) : (\n <span className=\"text-[10px] font-bold text-[var(--kyro-text-muted)] w-5\">\n {versions.length - i}\n </span>\n )}\n </div>\n <div className=\"col-span-4 min-w-0\">\n <div className=\"text-[13px] font-medium text-[var(--kyro-text-primary)] truncate flex items-center gap-2\">\n {v.changeDescription || \"Snapshot\"}\n {isAutoSaved && (\n <span className=\"text-[9px] px-1.5 py-0.5 bg-[var(--kyro-bg-secondary)] text-[var(--kyro-text-secondary)] rounded font-bold tracking-wider\">\n Auto\n </span>\n )}\n </div>\n <div className=\"text-[11px] text-[var(--kyro-text-muted)]\">\n {new Date(v.createdAt as string).toLocaleString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n })}\n </div>\n </div>\n <div className=\"col-span-3\">\n {v.status && (\n <span\n className={`inline-flex items-center gap-1 px-2 py-0.5 rounded text-[10px] font-bold capitalize tracking-wider ${v.status === \"published\"\n ? \" text-[var(--kyro-success)]\"\n : \" text-[var(--kyro-warning)]\"\n }`}\n >\n <span\n className={`w-1.5 h-1.5 rounded-full ${v.status === \"published\" ? \"bg-[var(--kyro-success)]\" : \"bg-[var(--kyro-warning)]\"}`}\n />\n {v.status}\n </span>\n )}\n </div>\n <div className=\"col-span-2 text-[11px] text-[var(--kyro-text-muted)]\">\n {v.createdBy || \"system\"}\n </div>\n <div className=\"col-span-2 flex justify-end\">\n {!compareMode && (\n <button\n type=\"button\"\n onClick={() => handleRestoreVersion(v.id)}\n className=\"px-3 py-1.5 rounded-lg border border-[var(--kyro-border)] text-[11px] font-bold tracking-wider text-[var(--kyro-text-secondary)] hover:bg-[var(--kyro-primary)] hover:text-white hover:border-[var(--kyro-primary)] transition-all active:scale-95\"\n >\n Restore\n </button>\n )}\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n </div>\n );\n\n const renderApiView = () => (\n <div className=\"w-full space-y-8 animate-in fade-in slide-in-from-bottom-4\">\n <div className=\"grid grid-cols-1 lg:grid-cols-[1fr_300px] gap-8\">\n <div className=\"surface-tile p-8 min-w-0\">\n <h2 className=\"text-xl font-bold mb-6\">Response Payload</h2>\n <div className=\"bg-[#0f172a] p-6 rounded-2xl border border-white/5 overflow-x-auto max-h-[800px]\">\n <pre className=\"text-blue-300 text-xs font-mono whitespace-pre-wrap break-all\">\n {JSON.stringify(formData, null, 2)}\n </pre>\n </div>\n </div>\n\n <div className=\"space-y-6\">\n <div className=\"surface-tile p-8 space-y-6\">\n <h2 className=\"text-xl font-bold mb-6\">API Info</h2>\n\n <div className=\"space-y-6\">\n <div>\n <label className=\"text-[10px] font-bold tracking-[0.1em] text-[var(--kyro-text-secondary)] opacity-50 block mb-2\">\n Reference Path\n </label>\n <div className=\"relative group\">\n <code className=\"block bg-[var(--kyro-bg-secondary)] p-4 rounded-xl border border-[var(--kyro-border)] text-[var(--kyro-text-primary)] text-xs font-mono break-all leading-relaxed\">\n {`/api/${collectionSlug}/${formData.id || \"\"}`}\n </code>\n </div>\n </div>\n\n <div>\n <label className=\"text-[10px] font-bold tracking-[0.1em] text-[var(--kyro-text-secondary)] opacity-50 block mb-3\">\n Methods Allowed\n </label>\n <div className=\"flex gap-2\">\n <span className=\"px-3 py-1.5 bg-green-500/10 text-green-500 rounded-lg font-bold text-[9px] tracking-wider\">\n GET\n </span>\n <span className=\"px-3 py-1.5 bg-amber-500/10 text-amber-500 rounded-lg font-bold text-[9px] tracking-wider\">\n PATCH\n </span>\n <span className=\"px-3 py-1.5 bg-red-500/10 text-red-500 rounded-lg font-bold text-[9px] tracking-wider\">\n DELETE\n </span>\n </div>\n </div>\n\n <div className=\"pt-6 border-t border-[var(--kyro-border)]\">\n <label className=\"text-[10px] font-bold tracking-[0.1em] text-[var(--kyro-text-secondary)] opacity-50 block mb-4\">\n Security Policy\n </label>\n <div className=\"space-y-3\">\n {[\n {\n id: \"auth-required\",\n label: \"Authorization required\",\n checked: true,\n },\n {\n id: \"auth-admin\",\n label: \"System administrator only\",\n checked: false,\n },\n {\n id: \"auth-api\",\n label: \"API Key authentication allowed\",\n checked: true,\n },\n ].map((item) => (\n <label\n key={item.id}\n className=\"flex items-center gap-3 cursor-pointer group\"\n >\n <div\n className={`w-4 h-4 rounded border transition-all flex items-center justify-center ${item.checked ? \"bg-[var(--kyro-primary)] border-[var(--kyro-primary)]\" : \"border-[var(--kyro-border)] group-hover:border-[var(--kyro-text-secondary)]\"}`}\n >\n {item.checked && (\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"white\"\n strokeWidth=\"4\"\n >\n <path d=\"M20 6L9 17l-5-5\" />\n </svg>\n )}\n </div>\n <span className=\"text-xs font-medium text-[var(--kyro-text-secondary)] group-hover:text-[var(--kyro-text-primary)] transition-colors\">\n {item.label}\n </span>\n </label>\n ))}\n </div>\n </div>\n\n <div className=\"pt-6 border-t border-[var(--kyro-border)]\">\n <label className=\"text-[10px] font-bold tracking-[0.1em] text-[var(--kyro-text-secondary)] opacity-50 block mb-2\">\n Usage Help\n </label>\n <p className=\"text-[11px] text-[var(--kyro-text-secondary)] leading-relaxed\">\n Include the{\" \"}\n <code className=\"text-[var(--kyro-text-primary)] font-bold\">\n Authorization: Bearer <token>\n </code>{\" \"}\n header to perform write operations on this document.\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n\n return (\n <div className=\"flex flex-col h-full\">\n {layout !== \"single\" && renderHeader()}\n {layout === \"single\" && (\n <button\n id=\"btn-save\"\n type=\"button\"\n style={{ width: 0, height: 0, opacity: 0, padding: 0, margin: 0, border: 'none', position: 'absolute' }}\n onClick={async () => {\n console.log(\"[AutoForm] Hidden save button clicked\");\n const hiddenInput = document.getElementById(\"form-data\") as HTMLInputElement;\n if (!hiddenInput || !hiddenInput.value) {\n console.error(\"[AutoForm] #form-data input not found or empty\");\n return;\n }\n try {\n const data = JSON.parse(hiddenInput.value);\n console.log(\"[AutoForm] Saving data:\", data);\n const response = await saveDocument(data);\n if (response.ok) {\n const result = await response.json();\n const savedData = result.data || data;\n setFormData(savedData);\n setLastSavedData(savedData);\n onActionSuccess?.(\"Changes saved\");\n // Trigger a refresh to ensure all global state is updated\n setTimeout(() => {\n window.location.reload();\n }, 1000); // Small delay to let the toast show\n } else {\n const errorData = await response.json().catch(() => ({}));\n console.error(\"Save global failed:\", errorData);\n onActionError?.(errorData.error || \"Save failed\");\n }\n } catch (e) {\n console.error(\"Save error exception:\", e);\n onActionError?.(\"Save failed: \" + (e as Error).message);\n }\n }}\n />\n )}\n <main className=\"w-full\">\n {view === \"edit\" && renderEditView()}\n {view === \"version\" && renderVersionView()}\n {view === \"api\" && renderApiView()}\n </main>\n </div>\n );\n}\n\ninterface RelationshipFieldProps {\n field: Field;\n value?: unknown;\n onChange?: (value: unknown) => void;\n disabled?: boolean;\n error?: string;\n}\n\nfunction RelationshipField({\n field,\n value,\n onChange,\n disabled,\n error,\n}: RelationshipFieldProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [search, setSearch] = useState(\"\");\n const [options, setOptions] = useState<unknown[]>([]);\n const [loading, setLoading] = useState(false);\n\n const isMultiple = field.hasMany;\n const targetCollection = Array.isArray(field.relationTo)\n ? field.relationTo[0]\n : field.relationTo;\n\n const fetchOptions = () => {\n setLoading(true);\n fetchWithAuth(`/api/${targetCollection}?limit=50`)\n .then((res) => res.json())\n .then((data) => {\n setOptions((data.docs || []) as unknown[]);\n setLoading(false);\n })\n .catch((err) => {\n console.error(\"Failed to fetch relations:\", err);\n setLoading(false);\n });\n };\n\n useEffect(() => {\n fetchOptions();\n }, [targetCollection]);\n\nconst getLabel = (opt: unknown) => {\n const o = opt as Record<string, unknown> | undefined;\n if (!o) return \"\";\n return String(\n o.title || o.name || o.label || o.filename || o.slug || o.id || \"\",\n );\n };\n\n const findOptionById = (id: unknown) => {\n return (options as Array<Record<string, unknown>>).find(\n (o) => o.id === id,\n );\n };\n\n const isSelected = (optId: string) => {\n if (!value) return false;\n if (isMultiple) {\n const arr = Array.isArray(value) ? value : [];\n return (arr as Array<{ id?: string }>).some((v) => (v.id || v) === optId);\n }\n return ((value as { id?: string })?.id || value) === optId;\n };\n\n const toggleSelection = (opt: { id?: string }) => {\n if (isMultiple) {\n const current = Array.isArray(value) ? value : [];\n const arr = current as Array<{ id?: string }>;\n if (isSelected(opt.id as string)) {\n onChange?.(arr.filter((item) => (item.id || item) !== opt.id));\n } else {\n onChange?.([...arr, opt.id]);\n }\n } else {\n if (isSelected(opt.id as string)) {\n onChange?.(null);\n } else {\n onChange?.(opt.id);\n setIsOpen(false);\n }\n }\n };\n\n const renderSelectedValue = () => {\n if (!value) return null;\n if (isMultiple && Array.isArray(value)) {\n if (value.length === 0) return \"None selected\";\n const arr = value as Array<{ id?: string }>;\n return arr\n .map((v) => {\n const id = v.id || v;\n const opt = findOptionById(id);\n return opt ? getLabel(opt) : String(id);\n })\n .join(\", \");\n }\n const id = (value as { id?: string }).id || value;\n const opt = findOptionById(id);\n return opt ? getLabel(opt) : String(id);\n };\n\n const filteredOptions = (search\n ? (options || []).filter((opt) => {\n const o = opt as Record<string, unknown>;\n const term = search.toLowerCase();\n const searchableFields = [\"title\", \"name\", \"label\", \"filename\", \"slug\"];\n return searchableFields.some(\n (key) => o[key] && String(o[key]).toLowerCase().includes(term),\n );\n })\n : options || []) as Array<Record<string, unknown>>;\n\n return (\n <div className=\"kyro-form-field\">\n <label className=\"kyro-form-label\">\n {field.label || field.name}\n {field.required && <span className=\"kyro-form-label-required\">*</span>}\n </label>\n\n <div\n className=\"kyro-form-relationship\"\n onClick={() => !disabled && setIsOpen(true)}\n style={disabled ? { opacity: 0.5, cursor: \"not-allowed\" } : {}}\n >\n <div className=\"kyro-form-relationship-header\">\n <span className=\"kyro-form-relationship-type\">\n {targetCollection}\n </span>\n {isMultiple && (\n <span className=\"kyro-form-relationship-badge\">Multiple</span>\n )}\n </div>\n\n <div className=\"kyro-form-relationship-value\">\n {value ? (\n renderSelectedValue()\n ) : (\n <span className=\"kyro-form-relationship-empty\">\n Click to search and select...\n </span>\n )}\n </div>\n </div>\n\n {(field.admin?.description && !error) ? (\n <p className=\"kyro-form-help\">{String((field.admin as { description?: string }).description)}</p>\n ) : null}\n {error && <p className=\"kyro-form-error\">{error}</p>}\n\n {/* Modal */}\n {isOpen && (\n <div className=\"kyro-modal-overlay\" onClick={() => setIsOpen(false)}>\n <div\n className=\"kyro-relation-modal\"\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"kyro-relation-modal-header\">\n <h3>Select {field.label || field.name}</h3>\n <input\n type=\"text\"\n autoFocus\n placeholder={`Search in ${targetCollection}...`}\n className=\"kyro-relation-modal-search\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n </div>\n\n <div className=\"kyro-relation-modal-list\">\n {loading ? (\n <div className=\"kyro-relation-modal-empty\">Loading...</div>\n ) : filteredOptions.length === 0 ? (\n <div className=\"kyro-relation-modal-empty\">\n No results found.\n </div>\n ) : (\n filteredOptions.map((opt) => {\n const o = opt as { id?: string };\n return (\n <button\n key={String(o.id)}\n type=\"button\"\n className={`kyro-relation-modal-item ${isSelected(String(o.id)) ? \"selected\" : \"\"}`}\n onClick={() => toggleSelection(o)}\n >\n <span>{getLabel(opt)}</span>\n <span className=\"kyro-relation-modal-item-id\">\n {o.id ? `(${String(o.id).slice(0, 8)}...)` : \"\"}\n </span>\n </button>\n );\n })\n )}\n </div>\n\n <div className=\"kyro-relation-modal-footer\">\n <button\n type=\"button\"\n className=\"kyro-btn kyro-btn-secondary kyro-btn-sm\"\n onClick={() => setIsOpen(false)}\n >\n Done\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n}\n\n// SEO Utilities\nfunction stripHtml(html: string) {\n if (typeof html !== \"string\") return \"\";\n return html.replace(/<[^>]*>?/gm, \"\").trim();\n}\n","import type { CollectionConfig, GlobalConfig } from \"@kyro-cms/core/client\";\nimport projectConfig from \"kyro:config\";\nimport {\n blogCollections,\n ecommerceCollections,\n minimalCollections,\n kitchenSinkCollections,\n mediaCollections,\n authCollections,\n allSettingsGlobals,\n coreSettingsGlobals,\n ecommerceSettingsGlobals,\n} from \"@kyro-cms/core/templates\";\n\ntype ConfigCollectionInput =\n | CollectionConfig[]\n | Record<string, CollectionConfig>\n | undefined;\ntype ConfigGlobalInput =\n | GlobalConfig[]\n | Record<string, GlobalConfig>\n | undefined;\n\nexport type AdminTemplate = \"minimal\" | \"blog\" | \"ecommerce\" | \"kitchen-sink\";\n\nexport function toArray<T>(input: T[] | Record<string, T> | undefined): T[] {\n if (!input) return [];\n return Array.isArray(input) ? input : Object.values(input);\n}\n\nexport function toCollectionMap(\n collections: CollectionConfig[],\n): Record<string, CollectionConfig> {\n return collections.reduce(\n (acc, c) => {\n if (c.slug) acc[c.slug] = c;\n return acc;\n },\n {} as Record<string, CollectionConfig>,\n );\n}\n\nexport function toGlobalMap(globals: GlobalConfig[]): Record<string, GlobalConfig> {\n return globals.reduce(\n (acc, g) => {\n if (g.slug) acc[g.slug] = g;\n return acc;\n },\n {} as Record<string, GlobalConfig>,\n );\n}\n\nfunction addMissingCollections(\n target: CollectionConfig[],\n collections: CollectionConfig[],\n) {\n const existing = new Set(target.map((collection) => collection.slug));\n for (const collection of collections) {\n if (!existing.has(collection.slug)) {\n target.push(collection);\n existing.add(collection.slug);\n }\n }\n}\n\nexport function getAdminConfig(template: AdminTemplate = \"blog\") {\n const collections: CollectionConfig[] = [];\n const globals: GlobalConfig[] = [];\n\n switch (template) {\n case \"minimal\":\n collections.push(...Object.values(minimalCollections));\n globals.push(...coreSettingsGlobals);\n break;\n case \"blog\":\n collections.push(...Object.values(blogCollections));\n globals.push(...coreSettingsGlobals);\n break;\n case \"ecommerce\":\n collections.push(...Object.values(ecommerceCollections));\n globals.push(...coreSettingsGlobals, ...ecommerceSettingsGlobals);\n break;\n case \"kitchen-sink\":\n collections.push(\n ...Object.values(minimalCollections),\n ...Object.values(blogCollections),\n ...Object.values(ecommerceCollections),\n ...Object.values(kitchenSinkCollections),\n );\n globals.push(...allSettingsGlobals);\n break;\n }\n\n addMissingCollections(collections, Object.values(mediaCollections));\n addMissingCollections(collections, Object.values(authCollections));\n\n return {\n collections: toCollectionMap(collections),\n globals: toGlobalMap(globals),\n };\n}\n\nfunction createProjectAdminConfig(config: {\n collections?: ConfigCollectionInput;\n globals?: ConfigGlobalInput;\n}) {\n const projectCollections = toArray(config.collections);\n const projectGlobals = toArray(config.globals);\n\n if (projectCollections.length === 0 && projectGlobals.length === 0) {\n return getAdminConfig(\"kitchen-sink\");\n }\n\n const collections: CollectionConfig[] = [];\n addMissingCollections(collections, Object.values(mediaCollections));\n addMissingCollections(collections, Object.values(authCollections));\n addMissingCollections(collections, projectCollections);\n\n return {\n collections: toCollectionMap(collections),\n globals: toGlobalMap(projectGlobals),\n };\n}\n\nexport const adminConfig = createProjectAdminConfig(projectConfig);\nexport const collections = adminConfig.collections;\nexport const globals = adminConfig.globals;\n\nexport const authCollectionSlugs = [\"users\", \"audit_logs\"];\nexport const nonAuthCollections = Object.values(collections).filter(\n (c) => !authCollectionSlugs.includes(c.slug),\n);\n","import { create } from \"zustand\";\nimport { persist, createJSONStorage } from \"zustand/middleware\";\nimport type { StateStorage } from \"zustand/middleware\";\nimport { createStorage } from \"unstorage\";\nimport indexedbDriver from \"unstorage/drivers/indexedb\";\nimport type { Version } from \"@kyro-cms/core/client\";\n\nlet storageInstance: ReturnType<typeof createStorage> | null = null;\nlet storageReady = false;\n\nconst getStorage = async () => {\n if (storageInstance && storageReady) {\n return storageInstance;\n }\n\n storageInstance = createStorage({\n driver: indexedbDriver({\n dbName: \"kyro-autosave\",\n storeName: \"autosave\",\n }),\n });\n\n storageReady = true;\n return storageInstance;\n};\n\nconst createAutoFormStorage = (): StateStorage => {\n if (typeof window === \"undefined\") {\n return {\n getItem: async () => null,\n setItem: async () => {},\n removeItem: async () => {},\n };\n }\n\n return {\n getItem: async (name: string): Promise<string | null> => {\n try {\n const store = await getStorage();\n const value = await store.getItem<string>(name);\n return value ?? null;\n } catch (e) {\n console.error(\"Storage getItem error:\", e);\n return localStorage.getItem(name);\n }\n },\n setItem: async (name: string, value: string): Promise<void> => {\n try {\n const store = await getStorage();\n await store.setItem(name, value);\n } catch (e) {\n console.error(\"Storage setItem error:\", e);\n localStorage.setItem(name, value);\n }\n },\n removeItem: async (name: string): Promise<void> => {\n try {\n const store = await getStorage();\n await store.removeItem(name);\n } catch (e) {\n console.error(\"Storage removeItem error:\", e);\n localStorage.removeItem(name);\n }\n },\n };\n};\n\ninterface AutoFormStore {\n // In-memory document state\n formData: Record<string, unknown>;\n lastSavedData: Record<string, unknown>;\n sidebarCollapsed: boolean;\n draftCache: Record<string, BrowserDraftCacheEntry>;\n\n // UI State (not persisted)\n activeTab: number;\n isSlugLocked: boolean;\n view: \"edit\" | \"version\" | \"api\";\n isDropdownOpen: boolean;\n versions: Version[];\n loadingVersions: boolean;\n showPreview: boolean;\n isMenuOpen: boolean;\n hasUnsavedChanges: boolean;\n loadingFields: Record<string, boolean>;\n compareMode: boolean;\n compareSelected: string[];\n compareDiffs: VersionDiff[];\n loadingDiffs: boolean;\n isAutoSaving: boolean;\n autoSaveStatus: \"idle\" | \"saving\" | \"success\" | \"error\" | \"conflict\";\n\n // Auto-save\n lastAutoSaveTime: number;\n autoSaveSkip: boolean;\n autoSaveTimer: NodeJS.Timeout | null;\n\n // Actions - Field Updates\n setField: (field: string, value: unknown) => void;\n setFormData: (data: Record<string, unknown>) => void;\n setLastSavedData: (data: Record<string, unknown>) => void;\n setNestedField: (path: string, value: unknown) => void;\n\n // Actions - UI State\n setActiveTab: (tab: number) => void;\n setIsSlugLocked: (locked: boolean | ((prev: boolean) => boolean)) => void;\n setView: (view: \"edit\" | \"version\" | \"api\") => void;\n setIsDropdownOpen: (open: boolean | ((prev: boolean) => boolean)) => void;\n setVersions: (versions: Version[]) => void;\n setLoadingVersions: (loading: boolean) => void;\n setShowPreview: (show: boolean | ((prev: boolean) => boolean)) => void;\n setIsMenuOpen: (open: boolean | ((prev: boolean) => boolean)) => void;\n setHasUnsavedChanges: (hasChanges: boolean) => void;\n setLoadingFields: (fields: Record<string, boolean> | ((prev: Record<string, boolean>) => Record<string, boolean>)) => void;\n updateLoadingField: (field: string, loading: boolean) => void;\n setCompareMode: (mode: boolean) => void;\n setCompareSelected: (selected: string[] | ((prev: string[]) => string[])) => void;\n setCompareDiffs: (diffs: VersionDiff[]) => void;\n setLoadingDiffs: (loading: boolean) => void;\n setIsAutoSaving: (saving: boolean) => void;\n setAutoSaveStatus: (status: \"idle\" | \"saving\" | \"success\" | \"error\" | \"conflict\") => void;\n setSidebarCollapsed: (collapsed: boolean) => void;\n\n // Auto-save actions\n setAutoSaveSkip: (skip: boolean) => void;\n setLastAutoSaveTime: (time: number) => void;\n startAutoSaveTimer: (callback: () => void, delay: number) => void;\n clearAutoSaveTimer: () => void;\n\n // Actions - Data Management\n markSaved: () => void;\n resetForm: () => void;\nloadDocument: (\n data: Record<string, unknown>,\n lastSaved?: Record<string, unknown>,\n ) => void;\n\n updateTabData: (tabName: string, newTabData: Record<string, unknown>) => void;\n getField: (field: string) => unknown;\n getNestedField: (path: string) => unknown;\n getHasChanges: () => boolean;\n setDraftCache: (documentKey: string, draft: BrowserDraftCacheEntry) => void;\n getDraftCache: (documentKey: string) => BrowserDraftCacheEntry | null;\n clearDraftCache: (documentKey: string) => void;\n}\n\nexport interface BrowserDraftCacheEntry {\n data: Record<string, unknown>;\n baseUpdatedAt?: string | null;\n draftUpdatedAt: string;\n lastSyncedAt?: string | null;\n}\n\nexport const useAutoFormStore = create<AutoFormStore>()(\n persist(\n (set, get) => ({\n // Initial persisted state\n formData: {},\n lastSavedData: {},\n sidebarCollapsed: false,\n draftCache: {},\n\n // Initial UI state\n activeTab: 0,\n isSlugLocked: true,\n view: \"edit\",\n isDropdownOpen: false,\n versions: [],\n loadingVersions: false,\n showPreview: false,\n isMenuOpen: false,\n hasUnsavedChanges: false,\n loadingFields: {},\n compareMode: false,\n compareSelected: [],\n compareDiffs: [],\n loadingDiffs: false,\n isAutoSaving: false,\n autoSaveStatus: \"idle\",\n\n // Auto-save state\n lastAutoSaveTime: 0,\n autoSaveSkip: false,\n autoSaveTimer: null,\n\n // Field update actions\nsetField: (field: string, value: unknown) => {\n if (field === \"blocks\") {\n console.log(\"autoform setField blocks: value=\", value);\n }\n set((state) => ({\n formData: {\n ...state.formData,\n [field]: value,\n },\n }));\n },\n\n setFormData: (data: Record<string, unknown>) => {\n set({ formData: data });\n },\n\n setNestedField: (path: string, value: unknown) => {\n set((state) => {\n const keys = path.split(\".\");\n const newFormData = { ...state.formData };\n let current: Record<string, unknown> = newFormData;\n\n for (let i = 0; i < keys.length - 1; i++) {\n if (current[keys[i]] === undefined) {\n current[keys[i]] = {};\n }\n current[keys[i]] = { ...current[keys[i]] };\n current = current[keys[i]];\n }\n\n current[keys[keys.length - 1]] = value;\n\n return { formData: newFormData };\n });\n },\n\n // UI state actions\n setActiveTab: (tab: number) => set({ activeTab: tab }),\n setIsSlugLocked: (locked) =>\n set((state) => ({\n isSlugLocked:\n typeof locked === \"function\" ? locked(state.isSlugLocked) : locked,\n })),\n setView: (view) => set({ view }),\n setIsDropdownOpen: (open) =>\n set((state) => ({\n isDropdownOpen:\n typeof open === \"function\" ? open(state.isDropdownOpen) : open,\n })),\n setVersions: (versions: Version[]) => set({ versions }),\n setLoadingVersions: (loading: boolean) =>\n set({ loadingVersions: loading }),\n setShowPreview: (show) =>\n set((state) => ({\n showPreview:\n typeof show === \"function\" ? show(state.showPreview) : show,\n })),\n setIsMenuOpen: (open) =>\n set((state) => ({\n isMenuOpen: typeof open === \"function\" ? open(state.isMenuOpen) : open,\n })),\n setHasUnsavedChanges: (hasChanges: boolean) =>\n set({ hasUnsavedChanges: hasChanges }),\n setLoadingFields: (fields) =>\n set((state) => ({\n loadingFields:\n typeof fields === \"function\" ? fields(state.loadingFields) : fields,\n })),\n updateLoadingField: (field, loading) =>\n set((state) => ({\n loadingFields: { ...state.loadingFields, [field]: loading },\n })),\n setCompareMode: (mode: boolean) => set({ compareMode: mode }),\n setCompareSelected: (selected) =>\n set((state) => ({\n compareSelected:\n typeof selected === \"function\"\n ? selected(state.compareSelected)\n : selected,\n })),\n setCompareDiffs: (diffs: VersionDiff[]) => set({ compareDiffs: diffs }),\n setLoadingDiffs: (loading: boolean) => set({ loadingDiffs: loading }),\n setIsAutoSaving: (saving: boolean) => set({ isAutoSaving: saving }),\n setAutoSaveStatus: (status) => set({ autoSaveStatus: status }),\n setSidebarCollapsed: (collapsed: boolean) =>\n set({ sidebarCollapsed: collapsed }),\n\n // Auto-save actions\n setAutoSaveSkip: (skip: boolean) => set({ autoSaveSkip: skip }),\n setLastAutoSaveTime: (time: number) => set({ lastAutoSaveTime: time }),\n\n startAutoSaveTimer: (callback: () => void, delay: number) => {\n const { autoSaveTimer } = get();\n if (autoSaveTimer) {\n clearTimeout(autoSaveTimer);\n }\n const timer = setTimeout(callback, delay);\n set({ autoSaveTimer: timer as any });\n },\n\n clearAutoSaveTimer: () => {\n const { autoSaveTimer } = get();\n if (autoSaveTimer) {\n clearTimeout(autoSaveTimer);\n set({ autoSaveTimer: null });\n }\n },\n\n // Data management\n markSaved: () => {\n const { formData } = get();\n set({ lastSavedData: formData, hasUnsavedChanges: false });\n },\n\n setLastSavedData: (data: Record<string, unknown>) => {\n set({ lastSavedData: data });\n },\n\n resetForm: () => {\n set({\n formData: {},\n lastSavedData: {},\n hasUnsavedChanges: false,\n activeTab: 0,\n });\n },\n\n loadDocument: (\n data: Record<string, unknown>,\n lastSaved?: Record<string, unknown>,\n ) => {\n set({\n formData: data,\n lastSavedData: lastSaved || data,\n hasUnsavedChanges: false,\n });\n },\n\n updateTabData: (tabName, newTabData) => {\n const { formData } = get();\n const tabData = formData[tabName] || {};\n \n let updatedTab;\n if (Array.isArray(newTabData)) {\n updatedTab = { ...tabData, content: newTabData };\n } else if (typeof newTabData === \"object\" && newTabData !== null) {\n updatedTab = { ...tabData, ...newTabData };\n } else {\n updatedTab = newTabData;\n }\n\n set((state) => ({\n formData: {\n ...state.formData,\n [tabName]: updatedTab,\n },\n }));\n },\n\n // Computed values\n getField: (field: string) => {\n return get().formData[field];\n },\n\n getNestedField: (path: string) => {\n const keys = path.split(\".\");\n let current: unknown = get().formData;\n\n for (const key of keys) {\n if (current === undefined || current === null) return undefined;\n current = (current as Record<string, unknown>)[key];\n }\n\n return current;\n },\n\n getHasChanges: () => {\n const { formData, lastSavedData } = get();\n return JSON.stringify(formData) !== JSON.stringify(lastSavedData);\n },\n\n setDraftCache: (documentKey, draft) =>\n set((state) => ({\n draftCache: {\n ...state.draftCache,\n [documentKey]: draft,\n },\n })),\n\n getDraftCache: (documentKey) => get().draftCache[documentKey] || null,\n\n clearDraftCache: (documentKey) =>\n set((state) => {\n const next = { ...state.draftCache };\n delete next[documentKey];\n return { draftCache: next };\n }),\n }),\n {\n name: \"kyro-autoform-storage\",\n storage: createJSONStorage(() => createAutoFormStorage()),\n partialize: (state) => ({\n sidebarCollapsed: state.sidebarCollapsed,\n draftCache: state.draftCache,\n }),\n },\n ),\n);\n\n// Helper hook to get field value with tab support\nexport function useAutoFormField(\n fieldName: string,\n tabData?: Record<string, unknown>,\n) {\n const formData = useAutoFormStore((s) => s.formData);\n const setField = useAutoFormStore((s) => s.setField);\n const setNestedField = useAutoFormStore((s) => s.setNestedField);\n\n // If tabData is provided, look inside it first (for fields inside tabs)\n if (tabData !== undefined) {\n return {\n value: tabData[fieldName],\n onChange: (value: unknown) => {\n return value;\n },\n };\n }\n\n return {\n value: formData[fieldName],\n onChange: (value: unknown) => setField(fieldName, value),\n };\n}\n\n// Helper to get formData for tabs\nexport function useAutoFormTabData(tabName: string) {\n const formData = useAutoFormStore((s) => s.formData);\n const setNestedField = useAutoFormStore((s) => s.setNestedField);\n const setFormData = useAutoFormStore((s) => s.setFormData);\n\n const tabData = formData[tabName] || {};\n const updateTabData = useAutoFormStore((s) => s.updateTabData);\n\n const onTabDataChange = (newTabData: Record<string, unknown>) => {\n updateTabData(tabName, newTabData);\n };\n\n return { tabData, onTabDataChange };\n}\n","const suspectProtoRx = /\"(?:_|\\\\u0{2}5[Ff]){2}(?:p|\\\\u0{2}70)(?:r|\\\\u0{2}72)(?:o|\\\\u0{2}6[Ff])(?:t|\\\\u0{2}74)(?:o|\\\\u0{2}6[Ff])(?:_|\\\\u0{2}5[Ff]){2}\"\\s*:/;\nconst suspectConstructorRx = /\"(?:c|\\\\u0063)(?:o|\\\\u006[Ff])(?:n|\\\\u006[Ee])(?:s|\\\\u0073)(?:t|\\\\u0074)(?:r|\\\\u0072)(?:u|\\\\u0075)(?:c|\\\\u0063)(?:t|\\\\u0074)(?:o|\\\\u006[Ff])(?:r|\\\\u0072)\"\\s*:/;\nconst JsonSigRx = /^\\s*[\"[{]|^\\s*-?\\d{1,16}(\\.\\d{1,17})?([Ee][+-]?\\d+)?\\s*$/;\nfunction jsonParseTransform(key, value) {\n if (key === \"__proto__\" || key === \"constructor\" && value && typeof value === \"object\" && \"prototype\" in value) {\n warnKeyDropped(key);\n return;\n }\n return value;\n}\nfunction warnKeyDropped(key) {\n console.warn(`[destr] Dropping \"${key}\" key to prevent prototype pollution.`);\n}\nfunction destr(value, options = {}) {\n if (typeof value !== \"string\") {\n return value;\n }\n if (value[0] === '\"' && value[value.length - 1] === '\"' && value.indexOf(\"\\\\\") === -1) {\n return value.slice(1, -1);\n }\n const _value = value.trim();\n if (_value.length <= 9) {\n switch (_value.toLowerCase()) {\n case \"true\": {\n return true;\n }\n case \"false\": {\n return false;\n }\n case \"undefined\": {\n return void 0;\n }\n case \"null\": {\n return null;\n }\n case \"nan\": {\n return Number.NaN;\n }\n case \"infinity\": {\n return Number.POSITIVE_INFINITY;\n }\n case \"-infinity\": {\n return Number.NEGATIVE_INFINITY;\n }\n }\n }\n if (!JsonSigRx.test(value)) {\n if (options.strict) {\n throw new SyntaxError(\"[destr] Invalid JSON\");\n }\n return value;\n }\n try {\n if (suspectProtoRx.test(value) || suspectConstructorRx.test(value)) {\n if (options.strict) {\n throw new Error(\"[destr] Possible prototype pollution\");\n }\n return JSON.parse(value, jsonParseTransform);\n }\n return JSON.parse(value);\n } catch (error) {\n if (options.strict) {\n throw error;\n }\n return value;\n }\n}\nfunction safeDestr(value, options = {}) {\n return destr(value, { ...options, strict: true });\n}\n\nexport { destr as default, destr, safeDestr };\n","function wrapToPromise(value) {\n if (!value || typeof value.then !== \"function\") {\n return Promise.resolve(value);\n }\n return value;\n}\nfunction asyncCall(function_, ...arguments_) {\n try {\n return wrapToPromise(function_(...arguments_));\n } catch (error) {\n return Promise.reject(error);\n }\n}\nfunction isPrimitive(value) {\n const type = typeof value;\n return value === null || type !== \"object\" && type !== \"function\";\n}\nfunction isPureObject(value) {\n const proto = Object.getPrototypeOf(value);\n return !proto || proto.isPrototypeOf(Object);\n}\nfunction stringify(value) {\n if (isPrimitive(value)) {\n return String(value);\n }\n if (isPureObject(value) || Array.isArray(value)) {\n return JSON.stringify(value);\n }\n if (typeof value.toJSON === \"function\") {\n return stringify(value.toJSON());\n }\n throw new Error(\"[unstorage] Cannot stringify value!\");\n}\nconst BASE64_PREFIX = \"base64:\";\nfunction serializeRaw(value) {\n if (typeof value === \"string\") {\n return value;\n }\n return BASE64_PREFIX + base64Encode(value);\n}\nfunction deserializeRaw(value) {\n if (typeof value !== \"string\") {\n return value;\n }\n if (!value.startsWith(BASE64_PREFIX)) {\n return value;\n }\n return base64Decode(value.slice(BASE64_PREFIX.length));\n}\nfunction base64Decode(input) {\n if (globalThis.Buffer) {\n return Buffer.from(input, \"base64\");\n }\n return Uint8Array.from(\n globalThis.atob(input),\n (c) => c.codePointAt(0)\n );\n}\nfunction base64Encode(input) {\n if (globalThis.Buffer) {\n return Buffer.from(input).toString(\"base64\");\n }\n return globalThis.btoa(String.fromCodePoint(...input));\n}\n\nconst storageKeyProperties = [\n \"has\",\n \"hasItem\",\n \"get\",\n \"getItem\",\n \"getItemRaw\",\n \"set\",\n \"setItem\",\n \"setItemRaw\",\n \"del\",\n \"remove\",\n \"removeItem\",\n \"getMeta\",\n \"setMeta\",\n \"removeMeta\",\n \"getKeys\",\n \"clear\",\n \"mount\",\n \"unmount\"\n];\nfunction prefixStorage(storage, base) {\n base = normalizeBaseKey(base);\n if (!base) {\n return storage;\n }\n const nsStorage = { ...storage };\n for (const property of storageKeyProperties) {\n nsStorage[property] = (key = \"\", ...args) => (\n // @ts-ignore\n storage[property](base + key, ...args)\n );\n }\n nsStorage.getKeys = (key = \"\", ...arguments_) => storage.getKeys(base + key, ...arguments_).then((keys) => keys.map((key2) => key2.slice(base.length)));\n nsStorage.keys = nsStorage.getKeys;\n nsStorage.getItems = async (items, commonOptions) => {\n const prefixedItems = items.map(\n (item) => typeof item === \"string\" ? base + item : { ...item, key: base + item.key }\n );\n const results = await storage.getItems(prefixedItems, commonOptions);\n return results.map((entry) => ({\n key: entry.key.slice(base.length),\n value: entry.value\n }));\n };\n nsStorage.setItems = async (items, commonOptions) => {\n const prefixedItems = items.map((item) => ({\n key: base + item.key,\n value: item.value,\n options: item.options\n }));\n return storage.setItems(prefixedItems, commonOptions);\n };\n return nsStorage;\n}\nfunction normalizeKey(key) {\n if (!key) {\n return \"\";\n }\n return key.split(\"?\")[0]?.replace(/[/\\\\]/g, \":\").replace(/:+/g, \":\").replace(/^:|:$/g, \"\") || \"\";\n}\nfunction joinKeys(...keys) {\n return normalizeKey(keys.join(\":\"));\n}\nfunction normalizeBaseKey(base) {\n base = normalizeKey(base);\n return base ? base + \":\" : \"\";\n}\nfunction filterKeyByDepth(key, depth) {\n if (depth === void 0) {\n return true;\n }\n let substrCount = 0;\n let index = key.indexOf(\":\");\n while (index > -1) {\n substrCount++;\n index = key.indexOf(\":\", index + 1);\n }\n return substrCount <= depth;\n}\nfunction filterKeyByBase(key, base) {\n if (base) {\n return key.startsWith(base) && key[key.length - 1] !== \"$\";\n }\n return key[key.length - 1] !== \"$\";\n}\n\nexport { normalizeKey as a, asyncCall as b, filterKeyByBase as c, stringify as d, deserializeRaw as e, filterKeyByDepth as f, joinKeys as j, normalizeBaseKey as n, prefixStorage as p, serializeRaw as s };\n","import destr from 'destr';\nimport { n as normalizeBaseKey, a as normalizeKey, b as asyncCall, f as filterKeyByDepth, c as filterKeyByBase, s as serializeRaw, d as stringify, e as deserializeRaw, j as joinKeys } from './shared/unstorage.zVDD2mZo.mjs';\nexport { p as prefixStorage } from './shared/unstorage.zVDD2mZo.mjs';\n\nfunction defineDriver(factory) {\n return factory;\n}\n\nconst DRIVER_NAME = \"memory\";\nconst memory = defineDriver(() => {\n const data = /* @__PURE__ */ new Map();\n return {\n name: DRIVER_NAME,\n getInstance: () => data,\n hasItem(key) {\n return data.has(key);\n },\n getItem(key) {\n return data.get(key) ?? null;\n },\n getItemRaw(key) {\n return data.get(key) ?? null;\n },\n setItem(key, value) {\n data.set(key, value);\n },\n setItemRaw(key, value) {\n data.set(key, value);\n },\n removeItem(key) {\n data.delete(key);\n },\n getKeys() {\n return [...data.keys()];\n },\n clear() {\n data.clear();\n },\n dispose() {\n data.clear();\n }\n };\n});\n\nfunction createStorage(options = {}) {\n const context = {\n mounts: { \"\": options.driver || memory() },\n mountpoints: [\"\"],\n watching: false,\n watchListeners: [],\n unwatch: {}\n };\n const getMount = (key) => {\n for (const base of context.mountpoints) {\n if (key.startsWith(base)) {\n return {\n base,\n relativeKey: key.slice(base.length),\n driver: context.mounts[base]\n };\n }\n }\n return {\n base: \"\",\n relativeKey: key,\n driver: context.mounts[\"\"]\n };\n };\n const getMounts = (base, includeParent) => {\n return context.mountpoints.filter(\n (mountpoint) => mountpoint.startsWith(base) || includeParent && base.startsWith(mountpoint)\n ).map((mountpoint) => ({\n relativeBase: base.length > mountpoint.length ? base.slice(mountpoint.length) : void 0,\n mountpoint,\n driver: context.mounts[mountpoint]\n }));\n };\n const onChange = (event, key) => {\n if (!context.watching) {\n return;\n }\n key = normalizeKey(key);\n for (const listener of context.watchListeners) {\n listener(event, key);\n }\n };\n const startWatch = async () => {\n if (context.watching) {\n return;\n }\n context.watching = true;\n for (const mountpoint in context.mounts) {\n context.unwatch[mountpoint] = await watch(\n context.mounts[mountpoint],\n onChange,\n mountpoint\n );\n }\n };\n const stopWatch = async () => {\n if (!context.watching) {\n return;\n }\n for (const mountpoint in context.unwatch) {\n await context.unwatch[mountpoint]();\n }\n context.unwatch = {};\n context.watching = false;\n };\n const runBatch = (items, commonOptions, cb) => {\n const batches = /* @__PURE__ */ new Map();\n const getBatch = (mount) => {\n let batch = batches.get(mount.base);\n if (!batch) {\n batch = {\n driver: mount.driver,\n base: mount.base,\n items: []\n };\n batches.set(mount.base, batch);\n }\n return batch;\n };\n for (const item of items) {\n const isStringItem = typeof item === \"string\";\n const key = normalizeKey(isStringItem ? item : item.key);\n const value = isStringItem ? void 0 : item.value;\n const options2 = isStringItem || !item.options ? commonOptions : { ...commonOptions, ...item.options };\n const mount = getMount(key);\n getBatch(mount).items.push({\n key,\n value,\n relativeKey: mount.relativeKey,\n options: options2\n });\n }\n return Promise.all([...batches.values()].map((batch) => cb(batch))).then(\n (r) => r.flat()\n );\n };\n const storage = {\n // Item\n hasItem(key, opts = {}) {\n key = normalizeKey(key);\n const { relativeKey, driver } = getMount(key);\n return asyncCall(driver.hasItem, relativeKey, opts);\n },\n getItem(key, opts = {}) {\n key = normalizeKey(key);\n const { relativeKey, driver } = getMount(key);\n return asyncCall(driver.getItem, relativeKey, opts).then(\n (value) => destr(value)\n );\n },\n getItems(items, commonOptions = {}) {\n return runBatch(items, commonOptions, (batch) => {\n if (batch.driver.getItems) {\n return asyncCall(\n batch.driver.getItems,\n batch.items.map((item) => ({\n key: item.relativeKey,\n options: item.options\n })),\n commonOptions\n ).then(\n (r) => r.map((item) => ({\n key: joinKeys(batch.base, item.key),\n value: destr(item.value)\n }))\n );\n }\n return Promise.all(\n batch.items.map((item) => {\n return asyncCall(\n batch.driver.getItem,\n item.relativeKey,\n item.options\n ).then((value) => ({\n key: item.key,\n value: destr(value)\n }));\n })\n );\n });\n },\n getItemRaw(key, opts = {}) {\n key = normalizeKey(key);\n const { relativeKey, driver } = getMount(key);\n if (driver.getItemRaw) {\n return asyncCall(driver.getItemRaw, relativeKey, opts);\n }\n return asyncCall(driver.getItem, relativeKey, opts).then(\n (value) => deserializeRaw(value)\n );\n },\n async setItem(key, value, opts = {}) {\n if (value === void 0) {\n return storage.removeItem(key);\n }\n key = normalizeKey(key);\n const { relativeKey, driver } = getMount(key);\n if (!driver.setItem) {\n return;\n }\n await asyncCall(driver.setItem, relativeKey, stringify(value), opts);\n if (!driver.watch) {\n onChange(\"update\", key);\n }\n },\n async setItems(items, commonOptions) {\n await runBatch(items, commonOptions, async (batch) => {\n if (batch.driver.setItems) {\n return asyncCall(\n batch.driver.setItems,\n batch.items.map((item) => ({\n key: item.relativeKey,\n value: stringify(item.value),\n options: item.options\n })),\n commonOptions\n );\n }\n if (!batch.driver.setItem) {\n return;\n }\n await Promise.all(\n batch.items.map((item) => {\n return asyncCall(\n batch.driver.setItem,\n item.relativeKey,\n stringify(item.value),\n item.options\n );\n })\n );\n });\n },\n async setItemRaw(key, value, opts = {}) {\n if (value === void 0) {\n return storage.removeItem(key, opts);\n }\n key = normalizeKey(key);\n const { relativeKey, driver } = getMount(key);\n if (driver.setItemRaw) {\n await asyncCall(driver.setItemRaw, relativeKey, value, opts);\n } else if (driver.setItem) {\n await asyncCall(driver.setItem, relativeKey, serializeRaw(value), opts);\n } else {\n return;\n }\n if (!driver.watch) {\n onChange(\"update\", key);\n }\n },\n async removeItem(key, opts = {}) {\n if (typeof opts === \"boolean\") {\n opts = { removeMeta: opts };\n }\n key = normalizeKey(key);\n const { relativeKey, driver } = getMount(key);\n if (!driver.removeItem) {\n return;\n }\n await asyncCall(driver.removeItem, relativeKey, opts);\n if (opts.removeMeta || opts.removeMata) {\n await asyncCall(driver.removeItem, relativeKey + \"$\", opts);\n }\n if (!driver.watch) {\n onChange(\"remove\", key);\n }\n },\n // Meta\n async getMeta(key, opts = {}) {\n if (typeof opts === \"boolean\") {\n opts = { nativeOnly: opts };\n }\n key = normalizeKey(key);\n const { relativeKey, driver } = getMount(key);\n const meta = /* @__PURE__ */ Object.create(null);\n if (driver.getMeta) {\n Object.assign(meta, await asyncCall(driver.getMeta, relativeKey, opts));\n }\n if (!opts.nativeOnly) {\n const value = await asyncCall(\n driver.getItem,\n relativeKey + \"$\",\n opts\n ).then((value_) => destr(value_));\n if (value && typeof value === \"object\") {\n if (typeof value.atime === \"string\") {\n value.atime = new Date(value.atime);\n }\n if (typeof value.mtime === \"string\") {\n value.mtime = new Date(value.mtime);\n }\n Object.assign(meta, value);\n }\n }\n return meta;\n },\n setMeta(key, value, opts = {}) {\n return this.setItem(key + \"$\", value, opts);\n },\n removeMeta(key, opts = {}) {\n return this.removeItem(key + \"$\", opts);\n },\n // Keys\n async getKeys(base, opts = {}) {\n base = normalizeBaseKey(base);\n const mounts = getMounts(base, true);\n let maskedMounts = [];\n const allKeys = [];\n let allMountsSupportMaxDepth = true;\n for (const mount of mounts) {\n if (!mount.driver.flags?.maxDepth) {\n allMountsSupportMaxDepth = false;\n }\n const rawKeys = await asyncCall(\n mount.driver.getKeys,\n mount.relativeBase,\n opts\n );\n for (const key of rawKeys) {\n const fullKey = mount.mountpoint + normalizeKey(key);\n if (!maskedMounts.some((p) => fullKey.startsWith(p))) {\n allKeys.push(fullKey);\n }\n }\n maskedMounts = [\n mount.mountpoint,\n ...maskedMounts.filter((p) => !p.startsWith(mount.mountpoint))\n ];\n }\n const shouldFilterByDepth = opts.maxDepth !== void 0 && !allMountsSupportMaxDepth;\n return allKeys.filter(\n (key) => (!shouldFilterByDepth || filterKeyByDepth(key, opts.maxDepth)) && filterKeyByBase(key, base)\n );\n },\n // Utils\n async clear(base, opts = {}) {\n base = normalizeBaseKey(base);\n await Promise.all(\n getMounts(base, false).map(async (m) => {\n if (m.driver.clear) {\n return asyncCall(m.driver.clear, m.relativeBase, opts);\n }\n if (m.driver.removeItem) {\n const keys = await m.driver.getKeys(m.relativeBase || \"\", opts);\n return Promise.all(\n keys.map((key) => m.driver.removeItem(key, opts))\n );\n }\n })\n );\n },\n async dispose() {\n await Promise.all(\n Object.values(context.mounts).map((driver) => dispose(driver))\n );\n },\n async watch(callback) {\n await startWatch();\n context.watchListeners.push(callback);\n return async () => {\n context.watchListeners = context.watchListeners.filter(\n (listener) => listener !== callback\n );\n if (context.watchListeners.length === 0) {\n await stopWatch();\n }\n };\n },\n async unwatch() {\n context.watchListeners = [];\n await stopWatch();\n },\n // Mount\n mount(base, driver) {\n base = normalizeBaseKey(base);\n if (base && context.mounts[base]) {\n throw new Error(`already mounted at ${base}`);\n }\n if (base) {\n context.mountpoints.push(base);\n context.mountpoints.sort((a, b) => b.length - a.length);\n }\n context.mounts[base] = driver;\n if (context.watching) {\n Promise.resolve(watch(driver, onChange, base)).then((unwatcher) => {\n context.unwatch[base] = unwatcher;\n }).catch(console.error);\n }\n return storage;\n },\n async unmount(base, _dispose = true) {\n base = normalizeBaseKey(base);\n if (!base || !context.mounts[base]) {\n return;\n }\n if (context.watching && base in context.unwatch) {\n context.unwatch[base]?.();\n delete context.unwatch[base];\n }\n if (_dispose) {\n await dispose(context.mounts[base]);\n }\n context.mountpoints = context.mountpoints.filter((key) => key !== base);\n delete context.mounts[base];\n },\n getMount(key = \"\") {\n key = normalizeKey(key) + \":\";\n const m = getMount(key);\n return {\n driver: m.driver,\n base: m.base\n };\n },\n getMounts(base = \"\", opts = {}) {\n base = normalizeKey(base);\n const mounts = getMounts(base, opts.parents);\n return mounts.map((m) => ({\n driver: m.driver,\n base: m.mountpoint\n }));\n },\n // Aliases\n keys: (base, opts = {}) => storage.getKeys(base, opts),\n get: (key, opts = {}) => storage.getItem(key, opts),\n set: (key, value, opts = {}) => storage.setItem(key, value, opts),\n has: (key, opts = {}) => storage.hasItem(key, opts),\n del: (key, opts = {}) => storage.removeItem(key, opts),\n remove: (key, opts = {}) => storage.removeItem(key, opts)\n };\n return storage;\n}\nasync function snapshot(storage, base) {\n base = normalizeBaseKey(base);\n const keys = await storage.getKeys(base);\n const snapshot2 = {};\n await Promise.all(\n keys.map(async (key) => {\n snapshot2[key.slice(base.length)] = await storage.getItem(key);\n })\n );\n return snapshot2;\n}\nasync function restoreSnapshot(driver, snapshot2, base = \"\") {\n base = normalizeBaseKey(base);\n await Promise.all(\n Object.entries(snapshot2).map((e) => driver.setItem(base + e[0], e[1]))\n );\n}\nfunction watch(driver, onChange, base) {\n return driver.watch ? driver.watch((event, key) => onChange(event, base + key)) : () => {\n };\n}\nasync function dispose(driver) {\n if (typeof driver.dispose === \"function\") {\n await asyncCall(driver.dispose);\n }\n}\n\nconst builtinDrivers = {\n \"azure-app-configuration\": \"unstorage/drivers/azure-app-configuration\",\n \"azureAppConfiguration\": \"unstorage/drivers/azure-app-configuration\",\n \"azure-cosmos\": \"unstorage/drivers/azure-cosmos\",\n \"azureCosmos\": \"unstorage/drivers/azure-cosmos\",\n \"azure-key-vault\": \"unstorage/drivers/azure-key-vault\",\n \"azureKeyVault\": \"unstorage/drivers/azure-key-vault\",\n \"azure-storage-blob\": \"unstorage/drivers/azure-storage-blob\",\n \"azureStorageBlob\": \"unstorage/drivers/azure-storage-blob\",\n \"azure-storage-table\": \"unstorage/drivers/azure-storage-table\",\n \"azureStorageTable\": \"unstorage/drivers/azure-storage-table\",\n \"capacitor-preferences\": \"unstorage/drivers/capacitor-preferences\",\n \"capacitorPreferences\": \"unstorage/drivers/capacitor-preferences\",\n \"cloudflare-kv-binding\": \"unstorage/drivers/cloudflare-kv-binding\",\n \"cloudflareKVBinding\": \"unstorage/drivers/cloudflare-kv-binding\",\n \"cloudflare-kv-http\": \"unstorage/drivers/cloudflare-kv-http\",\n \"cloudflareKVHttp\": \"unstorage/drivers/cloudflare-kv-http\",\n \"cloudflare-r2-binding\": \"unstorage/drivers/cloudflare-r2-binding\",\n \"cloudflareR2Binding\": \"unstorage/drivers/cloudflare-r2-binding\",\n \"db0\": \"unstorage/drivers/db0\",\n \"deno-kv-node\": \"unstorage/drivers/deno-kv-node\",\n \"denoKVNode\": \"unstorage/drivers/deno-kv-node\",\n \"deno-kv\": \"unstorage/drivers/deno-kv\",\n \"denoKV\": \"unstorage/drivers/deno-kv\",\n \"fs-lite\": \"unstorage/drivers/fs-lite\",\n \"fsLite\": \"unstorage/drivers/fs-lite\",\n \"fs\": \"unstorage/drivers/fs\",\n \"github\": \"unstorage/drivers/github\",\n \"http\": \"unstorage/drivers/http\",\n \"indexedb\": \"unstorage/drivers/indexedb\",\n \"localstorage\": \"unstorage/drivers/localstorage\",\n \"lru-cache\": \"unstorage/drivers/lru-cache\",\n \"lruCache\": \"unstorage/drivers/lru-cache\",\n \"memory\": \"unstorage/drivers/memory\",\n \"mongodb\": \"unstorage/drivers/mongodb\",\n \"netlify-blobs\": \"unstorage/drivers/netlify-blobs\",\n \"netlifyBlobs\": \"unstorage/drivers/netlify-blobs\",\n \"null\": \"unstorage/drivers/null\",\n \"overlay\": \"unstorage/drivers/overlay\",\n \"planetscale\": \"unstorage/drivers/planetscale\",\n \"redis\": \"unstorage/drivers/redis\",\n \"s3\": \"unstorage/drivers/s3\",\n \"session-storage\": \"unstorage/drivers/session-storage\",\n \"sessionStorage\": \"unstorage/drivers/session-storage\",\n \"uploadthing\": \"unstorage/drivers/uploadthing\",\n \"upstash\": \"unstorage/drivers/upstash\",\n \"vercel-blob\": \"unstorage/drivers/vercel-blob\",\n \"vercelBlob\": \"unstorage/drivers/vercel-blob\",\n \"vercel-kv\": \"unstorage/drivers/vercel-kv\",\n \"vercelKV\": \"unstorage/drivers/vercel-kv\",\n \"vercel-runtime-cache\": \"unstorage/drivers/vercel-runtime-cache\",\n \"vercelRuntimeCache\": \"unstorage/drivers/vercel-runtime-cache\"\n};\n\nexport { builtinDrivers, createStorage, defineDriver, filterKeyByBase, filterKeyByDepth, joinKeys, normalizeBaseKey, normalizeKey, restoreSnapshot, snapshot };\n","export function defineDriver(factory) {\n return factory;\n}\nexport function normalizeKey(key, sep = \":\") {\n if (!key) {\n return \"\";\n }\n return key.replace(/[:/\\\\]/g, sep).replace(/^[:/\\\\]|[:/\\\\]$/g, \"\");\n}\nexport function joinKeys(...keys) {\n return keys.map((key) => normalizeKey(key)).filter(Boolean).join(\":\");\n}\nexport function createError(driver, message, opts) {\n const err = new Error(`[unstorage] [${driver}] ${message}`, opts);\n if (Error.captureStackTrace) {\n Error.captureStackTrace(err, createError);\n }\n return err;\n}\nexport function createRequiredError(driver, name) {\n if (Array.isArray(name)) {\n return createError(\n driver,\n `Missing some of the required options ${name.map((n) => \"`\" + n + \"`\").join(\", \")}`\n );\n }\n return createError(driver, `Missing required option \\`${name}\\`.`);\n}\n","import { defineDriver } from \"./utils/index.mjs\";\nimport {\n get,\n set,\n clear,\n del,\n keys,\n createStore\n} from \"idb-keyval\";\nconst DRIVER_NAME = \"idb-keyval\";\nexport default defineDriver((opts = {}) => {\n const base = opts.base && opts.base.length > 0 ? `${opts.base}:` : \"\";\n const makeKey = (key) => base + key;\n let customStore;\n if (opts.dbName && opts.storeName) {\n customStore = createStore(opts.dbName, opts.storeName);\n }\n return {\n name: DRIVER_NAME,\n options: opts,\n async hasItem(key) {\n const item = await get(makeKey(key), customStore);\n return item === void 0 ? false : true;\n },\n async getItem(key) {\n const item = await get(makeKey(key), customStore);\n return item ?? null;\n },\n async getItemRaw(key) {\n const item = await get(makeKey(key), customStore);\n return item ?? null;\n },\n setItem(key, value) {\n return set(makeKey(key), value, customStore);\n },\n setItemRaw(key, value) {\n return set(makeKey(key), value, customStore);\n },\n removeItem(key) {\n return del(makeKey(key), customStore);\n },\n getKeys() {\n return keys(customStore);\n },\n clear() {\n return clear(customStore);\n }\n };\n});\n","import { useEffect, useRef, useCallback } from \"react\";\nimport { useAutoFormStore } from \"../lib/autoform-store\";\nimport { slugifyText } from \"../lib/slugify\";\nimport { resolveUrl, fetchWithAuth } from \"../lib/api\";\nimport { useUIStore } from \"../lib/stores\";\n\ninterface UseAutoFormStateProps {\n config: Record<string, unknown>;\n initialData: Record<string, unknown>;\n collectionSlug?: string;\n globalSlug?: string;\n onChange?: (data: Record<string, unknown>) => void;\n onActionSuccess?: (msg: string) => void;\n onActionError?: (msg: string) => void;\n}\n\nexport function useAutoFormState({\n config,\n initialData,\n collectionSlug,\n globalSlug,\n onChange,\n onActionSuccess,\n onActionError,\n}: UseAutoFormStateProps) {\n const store = useAutoFormStore();\n const { confirm, alert } = useUIStore();\n const {\n formData,\n setFormData,\n setField,\n lastSavedData,\n setLastSavedData,\n setHasUnsavedChanges,\n isSlugLocked,\n loadDocument,\n setIsAutoSaving,\n setAutoSaveStatus,\n setVersions,\n setLoadingVersions,\n sidebarCollapsed,\n setSidebarCollapsed,\n getDraftCache,\n setDraftCache,\n clearDraftCache,\n } = store;\n\n const versionsEnabled = !!config.versions;\n\n const localSaveTimerRef = useRef<NodeJS.Timeout | null>(null);\n const serverSaveTimerRef = useRef<NodeJS.Timeout | null>(null);\n const lastAutoSaveTimeRef = useRef<number>(0);\n const autoSaveSkipRef = useRef<boolean>(false);\n const restorePromptedRef = useRef<string | null>(null);\n\n const getDocumentKey = useCallback(\n (id?: string) => {\n if (globalSlug) return `global:${globalSlug}`;\n if (collectionSlug && id) return `${collectionSlug}:${id}`;\n return null;\n },\n [collectionSlug, globalSlug],\n );\n\nconst persistBrowserDraft = useCallback(\n (\n documentKey: string,\n data: Record<string, unknown>,\n options?: { lastSyncedAt?: string | null },\n ) => {\n setDraftCache(documentKey, {\n data,\n baseUpdatedAt: lastSavedData.updatedAt ?? null,\n draftUpdatedAt: new Date().toISOString(),\n lastSyncedAt: options?.lastSyncedAt ?? null,\n });\n },\n [lastSavedData.updatedAt, setDraftCache],\n );\n\n const clearDraftArtifacts = useCallback(async () => {\n const state = useAutoFormStore.getState();\n const documentKey = getDocumentKey(state.formData.id);\n if (documentKey) {\n clearDraftCache(documentKey);\n }\n\n const draftUrl = globalSlug \n ? resolveUrl(`/api/globals/${globalSlug}/draft`)\n : collectionSlug && state.formData.id \n ? resolveUrl(`/api/${collectionSlug}/${state.formData.id}/draft`)\n : null;\n\n if (draftUrl && versionsEnabled) {\n try {\n await fetchWithAuth(draftUrl, {\n method: \"DELETE\",\n });\n } catch (err) {\n console.error(\"Failed to clear draft snapshot:\", err);\n }\n }\n }, [clearDraftCache, collectionSlug, globalSlug, getDocumentKey]);\n\n const fetchVersions = useCallback(async () => {\n const url = globalSlug \n ? resolveUrl(`/api/globals/${globalSlug}/versions`)\n : collectionSlug && formData.id \n ? resolveUrl(`/api/${collectionSlug}/${formData.id}/versions`)\n : null;\n\n if (!url) return;\n setLoadingVersions(true);\n try {\n const resp = await fetchWithAuth(url);\n const data = await resp.json();\n setVersions(data.docs || []);\n } catch (e) {\n console.error(\"Failed to fetch versions:\", e);\n } finally {\n setLoadingVersions(false);\n }\n }, [formData.id, collectionSlug, globalSlug, setLoadingVersions, setVersions]);\n\n const performLocalAutoSave = useCallback(() => {\n const state = useAutoFormStore.getState();\n const latestFormData = state.formData;\n const currentLastSaved = state.lastSavedData;\n if (autoSaveSkipRef.current || !collectionSlug || !latestFormData.id) return;\n if (JSON.stringify(latestFormData) === JSON.stringify(currentLastSaved)) return;\n const documentKey = getDocumentKey(latestFormData.id);\n if (documentKey) {\n persistBrowserDraft(documentKey, latestFormData);\n }\n }, [collectionSlug, getDocumentKey, persistBrowserDraft]);\n\n const performServerAutoSave = useCallback(async (options?: { keepalive?: boolean }) => {\n const state = useAutoFormStore.getState();\n const latestFormData = state.formData;\n const currentLastSaved = state.lastSavedData;\n \n if (autoSaveSkipRef.current || (!versionsEnabled && !!globalSlug)) return;\n if (!globalSlug && (!collectionSlug || !latestFormData.id)) return;\n if (JSON.stringify(latestFormData) === JSON.stringify(currentLastSaved)) return;\n \n const documentKey = getDocumentKey(latestFormData.id);\n if (documentKey) {\n persistBrowserDraft(documentKey, latestFormData);\n }\n\n setIsAutoSaving(true);\n setAutoSaveStatus(\"saving\");\n\n try {\n const draftUpdatedAt = new Date().toISOString();\n const draftUrl = globalSlug \n ? resolveUrl(`/api/globals/${globalSlug}/draft`)\n : resolveUrl(`/api/${collectionSlug}/${latestFormData.id}/draft`);\n\n const response = await fetchWithAuth(\n draftUrl,\n {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n keepalive: options?.keepalive,\n body: JSON.stringify({\n data: latestFormData,\n baseUpdatedAt: currentLastSaved.updatedAt ?? null,\n draftUpdatedAt,\n }),\n },\n );\n\n if (response.ok) {\n const result = await response.json();\n lastAutoSaveTimeRef.current = Date.now();\n if (documentKey) {\n setDraftCache(documentKey, {\n data: latestFormData,\n baseUpdatedAt: currentLastSaved.updatedAt ?? null,\n draftUpdatedAt: result.data?.draftUpdatedAt || draftUpdatedAt,\n lastSyncedAt: result.data?.updatedAt || new Date().toISOString(),\n });\n }\n setAutoSaveStatus(\"success\");\n setTimeout(() => setAutoSaveStatus(\"idle\"), 2000);\n } else {\n const error = await response.json().catch(() => ({}));\n console.error(\"Draft auto-save failed:\", error);\n setAutoSaveStatus(\"error\");\n setTimeout(() => setAutoSaveStatus(\"idle\"), 5000);\n }\n } catch (err) {\n console.error(\"Auto-save failed:\", err);\n setAutoSaveStatus(\"error\");\n setTimeout(() => setAutoSaveStatus(\"idle\"), 5000);\n } finally {\n setIsAutoSaving(false);\n }\n }, [\n collectionSlug,\n getDocumentKey,\n persistBrowserDraft,\n setAutoSaveStatus,\n setDraftCache,\n setIsAutoSaving,\n ]);\n\nconst saveDocument = useCallback(\n async (dataOverride?: Record<string, unknown>) => {\n const state = useAutoFormStore.getState();\n const payload = dataOverride || state.formData;\n \n const url = globalSlug \n ? resolveUrl(`/api/globals/${globalSlug}`)\n : resolveUrl(`/api/${collectionSlug}/${payload.id}`);\n\n const response = await fetchWithAuth(\n url,\n {\n method: \"PATCH\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n ...payload,\n baseUpdatedAt: state.lastSavedData.updatedAt ?? null,\n }),\n },\n );\n\n if (response.status === 409) {\n setAutoSaveStatus(\"conflict\");\n }\n\n return response;\n },\n [collectionSlug, globalSlug, setAutoSaveStatus],\n );\n\n const publishDocument = useCallback(async () => {\n const state = useAutoFormStore.getState();\n const url = globalSlug \n ? resolveUrl(`/api/globals/${globalSlug}/publish`)\n : resolveUrl(`/api/${collectionSlug}/${state.formData.id}/publish`);\n\n const response = await fetchWithAuth(\n url,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n baseUpdatedAt: state.lastSavedData.updatedAt ?? null,\n }),\n },\n );\n\n if (response.status === 409) {\n setAutoSaveStatus(\"conflict\");\n }\n\n return response;\n }, [collectionSlug, globalSlug, setAutoSaveStatus]);\n\n const unpublishDocument = useCallback(async () => {\n const state = useAutoFormStore.getState();\n const url = globalSlug \n ? resolveUrl(`/api/globals/${globalSlug}/unpublish`)\n : resolveUrl(`/api/${collectionSlug}/${state.formData.id}/unpublish`);\n\n const response = await fetchWithAuth(\n url,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n },\n );\n return response;\n }, [collectionSlug, globalSlug]);\n\n // Track sidebar toggle\n useEffect(() => {\n const handleToggle = () => {\n setSidebarCollapsed(!sidebarCollapsed);\n };\n window.addEventListener(\"toggle-sidebar\", handleToggle);\n return () => window.removeEventListener(\"toggle-sidebar\", handleToggle);\n }, [sidebarCollapsed, setSidebarCollapsed]);\n\n // Track unsaved changes\n useEffect(() => {\n const isDifferent = JSON.stringify(formData) !== JSON.stringify(lastSavedData);\n setHasUnsavedChanges(isDifferent);\n }, [formData, lastSavedData, setHasUnsavedChanges]);\n\n // Initial data load\n const lastLoadedSlugRef = useRef<string | null>(null);\n const initialDataLoadedRef = useRef(false);\n useEffect(() => {\n const currentSlug = globalSlug || initialData?.id;\n if (initialDataLoadedRef.current && lastLoadedSlugRef.current === currentSlug) return;\n\n setFormData(initialData || {});\n loadDocument(initialData || {}, initialData || {});\n initialDataLoadedRef.current = true;\n lastLoadedSlugRef.current = currentSlug;\n }, [formData.id, globalSlug, initialData, loadDocument, setFormData]);\n\n useEffect(() => {\n if (!collectionSlug || !initialData?.id) return;\n\n const documentKey = getDocumentKey(initialData.id);\n if (!documentKey) return;\n if (restorePromptedRef.current === documentKey) return;\n\n let cancelled = false;\n\n const maybeRestoreDraft = async () => {\n if (!versionsEnabled) return;\n const browserDraft = getDraftCache(documentKey);\n let serverDraft: Record<string, unknown> | null = null;\n\ntry {\n const response = await fetchWithAuth(\n resolveUrl(`/api/${collectionSlug}/${initialData.id}/draft`),\n );\n if (response.ok) {\n const result: { data?: Record<string, unknown> } = await response.json();\n serverDraft = result.data || null;\n }\n } catch (err) {\n console.error(\"Failed to fetch server draft:\", err);\n }\n\nconst drafts = [browserDraft, serverDraft].filter(Boolean) as Array<{\n data: Record<string, unknown>;\n draftUpdatedAt: string;\n }>;\n\n const candidate = drafts.sort(\n (a, b) =>\n new Date(b.draftUpdatedAt).getTime() -\n new Date(a.draftUpdatedAt).getTime(),\n )[0];\n\n if (!candidate) return;\n if (JSON.stringify(candidate.data) === JSON.stringify(initialData)) {\n return;\n }\n\n restorePromptedRef.current = documentKey;\n\n confirm({\n title: \"Restore draft?\",\n message:\n \"A newer autosaved draft was found for this document. Restore it or discard it and continue with the saved version.\",\n confirmLabel: \"Restore draft\",\n cancelLabel: \"Discard draft\",\n onConfirm: async () => {\n if (cancelled) return;\n setFormData(candidate.data);\n onActionSuccess?.(\"Recovered autosaved draft\");\n },\n onCancel: async () => {\n clearDraftCache(documentKey);\n try {\n await fetchWithAuth(\n resolveUrl(`/api/${collectionSlug}/${initialData.id}/draft`),\n { method: \"DELETE\" },\n );\n } catch (err) {\n console.error(\"Failed to discard server draft:\", err);\n }\n },\n });\n };\n\n maybeRestoreDraft();\n\n return () => {\n cancelled = true;\n };\n }, [\n clearDraftCache,\n collectionSlug,\n confirm,\n getDocumentKey,\n getDraftCache,\n initialData,\n onActionSuccess,\n setFormData,\n ]);\n\n // Auto-generate metaTitle\n useEffect(() => {\nconst metaTitleField = config.fields.find(\n (f: Record<string, unknown>) => f.name === \"metaTitle\" && f.admin?.autoGenerate === \"title\",\n );\n if (!metaTitleField) return;\n\n let titleValue = \"\";\n for (const field of config.fields) {\n if (field.type === \"tabs\" && \"tabs\" in field && field.name) {\n const tabData = formData[field.name as string];\n if (tabData && typeof tabData === \"object\" && tabData.title) {\n titleValue = tabData.title;\n break;\n }\n }\n }\n\n if (titleValue && (!formData.metaTitle || formData.metaTitle === formData._lastMetaTitle)) {\n setField(\"metaTitle\", titleValue);\n }\n }, [formData, config.fields, setField]);\n\n // Auto-generate slug\n useEffect(() => {\nconst slugField = config.fields.find(\n (f: Record<string, unknown>) => f.name === \"slug\" && f.admin?.autoGenerate,\n );\n if (!slugField?.admin?.autoGenerate) return;\n const sourceField: string = slugField.admin.autoGenerate;\n\n let sourceValue = formData[sourceField];\n if (!sourceValue) {\n for (const field of config.fields) {\n if (field.type === \"tabs\" && \"tabs\" in field && field.name) {\n const tabData = formData[field.name as string];\n if (tabData && typeof tabData === \"object\" && tabData[sourceField]) {\n sourceValue = tabData[sourceField];\n break;\n }\n }\n }\n }\n\n if (isSlugLocked && sourceValue) {\n const newSlug = slugifyText(sourceValue);\n if (newSlug !== formData.slug) {\n setField(\"slug\", newSlug);\n }\n }\n }, [formData, isSlugLocked, config.fields, setField]);\n\n // Auto-save effect (Split-timer: 1.5s local, 10s server)\n useEffect(() => {\n if (sidebarCollapsed) return;\n if (!globalSlug && (!collectionSlug || !formData.id)) return;\n\n if (localSaveTimerRef.current) clearTimeout(localSaveTimerRef.current);\n if (serverSaveTimerRef.current) clearTimeout(serverSaveTimerRef.current);\n\n localSaveTimerRef.current = setTimeout(performLocalAutoSave, 1500);\n serverSaveTimerRef.current = setTimeout(performServerAutoSave, 10000);\n\n return () => {\n if (localSaveTimerRef.current) clearTimeout(localSaveTimerRef.current);\n if (serverSaveTimerRef.current) clearTimeout(serverSaveTimerRef.current);\n };\n }, [formData, sidebarCollapsed, collectionSlug, globalSlug, performLocalAutoSave, performServerAutoSave]);\n\n useEffect(() => {\n if (!globalSlug && (!collectionSlug || !formData.id)) return;\n\n const flushDraft = () => {\n if (autoSaveSkipRef.current) return;\n void performServerAutoSave({ keepalive: true });\n };\n\n const handleVisibilityChange = () => {\n if (document.hidden) {\n flushDraft();\n }\n };\n\n window.addEventListener(\"blur\", flushDraft);\n window.addEventListener(\"pagehide\", flushDraft);\n document.addEventListener(\"visibilitychange\", handleVisibilityChange);\n\n return () => {\n window.removeEventListener(\"blur\", flushDraft);\n window.removeEventListener(\"pagehide\", flushDraft);\n document.removeEventListener(\"visibilitychange\", handleVisibilityChange);\n };\n }, [collectionSlug, globalSlug, formData.id, performServerAutoSave]);\n\n // Astro sync\n useEffect(() => {\n const hiddenInput = document.getElementById(\"form-data\") as HTMLInputElement;\n if (hiddenInput) {\n hiddenInput.value = JSON.stringify(formData);\n }\n onChange?.(formData);\n }, [formData, onChange]);\n\n // Fetch versions on load\n useEffect(() => {\n if (globalSlug || formData.id) fetchVersions();\n }, [formData.id, globalSlug, fetchVersions]);\n\n // Derived status values the UI can use for badges and button state\n const documentStatus: 'draft' | 'published' | 'archived' | undefined = (() => {\n if (!versionsEnabled) return 'published';\n if (!formData.id && !globalSlug) return 'draft';\n // If it has a pending draft version, effectively it's in a draft state for the editor\n if (formData._has_draft) return 'draft';\n return formData._status || 'published';\n })();\n\n const hasUnpublishedChanges =\n (!!formData.id || !!globalSlug) && (documentStatus !== 'published' || !!formData._has_draft);\n\n return {\n ...store,\n fetchVersions,\n performAutoSave: performServerAutoSave,\n saveDocument,\n publishDocument,\n unpublishDocument,\n clearDraftArtifacts,\n autoSaveSkipRef,\n lastAutoSaveTimeRef,\n alert,\n documentStatus,\n hasUnpublishedChanges,\n versionsEnabled,\n };\n}\n","/**\n * Convert text to a URL-friendly slug.\n */\nexport function slugifyText(text: string): string {\n if (!text) return \"\";\n return text\n .toString()\n .toLowerCase()\n .trim()\n .replace(/\\s+/g, \"-\")\n .replace(/[^\\w-]+/g, \"\")\n .replace(/--+/g, \"-\")\n .replace(/^-+/, \"\")\n .replace(/-+$/, \"\");\n}\n","import React, { useState, useEffect } from \"react\";\nimport { Search, Loader2, X } from \"../ui/icons\";\nimport { apiGet, buildSearchQuery } from \"../../lib/api\";\n\ninterface RelationshipBlockFieldProps {\n relationTo?: string;\n hasMany?: boolean;\n selectedIds?: string[];\n selectedId?: string;\n labelField?: string;\n onChange: (field: string, value: unknown) => void;\n compact?: boolean;\n}\n\nexport const RelationshipBlockField: React.FC<RelationshipBlockFieldProps> = ({\n relationTo = \"pages\",\n hasMany = false,\n selectedIds = [],\n selectedId,\n labelField = \"title\",\n onChange,\n compact = false,\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const [search, setSearch] = useState(\"\");\n const [options, setOptions] = useState<Record<string, unknown>[]>([]);\n const [loading, setLoading] = useState(false);\n const [collections, setCollections] = useState<string[]>([]);\n const [loadingCollections, setLoadingCollections] = useState(true);\n\n useEffect(() => {\n apiGet(\"/api/collections\")\n .then((data) => {\n setCollections(\n (data.collections || []).map((c: Record<string, unknown>) => c.slug || c.name || c),\n );\n setLoadingCollections(false);\n })\n .catch(() => setLoadingCollections(false));\n }, []);\n\n const fetchOptions = (query: string = \"\") => {\n setLoading(true);\n const url = `/api/${relationTo}?${buildSearchQuery(query, [labelField], 20)}`;\n\n apiGet(url)\n .then((data) => {\n setOptions(data.docs || []);\n setLoading(false);\n })\n .catch(() => setLoading(false));\n };\n\n useEffect(() => {\n if (isOpen) fetchOptions(search);\n }, [isOpen, search, relationTo, labelField]);\n\n const getLabel = (opt: Record<string, unknown>) => {\n return (\n opt?.[labelField] ||\n opt?.title ||\n opt?.name ||\n opt?.label ||\n opt?.filename ||\n opt?.slug ||\n opt?.id ||\n \"Untitled\"\n );\n };\n\n const activeIds = hasMany ? selectedIds : selectedId ? [selectedId] : [];\n\n const handleSelect = (opt: Record<string, unknown>) => {\n if (hasMany) {\n if (activeIds.includes(opt.id)) {\n onChange(\n \"selectedIds\",\n activeIds.filter((id: string) => id !== opt.id),\n );\n } else {\n onChange(\"selectedIds\", [...activeIds, opt.id]);\n }\n } else {\n onChange(\"selectedId\", opt.id);\n onChange(\"selectedIds\", [opt.id]);\n setIsOpen(false);\n }\n };\n\n const isSelected = (optId: string) => activeIds.includes(optId);\n\n const inputClass = compact\n ? \"w-full px-2.5 py-1.5 border border-[var(--kyro-border)] rounded bg-[var(--kyro-bg-secondary)] text-sm text-[var(--kyro-text-primary)] focus:outline-none focus:ring-1 focus:ring-[var(--kyro-sidebar-active)] focus:border-transparent\"\n : \"w-full px-3 py-2.5 border border-[var(--kyro-border)] rounded-lg bg-[var(--kyro-bg-secondary)] text-sm text-[var(--kyro-text-primary)] focus:outline-none focus:ring-1 focus:ring-[var(--kyro-sidebar-active)] focus:border-transparent\";\n\n const selectClass = compact\n ? \"w-full px-2.5 py-1.5 border border-[var(--kyro-border)] rounded bg-[var(--kyro-bg-secondary)] text-sm text-[var(--kyro-text-primary)] focus:outline-none focus:ring-1 focus:ring-[var(--kyro-sidebar-active)] focus:border-transparent\"\n : \"w-full px-3 py-2.5 border border-[var(--kyro-border)] rounded-lg bg-[var(--kyro-bg-secondary)] text-sm text-[var(--kyro-text-primary)] focus:outline-none focus:ring-1 focus:ring-[var(--kyro-sidebar-active)] focus:border-transparent\";\n\n // Check if relationTo is a known single collection (not an array)\n const isKnownCollection = relationTo && typeof relationTo === \"string\" && relationTo.length > 0;\n\n return (\n <div className={compact ? \"space-y-2\" : \"space-y-4\"}>\n <div className={compact ? \"flex items-center gap-2\" : \"space-y-3\"}>\n {/* Hide collection selector if relationTo is known (single collection) */}\n {!isKnownCollection && (\n <>\n {loadingCollections ? (\n <div className={selectClass + \" text-[var(--kyro-text-muted)]\"}>\n Loading...\n </div>\n ) : (\n <select\n value={relationTo}\n onChange={(e) => onChange(\"relationTo\", e.target.value)}\n className={selectClass}\n >\n <option value=\"\">Select collection...</option>\n {collections.map((col) => (\n <option key={col} value={col}>\n {col}\n </option>\n ))}\n </select>\n )}\n </>\n )}\n\n {!compact && (\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={hasMany}\n onChange={(e) => onChange(\"hasMany\", e.target.checked)}\n className=\"w-4 h-4 rounded border-[var(--kyro-border)] focus:ring-[var(--kyro-sidebar-active)] focus:ring-offset-0\"\n />\n <span className=\"text-sm text-[var(--kyro-text-primary)]\">\n Allow multiple\n </span>\n </label>\n )}\n </div>\n\n <div className=\"relative\">\n <div className=\"relative\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--kyro-text-muted)]\" />\n <input\n type=\"text\"\n value={search}\n onChange={(e) => {\n setSearch(e.target.value);\n setIsOpen(true);\n }}\n onFocus={() => setIsOpen(true)}\n onBlur={() => setTimeout(() => setIsOpen(false), 200)}\n placeholder={`Search ${relationTo}...`}\n className={`${inputClass} pl-9`}\n />\n <div className=\"absolute right-3 top-1/2 -translate-y-1/2\">\n {loading && (\n <Loader2 className=\"w-4 h-4 text-[var(--kyro-text-muted)] animate-spin\" />\n )}\n </div>\n </div>\n\n {isOpen && (\n <div className=\"absolute z-20 w-full mt-1 border border-[var(--kyro-border)] rounded-lg shadow-lg bg-[var(--kyro-surface)] max-h-48 overflow-auto\">\n {loading ? (\n <div className=\"p-3 text-center text-sm text-[var(--kyro-text-muted)]\">\n Loading...\n </div>\n ) : options.length === 0 ? (\n <div className=\"p-3 text-center text-sm text-[var(--kyro-text-muted)]\">\n No results found\n </div>\n ) : (\n <div className=\"py-1\">\n {options.map((opt) => (\n <button\n key={opt.id}\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => handleSelect(opt)}\n className={`w-full px-3 py-2 text-left text-sm hover:bg-[var(--kyro-surface-accent)] transition-colors flex items-center justify-between ${\n isSelected(opt.id)\n ? \"bg-[var(--kyro-sidebar-active)]/10 text-[var(--kyro-sidebar-active)]\"\n : \"text-[var(--kyro-text-primary)]\"\n }`}\n >\n <span>{getLabel(opt)}</span>\n {isSelected(opt.id) && <span>✓</span>}\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n\n {activeIds.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5\">\n {activeIds.map((id: string) => {\n const opt = options.find((o) => o.id === id) || { id };\n return (\n <span\n key={id}\n className=\"inline-flex items-center gap-1.5 px-2.5 py-1.5 text-xs rounded-md bg-[var(--kyro-sidebar-active)]/10 text-[var(--kyro-sidebar-active)]\"\n >\n {getLabel(opt)}\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => {\n if (hasMany) {\n onChange(\n \"selectedIds\",\n activeIds.filter((sid: string) => sid !== id),\n );\n } else {\n onChange(\"selectedId\", null);\n onChange(\"selectedIds\", []);\n }\n }}\n className=\"hover:opacity-70\"\n >\n <X className=\"w-3 h-3\" />\n </button>\n </span>\n );\n })}\n </div>\n )}\n </div>\n );\n};\n\nexport default RelationshipBlockField;\n","import React, { useState, useEffect, useRef, useMemo } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { Image as ImageIcon, Film, FileText, Music, File, X, Loader2 } from \"../ui/icons\";\nimport { apiGet, withCacheBust, apiPost, apiUpload, resolveApi, resolveMedia } from \"../../lib/api\";\nimport { toast } from \"../../lib/stores\";\n\ninterface UploadFieldProps {\n field: any;\n value: any;\n onChange: (value: any) => void;\n disabled?: boolean;\n}\n\ninterface MediaItem {\n id: string;\n filename: string;\n url: string;\n thumbnailUrl?: string;\n mimeType: string;\n title?: string;\n folder?: string;\n}\n\ninterface MediaFolder {\n name: string;\n path: string;\n}\n\nconst getFileType = (mimeType?: string, filename?: string) => {\n const mime = mimeType?.toLowerCase() || \"\";\n const name = filename?.toLowerCase() || \"\";\n\n if (\n mime.startsWith(\"image/\") ||\n name.match(/\\.(jpe?g|png|gif|webp|avif|svg)$/i)\n )\n return \"image\";\n if (mime.startsWith(\"video/\") || name.match(/\\.(mp4|webm|ogg|mov)$/i))\n return \"video\";\n if (mime.startsWith(\"audio/\") || name.match(/\\.(mp3|wav|ogg|m4a)$/i))\n return \"audio\";\n if (mime.includes(\"pdf\") || name.endsWith(\".pdf\")) return \"pdf\";\n if (name.match(/\\.(doc|docx|txt|rtf|odt)$/i)) return \"document\";\n if (name.match(/\\.(xls|xlsx|csv)$/i)) return \"spreadsheet\";\n if (name.match(/\\.(zip|tar|gz|7z|rar)$/i)) return \"archive\";\n\n return \"other\";\n};\n\nconst FileIcon = ({\n type,\n className,\n}: {\n type: string;\n className?: string;\n}) => {\n switch (type) {\n case \"image\":\n return <ImageIcon className={className} />;\n case \"video\":\n return <Film className={className} />;\n case \"audio\":\n return <Music className={className} />;\n case \"pdf\":\n case \"document\":\n return <FileText className={className} />;\n default:\n return <File className={className} />;\n }\n};\n\nexport function UploadField({\n field,\n value,\n onChange,\n disabled,\n}: UploadFieldProps) {\n const inputRef = useRef<HTMLInputElement>(null);\n const urlInputRef = useRef<HTMLInputElement>(null);\n const [uploading, setUploading] = useState(false);\n const [showPicker, setShowPicker] = useState(false);\n const [isPickerFullscreen, setIsPickerFullscreen] = useState(false);\n const [mediaItems, setMediaItems] = useState<MediaItem[]>([]);\n const [folders, setFolders] = useState<MediaFolder[]>([]);\n const [selectedFolder, setSelectedFolder] = useState<string>(\"\");\n const [mediaLoading, setMediaLoading] = useState(false);\n const [pickerSearch, setPickerSearch] = useState(\"\");\n const [showUrlInput, setShowUrlInput] = useState(false);\n const [urlValue, setUrlValue] = useState(\"\");\n const [urlError, setUrlError] = useState(\"\");\n\n const fieldLabel = field?.label || field?.name || \"File\";\n const maxCount = field.maxCount || 1;\n const isMultiple = maxCount > 1;\n const currentValue = Array.isArray(value) ? value : value ? [value] : [];\n const canAddMore = currentValue.length < maxCount;\n\n useEffect(() => {\n const fetchMissingDetails = async () => {\n const idsToFetch = currentValue\n .filter(item => typeof item === 'string')\n .map(id => id as string);\n\n if (idsToFetch.length === 0) return;\n\n try {\n const fetchedItems = await Promise.all(\n idsToFetch.map(id => apiGet<any>(`/api/media/${id}`))\n );\n\n const newItems = [...currentValue];\n fetchedItems.forEach(fetchedItem => {\n const index = newItems.findIndex(item => item === (fetchedItem.id || fetchedItem));\n if (index !== -1) {\n newItems[index] = fetchedItem;\n }\n });\n\n onChange(isMultiple ? newItems : newItems[0]);\n } catch (err) {\n console.error(\"Failed to fetch media details:\", err);\n }\n };\n\n fetchMissingDetails();\n }, [value]);\n\n useEffect(() => {\n if (showPicker) {\n loadFolders();\n loadMedia();\n }\n }, [showPicker, selectedFolder]);\n\n const loadFolders = async () => {\n try {\n const result = await apiGet<any>(withCacheBust(\"/api/media/folders\"));\n setFolders(result.folders || []);\n } catch {\n setFolders([]);\n }\n };\n\n const loadMedia = async () => {\n setMediaLoading(true);\n try {\n let url = withCacheBust(\n `/api/media?limit=60&sortBy=createdAt&sortDir=desc`,\n );\n if (selectedFolder) {\n url += \"&folder=\" + encodeURIComponent(selectedFolder);\n }\n const result = await apiGet<any>(url);\n setMediaItems(result.docs || []);\n } catch {\n setMediaItems([]);\n } finally {\n setMediaLoading(false);\n }\n };\n\n const uploadFile = async (file: File) => {\n setUploading(true);\n try {\n const formData = new FormData();\n formData.append(\"file\", file);\n if (selectedFolder) {\n formData.append(\"folder\", selectedFolder);\n }\n const result = await apiUpload<any>(\"/api/media/upload\", formData);\n const newImage = {\n id: result.id,\n filename: result.filename,\n originalName: (result as any).originalName ?? file.name,\n url: result.url,\n mimeType: file.type,\n };\n if (isMultiple) {\n onChange([...currentValue, newImage]);\n } else {\n onChange(newImage);\n }\n toast.success(`Asset synchronized: ${newImage.filename}`);\n } catch (err) {\n console.error(\"Upload failed:\", err);\n } finally {\n setUploading(false);\n }\n };\n\n const addByUrl = async () => {\n const url = urlValue.trim();\n if (!url) return;\n\n setUrlError(\"\");\n try {\n const result = await apiPost<any>(\"/api/media/upload\", { url });\n const originalName = (() => {\n try {\n return (\n new URL(url).pathname.split(\"/\").pop() ||\n result.originalName ||\n \"url-image\"\n );\n } catch {\n return result.originalName || \"url-image\";\n }\n })();\n const newImage = {\n id: result.id,\n filename: result.filename,\n originalName,\n url: result.url,\n mimeType: result.mimeType || \"image/*\",\n };\n if (isMultiple) {\n onChange([...currentValue, newImage]);\n } else {\n onChange(newImage);\n }\n toast.success(`URL asset established: ${newImage.filename}`);\n setUrlValue(\"\");\n setShowUrlInput(false);\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : \"Invalid URL\";\n setUrlError(message);\n }\n };\n\n const selectFromLibrary = (item: MediaItem) => {\n const newImage = {\n id: item.id,\n filename: item.filename,\n url: item.url,\n mimeType: item.mimeType,\n };\n if (isMultiple) {\n onChange([...currentValue, newImage]);\n } else {\n onChange(newImage);\n }\n setShowPicker(false);\n setPickerSearch(\"\");\n };\n\n const removeImage = (index: number) => {\n const newValue = [...currentValue];\n newValue.splice(index, 1);\n onChange(isMultiple ? newValue : newValue[0] || null);\n };\n\n const filteredMedia = useMemo(() => {\n return mediaItems.filter((item) => {\n return (\n !pickerSearch ||\n item.filename?.toLowerCase().includes(pickerSearch.toLowerCase()) ||\n item.title?.toLowerCase().includes(pickerSearch.toLowerCase())\n );\n });\n }, [mediaItems, pickerSearch]);\n\n if (uploading) {\n return (\n <div className=\"text-xs text-[var(--kyro-text-muted)] p-2\">\n Uploading...\n </div>\n );\n }\n\n const renderImagePreview = (img: any, index?: number) => {\n if (!img) return null;\n const fileType = getFileType(img.mimeType, img.filename || img.url);\n const isImage = fileType === \"image\";\n\n return (\n <div\n key={index}\n className=\"flex items-center gap-3 p-2.5 bg-[var(--kyro-surface-accent)] rounded-lg border border-[var(--kyro-border)] group\"\n >\n <div className=\"w-10 h-10 rounded-md overflow-hidden bg-[var(--kyro-surface)] border border-[var(--kyro-border)] flex items-center justify-center flex-shrink-0\">\n {isImage ? (\n <img\n src={resolveMedia(img.url)}\n alt={img.filename || \"Preview\"}\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <FileIcon\n type={fileType}\n className=\"w-5 h-5 text-[var(--kyro-text-secondary)]\"\n />\n )}\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-[11px] font-medium truncate text-[var(--kyro-text-primary)]\">\n {img.originalName || img.filename || \"Unnamed File\"}\n </div>\n <div className=\"text-[10px] text-[var(--kyro-text-muted)] tracking-wider font-bold\">\n {fieldLabel}\n </div>\n </div>\n <button\n type=\"button\"\n onClick={() =>\n index !== undefined ? removeImage(index) : onChange(null)\n }\n disabled={disabled}\n className=\"p-1.5 rounded-md text-[var(--kyro-text-muted)] hover:text-[var(--kyro-error)] hover:bg-[var(--kyro-danger-bg)] transition-all opacity-0 group-hover:opacity-100\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n );\n };\n\n if (value) {\n return (\n <div className=\"space-y-2\">\n {isMultiple ? (\n <div className=\"grid grid-cols-2 gap-2\">\n {currentValue.map((img: any, i: number) =>\n renderImagePreview(img, i),\n )}\n {canAddMore && (\n <button\n type=\"button\"\n onClick={() => inputRef.current?.click()}\n disabled={disabled}\n className=\"flex items-center justify-center h-12 border-2 border-dashed border-[var(--kyro-border)] rounded-lg text-sm text-[var(--kyro-text-secondary)] hover:border-[var(--kyro-border-active)] cursor-pointer transition-colors\"\n >\n + Add {fieldLabel}\n </button>\n )}\n </div>\n ) : (\n renderImagePreview(value)\n )}\n <input\n ref={inputRef}\n type=\"file\"\n accept=\"image/*\"\n onChange={(e) => {\n const file = e.target.files?.[0];\n if (file) uploadFile(file);\n }}\n disabled={disabled}\n className=\"hidden\"\n />\n </div>\n );\n }\n\n return (\n <div className=\"space-y-2 relative\">\n <input\n ref={inputRef}\n type=\"file\"\n accept={field.allowedTypes?.join(\",\") || \"*/*\"}\n onChange={(e) => {\n const file = e.target.files?.[0];\n if (file) uploadFile(file);\n }}\n disabled={disabled}\n className=\"hidden\"\n />\n <div className=\"flex gap-2 flex-wrap\">\n <button\n type=\"button\"\n onClick={() => inputRef.current?.click()}\n disabled={disabled}\n className=\"px-3 py-1.5 text-xs font-semibold rounded border border-dashed border-[var(--kyro-border)] bg-[var(--kyro-surface-accent)] text-[var(--kyro-text-secondary)] cursor-pointer hover:border-[var(--kyro-border-active)] transition-colors\"\n >\n + Upload {fieldLabel}\n </button>\n <button\n type=\"button\"\n onClick={() => setShowPicker(true)}\n disabled={disabled}\n className=\"px-3 py-1.5 text-xs font-semibold rounded border border-[var(--kyro-border)] bg-[var(--kyro-surface)] text-[var(--kyro-text-secondary)] cursor-pointer hover:border-[var(--kyro-border-active)] transition-colors\"\n >\n Library\n </button>\n <button\n type=\"button\"\n onClick={() => setShowUrlInput(!showUrlInput)}\n disabled={disabled}\n className=\"px-3 py-1.5 text-xs font-semibold rounded border border-[var(--kyro-border)] bg-[var(--kyro-surface)] text-[var(--kyro-text-secondary)] cursor-pointer hover:border-[var(--kyro-border-active)] transition-colors\"\n >\n URL\n </button>\n </div>\n\n {showUrlInput && (\n <div className=\"flex gap-2 items-center\">\n <input\n ref={urlInputRef}\n type=\"url\"\n placeholder=\"https://example.com/image.jpg\"\n value={urlValue}\n onChange={(e) => {\n setUrlValue(e.target.value);\n setUrlError(\"\");\n }}\n onKeyDown={(e) => e.key === \"Enter\" && addByUrl()}\n disabled={disabled}\n className=\"flex-1 px-2 py-1.5 text-xs rounded border border-[var(--kyro-border)] bg-[var(--kyro-surface-accent)] text-[var(--kyro-text-primary)]\"\n />\n <button\n type=\"button\"\n onClick={addByUrl}\n disabled={disabled || !urlValue.trim()}\n className=\"px-3 py-1.5 text-xs rounded bg-[var(--kyro-primary)] text-white cursor-pointer hover:opacity-90 transition-opacity disabled:opacity-50\"\n >\n Add\n </button>\n {urlError && (\n <span className=\"text-xs text-[var(--kyro-error)]\">{urlError}</span>\n )}\n </div>\n )}\n\n {showPicker &&\n (isPickerFullscreen ? (\n createPortal(\n <MediaPickerContent\n isFullscreen\n pickerSearch={pickerSearch}\n setPickerSearch={setPickerSearch}\n folders={folders}\n selectedFolder={selectedFolder}\n setSelectedFolder={setSelectedFolder}\n mediaLoading={mediaLoading}\n filteredMedia={filteredMedia}\n selectFromLibrary={selectFromLibrary}\n setIsPickerFullscreen={setIsPickerFullscreen}\n setShowPicker={setShowPicker}\n />,\n document.body,\n )\n ) : (\n <MediaPickerContent\n isFullscreen={false}\n pickerSearch={pickerSearch}\n setPickerSearch={setPickerSearch}\n folders={folders}\n selectedFolder={selectedFolder}\n setSelectedFolder={setSelectedFolder}\n mediaLoading={mediaLoading}\n filteredMedia={filteredMedia}\n selectFromLibrary={selectFromLibrary}\n setIsPickerFullscreen={setIsPickerFullscreen}\n setShowPicker={setShowPicker}\n />\n ))}\n </div>\n );\n}\n\nfunction MediaPickerContent({\n isFullscreen,\n pickerSearch,\n setPickerSearch,\n folders,\n selectedFolder,\n setSelectedFolder,\n mediaLoading,\n filteredMedia,\n selectFromLibrary,\n setIsPickerFullscreen,\n setShowPicker,\n}: {\n isFullscreen: boolean;\n pickerSearch: string;\n setPickerSearch: (v: string) => void;\n folders: MediaFolder[];\n selectedFolder: string;\n setSelectedFolder: (v: string) => void;\n mediaLoading: boolean;\n filteredMedia: MediaItem[];\n selectFromLibrary: (item: MediaItem) => void;\n setIsPickerFullscreen: (v: boolean) => void;\n setShowPicker: (v: boolean) => void;\n}) {\n return (\n <div\n className={`${isFullscreen\n ? \"fixed inset-0 z-[9999]\"\n : \"absolute z-[9999] w-[360px] max-h-[400px] mt-1 rounded-lg shadow-lg\"\n } overflow-hidden bg-[var(--kyro-surface)] border border-[var(--kyro-border)] flex flex-col`}\n >\n <div className=\"p-2 border-b border-[var(--kyro-border)] flex flex-col gap-2\">\n <input\n type=\"text\"\n placeholder=\"Search media...\"\n value={pickerSearch}\n onChange={(e) => setPickerSearch(e.target.value)}\n className=\"w-full px-2 py-1.5 text-xs rounded border border-[var(--kyro-border)] bg-[var(--kyro-surface-accent)] text-[var(--kyro-text-primary)]\"\n />\n {folders.length > 0 && (\n <div className=\"flex gap-1 flex-wrap\">\n <button\n type=\"button\"\n onClick={() => setSelectedFolder(\"\")}\n className={`px-2 py-1 text-xs rounded transition-colors ${selectedFolder === \"\"\n ? \"bg-[var(--kyro-primary)] text-white\"\n : \"bg-[var(--kyro-surface-accent)] text-[var(--kyro-text-secondary)] hover:bg-[var(--kyro-border)]\"\n }`}\n >\n All\n </button>\n {folders.slice(0, 6).map((folder) => (\n <button\n key={folder.path}\n type=\"button\"\n onClick={() => setSelectedFolder(folder.path)}\n className={`px-2 py-1 text-xs rounded transition-colors ${selectedFolder === folder.path\n ? \"bg-[var(--kyro-primary)] text-white\"\n : \"bg-[var(--kyro-surface-accent)] text-[var(--kyro-text-secondary)] hover:bg-[var(--kyro-border)]\"\n }`}\n >\n {folder.name}\n </button>\n ))}\n </div>\n )}\n </div>\n\n {/* Picker Items */}\n <div className=\"flex-1 overflow-auto p-2\">\n {mediaLoading ? (\n <div className=\"text-center py-5 text-xs text-[var(--kyro-text-muted)]\">\n Loading...\n </div>\n ) : filteredMedia.length === 0 ? (\n <div className=\"text-center py-5 text-xs text-[var(--kyro-text-muted)]\">\n No media found\n </div>\n ) : (\n <div\n className={`grid gap-1 ${isFullscreen\n ? \"grid-cols-[repeat(auto-fill,minmax(140px,1fr))]\"\n : \"grid-cols-3\"\n }`}\n >\n {filteredMedia.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n onClick={() => selectFromLibrary(item)}\n className=\"border border-[var(--kyro-border)] rounded-md overflow-hidden cursor-pointer p-0 bg-[var(--kyro-surface)] hover:border-[var(--kyro-primary)] transition-all relative group\"\n >\n <div\n className={`w-full flex items-center justify-center bg-[var(--kyro-surface-accent)] ${isFullscreen ? \"h-[120px]\" : \"h-[80px]\"\n }`}\n >\n {getFileType(item.mimeType, item.filename) === \"image\" ? (\n <img\n src={resolveMedia(item.thumbnailUrl || item.url)}\n alt={item.filename}\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <FileIcon\n type={getFileType(item.mimeType, item.filename)}\n className={isFullscreen ? \"w-10 h-10\" : \"w-8 h-8\"}\n />\n )}\n </div>\n <div className=\"absolute inset-0 bg-black/60 opacity-0 group-hover:opacity-0 transition-opacity flex flex-col items-center justify-center p-2\">\n <span className=\"text-white text-[10px] font-medium text-center line-clamp-2 mb-1\">\n {item.filename}\n </span>\n <span className=\"text-white/70 text-[9px] font-bold tracking-tighter\">\n {getFileType(item.mimeType, item.filename)}\n </span>\n </div>\n </button>\n ))}\n </div>\n )}\n </div>\n <div className=\"p-2 border-t border-[var(--kyro-border)] flex justify-between items-center\">\n <span className=\"text-xs text-[var(--kyro-text-muted)]\">\n {filteredMedia.length} items\n </span>\n <div className=\"flex gap-2 items-center\">\n <button\n type=\"button\"\n onClick={() => setIsPickerFullscreen(!isFullscreen)}\n className=\"p-1.5 rounded text-[var(--kyro-text-secondary)] hover:text-[var(--kyro-text-primary)] hover:bg-[var(--kyro-surface-accent)] transition-colors\"\n title={isFullscreen ? \"Exit fullscreen\" : \"Fullscreen\"}\n >\n {isFullscreen ? (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M8 3v3a2 2 0 0 1-2 2H3m18 0h-3a2 2 0 0 1-2-2V3m0 18v-3a2 2 0 0 1 2-2h3M3 16h3a2 2 0 0 1 2 2v3\" />\n </svg>\n ) : (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M15 3h6v6M9 21H3v-6M21 3l-7 7M3 21l7-7\" />\n </svg>\n )}\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setShowPicker(false);\n setIsPickerFullscreen(false);\n }}\n className=\"text-xs text-[var(--kyro-text-secondary)] bg-transparent border-none cursor-pointer hover:text-[var(--kyro-text-primary)]\"\n >\n Close\n </button>\n </div>\n </div>\n </div>\n );\n}\n","import React, {\n useState,\n useEffect,\n useMemo,\n useCallback,\n lazy,\n Suspense,\n useRef,\n} from \"react\";\n\ninterface PortableTextFieldProps {\n field: {\n name: string;\n label?: string;\n required?: boolean;\n admin?: {\n description?: string;\n placeholder?: string;\n };\n };\n value?: unknown;\n onChange?: (value: unknown) => void;\n error?: string;\n disabled?: boolean;\n}\n\nconst EditorLazy = lazy(() => import(\"./EditorClient\"));\n\nfunction toPortableTextArray(value: unknown): Record<string, unknown>[] {\n if (Array.isArray(value)) {\n if (\n value.length > 0 &&\n value[0] &&\n typeof value[0] === \"object\" &&\n \"_type\" in value[0]\n ) {\n return value;\n }\n if (value.length === 0) return [];\n }\n if (typeof value === \"string\" && value.trim()) {\n return [\n {\n _type: \"block\",\n _key: \"initial-block\",\n style: \"normal\",\n markDefs: [],\n children: [\n {\n _type: \"span\",\n _key: \"initial-span\",\n text: value,\n marks: [],\n },\n ],\n },\n ];\n }\n return [];\n}\n\nconst PortableTextField: React.FC<PortableTextFieldProps> = ({\n field,\n value,\n onChange,\n error,\n disabled,\n}) => {\n const [isMounted, setIsMounted] = useState(false);\n const [editorKey, setEditorKey] = useState(0);\n\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n const ptValue = useMemo(() => toPortableTextArray(value), [value]);\n\n const prevPtValueRef = useRef(ptValue);\n useEffect(() => {\n const hasChanged =\n JSON.stringify(ptValue) !== JSON.stringify(prevPtValueRef.current);\n if (hasChanged && isMounted) {\n setEditorKey((k) => k + 1);\n prevPtValueRef.current = ptValue;\n }\n }, [ptValue, isMounted]);\n\n const handleChange = useCallback(\n (blocks: Record<string, unknown>[]) => {\n if (!blocks || !Array.isArray(blocks)) {\n onChange?.([]);\n return;\n }\n onChange?.(blocks);\n },\n [onChange],\n );\n\n if (!isMounted) {\n return (\n <div className=\"space-y-1.5\">\n {field.label && (\n <label className=\"block text-sm font-medium text-[var(--kyro-text-primary)]\">\n {field.label}\n {field.required && (\n <span className=\"text-[var(--kyro-error)] ml-1\">*</span>\n )}\n </label>\n )}\n <div className=\"h-[200px] rounded-lg border border-[var(--kyro-border)] animate-pulse bg-[var(--kyro-bg-secondary)]\" />\n </div>\n );\n }\n\n return (\n <div className=\"space-y-1.5\">\n {field.label && (\n <label className=\"block text-sm font-medium text-[var(--kyro-text-primary)]\">\n {field.label}\n {field.required && (\n <span className=\"text-[var(--kyro-error)] ml-1\">*</span>\n )}\n </label>\n )}\n <div\n className={`border border-[var(--kyro-border)] rounded-lg overflow-hidden ${disabled ? \"opacity-50 cursor-not-allowed\" : \"\"}`}\n >\n <Suspense\n fallback={\n <div className=\"h-[200px] flex items-center justify-center bg-[var(--kyro-bg-secondary)]\">\n <span className=\"text-sm text-[var(--kyro-text-muted)]\">\n Loading editor...\n </span>\n </div>\n }\n >\n <EditorLazy\n key={editorKey}\n initialValue={ptValue}\n onChange={handleChange}\n disabled={disabled}\n />\n </Suspense>\n </div>\n {field.admin?.description && !error && (\n <p className=\"text-xs text-[var(--kyro-text-muted)]\">\n {field.admin.description}\n </p>\n )}\n {error && <p className=\"text-xs text-[var(--kyro-error)]\">{error}</p>}\n </div>\n );\n};\n\nexport default PortableTextField;\n","import React from \"react\";\nimport { PortableText } from \"@portabletext/react\";\nimport type { PortableTextComponents } from \"@portabletext/react\";\n\ninterface PortableTextRendererProps {\n value: unknown[];\n className?: string;\n}\n\nconst components: PortableTextComponents = {\n block: {\n h1: ({ children }) => (\n <h1 className=\"text-2xl font-bold mb-2\">{children}</h1>\n ),\n h2: ({ children }) => (\n <h2 className=\"text-xl font-bold mb-2\">{children}</h2>\n ),\n h3: ({ children }) => (\n <h3 className=\"text-lg font-semibold mb-2\">{children}</h3>\n ),\n blockquote: ({ children }) => (\n <blockquote className=\"border-l-4 border-gray-300 pl-4 italic my-2\">\n {children}\n </blockquote>\n ),\n normal: ({ children }) => <p className=\"my-1\">{children}</p>,\n },\n marks: {\n strong: ({ children }) => <strong>{children}</strong>,\n em: ({ children }) => <em>{children}</em>,\n code: ({ children }) => (\n <code className=\"bg-gray-100 px-1 rounded text-sm font-mono\">\n {children}\n </code>\n ),\n underline: ({ children }) => <u>{children}</u>,\n strikeThrough: ({ children }) => <s>{children}</s>,\n },\n list: {\n bullet: ({ children }) => (\n <ul className=\"list-disc ml-4 my-2\">{children}</ul>\n ),\n number: ({ children }) => (\n <ol className=\"list-decimal ml-4 my-2\">{children}</ol>\n ),\n },\n listItem: {\n bullet: ({ children }) => <li className=\"my-1\">{children}</li>,\n number: ({ children }) => <li className=\"my-1\">{children}</li>,\n },\n};\n\nexport const PortableTextRenderer: React.FC<PortableTextRendererProps> = ({\n value,\n className = \"\",\n}) => {\n if (!value || !Array.isArray(value) || value.length === 0) {\n return null;\n }\n\n return (\n <div className={className}>\n <PortableText value={value} components={components} />\n </div>\n );\n};\n\nexport default PortableTextRenderer;\n","import React, { useCallback, useEffect, useState, Suspense, lazy } from \"react\";\nimport { githubLight } from \"@uiw/codemirror-theme-github\";\nimport { aura } from \"@uiw/codemirror-theme-aura\";\nimport type { CodeField as CodeFieldType } from \"@kyro-cms/core/client\";\nimport { useTheme } from \"../ThemeProvider\";\n\ninterface CodeFieldProps {\n field: CodeFieldType;\n value?: string;\n onChange?: (value: string) => void;\n error?: string;\n disabled?: boolean;\n}\n\nconst CodeMirrorEditor = lazy(() =>\n import(\"@uiw/react-codemirror\").then((mod) => ({ default: mod.default })),\n);\n\nconst LANGUAGES = [\n { value: \"javascript\", label: \"JavaScript\" },\n { value: \"typescript\", label: \"TypeScript\" },\n { value: \"json\", label: \"JSON\" },\n { value: \"html\", label: \"HTML\" },\n { value: \"css\", label: \"CSS\" },\n { value: \"sql\", label: \"SQL\" },\n { value: \"python\", label: \"Python\" },\n { value: \"rust\", label: \"Rust\" },\n { value: \"java\", label: \"Java\" },\n { value: \"php\", label: \"PHP\" },\n { value: \"markdown\", label: \"Markdown\" },\n];\n\nconst languageExtensions: Record<string, () => Promise<unknown>> = {\n javascript: () =>\n import(\"@codemirror/lang-javascript\").then((m) =>\n m.javascript({ jsx: true, typescript: true }),\n ),\n typescript: () =>\n import(\"@codemirror/lang-javascript\").then((m) =>\n m.javascript({ jsx: true, typescript: true }),\n ),\n js: () =>\n import(\"@codemirror/lang-javascript\").then((m) =>\n m.javascript({ jsx: true }),\n ),\n jsx: () =>\n import(\"@codemirror/lang-javascript\").then((m) =>\n m.javascript({ jsx: true }),\n ),\n ts: () =>\n import(\"@codemirror/lang-javascript\").then((m) =>\n m.javascript({ typescript: true }),\n ),\n json: () => import(\"@codemirror/lang-json\").then((m) => m.json()),\n css: () => import(\"@codemirror/lang-css\").then((m) => m.css()),\n sql: () => import(\"@codemirror/lang-sql\").then((m) => m.sql()),\n python: () => import(\"@codemirror/lang-python\").then((m) => m.python()),\n html: () => import(\"@codemirror/lang-html\").then((m) => m.html()),\n rust: () => import(\"@codemirror/lang-rust\").then((m) => m.rust()),\n java: () => import(\"@codemirror/lang-java\").then((m) => m.java()),\n cpp: () => import(\"@codemirror/lang-cpp\").then((m) => m.cpp()),\n c: () => import(\"@codemirror/lang-cpp\").then((m) => m.cpp()),\n php: () => import(\"@codemirror/lang-php\").then((m) => m.php()),\n markdown: () => import(\"@codemirror/lang-markdown\").then((m) => m.markdown()),\n py: () => import(\"@codemirror/lang-python\").then((m) => m.python()),\n};\n\nexport const CodeField: React.FC<CodeFieldProps> = ({\n field,\n value = \"\",\n onChange,\n error,\n disabled,\n}) => {\n const [isMounted, setIsMounted] = useState(false);\n const [isDark, setIsDark] = useState(false);\n const [extensions, setExtensions] = useState<unknown[]>([]);\n const [loading, setLoading] = useState(false);\n const [copied, setCopied] = useState(false);\n const [isFullScreen, setIsFullScreen] = useState(false);\n\n const { theme } = useTheme();\n const accent = theme.colors?.accent || theme.colors?.primary || \"#6366f1\";\n const language = field.language?.toLowerCase() || \"javascript\";\n\n useEffect(() => {\n setIsMounted(true);\n setIsDark(document.documentElement.classList.contains(\"dark\"));\n const observer = new MutationObserver(() => {\n setIsDark(document.documentElement.classList.contains(\"dark\"));\n });\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [\"class\"],\n });\n return () => observer.disconnect();\n }, []);\n\n useEffect(() => {\n if (!isMounted) return;\n const loadExtensions = async () => {\n setLoading(true);\n try {\n const loader =\n languageExtensions[language] || languageExtensions.javascript;\n const ext = await loader();\n setExtensions([ext]);\n } catch (err) {\n console.error(\"Failed to load language extension:\", err);\n setExtensions([]);\n } finally {\n setLoading(false);\n }\n };\n loadExtensions();\n }, [language, isMounted]);\n\n const handleChange = useCallback(\n (val: string) => onChange?.(val),\n [onChange],\n );\n\n const handleCopy = useCallback(() => {\n navigator.clipboard.writeText(value);\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n }, [value]);\n\n const toggleFullScreen = useCallback(() => {\n setIsFullScreen((prev) => !prev);\n document.body.style.overflow = !isFullScreen ? \"hidden\" : \"\";\n }, [isFullScreen]);\n\n const codeMirrorTheme = isDark ? aura : githubLight;\n const langLabel =\n LANGUAGES.find((l) => l.value === language)?.label || language;\n\n const hexToRgba = (hex: string, alpha: number = 1) => {\n const r = parseInt(hex.slice(1, 3), 16);\n const g = parseInt(hex.slice(3, 5), 16);\n const b = parseInt(hex.slice(5, 7), 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n };\n\n if (!isMounted) {\n return (\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-3\">\n <div className=\"h-5 w-24 rounded bg-[var(--kyro-surface-accent)] animate-pulse\" />\n <div className=\"h-5 w-16 rounded bg-[var(--kyro-surface-accent)] animate-pulse\" />\n </div>\n <div className=\"h-[280px] rounded-xl bg-[var(--kyro-surface-accent)] animate-pulse\" />\n </div>\n );\n }\n\n return (\n <div\n className=\"group\"\n style={\n {\n \"--accent\": accent,\n \"--accent-light\": hexToRgba(accent, 0.1),\n \"--accent-light-2\": hexToRgba(accent, 0.05),\n } as React.CSSProperties\n }\n >\n {/* Header */}\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-semibold text-[var(--kyro-text-primary)]\">\n {field.label || field.name}\n </span>\n <span\n className=\"text-[10px] px-1.5 py-0.5 rounded font-semibold transition-colors\"\n style={{\n backgroundColor: loading ? \"var(--kyro-surface-accent)\" : accent,\n color: loading ? \"var(--kyro-text-muted)\" : \"white\",\n }}\n >\n {loading ? \"...\" : langLabel}\n </span>\n </div>\n\n {/* Action buttons */}\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={handleCopy}\n className=\"text-[10px] px-2 py-0.5 rounded font-medium transition-all\"\n style={{\n backgroundColor: copied\n ? \"var(--kyro-success)\"\n : \"var(--kyro-surface-accent)\",\n color: copied ? \"white\" : \"var(--kyro-text-secondary)\",\n }}\n >\n {copied ? \"Copied\" : \"Copy\"}\n </button>\n <button\n type=\"button\"\n onClick={toggleFullScreen}\n className=\"text-[10px] px-2 py-0.5 rounded font-medium bg-[var(--kyro-surface-accent)] hover:bg-[var(--kyro-border)] transition-all\"\n style={{ color: \"var(--kyro-text-secondary)\" }}\n >\n {isFullScreen ? \"Exit\" : \"Expand\"}\n </button>\n </div>\n </div>\n\n {/* Editor container */}\n <div\n className={`relative rounded-md overflow-hidden transition-all duration-200 ${\n isFullScreen ? \"fixed inset-4 z-50\" : \"\"\n }`}\n style={{\n backgroundColor: \"var(--kyro-surface)\",\n borderColor: error ? \"var(--kyro-error)\" : \"var(--kyro-border)\",\n borderWidth: \"1px\",\n }}\n >\n {/* Top accent bar */}\n <div\n className=\"absolute top-0 left-0 right-0 h-0.5 transition-all duration-200\"\n style={{ backgroundColor: accent }}\n />\n\n <Suspense\n fallback={\n <div\n className=\"h-[280px] flex items-center justify-center\"\n style={{ backgroundColor: \"var(--kyro-surface)\" }}\n >\n <div\n className=\"w-6 h-6 rounded-full animate-spin\"\n style={{\n borderColor: \"var(--kyro-border)\",\n borderTopColor: accent,\n borderWidth: \"2px\",\n }}\n />\n </div>\n }\n >\n <CodeMirrorEditor\n value={value == null ? \"\" : value}\n height={isFullScreen ? \"calc(100vh - 100px)\" : \"280px\"}\n width=\"100%\"\n extensions={extensions}\n theme={codeMirrorTheme}\n onChange={handleChange}\n editable={!disabled}\n basicSetup={{\n lineNumbers: true,\n highlightActiveLine: true,\n bracketMatching: true,\n closeBrackets: true,\n autocompletion: true,\n foldGutter: true,\n }}\n style={{\n fontSize: \"13px\",\n fontFamily: \"'JetBrains Mono', 'Fira Code', monospace\",\n }}\n />\n </Suspense>\n\n {/* Error message */}\n {error && (\n <div\n className=\"absolute bottom-0 left-0 right-0 px-3 py-2 text-xs font-medium\"\n style={{\n backgroundColor: \"var(--kyro-danger-bg)\",\n color: \"var(--kyro-error)\",\n }}\n >\n {error}\n </div>\n )}\n </div>\n\n {/* Footer */}\n <div\n className=\"flex items-center justify-between mt-2 text-[10px]\"\n style={{ color: \"var(--kyro-text-muted)\" }}\n >\n <span>{value.split(\"\\n\").length} lines</span>\n <span style={{ color: accent }}>CodeMirror</span>\n </div>\n </div>\n );\n};\n\nexport default CodeField;\n","import React, {\n createContext,\n useContext,\n useState,\n useEffect,\n useCallback,\n type ReactNode,\n} from \"react\";\nimport type { KyroTheme } from \"./tokens.js\";\nimport { LIGHT_THEME, DARK_THEME, mergeThemes } from \"./tokens.js\";\n\nexport type ThemeMode = \"light\" | \"dark\" | \"system\";\n\ninterface ThemeContextValue {\n mode: ThemeMode;\n theme: KyroTheme;\n lightTheme: KyroTheme;\n darkTheme: KyroTheme;\n setMode: (mode: ThemeMode) => void;\n updateTheme: (overrides: Partial<KyroTheme>) => void;\n getCssVar: (key: string) => string;\n}\n\nconst ThemeContext = createContext<ThemeContextValue | null>(null);\n\nexport function useTheme() {\n const context = useContext(ThemeContext);\n if (!context) {\n return {\n mode: \"light\" as ThemeMode,\n theme: LIGHT_THEME,\n lightTheme: LIGHT_THEME,\n darkTheme: DARK_THEME,\n setMode: () => {},\n updateTheme: () => {},\n getCssVar: (key: string) => `var(--kyro-${key})`,\n };\n }\n return context;\n}\n\ninterface ThemeProviderProps {\n children: ReactNode;\n defaultMode?: ThemeMode;\n light?: Partial<KyroTheme>;\n dark?: Partial<KyroTheme>;\n}\n\nfunction applyThemeToDOM(config: KyroTheme) {\n const root = document.documentElement;\n if (!root) return;\n\n // Apply colors\n if (config.colors) {\n Object.entries(config.colors).forEach(([key, value]) => {\n if (value) {\n root.style.setProperty(`--kyro-${key}`, value);\n root.style.setProperty(\n `--kyro-${key}-light`,\n adjustBrightness(value, 0.9),\n );\n root.style.setProperty(\n `--kyro-${key}-dark`,\n adjustBrightness(value, 0.8),\n );\n }\n });\n }\n\n // Apply typography\n if (config.typography) {\n if (config.typography.fontFamily) {\n root.style.setProperty(\n \"--kyro-font-family\",\n config.typography.fontFamily,\n );\n }\n if (config.typography.fontFamilyMono) {\n root.style.setProperty(\n \"--kyro-font-mono\",\n config.typography.fontFamilyMono,\n );\n }\n }\n\n // Apply spacing\n if (config.spacing) {\n Object.entries(config.spacing).forEach(([key, value]) => {\n if (value) root.style.setProperty(`--kyro-spacing-${key}`, value);\n });\n }\n\n // Apply border radius\n if (config.borderRadius) {\n Object.entries(config.borderRadius).forEach(([key, value]) => {\n if (value) root.style.setProperty(`--kyro-radius-${key}`, value);\n });\n }\n\n // Apply shadows\n if (config.shadows) {\n Object.entries(config.shadows).forEach(([key, value]) => {\n if (value) root.style.setProperty(`--kyro-shadow-${key}`, value);\n });\n }\n\n // Apply block theme overrides\n if (config.blocks) {\n if (config.blocks.card) {\n Object.entries(config.blocks.card).forEach(([key, value]) => {\n if (value) root.style.setProperty(`--kyro-block-card-${key}`, value);\n });\n }\n if (config.blocks.hero?.background) {\n root.style.setProperty(\n \"--kyro-block-hero-bg\",\n config.blocks.hero.background,\n );\n }\n if (config.blocks.code) {\n Object.entries(config.blocks.code).forEach(([key, value]) => {\n if (value) root.style.setProperty(`--kyro-block-code-${key}`, value);\n });\n }\n }\n\n // Apply field theme overrides\n if (config.fields) {\n if (config.fields.input) {\n Object.entries(config.fields.input).forEach(([key, value]) => {\n if (value) root.style.setProperty(`--kyro-field-input-${key}`, value);\n });\n }\n if (config.fields.upload) {\n if (config.fields.upload.dropzoneBackground) {\n root.style.setProperty(\n \"--kyro-field-upload-dropzone-bg\",\n config.fields.upload.dropzoneBackground,\n );\n }\n }\n }\n}\n\nfunction adjustBrightness(hex: string, factor: number): string {\n if (!hex.startsWith(\"#\")) return hex;\n const r = parseInt(hex.slice(1, 3), 16);\n const g = parseInt(hex.slice(3, 5), 16);\n const b = parseInt(hex.slice(5, 7), 16);\n const adjust = (c: number) =>\n Math.round(c * factor)\n .toString(16)\n .padStart(2, \"0\");\n return `#${adjust(r)}${adjust(g)}${adjust(b)}`;\n}\n\nexport function ThemeProvider({\n children,\n defaultMode = \"light\",\n light: lightOverrides,\n dark: darkOverrides,\n}: ThemeProviderProps) {\n const [mode, setMode] = useState<ThemeMode>(defaultMode);\n const [baseLight, setBaseLight] = useState<Partial<KyroTheme>>(\n lightOverrides || {},\n );\n const [baseDark, setBaseDark] = useState<Partial<KyroTheme>>(\n darkOverrides || {},\n );\n\n const lightTheme = mergeThemes(LIGHT_THEME, baseLight);\n const darkTheme = mergeThemes(DARK_THEME, baseDark);\n\n const getResolvedTheme = useCallback((): KyroTheme => {\n if (mode === \"system\") {\n if (typeof window !== \"undefined\") {\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches\n ? darkTheme\n : lightTheme;\n }\n return lightTheme;\n }\n return mode === \"dark\" ? darkTheme : lightTheme;\n }, [mode, lightTheme, darkTheme]);\n\n const [theme, setTheme] = useState<KyroTheme>(getResolvedTheme());\n\n // Apply theme on mode/customization change\n useEffect(() => {\n const resolved = getResolvedTheme();\n setTheme(resolved);\n applyThemeToDOM(resolved);\n }, [getResolvedTheme]);\n\n // Handle system theme changes\n useEffect(() => {\n if (mode !== \"system\") return;\n const mediaQuery = window.matchMedia(\"(prefers-color-scheme: dark)\");\n const handler = () => {\n const resolved = getResolvedTheme();\n setTheme(resolved);\n applyThemeToDOM(resolved);\n };\n mediaQuery.addEventListener(\"change\", handler);\n return () => mediaQuery.removeEventListener(\"change\", handler);\n }, [mode, getResolvedTheme]);\n\n const updateTheme = useCallback((overrides: Partial<KyroTheme>) => {\n setBaseLight((prev) => ({ ...prev, ...overrides }));\n setBaseDark((prev) => ({ ...prev, ...overrides }));\n }, []);\n\n const getCssVar = useCallback((key: string) => `var(--kyro-${key})`, []);\n\n return (\n <ThemeContext.Provider\n value={{\n mode,\n theme,\n lightTheme,\n darkTheme,\n setMode,\n updateTheme,\n getCssVar,\n }}\n >\n {children}\n </ThemeContext.Provider>\n );\n}\n\nexport const LightThemeProvider = (\n props: Omit<ThemeProviderProps, \"defaultMode\">,\n) => <ThemeProvider defaultMode=\"light\" {...props} />;\n\nexport const DarkThemeProvider = (\n props: Omit<ThemeProviderProps, \"defaultMode\">,\n) => <ThemeProvider defaultMode=\"dark\" {...props} />;\n","export interface ThemeColors {\n primary?: string;\n secondary?: string;\n accent?: string;\n background?: string;\n surface?: string;\n text?: string;\n textMuted?: string;\n border?: string;\n success?: string;\n error?: string;\n warning?: string;\n info?: string;\n}\n\nexport interface ThemeTypography {\n fontFamily?: string;\n fontFamilyMono?: string;\n fontSize?: {\n xs?: string;\n sm?: string;\n md?: string;\n lg?: string;\n xl?: string;\n \"2xl\"?: string;\n \"3xl\"?: string;\n \"4xl\"?: string;\n };\n fontWeight?: {\n normal?: number;\n medium?: number;\n semibold?: number;\n bold?: number;\n };\n}\n\nexport interface ThemeSpacing {\n xs?: string;\n sm?: string;\n md?: string;\n lg?: string;\n xl?: string;\n \"2xl\"?: string;\n}\n\nexport interface ThemeRadius {\n sm?: string;\n md?: string;\n lg?: string;\n full?: string;\n}\n\nexport interface ThemeShadows {\n sm?: string;\n md?: string;\n lg?: string;\n xl?: string;\n}\n\nexport interface BlockThemeOverrides {\n card?: {\n background?: string;\n borderRadius?: string;\n padding?: string;\n shadow?: string;\n };\n hero?: {\n background?: string;\n textAlign?: \"left\" | \"center\" | \"right\";\n };\n gallery?: {\n gridColumns?: number;\n gap?: string;\n };\n code?: {\n fontFamily?: string;\n fontSize?: string;\n background?: string;\n };\n}\n\nexport interface FieldThemeOverrides {\n input?: {\n background?: string;\n border?: string;\n borderRadius?: string;\n padding?: string;\n focusRing?: string;\n };\n select?: {\n background?: string;\n border?: string;\n };\n textarea?: {\n background?: string;\n minHeight?: string;\n };\n richText?: {\n toolbarBackground?: string;\n buttonActive?: string;\n };\n upload?: {\n dropzoneBackground?: string;\n dropzoneActive?: string;\n };\n}\n\nexport interface KyroTheme {\n id?: string;\n label?: string;\n colors?: ThemeColors;\n typography?: ThemeTypography;\n spacing?: ThemeSpacing;\n borderRadius?: ThemeRadius;\n shadows?: ThemeShadows;\n blocks?: BlockThemeOverrides;\n fields?: FieldThemeOverrides;\n}\n\nexport const LIGHT_THEME: KyroTheme = {\n id: \"light\",\n label: \"Light\",\n colors: {\n primary: \"#3b82f6\",\n secondary: \"#8b5cf6\",\n background: \"#f8fafc\",\n surface: \"#ffffff\",\n text: \"#0f172a\",\n textMuted: \"#64748b\",\n border: \"#e2e8f0\",\n success: \"#22c55e\",\n error: \"#ef4444\",\n warning: \"#f59e0b\",\n info: \"#06b6d4\",\n },\n typography: {\n fontFamily: \"'Inter', system-ui, -apple-system, sans-serif\",\n fontFamilyMono: \"'Fira Code', 'Cascadia Code', monospace\",\n },\n spacing: {\n xs: \"0.25rem\",\n sm: \"0.5rem\",\n md: \"1rem\",\n lg: \"1.5rem\",\n xl: \"2rem\",\n \"2xl\": \"3rem\",\n },\n borderRadius: {\n sm: \"0.25rem\",\n md: \"0.5rem\",\n lg: \"0.75rem\",\n full: \"9999px\",\n },\n shadows: {\n sm: \"0 1px 2px rgba(0,0,0,0.05)\",\n md: \"0 4px 6px -1px rgba(0,0,0,0.1)\",\n lg: \"0 10px 15px -3px rgba(0,0,0,0.1)\",\n xl: \"0 20px 25px -5px rgba(0,0,0,0.1)\",\n },\n};\n\nexport const DARK_THEME: KyroTheme = {\n id: \"dark\",\n label: \"Dark\",\n colors: {\n primary: \"#60a5fa\",\n secondary: \"#a78bfa\",\n background: \"#0b1222\",\n surface: \"#1e293b\",\n text: \"#f1f5f9\",\n textMuted: \"#94a3b8\",\n border: \"#334155\",\n success: \"#4ade80\",\n error: \"#f87171\",\n warning: \"#fbbf24\",\n info: \"#22d3ee\",\n },\n typography: {\n fontFamily: \"'Inter', system-ui, -apple-system, sans-serif\",\n fontFamilyMono: \"'Fira Code', 'Cascadia Code', monospace\",\n },\n spacing: {\n xs: \"0.25rem\",\n sm: \"0.5rem\",\n md: \"1rem\",\n lg: \"1.5rem\",\n xl: \"2rem\",\n \"2xl\": \"3rem\",\n },\n borderRadius: {\n sm: \"0.25rem\",\n md: \"0.5rem\",\n lg: \"0.75rem\",\n full: \"9999px\",\n },\n shadows: {\n sm: \"0 1px 2px rgba(0,0,0,0.3)\",\n md: \"0 4px 6px -1px rgba(0,0,0,0.4)\",\n lg: \"0 10px 15px -3px rgba(0,0,0,0.4)\",\n xl: \"0 20px 25px -5px rgba(0,0,0,0.5)\",\n },\n};\n\nexport function mergeThemes(\n base: KyroTheme,\n overrides: Partial<KyroTheme>,\n): KyroTheme {\n return {\n ...base,\n ...overrides,\n colors: { ...base.colors, ...overrides.colors },\n typography: { ...base.typography, ...overrides.typography },\n spacing: { ...base.spacing, ...overrides.spacing },\n borderRadius: { ...base.borderRadius, ...overrides.borderRadius },\n shadows: { ...base.shadows, ...overrides.shadows },\n blocks: base.blocks\n ? { ...base.blocks, ...overrides.blocks }\n : overrides.blocks,\n fields: base.fields\n ? { ...base.fields, ...overrides.fields }\n : overrides.fields,\n };\n}\n","import React, { useState, useCallback, useMemo, useEffect } from \"react\";\nimport type { JSONField as JSONFieldType } from \"@kyro-cms/core/client\";\n\ninterface JSONFieldProps {\n field: JSONFieldType;\n value?: unknown;\n onChange?: (value: unknown) => void;\n error?: string;\n disabled?: boolean;\n}\n\ninterface TreeNode {\n key: string;\n value: unknown;\n type: \"object\" | \"array\" | \"string\" | \"number\" | \"boolean\" | \"null\";\n path: string[];\n collapsed?: boolean;\n}\n\nexport const JSONField: React.FC<JSONFieldProps> = ({\n field,\n value,\n onChange,\n error,\n disabled,\n}) => {\n const [textValue, setTextValue] = useState<string>(() => {\n if (typeof value === \"string\") return value;\n return JSON.stringify(value || {}, null, 2);\n });\n const [parseError, setParseError] = useState<string | null>(null);\n const [viewMode, setViewMode] = useState<\"text\" | \"tree\">(\"text\");\n const [isMounted, setIsMounted] = useState(false);\n\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n const handleTextChange = useCallback(\n (text: string) => {\n setTextValue(text);\n try {\n const parsed = JSON.parse(text);\n setParseError(null);\n onChange?.(parsed);\n } catch (e) {\n if (text.trim()) {\n setParseError((e as Error).message);\n }\n }\n },\n [onChange],\n );\n\n const formatJSON = useCallback(() => {\n try {\n const parsed = JSON.parse(textValue);\n const formatted = JSON.stringify(parsed, null, 2);\n setTextValue(formatted);\n onChange?.(parsed);\n setParseError(null);\n } catch (e) {\n setParseError((e as Error).message);\n }\n }, [textValue, onChange]);\n\n const minifyJSON = useCallback(() => {\n try {\n const parsed = JSON.parse(textValue);\n const minified = JSON.stringify(parsed);\n setTextValue(minified);\n onChange?.(parsed);\n setParseError(null);\n } catch (e) {\n setParseError((e as Error).message);\n }\n }, [textValue, onChange]);\n\n const treeData = useMemo(() => {\n try {\n const parsed = JSON.parse(textValue);\n return buildTree(parsed, []);\n } catch {\n return null;\n }\n }, [textValue]);\n\n if (!isMounted) {\n return (\n <div className=\"kyro-form-field\">\n <label className=\"kyro-form-label\">\n {field.label || field.name}\n {field.required && (\n <span className=\"kyro-form-label-required\">*</span>\n )}\n </label>\n <div className=\"h-[200px] bg-[var(--kyro-surface)] animate-pulse rounded-md border border-[var(--kyro-border)]\" />\n </div>\n );\n }\n\n return (\n <div className=\"kyro-form-field\">\n <div className=\"flex items-center justify-between mb-2\">\n <label className=\"kyro-form-label\">\n {field.label || field.name}\n {field.required && (\n <span className=\"kyro-form-label-required\">*</span>\n )}\n </label>\n <div className=\"flex items-center gap-2\">\n {/* View mode toggle */}\n <div className=\"flex rounded-md overflow-hidden border border-[var(--kyro-border)]\">\n <button\n type=\"button\"\n onClick={() => setViewMode(\"text\")}\n className={`px-3 py-1 text-xs font-medium transition-colors ${\n viewMode === \"text\"\n ? \"bg-[var(--kyro-sidebar-active)] text-[var(--kyro-sidebar-text-active)]\"\n : \"bg-[var(--kyro-surface)] text-[var(--kyro-text-secondary)] hover:bg-[var(--kyro-surface-accent)]\"\n }`}\n >\n Text\n </button>\n <button\n type=\"button\"\n onClick={() => setViewMode(\"tree\")}\n className={`px-3 py-1 text-xs font-medium transition-colors ${\n viewMode === \"tree\"\n ? \"bg-[var(--kyro-sidebar-active)] text-[var(--kyro-sidebar-text-active)]\"\n : \"bg-[var(--kyro-surface)] text-[var(--kyro-text-secondary)] hover:bg-[var(--kyro-surface-accent)]\"\n }`}\n >\n Tree\n </button>\n </div>\n </div>\n </div>\n\n {/* Action buttons */}\n <div className=\"flex items-center gap-2 mb-2\">\n <button\n type=\"button\"\n onClick={formatJSON}\n className=\"px-3 py-1.5 text-xs font-medium bg-[var(--kyro-surface-accent)] text-[var(--kyro-text-secondary)] rounded-md hover:bg-[var(--kyro-surface)] hover:text-[var(--kyro-text-primary)] transition-colors\"\n >\n Format\n </button>\n <button\n type=\"button\"\n onClick={minifyJSON}\n className=\"px-3 py-1.5 text-xs font-medium bg-[var(--kyro-surface-accent)] text-[var(--kyro-text-secondary)] rounded-md hover:bg-[var(--kyro-surface)] hover:text-[var(--kyro-text-primary)] transition-colors\"\n >\n Minify\n </button>\n <button\n type=\"button\"\n onClick={() => {\n navigator.clipboard.writeText(textValue);\n }}\n className=\"px-3 py-1.5 text-xs font-medium bg-[var(--kyro-surface-accent)] text-[var(--kyro-text-secondary)] rounded-md hover:bg-[var(--kyro-surface)] hover:text-[var(--kyro-text-primary)] transition-colors\"\n >\n Copy\n </button>\n {parseError && (\n <span className=\"text-xs text-[var(--kyro-error)] ml-auto\">\n {parseError}\n </span>\n )}\n </div>\n\n {/* Editor area */}\n <div\n className={`border border-[var(--kyro-border)] rounded-md overflow-hidden ${\n disabled ? \"opacity-50 cursor-not-allowed\" : \"\"\n } ${error || parseError ? \"border-[var(--kyro-error)]\" : \"\"}`}\n >\n {viewMode === \"text\" ? (\n <textarea\n value={textValue}\n onChange={(e) => handleTextChange(e.target.value)}\n disabled={disabled}\n rows={8}\n className={`w-full p-4 font-mono text-sm resize-y focus:outline-none bg-[var(--kyro-surface)] text-[var(--kyro-text-primary)]`}\n placeholder='{\"key\": \"value\"}'\n />\n ) : (\n <div\n className={`p-4 max-h-[400px] overflow-auto bg-[var(--kyro-surface)] text-[var(--kyro-text-primary)]`}\n >\n {treeData ? (\n <TreeView data={treeData} />\n ) : (\n <p className=\"text-sm text-[var(--kyro-text-muted)] italic\">\n Invalid JSON - switch to Text view to fix\n </p>\n )}\n </div>\n )}\n </div>\n\n {field.admin?.description && !error && !parseError && (\n <p className=\"kyro-form-help\">{field.admin.description}</p>\n )}\n {(error || parseError) && (\n <p className=\"kyro-form-error\">{error || parseError}</p>\n )}\n </div>\n );\n};\n\n// Tree view component\nconst TreeView: React.FC<{ data: TreeNode }> = ({ data }) => {\n const [collapsed, setCollapsed] = useState(false);\n\n const renderValue = (node: TreeNode) => {\n if (node.type === \"object\") {\n const entries = Object.entries(node.value);\n return (\n <div className=\"pl-4 border-l border-[var(--kyro-border)]\">\n {entries.map(([key, val]) => (\n <TreeNodeView\n key={key}\n name={key}\n value={val}\n path={[...node.path, key]}\n />\n ))}\n </div>\n );\n }\n if (node.type === \"array\") {\n return (\n <div className=\"pl-4 border-l border-[var(--kyro-border)]\">\n {node.value.map((item: unknown, index: number) => (\n <TreeNodeView\n key={index}\n name={String(index)}\n value={item}\n path={[...node.path, String(index)]}\n />\n ))}\n </div>\n );\n }\n return null;\n };\n\n const getTypeColor = (type: string) => {\n switch (type) {\n case \"string\":\n return \"text-green-600\";\n case \"number\":\n return \"text-blue-600\";\n case \"boolean\":\n return \"text-purple-600\";\n case \"null\":\n return \"text-gray-500\";\n default:\n return \"text-[var(--kyro-text-primary)]\";\n }\n };\n\n const getValueDisplay = (item: TreeNode) => {\n if (item.type === \"string\") return `\"${item.value}\"`;\n if (item.type === \"null\") return \"null\";\n return String(item.value);\n };\n\n const getPreview = (item: TreeNode) => {\n if (item.type === \"object\") {\n const keys = Object.keys(item.value);\n return `{${keys.length} ${keys.length === 1 ? \"key\" : \"keys\"}}`;\n }\n if (item.type === \"array\") {\n return `[${item.value.length} ${item.value.length === 1 ? \"item\" : \"items\"}]`;\n }\n return null;\n };\n\n const isExpandable = data.type === \"object\" || data.type === \"array\";\n\n return (\n <div className=\"py-0.5\">\n <div\n className=\"flex items-center gap-2 cursor-pointer hover:bg-[var(--kyro-surface-accent)] rounded px-1 -ml-1\"\n onClick={() => isExpandable && setCollapsed(!collapsed)}\n >\n {isExpandable && (\n <span className=\"text-[var(--kyro-text-muted)] text-xs\">\n {collapsed ? \"▶\" : \"▼\"}\n </span>\n )}\n <span className=\"font-medium text-[var(--kyro-text-primary)]\">\n {data.key}\n </span>\n <span className=\"text-[var(--kyro-text-muted)]\">:</span>\n {isExpandable ? (\n <span className=\"text-xs text-[var(--kyro-text-muted)]\">\n {collapsed ? getPreview(data) : data.type === \"object\" ? \"{\" : \"[\"}\n </span>\n ) : (\n <span className={`font-mono text-sm ${getTypeColor(data.type)}`}>\n {getValueDisplay(data)}\n </span>\n )}\n </div>\n {!collapsed && isExpandable && renderValue(data)}\n {collapsed && isExpandable && (\n <span className=\"text-[var(--kyro-text-muted)] ml-6 text-xs\">\n {data.type === \"object\" ? \"}\" : \"]\"}\n </span>\n )}\n </div>\n );\n};\n\nconst TreeNodeView: React.FC<{ name: string; value: unknown; path: string[] }> = ({\n name,\n value,\n path,\n}) => {\n const type = getType(value);\n const treeNode: TreeNode = { key: name, value, type, path };\n return <TreeView data={treeNode} />;\n};\n\nfunction getType(value: unknown): TreeNode[\"type\"] {\n if (value === null) return \"null\";\n if (Array.isArray(value)) return \"array\";\n return typeof value as TreeNode[\"type\"];\n}\n\nfunction buildTree(value: unknown, path: string[]): TreeNode {\n return {\n key: path[path.length - 1] || \"root\",\n value,\n type: getType(value),\n path,\n };\n}\n","import React, { useState, useCallback, useMemo, useEffect } from \"react\";\nimport type { MarkdownField as MarkdownFieldType } from \"@kyro-cms/core/client\";\n\ninterface MarkdownFieldProps {\n field: MarkdownFieldType;\n value?: string;\n onChange?: (value: string) => void;\n error?: string;\n disabled?: boolean;\n}\n\n// Simple markdown parser for basic formatting\nfunction parseMarkdown(text: string): string {\n if (!text) return \"\";\n\n let html = text\n // Escape HTML\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n\n // Code blocks\n .replace(\n /```(\\w+)?\\n([\\s\\S]*?)```/g,\n '<pre class=\"bg-gray-100 dark:bg-gray-800 p-3 rounded overflow-x-auto my-2\"><code>$2</code></pre>',\n )\n\n // Inline code\n .replace(\n /`([^`]+)`/g,\n '<code class=\"bg-gray-100 dark:bg-gray-800 px-1 rounded text-sm font-mono\">$1</code>',\n )\n\n // Headers\n .replace(\n /^### (.+)$/gm,\n '<h3 class=\"text-lg font-semibold mt-4 mb-2\">$1</h3>',\n )\n .replace(\n /^## (.+)$/gm,\n '<h2 class=\"text-xl font-semibold mt-4 mb-2\">$1</h2>',\n )\n .replace(/^# (.+)$/gm, '<h1 class=\"text-2xl font-bold mt-4 mb-2\">$1</h1>')\n\n // Bold and Italic\n .replace(/\\*\\*\\*(.+?)\\*\\*\\*/g, \"<strong><em>$1</em></strong>\")\n .replace(/\\*\\*(.+?)\\*\\*/g, \"<strong>$1</strong>\")\n .replace(/\\*(.+?)\\*/g, \"<em>$1</em>\")\n .replace(/___(.+?)___/g, \"<strong><em>$1</em></strong>\")\n .replace(/__(.+?)__/g, \"<strong>$1</strong>\")\n .replace(/_(.+?)_/g, \"<em>$1</em>\")\n\n // Strikethrough\n .replace(/~~(.+?)~~/g, \"<del>$1</del>\")\n\n // Blockquotes\n .replace(\n /^> (.+)$/gm,\n '<blockquote class=\"border-l-4 border-gray-300 dark:border-gray-600 pl-4 italic my-2 text-gray-600 dark:text-gray-400\">$1</blockquote>',\n )\n\n // Links\n .replace(\n /\\[([^\\]]+)\\]\\(([^)]+)\\)/g,\n '<a href=\"$2\" class=\"text-blue-600 hover:underline\" target=\"_blank\" rel=\"noopener noreferrer\">$1</a>',\n )\n\n // Images\n .replace(\n /!\\[([^\\]]*)\\]\\(([^)]+)\\)/g,\n '<img src=\"$2\" alt=\"$1\" class=\"max-w-full h-auto rounded my-2\" />',\n )\n\n // Horizontal rules\n .replace(\n /^---$/gm,\n '<hr class=\"border-gray-300 dark:border-gray-600 my-4\" />',\n )\n .replace(\n /^\\*\\*\\*$/gm,\n '<hr class=\"border-gray-300 dark:border-gray-600 my-4\" />',\n )\n\n // Unordered lists\n .replace(/^[\\*\\-] (.+)$/gm, '<li class=\"ml-4\">$1</li>')\n\n // Ordered lists\n .replace(/^\\d+\\. (.+)$/gm, '<li class=\"ml-4 list-decimal\">$1</li>')\n\n // Paragraphs (lines that don't start with special chars)\n .replace(/^(?!<[a-z]|$)(.+)$/gm, '<p class=\"my-2\">$1</p>')\n\n // Clean up empty paragraphs\n .replace(/<p class=\"my-2\"><\\/p>/g, \"\")\n\n // Wrap consecutive list items in ul/ol\n .replace(\n /(<li class=\"ml-4\">.*<\\/li>\\n?)+/g,\n '<ul class=\"list-disc pl-6 my-2\">$&</ul>',\n );\n\n return html;\n}\n\nexport const MarkdownField: React.FC<MarkdownFieldProps> = ({\n field,\n value = \"\",\n onChange,\n error,\n disabled,\n}) => {\n const [showPreview, setShowPreview] = useState(false);\n const [isMounted, setIsMounted] = useState(false);\n\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n onChange?.(e.target.value);\n },\n [onChange],\n );\n\n const wordCount = useMemo(() => {\n if (!value) return 0;\n return value.trim().split(/\\s+/).filter(Boolean).length;\n }, [value]);\n\n const characterCount = value?.length || 0;\n\n if (!isMounted) {\n return (\n <div className=\"kyro-form-field\">\n <label className=\"kyro-form-label\">\n {field.label || field.name}\n {field.required && (\n <span className=\"kyro-form-label-required\">*</span>\n )}\n </label>\n <div className=\"h-[200px] bg-[var(--kyro-surface)] animate-pulse rounded-md border border-[var(--kyro-border)]\" />\n </div>\n );\n }\n\n return (\n <div\n className=\"kyro-form-field\"\n style={{ position: \"relative\", zIndex: 10, pointerEvents: \"auto\" }}\n >\n <div className=\"flex items-center justify-between mb-2\">\n <label className=\"kyro-form-label\">\n {field.label || field.name}\n {field.required && (\n <span className=\"kyro-form-label-required\">*</span>\n )}\n </label>\n <div className=\"flex items-center gap-3\">\n {/* Stats */}\n <span className=\"text-xs text-[var(--kyro-text-muted)]\">\n {wordCount} words • {characterCount} chars\n </span>\n\n {/* Preview toggle */}\n <div className=\"flex rounded-md overflow-hidden border border-[var(--kyro-border)]\">\n <button\n type=\"button\"\n onClick={() => setShowPreview(false)}\n className={`px-3 py-1 text-xs font-medium transition-colors ${\n !showPreview\n ? \"bg-[var(--kyro-sidebar-active)] text-[var(--kyro-sidebar-text-active)]\"\n : \"bg-[var(--kyro-surface)] text-[var(--kyro-text-secondary)] hover:bg-[var(--kyro-surface-accent)]\"\n }`}\n >\n Write\n </button>\n <button\n type=\"button\"\n onClick={() => setShowPreview(true)}\n className={`px-3 py-1 text-xs font-medium transition-colors ${\n showPreview\n ? \"bg-[var(--kyro-sidebar-active)] text-[var(--kyro-sidebar-text-active)]\"\n : \"bg-[var(--kyro-surface)] text-[var(--kyro-text-secondary)] hover:bg-[var(--kyro-surface-accent)]\"\n }`}\n >\n Preview\n </button>\n </div>\n </div>\n </div>\n\n <div\n style={{ pointerEvents: \"auto\", position: \"relative\", zIndex: 50 }}\n className={`border border-[var(--kyro-border)] rounded-md overflow-hidden ${\n disabled ? \"opacity-50 cursor-not-allowed\" : \"\"\n } ${error ? \"border-[var(--kyro-error)]\" : \"\"}`}\n >\n {!showPreview ? (\n <textarea\n value={value == null ? \"\" : value}\n onChange={handleChange}\n disabled={disabled}\n rows={12}\n style={{ pointerEvents: \"auto\", cursor: \"text\", zIndex: 100 }}\n className={`w-full p-4 font-mono text-sm resize-y focus:outline-none bg-[var(--kyro-surface)] text-[var(--kyro-text-primary)]`}\n placeholder=\"Enter markdown content...\n\n# Heading 1\n## Heading 2\n\n**Bold text** and *italic text*\n\n- List item 1\n- List item 2\n\n[Link text](https://example.com)\n\n`inline code`\n\n```\ncode block\n```\"\n />\n ) : (\n <div\n className={`p-6 min-h-[300px] overflow-auto bg-[var(--kyro-surface)] text-[var(--kyro-text-primary)]`}\n >\n {value ? (\n <div\n className=\"prose prose-sm dark:prose-invert max-w-none\"\n dangerouslySetInnerHTML={{ __html: parseMarkdown(value) }}\n />\n ) : (\n <p className=\"text-[var(--kyro-text-muted)] italic\">\n Nothing to preview\n </p>\n )}\n </div>\n )}\n </div>\n\n {/* Toolbar with markdown hints */}\n {!showPreview && (\n <div className=\"flex items-center gap-4 mt-2 text-xs text-[var(--kyro-text-muted)]\">\n <span>**bold**</span>\n <span>*italic*</span>\n <span>`code`</span>\n <span>[link](url)</span>\n <span># heading</span>\n </div>\n )}\n\n {field.admin?.description && !error && (\n <p className=\"kyro-form-help\">{field.admin.description}</p>\n )}\n {error && <p className=\"kyro-form-error\">{error}</p>}\n </div>\n );\n};\n","import React from \"react\";\nimport type { Field } from \"@kyro-cms/core/client\";\n\ninterface FieldLayoutProps {\n field: Field;\n error?: string;\n children: React.ReactNode;\n hideLabel?: boolean;\n}\n\nexport default function FieldLayout({\n field,\n error,\n children,\n hideLabel = false,\n}: FieldLayoutProps) {\n return (\n <div className=\"space-y-2.5 w-full group\">\n {field.label && !hideLabel && (\n <div className=\"flex justify-between items-end mb-1\">\n <label className=\"block text-xs font-bold tracking-widest text-[var(--kyro-text-secondary)] opacity-50 group-focus-within:opacity-100 group-focus-within:text-[var(--kyro-primary)] transition-all duration-300\">\n {field.label}\n {field.required && (\n <span className=\"text-[var(--kyro-error)] ml-1\">*</span>\n )}\n </label>\n </div>\n )}\n\n <div className=\"relative transform transition-transform duration-200 focus-within:scale-[1.002]\">\n {children}\n </div>\n\n {(field.admin?.description || error) && (\n <div className=\"flex flex-col gap-1.5 px-1\">\n {field.admin?.description && !error && (\n <p className=\"text-[11px] leading-relaxed text-[var(--kyro-text-muted)] font-medium opacity-60 italic\">\n {field.admin.description}\n </p>\n )}\n {error && (\n <p className=\"text-[11px] leading-relaxed text-[var(--kyro-error)] font-bold flex items-center gap-2 animate-in fade-in slide-in-from-top-1 duration-300\">\n <span className=\"w-1.5 h-1.5 rounded-full bg-[var(--kyro-error)] shadow-[0_0_8px_var(--kyro-error)]\" />\n {error}\n </p>\n )}\n </div>\n )}\n </div>\n\n );\n}\n","import type { TextField as TextFieldType } from \"@kyro-cms/core/client\";\nimport FieldLayout from \"./FieldLayout\";\nimport { useAutoFormStore } from \"../../lib/autoform-store\";\nimport { slugifyText } from \"../../lib/slugify\";\n\ninterface TextFieldComponentProps {\n field: TextFieldType;\n value?: string | null;\n onChange?: (value: string) => void;\n error?: string;\n disabled?: boolean;\n}\n\nexport default function TextField({\n field,\n value,\n onChange,\n error,\n disabled,\n}: TextFieldComponentProps) {\n const isReadOnly = field.admin?.readOnly;\n const isTextarea = (field as TextFieldType).variant === \"textarea\";\n const isSlug = field.name === \"slug\";\n\n const { isSlugLocked, setIsSlugLocked, formData } = useAutoFormStore();\n\n const inputType =\n field.variant === \"email\"\n ? \"email\"\n : field.variant === \"password\"\n ? \"password\"\n : field.variant === \"url\"\n ? \"url\"\n : \"text\";\n\n const normalizedValue = value == null ? \"\" : String(value);\n\n const commonProps = {\n id: field.name,\n value: normalizedValue,\n onChange: (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => onChange?.(e.target.value),\n placeholder: field.admin?.placeholder,\n disabled: disabled || isReadOnly || (isSlug && isSlugLocked),\n minLength: field.minLength,\n maxLength: field.maxLength,\n required: field.required,\n className: `kyro-form-input ${isSlug ? \"pr-24\" : \"\"\n } ${disabled || isReadOnly || (isSlug && isSlugLocked) ? \"opacity-70 bg-[var(--kyro-bg-secondary)] cursor-not-allowed\" : \"\"}`,\n };\n\n return (\n <FieldLayout field={field} error={error}>\n <div className=\"relative\">\n {isTextarea ? (\n <textarea {...commonProps} rows={(field as TextFieldType).rows || 4} />\n ) : (\n <input type={inputType} {...commonProps} pattern={field.pattern} />\n )}\n\n {isSlug && (\n <div className=\"absolute right-2 top-1/2 -translate-y-1/2 flex items-center gap-1\">\n {!isSlugLocked && (\n <button\n type=\"button\"\n onClick={() =>\n onChange?.(\n slugifyText(\n formData[field.admin?.autoGenerate || \"title\"] || \"\",\n ),\n )\n }\n className=\"p-1 text-[var(--kyro-text-secondary)] hover:text-[var(--kyro-primary)]\"\n title=\"Regenerate slug\"\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\">\n <path d=\"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8\" />\n <path d=\"M21 3v5h-5\" />\n </svg>\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => setIsSlugLocked(!isSlugLocked)}\n className={`p-1.5 rounded transition-colors ${isSlugLocked ? \"text-[var(--kyro-primary)] bg-[var(--kyro-primary-alpha)]\" : \"text-[var(--kyro-text-secondary)] hover:bg-[var(--kyro-surface-accent)]\"}`}\n title={isSlugLocked ? \"Unlock slug\" : \"Lock slug\"}\n >\n {isSlugLocked ? (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\">\n <rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\" />\n <path d=\"M7 11V7a5 5 0 0 1 10 0v4\" />\n </svg>\n ) : (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\">\n <rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\" />\n <path d=\"M7 11V7a5 5 0 0 1 9.9-1\" />\n </svg>\n )}\n </button>\n </div>\n )}\n\n {field.name?.toLowerCase().includes(\"metatitle\") && (\n <div className=\"flex items-center justify-between mt-1 text-[10px] font-bold tracking-wider\">\n <span className={(normalizedValue.length) > 60 ? \"text-red-500\" : normalizedValue.length >= 40 ? \"text-green-500\" : \"text-amber-600\"}>\n {normalizedValue.length} / 60 — {normalizedValue.length > 60 ? \"Too Long\" : normalizedValue.length >= 40 ? \"Ideal\" : \"Short\"}\n </span>\n </div>\n )}\n </div>\n </FieldLayout>\n );\n}\n","import type { NumberField as NumberFieldType } from \"@kyro-cms/core/client\";\nimport FieldLayout from \"./FieldLayout\";\n\ninterface NumberFieldComponentProps {\n field: NumberFieldType;\n value?: number;\n onChange?: (value: number) => void;\n error?: string;\n disabled?: boolean;\n}\n\nexport default function NumberField({\n field,\n value,\n onChange,\n error,\n disabled,\n}: NumberFieldComponentProps) {\n const isReadOnly = field.admin?.readOnly;\n\n return (\n <FieldLayout\n field={field}\n error={error}\n >\n <input\n type=\"number\"\n id={field.name}\n value={value ?? \"\"}\n onChange={(e) => onChange?.(parseFloat(e.target.value) || 0)}\n placeholder={field.admin?.placeholder}\n disabled={disabled || isReadOnly}\n min={field.min}\n max={field.max}\n step={field.step || (field.integer ? 1 : \"any\")}\n required={field.required}\n className={`kyro-form-input ${\n disabled || isReadOnly ? \"opacity-50 cursor-not-allowed\" : \"\"\n }`}\n />\n </FieldLayout>\n );\n}\n","import type { CheckboxField as CheckboxFieldType } from \"@kyro-cms/core/client\";\nimport FieldLayout from \"./FieldLayout\";\n\ninterface CheckboxFieldComponentProps {\n field: CheckboxFieldType;\n value?: boolean;\n onChange?: (value: boolean) => void;\n error?: string;\n disabled?: boolean;\n}\n\nexport default function CheckboxField({\n field,\n value = false,\n onChange,\n error,\n disabled,\n}: CheckboxFieldComponentProps) {\n const isReadOnly = field.admin?.readOnly;\n\n return (\n <FieldLayout\n field={field}\n error={error}\n hideLabel={true}\n >\n <label className=\"flex items-center gap-2.5 cursor-pointer group py-0.5\">\n <input\n type=\"checkbox\"\n checked={value}\n onChange={(e) => onChange?.(e.target.checked)}\n disabled={disabled || isReadOnly}\n className={`w-4 h-4 rounded border-[var(--kyro-border)] text-[var(--kyro-primary)] focus:ring-[var(--kyro-primary)] transition-all ${\n disabled || isReadOnly ? \"opacity-50 cursor-not-allowed\" : \"cursor-pointer\"\n }`}\n />\n <span className=\"text-sm font-semibold text-[var(--kyro-text-primary)] tracking-tight group-hover:text-[var(--kyro-primary)] transition-colors\">\n {field.label || field.name}\n {field.required && (\n <span className=\"text-[var(--kyro-error)] ml-1\">*</span>\n )}\n </span>\n </label>\n </FieldLayout>\n );\n}\n","import type { DateField as DateFieldType } from \"@kyro-cms/core/client\";\nimport FieldLayout from \"./FieldLayout\";\n\ninterface DateFieldComponentProps {\n field: DateFieldType;\n value?: string;\n onChange?: (value: string) => void;\n error?: string;\n disabled?: boolean;\n}\n\nexport default function DateField({\n field,\n value = \"\",\n onChange,\n error,\n disabled,\n}: DateFieldComponentProps) {\n const isReadOnly = field.admin?.readOnly;\n\n return (\n <FieldLayout\n field={field}\n error={error}\n >\n <input\n type={field.time ? \"datetime-local\" : \"date\"}\n id={field.name}\n value={value == null ? \"\" : value}\n onChange={(e) => onChange?.(e.target.value)}\n disabled={disabled || isReadOnly}\n min={field.minDate}\n max={field.maxDate}\n required={field.required}\n className={`kyro-form-input ${\n disabled || isReadOnly ? \"opacity-50 cursor-not-allowed\" : \"\"\n }`}\n />\n </FieldLayout>\n );\n}\n","import type { SelectField as SelectFieldType } from \"@kyro-cms/core/client\";\nimport FieldLayout from \"./FieldLayout\";\n\ninterface SelectFieldComponentProps {\n field: SelectFieldType;\n value?: string | string[];\n onChange?: (value: string | string[] | undefined) => void;\n error?: string;\n disabled?: boolean;\n}\n\nexport default function SelectField({\n field,\n value,\n onChange,\n error,\n disabled,\n}: SelectFieldComponentProps) {\n const isReadOnly = field.admin?.readOnly;\n\n return (\n <FieldLayout\n field={field}\n error={error}\n >\n <select\n id={field.name}\n value={\n field.hasMany\n ? Array.isArray(value)\n ? value.join(\",\")\n : \"\"\n : value || \"\"\n }\n onChange={(e) => {\n if (field.hasMany) {\n const selected = e.target.value ? e.target.value.split(\",\") : [];\n onChange?.(selected);\n } else {\n onChange?.(e.target.value || undefined);\n }\n }}\n multiple={field.hasMany}\n disabled={disabled || isReadOnly}\n required={field.required}\n className={`kyro-form-input ${\n disabled || isReadOnly ? \"opacity-50 cursor-not-allowed\" : \"\"\n }`}\n >\n {!field.required && !field.hasMany && <option value=\"\">Select...</option>}\n {field.options?.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n </FieldLayout>\n );\n}\n","import { useEffect, useState, useRef } from \"react\";\nimport { Search, X, ChevronDown, Loader2 } from \"../ui/icons\";\nimport { apiGet, buildSearchQuery } from \"../../lib/api\";\n\ninterface RelationshipFieldProps {\n field: {\n name: string;\n label?: string;\n relationTo: string | string[];\n hasMany?: boolean;\n required?: boolean;\n admin?: {\n description?: string;\n readOnly?: boolean;\n placeholder?: string;\n };\n };\n value?: string | string[] | null;\n onChange?: (value: string | string[] | null) => void;\n error?: string;\n disabled?: boolean;\n}\n\nexport function RelationshipField({\n field,\n value,\n onChange,\n error,\n disabled,\n}: RelationshipFieldProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [search, setSearch] = useState(\"\");\n const [options, setOptions] = useState<Record<string, unknown>[]>([]);\n const [loading, setLoading] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const isMultiple = field.hasMany;\n const relationTo = Array.isArray(field.relationTo)\n ? field.relationTo\n : [field.relationTo];\n const targetCollection = relationTo[0];\n\n const fetchOptions = (query: string = \"\") => {\n setLoading(true);\n const searchFields = [\"title\", \"name\", \"label\", \"email\"];\n const url = `/api/${targetCollection}?${buildSearchQuery(query, searchFields)}`;\n\n apiGet(url)\n .then((data) => {\n setOptions((prev) => {\n const existingIds = new Set(prev.map((o) => o.id));\nconst newDocs = (data.docs || []).filter(\n (d: Record<string, unknown>) => !existingIds.has(d.id as string),\n );\n return [...prev, ...newDocs];\n });\n setLoading(false);\n })\n .catch(() => {\n setLoading(false);\n });\n };\n\nconst fetchSelectedItems = () => {\n const items: (string | Record<string, unknown>)[] = isMultiple\n ? Array.isArray(value)\n ? value\n : []\n : value\n ? [value]\n : [];\n items.forEach((itemId) => {\n const id = typeof itemId === \"object\" ? itemId?.id : itemId;\n if (id && !options.some((o) => o.id === id)) {\n apiGet(`/api/${targetCollection}/${id}`)\n .then((doc) => {\n setOptions((prev) => [...prev, doc]);\n })\n .catch(() => {});\n }\n });\n };\n\n useEffect(() => {\n if (value) {\n fetchSelectedItems();\n }\n }, [value, targetCollection]);\n\n useEffect(() => {\n if (isOpen) {\n fetchOptions(search);\n }\n }, [isOpen, targetCollection]);\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, []);\n\n const getLabel = (opt: Record<string, unknown>) => {\n return (\n opt?.title ||\n opt?.name ||\n opt?.label ||\n opt?.email ||\n opt?.filename ||\n opt?.slug ||\n String(opt?.id) ||\n \"Untitled\"\n );\n };\n\n const getValueId = (val: string | Record<string, unknown>) => {\n return val?.id || val;\n };\n\n const isSelected = (opt: Record<string, unknown>) => {\n const optId = opt.id;\n if (!value) return false;\n if (isMultiple && Array.isArray(value)) {\n return value.some((v) => getValueId(v) === optId);\n }\n return getValueId(value) === optId;\n };\n\n const handleSelect = (opt: Record<string, unknown>) => {\n const optId = opt.id;\n if (isMultiple) {\n const current = Array.isArray(value) ? value : [];\n if (isSelected(opt)) {\n onChange?.(current.filter((v) => getValueId(v) !== optId));\n } else {\n onChange?.([...current, optId]);\n }\n } else {\n if (isSelected(opt)) {\n onChange?.(null);\n } else {\n onChange?.(optId);\n setIsOpen(false);\n setSearch(\"\");\n }\n }\n };\n\n const handleClear = () => {\n onChange?.(isMultiple ? [] : null);\n };\n\n const renderSelectedItems = () => {\n if (!value) return null;\n\n let items: (string | Record<string, unknown>)[];\n if (isMultiple) {\n items = Array.isArray(value) ? value : [];\n } else {\n items = value ? [value] : [];\n }\n\n return (\n <div className=\"flex flex-wrap gap-1.5 mt-2\">\n {items.map((item, idx) => {\n const rawId = typeof item === \"object\" ? item?.id || item : item;\n const opt = options.find((o) => o.id === rawId);\n const label = opt ? getLabel(opt) : String(rawId).slice(0, 8);\n return (\n <span\n key={idx}\n className=\"inline-flex items-center gap-1 px-2 py-1 text-xs rounded-md bg-[var(--kyro-sidebar-active)]/10 text-[var(--kyro-sidebar-active)]\"\n >\n {label}\n {!disabled && (\n <button\n type=\"button\"\n onClick={() => {\n if (isMultiple) {\nonChange?.(\n (items as (string | Record<string, unknown>)[]).filter((_: unknown, i: number) => i !== idx),\n );\n } else {\n onChange?.(null);\n }\n }}\n className=\"hover:opacity-70\"\n >\n <X className=\"w-3 h-3\" />\n </button>\n )}\n </span>\n );\n })}\n </div>\n );\n };\n\n return (\n <div className=\"space-y-1.5\">\n {field.label && (\n <label className=\"block text-sm font-medium text-[var(--kyro-text-primary)]\">\n {field.label}\n {field.required && (\n <span className=\"text-[var(--kyro-error)] ml-1\">*</span>\n )}\n </label>\n )}\n <div ref={containerRef} className=\"relative\">\n <div className=\"relative\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--kyro-text-muted)]\" />\n <input\n type=\"text\"\n value={search}\n onChange={(e) => {\n setSearch(e.target.value);\n setIsOpen(true);\n fetchOptions(e.target.value);\n }}\n onFocus={() => setIsOpen(true)}\n placeholder={\n field.admin?.placeholder || `Search ${targetCollection}...`\n }\n disabled={disabled || field.admin?.readOnly}\n className=\"w-full pl-9 pr-10 py-2 border border-[var(--kyro-border)] rounded-lg bg-[var(--kyro-bg-secondary)] text-sm text-[var(--kyro-text-primary)] focus:outline-none focus:ring-1 focus:ring-[var(--kyro-sidebar-active)] focus:border-transparent disabled:opacity-50\"\n />\n <div className=\"absolute right-3 top-1/2 -translate-y-1/2\">\n {loading ? (\n <Loader2 className=\"w-4 h-4 text-[var(--kyro-text-muted)] animate-spin\" />\n ) : (\n <ChevronDown\n className={`w-4 h-4 text-[var(--kyro-text-muted)] transition-transform ${isOpen ? \"rotate-180\" : \"\"}`}\n />\n )}\n </div>\n </div>\n\n {isOpen && (\n <div className=\"absolute z-20 w-full mt-1 border border-[var(--kyro-border)] rounded-lg shadow-lg bg-[var(--kyro-surface)] max-h-64 overflow-auto\">\n {loading ? (\n <div className=\"p-4 text-center text-sm text-[var(--kyro-text-muted)]\">\n Loading...\n </div>\n ) : options.length === 0 ? (\n <div className=\"p-4 text-center text-sm text-[var(--kyro-text-muted)]\">\n No results found\n </div>\n ) : (\n <div className=\"py-1\">\n {options.map((opt) => (\n <button\n key={opt.id}\n type=\"button\"\n onClick={() => handleSelect(opt)}\n className={`w-full px-3 py-2 text-left text-sm hover:bg-[var(--kyro-surface-accent)] transition-colors ${\n isSelected(opt)\n ? \"bg-[var(--kyro-sidebar-active)]/10 text-[var(--kyro-sidebar-active)]\"\n : \"text-[var(--kyro-text-primary)]\"\n }`}\n >\n <div className=\"flex items-center justify-between\">\n <span>{getLabel(opt)}</span>\n {isSelected(opt) && (\n <span className=\"text-[var(--kyro-sidebar-active)]\">\n ✓\n </span>\n )}\n </div>\n {opt.slug && (\n <div className=\"text-xs text-[var(--kyro-text-muted)]\">\n {opt.slug}\n </div>\n )}\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n\n {renderSelectedItems()}\n </div>\n {field.admin?.description && !error && (\n <p className=\"text-xs text-[var(--kyro-text-muted)]\">\n {field.admin.description}\n </p>\n )}\n {error && <p className=\"text-xs text-[var(--kyro-error)]\">{error}</p>}\n </div>\n );\n}\n\nexport default RelationshipField;\n","import React, { useState, useEffect, useCallback, useRef } from \"react\";\nimport { useStore } from \"zustand\";\nimport { BlocksContext, createBlocksStore, createNewBlock, type BlocksStoreApi } from \"./extensions/blocksStore\";\nimport { BlockDrawer, DraggableBlockType } from \"../ui/BlockDrawer\";\nimport { Plus, Box } from \"../ui/icons\";\nimport {\n BLOCK_COMPONENTS,\n getBlockComponent,\n blockCategories,\n blockIcons,\n} from \"./extensions/blockComponents\";\nimport {\n DndContext,\n closestCenter,\n PointerSensor,\n useSensor,\n useSensors,\n KeyboardSensor,\n useDraggable,\n DragOverlay,\n} from \"@dnd-kit/core\";\nimport type { DragEndEvent, DragStartEvent, Active } from \"@dnd-kit/core\";\nimport {\n SortableContext,\n useSortable,\n verticalListSortingStrategy,\n} from \"@dnd-kit/sortable\";\nimport { CSS } from \"@dnd-kit/utilities\";\n\ninterface BlocksFieldProps {\n field: Record<string, unknown>;\n value: unknown[];\n onChange?: (value: unknown[]) => void;\n onBlocksChange?: () => void;\n error?: string;\n disabled?: boolean;\n documentStatus?: \"draft\" | \"published\" | \"scheduled\" | \"archived\";\n justSaved?: boolean;\n}\n\nimport { GripVertical } from \"../ui/icons\";\n\n// Sortable block wrapper for drag-and-drop\nconst SortableBlockComponent = ({\n block,\n index,\n}: {\n block: Record<string, unknown>;\n index: number;\n}) => {\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id: block.id });\n\n const style = {\n transform: CSS.Transform.toString(transform),\n transition,\n zIndex: isDragging ? 10 : 1,\n opacity: isDragging ? 0.8 : 1,\n };\n\n const Component = getBlockComponent(block.type);\n\n return (\n <div ref={setNodeRef} style={style} className=\"relative group pl-8\">\n <div\n className=\"absolute left-0 top-1/2 -translate-y-1/2 p-1.5 cursor-grab active:cursor-grabbing text-[var(--kyro-text-muted)] opacity-0 group-hover:opacity-100 transition-opacity hover:bg-[var(--kyro-surface-accent)] rounded\"\n {...attributes}\n {...listeners}\n >\n <GripVertical className=\"w-4 h-4\" />\n </div>\n {Component ? (\n <Component block={block} index={index} />\n ) : (\n <div className=\"p-4 border border-[var(--kyro-border)] rounded-md\">\n Unknown block: {block.type}\n </div>\n )}\n </div>\n );\n};\n// Memoize per-block to minimize re-renders when unrelated blocks change\nconst SortableBlock = React.memo(SortableBlockComponent);\n\nexport const BlocksField: React.FC<BlocksFieldProps> = ({\n field,\n value,\n onChange,\n onBlocksChange,\n error,\n disabled,\n documentStatus,\n justSaved,\n}) => {\n const [isDrawerOpen, setIsDrawerOpen] = useState(false);\n const storeRef = useRef<BlocksStoreApi | null>(null);\n if (!storeRef.current) {\n storeRef.current = createBlocksStore();\n }\n const store = storeRef.current;\n\n const blocks = useStore(store, (s) => s.blocks);\n const [activeDrag, setActiveDrag] = useState<Active | null>(null);\n\n // Register blocks change callback\n useEffect(() => {\n if (onBlocksChange) {\n store.getState().setOnBlocksChange(onBlocksChange);\n }\n return () => {\n store.getState().setOnBlocksChange(() => { });\n };\n }, [onBlocksChange, store]);\n\n // Sync external value changes (e.g., auto-save restore) to store\n // Track last-synced value so we don't revert our own internal mutations\n const lastValueRef = useRef<unknown[] | null>(null);\n useEffect(() => {\n const valueArray = Array.isArray(value) ? value : [];\n const lastValueArray = lastValueRef.current || [];\n const valueIds = valueArray.map((b: Record<string, unknown>) => b.id).join(\",\");\n const lastValueIds = lastValueArray.map((b: Record<string, unknown>) => b.id).join(\",\");\n\n if (valueIds !== lastValueIds) {\n console.log(\"BlocksField sync: value=\", value, \"valueIds=\", valueIds, \"lastValueIds=\", lastValueIds);\n store.getState().setBlocks(valueArray);\n lastValueRef.current = [...valueArray];\n }\n }, [value, field.name, store]);\n\n // Debounced sync of store changes back to parent form to reduce re-renders\n const onChangeTimer = useRef<number | null>(null);\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n useEffect(() => {\n if (!onChangeRef.current) return;\n if (onChangeTimer.current) {\n window.clearTimeout(onChangeTimer.current);\n onChangeTimer.current = null;\n }\n onChangeTimer.current = window.setTimeout(() => {\n onChangeRef.current?.(blocks);\n }, 250);\n return () => {\n if (onChangeTimer.current) {\n window.clearTimeout(onChangeTimer.current);\n onChangeTimer.current = null;\n }\n };\n }, [blocks]);\n\n // Determine left border style based on document status\n const getBorderClass = () => {\n if (justSaved) {\n return \"border-l-[3px] border-[var(--kyro-success)]\";\n }\n if (\n documentStatus === \"draft\" ||\n documentStatus === \"scheduled\" ||\n documentStatus === \"archived\"\n ) {\n return \"border-l-[3px] border-amber-500\";\n }\n return \"\";\n };\n\n const handleAddBlock = useCallback(\n (blockType: string) => {\n store.getState().addBlock(blockType);\n },\n [store],\n );\n\n // Set up dnd-kit sensors\n const sensors = useSensors(\n useSensor(PointerSensor, {\n activationConstraint: {\n distance: 8,\n },\n }),\n useSensor(KeyboardSensor),\n );\n\n const handleDragStart = (event: DragStartEvent) => {\n setActiveDrag(event.active);\n };\n\n const handleDragEnd = (event: DragEndEvent) => {\n const { active, over } = event;\n setActiveDrag(null);\n\n if (!over) return;\n\n // Case 1: Dragged from drawer\n if (active.id.toString().startsWith(\"drawer-\")) {\n const blockType = active.id.toString().replace(\"drawer-\", \"\");\n\n // Check if dropped on a container\n if (over.id.toString().startsWith(\"container-\")) {\n const containerId = over.id.toString().replace(\"container-\", \"\");\n const container = blocks.find((b) => b.id === containerId);\n if (container) {\n const newBlock = createNewBlock(blockType);\n store.getState().updateBlock(containerId, {\n children: [...(container.children || []), newBlock],\n });\n }\n } else {\n // Dropped on root level - add as top-level block\n handleAddBlock(blockType);\n }\n return;\n }\n\n // Case 2: Reordering existing blocks\n if (active.id !== over.id) {\n const oldIndex = blocks.findIndex((b) => b.id === active.id);\n const newIndex = blocks.findIndex((b) => b.id === over.id);\n\n if (oldIndex !== -1 && newIndex !== -1) {\n const newBlocks = [...blocks];\n const [movedBlock] = newBlocks.splice(oldIndex, 1);\n newBlocks.splice(newIndex, 0, movedBlock);\n store.getState().setBlocks(newBlocks);\n }\n }\n };\n\n // Render active drag overlay\n const activeBlock = activeDrag\n ? blockCategories\n .flatMap((cat) => cat.blocks)\n .find((b) => `drawer-${b.type}` === activeDrag.id) ||\n blocks.find((b) => b.id === activeDrag.id)\n : null;\n\nconst activeBlockLabel = activeBlock\n ? \"label\" in activeBlock\n ? (activeBlock as Record<string, unknown>).label\n : activeBlock.type\n : \"Block\";\n\n const borderClass = getBorderClass();\n\n return (\n <BlocksContext.Provider value={store}>\n <div className={`kyro-form-field ${borderClass}`}>\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n >\n {/* Block Builder Toolbar */}\n <div className=\"flex items-center justify-between mb-2\">\n <label className=\"kyro-form-label\">{field.label || field.name}</label>\n <button\n type=\"button\"\n onClick={() => setIsDrawerOpen(true)}\n disabled={disabled}\n className=\"flex items-center gap-2 px-3 py-2 text-sm text-[var(--kyro-primary)] hover:bg-[var(--kyro-surface-accent)]/30 rounded-md transition-colors disabled:opacity-50 font-semibold\"\n >\n <Plus className=\"w-4 h-4\" />\n Add Block\n </button>\n <BlockDrawer\n open={isDrawerOpen}\n onClose={() => setIsDrawerOpen(false)}\n onSelect={handleAddBlock}\n >\n <div className=\"space-y-4\">\n {blockCategories.map((category) => (\n <div key={category.title}>\n <h3 className=\"text-xs font-semibold text-[var(--kyro-text-muted)] mb-2 tracking-wider\">\n {category.title}\n </h3>\n <div className=\"grid grid-cols-3 gap-2\">\n {category.blocks.map((block) => (\n <DraggableBlockType\n key={block.type}\n block={block}\n onSelect={handleAddBlock}\n >\n <div className=\"w-6 h-6 flex items-center justify-center rounded group-hover:bg-[var(--kyro-primary)]/10 group-hover:text-[var(--kyro-primary)] transition-all duration-300\">\n <span className=\"text-[var(--kyro-text-muted)]\">\n {blockIcons[\n block.icon as keyof typeof blockIcons\n ] || <Box className=\"w-4 h-4\" />}\n </span>\n </div>\n </DraggableBlockType>\n ))}\n </div>\n </div>\n ))}\n </div>\n </BlockDrawer>\n </div>\n\n {/* Block List with Drag-and-Drop */}\n <SortableContext\n items={blocks.map((b) => b.id)}\n strategy={verticalListSortingStrategy}\n >\n <div className=\"space-y-4\">\n {blocks.map((block, index) => (\n <SortableBlock key={block.id || index} block={block} index={index} />\n ))}\n {blocks.length === 0 && (\n <div className=\"text-center py-12 text-[var(--kyro-text-muted)] border-2 border-dashed border-[var(--kyro-border)] rounded-lg\">\n Click the button above to add your first block\n </div>\n )}\n </div>\n </SortableContext>\n <DragOverlay>\n {activeDrag && activeBlock && (\n <div className=\"bg-[var(--kyro-surface)] border border-[var(--kyro-primary)] rounded-md p-3 shadow-lg\">\n {(activeBlock as Record<string, unknown>).label || activeBlock.type || \"Block\"}\n </div>\n )}\n </DragOverlay>\n </DndContext>\n {error && <p className=\"kyro-form-error\">{error}</p>}\n </div>\n </BlocksContext.Provider>\n );\n};\n","import { createStore, type StoreApi } from \"zustand/vanilla\";\nimport { useStore } from \"zustand\";\nimport { createContext, useContext } from \"react\";\nimport type { BlockData } from \"@kyro-cms/core/client\";\n\nexport interface BlocksStore {\n blocks: BlockData[];\n setBlocks: (blocks: BlockData[]) => void;\n addBlock: (type: string, index?: number) => void;\n updateBlock: (id: string, data: Partial<BlockData>) => void;\n removeBlock: (id: string) => void;\n moveBlock: (id: string, direction: \"up\" | \"down\") => void;\n onBlocksChange: (() => void) | null;\n setOnBlocksChange: (cb: () => void) => void;\n}\n\nexport type BlocksStoreApi = StoreApi<BlocksStore>;\n\nexport const BlocksContext = createContext<BlocksStoreApi | null>(null);\n\nexport function createBlocksStore(): BlocksStoreApi {\n return createStore<BlocksStore>((set, get) => ({\n blocks: [],\n setBlocks: (blocks) => {\n const ensuredBlocks = ensureIds(blocks || []);\n set({ blocks: ensuredBlocks });\n },\n onBlocksChange: null,\n setOnBlocksChange: (cb) => set({ onBlocksChange: cb }),\n addBlock: (type, index) => {\n const newBlock = createNewBlock(type);\n const { blocks } = get();\n const newBlocks = [...blocks];\n if (index !== undefined) {\n newBlocks.splice(index, 0, newBlock);\n } else {\n newBlocks.push(newBlock);\n }\n set({ blocks: newBlocks });\n const { onBlocksChange } = get();\n if (onBlocksChange) onBlocksChange();\n },\n updateBlock: (id, data) => {\n const { blocks } = get();\n\n const newBlocks = traverseBlocks(blocks, (blocksList) => {\n const index = blocksList.findIndex(b => b.id === id);\n if (index !== -1) {\n const newBlocksList = [...blocksList];\n newBlocksList[index] = { ...newBlocksList[index], ...data };\n return { newList: newBlocksList, found: true };\n }\n return { newList: blocksList, found: false };\n });\n\n if (newBlocks !== blocks) {\n set({ blocks: newBlocks });\n const { onBlocksChange } = get();\n if (onBlocksChange) onBlocksChange();\n }\n },\n removeBlock: (id) => {\n if (!id) return;\n const { blocks } = get();\n \n const newBlocks = traverseBlocks(blocks, (blocksList) => {\n const filtered = blocksList.filter(b => b.id !== id);\n if (filtered.length !== blocksList.length) {\n return { newList: filtered, found: true };\n }\n return { newList: blocksList, found: false };\n });\n\n if (newBlocks !== blocks) {\n set({ blocks: newBlocks });\n const { onBlocksChange } = get();\n if (onBlocksChange) onBlocksChange();\n }\n },\n moveBlock: (id, direction) => {\n const { blocks } = get();\n\n const newBlocks = traverseBlocks(blocks, (blocksList) => {\n const index = blocksList.findIndex(b => b.id === id);\n if (index !== -1) {\n const targetIndex = direction === \"up\" ? index - 1 : index + 1;\n if (targetIndex >= 0 && targetIndex < blocksList.length) {\n const newBlocksList = [...blocksList];\n [newBlocksList[index], newBlocksList[targetIndex]] = [\n newBlocksList[targetIndex],\n newBlocksList[index],\n ];\n return { newList: newBlocksList, found: true };\n }\n }\n return { newList: blocksList, found: false };\n });\n\n if (newBlocks !== blocks) {\n set({ blocks: newBlocks });\n const { onBlocksChange } = get();\n if (onBlocksChange) onBlocksChange();\n }\n },\n }));\n}\n\n/**\n * Recursively ensures all blocks and nested children have unique IDs\n */\nexport function ensureIds(blocks: BlockData[]): BlockData[] {\n if (!Array.isArray(blocks)) return [];\n\n return blocks.map((block) => {\n const updatedBlock = {\n ...block,\n id: block.id || Math.random().toString(36).substr(2, 9),\n };\n\n if (updatedBlock.children && Array.isArray(updatedBlock.children)) {\n updatedBlock.children = ensureIds(updatedBlock.children);\n }\n\n if (updatedBlock.data?.columnData && Array.isArray(updatedBlock.data.columnData)) {\n updatedBlock.data = {\n ...updatedBlock.data,\n columnData: updatedBlock.data.columnData.map((col: Record<string, unknown>) => ({\n ...col,\n children: col.children ? ensureIds(col.children) : col.children,\n })),\n };\n }\n\n return updatedBlock;\n });\n}\n\n// Create new block helper (pure function, no store needed)\nexport function createNewBlock(type: string): BlockData {\n const defaultData = getDefaultData(type);\n const { options, children, ...data } = defaultData;\n return {\n id: Math.random().toString(36).substr(2, 9),\n type,\n data,\n options,\n children,\n order: Date.now(),\n };\n}\n\nfunction getDefaultData(type: string): Record<string, unknown> {\n const defaults: Record<string, unknown> = {\n heading: { level: 1, text: \"\" },\n paragraph: { text: \"\" },\n divider: {},\n callout: { text: \"\", variant: \"info\" },\n image: { src: \"\", alt: \"\", caption: \"\" },\n video: { src: \"\", title: \"\" },\n list: { type: \"unordered\", items: \"\" },\n code: { language: \"plaintext\", code: \"\" },\n link: { url: \"\", text: \"\" },\n table: { rows: 3, columns: 3, content: \"\" },\n quote: { text: \"\", author: \"\" },\n file: { filename: \"\", url: \"\" },\n columns: { columns: 2, direction: \"horizontal\" },\n vstack: { direction: \"vertical\", gap: \"md\" },\n container: {\n options: {\n backgroundColor: \"transparent\",\n padding: \"md\",\n width: \"full\",\n margin: \"none\",\n minHeight: \"none\",\n borderRadius: \"none\",\n },\n children: [],\n },\n button: { text: \"Button\", url: \"\", variant: \"primary\", size: \"md\" },\n accordion: { title: \"Accordion Item\", content: \"\" },\n gallery: { images: [] },\n tabs: { tabs: [{ label: \"Tab 1\", content: \"\" }] },\n };\n return defaults[type] || {};\n}\n\n// React hooks that read from context\nexport function useBlocksStore(): BlocksStore {\n const store = useContext(BlocksContext);\n if (!store) {\n throw new Error(\"useBlocksStore must be used within a BlocksContext.Provider\");\n }\n return useStore(store);\n}\n\nexport function useBlockById(id: string): BlockData | undefined {\n const store = useContext(BlocksContext);\n if (!store) return undefined;\n return useStore(store, (state) => {\n const findRecursive = (blocksList: BlockData[]): BlockData | undefined => {\n for (const b of blocksList) {\n if (b.id === id) return b;\n if (b.children && b.children.length > 0) {\n const found = findRecursive(b.children);\n if (found) return found;\n }\n if (b.data?.columnData) {\n for (const col of b.data.columnData) {\n if (col && col.children && col.children.length > 0) {\n const found = findRecursive(col.children);\n if (found) return found;\n }\n }\n }\n }\n return undefined;\n };\n return findRecursive(state.blocks);\n });\n}\n\nexport function useBlockCount(): number {\n const store = useContext(BlocksContext);\n if (!store) return 0;\n return useStore(store, (state) => state.blocks.length);\n}\n\nexport function useBlockActions() {\n const store = useContext(BlocksContext);\n if (!store) {\n throw new Error(\"useBlockActions must be used within a BlocksContext.Provider\");\n }\n return {\n updateBlock: (id: string, data: Partial<BlockData>) => store.getState().updateBlock(id, data),\n removeBlock: (id: string) => store.getState().removeBlock(id),\n moveBlock: (id: string, direction: \"up\" | \"down\") => store.getState().moveBlock(id, direction),\n };\n}\n\n/**\n * Generic tree traversal helper for blocks\n */\nexport function traverseBlocks(\n blocks: BlockData[],\n action: (blocksList: BlockData[]) => { newList: BlockData[]; found: boolean }\n): BlockData[] {\n const { newList, found } = action(blocks);\n if (found) return newList;\n\n let overallChanged = false;\n const deepUpdatedList = blocks.map((block) => {\n let updatedBlock = { ...block };\n let blockChanged = false;\n\n // Handle children\n if (block.children && block.children.length > 0) {\n const updatedChildren = traverseBlocks(block.children, action);\n if (updatedChildren !== block.children) {\n updatedBlock.children = updatedChildren;\n blockChanged = true;\n }\n }\n\n // Handle columnData\n if (block.data?.columnData && Array.isArray(block.data.columnData)) {\n const updatedColumnData = block.data.columnData.map((col: Record<string, unknown>) => {\n if (col.children && col.children.length > 0) {\n const updatedColChildren = traverseBlocks(col.children, action);\n if (updatedColChildren !== col.children) {\n return { ...col, children: updatedColChildren };\n }\n }\n return col;\n });\n\n if (updatedColumnData.some((col: Record<string, unknown>, i: number) => col !== block.data.columnData[i])) {\n updatedBlock.data = { ...updatedBlock.data, columnData: updatedColumnData };\n blockChanged = true;\n }\n }\n\n if (blockChanged) overallChanged = true;\n return blockChanged ? updatedBlock : block;\n });\n\n return overallChanged ? deepUpdatedList : blocks;\n}\n","import React, { type ReactNode } from \"react\";\nimport { useDraggable } from \"@dnd-kit/core\";\nimport { SlidePanel } from \"./SlidePanel\";\n\ninterface BlockDrawerProps {\n open: boolean;\n onClose: () => void;\n onSelect: (blockType: string) => void;\n children?: ReactNode;\n}\n\nexport function BlockDrawer({\n open,\n onClose,\n onSelect,\n children,\n}: BlockDrawerProps) {\n if (!open) return null;\n\n return (\n <SlidePanel open={open} onClose={onClose} title=\"Insert Block\" width=\"md\">\n <p className=\"text-sm text-[var(--kyro-text-muted)] mb-4\">\n Drag blocks into the editor or click to insert\n </p>\n {children}\n </SlidePanel>\n );\n}\n\n// Draggable wrapper for block types in the drawer\nexport function DraggableBlockType({\n block,\n onSelect,\n children,\n}: {\n block: { type: string; label: string; icon: React.ReactNode; description: string };\n onSelect: (type: string) => void;\n children?: ReactNode;\n}) {\n const { attributes, listeners, setNodeRef, isDragging } = useDraggable({\n id: `drawer-${block.type}`,\n data: { source: \"drawer\", blockType: block.type },\n });\n\n return (\n <div\n ref={setNodeRef}\n {...listeners}\n {...attributes}\n onClick={() => onSelect(block.type)}\n className={`flex flex-col items-center text-center gap-1 p-2 rounded-md border border-[var(--kyro-border)] hover:border-[var(--kyro-primary)]/60 hover:bg-[var(--kyro-surface-accent)]/30 transition-all cursor-pointer group ${isDragging ? \"opacity-50 border-[var(--kyro-primary)]\" : \"\"\n }`}\n style={{ opacity: isDragging ? 0.5 : 1 }}\n >\n <div className=\"w-6 h-6 flex items-center justify-center rounded group-hover:bg-[var(--kyro-primary)]/10 group-hover:text-[var(--kyro-primary)] transition-all duration-300\">\n {children || (\n <span className=\"text-[var(--kyro-text-muted)]\">\n {/* Default icon */}\n </span>\n )}\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-xs font-medium tracking-tight text-[var(--kyro-text-primary)] leading-tight\">\n {block.label}\n </div>\n <div className=\"text-[10px] text-[var(--kyro-text-muted)] mt-0.5 leading-tight\">\n {block.description}\n </div>\n </div>\n </div>\n );\n}\n\nexport interface BlockType {\n type: string;\n label: string;\n icon: string;\n}\n","import React, { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\n\ninterface SlidePanelProps {\n open: boolean;\n onClose: () => void;\n title: string;\n subtitle?: string;\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n children: ReactNode;\n width?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n showOverlay?: boolean;\n}\n\nexport function SlidePanel({\n open,\n onClose,\n title,\n children,\n width = \"md\",\n showOverlay = false,\n}: SlidePanelProps) {\n const panelRef = useRef<HTMLDivElement>(null);\n const [hydrated, setHydrated] = useState(false);\n\n useEffect(() => {\n setHydrated(true);\n }, []);\n\n useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n };\n\n if (open) {\n document.addEventListener(\"keydown\", handleEscape);\n document.body.style.overflow = \"hidden\";\n }\n\n return () => {\n document.removeEventListener(\"keydown\", handleEscape);\n document.body.style.overflow = \"\";\n };\n }, [open, onClose]);\n\n const widthClasses = {\n sm: \"w-[320px]\",\n md: \"w-[400px]\",\n lg: \"w-[500px]\",\n xl: \"w-[600px]\",\n };\n\n if (!open || !hydrated) return null;\n\n return createPortal(\n <>\n {showOverlay && (\n <div\n className=\"fixed inset-0 z-[99998] bg-black/50 backdrop-blur-sm\"\n onClick={onClose}\n />\n )}\n <div\n ref={panelRef}\n className={`fixed right-0 top-0 bottom-0 z-[99999] ${widthClasses[width]} bg-[var(--kyro-surface)] border-l border-[var(--kyro-border)] shadow-2xl flex flex-col animate-slideIn`}\n >\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-[var(--kyro-border)] bg-[var(--kyro-surface)]\">\n <h2 className=\"text-sm font-semibold text-[var(--kyro-text-primary)]\">\n {title}\n </h2>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"p-1.5 text-[var(--kyro-text-muted)] hover:text-[var(--kyro-text-primary)] hover:bg-[var(--kyro-surface-accent)] rounded-lg transition-colors\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M18 6L6 18M6 6l12 12\" />\n </svg>\n </button>\n </div>\n <div className=\"flex-1 overflow-y-auto p-4\">{children}</div>\n </div>\n <style>{`\n @keyframes slideIn {\n from { transform: translateX(100%); }\n to { transform: translateX(0); }\n }\n .animate-slideIn {\n animation: slideIn 300ms ease-out;\n }\n `}</style>\n </>,\n document.body,\n );\n}\n","import React, { useState } from \"react\";\nimport { Plus, X, ChevronRight, ChevronDown } from \"../ui/icons\";\nimport {\n blockCategories,\n blockIcons,\n getBlockComponent,\n getBlockLabel,\n} from \"../fields/extensions/blockComponents\";\nimport { createNewBlock } from \"../fields/extensions/blocksStore\";\nimport { BlockDrawer } from \"../ui/BlockDrawer\";\nimport { BlockEditModal } from \"./BlockEditModal\";\n\ninterface ChildBlocksTreeProps {\n blockId: string;\n children: Record<string, unknown>[];\n onUpdateChildren: (children: Record<string, unknown>[]) => void;\n depth?: number;\n maxDepth?: number;\n}\n\nconst MAX_DEPTH = 6;\n\nexport const ChildBlocksTree: React.FC<ChildBlocksTreeProps> = ({\n blockId,\n children,\n onUpdateChildren,\n depth = 0,\n maxDepth = MAX_DEPTH,\n}) => {\n const [showAddModal, setShowAddModal] = useState(false);\n const [expandedIds, setExpandedIds] = useState<Set<string>>(new Set());\n const [editingBlockId, setEditingBlockId] = useState<string | null>(null);\n const [confirmDeleteId, setConfirmDeleteId] = useState<string | null>(null);\n\n const availableBlocks = blockCategories.flatMap((cat) => cat.blocks);\n const canAddChildren = depth < maxDepth;\n const indentWidth = 16;\n\n const handleAddChild = (type: string) => {\n const newChild = createNewBlock(type);\n onUpdateChildren([...children, newChild]);\n setEditingBlockId(newChild.id);\n };\n\n const handleRemoveChild = (childId: string) => {\n const filtered = children.filter((c) => c.id !== childId);\n onUpdateChildren(filtered);\n };\n\n const handleUpdateChildData = (childId: string, newData: Record<string, unknown>) => {\n const updated = children.map((child) => {\n if (child.id === childId) {\n return { ...child, data: newData };\n }\n return child;\n });\n onUpdateChildren(updated);\n };\n\n const handleUpdateChildChildren = (\n childId: string,\n newGrandchildren: Record<string, unknown>[],\n ) => {\n const updated = children.map((child) => {\n if (child.id === childId) {\n return { ...child, children: newGrandchildren };\n }\n return child;\n });\n onUpdateChildren(updated);\n };\n\n const toggleExpand = (id: string) => {\n setExpandedIds((prev) => {\n const next = new Set(prev);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n return next;\n });\n };\n\n const renderBlock = (child: Record<string, unknown>) => {\n const hasChildren = child.children && child.children.length > 0;\n const isExpanded = expandedIds.has(child.id);\n const BlockComponent = getBlockComponent(child.type);\n const childHasOwnChildren = hasChildren;\n const isEditing = editingBlockId === child.id;\n\n return (\n <div key={child.id} className=\"relative group\">\n <div\n className={`flex items-center group/column gap-2 p-2 bg-[var(--kyro-bg-secondary)] rounded border transition-colors ${isEditing\n ? \"bg-[var(--kyro-primary)]/10 border-[var(--kyro-primary)]\"\n : \"border-[var(--kyro-border)] hover:border-[var(--kyro-primary)]/50 hover:bg-[var(--kyro-primary)]/5\"\n } ${canAddChildren ? \"cursor-pointer\" : \"\"}`}\n style={{ marginLeft: depth * indentWidth }}\n onClick={() => {\n if (canAddChildren) {\n setEditingBlockId(isEditing ? null : child.id);\n }\n }}\n >\n {childHasOwnChildren ? (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n toggleExpand(child.id);\n }}\n className=\"p-0.5 hover:bg-[var(--kyro-surface-accent)] rounded\"\n >\n {isExpanded ? (\n <ChevronDown className=\"w-3 h-3 text-[var(--kyro-text-muted)]\" />\n ) : (\n <ChevronRight className=\"w-3 h-3 text-[var(--kyro-text-muted)]\" />\n )}\n </button>\n ) : (\n <span className=\"w-4\" />\n )}\n\n {blockIcons[child.type] && (\n <span className=\"text-[var(--kyro-text-secondary)]\">\n {blockIcons[child.type]}\n </span>\n )}\n\n <span className=\"text-xs font-medium text-[var(--kyro-text-secondary)] flex-1 truncate\">\n {getBlockLabel(child.type)}\n {child.data?.text ? ` - ${child.data.text.slice(0, 30)}` : \"\"}\n {child.data?.heading ? ` - ${child.data.heading.slice(0, 30)}` : \"\"}\n </span>\n\n {hasChildren && (\n <span className=\"text-[10px] text-[var(--kyro-text-muted)]\">\n ({child.children.length})\n </span>\n )}\n\n {confirmDeleteId === child.id ? (\n <div\n className=\"flex items-center gap-1\"\n onClick={(e) => e.stopPropagation()}\n >\n <button\n type=\"button\"\n onClick={() => {\n handleRemoveChild(child.id);\n setConfirmDeleteId(null);\n }}\n className=\"px-2 py-1 text-xs bg-red-500 text-white rounded hover:bg-red-600\"\n >\n Remove\n </button>\n <button\n type=\"button\"\n onClick={() => setConfirmDeleteId(null)}\n className=\"px-2 py-1 text-xs bg-[var(--kyro-surface-accent)] text-[var(--kyro-text-secondary)] rounded hover:bg-[var(--kyro-border)]\"\n >\n Cancel\n </button>\n </div>\n ) : (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n setConfirmDeleteId(child.id);\n }}\n className=\"p-1.5 rounded-md transition-opacity cursor-pointer hover:bg-red-50\"\n >\n <X className=\"w-3.5 h-3.5 text-red-500 invisible group-hover/column:visible\" />\n </button>\n )}\n </div>\n\n {isEditing && (\n <BlockEditModal\n block={child}\n onClose={() => setEditingBlockId(null)}\n />\n )}\n\n {hasChildren && isExpanded && (\n <div className=\"mt-1\">\n <NestedChildBlocks\n parentId={child.id}\n children={child.children}\n onUpdateChildren={(newGrandchildren) =>\n handleUpdateChildChildren(child.id, newGrandchildren)\n }\n depth={depth + 1}\n maxDepth={maxDepth}\n />\n </div>\n )}\n </div>\n );\n };\n\n return (\n <div className=\"space-y-2\">\n {children.length > 0 && (\n <div className=\"space-y-1\">{children.map(renderBlock)}</div>\n )}\n\n {canAddChildren && (\n <div style={{ marginLeft: depth * indentWidth }}>\n <button\n type=\"button\"\n onClick={() => setShowAddModal(true)}\n className=\"flex items-center gap-1 px-2 py-1 text-xs font-medium text-[var(--kyro-primary)] hover:bg-[var(--kyro-surface-accent)] rounded transition-colors\"\n >\n <Plus className=\"w-3 h-3\" />\n Add Block\n </button>\n\n <BlockDrawer\n open={showAddModal}\n onClose={() => setShowAddModal(false)}\n onSelect={handleAddChild}\n >\n {blockCategories.map((category) => (\n <div key={category.title} className=\"mb-4\">\n <h3 className=\"text-xs font-semibold text-[var(--kyro-text-muted)] tracking-wide mb-2\">\n {category.title}\n </h3>\n <div className=\"grid grid-cols-3 gap-2\">\n {category.blocks.map((block) => (\n <button\n key={block.type}\n type=\"button\"\n onClick={() => {\n handleAddChild(block.type);\n setShowAddModal(false);\n }}\n className=\"flex flex-col items-center text-center gap-1 p-2 rounded-md border border-[var(--kyro-border)] hover:border-[var(--kyro-primary)]/60 hover:bg-[var(--kyro-surface-accent)]/30 transition-all cursor-pointer group\"\n >\n <div className=\"w-6 h-6 flex items-center justify-center rounded group-hover:bg-[var(--kyro-primary)]/10 group-hover:text-[var(--kyro-primary)] transition-all\">\n {blockIcons[block.icon]}\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-xs font-medium tracking-tight text-[var(--kyro-text-primary)]\">\n {block.label}\n </div>\n <div className=\"text-[10px] text-[var(--kyro-text-muted)] mt-0.5\">\n {block.description}\n </div>\n </div>\n </button>\n ))}\n </div>\n </div>\n ))}\n </BlockDrawer>\n </div>\n )}\n\n {children.length === 0 && canAddChildren && (\n <div\n className=\"text-xs text-[var(--kyro-text-muted)] italic py-2\"\n style={{ marginLeft: depth * indentWidth }}\n >\n No blocks added. Click \"Add Block\" to add elements.\n </div>\n )}\n\n {depth >= maxDepth && children.length > 0 && (\n <div\n className=\"text-xs text-[var(--kyro-text-muted)] italic\"\n style={{ marginLeft: depth * indentWidth }}\n >\n Maximum nesting level ({maxDepth}) reached\n </div>\n )}\n </div>\n );\n};\n\ninterface NestedChildBlocksProps {\n parentId: string;\n children: Record<string, unknown>[];\n onUpdateChildren: (children: Record<string, unknown>[]) => void;\n depth: number;\n maxDepth: number;\n}\n\nconst NestedChildBlocks: React.FC<NestedChildBlocksProps> = ({\n parentId,\n children,\n onUpdateChildren,\n depth,\n maxDepth,\n}) => {\n const [showAddModal, setShowAddModal] = useState(false);\n const [expandedIds, setExpandedIds] = useState<Set<string>>(new Set());\n const [editingBlockId, setEditingBlockId] = useState<string | null>(null);\n const [confirmDeleteId, setConfirmDeleteId] = useState<string | null>(null);\n\n const availableBlocks = blockCategories.flatMap((cat) => cat.blocks);\n const canAddChildren = depth < maxDepth;\n const indentWidth = 16;\n\n const handleAddChild = (type: string) => {\n const newChild = createNewBlock(type);\n onUpdateChildren([...children, newChild]);\n setEditingBlockId(newChild.id);\n };\n\n const handleRemoveChild = (childId: string) => {\n const filtered = children.filter((c) => c.id !== childId);\n onUpdateChildren(filtered);\n };\n\n const handleUpdateChildData = (childId: string, newData: Record<string, unknown>) => {\n const updated = children.map((child) => {\n if (child.id === childId) {\n return { ...child, data: newData };\n }\n return child;\n });\n onUpdateChildren(updated);\n };\n\n const handleUpdateChildChildren = (\n childId: string,\n newGrandchildren: Record<string, unknown>[],\n ) => {\n const updated = children.map((child) => {\n if (child.id === childId) {\n return { ...child, children: newGrandchildren };\n }\n return child;\n });\n onUpdateChildren(updated);\n };\n\n const toggleExpand = (id: string) => {\n setExpandedIds((prev) => {\n const next = new Set(prev);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n return next;\n });\n };\n\n const renderBlock = (child: Record<string, unknown>) => {\n const hasChildren = child.children && child.children.length > 0;\n const isExpanded = expandedIds.has(child.id);\n const BlockComponent = getBlockComponent(child.type);\n const childHasOwnChildren = hasChildren;\n const isEditing = editingBlockId === child.id;\n\n return (\n <div key={child.id} className=\"relative group\">\n <div\n className={`flex items-center gap-2 p-2 bg-[var(--kyro-bg-secondary)] rounded border transition-colors ${isEditing\n ? \"bg-[var(--kyro-primary)]/10 border-[var(--kyro-primary)]\"\n : \"border-[var(--kyro-border)] hover:border-[var(--kyro-primary)]/50 hover:bg-[var(--kyro-primary)]/5\"\n } ${canAddChildren ? \"cursor-pointer\" : \"\"}`}\n style={{ marginLeft: depth * indentWidth }}\n onClick={() => {\n if (canAddChildren) {\n setEditingBlockId(isEditing ? null : child.id);\n }\n }}\n >\n {childHasOwnChildren ? (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n toggleExpand(child.id);\n }}\n className=\"p-0.5 hover:bg-[var(--kyro-surface-accent)] rounded\"\n >\n {isExpanded ? (\n <ChevronDown className=\"w-3 h-3 text-[var(--kyro-text-muted)]\" />\n ) : (\n <ChevronRight className=\"w-3 h-3 text-[var(--kyro-text-muted)]\" />\n )}\n </button>\n ) : (\n <span className=\"w-4\" />\n )}\n\n {blockIcons[child.type] && (\n <span className=\"text-[var(--kyro-text-secondary)]\">\n {blockIcons[child.type]}\n </span>\n )}\n\n <span className=\"text-xs font-medium text-[var(--kyro-text-secondary)] flex-1 truncate\">\n {getBlockLabel(child.type)}\n {child.data?.text ? ` - ${child.data.text.slice(0, 30)}` : \"\"}\n {child.data?.heading ? ` - ${child.data.heading.slice(0, 30)}` : \"\"}\n </span>\n\n {hasChildren && (\n <span className=\"text-[10px] text-[var(--kyro-text-muted)]\">\n ({child.children.length})\n </span>\n )}\n\n {confirmDeleteId === child.id ? (\n <div\n className=\"flex items-center gap-1\"\n onClick={(e) => e.stopPropagation()}\n >\n <button\n type=\"button\"\n onClick={() => {\n handleRemoveChild(child.id);\n setConfirmDeleteId(null);\n }}\n className=\"px-2 py-1 text-xs bg-red-500 text-white rounded hover:bg-red-600\"\n >\n Remove\n </button>\n <button\n type=\"button\"\n onClick={() => setConfirmDeleteId(null)}\n className=\"px-2 py-1 text-xs bg-[var(--kyro-surface-accent)] text-[var(--kyro-text-secondary)] rounded hover:bg-[var(--kyro-border)]\"\n >\n Cancel\n </button>\n </div>\n ) : (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n setConfirmDeleteId(child.id);\n }}\n className=\"p-1.5 rounded-md invisible group-hover:visible transition-opacity cursor-pointer hover:bg-red-50\"\n >\n <X className=\"w-3.5 h-3.5 text-red-500\" />\n </button>\n )}\n </div>\n\n {isEditing && (\n <BlockEditModal\n block={child}\n onClose={() => setEditingBlockId(null)}\n />\n )}\n\n {hasChildren && isExpanded && (\n <div className=\"mt-1\">\n <NestedChildBlocks\n parentId={child.id}\n children={child.children}\n onUpdateChildren={(newGrandchildren) =>\n handleUpdateChildChildren(child.id, newGrandchildren)\n }\n depth={depth + 1}\n maxDepth={maxDepth}\n />\n </div>\n )}\n </div>\n );\n };\n\n return (\n <div className=\"space-y-2\">\n {children.length > 0 && (\n <div className=\"space-y-1\">{children.map(renderBlock)}</div>\n )}\n\n {canAddChildren && (\n <div style={{ marginLeft: depth * indentWidth }}>\n <button\n type=\"button\"\n onClick={() => setShowAddModal(true)}\n className=\"flex items-center gap-1 px-2 py-1 text-xs font-medium text-[var(--kyro-primary)] hover:bg-[var(--kyro-surface-accent)] rounded transition-colors\"\n >\n <Plus className=\"w-3 h-3\" />\n Add Block\n </button>\n\n <BlockDrawer\n open={showAddModal}\n onClose={() => setShowAddModal(false)}\n onSelect={handleAddChild}\n >\n {blockCategories.map((category) => (\n <div key={category.title} className=\"mb-4\">\n <h3 className=\"text-xs font-semibold text-[var(--kyro-text-muted)] tracking-wide mb-2\">\n {category.title}\n </h3>\n <div className=\"grid grid-cols-3 gap-2\">\n {category.blocks.map((block) => (\n <button\n key={block.type}\n type=\"button\"\n onClick={() => {\n handleAddChild(block.type);\n setShowAddModal(false);\n }}\n className=\"flex flex-col items-center text-center gap-1 p-2 rounded-md border border-[var(--kyro-border)] hover:border-[var(--kyro-primary)]/60 hover:bg-[var(--kyro-surface-accent)]/30 transition-all cursor-pointer group\"\n >\n <div className=\"w-6 h-6 flex items-center justify-center rounded group-hover:bg-[var(--kyro-primary)]/10 group-hover:text-[var(--kyro-primary)] transition-all\">\n {blockIcons[block.icon]}\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-xs font-medium tracking-tight text-[var(--kyro-text-primary)]\">\n {block.label}\n </div>\n <div className=\"text-[10px] text-[var(--kyro-text-muted)] mt-0.5\">\n {block.description}\n </div>\n </div>\n </button>\n ))}\n </div>\n </div>\n ))}\n </BlockDrawer>\n </div>\n )}\n\n {children.length === 0 && canAddChildren && (\n <div\n className=\"text-xs text-[var(--kyro-text-muted)] italic py-2\"\n style={{ marginLeft: depth * indentWidth }}\n >\n No blocks added. Click \"Add Block\" to add elements.\n </div>\n )}\n\n {depth >= maxDepth && children.length > 0 && (\n <div\n className=\"text-xs text-[var(--kyro-text-muted)] italic\"\n style={{ marginLeft: depth * indentWidth }}\n >\n Maximum nesting level ({maxDepth}) reached\n </div>\n )}\n </div>\n );\n};\n","import React from \"react\";\nimport { ChevronRight } from \"../ui/icons\";\nimport {\n useBlockById,\n useBlockActions,\n} from \"../fields/extensions/blocksStore\";\nimport { SlidePanel } from \"../ui/SlidePanel\";\nimport { ChildBlocksTree } from \"./ChildBlocksTree\";\nimport { UploadField } from \"../fields/UploadField\";\nimport PortableTextField from \"../fields/PortableTextField\";\nimport {\n CodeField,\n LinkField,\n AccordionField,\n ButtonField,\n HeadingField,\n VideoField,\n ListField,\n HeroField,\n ArrayField,\n ChildrenField,\n ColumnsField,\n RelationshipBlockField,\n} from \"../fields\";\n\ninterface BlockEditModalProps {\n block: Record<string, unknown>;\n onClose: () => void;\n}\n\n// @MARKER: BlockEditModal with children - 2026-04-29\n// If you want to revert, check git history for previous version\n\nexport const BlockEditModal: React.FC<BlockEditModalProps> = ({\n block,\n onClose,\n}) => {\n const blockData = useBlockById(block.id);\n const { updateBlock } = useBlockActions();\n const data = blockData?.data || block.data || {};\n const children = blockData?.children || block.children || [];\n\n const handleChange = (field: string, value: unknown) => {\n updateBlock(block.id, { data: { ...data, [field]: value } });\n };\n\n const handleUpdateChildren = (newChildren: Record<string, unknown>[]) => {\n updateBlock(block.id, { children: newChildren });\n };\n\n const handleUpdateColumnChildren = (\n columnIndex: number,\n newChildren: Record<string, unknown>[],\n ) => {\n const columnData = data.columnData || [];\n const newColumnData = [...columnData];\n newColumnData[columnIndex] = {\n ...newColumnData[columnIndex],\n children: newChildren,\n };\n updateBlock(block.id, { data: { ...data, columnData: newColumnData } });\n };\n\n const renderFields = () => {\n switch (block.type) {\n case \"heading\":\n return (\n <HeadingField\n text={data.text || \"\"}\n onChange={handleChange}\n compact\n />\n );\n\n case \"paragraph\":\n return (\n <div className=\"space-y-3\">\n <textarea\n value={data.text || \"\"}\n onChange={(e) => handleChange(\"text\", e.target.value)}\n className=\"w-full px-3 py-3 border border-[var(--kyro-border)] rounded bg-[var(--kyro-bg-secondary)] text-[var(--kyro-text-primary)] text-sm min-h-[150px] resize-y focus:outline-none focus:ring-1 focus:ring-[var(--kyro-sidebar-active)] focus:border-transparent\"\n placeholder=\"Enter paragraph text...\"\n />\n </div>\n );\n\n case \"richtext\":\n return (\n <div className=\"space-y-3\">\n <PortableTextField\n field={{ name: \"richtext\", label: \"Content\" }}\n value={data.content}\n onChange={(value: unknown) => handleChange(\"content\", value)}\n />\n </div>\n );\n\n case \"image\":\n return (\n <div className=\"space-y-4\">\n <UploadField\n field={{ label: \"Image\", name: \"image\", maxCount: 1 }}\n value={data.src}\n onChange={(value) => handleChange(\"src\", value)}\n />\n <div>\n <label className=\"text-xs font-medium text-[var(--kyro-text-muted)] mb-1 block\">\n Alt Text\n </label>\n <input\n type=\"text\"\n value={data.alt || \"\"}\n onChange={(e) => handleChange(\"alt\", e.target.value)}\n className=\"w-full px-3 py-2 border border-[var(--kyro-border)] rounded bg-[var(--kyro-bg-secondary)] text-sm text-[var(--kyro-text-primary)] focus:outline-none focus:ring-1 focus:ring-[var(--kyro-sidebar-active)] focus:border-transparent\"\n placeholder=\"Description for accessibility...\"\n />\n </div>\n </div>\n );\n\n case \"video\":\n return (\n <VideoField\n src={data.src || \"\"}\n title={data.title || \"\"}\n onChange={handleChange}\n compact\n />\n );\n\n case \"link\":\n return (\n <div className=\"space-y-3\">\n <LinkField\n text={data.text || \"\"}\n url={data.url || \"\"}\n onChange={handleChange}\n compact\n />\n </div>\n );\n\n case \"button\":\n return (\n <ButtonField\n text={data.text || \"Button\"}\n url={data.url || \"\"}\n onChange={handleChange}\n compact\n />\n );\n\n case \"list\":\n return (\n <ListField\n items={Array.isArray(data.items) ? data.items : []}\n onChange={(items) => handleChange(\"items\", items)}\n compact\n />\n );\n\n case \"code\":\n const languages = [\n { value: \"plaintext\", label: \"Text\", icon: \"📄\" },\n { value: \"javascript\", label: \"JS\", icon: \"🟨\" },\n { value: \"typescript\", label: \"TS\", icon: \"🔷\" },\n { value: \"python\", label: \"PY\", icon: \"🐍\" },\n { value: \"html\", label: \"HTML\", icon: \"🌐\" },\n { value: \"css\", label: \"CSS\", icon: \"🎨\" },\n { value: \"json\", label: \"JSON\", icon: \"📋\" },\n ];\n return (\n <div className=\"space-y-4\">\n <CodeField\n field={{\n type: \"code\",\n name: \"code\",\n label: \"Snippet\",\n language: data.language || \"javascript\",\n }}\n value={data.code || \"\"}\n onChange={(val) => handleChange(\"code\", val)}\n />\n\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <label className=\"text-[10px] font-bold tracking-widest text-[var(--kyro-text-muted)] mb-1.5 block\">\n Language\n </label>\n <div className=\"relative\">\n <select\n value={data.language || \"javascript\"}\n onChange={(e) => handleChange(\"language\", e.target.value)}\n className=\"w-full pl-3 pr-10 py-2.5 bg-[var(--kyro-bg-secondary)] border border-[var(--kyro-border)] rounded-xl text-xs font-medium text-[var(--kyro-text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--kyro-primary)]/20 transition-all appearance-none cursor-pointer\"\n >\n <option value=\"plaintext\">Plain Text</option>\n <option value=\"javascript\">JS</option>\n <option value=\"typescript\">TS</option>\n <option value=\"python\">PY</option>\n <option value=\"html\">HTML</option>\n <option value=\"css\">CSS</option>\n <option value=\"json\">JSON</option>\n <option value=\"rust\">Rust</option>\n </select>\n <div className=\"absolute right-3 top-1/2 -translate-y-1/2 pointer-events-none text-[var(--kyro-text-muted)]\">\n <ChevronRight className=\"w-4 h-4 rotate-90\" />\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n\n case \"file\":\n return (\n <UploadField\n field={{ label: \"File\", name: \"file\", maxCount: 1 }}\n value={data.file}\n onChange={(value) => handleChange(\"file\", value)}\n />\n );\n\n case \"relationship\":\n return (\n <RelationshipBlockField\n relationTo={data.relationTo || \"pages\"}\n hasMany={data.hasMany || false}\n selectedIds={\n Array.isArray(data.selectedIds) ? data.selectedIds : []\n }\n selectedId={data.selectedId}\n labelField={data.labelField || \"title\"}\n onChange={handleChange}\n />\n );\n\n case \"hero\":\n return (\n <div className=\"space-y-3\">\n <HeroField\n heading={data.heading || \"\"}\n subheading={data.subheading || \"\"}\n ctaText={data.ctaText || \"\"}\n ctaUrl={data.ctaUrl || \"\"}\n onChange={handleChange}\n compact\n />\n\n <div className=\"grid grid-cols-2 gap-2\">\n <UploadField\n field={{ label: \"Background\", name: \"bgImage\", maxCount: 1 }}\n value={data.bgImage}\n onChange={(v) => handleChange(\"bgImage\", v)}\n />\n <input\n type=\"url\"\n value={data.videoUrl || \"\"}\n onChange={(e) => handleChange(\"videoUrl\", e.target.value)}\n className=\"w-full px-2.5 py-1.5 border border-[var(--kyro-border)] rounded bg-[var(--kyro-bg-secondary)] text-sm text-[var(--kyro-text-primary)] focus:outline-none focus:ring-1 focus:ring-[var(--kyro-sidebar-active)] focus:border-transparent font-mono text-xs\"\n placeholder=\"Video URL...\"\n />\n </div>\n\n <div className=\"pt-2 border-t border-[var(--kyro-border)]\">\n <label className=\"text-[10px] font-medium text-[var(--kyro-text-muted)] mb-1.5 block\">\n Children ({children.length})\n </label>\n <ChildBlocksTree\n blockId={block.id}\n children={children}\n onUpdateChildren={handleUpdateChildren}\n />\n </div>\n </div>\n );\n\n case \"array\":\n return (\n <div className=\"space-y-3\">\n <ArrayField\n items={Array.isArray(data.items) ? data.items : []}\n onChange={(items) => handleChange(\"items\", items)}\n compact\n />\n <div className=\"pt-2 border-t border-[var(--kyro-border)]\">\n <label className=\"text-[10px] font-medium text-[var(--kyro-text-muted)] mb-1.5 block\">\n Children ({children.length})\n </label>\n <ChildBlocksTree\n blockId={block.id}\n children={children}\n onUpdateChildren={handleUpdateChildren}\n />\n </div>\n </div>\n );\n\n case \"accordion\":\n return (\n <AccordionField\n items={Array.isArray(data.items) ? data.items : []}\n onChange={(items) => handleChange(\"items\", items)}\n compact\n />\n );\n\n case \"vstack\":\n return (\n <ChildrenField\n blockId={block.id}\n children={children}\n onUpdateChildren={handleUpdateChildren}\n />\n );\n\n case \"columns\":\n return (\n <ColumnsField\n columns={data.columns || 2}\n columnData={data.columnData || []}\n onColumnsChange={(c) => {\n const columnData = data.columnData || [];\n const newColumnData = Array.from({ length: c }, (_, i) => ({\n id: i,\n children: columnData[i]?.children || [],\n }));\n updateBlock(block.id, {\n data: { ...data, columns: c, columnData: newColumnData },\n });\n }}\n onUpdateColumnChildren={handleUpdateColumnChildren}\n />\n );\n\n default:\n return (\n <div className=\"text-center py-8 text-[var(--kyro-text-muted)]\">\n No editor for \"{block.type}\"\n </div>\n );\n }\n };\n\n return (\n <SlidePanel\n open={true}\n onClose={onClose}\n title={`Edit ${block.type}`}\n width=\"xl\"\n >\n <div className=\"space-y-4\">{renderFields()}</div>\n <div className=\"mt-6 pt-4 border-t border-[var(--kyro-border)]\">\n <button\n type=\"button\"\n onClick={onClose}\n className=\"w-full py-2.5 bg-[var(--kyro-sidebar-active)] text-[var(--kyro-sidebar-text-active)] rounded-lg font-medium hover:opacity-90 transition-opacity\"\n >\n Done\n </button>\n </div>\n </SlidePanel>\n );\n};\n","import React from \"react\";\nimport { ChildBlocksTree } from \"../blocks/ChildBlocksTree\";\n\ninterface ColumnData {\n id: number;\n children: Record<string, unknown>[];\n}\n\ninterface ColumnsFieldProps {\n columns?: number;\n columnData?: ColumnData[];\n onColumnsChange: (columns: number) => void;\n onUpdateColumnChildren: (columnIndex: number, newChildren: Record<string, unknown>[]) => void;\n compact?: boolean;\n}\n\nexport const ColumnsField: React.FC<ColumnsFieldProps> = ({\n columns = 2,\n columnData = [],\n onColumnsChange,\n onUpdateColumnChildren,\n compact = false,\n}) => {\n const normalizedColumnData = Array.from({ length: columns }, (_, i) => ({\n id: i,\n children: columnData[i]?.children || [],\n }));\n\n if (compact) {\n return (\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs font-medium text-[var(--kyro-text-muted)]\">\n Columns:\n </span>\n <div className=\"flex items-center gap-0.5 bg-[var(--kyro-surface-accent)] rounded-lg p-0.5\">\n {Array.from({ length: 6 }, (_, i) => i + 1).map((n) => (\n <button\n key={n}\n type=\"button\"\n onClick={() => onColumnsChange(n)}\n className={`px-2.5 py-1 rounded-md text-xs font-medium transition-all ${\n columns === n\n ? \"bg-[var(--kyro-sidebar-active)] text-[var(--kyro-sidebar-text-active)] shadow-sm\"\n : \"text-[var(--kyro-text-secondary)] hover:text-[var(--kyro-text-primary)]\"\n }`}\n >\n {n}\n </button>\n ))}\n </div>\n </div>\n <div className=\"overflow-x-auto pb-1\">\n <div className=\"flex gap-2 min-w-fit\">\n {normalizedColumnData.map((col, i) => (\n <div\n key={i}\n className=\"w-[180px] border-2 border-dashed border-[var(--kyro-border)] rounded-lg p-2\"\n >\n <div className=\"flex items-center justify-between mb-1.5 pb-1 border-b border-[var(--kyro-border)]\">\n <span className=\"text-[10px] font-medium text-[var(--kyro-text-muted)]\">\n Col {i + 1}\n </span>\n <span className=\"text-[10px] text-[var(--kyro-text-muted)]\">\n {col.children.length}\n </span>\n </div>\n <ChildBlocksTree\n blockId={`col-${i}`}\n children={col.children}\n onUpdateChildren={(c) => onUpdateColumnChildren(i, c)}\n />\n </div>\n ))}\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs font-medium text-[var(--kyro-text-muted)]\">\n Columns:\n </span>\n <div className=\"flex items-center gap-0.5 bg-[var(--kyro-surface-accent)] rounded-lg p-0.5\">\n {Array.from({ length: 6 }, (_, i) => i + 1).map((n) => (\n <button\n key={n}\n type=\"button\"\n onClick={() => onColumnsChange(n)}\n className={`px-3 py-1.5 rounded-md text-xs font-medium transition-all ${\n columns === n\n ? \"bg-[var(--kyro-sidebar-active)] text-[var(--kyro-sidebar-text-active)] shadow-sm\"\n : \"text-[var(--kyro-text-secondary)] hover:text-[var(--kyro-text-primary)]\"\n }`}\n >\n {n}\n </button>\n ))}\n </div>\n </div>\n <div className=\"overflow-x-auto pb-2\">\n <div\n className=\"grid gap-3 min-w-fit\"\n style={{\n gridTemplateColumns: `repeat(${columns}, minmax(200px, 1fr))`,\n }}\n >\n {normalizedColumnData.map((col, i) => (\n <div\n key={i}\n className=\"border-2 border-dashed border-[var(--kyro-border)] rounded-lg p-3\"\n >\n <div className=\"flex items-center justify-between mb-3 pb-2 border-b border-[var(--kyro-border)]\">\n <span className=\"text-xs font-medium text-[var(--kyro-text-primary)]\">\n Column {i + 1}\n </span>\n <span className=\"text-[10px] text-[var(--kyro-text-muted)]\">\n {col.children.length} blocks\n </span>\n </div>\n <ChildBlocksTree\n blockId={`col-${i}`}\n children={col.children}\n onUpdateChildren={(c) => onUpdateColumnChildren(i, c)}\n />\n </div>\n ))}\n </div>\n </div>\n </div>\n );\n};\n\nexport default ColumnsField;\n","import React from \"react\";\nimport { ChevronRight, X } from \"../ui/icons\";\nimport { useBlockActions } from \"../fields/extensions/blocksStore\";\n\ninterface BlockWrapperProps {\n id: string;\n type: string;\n label?: string;\n children: React.ReactNode;\n className?: string;\n}\n\nexport const BlockWrapper: React.FC<BlockWrapperProps> = ({\n id,\n type,\n label,\n children,\n className = \"\",\n}) => {\n const { moveBlock, removeBlock } = useBlockActions();\n\n return (\n <div className={`block-${type} border border-[var(--kyro-border)] rounded-md p-3 mb-2 relative group bg-[var(--kyro-surface)] transition-all hover:border-[var(--kyro-primary)]/30 ${className}`}>\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-[10px] font-bold text-[var(--kyro-text-muted)] tracking-wider\">\n {label || type}\n </span>\n <div className=\"flex gap-1 opacity-0 group-hover:opacity-100 transition-opacity\">\n <button\n type=\"button\"\n onClick={() => moveBlock(id, \"up\")}\n className=\"p-1 hover:bg-[var(--kyro-surface-accent)] rounded text-[var(--kyro-text-muted)] hover:text-[var(--kyro-primary)]\"\n title=\"Move up\"\n >\n <ChevronRight className=\"w-3 h-3 rotate-90\" />\n </button>\n <button\n type=\"button\"\n onClick={() => moveBlock(id, \"down\")}\n className=\"p-1 hover:bg-[var(--kyro-surface-accent)] rounded text-[var(--kyro-text-muted)] hover:text-[var(--kyro-primary)]\"\n title=\"Move down\"\n >\n <ChevronRight className=\"w-3 h-3\" />\n </button>\n <button\n type=\"button\"\n onClick={() => removeBlock(id)}\n className=\"p-1 hover:bg-[var(--kyro-error)]/10 rounded text-[var(--kyro-error)]\"\n title=\"Remove\"\n >\n <X className=\"w-3 h-3\" />\n </button>\n </div>\n </div>\n\n <div className=\"block-content\">\n {children}\n </div>\n </div>\n );\n};\n","import React from \"react\";\nimport {\n useBlockById,\n useBlockActions,\n} from \"../fields/extensions/blocksStore\";\nimport { ColumnsField } from \"../fields/ColumnsField\";\nimport { BlockWrapper } from \"./BlockWrapper\";\n\nexport const ColumnsBlock: React.FC<{ block: Record<string, unknown>; index: number }> = ({\n block,\n index,\n}) => {\n const blockData = useBlockById(block.id);\n const { updateBlock } = useBlockActions();\n\n const data = blockData?.data ?? block.data ?? {};\n const columns = data.columns || 2;\n const columnData = data.columnData || [];\n\n const handleColumnsChange = (newColumns: number) => {\n if (newColumns < 1 || newColumns > 6) return;\n const newColumnData = Array.from({ length: newColumns }, (_, i) => ({\n id: i,\n children: columnData[i]?.children || [],\n }));\n updateBlock(block.id, {\n data: { ...data, columns: newColumns, columnData: newColumnData },\n });\n };\n\n const handleUpdateColumnChildren = (\n columnIndex: number,\n newChildren: Record<string, unknown>[],\n ) => {\n const newColumnData = [...columnData];\n newColumnData[columnIndex] = {\n ...newColumnData[columnIndex],\n children: newChildren,\n };\n updateBlock(block.id, {\n data: { ...data, columnData: newColumnData },\n });\n };\n\n return (\n <BlockWrapper id={block.id} type=\"columns\" label=\"Columns\">\n <ColumnsField\n columns={columns}\n columnData={columnData}\n onColumnsChange={handleColumnsChange}\n onUpdateColumnChildren={handleUpdateColumnChildren}\n />\n </BlockWrapper>\n );\n};\n","import React from \"react\";\n\ninterface HeadingFieldProps {\n text?: string;\n onChange: (field: string, value: string) => void;\n compact?: boolean;\n}\n\nexport const HeadingField: React.FC<HeadingFieldProps> = ({\n text = \"\",\n onChange,\n compact = false,\n}) => {\n const inputClass = compact\n ? \"w-full px-2.5 py-1.5 border border-[var(--kyro-border)] rounded bg-[var(--kyro-bg-secondary)] text-sm text-[var(--kyro-text-primary)] focus:outline-none focus:ring-1 focus:ring-[var(--kyro-sidebar-active)] focus:border-transparent\"\n : \"w-full px-3 py-2.5 border border-[var(--kyro-border)] rounded-lg bg-[var(--kyro-bg-secondary)] text-sm text-[var(--kyro-text-primary)] focus:outline-none focus:ring-1 focus:ring-[var(--kyro-sidebar-active)] focus:border-transparent\";\n\n return (\n <div className={compact ? \"\" : \"space-y-3\"}>\n <input\n type=\"text\"\n value={text}\n onChange={(e) => onChange(\"text\", e.target.value)}\n className={inputClass}\n placeholder=\"Enter heading text...\"\n />\n </div>\n );\n};\n\nexport default HeadingField;\n","import React from \"react\";\nimport {\n useBlockById,\n useBlockActions,\n} from \"../fields/extensions/blocksStore\";\nimport { HeadingField } from \"../fields/HeadingField\";\nimport { BlockWrapper } from \"./BlockWrapper\";\n\nexport const HeadingBlock: React.FC<{ block: Record<string, unknown>; index: number }> = ({\n block,\n index,\n}) => {\n const blockData = useBlockById(block.id);\n const { updateBlock } = useBlockActions();\n\n const data = blockData?.data || block.data || {};\n\n const handleChange = (field: string, value: unknown) => {\n updateBlock(block.id, { data: { ...data, [field]: value } });\n };\n\n return (\n <BlockWrapper id={block.id} type=\"heading\" label=\"Heading\">\n <HeadingField text={data.text || \"\"} onChange={handleChange} compact />\n </BlockWrapper>\n );\n};\n","import React from \"react\";\nimport {\n useBlockById,\n useBlockActions,\n} from \"../fields/extensions/blocksStore\";\nimport { BlockWrapper } from \"./BlockWrapper\";\n\nexport const ParagraphBlock: React.FC<{ block: Record<string, unknown>; index: number }> = ({\n block,\n index,\n}) => {\n const blockData = useBlockById(block.id);\n const { updateBlock } = useBlockActions();\n\n const data = blockData?.data || block.data || {};\n\n const handleChange = (field: string, value: unknown) => {\n updateBlock(block.id, { data: { ...data, [field]: value } });\n };\n\n return (\n <BlockWrapper id={block.id} type=\"paragraph\" label=\"Paragraph\">\n <textarea\n value={data.text || \"\"}\n onChange={(e) => handleChange(\"text\", e.target.value)}\n className=\"w-full px-3 py-3 border border-[var(--kyro-border)] rounded bg-[var(--kyro-surface)] text-[var(--kyro-text-primary)] text-sm min-h-[100px] resize-none\"\n placeholder=\"Enter paragraph text...\"\n />\n </BlockWrapper>\n );\n};\n","import React from \"react\";\nimport {\n useBlockById,\n useBlockActions,\n} from \"../fields/extensions/blocksStore\";\nimport { ChevronRight, X } from \"../ui/icons\";\n\nexport const DividerBlock: React.FC<{ block: Record<string, unknown>; index: number }> = ({\n block,\n index,\n}) => {\n const blockData = useBlockById(block.id);\n const { updateBlock, removeBlock, moveBlock } = useBlockActions();\n const data = blockData?.data ?? block.data ?? {};\n const handleChange = (field: string, value: unknown) => {\n updateBlock(block.id, { data: { ...data, [field]: value } });\n };\n\n return (\n <div className=\"my-4\">\n <div className=\"border-t border-[var(--kyro-border)]\" />\n <div className=\"flex justify-between text-[var(--kyro-text-muted)] text-xs mt-1\">\n <span>Divider</span>\n <div className=\"flex gap-1 opacity-0 group-hover:opacity-100 transition-opacity\">\n <button type=\"button\"\n onClick={() => moveBlock(block.id, \"up\")}\n className=\"p-1 hover:bg-[var(--kyro-surface-accent)] rounded\"\n title=\"Move up\"\n >\n <ChevronRight className=\"w-3 h-3 rotate-90\" />\n </button>\n <button type=\"button\"\n onClick={() => removeBlock(block.id)}\n className=\"p-1 hover:bg-[var(--kyro-surface-accent)] rounded\"\n title=\"Remove\"\n >\n <X className=\"w-3 h-3\" />\n </button>\n </div>\n </div>\n </div>\n );\n};\n","import React from \"react\";\nimport {\n useBlockById,\n useBlockActions,\n} from \"../fields/extensions/blocksStore\";\nimport { ChevronRight, X } from \"../ui/icons\";\nimport { UploadField } from \"../fields/UploadField\";\n\nexport const ImageBlock: React.FC<{ block: Record<string, unknown>; index: number }> = ({\n block,\n index,\n}) => {\n const blockData = useBlockById(block.id);\n const { updateBlock, removeBlock, moveBlock } = useBlockActions();\n const data = blockData?.data || block.data || {};\n\n const handleChange = (field: string, value: unknown) => {\n updateBlock(block.id, { data: { ...data, [field]: value } });\n };\n\n return (\n <div className=\"block-image border border-[var(--kyro-border)] rounded-lg p-4 mb-4 relative group\">\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-xs font-semibold text-[var(--kyro-text-muted)] \">\n Image\n </span>\n <div className=\"flex gap-1 opacity-0 group-hover:opacity-100 transition-opacity\">\n <button type=\"button\"\n onClick={() => moveBlock(block.id, \"up\")}\n className=\"p-1 hover:bg-[var(--kyro-surface-accent)] rounded\"\n title=\"Move up\"\n >\n <ChevronRight className=\"w-3 h-3 rotate-90\" />\n </button>\n <button type=\"button\"\n onClick={() => removeBlock(block.id)}\n className=\"p-1 hover:bg-[var(--kyro-surface-accent)] rounded\"\n title=\"Remove\"\n >\n <X className=\"w-3 h-3\" />\n </button>\n </div>\n </div>\n <div className=\"space-y-3\">\n <div>\n <label className=\"text-xs font-medium text-[var(--kyro-text-muted)] mb-1 block\">\n Image Asset\n </label>\n <UploadField\n field={{ label: \"Image Asset\", name: \"src\", maxCount: 1 }}\n value={data.src}\n onChange={(value) => handleChange(\"src\", value)}\n />\n </div>\n <div>\n <label className=\"text-xs font-medium text-[var(--kyro-text-muted)] mb-1 block\">\n Alt Text\n </label>\n <input\n type=\"text\"\n value={data.alt || \"\"}\n onChange={(e) => handleChange(\"alt\", e.target.value)}\n className=\"w-full px-3 py-2 border border-[var(--kyro-border)] rounded bg-[var(--kyro-surface)] text-[var(--kyro-text-primary)] text-sm\"\n placeholder=\"Alternative text...\"\n />\n </div>\n <div>\n <label className=\"text-xs font-medium text-[var(--kyro-text-muted)] mb-1 block\">\n Caption\n </label>\n <input\n type=\"text\"\n value={data.caption || \"\"}\n onChange={(e) => handleChange(\"caption\", e.target.value)}\n className=\"w-full px-3 py-2 border border-[var(--kyro-border)] rounded bg-[var(--kyro-surface)] text-[var(--kyro-text-primary)] text-sm\"\n placeholder=\"Image caption...\"\n />\n </div>\n </div>\n </div>\n );\n};\n","import React from \"react\";\nimport { UploadField } from \"./UploadField\";\n\ninterface VideoFieldProps {\n src?: string;\n title?: string;\n onChange: (field: string, value: string) => void;\n onUploadChange?: (value: unknown) => void;\n compact?: boolean;\n}\n\nexport const VideoField: React.FC<VideoFieldProps> = ({\n src = \"\",\n title = \"\",\n onChange,\n onUploadChange,\n compact = false,\n}) => {\n const isExternalUrl =\n src.includes(\"youtube.com\") ||\n src.includes(\"vimeo.com\") ||\n src.includes(\"youtu.be\");\n\n if (compact) {\n return (\n <div className=\"space-y-2\">\n <input\n type=\"url\"\n value={src}\n onChange={(e) => onChange(\"src\", e.target.value)}\n className=\"w-full px-2.5 py-1.5 border border-[var(--kyro-border)] rounded bg-[var(--kyro-bg-secondary)] text-sm text-[var(--kyro-text-primary)] focus:outline-none focus:ring-1 focus:ring-[var(--kyro-sidebar-active)] focus:border-transparent font-mono text-xs\"\n placeholder=\"MP4 URL, YouTube, or Vimeo link...\"\n />\n <input\n type=\"text\"\n value={title}\n onChange={(e) => onChange(\"title\", e.target.value)}\n className=\"w-full px-2.5 py-1.5 border border-[var(--kyro-border)] rounded bg-[var(--kyro-bg-secondary)] text-sm text-[var(--kyro-text-primary)] focus:outline-none focus:ring-1 focus:ring-[var(--kyro-sidebar-active)] focus:border-transparent\"\n placeholder=\"Video title (optional)...\"\n />\n </div>\n );\n }\n\n return (\n <div className=\"space-y-3\">\n <UploadField\n field={{ label: \"Video Asset\", name: \"src\", maxCount: 1 }}\n value={src}\n onChange={onUploadChange || ((v) => onChange(\"src\", v))}\n />\n <span className=\"text-xs text-[var(--kyro-text-muted)]\">\n or paste a URL\n </span>\n <input\n type=\"url\"\n value={src}\n onChange={(e) => onChange(\"src\", e.target.value)}\n className=\"w-full px-3 py-2.5 border border-[var(--kyro-border)] rounded-lg bg-[var(--kyro-bg-secondary)] text-sm text-[var(--kyro-text-primary)] focus:outline-none focus:ring-1 focus:ring-[var(--kyro-sidebar-active)] focus:border-transparent font-mono text-xs\"\n placeholder=\"MP4 URL, YouTube, or Vimeo link...\"\n />\n <input\n type=\"text\"\n value={title}\n onChange={(e) => onChange(\"title\", e.target.value)}\n className=\"w-full px-3 py-2.5 border border-[var(--kyro-border)] rounded-lg bg-[var(--kyro-bg-secondary)] text-sm text-[var(--kyro-text-primary)] focus:outline-none focus:ring-1 focus:ring-[var(--kyro-sidebar-active)] focus:border-transparent\"\n placeholder=\"Video title (optional)...\"\n />\n </div>\n );\n};\n\nexport default VideoField;\n","import React from \"react\";\nimport {\n useBlockById,\n useBlockActions,\n} from \"../fields/extensions/blocksStore\";\nimport { ChevronRight, X } from \"../ui/icons\";\nimport { VideoField } from \"../fields/VideoField\";\n\nexport const VideoBlock: React.FC<{ block: Record<string, unknown>; index: number }> = ({\n block,\n index,\n}) => {\n const blockData = useBlockById(block.id);\n const { updateBlock, removeBlock, moveBlock } = useBlockActions();\n\n const data = blockData?.data ?? block.data ?? {};\n\n const handleChange = (field: string, value: unknown) => {\n updateBlock(block.id, { data: { ...data, [field]: value } });\n };\n\n return (\n <div className=\"block-video border border-[var(--kyro-border)] rounded-md p-3 mb-2 relative group\">\n <div className=\"flex items-center justify-between mb-1\">\n <span className=\"text-xs font-semibold text-[var(--kyro-text-muted)] \">\n Video\n </span>\n <div className=\"flex gap-1 opacity-0 group-hover:opacity-100 transition-opacity\">\n <button\n type=\"button\"\n onClick={() => moveBlock(block.id, \"up\")}\n className=\"p-1 hover:bg-[var(--kyro-surface-accent)] rounded\"\n title=\"Move up\"\n >\n <ChevronRight className=\"w-3 h-3 rotate-90\" />\n </button>\n <button\n type=\"button\"\n onClick={() => moveBlock(block.id, \"down\")}\n className=\"p-1 hover:bg-[var(--kyro-surface-accent)] rounded\"\n title=\"Move down\"\n >\n <ChevronRight className=\"w-3 h-3\" />\n </button>\n <button\n type=\"button\"\n onClick={() => removeBlock(block.id)}\n className=\"p-1 hover:bg-red-50 rounded text-red-500\"\n title=\"Remove\"\n >\n <X className=\"w-3 h-3\" />\n </button>\n </div>\n </div>\n\n <VideoField\n src={data.src || \"\"}\n title={data.title || \"\"}\n onChange={handleChange}\n onUploadChange={(v) => handleChange(\"src\", v)}\n compact\n />\n </div>\n );\n};\n","import React from \"react\";\n\ninterface ListFieldProps {\n items?: string[];\n onChange: (items: string[]) => void;\n compact?: boolean;\n}\n\nexport const ListField: React.FC<ListFieldProps> = ({\n items = [],\n onChange,\n compact = false,\n}) => {\n const [inputValue, setInputValue] = React.useState(\"\");\n\n const handleAdd = () => {\n if (inputValue.trim()) {\n onChange([...items, inputValue.trim()]);\n setInputValue(\"\");\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n handleAdd();\n }\n };\n\n const handleRemove = (index: number) => {\n onChange(items.filter((_, i) => i !== index));\n };\n\n const inputClass = compact\n ? \"w-full px-2.5 py-1.5 border border-[var(--kyro-border)] rounded bg-[var(--kyro-bg-secondary)] text-sm text-[var(--kyro-text-primary)] focus:outline-none focus:ring-1 focus:ring-[var(--kyro-sidebar-active)] focus:border-transparent\"\n : \"w-full px-3 py-2.5 border border-[var(--kyro-border)] rounded-lg bg-[var(--kyro-bg-secondary)] text-sm text-[var(--kyro-text-primary)] focus:outline-none focus:ring-1 focus:ring-[var(--kyro-sidebar-active)] focus:border-transparent\";\n\n return (\n <div className={compact ? \"space-y-1.5\" : \"space-y-2\"}>\n {items.length === 0 ? (\n <div className=\"text-center py-4 text-[var(--kyro-text-muted)] text-sm border border-dashed border-[var(--kyro-border)] rounded-lg\">\n No items. Type below to add.\n </div>\n ) : (\n <div className=\"space-y-1\">\n {items.map((item, index) => (\n <div key={index} className=\"flex items-center gap-2 group/item\">\n <span className=\"text-sm text-[var(--kyro-text-primary)] flex-1\">\n • {item}\n </span>\n <button\n type=\"button\"\n onClick={() => handleRemove(index)}\n className=\"opacity-0 group-hover/item:opacity-100 p-1 hover:bg-[var(--kyro-danger-bg)] rounded text-[var(--kyro-error)] transition-opacity\"\n >\n ×\n </button>\n </div>\n ))}\n </div>\n )}\n <input\n type=\"text\"\n value={inputValue}\n onChange={(e) => setInputValue(e.target.value)}\n onKeyDown={handleKeyDown}\n className={inputClass}\n placeholder=\"Type and press Enter to add...\"\n />\n </div>\n );\n};\n\nexport default ListField;\n","import React from \"react\";\nimport {\n useBlockById,\n useBlockActions,\n} from \"../fields/extensions/blocksStore\";\nimport { ChevronRight, X } from \"../ui/icons\";\nimport { ListField } from \"../fields/ListField\";\n\nexport const ListBlock: React.FC<{ block: Record<string, unknown>; index: number }> = ({\n block,\n index,\n}) => {\n const blockData = useBlockById(block.id);\n const { updateBlock, removeBlock, moveBlock } = useBlockActions();\n\n const data = blockData?.data || block.data || {};\n const listItems = Array.isArray(data.items) ? data.items : [];\n\n const handleChange = (items: string[]) => {\n updateBlock(block.id, { data: { ...data, items } });\n };\n\n return (\n <div className=\"block-list border border-[var(--kyro-border)] rounded-md p-3 mb-2 relative group\">\n <div className=\"flex items-center justify-between mb-1\">\n <span className=\"text-xs font-semibold text-[var(--kyro-text-muted)] \">\n List\n </span>\n <div className=\"flex gap-1 opacity-0 group-hover:opacity-100 transition-opacity\">\n <button\n type=\"button\"\n onClick={() => moveBlock(block.id, \"up\")}\n className=\"p-1 hover:bg-[var(--kyro-surface-accent)] rounded\"\n title=\"Move up\"\n >\n <ChevronRight className=\"w-3 h-3 rotate-90\" />\n </button>\n <button\n type=\"button\"\n onClick={() => moveBlock(block.id, \"down\")}\n className=\"p-1 hover:bg-[var(--kyro-surface-accent)] rounded\"\n title=\"Move down\"\n >\n <ChevronRight className=\"w-3 h-3\" />\n </button>\n <button\n type=\"button\"\n onClick={() => removeBlock(block.id)}\n className=\"p-1 hover:bg-red-50 rounded text-red-500\"\n title=\"Remove\"\n >\n <X className=\"w-3 h-3\" />\n </button>\n </div>\n </div>\n\n <ListField items={listItems} onChange={handleChange} compact />\n </div>\n );\n};\n","import React from \"react\";\nimport {\n useBlockById,\n useBlockActions,\n} from \"../fields/extensions/blocksStore\";\nimport { ChevronRight, X, Code2 } from \"../ui/icons\";\nimport { CodeField } from \"../fields/CodeField\";\n\nexport const CodeBlock: React.FC<{ block: Record<string, unknown>; index: number }> = ({\n block,\n index,\n}) => {\n const blockData = useBlockById(block.id);\n const { updateBlock, removeBlock, moveBlock } = useBlockActions();\n const data = blockData?.data ?? block.data ?? {};\n\n const handleChange = (field: string, value: unknown) => {\n updateBlock(block.id, { data: { ...data, [field]: value } });\n };\n\n return (\n <div className=\"group/block relative border border-[var(--kyro-border)] rounded-2xl p-6 mb-6 transition-all duration-300 bg-[var(--kyro-surface)] hover:border-[var(--kyro-primary)]/20\">\n <div className=\"flex items-center justify-between mb-6\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-9 h-9 rounded-xl bg-[var(--kyro-primary)]/10 flex items-center justify-center text-[var(--kyro-primary)] transition-transform group-hover/block:scale-110\">\n <Code2 className=\"w-5 h-5\" />\n </div>\n <div>\n <h4 className=\"text-sm font-bold tracking-tight text-[var(--kyro-text-primary)]\">Code Snippet</h4>\n <p className=\"text-[10px] font-medium text-[var(--kyro-text-muted)] tracking-widest\">\n Block Editor • {data.language || \"javascript\"}\n </p>\n </div>\n </div>\n\n <div className=\"flex items-center gap-1.5 opacity-0 group-hover/block:opacity-100 transition-all translate-x-2 group-hover/block:translate-x-0\">\n <div className=\"flex bg-[var(--kyro-surface-accent)]/50 p-1 rounded-xl border border-[var(--kyro-border)]\">\n <button\n type=\"button\"\n onClick={() => moveBlock(block.id, \"up\")}\n className=\"p-1.5 hover:bg-[var(--kyro-surface)] rounded-lg transition-all text-[var(--kyro-text-muted)] hover:text-[var(--kyro-primary)]\"\n title=\"Move up\"\n >\n <ChevronRight className=\"w-4 h-4 rotate-[-90deg]\" />\n </button>\n <div className=\"w-px h-4 bg-[var(--kyro-border)] mx-1 self-center\" />\n <button\n type=\"button\"\n onClick={() => removeBlock(block.id)}\n className=\"p-1.5 hover:bg-red-500/10 rounded-lg transition-all text-[var(--kyro-text-muted)] hover:text-red-500\"\n title=\"Remove\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n </div>\n\n <div className=\"space-y-6\">\n <CodeField\n field={{\n type: \"code\",\n name: \"code\",\n label: \"Source Code\",\n language: data.language || \"javascript\"\n }}\n value={data.code || \"\"}\n onChange={(val) => handleChange(\"code\", val)}\n />\n\n <div className=\"flex items-center gap-4 bg-[var(--kyro-surface-accent)]/20 p-4 rounded-xl border border-[var(--kyro-border)]/50\">\n <div className=\"flex-1\">\n <label className=\"text-[10px] font-bold tracking-widest text-[var(--kyro-text-muted)] mb-2 block\">\n Syntax Highlighting\n </label>\n <div className=\"relative\">\n <select\n value={data.language || \"javascript\"}\n onChange={(e) => handleChange(\"language\", e.target.value)}\n className=\"w-full pl-4 pr-10 py-2.5 bg-[var(--kyro-surface)] border border-[var(--kyro-border)] rounded-xl text-xs font-medium text-[var(--kyro-text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--kyro-primary)]/20 focus:border-[var(--kyro-primary)] transition-all appearance-none cursor-pointer\"\n >\n <option value=\"plaintext\">Plain Text</option>\n <option value=\"javascript\">JavaScript</option>\n <option value=\"typescript\">TypeScript</option>\n <option value=\"python\">Python</option>\n <option value=\"json\">JSON</option>\n <option value=\"html\">HTML</option>\n <option value=\"css\">CSS</option>\n <option value=\"sql\">SQL</option>\n <option value=\"rust\">Rust</option>\n <option value=\"markdown\">Markdown</option>\n </select>\n <div className=\"absolute right-3 top-1/2 -translate-y-1/2 pointer-events-none text-[var(--kyro-text-muted)]\">\n <ChevronRight className=\"w-4 h-4 rotate-90\" />\n </div>\n </div>\n </div>\n\n <div className=\"hidden sm:block w-px h-10 bg-[var(--kyro-border)]\" />\n\n <div className=\"hidden sm:flex flex-col justify-center\">\n <span className=\"text-[10px] font-bold tracking-widest text-[var(--kyro-text-muted)] mb-2\">\n Status\n </span>\n <div className=\"flex items-center gap-2 px-3 py-2 bg-[var(--kyro-surface)] border border-[var(--kyro-border)] rounded-xl\">\n <div className=\"w-2 h-2 rounded-full bg-blue-500 animate-pulse\" />\n <span className=\"text-[10px] font-medium text-[var(--kyro-text-primary)] tracking-wide\">EDITING</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n};\n","import React from \"react\";\nimport { ExternalLink } from \"../ui/icons\";\n\ninterface LinkFieldProps {\n text?: string;\n url?: string;\n onChange: (field: string, value: string) => void;\n compact?: boolean;\n}\n\nexport const LinkField: React.FC<LinkFieldProps> = ({\n text = \"\",\n url = \"\",\n onChange,\n compact = false,\n}) => {\n return (\n <div className={compact ? \"flex items-center gap-2\" : \"space-y-2\"}>\n {compact ? (\n <>\n <input\n type=\"text\"\n value={text}\n onChange={(e) => onChange(\"text\", e.target.value)}\n className=\"flex-1 min-w-0 px-2.5 py-1.5 border border-[var(--kyro-border)] rounded bg-[var(--kyro-bg-secondary)] text-sm text-[var(--kyro-text-primary)] focus:outline-none focus:ring-1 focus:ring-[var(--kyro-sidebar-active)] focus:border-transparent\"\n placeholder=\"Link text...\"\n />\n <span className=\"text-[var(--kyro-text-muted)] text-xs\">→</span>\n <input\n type=\"url\"\n value={url}\n onChange={(e) => onChange(\"url\", e.target.value)}\n className=\"flex-1 min-w-0 px-2.5 py-1.5 border border-[var(--kyro-border)] rounded bg-[var(--kyro-bg-secondary)] text-sm text-[var(--kyro-text-primary)] focus:outline-none focus:ring-1 focus:ring-[var(--kyro-sidebar-active)] focus:border-transparent font-mono text-xs\"\n placeholder=\"https://...\"\n />\n {text && url && (\n <a\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"shrink-0 p-1.5 rounded text-[var(--kyro-text-muted)] hover:text-[var(--kyro-primary)] hover:bg-[var(--kyro-surface-accent)] transition-colors\"\n title={url}\n >\n <ExternalLink className=\"w-3.5 h-3.5\" />\n </a>\n )}\n </>\n ) : (\n <>\n <input\n type=\"text\"\n value={text}\n onChange={(e) => onChange(\"text\", e.target.value)}\n className=\"w-full px-3 py-2.5 border border-[var(--kyro-border)] rounded-lg bg-[var(--kyro-bg-secondary)] text-sm text-[var(--kyro-text-primary)] focus:outline-none focus:ring-1 focus:ring-[var(--kyro-sidebar-active)] focus:border-transparent\"\n placeholder=\"Link text...\"\n />\n <input\n type=\"url\"\n value={url}\n onChange={(e) => onChange(\"url\", e.target.value)}\n className=\"w-full px-3 py-2.5 border border-[var(--kyro-border)] rounded-lg bg-[var(--kyro-bg-secondary)] text-sm text-[var(--kyro-text-primary)] focus:outline-none focus:ring-1 focus:ring-[var(--kyro-sidebar-active)] focus:border-transparent font-mono text-xs\"\n placeholder=\"https://...\"\n />\n {text && url && (\n <a\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"p-2 rounded-lg text-[var(--kyro-text-muted)] hover:text-[var(--kyro-primary)] hover:bg-[var(--kyro-surface-accent)] transition-colors\"\n title={url}\n >\n <ExternalLink className=\"w-4 h-4\" />\n </a>\n )}\n </>\n )}\n </div>\n );\n};\n\nexport default LinkField;\n","import React from \"react\";\nimport {\n useBlockById,\n useBlockActions,\n} from \"../fields/extensions/blocksStore\";\nimport { ChevronRight, X } from \"../ui/icons\";\nimport { LinkField } from \"../fields/LinkField\";\n\nexport const LinkBlock: React.FC<{ block: Record<string, unknown>; index: number }> = ({\n block,\n index,\n}) => {\n const blockData = useBlockById(block.id);\n const { updateBlock, removeBlock, moveBlock } = useBlockActions();\n\n const data = blockData?.data ?? block.data ?? {};\n\n const handleChange = (field: string, value: unknown) => {\n updateBlock(block.id, { data: { ...data, [field]: value } });\n };\n\n return (\n <div className=\"block-link border border-[var(--kyro-border)] rounded-md p-2.5 mb-2 relative group\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-[10px] font-bold text-[var(--kyro-text-muted)] shrink-0 w-8\">\n Link\n </span>\n <div className=\"flex-1 min-w-0\">\n <LinkField\n text={data.text || \"\"}\n url={data.url || \"\"}\n onChange={handleChange}\n compact\n />\n </div>\n <div className=\"flex gap-0.5 shrink-0 opacity-0 group-hover:opacity-100 transition-opacity\">\n <button\n type=\"button\"\n onClick={() => moveBlock(block.id, \"up\")}\n className=\"p-1 hover:bg-[var(--kyro-surface-accent)] rounded\"\n title=\"Move up\"\n >\n <ChevronRight className=\"w-3 h-3 rotate-90\" />\n </button>\n <button\n type=\"button\"\n onClick={() => moveBlock(block.id, \"down\")}\n className=\"p-1 hover:bg-[var(--kyro-surface-accent)] rounded\"\n title=\"Move down\"\n >\n <ChevronRight className=\"w-3 h-3\" />\n </button>\n <button\n type=\"button\"\n onClick={() => removeBlock(block.id)}\n className=\"p-1 hover:bg-red-50 rounded text-red-500\"\n title=\"Remove\"\n >\n <X className=\"w-3 h-3\" />\n </button>\n </div>\n </div>\n </div>\n );\n};\n","import React from \"react\";\nimport {\n useBlockById,\n useBlockActions,\n} from \"../fields/extensions/blocksStore\";\nimport { ChevronRight, X } from \"../ui/icons\";\nimport { UploadField } from \"../fields/UploadField\";\n\nexport const FileBlock: React.FC<{ block: Record<string, unknown>; index: number }> = ({\n block,\n index,\n}) => {\n const blockData = useBlockById(block.id);\n const { updateBlock, removeBlock, moveBlock } = useBlockActions();\n\n const data = blockData?.data ?? block.data ?? {};\n\n const handleChange = (field: string, value: unknown) => {\n updateBlock(block.id, { data: { ...data, [field]: value } });\n };\n\n return (\n <div className=\"block-file border border-[var(--kyro-border)] rounded-md p-3 mb-2 relative group\">\n <div className=\"flex items-center justify-between mb-1\">\n <span className=\"text-xs font-semibold text-[var(--kyro-text-muted)] \">\n File\n </span>\n <div className=\"flex gap-1 opacity-0 group-hover:opacity-100 transition-opacity\">\n <button\n type=\"button\"\n onClick={() => moveBlock(block.id, \"up\")}\n className=\"p-1 hover:bg-[var(--kyro-surface-accent)] rounded\"\n title=\"Move up\"\n >\n <ChevronRight className=\"w-3 h-3 rotate-90\" />\n </button>\n <button\n type=\"button\"\n onClick={() => moveBlock(block.id, \"down\")}\n className=\"p-1 hover:bg-[var(--kyro-surface-accent)] rounded\"\n title=\"Move down\"\n >\n <ChevronRight className=\"w-3 h-3\" />\n </button>\n <button\n type=\"button\"\n onClick={() => removeBlock(block.id)}\n className=\"p-1 hover:bg-red-50 rounded text-red-500\"\n title=\"Remove\"\n >\n <X className=\"w-3 h-3\" />\n </button>\n </div>\n </div>\n\n <UploadField\n field={{ label: \"File\", name: \"file\", maxCount: 1 }}\n value={data.file}\n onChange={(v) => handleChange(\"file\", v)}\n />\n </div>\n );\n};\n","import React from \"react\";\nimport { ChildBlocksTree } from \"../blocks/ChildBlocksTree\";\n\ninterface ChildrenFieldProps {\n blockId: string;\n children: Record<string, unknown>[];\n onUpdateChildren: (newChildren: Record<string, unknown>[]) => void;\n label?: string;\n compact?: boolean;\n}\n\nexport const ChildrenField: React.FC<ChildrenFieldProps> = ({\n blockId,\n children,\n onUpdateChildren,\n label,\n compact = false,\n}) => {\n if (compact) {\n return (\n <div className=\"pt-2 border-t border-[var(--kyro-border)]\">\n <label className=\"text-[10px] font-medium text-[var(--kyro-text-muted)] mb-1.5 block\">\n {label || `Children (${children.length})`}\n </label>\n <ChildBlocksTree\n blockId={blockId}\n children={children}\n onUpdateChildren={onUpdateChildren}\n />\n </div>\n );\n }\n\n return (\n <div className=\"pt-4 border-t border-[var(--kyro-border)]\">\n <label className=\"text-xs font-medium text-[var(--kyro-text-muted)] mb-2 block\">\n {label || `Children (${children.length})`}\n </label>\n <ChildBlocksTree\n blockId={blockId}\n children={children}\n onUpdateChildren={onUpdateChildren}\n />\n </div>\n );\n};\n\nexport default ChildrenField;\n","import React from \"react\";\nimport {\n useBlockById,\n useBlockActions,\n} from \"../fields/extensions/blocksStore\";\nimport { ChildrenField } from \"../fields/ChildrenField\";\nimport { BlockWrapper } from \"./BlockWrapper\";\n\nexport const VStackBlock: React.FC<{ block: Record<string, unknown>; index: number }> = ({\n block,\n index,\n}) => {\n const blockData = useBlockById(block.id);\n const { updateBlock } = useBlockActions();\n\n const data = blockData?.data ?? block.data ?? {};\n const children = blockData?.children ?? block.children ?? [];\n\n return (\n <BlockWrapper id={block.id} type=\"vstack\" label=\"Stack\">\n <ChildrenField\n blockId={block.id}\n children={children}\n onUpdateChildren={(c) => updateBlock(block.id, { children: c })}\n compact\n />\n </BlockWrapper>\n );\n};\n","import React from \"react\";\nimport { ExternalLink } from \"../ui/icons\";\n\ninterface ButtonFieldProps {\n text?: string;\n url?: string;\n onChange: (field: string, value: string) => void;\n compact?: boolean;\n}\n\nexport const ButtonField: React.FC<ButtonFieldProps> = ({\n text = \"Button\",\n url = \"\",\n onChange,\n compact = false,\n}) => {\n const inputClass = compact\n ? \"flex-1 px-2.5 py-1.5 border border-[var(--kyro-border)] rounded bg-[var(--kyro-bg-secondary)] text-sm text-[var(--kyro-text-primary)] focus:outline-none focus:ring-1 focus:ring-[var(--kyro-sidebar-active)] focus:border-transparent\"\n : \"flex-1 px-3 py-2.5 border border-[var(--kyro-border)] rounded-lg bg-[var(--kyro-bg-secondary)] text-sm text-[var(--kyro-text-primary)] focus:outline-none focus:ring-1 focus:ring-[var(--kyro-sidebar-active)] focus:border-transparent\";\n\n return (\n <div className=\"flex items-center gap-2\">\n <input\n type=\"text\"\n value={text}\n onChange={(e) => onChange(\"text\", e.target.value)}\n className={inputClass}\n placeholder=\"Button text...\"\n />\n <span className=\"text-[var(--kyro-text-muted)] text-xs\">→</span>\n <input\n type=\"url\"\n value={url}\n onChange={(e) => onChange(\"url\", e.target.value)}\n className={`${inputClass} font-mono text-xs`}\n placeholder=\"https://...\"\n />\n {text && url && (\n <a\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={`shrink-0 ${compact ? \"p-1.5\" : \"p-2\"} rounded text-[var(--kyro-text-muted)] hover:text-[var(--kyro-primary)] hover:bg-[var(--kyro-surface-accent)] transition-colors`}\n title={url}\n >\n <ExternalLink className={compact ? \"w-3.5 h-3.5\" : \"w-4 h-4\"} />\n </a>\n )}\n </div>\n );\n};\n\nexport default ButtonField;\n","import React from \"react\";\nimport {\n useBlockById,\n useBlockActions,\n} from \"../fields/extensions/blocksStore\";\nimport { ChevronRight, X } from \"../ui/icons\";\nimport { ButtonField } from \"../fields/ButtonField\";\n\nexport const ButtonBlock: React.FC<{ block: Record<string, unknown>; index: number }> = ({\n block,\n index,\n}) => {\n const blockData = useBlockById(block.id);\n const { updateBlock, removeBlock, moveBlock } = useBlockActions();\n\n const data = blockData?.data ?? block.data ?? {};\n\n const handleChange = (field: string, value: unknown) => {\n updateBlock(block.id, { data: { ...data, [field]: value } });\n };\n\n return (\n <div className=\"block-button border border-[var(--kyro-border)] rounded-md p-3 mb-2 relative group\">\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-xs font-semibold text-[var(--kyro-text-muted)] \">\n Button\n </span>\n <div className=\"flex gap-0.5 opacity-0 group-hover:opacity-100 transition-opacity\">\n <button\n type=\"button\"\n onClick={() => moveBlock(block.id, \"up\")}\n className=\"p-1 hover:bg-[var(--kyro-surface-accent)] rounded\"\n title=\"Move up\"\n >\n <ChevronRight className=\"w-3 h-3 rotate-90\" />\n </button>\n <button\n type=\"button\"\n onClick={() => moveBlock(block.id, \"down\")}\n className=\"p-1 hover:bg-[var(--kyro-surface-accent)] rounded\"\n title=\"Move down\"\n >\n <ChevronRight className=\"w-3 h-3\" />\n </button>\n <button\n type=\"button\"\n onClick={() => removeBlock(block.id)}\n className=\"p-1 hover:bg-red-50 rounded text-red-500\"\n title=\"Remove\"\n >\n <X className=\"w-3 h-3\" />\n </button>\n </div>\n </div>\n\n <ButtonField\n text={data.text || \"Button\"}\n url={data.url || \"\"}\n onChange={handleChange}\n compact\n />\n </div>\n );\n};\n","import React from \"react\";\nimport { ChevronDown, ChevronUp, Plus, X } from \"../ui/icons\";\n\ninterface AccordionItem {\n title: string;\n content: string;\n}\n\ninterface AccordionFieldProps {\n items?: AccordionItem[];\n onChange: (items: AccordionItem[]) => void;\n compact?: boolean;\n}\n\nexport const AccordionField: React.FC<AccordionFieldProps> = ({\n items = [],\n onChange,\n compact = false,\n}) => {\n const [openIndex, setOpenIndex] = React.useState<number | null>(0);\n\n const handleTitleChange = (index: number, value: string) => {\n const newItems = [...items];\n newItems[index] = { ...newItems[index], title: value };\n onChange(newItems);\n };\n\n const handleContentChange = (index: number, value: string) => {\n const newItems = [...items];\n newItems[index] = { ...newItems[index], content: value };\n onChange(newItems);\n };\n\n const handleRemove = (index: number) => {\n const newItems = items.filter((_, i) => i !== index);\n onChange(newItems);\n if (openIndex === index) setOpenIndex(null);\n else if (openIndex !== null && openIndex > index)\n setOpenIndex(openIndex - 1);\n };\n\n const handleAdd = () => {\n onChange([...items, { title: `Item ${items.length + 1}`, content: \"\" }]);\n setOpenIndex(items.length);\n };\n\n const baseInputClass =\n \"w-full px-3 py-2 border border-[var(--kyro-border)] rounded bg-[var(--kyro-bg-secondary)] text-sm text-[var(--kyro-text-primary)] focus:outline-none focus:ring-1 focus:ring-[var(--kyro-sidebar-active)] focus:border-transparent\";\n const smallInputClass =\n \"w-full px-2.5 py-1.5 border border-[var(--kyro-border)] rounded bg-[var(--kyro-bg-secondary)] text-sm text-[var(--kyro-text-primary)] focus:outline-none focus:ring-1 focus:ring-[var(--kyro-sidebar-active)] focus:border-transparent\";\n\n if (compact) {\n return (\n <div className=\"space-y-2\">\n {items.length === 0 ? (\n <div className=\"text-center py-4 text-[var(--kyro-text-muted)] text-sm border border-dashed border-[var(--kyro-border)] rounded-lg\">\n No items. Click \"Add Item\" to create one.\n </div>\n ) : (\n <div className=\"space-y-1.5\">\n {items.map((item: AccordionItem, index: number) => {\n const isOpen = openIndex === index;\n return (\n <div\n key={index}\n className=\"border border-[var(--kyro-border)] rounded-lg overflow-hidden group\"\n >\n <button\n type=\"button\"\n onClick={() => setOpenIndex(isOpen ? null : index)}\n className=\"w-full flex items-center justify-between p-2.5 bg-[var(--kyro-surface-accent)] hover:bg-[var(--kyro-sidebar-active)]/10 transition-colors\"\n >\n <span className=\"text-sm font-medium text-[var(--kyro-text-primary)] truncate\">\n {item.title || `Item ${index + 1}`}\n </span>\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n handleRemove(index);\n }}\n className=\"opacity-0 group-hover:opacity-100 p-1 hover:bg-[var(--kyro-danger-bg)] rounded text-[var(--kyro-error)] transition-opacity\"\n title=\"Remove\"\n >\n <X className=\"w-3.5 h-3.5\" />\n </button>\n {isOpen ? (\n <ChevronUp className=\"w-4 h-4 text-[var(--kyro-text-muted)]\" />\n ) : (\n <ChevronDown className=\"w-4 h-4 text-[var(--kyro-text-muted)]\" />\n )}\n </div>\n </button>\n {isOpen && (\n <div className=\"p-2.5 bg-[var(--kyro-surface)] space-y-2\">\n <input\n type=\"text\"\n value={item.title || \"\"}\n onChange={(e) =>\n handleTitleChange(index, e.target.value)\n }\n onClick={(e) => e.stopPropagation()}\n className={smallInputClass}\n placeholder=\"Item title...\"\n />\n <textarea\n value={item.content || \"\"}\n onChange={(e) =>\n handleContentChange(index, e.target.value)\n }\n onClick={(e) => e.stopPropagation()}\n className={`${smallInputClass} min-h-[60px] resize-none`}\n placeholder=\"Item content...\"\n />\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n <button\n type=\"button\"\n onClick={handleAdd}\n className=\"flex items-center justify-center gap-1.5 w-full px-3 py-2 text-xs font-medium rounded-lg border border-dashed border-[var(--kyro-border)] bg-[var(--kyro-surface-accent)] text-[var(--kyro-text-secondary)] hover:border-[var(--kyro-sidebar-active)] hover:text-[var(--kyro-text-primary)] transition-colors\"\n >\n <Plus className=\"w-3.5 h-3.5\" />\n Add Item\n </button>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-2\">\n {items.length === 0 ? (\n <div className=\"text-center py-4 text-[var(--kyro-text-muted)] text-sm border border-dashed border-[var(--kyro-border)] rounded-lg\">\n No items. Click \"Add Item\" to create one.\n </div>\n ) : (\n <div className=\"space-y-2\">\n {items.map((item: AccordionItem, index: number) => {\n const isOpen = openIndex === index;\n return (\n <div\n key={index}\n className=\"border border-[var(--kyro-border)] rounded-lg overflow-hidden group\"\n >\n <button\n type=\"button\"\n onClick={() => setOpenIndex(isOpen ? null : index)}\n className=\"w-full flex items-center justify-between p-3 bg-[var(--kyro-surface-accent)] hover:bg-[var(--kyro-sidebar-active)]/10 transition-colors\"\n >\n <span className=\"text-sm font-medium text-[var(--kyro-text-primary)] truncate\">\n {item.title || `Item ${index + 1}`}\n </span>\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n handleRemove(index);\n }}\n className=\"opacity-0 group-hover:opacity-100 p-1.5 hover:bg-[var(--kyro-danger-bg)] rounded text-[var(--kyro-error)] transition-opacity\"\n title=\"Remove\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n {isOpen ? (\n <ChevronUp className=\"w-4 h-4 text-[var(--kyro-text-muted)]\" />\n ) : (\n <ChevronDown className=\"w-4 h-4 text-[var(--kyro-text-muted)]\" />\n )}\n </div>\n </button>\n {isOpen && (\n <div className=\"p-3 bg-[var(--kyro-surface)] space-y-2\">\n <input\n type=\"text\"\n value={item.title || \"\"}\n onChange={(e) => handleTitleChange(index, e.target.value)}\n className={baseInputClass}\n placeholder=\"Item title...\"\n />\n <textarea\n value={item.content || \"\"}\n onChange={(e) =>\n handleContentChange(index, e.target.value)\n }\n className={`${baseInputClass} min-h-[60px] resize-none`}\n placeholder=\"Item content...\"\n />\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n <button\n type=\"button\"\n onClick={handleAdd}\n className=\"flex items-center justify-center gap-1.5 w-full px-3 py-2 text-xs font-medium rounded-lg border border-dashed border-[var(--kyro-border)] bg-[var(--kyro-surface-accent)] text-[var(--kyro-text-secondary)] hover:border-[var(--kyro-sidebar-active)] hover:text-[var(--kyro-text-primary)] transition-colors\"\n >\n <Plus className=\"w-3.5 h-3.5\" />\n Add Item\n </button>\n </div>\n );\n};\n\nexport default AccordionField;\n","import React from \"react\";\nimport {\n useBlockById,\n useBlockActions,\n} from \"../fields/extensions/blocksStore\";\nimport { ChevronRight, X } from \"../ui/icons\";\nimport { AccordionField } from \"../fields/AccordionField\";\n\nexport const AccordionBlock: React.FC<{ block: Record<string, unknown>; index: number }> = ({\n block,\n index,\n}) => {\n const blockData = useBlockById(block.id);\n const { updateBlock, removeBlock, moveBlock } = useBlockActions();\n\n const data = blockData?.data ?? block.data ?? {};\n const items = Array.isArray(data.items) ? data.items : [];\n\n const handleChange = (items: Record<string, unknown>[]) => {\n updateBlock(block.id, { data: { ...data, items } });\n };\n\n return (\n <div className=\"block-accordion border border-[var(--kyro-border)] rounded-md p-3 mb-2 relative group\">\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs font-semibold text-[var(--kyro-text-muted)] \">\n Accordion\n </span>\n <span className=\"text-[10px] text-[var(--kyro-text-muted)]\">\n ({items.length} items)\n </span>\n </div>\n <div className=\"flex gap-0.5 opacity-0 group-hover:opacity-100 transition-opacity\">\n <button\n type=\"button\"\n onClick={() => moveBlock(block.id, \"up\")}\n className=\"p-1 hover:bg-[var(--kyro-surface-accent)] rounded\"\n title=\"Move up\"\n >\n <ChevronRight className=\"w-3 h-3 rotate-90\" />\n </button>\n <button\n type=\"button\"\n onClick={() => moveBlock(block.id, \"down\")}\n className=\"p-1 hover:bg-[var(--kyro-surface-accent)] rounded\"\n title=\"Move down\"\n >\n <ChevronRight className=\"w-3 h-3\" />\n </button>\n <button\n type=\"button\"\n onClick={() => removeBlock(block.id)}\n className=\"p-1 hover:bg-red-50 rounded text-red-500\"\n title=\"Remove\"\n >\n <X className=\"w-3 h-3\" />\n </button>\n </div>\n </div>\n\n <AccordionField items={items} onChange={handleChange} compact />\n </div>\n );\n};\n","import React from \"react\";\nimport {\n useBlockById,\n useBlockActions,\n} from \"../fields/extensions/blocksStore\";\nimport { ChevronRight, X, AlignLeft } from \"../ui/icons\";\nimport PortableTextField from \"../fields/PortableTextField\";\n\nexport const RichTextBlock: React.FC<{ block: Record<string, unknown>; index: number }> = ({\n block,\n index,\n}) => {\n const blockData = useBlockById(block.id);\n const { updateBlock, removeBlock, moveBlock } = useBlockActions();\n\n const data = blockData?.data || block.data || {};\n\n const handleChange = (newValue: unknown) => {\n updateBlock(block.id, { data: { ...data, content: newValue } });\n };\n\n return (\n <div className=\"block-richtext border border-[var(--kyro-border)] rounded-md p-3 mb-2 relative group\">\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"flex items-center gap-2\">\n <AlignLeft className=\"w-3.5 h-3.5 text-[var(--kyro-primary)]\" />\n <span className=\"text-xs font-semibold text-[var(--kyro-text-muted)] \">\n Rich Text\n </span>\n </div>\n <div className=\"flex gap-0.5 opacity-0 group-hover:opacity-100 transition-opacity\">\n <button\n type=\"button\"\n onClick={() => moveBlock(block.id, \"up\")}\n className=\"p-1 hover:bg-[var(--kyro-surface-accent)] rounded\"\n title=\"Move up\"\n >\n <ChevronRight className=\"w-3 h-3 rotate-90\" />\n </button>\n <button\n type=\"button\"\n onClick={() => moveBlock(block.id, \"down\")}\n className=\"p-1 hover:bg-[var(--kyro-surface-accent)] rounded\"\n title=\"Move down\"\n >\n <ChevronRight className=\"w-3 h-3\" />\n </button>\n <button\n type=\"button\"\n onClick={() => removeBlock(block.id)}\n className=\"p-1 hover:bg-red-50 rounded text-red-500\"\n title=\"Remove\"\n >\n <X className=\"w-3 h-3\" />\n </button>\n </div>\n </div>\n\n <PortableTextField\n field={{ name: \"content\", label: \"Content\" }}\n value={data.content}\n onChange={handleChange}\n />\n </div>\n );\n};\n","import React from \"react\";\n\ninterface HeroFieldProps {\n heading?: string;\n subheading?: string;\n ctaText?: string;\n ctaUrl?: string;\n onChange: (field: string, value: string) => void;\n compact?: boolean;\n}\n\nexport const HeroField: React.FC<HeroFieldProps> = ({\n heading = \"\",\n subheading = \"\",\n ctaText = \"\",\n ctaUrl = \"\",\n onChange,\n compact = false,\n}) => {\n const inputClass = compact\n ? \"w-full px-2.5 py-1.5 border border-[var(--kyro-border)] rounded bg-[var(--kyro-bg-secondary)] text-sm text-[var(--kyro-text-primary)] focus:outline-none focus:ring-1 focus:ring-[var(--kyro-sidebar-active)] focus:border-transparent\"\n : \"w-full px-3 py-2.5 border border-[var(--kyro-border)] rounded-lg bg-[var(--kyro-bg-secondary)] text-sm text-[var(--kyro-text-primary)] focus:outline-none focus:ring-1 focus:ring-[var(--kyro-sidebar-active)] focus:border-transparent\";\n\n const textareaClass = compact\n ? \"w-full px-2.5 py-1.5 border border-[var(--kyro-border)] rounded bg-[var(--kyro-bg-secondary)] text-sm text-[var(--kyro-text-primary)] min-h-[50px] resize-none focus:outline-none focus:ring-1 focus:ring-[var(--kyro-sidebar-active)] focus:border-transparent\"\n : \"w-full px-3 py-2.5 border border-[var(--kyro-border)] rounded-lg bg-[var(--kyro-bg-secondary)] text-sm text-[var(--kyro-text-primary)] min-h-[80px] resize-none focus:outline-none focus:ring-1 focus:ring-[var(--kyro-sidebar-active)] focus:border-transparent\";\n\n if (compact) {\n return (\n <div className=\"space-y-2\">\n <input\n type=\"text\"\n value={heading}\n onChange={(e) => onChange(\"heading\", e.target.value)}\n className={`${inputClass} font-bold text-base`}\n placeholder=\"Hero heading...\"\n />\n <textarea\n value={subheading}\n onChange={(e) => onChange(\"subheading\", e.target.value)}\n className={textareaClass}\n placeholder=\"Hero subheading...\"\n />\n <div className=\"flex items-center gap-2\">\n <input\n type=\"text\"\n value={ctaText}\n onChange={(e) => onChange(\"ctaText\", e.target.value)}\n className=\"flex-1 px-2.5 py-1.5 border border-[var(--kyro-border)] rounded bg-[var(--kyro-bg-secondary)] text-sm text-[var(--kyro-text-primary)] focus:outline-none focus:ring-1 focus:ring-[var(--kyro-sidebar-active)] focus:border-transparent\"\n placeholder=\"CTA text...\"\n />\n <span className=\"text-[var(--kyro-text-muted)] text-xs\">→</span>\n <input\n type=\"url\"\n value={ctaUrl}\n onChange={(e) => onChange(\"ctaUrl\", e.target.value)}\n className=\"flex-1 px-2.5 py-1.5 border border-[var(--kyro-border)] rounded bg-[var(--kyro-bg-secondary)] text-sm text-[var(--kyro-text-primary)] focus:outline-none focus:ring-1 focus:ring-[var(--kyro-sidebar-active)] focus:border-transparent font-mono text-xs\"\n placeholder=\"https://...\"\n />\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-3\">\n <input\n type=\"text\"\n value={heading}\n onChange={(e) => onChange(\"heading\", e.target.value)}\n className={`${inputClass} font-bold text-base`}\n placeholder=\"Hero heading...\"\n />\n <textarea\n value={subheading}\n onChange={(e) => onChange(\"subheading\", e.target.value)}\n className={textareaClass}\n placeholder=\"Hero subheading...\"\n />\n <div className=\"flex items-center gap-2\">\n <input\n type=\"text\"\n value={ctaText}\n onChange={(e) => onChange(\"ctaText\", e.target.value)}\n className=\"flex-1 px-3 py-2.5 border border-[var(--kyro-border)] rounded-lg bg-[var(--kyro-bg-secondary)] text-sm text-[var(--kyro-text-primary)] focus:outline-none focus:ring-1 focus:ring-[var(--kyro-sidebar-active)] focus:border-transparent\"\n placeholder=\"CTA text...\"\n />\n <span className=\"text-[var(--kyro-text-muted)] text-xs\">→</span>\n <input\n type=\"url\"\n value={ctaUrl}\n onChange={(e) => onChange(\"ctaUrl\", e.target.value)}\n className=\"flex-1 px-3 py-2.5 border border-[var(--kyro-border)] rounded-lg bg-[var(--kyro-bg-secondary)] text-sm text-[var(--kyro-text-primary)] focus:outline-none focus:ring-1 focus:ring-[var(--kyro-sidebar-active)] focus:border-transparent font-mono text-xs\"\n placeholder=\"https://...\"\n />\n </div>\n </div>\n );\n};\n\nexport default HeroField;\n","import React from \"react\";\nimport {\n useBlockById,\n useBlockActions,\n} from \"../fields/extensions/blocksStore\";\nimport { ChevronRight, X } from \"../ui/icons\";\nimport { HeroField } from \"../fields/HeroField\";\nimport { UploadField } from \"../fields/UploadField\";\nimport { ChildBlocksTree } from \"./ChildBlocksTree\";\n\nexport const HeroBlock: React.FC<{ block: Record<string, unknown>; index: number }> = ({\n block,\n index,\n}) => {\n const blockData = useBlockById(block.id);\n const { updateBlock, removeBlock, moveBlock } = useBlockActions();\n\n const data = blockData?.data ?? block.data ?? {};\n const children = blockData?.children ?? block.children ?? [];\n\n const handleChange = (field: string, value: unknown) => {\n updateBlock(block.id, { data: { ...data, [field]: value } });\n };\n\n return (\n <div className=\"block-hero border border-[var(--kyro-border)] rounded-md p-3 mb-2 relative group\">\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs font-semibold text-[var(--kyro-text-muted)] \">\n Hero Section\n </span>\n </div>\n <div className=\"flex gap-0.5 opacity-0 group-hover:opacity-100 transition-opacity\">\n <button\n type=\"button\"\n onClick={() => moveBlock(block.id, \"up\")}\n className=\"p-1 hover:bg-[var(--kyro-surface-accent)] rounded\"\n title=\"Move up\"\n >\n <ChevronRight className=\"w-3 h-3 rotate-90\" />\n </button>\n <button\n type=\"button\"\n onClick={() => moveBlock(block.id, \"down\")}\n className=\"p-1 hover:bg-[var(--kyro-surface-accent)] rounded\"\n title=\"Move down\"\n >\n <ChevronRight className=\"w-3 h-3\" />\n </button>\n <button\n type=\"button\"\n onClick={() => removeBlock(block.id)}\n className=\"p-1 hover:bg-red-50 rounded text-red-500\"\n title=\"Remove\"\n >\n <X className=\"w-3 h-3\" />\n </button>\n </div>\n </div>\n\n <div className=\"space-y-3\">\n <HeroField\n heading={data.heading || \"\"}\n subheading={data.subheading || \"\"}\n ctaText={data.ctaText || \"\"}\n ctaUrl={data.ctaUrl || \"\"}\n onChange={handleChange}\n compact\n />\n\n <div className=\"grid grid-cols-2 gap-2\">\n <UploadField\n field={{ label: \"Background\", name: \"bgImage\", maxCount: 1 }}\n value={data.bgImage}\n onChange={(v) => handleChange(\"bgImage\", v)}\n />\n <input\n type=\"url\"\n value={data.videoUrl || \"\"}\n onChange={(e) => handleChange(\"videoUrl\", e.target.value)}\n className=\"w-full px-2.5 py-1.5 border border-[var(--kyro-border)] rounded bg-[var(--kyro-bg-secondary)] text-sm text-[var(--kyro-text-primary)] focus:outline-none focus:ring-1 focus:ring-[var(--kyro-sidebar-active)] focus:border-transparent font-mono text-xs\"\n placeholder=\"Video URL...\"\n />\n </div>\n\n <div className=\"pt-3 border-t border-[var(--kyro-border)]\">\n <label className=\"text-[10px] font-medium text-[var(--kyro-text-muted)] mb-1.5 block\">\n Children ({children.length})\n </label>\n <ChildBlocksTree\n blockId={block.id}\n children={children}\n onUpdateChildren={(c) => updateBlock(block.id, { children: c })}\n />\n </div>\n </div>\n </div>\n );\n};\n","import React from \"react\";\nimport { Plus, ChevronDown, ChevronUp, X } from \"../ui/icons\";\n\ninterface ArrayFieldItem {\n [key: string]: unknown;\n}\n\ninterface ArrayFieldProps {\n items?: ArrayFieldItem[];\n labelField?: string;\n onChange: (items: ArrayFieldItem[]) => void;\n compact?: boolean;\n}\n\nexport const ArrayField: React.FC<ArrayFieldProps> = ({\n items = [],\n labelField = \"title\",\n onChange,\n compact = false,\n}) => {\n const [openIndex, setOpenIndex] = React.useState<number | null>(0);\n\n const handleItemChange = (index: number, field: string, value: string) => {\n const newItems = [...items];\n newItems[index] = { ...newItems[index], [field]: value };\n onChange(newItems);\n };\n\n const handleRemove = (index: number) => {\n const newItems = items.filter((_, i) => i !== index);\n onChange(newItems);\n if (openIndex === index) setOpenIndex(null);\n else if (openIndex !== null && openIndex > index)\n setOpenIndex(openIndex - 1);\n };\n\n const handleAdd = () => {\n const newItem: ArrayFieldItem = {\n [labelField]: `Item ${items.length + 1}`,\n };\n onChange([...items, newItem]);\n setOpenIndex(items.length);\n };\n\n const inputClass = compact\n ? \"w-full px-2.5 py-1.5 border border-[var(--kyro-border)] rounded bg-[var(--kyro-bg-secondary)] text-sm text-[var(--kyro-text-primary)] focus:outline-none focus:ring-1 focus:ring-[var(--kyro-sidebar-active)] focus:border-transparent\"\n : \"w-full px-3 py-2.5 border border-[var(--kyro-border)] rounded-lg bg-[var(--kyro-bg-secondary)] text-sm text-[var(--kyro-text-primary)] focus:outline-none focus:ring-1 focus:ring-[var(--kyro-sidebar-active)] focus:border-transparent\";\n\n const itemKeys =\n items.length > 0\n ? Object.keys(items[0]).filter((k) => k !== \"id\" && k !== \"_key\")\n : [];\n\n if (compact) {\n return (\n <div className=\"space-y-1.5\">\n {items.length === 0 ? (\n <div className=\"text-center py-4 text-[var(--kyro-text-muted)] text-sm border border-dashed border-[var(--kyro-border)] rounded-lg\">\n No items. Click \"Add Item\" to create one.\n </div>\n ) : (\n <div className=\"space-y-1\">\n {items.map((item, index) => {\n const isOpen = openIndex === index;\n const itemLabel =\n item[labelField] ||\n item.title ||\n item.name ||\n `Item ${index + 1}`;\n return (\n <div\n key={index}\n className=\"border border-[var(--kyro-border)] rounded-lg overflow-hidden group\"\n >\n <button\n type=\"button\"\n onClick={() => setOpenIndex(isOpen ? null : index)}\n className=\"w-full flex items-center justify-between p-2.5 bg-[var(--kyro-surface-accent)] hover:bg-[var(--kyro-sidebar-active)]/10 transition-colors\"\n >\n <span className=\"text-sm font-medium text-[var(--kyro-text-primary)] truncate\">\n {itemLabel}\n </span>\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n handleRemove(index);\n }}\n className=\"opacity-0 group-hover:opacity-100 p-1 hover:bg-[var(--kyro-danger-bg)] rounded text-[var(--kyro-error)] transition-opacity\"\n title=\"Remove\"\n >\n <X className=\"w-3.5 h-3.5\" />\n </button>\n {isOpen ? (\n <ChevronUp className=\"w-4 h-4 text-[var(--kyro-text-muted)]\" />\n ) : (\n <ChevronDown className=\"w-4 h-4 text-[var(--kyro-text-muted)]\" />\n )}\n </div>\n </button>\n {isOpen && (\n <div className=\"p-2.5 bg-[var(--kyro-surface)] space-y-2\">\n {itemKeys.length > 0 ? (\n itemKeys.map((key) => (\n <input\n key={key}\n type=\"text\"\n value={item[key] || \"\"}\n onChange={(e) =>\n handleItemChange(index, key, e.target.value)\n }\n onClick={(e) => e.stopPropagation()}\n className={inputClass}\n placeholder={key}\n />\n ))\n ) : (\n <input\n type=\"text\"\n value={item.value || \"\"}\n onChange={(e) =>\n handleItemChange(index, \"value\", e.target.value)\n }\n onClick={(e) => e.stopPropagation()}\n className={inputClass}\n placeholder=\"Value...\"\n />\n )}\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n <button\n type=\"button\"\n onClick={handleAdd}\n className=\"flex items-center justify-center gap-1.5 w-full px-3 py-2 text-xs font-medium rounded-lg border border-dashed border-[var(--kyro-border)] bg-[var(--kyro-surface-accent)] text-[var(--kyro-text-secondary)] hover:border-[var(--kyro-sidebar-active)] hover:text-[var(--kyro-text-primary)] transition-colors\"\n >\n <Plus className=\"w-3.5 h-3.5\" />\n Add Item\n </button>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-2\">\n {items.length === 0 ? (\n <div className=\"text-center py-4 text-[var(--kyro-text-muted)] text-sm border border-dashed border-[var(--kyro-border)] rounded-lg\">\n No items. Click \"Add Item\" to create one.\n </div>\n ) : (\n <div className=\"space-y-2\">\n {items.map((item, index) => {\n const isOpen = openIndex === index;\n const itemLabel =\n item[labelField] ||\n item.title ||\n item.name ||\n `Item ${index + 1}`;\n return (\n <div\n key={index}\n className=\"border border-[var(--kyro-border)] rounded-lg overflow-hidden group\"\n >\n <button\n type=\"button\"\n onClick={() => setOpenIndex(isOpen ? null : index)}\n className=\"w-full flex items-center justify-between p-3 bg-[var(--kyro-surface-accent)] hover:bg-[var(--kyro-sidebar-active)]/10 transition-colors\"\n >\n <span className=\"text-sm font-medium text-[var(--kyro-text-primary)] truncate\">\n {itemLabel}\n </span>\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n handleRemove(index);\n }}\n className=\"opacity-0 group-hover:opacity-100 p-1.5 hover:bg-[var(--kyro-danger-bg)] rounded text-[var(--kyro-error)] transition-opacity\"\n title=\"Remove\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n {isOpen ? (\n <ChevronUp className=\"w-4 h-4 text-[var(--kyro-text-muted)]\" />\n ) : (\n <ChevronDown className=\"w-4 h-4 text-[var(--kyro-text-muted)]\" />\n )}\n </div>\n </button>\n {isOpen && (\n <div className=\"p-3 bg-[var(--kyro-surface)] space-y-2\">\n {itemKeys.length > 0 ? (\n itemKeys.map((key) => (\n <input\n key={key}\n type=\"text\"\n value={item[key] || \"\"}\n onChange={(e) =>\n handleItemChange(index, key, e.target.value)\n }\n className={inputClass}\n placeholder={key}\n />\n ))\n ) : (\n <input\n type=\"text\"\n value={item.value || \"\"}\n onChange={(e) =>\n handleItemChange(index, \"value\", e.target.value)\n }\n className={inputClass}\n placeholder=\"Value...\"\n />\n )}\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n <button\n type=\"button\"\n onClick={handleAdd}\n className=\"flex items-center justify-center gap-1.5 w-full px-3 py-2 text-xs font-medium rounded-lg border border-dashed border-[var(--kyro-border)] bg-[var(--kyro-surface-accent)] text-[var(--kyro-text-secondary)] hover:border-[var(--kyro-sidebar-active)] hover:text-[var(--kyro-text-primary)] transition-colors\"\n >\n <Plus className=\"w-3.5 h-3.5\" />\n Add Item\n </button>\n </div>\n );\n};\n\nexport default ArrayField;\n","import React from \"react\";\nimport {\n useBlockById,\n useBlockActions,\n} from \"../fields/extensions/blocksStore\";\nimport { ChevronRight, X } from \"../ui/icons\";\nimport { ArrayField } from \"../fields/ArrayField\";\nimport { ChildBlocksTree } from \"./ChildBlocksTree\";\n\nexport const ArrayBlock: React.FC<{ block: Record<string, unknown>; index: number }> = ({\n block,\n index,\n}) => {\n const blockData = useBlockById(block.id);\n const { updateBlock, removeBlock, moveBlock } = useBlockActions();\n\n const data = blockData?.data ?? block.data ?? {};\n const children = blockData?.children ?? block.children ?? [];\n const items = Array.isArray(data.items) ? data.items : [];\n\n return (\n <div className=\"block-array border border-[var(--kyro-border)] rounded-md p-3 mb-2 relative group\">\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs font-semibold text-[var(--kyro-text-muted)] \">\n Repeater\n </span>\n <span className=\"text-[10px] text-[var(--kyro-text-muted)]\">\n ({items.length + children.length} items)\n </span>\n </div>\n <div className=\"flex gap-0.5 opacity-0 group-hover:opacity-100 transition-opacity\">\n <button\n type=\"button\"\n onClick={() => moveBlock(block.id, \"up\")}\n className=\"p-1 hover:bg-[var(--kyro-surface-accent)] rounded\"\n title=\"Move up\"\n >\n <ChevronRight className=\"w-3 h-3 rotate-90\" />\n </button>\n <button\n type=\"button\"\n onClick={() => moveBlock(block.id, \"down\")}\n className=\"p-1 hover:bg-[var(--kyro-surface-accent)] rounded\"\n title=\"Move down\"\n >\n <ChevronRight className=\"w-3 h-3\" />\n </button>\n <button\n type=\"button\"\n onClick={() => removeBlock(block.id)}\n className=\"p-1 hover:bg-red-50 rounded text-red-500\"\n title=\"Remove\"\n >\n <X className=\"w-3 h-3\" />\n </button>\n </div>\n </div>\n\n <div className=\"space-y-3\">\n {items.length > 0 && (\n <ArrayField\n items={items}\n onChange={(newItems) =>\n updateBlock(block.id, { data: { ...data, items: newItems } })\n }\n compact\n />\n )}\n\n <div className=\"pt-2 border-t border-[var(--kyro-border)]\">\n <label className=\"text-[10px] font-medium text-[var(--kyro-text-muted)] mb-1.5 block\">\n Children ({children.length})\n </label>\n <ChildBlocksTree\n blockId={block.id}\n children={children}\n onUpdateChildren={(c) => updateBlock(block.id, { children: c })}\n />\n </div>\n </div>\n </div>\n );\n};\n","import React from \"react\";\nimport {\n useBlockById,\n useBlockActions,\n} from \"../fields/extensions/blocksStore\";\nimport { ChevronRight, X } from \"../ui/icons\";\nimport { RelationshipBlockField } from \"../fields/RelationshipBlockField\";\n\nexport const RelationshipBlock: React.FC<{ block: Record<string, unknown>; index: number }> = ({\n block,\n index,\n}) => {\n const blockData = useBlockById(block.id);\n const { updateBlock, removeBlock, moveBlock } = useBlockActions();\n\n const data = blockData?.data ?? block.data ?? {};\n\n const handleChange = (field: string, value: unknown) => {\n updateBlock(block.id, { data: { ...data, [field]: value } });\n };\n\n return (\n <div className=\"block-relationship border border-[var(--kyro-border)] rounded-md p-3 mb-2 relative group\">\n <div className=\"flex items-center justify-between mb-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs font-semibold text-[var(--kyro-text-muted)] \">\n Relationship\n </span>\n <span className=\"text-[10px] text-[var(--kyro-text-muted)]\">\n → {data.relationTo || \"pages\"}\n </span>\n </div>\n <div className=\"flex gap-0.5 opacity-0 group-hover:opacity-100 transition-opacity\">\n <button\n type=\"button\"\n onClick={() => moveBlock(block.id, \"up\")}\n className=\"p-1 hover:bg-[var(--kyro-surface-accent)] rounded\"\n title=\"Move up\"\n >\n <ChevronRight className=\"w-3 h-3 rotate-90\" />\n </button>\n <button\n type=\"button\"\n onClick={() => moveBlock(block.id, \"down\")}\n className=\"p-1 hover:bg-[var(--kyro-surface-accent)] rounded\"\n title=\"Move down\"\n >\n <ChevronRight className=\"w-3 h-3\" />\n </button>\n <button\n type=\"button\"\n onClick={() => removeBlock(block.id)}\n className=\"p-1 hover:bg-red-50 rounded text-red-500\"\n title=\"Remove\"\n >\n <X className=\"w-3 h-3\" />\n </button>\n </div>\n </div>\n\n <RelationshipBlockField\n relationTo={data.relationTo || \"pages\"}\n hasMany={data.hasMany || false}\n selectedIds={Array.isArray(data.selectedIds) ? data.selectedIds : []}\n selectedId={data.selectedId}\n labelField={data.labelField || \"title\"}\n onChange={handleChange}\n compact\n />\n </div>\n );\n};\n","import React from \"react\";\nimport { ColumnsBlock } from \"../../blocks/ColumnsBlock\";\nimport { HeadingBlock } from \"../../blocks/HeadingBlock\";\nimport { ParagraphBlock } from \"../../blocks/ParagraphBlock\";\nimport { DividerBlock } from \"../../blocks/DividerBlock\";\nimport { ImageBlock } from \"../../blocks/ImageBlock\";\nimport { VideoBlock } from \"../../blocks/VideoBlock\";\nimport { ListBlock } from \"../../blocks/ListBlock\";\nimport { CodeBlock } from \"../../blocks/CodeBlock\";\nimport { LinkBlock } from \"../../blocks/LinkBlock\";\nimport { FileBlock } from \"../../blocks/FileBlock\";\nimport { VStackBlock } from \"../../blocks/VStackBlock\";\nimport { ButtonBlock } from \"../../blocks/ButtonBlock\";\nimport { AccordionBlock } from \"../../blocks/AccordionBlock\";\nimport { RichTextBlock } from \"../../blocks/RichTextBlock\";\n\nimport { HeroBlock } from \"../../blocks/HeroBlock\";\nimport { ArrayBlock } from \"../../blocks/ArrayBlock\";\nimport { RelationshipBlock } from \"../../blocks/RelationshipBlock\";\n\nimport {\n Columns3,\n Heading1,\n AlignLeft,\n Minus,\n Image,\n Video,\n List,\n Code,\n Link,\n File,\n ArrowDown,\n MousePointerClick,\n ChevronDown,\n Star,\n ListOrdered,\n Link2,\n} from \"../../ui/icons\";\n\n// Block component registry\nexport const BLOCK_COMPONENTS: Record<string, React.ComponentType<{ block: Record<string, unknown>; index: number }>> = {\n columns: ColumnsBlock,\n heading: HeadingBlock,\n paragraph: ParagraphBlock,\n divider: DividerBlock,\n image: ImageBlock,\n video: VideoBlock,\n list: ListBlock,\n code: CodeBlock,\n link: LinkBlock,\n file: FileBlock,\n vstack: VStackBlock,\n button: ButtonBlock,\n accordion: AccordionBlock,\n richtext: RichTextBlock,\n\n hero: HeroBlock,\n array: ArrayBlock,\n relationship: RelationshipBlock,\n};\n\n// Icon mapping for drawer (actual Lucide components)\nexport const blockIcons: Record<string, React.ReactNode> = {\n columns: <Columns3 className=\"w-4 h-4\" />,\n heading: <Heading1 className=\"w-4 h-4\" />,\n paragraph: <AlignLeft className=\"w-4 h-4\" />,\n divider: <Minus className=\"w-4 h-4\" />,\n image: <Image className=\"w-4 h-4\" />,\n video: <Video className=\"w-4 h-4\" />,\n list: <List className=\"w-4 h-4\" />,\n code: <Code className=\"w-4 h-4\" />,\n link: <Link className=\"w-4 h-4\" />,\n file: <File className=\"w-4 h-4\" />,\n vstack: <ArrowDown className=\"w-4 h-4\" />,\n button: <MousePointerClick className=\"w-4 h-4\" />,\n accordion: <ChevronDown className=\"w-4 h-4\" />,\n richtext: <AlignLeft className=\"w-4 h-4\" />,\n\n hero: <Star className=\"w-4 h-4\" />,\n array: <ListOrdered className=\"w-4 h-4\" />,\n relationship: <Link2 className=\"w-4 h-4\" />,\n};\n\n// Get block component by type\nexport function getBlockComponent(type: string) {\n return BLOCK_COMPONENTS[type];\n}\n\n// Check if block type is supported\nexport function isSupportedBlockType(type: string): boolean {\n return type in BLOCK_COMPONENTS;\n}\n\n// Get human-readable label for block type\nexport function getBlockLabel(type: string): string {\n const labelMap: Record<string, string> = {\n paragraph: \"Paragraph\",\n heading: \"Heading\",\n image: \"Image\",\n video: \"Video\",\n link: \"Link\",\n button: \"Button\",\n list: \"List\",\n code: \"Code\",\n file: \"File\",\n divider: \"Divider\",\n accordion: \"Accordion\",\n array: \"Repeater\",\n hero: \"Hero\",\n vstack: \"VStack\",\n columns: \"Columns\",\n relationship: \"Relationship\",\n richtext: \"Rich Text\",\n };\n return labelMap[type] || type;\n}\n\n// Block categories for the drawer\nexport const blockCategories = [\n {\n title: \"Layout\",\n blocks: [\n {\n type: \"columns\",\n label: \"Columns\",\n icon: \"columns\",\n description: \"1-6 columns side-by-side\",\n },\n {\n type: \"vstack\",\n label: \"VStack\",\n icon: \"vstack\",\n description: \"Stack blocks vertically\",\n },\n {\n type: \"hero\",\n label: \"Hero\",\n icon: \"hero\",\n description: \"Hero with content + video\",\n },\n ],\n },\n {\n title: \"Text\",\n blocks: [\n {\n type: \"heading\",\n label: \"Heading\",\n icon: \"heading\",\n description: \"Heading text\",\n },\n {\n type: \"paragraph\",\n label: \"Paragraph\",\n icon: \"paragraph\",\n description: \"Plain text content\",\n },\n {\n type: \"richtext\",\n label: \"Rich Text\",\n icon: \"richtext\",\n description: \"Formatted text with links & styles\",\n },\n {\n type: \"list\",\n label: \"List\",\n icon: \"list\",\n description: \"Ordered/unordered list\",\n },\n { type: \"link\", label: \"Link\", icon: \"link\", description: \"Hyperlink\" },\n ],\n },\n {\n title: \"Media\",\n blocks: [\n {\n type: \"image\",\n label: \"Image\",\n icon: \"image\",\n description: \"Single image\",\n },\n {\n type: \"video\",\n label: \"Video\",\n icon: \"video\",\n description: \"Embed video\",\n },\n {\n type: \"file\",\n label: \"File\",\n icon: \"file\",\n description: \"File download link\",\n },\n ],\n },\n {\n title: \"Interactive\",\n blocks: [\n {\n type: \"button\",\n label: \"Button\",\n icon: \"button\",\n description: \"CTA button\",\n },\n {\n type: \"accordion\",\n label: \"Accordion\",\n icon: \"accordion\",\n description: \"Collapsible sections\",\n },\n ],\n },\n {\n title: \"Data\",\n blocks: [\n {\n type: \"array\",\n label: \"Repeater\",\n icon: \"array\",\n description: \"Add multiple child blocks\",\n },\n {\n type: \"code\",\n label: \"Code\",\n icon: \"code\",\n description: \"Code snippet\",\n },\n {\n type: \"relationship\",\n label: \"Relationship\",\n icon: \"relationship\",\n description: \"Link to other collection\",\n },\n ],\n },\n {\n title: \"Basic\",\n blocks: [\n {\n type: \"divider\",\n label: \"Divider\",\n icon: \"divider\",\n description: \"Horizontal separator\",\n },\n ],\n },\n];\n","import React from \"react\";\nimport type { Field } from \"@kyro-cms/core/client\";\nimport { UploadField } from \"./fields/UploadField\";\nimport { CodeField } from \"./fields\";\nimport NumberField from \"./fields/NumberField\";\nimport CheckboxField from \"./fields/CheckboxField\";\nimport SelectField from \"./fields/SelectField\";\nimport DateField from \"./fields/DateField\";\nimport { MarkdownField } from \"./fields/MarkdownField\";\nimport TextField from \"./fields/TextField\";\nimport { BlocksField } from \"./fields/BlocksField\";\nimport PortableTextField from \"./fields/PortableTextField\";\nimport { ListField } from \"./fields/ListField\";\nimport RelationshipField from \"./fields/RelationshipField\";\nimport FieldLayout from \"./fields/FieldLayout\";\n\ninterface FieldRendererProps {\n field: Field;\n value: any;\n onChange: (value: any) => void;\n error?: string;\n disabled?: boolean;\n}\n\nexport const FieldRenderer: React.FC<FieldRendererProps> = ({\n field,\n value,\n onChange,\n error,\n disabled,\n}) => {\n if (field.admin?.hidden) return null;\n\n switch (field.type) {\n case \"text\":\n case \"email\":\n case \"url\":\n return (\n <TextField\n field={field as any}\n value={value}\n onChange={onChange}\n error={error}\n disabled={disabled}\n />\n );\n case \"textarea\":\n return (\n <TextField\n field={{ ...field, variant: \"textarea\" } as any}\n value={value}\n onChange={onChange}\n error={error}\n disabled={disabled}\n />\n );\n case \"password\":\n return (\n <TextField\n field={{ ...field, variant: \"password\" } as any}\n value={value}\n onChange={onChange}\n error={error}\n disabled={disabled}\n />\n );\n case \"number\":\n return (\n <NumberField\n field={field as any}\n value={value}\n onChange={onChange}\n disabled={disabled}\n error={error}\n />\n );\n case \"checkbox\":\n return (\n <CheckboxField\n field={field as any}\n value={value}\n onChange={onChange}\n disabled={disabled}\n error={error}\n />\n );\n case \"select\":\n return (\n <SelectField\n field={field as any}\n value={value}\n onChange={onChange}\n disabled={disabled}\n error={error}\n />\n );\n case \"date\":\n return (\n <DateField\n field={field as any}\n value={value}\n onChange={onChange}\n disabled={disabled}\n error={error}\n />\n );\n case \"richtext\":\n return (field as any).hasBlocks === false ? (\n <PortableTextField\n field={field as any}\n value={value}\n onChange={onChange}\n disabled={disabled}\n error={error}\n />\n ) : (\n <BlocksField\n field={field as any}\n value={value}\n onChange={onChange}\n disabled={disabled}\n error={error}\n />\n );\n case \"markdown\":\n return (\n <MarkdownField\n field={field as any}\n value={value}\n onChange={onChange}\n disabled={disabled}\n error={error}\n />\n );\n case \"code\":\n return (\n <CodeField\n field={field as any}\n value={value}\n onChange={onChange}\n disabled={disabled}\n error={error}\n />\n );\n case \"image\":\n case \"upload\":\n return (\n <FieldLayout field={field} error={error}>\n <UploadField\n field={field as any}\n value={value}\n onChange={onChange}\n disabled={disabled}\n />\n </FieldLayout>\n );\n case \"relationship\":\n return (\n <RelationshipField\n field={field as any}\n value={value}\n onChange={onChange}\n disabled={disabled}\n error={error}\n />\n );\n case \"list\":\n return (\n <FieldLayout field={field} error={error}>\n <ListField\n items={Array.isArray(value) ? value : []}\n onChange={onChange}\n compact\n />\n </FieldLayout>\n );\n case \"color\":\n return (\n <FieldLayout field={field} error={error}>\n <div className=\"flex items-center gap-3\">\n <input\n type=\"color\"\n value={value || \"#000000\"}\n onChange={(e) => onChange(e.target.value)}\n disabled={disabled}\n className=\"h-10 w-14 p-1 cursor-pointer bg-[var(--kyro-input-bg)] border border-[var(--kyro-input-border)] rounded-lg\"\n />\n <input\n type=\"text\"\n className=\"kyro-form-input font-mono \"\n value={value || \"\"}\n onChange={(e) => onChange(e.target.value)}\n disabled={disabled}\n placeholder=\"#000000\"\n />\n </div>\n </FieldLayout>\n );\n default:\n return (\n <div className=\"p-4 bg-amber-50 border border-amber-200 rounded-lg text-amber-800 text-xs italic\">\n Field type \"{field.type}\" is not yet supported in this renderer.\n </div>\n );\n }\n};\n","import React, { useState } from \"react\";\nimport type { Field } from \"@kyro-cms/core/client\";\nimport { SeoPreview } from \"../ui/SeoPreview\";\n\ninterface TabsLayoutProps {\n field: Field;\n formData: Record<string, unknown>;\n onTabDataChange: (tabData: Record<string, unknown>) => void;\n renderField: (\n field: Field,\n parentData: Record<string, unknown>,\n onChange: (value: unknown) => void,\n ) => React.ReactNode;\n}\n\nexport function TabsLayout({\n field,\n formData,\n onTabDataChange,\n renderField,\n}: TabsLayoutProps) {\n const [activeTab, setActiveTab] = useState(0);\n\n const fieldTabs = (field as Field & { tabs?: { label: string; fields: Field[] }[] }).tabs || [];\n const currentTab = fieldTabs[activeTab] || fieldTabs[0];\n\n // Get nested tab data\n const tabData = formData[field.name as string] || {};\n\n return (\n <div className=\"space-y-8\">\n <div className=\"flex items-center gap-2 border-b border-[var(--kyro-border)] mb-6 overflow-x-auto hide-scrollbar\">\n {fieldTabs.map((tab: { label: string }, index: number) => (\n <button\n key={index}\n type=\"button\"\n className={`px-6 py-3 text-xs tracking-widest font-bold transition-all border-b-2 -mb-[1px] whitespace-nowrap ${activeTab === index\n ? \"border-[var(--kyro-primary)] text-[var(--kyro-primary)]\"\n : \"border-transparent text-[var(--kyro-text-secondary)] hover:text-[var(--kyro-text-primary)] opacity-60 hover:opacity-100\"\n }`}\n onClick={() => setActiveTab(index)}\n >\n {tab.label}\n </button>\n ))}\n </div>\n <div className=\"space-y-6\">\n {currentTab?.fields.map((f: Field) =>\n renderField(f, tabData, onTabDataChange),\n )}\n </div>\n\n {currentTab?.label === \"SEO\" && (\n <div className=\"mt-12 pt-8 border-t border-[var(--kyro-border)]\">\n <h4 className=\"text-[10px] font-bold text-[var(--kyro-text-secondary)] tracking-[0.2em] mb-6 opacity-50\">\n Live Google Preview\n </h4>\n <SeoPreview\n title={formData.metaTitle || formData.title || \"Untitled\"}\n description={\n formData.metaDescription || \"Please enter a description...\"\n }\n slug={formData.slug || \"your-slug\"}\n />\n </div>\n )}\n </div>\n );\n}\n","import React from \"react\";\n\ninterface SeoPreviewProps {\n title: string;\n description: string;\n slug: string;\n}\n\nexport const SeoPreview = ({ title, description, slug }: SeoPreviewProps) => (\n <div className=\"bg-[var(--kyro-surface)] border border-[var(--kyro-border)] rounded-lg p-6 max-w-2xl shadow-sm transition-colors duration-300\">\n <div className=\"flex items-center gap-2 mb-2\">\n <div className=\"w-7 h-7 bg-[var(--kyro-bg-secondary)] rounded-full flex items-center justify-center text-[10px] text-[var(--kyro-text-primary)] font-medium border border-[var(--kyro-border)]\">\n K\n </div>\n <div className=\"flex flex-col\">\n <span className=\"text-sm font-medium text-[var(--kyro-text-primary)] leading-tight\">\n kyro-cms.com\n </span>\n <span className=\"text-[12px] text-[var(--kyro-text-secondary)] leading-tight opacity-80\">\n https://kyro-cms.com › posts › {slug}\n </span>\n </div>\n </div>\n <h3 className=\"text-[20px] text-[#2563eb] dark:text-[#60a5fa] font-medium hover:underline cursor-pointer mb-1 leading-tight transition-colors\">\n {title}\n </h3>\n <p className=\"text-[14px] text-[var(--kyro-text-secondary)] leading-relaxed line-clamp-2\">\n {description}\n </p>\n </div>\n);\n","import React from \"react\";\nimport type { Field } from \"@kyro-cms/core/client\";\n\ninterface GroupLayoutProps {\n field: Field;\n value: Record<string, unknown> | null;\n onChange: (value: Record<string, unknown>) => void;\n renderField: (\n field: Field,\n parentData: Record<string, unknown>,\n onChange: (value: unknown) => void,\n ) => React.ReactNode;\n}\n\nexport function GroupLayout({\n field,\n value,\n onChange,\n renderField,\n}: GroupLayoutProps) {\n const groupData = value || {};\n\n return (\n <div className=\"kyro-form-group border border-[var(--kyro-border)] rounded-[var(--kyro-radius-lg)] p-6 bg-[var(--kyro-surface-accent)]/30\">\n <h3 className=\"text-sm font-bold tracking-widest text-[var(--kyro-text-primary)] mb-6 border-b border-[var(--kyro-border)] pb-2 inline-block\">\n {field.label || field.name}\n </h3>\n <div className=\"space-y-6\">\n {(field as Field & { fields?: Field[] }).fields.map((f: Field) =>\n renderField(f, groupData, onChange),\n )}\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport type { Field } from \"@kyro-cms/core/client\";\nimport RelationshipField from \"./RelationshipField\";\n\ninterface ArrayLayoutProps {\n field: Field;\n value: unknown[];\n onChange: (value: unknown[]) => void;\n renderField: (\n field: Field,\n parentData: Record<string, unknown>,\n onChange: (value: unknown) => void,\n ) => React.ReactNode;\n disabled?: boolean;\n}\n\nexport function ArrayLayout({\n field,\n value,\n onChange,\n renderField,\n disabled,\n}: ArrayLayoutProps) {\n const items = Array.isArray(value) ? value : [];\n const labelField = (field as Field & { fields?: { name?: string; type?: string; relationTo?: string; label?: string }[] }).fields?.[0]?.name || \"user\";\n const isRelationship = (field as Field & { fields?: { type?: string }[] }).fields?.[0]?.type === \"relationship\";\n\n return (\n <div className=\"kyro-form-field\">\n <label className=\"kyro-form-label\">{field.label || field.name}</label>\n {isRelationship ? (\n <RelationshipField\n field={{\n name: labelField,\n relationTo: (field as Field & { fields?: { relationTo?: string }[] }).fields?.[0]?.relationTo || \"\",\n hasMany: true,\n label: (field as Field & { fields?: { label?: string }[] }).fields?.[0]?.label,\n }}\n value={(items as Record<string, unknown>[]).map((i) => i[labelField]).filter(Boolean)}\n onChange={(newValue) => {\n const newItems = (newValue || []).map((id: string) => ({\n [labelField]: id,\n }));\n onChange(newItems);\n }}\n disabled={disabled}\n />\n ) : (\n <div className=\"kyro-form-array border border-[var(--kyro-border)] bg-[var(--kyro-surface-accent)]/30 rounded-[var(--kyro-radius-md)] p-4 space-y-4\">\n {(items as Record<string, unknown>[]).map((item, index) => (\n <div\n key={index}\n className=\"kyro-form-array-item bg-[var(--kyro-surface)] border border-[var(--kyro-border)] rounded-[var(--kyro-radius-md)] p-4 relative group\"\n >\n <div className=\"flex justify-between items-center mb-4 pb-2 border-b border-[var(--kyro-border)]\">\n <span className=\"text-[10px] font-bold tracking-widest text-[var(--kyro-text-muted)]\">\n Item {index + 1}\n </span>\n <button\n type=\"button\"\n disabled={disabled}\n className=\"text-[11px] font-bold text-[var(--kyro-error)] opacity-50 hover:opacity-100 transition-opacity disabled:opacity-30\"\n onClick={() =>\n onChange(items.filter((_: unknown, i: number) => i !== index))\n }\n >\n Remove\n </button>\n </div>\n <div className=\"space-y-4\">\n {(field as Field & { fields?: Field[] }).fields.map((f: Field) =>\n renderField(f, item, (newItem) => {\n const newItems = [...items];\n newItems[index] = newItem;\n onChange(newItems);\n }),\n )}\n </div>\n </div>\n ))}\n <button\n type=\"button\"\n className=\"w-full py-3 border-2 border-dashed border-[var(--kyro-border)] rounded-[var(--kyro-radius-md)] text-xs font-bold text-[var(--kyro-text-secondary)] hover:text-[var(--kyro-primary)] hover:border-[var(--kyro-primary)] transition-all disabled:opacity-50\"\n disabled={disabled}\n onClick={() => onChange([...items, {}])}\n >\n + Add Item\n </button>\n </div>\n )}\n </div>\n );\n}\n","import React, { useState, useRef, useEffect, type ReactNode } from \"react\";\n\ninterface DropdownProps {\n trigger: ReactNode;\n children: ReactNode;\n align?: \"left\" | \"right\";\n}\n\nexport function Dropdown({\n trigger,\n children,\n align = \"right\",\n}: DropdownProps) {\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) {\n setOpen(false);\n }\n };\n\n if (open) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n }\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, [open]);\n\n return (\n <div className=\"relative\" ref={ref}>\n <div onClick={() => setOpen(!open)} className=\"cursor-pointer\">\n {trigger}\n </div>\n {open && (\n <div\n className={`absolute z-[100] mt-2 min-w-[200px] py-2 bg-[var(--kyro-surface)] rounded-2xl shadow-2xl border border-[var(--kyro-border)] animate-in fade-in zoom-in-95 duration-100 ${align === \"right\" ? \"right-0 bottom-full mb-2\" : \"left-0 bottom-full mb-2\"\n }`}\n onClick={() => setOpen(false)}\n >\n {children}\n </div>\n )}\n </div>\n );\n}\n\ninterface DropdownItemProps {\n children: ReactNode;\n onClick?: () => void;\n icon?: ReactNode;\n danger?: boolean;\n disabled?: boolean;\n className?: string;\n}\n\nexport function DropdownItem({\n children,\n onClick,\n icon,\n danger,\n disabled,\n className = \"\",\n}: DropdownItemProps) {\n return (\n <div className=\"px-1.5\">\n <button type=\"button\"\n onClick={onClick}\n disabled={disabled}\n className={`w-full flex items-center gap-3 px-3 py-2.5 text-[11px] font-medium tracking-wide text-left transition-all rounded-xl ${danger\n ? \"text-red-500 hover:bg-red-500/10\"\n : \"text-[var(--kyro-text-secondary)] hover:text-[var(--kyro-text-primary)] hover:bg-[var(--kyro-surface-accent)]\"\n } ${disabled ? \"opacity-50 cursor-not-allowed\" : \"\"} ${className}`}\n >\n {icon && <span className=\"w-4 h-4 opacity-70\">{icon}</span>}\n <span className=\"flex-1\">{children}</span>\n </button>\n </div>\n );\n}\n\nexport function DropdownSeparator() {\n return <div className=\"my-1 border-t border-[var(--kyro-border)] opacity-50\" />;\n}\n","import React, { useState, useEffect, useCallback } from \"react\";\nimport { Dropdown, DropdownItem, DropdownSeparator } from \"./ui/Dropdown\";\nimport { Spinner } from \"./ui/Spinner\";\n\nexport type DocumentStatus = \"draft\" | \"published\" | \"scheduled\" | \"archived\";\nexport type SaveStatus = \"idle\" | \"saving\" | \"saved\" | \"error\";\n\nexport interface ActionBarProps {\n status: DocumentStatus;\n saveStatus: SaveStatus;\n hasChanges: boolean;\n onSave: () => void;\n onPublish?: () => void;\n onUnpublish?: () => void;\n onDuplicate?: () => void;\n onViewHistory?: () => void;\n onPreview?: () => void;\n onDelete?: () => void;\n publishedAt?: string | null;\n updatedAt?: string | null;\n}\n\nexport function ActionBar({\n status,\n saveStatus,\n hasChanges,\n onSave,\n onPublish,\n onUnpublish,\n onDuplicate,\n onViewHistory,\n onPreview,\n onDelete,\n publishedAt,\n updatedAt,\n}: ActionBarProps) {\n const getSaveStatusText = () => {\n if (saveStatus === \"saving\") return \"Saving...\";\n if (saveStatus === \"saved\") return \"Saved\";\n if (saveStatus === \"error\") return \"Error saving\";\n if (hasChanges) return \"Unsaved changes\";\n return null;\n };\n\n const getSaveButtonClass = () => {\n const base = \"kyro-btn kyro-btn-md text-[11px] font-bold tracking-widest transition-all duration-300\";\n if (saveStatus === \"saving\") return `${base} bg-[var(--kyro-gray-400)] text-white opacity-70 cursor-wait`;\n if (saveStatus === \"saved\") return `${base} bg-[var(--kyro-success)] border-[var(--kyro-success)] text-white shadow-[0_0_15px_rgba(34,197,94,0.3)]`;\n if (saveStatus === \"error\") return `${base} bg-[var(--kyro-error)] border-[var(--kyro-error)] text-white shadow-[0_0_15px_rgba(239,68,68,0.3)]`;\n if (hasChanges) return `${base} bg-[var(--kyro-warning)] border-[var(--kyro-warning)] text-black shadow-[0_0_15px_rgba(255,174,0,0.3)] animate-pulse`;\n return `${base} bg-[var(--kyro-gray-500)] border-[var(--kyro-gray-500)] text-white hover:bg-[var(--kyro-gray-600)]`;\n };\n\n const getStatusBadge = () => {\n const statusConfig = {\n draft: {\n label: \"Draft\",\n class: \"bg-gray-100 text-gray-600 border-gray-200\",\n icon: (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n >\n <path d=\"M12 2v20M2 12h20\" />\n </svg>\n ),\n },\n published: {\n label: \"Published\",\n class: \"bg-green-100 text-green-700 border-green-200\",\n icon: (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n >\n <path d=\"M22 2L11 13M22 2l-7 20-4-9-9-4 20-7z\" />\n </svg>\n ),\n },\n scheduled: {\n label: \"Scheduled\",\n class: \"bg-blue-100 text-blue-700 border-blue-200\",\n icon: (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 6v6l4 2\" />\n </svg>\n ),\n },\n archived: {\n label: \"Archived\",\n class: \"bg-yellow-100 text-yellow-700 border-yellow-200\",\n icon: (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n >\n <path d=\"M21 8v13H3V8M1 3h22v5H1zM10 12h4\" />\n </svg>\n ),\n },\n };\n const config = statusConfig[status];\n return (\n <span\n className={`inline-flex items-center gap-1.5 px-2.5 py-1 rounded-full text-xs font-semibold border ${config.class}`}\n >\n {config.icon}\n {config.label}\n </span>\n );\n };\n\n const formatDate = (dateStr: string | null | undefined) => {\n if (!dateStr) return \"Never\";\n return new Date(dateStr).toLocaleString();\n };\n\n return (\n <div className=\"flex items-center justify-between py-3 px-1\">\n <div className=\"flex items-center gap-4\">\n <div className=\"flex items-center gap-2\">\n {getStatusBadge()}\n {getSaveStatusText() && (\n <span\n className={`text-sm ${saveStatus === \"error\" ? \"text-red-500\" : \"text-gray-500\"}`}\n >\n {saveStatus === \"saving\" ? (\n <Spinner size=\"sm\" className=\"inline mr-1\" />\n ) : null}\n {getSaveStatusText()}\n </span>\n )}\n </div>\n <div className=\"text-xs space-y-0.5\">\n {updatedAt && (\n <div className=\"text-gray-400\">\n Updated: {formatDate(updatedAt)}\n </div>\n )}\n {publishedAt && status === \"published\" && (\n <div className=\"text-[var(--kyro-primary)] font-medium\">\n Published: {formatDate(publishedAt)}\n </div>\n )}\n </div>\n </div>\n\n <div className=\"flex items-center gap-2\">\n {status === \"draft\" && onPublish && (\n <button type=\"button\"\n onClick={onPublish}\n disabled={saveStatus === \"saving\"}\n className=\"bg-[var(--kyro-primary)] hover:opacity-90 text-white kyro-btn-md flex items-center gap-2\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n >\n <path d=\"M22 2L11 13M22 2l-7 20-4-9-9-4 20-7z\" />\n </svg>\n Publish\n </button>\n )}\n {status === \"published\" && onUnpublish && (\n <button type=\"button\"\n onClick={onUnpublish}\n disabled={saveStatus === \"saving\"}\n className=\"kyro-btn kyro-btn-warning kyro-btn-md flex items-center gap-2\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n >\n <path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8M3 3v5h5\" />\n </svg>\n Unpublish\n </button>\n )}\n <button type=\"button\"\n onClick={onSave}\n disabled={\n saveStatus === \"saving\" || (!hasChanges && saveStatus !== \"error\")\n }\n className={getSaveButtonClass()}\n >\n {saveStatus === \"saving\"\n ? \"Saving...\"\n : saveStatus === \"saved\"\n ? \"Saved\"\n : \"Save\"}\n </button>\n\n <Dropdown\n trigger={\n <button type=\"button\" className=\"kyro-btn kyro-btn-ghost kyro-btn-md p-2\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"1\" />\n <circle cx=\"12\" cy=\"5\" r=\"1\" />\n <circle cx=\"12\" cy=\"19\" r=\"1\" />\n </svg>\n </button>\n }\n >\n {onDuplicate && (\n <DropdownItem\n onClick={onDuplicate}\n icon={\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n }\n >\n Duplicate\n </DropdownItem>\n )}\n {onViewHistory && (\n <DropdownItem\n onClick={onViewHistory}\n icon={\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <polyline points=\"12,6 12,12 16,14\" />\n </svg>\n }\n >\n View History\n </DropdownItem>\n )}\n {onPreview && (\n <DropdownItem\n onClick={onPreview}\n icon={\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n }\n >\n Preview\n </DropdownItem>\n )}\n {(onDuplicate || onViewHistory || onPreview) && <DropdownSeparator />}\n {onDelete && (\n <DropdownItem\n onClick={onDelete}\n danger\n icon={\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M3 6h18M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" />\n </svg>\n }\n >\n Delete\n </DropdownItem>\n )}\n </Dropdown>\n </div>\n </div>\n );\n}\n","import React, { createContext, useContext, type ReactNode } from \"react\";\nimport { \n CheckCircle2, \n AlertTriangle, \n Info, \n X,\n ShieldAlert\n} from \"./icons\";\n\nimport { useToastStore } from \"../../lib/stores\";\n\ntype ToastType = \"success\" | \"error\" | \"warning\" | \"info\";\n\ninterface ToastProps {\n type: ToastType;\n message: string;\n onClose: () => void;\n}\n\nexport function Toast({ type, message, onClose }: ToastProps) {\n const [isPaused, setIsPaused] = React.useState(false);\n const timerRef = React.useRef<NodeJS.Timeout | null>(null);\n\n const startTimer = () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(onClose, 5000);\n };\n\n const clearTimer = () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n };\n\n React.useEffect(() => {\n if (!isPaused) {\n startTimer();\n } else {\n clearTimer();\n }\n return clearTimer;\n }, [isPaused, onClose]);\n\n const Icon = {\n success: CheckCircle2,\n error: ShieldAlert,\n warning: AlertTriangle,\n info: Info,\n }[type];\n\n return (\n <div \n className={`kyro-toast kyro-toast-${type} group animate-in fade-in slide-in-from-right-4 duration-300`}\n onMouseEnter={() => setIsPaused(true)}\n onMouseLeave={() => setIsPaused(false)}\n >\n <div className=\"kyro-toast-accent\" />\n <div className=\"kyro-toast-icon-container\">\n <Icon className=\"w-4 h-4\" />\n </div>\n <div className=\"kyro-toast-content\">\n <p className=\"kyro-toast-message\">{message}</p>\n </div>\n <button \n type=\"button\" \n className=\"kyro-toast-close group-hover:opacity-100 opacity-40 transition-opacity\" \n onClick={onClose}\n >\n <X className=\"w-3.5 h-3.5\" />\n </button>\n </div>\n );\n}\n\ninterface ToastProviderProps {\n children: ReactNode;\n}\n\nexport function ToastProvider({ children }: ToastProviderProps) {\n return <>{children}</>;\n}\n\nexport function useToast() {\n const addToast = useToastStore((state) => state.addToast);\n const removeToast = useToastStore((state) => state.removeToast);\n const toasts = useToastStore((state) => state.toasts);\n\n return { toasts, addToast, removeToast };\n}\n","import type { ReactNode } from \"react\";\n\nexport type BadgeVariant =\n | \"default\"\n | \"success\"\n | \"warning\"\n | \"danger\"\n | \"info\"\n | \"outline\"\n | \"draft\"\n | \"published\"\n | \"scheduled\"\n | \"archived\"\n | \"active\"\n | \"inactive\"\n | \"pending\"\n | \"completed\"\n | \"cancelled\";\n\ninterface BadgeProps {\n variant?: BadgeVariant;\n status?: BadgeVariant; // Alias for variant when used for statuses\n className?: string;\n children?: ReactNode;\n dot?: boolean;\n}\n\nconst statusConfig: Record<string, { class: string; label?: string }> = {\n draft: { class: \"bg-gray-100 text-gray-600\", label: \"Draft\" },\n published: { class: \"bg-green-100 text-green-700\", label: \"Published\" },\n scheduled: { class: \"bg-blue-100 text-blue-700\", label: \"Scheduled\" },\n archived: { class: \"bg-yellow-100 text-yellow-700\", label: \"Archived\" },\n active: { class: \"bg-green-100 text-green-700\", label: \"Active\" },\n inactive: { class: \"bg-gray-100 text-gray-600\", label: \"Inactive\" },\n pending: { class: \"bg-yellow-100 text-yellow-700\", label: \"Pending\" },\n completed: { class: \"bg-green-100 text-green-700\", label: \"Completed\" },\n cancelled: { class: \"bg-red-100 text-red-700\", label: \"Cancelled\" },\n};\n\nexport function Badge({\n variant,\n status,\n className = \"\",\n children,\n dot = false,\n}: BadgeProps) {\n const activeVariant = variant || status || \"default\";\n const config = statusConfig[activeVariant];\n\n const variantClass = config \n ? config.class \n : `kyro-badge-${activeVariant}`;\n\n return (\n <span className={`kyro-badge ${variantClass} ${className}`}>\n {dot && (\n <span className=\"w-1.5 h-1.5 rounded-full bg-current mr-1.5 opacity-60\" />\n )}\n {children || config?.label || activeVariant}\n </span>\n );\n}\n\nexport function CountBadge({ count, max = 99 }: { count: number; max?: number }) {\n if (count === 0) return null;\n\n return (\n <span className=\"inline-flex items-center justify-center min-w-[20px] h-5 px-1.5 text-xs font-medium bg-gray-200 text-gray-700 rounded-full\">\n {count > max ? `${max}+` : count}\n </span>\n );\n}\n\n","import { useState } from \"react\";\nimport { apiPost } from \"../lib/api\";\nimport type { KyroConfig, CollectionConfig } from \"@kyro-cms/core/client\";\nimport { AutoForm } from \"./AutoForm\";\nimport { Spinner } from \"./ui/Spinner\";\nimport { PageHeader } from \"./ui/PageHeader\";\nimport { adminPath } from \"../lib/paths\";\n\n\ninterface CreateViewProps {\n config: KyroConfig;\n collection: CollectionConfig;\n onCancel: () => void;\n onSuccess: () => void;\n onError: (message: string) => void;\n}\n\nexport function CreateView({\n config,\n collection,\n onCancel,\n onSuccess,\n onError,\n}: CreateViewProps) {\n const [data, setData] = useState<Record<string, unknown>>({});\n const [saving, setSaving] = useState(false);\n\n const fields = collection.fields || [];\n const label = collection.label || collection.slug;\n\n const handleSubmit = async (e?: React.FormEvent) => {\n if (e) e.preventDefault();\n\n try {\n setSaving(true);\n await apiPost(`/api/${collection.slug}`, data);\n onSuccess();\n } catch (err) {\n onError(err instanceof Error ? err.message : \"Failed to create\");\n } finally {\n setSaving(false);\n }\n };\n\n return (\n <div className=\"kyro-detail\">\n <PageHeader\n back={{ onClick: onCancel }}\n breadcrumbs={[\n { label: \"Collections\" },\n { label: label, href: `${adminPath}/${collection.slug}` },\n { label: \"New\" }\n ]}\n title={`Create ${collection.singularLabel || label}`}\n action={{\n label: saving ? \"Creating...\" : `Create ${collection.singularLabel || label}`,\n onClick: () => handleSubmit(),\n }}\n\n />\n\n\n <div className=\"kyro-detail-body\">\n <div className=\"kyro-card\">\n <div className=\"kyro-card-content\">\n <form>\n <AutoForm\n config={{ ...collection, fields }}\n data={data}\n onChange={setData}\n />\n </form>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { useState, useEffect } from \"react\";\nimport { apiGet, apiPost } from \"../lib/api\";\nimport { ThemeProvider, type ThemeMode } from \"./ThemeProvider\";\nimport { Toast, ToastProvider } from \"./ui/Toast\";\n\ninterface LocalToast {\n id: string;\n type: \"success\" | \"error\" | \"info\" | \"warning\";\n message: string;\n}\n\ninterface LoginPageProps {\n onAuth: (token: string, user: Record<string, unknown>) => void;\n theme?: ThemeMode;\n}\n\ntype AuthMode = \"login\" | \"register\";\n\nexport function LoginPage({ onAuth, theme = \"light\" }: LoginPageProps) {\n const [mode, setMode] = useState<AuthMode>(\"login\");\n const [email, setEmail] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const [confirmPassword, setConfirmPassword] = useState(\"\");\n const [loading, setLoading] = useState(false);\n const [toasts, setToasts] = useState<LocalToast[]>([]);\n const [isFirstUser, setIsFirstUser] = useState(false);\n\n useEffect(() => {\n checkIfFirstUser();\n }, []);\n\n const checkIfFirstUser = async () => {\n try {\n await apiGet(\"/api/users\");\n } catch {\n setIsFirstUser(true);\n setMode(\"register\");\n }\n };\n\n const addToast = (type: LocalToast[\"type\"], message: string) => {\n const id = Math.random().toString(36).substring(7);\n setToasts((prev) => [...prev, { id, type, message }]);\n setTimeout(() => {\n setToasts((prev) => prev.filter((t) => t.id !== id));\n }, 5000);\n };\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setLoading(true);\n\n try {\n const endpoint =\n mode === \"login\" ? \"/api/auth/login\" : \"/api/auth/register\";\n const body: Record<string, string> = { email, password };\n if (mode === \"register\") {\n body.confirmPassword = confirmPassword;\n }\n\n const data = await apiPost<any>(endpoint, body);\n\n if (data.isFirstUser) {\n setIsFirstUser(true);\n }\n\n localStorage.setItem(\"kyro_user\", JSON.stringify(data.user));\n addToast(\n \"success\",\n mode === \"login\" ? \"Welcome back!\" : \"Account created!\",\n );\n onAuth(data.token, data.user);\n } catch {\n addToast(\"error\", \"Connection failed\");\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <ThemeProvider defaultMode={theme}>\n <ToastProvider>\n <div className=\"kyro-login-page\">\n <div className=\"kyro-login-container\">\n <div className=\"kyro-login-header\">\n <h1 className=\"kyro-login-title\">\n {isFirstUser\n ? \"Create Admin Account\"\n : mode === \"login\"\n ? \"Sign In\"\n : \"Create Account\"}\n </h1>\n <p className=\"kyro-login-subtitle\">\n {isFirstUser\n ? \"Set up your admin account to get started\"\n : mode === \"login\"\n ? \"Enter your credentials to access the admin\"\n : \"Create an account to access the admin\"}\n </p>\n </div>\n\n <form onSubmit={handleSubmit} className=\"kyro-login-form\">\n <div className=\"kyro-form-group\">\n <label htmlFor=\"email\">Email</label>\n <input\n id=\"email\"\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"admin@example.com\"\n required\n autoComplete=\"email\"\n />\n </div>\n\n <div className=\"kyro-form-group\">\n <label htmlFor=\"password\">Password</label>\n <input\n id=\"password\"\n type=\"password\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"••••••••\"\n required\n minLength={8}\n autoComplete={\n mode === \"login\" ? \"current-password\" : \"new-password\"\n }\n />\n </div>\n\n {mode === \"register\" && (\n <div className=\"kyro-form-group\">\n <label htmlFor=\"confirmPassword\">Confirm Password</label>\n <input\n id=\"confirmPassword\"\n type=\"password\"\n value={confirmPassword}\n onChange={(e) => setConfirmPassword(e.target.value)}\n placeholder=\"••••••••\"\n required\n minLength={8}\n autoComplete=\"new-password\"\n />\n </div>\n )}\n\n <button\n type=\"submit\"\n className=\"kyro-btn kyro-btn-primary kyro-btn-lg\"\n disabled={loading}\n >\n {loading\n ? mode === \"login\"\n ? \"Signing in...\"\n : \"Creating account...\"\n : mode === \"login\"\n ? \"Sign In\"\n : \"Create Account\"}\n </button>\n </form>\n\n {!isFirstUser && (\n <div className=\"kyro-login-footer\">\n <p>\n {mode === \"login\" ? (\n <>\n Don't have an account?{\" \"}\n <button\n type=\"button\"\n className=\"kyro-login-link\"\n onClick={() => setMode(\"register\")}\n >\n Sign up\n </button>\n </>\n ) : (\n <>\n Already have an account?{\" \"}\n <button\n type=\"button\"\n className=\"kyro-login-link\"\n onClick={() => setMode(\"login\")}\n >\n Sign in\n </button>\n </>\n )}\n </p>\n </div>\n )}\n </div>\n\n {toasts.map((toast) => (\n <Toast\n key={toast.id}\n type={toast.type}\n message={toast.message}\n onClose={() =>\n setToasts((prev) => prev.filter((t) => t.id !== toast.id))\n }\n />\n ))}\n </div>\n </ToastProvider>\n </ThemeProvider>\n );\n}\n","import React, { useState, useEffect } from \"react\";\nimport { LayoutDashboard, FileText, Image as ImageIcon, Users, Plus, ArrowUpRight, Activity, Clock as ClockIcon, ArrowRight } from \"./ui/icons\";\nimport { useAuthStore } from \"../lib/stores\";\nimport { authCollectionSlugs } from \"../lib/config\";\nimport { PageHeader } from \"./ui/PageHeader\";\n\n\ninterface DashboardProps {\n collections: Record<string, unknown>;\n onNavigate: (view: string, collection?: string) => void;\n user: Record<string, unknown> | null;\n}\n\nexport function Dashboard({ collections, onNavigate, user }: DashboardProps) {\n const { permissions } = useAuthStore();\n const [stats, setStats] = useState({\n totalDocs: 0,\n totalMedia: 0,\n totalUsers: 0,\n recentActivity: [],\n });\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n // Mock data fetching for high-fidelity look\n const timer = setTimeout(() => {\n setStats({\n totalDocs: 124,\n totalMedia: 856,\n totalUsers: 12,\n recentActivity: [\n {\n id: 1,\n type: \"edit\",\n user: \"Daniel Dozie\",\n doc: \"Getting Started with Kyro\",\n collection: \"posts\",\n time: \"2m ago\",\n },\n {\n id: 2,\n type: \"create\",\n user: \"Jane Smith\",\n doc: \"New Product Launch\",\n collection: \"products\",\n time: \"15m ago\",\n },\n {\n id: 3,\n type: \"upload\",\n user: \"Daniel Dozie\",\n doc: \"hero-banner.jpg\",\n collection: \"media\",\n time: \"1h ago\",\n },\n {\n id: 4,\n type: \"publish\",\n user: \"System\",\n doc: \"Weekly Update\",\n collection: \"posts\",\n time: \"3h ago\",\n },\n ],\n } as { totalDocs: number; totalMedia: number; totalUsers: number; recentActivity: Array<{ id: number; type: string; user: string; doc: string; collection: string; time: string }> });\n setLoading(false);\n }, 800);\n return () => clearTimeout(timer);\n }, []);\n\n const collectionList = Object.entries(collections).filter(\n ([slug]) =>\n !authCollectionSlugs.includes(slug) &&\n permissions?.collections?.[slug]?.read !== false,\n );\n\n return (\n <div className=\"w-full space-y-8 animate-in fade-in slide-in-from-bottom-4 duration-700 px-8 pb-12\">\n <PageHeader\n title={`Welcome back, ${user?.email?.split(\"@\")[0] || \"Admin\"}`}\n description=\"Everything looks great in your command center today.\"\n action={collectionList.length > 0 && permissions?.collections?.[collectionList[0]?.[0]]?.create !== false ? {\n label: \"New Document\",\n onClick: () => onNavigate(\"create\", collectionList[0]?.[0]),\n icon: Plus,\n } : undefined}\n />\n\n\n {/* Stats Grid */}\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6\">\n {[\n {\n label: \"Total Content\",\n value: stats.totalDocs,\n icon: FileText,\n color: \"text-blue-500\",\n },\n {\n label: \"Media Assets\",\n value: stats.totalMedia,\n icon: ImageIcon,\n color: \"text-purple-500\",\n },\n {\n label: \"Active Users\",\n value: stats.totalUsers,\n icon: Users,\n color: \"text-green-500\",\n },\n {\n label: \"System Health\",\n value: \"100%\",\n icon: Activity,\n color: \"text-amber-500\",\n },\n ].map((stat, i) => (\n <div\n key={i}\n className=\"surface-tile p-6 flex items-center justify-between group hover:border-[var(--kyro-primary)] transition-all duration-500 cursor-default\"\n >\n <div>\n <p className=\"text-[10px] font-bold tracking-[0.2em] opacity-40 mb-1\">\n {stat.label}\n </p>\n <h3 className=\"text-3xl font-bold tracking-tighter\">\n {loading ? \"...\" : stat.value}\n </h3>\n </div>\n <div\n className={`p-3 rounded-2xl bg-[var(--kyro-bg-secondary)] group-hover:scale-110 transition-transform duration-500 ${stat.color}`}\n >\n <stat.icon className=\"w-6 h-6\" />\n </div>\n </div>\n ))}\n </div>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-[1fr_400px] gap-8\">\n {/* Main Content Area: Collections & Insights */}\n <div className=\"space-y-8 min-w-0\">\n <section className=\"surface-tile p-8\">\n <h2 className=\"text-xl font-bold mb-1 tracking-tight flex items-center gap-2\">\n <LayoutDashboard className=\"w-5 h-5 opacity-40\" />\n Content Growth\n </h2>\n <p className=\"text-[10px] font-bold tracking-widest opacity-40 mb-8\">\n Snapshot of document velocity over the last 7 days\n </p>\n\n {/* SVG Line Chart */}\n <div className=\"h-48 w-full relative mb-12\">\n <svg\n className=\"w-full h-full\"\n viewBox=\"0 0 1000 200\"\n preserveAspectRatio=\"none\"\n >\n <defs>\n <linearGradient\n id=\"chartGradient\"\n x1=\"0\"\n y1=\"0\"\n x2=\"0\"\n y2=\"1\"\n >\n <stop\n offset=\"0%\"\n stopColor=\"var(--kyro-primary)\"\n stopOpacity=\"0.3\"\n />\n <stop\n offset=\"100%\"\n stopColor=\"var(--kyro-primary)\"\n stopOpacity=\"0\"\n />\n </linearGradient>\n </defs>\n <path\n d=\"M0,180 Q100,140 200,160 T400,100 T600,120 T800,40 T1000,60 L1000,200 L0,200 Z\"\n fill=\"url(#chartGradient)\"\n className=\"animate-pulse duration-[4s]\"\n />\n <path\n d=\"M0,180 Q100,140 200,160 T400,100 T600,120 T800,40 T1000,60\"\n fill=\"none\"\n stroke=\"var(--kyro-primary)\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n vectorEffect=\"non-scaling-stroke\"\n className=\"filter drop-shadow-[0_0_8px_var(--kyro-primary)]\"\n />\n </svg>\n <div className=\"flex justify-between mt-4 text-[10px] font-bold opacity-30 tracking-widest \">\n <span>Mon</span>\n <span>Tue</span>\n <span>Wed</span>\n <span>Thu</span>\n <span>Fri</span>\n <span>Sat</span>\n <span>Sun</span>\n </div>\n </div>\n\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n {collectionList.map(([slug, config]: [string, Record<string, unknown>]) => (\n <div\n key={slug}\n onClick={() => onNavigate(\"list\", slug)}\n className=\"p-6 rounded-2xl border border-[var(--kyro-border)] hover:border-[var(--kyro-primary)] bg-[var(--kyro-bg-secondary)] hover:bg-[var(--kyro-surface)] transition-all cursor-pointer group\"\n >\n <div className=\"flex items-center justify-between mb-2\">\n <h3 className=\"font-bold text-lg tracking-tight group-hover:text-[var(--kyro-primary)] transition-colors\">\n {config.label || slug}\n </h3>\n <ArrowUpRight className=\"w-4 h-4 opacity-0 group-hover:opacity-100 transition-all\" />\n </div>\n <div className=\"w-full h-1 bg-[var(--kyro-bg-secondary)] rounded-full mb-3 overflow-hidden\">\n <div\n className=\"h-full bg-[var(--kyro-primary)]\"\n style={{ width: `${Math.random() * 60 + 20}%` }}\n />\n </div>\n <p className=\"text-sm text-[var(--kyro-text-secondary)] line-clamp-1\">\n {config.admin?.description || `Manage ${slug} content.`}\n </p>\n </div>\n ))}\n </div>\n </section>\n\n <section className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n <section className=\"surface-tile p-6 border border-[var(--kyro-border)] hover:border-[var(--kyro-primary)] transition-all cursor-pointer group\">\n <div className=\"flex items-center justify-between mb-4\">\n <h3 className=\"text-xl font-bold tracking-tight group-hover:text-[var(--kyro-primary)] transition-colors flex items-center gap-2\">\n <Plus className=\"w-5 h-5\" />\n Quick Links\n </h3>\n </div>\n <div className=\"space-y-3\">\n {collectionList\n .filter(([slug]) => permissions?.collections?.[slug]?.create !== false)\n .map(([slug]) => (\n <button type=\"button\"\n key={slug}\n onClick={() => onNavigate(\"new\", slug)}\n className=\"w-full flex items-center justify-between p-4 bg-[var(--kyro-bg-secondary)] border border-[var(--kyro-border)] rounded-xl hover:bg-[var(--kyro-surface-accent)] hover:border-[var(--kyro-primary)] transition-all group/btn\"\n >\n <span className=\"text-sm font-medium text-[var(--kyro-text-primary)]\">\n New {(collections[slug] as Record<string, unknown>)?.singularLabel || (collections[slug] as Record<string, unknown>)?.label || slug}\n </span>\n <Plus className=\"w-4 h-4 text-[var(--kyro-text-secondary)] group-hover/btn:text-[var(--kyro-primary)]\" />\n </button>\n ))}\n {collectionList.every(([slug]) => permissions?.collections?.[slug]?.create === false) && (\n <p className=\"text-sm text-[var(--kyro-text-secondary)] py-2\">No collections available for creation.</p>\n )}\n </div>\n </section>\n\n <div className=\"surface-tile p-8 bg-[#0f172a] text-white border-none shadow-2xl shadow-blue-500/10 overflow-hidden relative group cursor-pointer\">\n <div className=\"relative z-10\">\n <h3 className=\"text-2xl font-bold tracking-tighter mb-2\">\n Media Library\n </h3>\n <p className=\"opacity-80 text-sm font-medium mb-6\">\n Manage high-fidelity assets with our liquid masonry gallery.\n </p>\n <div className=\"flex items-center gap-2 font-bold text-xs tracking-widest text-blue-400\">\n Open Assets{\" \"}\n <ArrowRight className=\"w-4 h-4 group-hover:translate-x-1 transition-transform\" />\n </div>\n </div>\n <ImageIcon className=\"absolute bottom-[-20px] right-[-20px] w-48 h-48 opacity-10 rotate-12 group-hover:scale-110 transition-transform duration-1000\" />\n </div>\n </section>\n </div>\n\n {/* Sidebar Area: Recent Activity */}\n <div className=\"space-y-6\">\n <section className=\"surface-tile p-8\">\n <h2 className=\"text-xl font-bold mb-6 tracking-tight flex items-center gap-2\">\n <ClockIcon className=\"w-5 h-5 opacity-40\" />\n Recent Activity\n </h2>\n <div className=\"space-y-6\">\n {stats.recentActivity.map((act: Record<string, unknown>) => (\n <div key={act.id} className=\"flex gap-4 group\">\n <div className=\"mt-1\">\n <div className=\"w-8 h-8 rounded-full bg-[var(--kyro-bg-secondary)] flex items-center justify-center border border-[var(--kyro-border)] group-hover:bg-[var(--kyro-primary)] transition-colors\">\n <span className=\"text-[10px] font-bold\">\n {act.user[0]}\n </span>\n </div>\n </div>\n <div className=\"flex-1 border-b border-[var(--kyro-border)] pb-4 group-last:border-none\">\n <p className=\"text-sm font-medium text-[var(--kyro-text-primary)] leading-snug\">\n <span className=\"font-bold\">{act.user}</span>{\" \"}\n {act.type === \"create\"\n ? \"created\"\n : act.type === \"edit\"\n ? \"edited\"\n : act.type === \"publish\"\n ? \"published\"\n : \"uploaded\"}{\" \"}\n <span className=\"text-[var(--kyro-primary)] italic\">\n \"{act.doc}\"\n </span>{\" \"}\n in <span className=\"opacity-60\">{act.collection}</span>\n </p>\n <span className=\"text-[10px] font-bold opacity-40 mt-1 block\">\n {act.time}\n </span>\n </div>\n </div>\n ))}\n </div>\n <button type=\"button\" className=\"w-full mt-6 py-3 text-xs font-bold tracking-widest text-[var(--kyro-text-secondary)] hover:text-[var(--kyro-text-primary)] transition-colors border-t border-[var(--kyro-border)] pt-6\">\n View Audit Logs\n </button>\n </section>\n\n <section className=\"surface-tile p-8\">\n <h2 className=\"text-xl font-bold mb-6 tracking-tight flex items-center gap-2\">\n <Activity className=\"w-5 h-5 opacity-40\" />\n System Status\n </h2>\n <div className=\"space-y-4\">\n {[\n {\n label: \"Cloud API\",\n status: \"Optimal\",\n pulse: \"bg-green-500\",\n },\n {\n label: \"Database Node\",\n status: \"Healthy\",\n pulse: \"bg-green-500\",\n },\n { label: \"Media CDN\", status: \"Active\", pulse: \"bg-blue-500\" },\n {\n label: \"Auth Service\",\n status: \"Secure\",\n pulse: \"bg-green-500\",\n },\n ].map((sys, index) => (\n <div\n key={index}\n className=\"flex items-center justify-between p-4 bg-[var(--kyro-bg-secondary)] rounded-2xl border border-[var(--kyro-border)]\"\n >\n <span className=\"text-xs font-bold text-[var(--kyro-text-secondary)]\">\n {sys.label}\n </span>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-[10px] font-bold tracking-widest opacity-60\">\n {sys.status}\n </span>\n <div\n className={`w-2 h-2 rounded-full ${sys.pulse} animate-pulse shadow-[0_0_8px] shadow-current`}\n />\n </div>\n </div>\n ))}\n </div>\n </section>\n </div>\n </div>\n </div>\n );\n}\n","import React, { useState, useEffect } from \"react\";\nimport { apiGet, apiPatch, apiDelete } from \"../lib/api\";\nimport {\n Users,\n UserPlus,\n Shield,\n Lock,\n Unlock,\n MoreVertical,\n Mail,\n Clock,\n Search,\n Filter,\n Trash2,\n Edit2,\n ChevronRight,\n ShieldCheck,\n ShieldAlert\n} from \"./ui/icons\";\nimport { useUIStore, toast } from \"../lib/stores\";\nimport { Badge } from \"./ui/Badge\";\nimport { PageHeader } from \"./ui/PageHeader\";\n\ninterface User {\n id: string;\n email: string;\n name?: string;\n role: string;\n locked?: boolean;\n lastLogin?: string;\n tenantId?: string;\n createdAt: string;\n}\n\nexport function UserManagement() {\n const [users, setUsers] = useState<User[]>([]);\n const [loading, setLoading] = useState(true);\n const [searchQuery, setSearchQuery] = useState(\"\");\n const { confirm, alert } = useUIStore();\n\n useEffect(() => {\n loadUsers();\n }, []);\n\n const loadUsers = async () => {\n try {\n setLoading(true);\n const result = await apiGet<any>(\"/api/users\");\n setUsers(result.docs || []);\n } catch (error) {\n console.error(\"Failed to load users:\", error);\n } finally {\n setLoading(false);\n }\n };\n\n const handleToggleLock = (user: User) => {\n const isLocking = !user.locked;\n confirm({\n title: isLocking ? \"Lock User Account?\" : \"Unlock User Account?\",\n message: isLocking\n ? `Are you sure you want to lock ${user.email}? They will be immediately logged out and unable to return.`\n : `Restore system access for ${user.email}?`,\n variant: isLocking ? \"danger\" : \"success\",\n onConfirm: async () => {\n try {\n await apiPatch(`/api/users/${user.id}`, { locked: isLocking });\n setUsers((prev) =>\n prev.map((u) => (u.id === user.id ? { ...u, locked: isLocking } : u)),\n );\n toast.success(isLocking ? `Account locked: ${user.email}` : `Account restored: ${user.email}`);\n } catch (error) {\n console.error(\"Failed to toggle user lock:\", error);\n }\n },\n });\n };\n\n const handleDelete = (user: User) => {\n confirm({\n title: \"Destroy User Account\",\n message: `You are about to permanently delete ${user.email}. This will remove all their data and cannot be undone.`,\n variant: \"danger\",\n confirmLabel: \"Destroy Account\",\n onConfirm: async () => {\n try {\n await apiDelete(`/api/users/${user.id}`);\n setUsers((prev) => prev.filter((u) => u.id !== user.id));\n toast.success(`Identity purged: ${user.email}`);\n } catch (error) {\n console.error(\"Failed to delete user:\", error);\n }\n },\n });\n };\n\n const filteredUsers = users.filter(\n (u) =>\n u.email.toLowerCase().includes(searchQuery.toLowerCase()) ||\n u.name?.toLowerCase().includes(searchQuery.toLowerCase()),\n );\n\n return (\n <div className=\"w-full space-y-6 animate-in fade-in slide-in-from-bottom-4 duration-700 px-8 pb-12\">\n {/* Header */}\n <PageHeader\n title=\"Identity & Access\"\n description=\"Manage the core administrative team and security permissions.\"\n icon={Users}\n action={{\n label: \"New User\",\n onClick: () => {\n // New user logic\n },\n icon: UserPlus,\n }}\n />\n\n {/* Control Bar */}\n <div className=\"flex flex-col md:flex-row gap-3\">\n <div className=\"relative flex-1 group\">\n <Search className=\"absolute left-3.5 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--kyro-text-secondary)] opacity-40 group-focus-within:opacity-100 transition-opacity\" />\n <input\n type=\"text\"\n placeholder=\"Search by identity or email...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"w-full pl-10 pr-4 py-2.5 bg-[var(--kyro-surface-accent)] border border-[var(--kyro-border)] rounded-xl focus:outline-none focus:ring-2 focus:ring-[var(--kyro-sidebar-active)] transition-all text-xs font-bold\"\n />\n </div>\n <div className=\"flex items-center gap-1 bg-[var(--kyro-surface-accent)] p-1 rounded-xl border border-[var(--kyro-border)]\">\n <button className=\"px-4 py-1.5 text-[10px] font-bold tracking-widest bg-[var(--kyro-surface)] shadow-sm rounded-lg border border-[var(--kyro-border)]\">ALL</button>\n <button className=\"px-4 py-1.5 text-[10px] font-bold tracking-widest opacity-40 hover:opacity-100 transition-all\">ADMINS</button>\n <button className=\"px-4 py-1.5 text-[10px] font-bold tracking-widest opacity-40 hover:opacity-100 transition-all\">LOCKED</button>\n </div>\n </div>\n\n {/* User Table */}\n <div className=\"surface-tile overflow-hidden\">\n <table className=\"w-full text-left table-fixed\">\n <thead>\n <tr className=\"text-[var(--kyro-text-secondary)] font-bold text-[9px] tracking-[0.2em] uppercase border-b border-[var(--kyro-border)]\">\n <th className=\"px-6 py-4 w-64\">Member Identity</th>\n <th className=\"px-6 py-4\">Administrative Role</th>\n <th className=\"px-6 py-4\">Security Status</th>\n <th className=\"px-6 py-4\">Last Activity</th>\n <th className=\"px-6 py-4 w-32 text-right\">Actions</th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-[var(--kyro-border)]\">\n {loading ? (\n Array.from({ length: 6 }).map((_, i) => (\n <tr key={i} className=\"animate-pulse\">\n <td colSpan={5} className=\"px-6 py-5 bg-[var(--kyro-surface-accent)]/30\" />\n </tr>\n ))\n ) : filteredUsers.length === 0 ? (\n <tr>\n <td colSpan={5} className=\"px-6 py-20 text-center\">\n <p className=\"text-xs font-bold opacity-30 tracking-widest uppercase italic\">No identity matches found</p>\n </td>\n </tr>\n ) : (\n filteredUsers.map((user) => (\n <tr key={user.id} className={`hover:bg-[var(--kyro-surface-accent)]/50 transition-colors group ${user.locked ? \"opacity-50 grayscale\" : \"\"}`}>\n <td className=\"px-6 py-3.5\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-8 h-8 rounded-lg bg-[var(--kyro-surface-accent)] border border-[var(--kyro-border)] flex items-center justify-center text-xs font-bold text-[var(--kyro-primary)] group-hover:scale-105 transition-transform\">\n {user.name ? user.name[0] : user.email[0].toUpperCase()}\n </div>\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-2\">\n <div className=\"text-xs font-bold text-[var(--kyro-text-primary)] truncate\">{user.name || user.email.split(\"@\")[0]}</div>\n {user.tenantId && (\n <Badge variant=\"outline\" className=\"text-[7px] px-1 py-0 border-none bg-[var(--kyro-surface-accent)] opacity-50\">\n {user.tenantId}\n </Badge>\n )}\n </div>\n <div className=\"text-[10px] text-[var(--kyro-text-secondary)] opacity-50 truncate\">{user.email}</div>\n </div>\n </div>\n </td>\n <td className=\"px-6 py-3.5\">\n <div className=\"flex items-center gap-2\">\n <Shield className=\"w-3.5 h-3.5 opacity-30\" />\n <span className=\"text-[10px] font-bold tracking-widest uppercase opacity-70\">{user.role}</span>\n </div>\n </td>\n <td className=\"px-6 py-3.5\">\n <Badge variant={user.locked ? \"danger\" : \"success\"} dot className=\"text-[8px] font-bold uppercase tracking-widest\">\n {user.locked ? \"Restricted\" : \"Authorized\"}\n </Badge>\n </td>\n <td className=\"px-6 py-3.5\">\n <div className=\"flex items-center gap-2 text-[10px] font-bold text-[var(--kyro-text-secondary)] opacity-50 uppercase tabular-nums\">\n <Clock className=\"w-3 h-3\" />\n {user.lastLogin ? new Date(user.lastLogin).toLocaleDateString() : \"Never\"}\n </div>\n </td>\n <td className=\"px-6 py-3.5 text-right\">\n <div className=\"flex items-center justify-end gap-1 opacity-0 group-hover:opacity-100 transition-all\">\n <button\n onClick={() => handleToggleLock(user)}\n className={`p-1.5 rounded-lg border transition-all ${user.locked ? \"bg-green-500/10 text-green-500 border-green-500/20 hover:bg-green-500/20\" : \"bg-amber-500/10 text-amber-500 border-amber-500/20 hover:bg-amber-500/20\"}`}\n title={user.locked ? \"Restore Access\" : \"Restrict Access\"}\n >\n {user.locked ? <Unlock className=\"w-3.5 h-3.5\" /> : <Lock className=\"w-3.5 h-3.5\" />}\n </button>\n <button\n onClick={() => handleDelete(user)}\n className=\"p-1.5 rounded-lg border border-red-500/20 bg-red-500/10 text-red-500 hover:bg-red-500/20 transition-all\"\n title=\"Delete User\"\n >\n <Trash2 className=\"w-3.5 h-3.5\" />\n </button>\n <button className=\"p-1.5 rounded-lg border border-[var(--kyro-border)] bg-[var(--kyro-surface-accent)] text-[var(--kyro-text-secondary)] hover:bg-[var(--kyro-surface)] transition-all\">\n <MoreVertical className=\"w-3.5 h-3.5\" />\n </button>\n </div>\n </td>\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n </div>\n );\n}\n","import React, { useState, useEffect } from \"react\";\nimport { apiGet, apiPatch } from \"../lib/api\";\nimport {\n Palette,\n Tag,\n Layout,\n Type,\n Image as ImageIcon,\n Save,\n Check,\n RefreshCcw,\n Sparkles,\n} from \"./ui/icons\";\n\nexport function BrandingHub() {\n const [siteName, setSiteName] = useState(\"Kyro CMS\");\n const [adminTitle, setAdminTitle] = useState(\"Command Center\");\n const [primaryColor, setPrimaryColor] = useState(\"#6366f1\");\n const [dashboardGreeting, setDashboardGreeting] = useState(\n \"Welcome back to your Command Center.\",\n );\n const [saving, setSaving] = useState(false);\n const [saved, setSaved] = useState(false);\n\n useEffect(() => {\n const fetchBranding = async () => {\n try {\n const result = await apiGet(\"/api/globals/site\");\n const data = result.data || result;\n if (data && Object.keys(data).length > 0) {\n if (data.siteName) setSiteName(data.siteName);\n if (data.adminTitle) setAdminTitle(data.adminTitle);\n if (data.primaryColor) setPrimaryColor(data.primaryColor);\n if (data.dashboardGreeting)\n setDashboardGreeting(data.dashboardGreeting);\n }\n } catch (err) {\n console.error(\"Failed to load branding:\", err);\n }\n };\n fetchBranding();\n }, []);\n\n const handleSave = async () => {\n setSaving(true);\n try {\n await apiPatch(\"/api/globals/site\", {\n siteName,\n adminTitle,\n primaryColor,\n dashboardGreeting,\n });\n setSaved(true);\n setTimeout(() => setSaved(false), 3000);\n document.documentElement.style.setProperty(\n \"--kyro-primary\",\n primaryColor,\n );\n } catch (e) {\n console.error(e);\n } finally {\n setSaving(false);\n }\n };\n\n const colors = [\n { name: \"Indigo\", hex: \"#6366f1\" },\n { name: \"Emerald\", hex: \"#10b981\" },\n { name: \"Rose\", hex: \"#f43f5e\" },\n { name: \"Amber\", hex: \"#f59e0b\" },\n { name: \"Sky\", hex: \"#0ea5e9\" },\n { name: \"Violet\", hex: \"#8b5cf6\" },\n ];\n\n return (\n <div className=\"w-full space-y-8 animate-in fade-in slide-in-from-bottom-4 duration-700 pb-32\">\n {/* Header */}\n <div className=\"flex flex-col lg:flex-row lg:items-center justify-between gap-6 pt-4\">\n <div>\n <h1 className=\"text-xl font-bold tracking-tighter text-[var(--kyro-text-primary)]\">\n Branding <span className=\"text-[var(--kyro-primary)]\">Hub</span>\n </h1>\n <p className=\"text-[var(--kyro-text-secondary)] mt-1 font-medium opacity-60\">\n Customize the identity and aesthetic of your administrative\n ecosystem.\n </p>\n </div>\n <div className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={handleSave}\n disabled={saving}\n className={`flex items-center gap-2 px-8 py-3 rounded-2xl font-bold text-sm shadow-xl transition-all active:scale-95 ${saved\n ? \"bg-green-500 text-white\"\n : \"bg-[var(--kyro-primary)] text-white hover:shadow-[var(--kyro-primary)]\"\n }`}\n >\n {saving ? (\n <RefreshCcw className=\"w-4 h-4 animate-spin\" />\n ) : saved ? (\n <Check className=\"w-4 h-4\" />\n ) : (\n <Save className=\"w-4 h-4\" />\n )}\n {saving\n ? \"Saving...\"\n : saved\n ? \"Identity Updated\"\n : \"Publish Branding\"}\n </button>\n </div>\n </div>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-8\">\n {/* Identity Settings */}\n <section className=\"surface-tile p-8 space-y-8\">\n <div className=\"flex items-center gap-3 mb-2\">\n <Tag className=\"w-5 h-5 text-[var(--kyro-primary)]\" />\n <h2 className=\"text-xl font-bold tracking-tight\">Core Identity</h2>\n </div>\n\n <div className=\"space-y-6\">\n <div className=\"space-y-2\">\n <label className=\"text-[10px] font-bold tracking-[0.2em] opacity-40\">\n Site Public Name\n </label>\n <input\n type=\"text\"\n value={siteName}\n onChange={(e) => setSiteName(e.target.value)}\n className=\"w-full bg-[var(--kyro-bg-secondary)] border border-[var(--kyro-border)] rounded-xl py-3 px-4 text-sm font-bold focus:outline-none focus:ring-2 focus:ring-[var(--kyro-primary)] transition-all\"\n placeholder=\"e.g. Acme Corp CMS\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-[10px] font-bold tracking-[0.2em] opacity-40\">\n Admin Dashboard Title\n </label>\n <input\n type=\"text\"\n value={adminTitle}\n onChange={(e) => setAdminTitle(e.target.value)}\n className=\"w-full bg-[var(--kyro-bg-secondary)] border border-[var(--kyro-border)] rounded-xl py-3 px-4 text-sm font-bold focus:outline-none focus:ring-2 focus:ring-[var(--kyro-primary)] transition-all\"\n placeholder=\"e.g. Command Center\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-[10px] font-bold tracking-[0.2em] opacity-40\">\n System Greeting\n </label>\n <textarea\n value={dashboardGreeting}\n onChange={(e) => setDashboardGreeting(e.target.value)}\n rows={3}\n className=\"w-full bg-[var(--kyro-bg-secondary)] border border-[var(--kyro-border)] rounded-xl py-3 px-4 text-sm font-bold focus:outline-none focus:ring-2 focus:ring-[var(--kyro-primary)] transition-all resize-none\"\n placeholder=\"Greeting text for the dashboard...\"\n />\n </div>\n </div>\n </section>\n\n {/* Visual Aesthetic */}\n <section className=\"surface-tile p-8 space-y-8\">\n <div className=\"flex items-center gap-3 mb-2\">\n <Palette className=\"w-5 h-5 text-[var(--kyro-primary)]\" />\n <h2 className=\"text-xl font-bold tracking-tight\">\n Visual Aesthetic\n </h2>\n </div>\n\n <div className=\"space-y-8\">\n <div className=\"space-y-4\">\n <label className=\"text-[10px] font-bold tracking-[0.2em] opacity-40\">\n Primary Brand Color\n </label>\n <div className=\"grid grid-cols-6 gap-3\">\n {colors.map((c) => (\n <button\n type=\"button\"\n key={c.name}\n onClick={() => setPrimaryColor(c.hex)}\n className={`aspect-square rounded-xl transition-all border-4 ${primaryColor === c.hex ? \"border-white ring-2 ring-[var(--kyro-primary)]\" : \"border-transparent opacity-60 hover:opacity-100\"}`}\n style={{ backgroundColor: c.hex }}\n title={c.name}\n />\n ))}\n </div>\n </div>\n\n <div className=\"space-y-4 pt-4 border-t border-[var(--kyro-border)]\">\n <label className=\"text-[10px] font-bold tracking-[0.2em] opacity-40\">\n Project Logo (SVG/PNG)\n </label>\n <div className=\"flex items-center gap-6\">\n <div className=\"w-20 h-20 rounded-2xl bg-[var(--kyro-bg-secondary)] border-2 border-dashed border-[var(--kyro-border)] flex flex-col items-center justify-center text-[var(--kyro-text-secondary)] hover:border-[var(--kyro-primary)] hover:text-[var(--kyro-primary)] cursor-pointer transition-all\">\n <ImageIcon className=\"w-6 h-6 mb-1 opacity-40\" />\n <span className=\"text-[8px] font-bold \">\n Upload\n </span>\n </div>\n <div className=\"flex-1\">\n <p className=\"text-xs font-bold mb-1\">\n Upload global CMS logo\n </p>\n <p className=\"text-[10px] opacity-40 leading-relaxed\">\n This will replace the Kyro brand in the sidebar and login\n screens.\n </p>\n </div>\n </div>\n </div>\n </div>\n </section>\n\n {/* Live Preview of Dashboard Card */}\n <section className=\"lg:col-span-2 surface-tile p-8 overflow-hidden relative group\">\n <div className=\"absolute top-0 right-0 p-8 flex items-center gap-2 text-[var(--kyro-primary)]\">\n <Sparkles className=\"w-4 h-4\" />\n <span className=\"text-[10px] font-bold tracking-widest\">\n Live Preview\n </span>\n </div>\n\n <div className=\"max-w-2xl mx-auto py-12 text-center space-y-6\">\n <div className=\"inline-flex items-center gap-3 px-4 py-2 bg-[var(--kyro-bg-secondary)] rounded-full border border-[var(--kyro-border)]\">\n <span className=\"w-2 h-2 rounded-full bg-green-500 animate-pulse\" />\n <span className=\"text-[10px] font-bold tracking-widest opacity-60\">\n {adminTitle} Online\n </span>\n </div>\n <h2 className=\"text-5xl font-bold tracking-tighter leading-none italic\">\n Welcome to {siteName}.\n </h2>\n <p className=\"text-xl font-medium text-[var(--kyro-text-secondary)] opacity-60\">\n {dashboardGreeting}\n </p>\n </div>\n\n {/* Simulated Palette Update */}\n <style\n dangerouslySetInnerHTML={{\n __html: `\n :root {\n --kyro-primary-temp: ${primaryColor};\n }\n .preview-btn {\n background-color: var(--kyro-primary-temp);\n }\n `,\n }}\n />\n </section>\n </div>\n </div>\n );\n}\n","import React, { useState, useEffect } from \"react\";\nimport { apiGet, apiPost, apiDelete, resolveApi } from \"../lib/api\";\nimport {\n Terminal,\n Key,\n PlayCircle,\n Copy,\n RefreshCcw,\n Trash2,\n ExternalLink,\n ChevronRight,\n Code2,\n Lock,\n Eye,\n EyeOff,\n} from \"./ui/icons\";\nimport CodeMirror from \"@uiw/react-codemirror\";\nimport { json } from \"@codemirror/lang-json\";\nimport { aura } from \"@uiw/codemirror-theme-aura\";\nimport { useUIStore } from \"../lib/stores\";\nimport { Modal, ModalContent, ModalActions } from \"./ui/Modal\";\nimport { PageHeader } from \"./ui/PageHeader\";\nimport { Badge } from \"./ui/Badge\";\n\n// @ts-ignore\nconst API_BASE = typeof __KYRO_API_PATH__ !== 'undefined' ? __KYRO_API_PATH__ : '/api';\n\ninterface ApiKey {\n id: string;\n name: string;\n key: string;\n lastUsed?: string;\n createdAt: string;\n}\n\nexport function DeveloperCenter({ collections }: { collections: Record<string, unknown> }) {\n const [keys, setKeys] = useState<ApiKey[]>([]);\n const [loading, setLoading] = useState(false);\n const [showKey, setShowKey] = useState<string | null>(null);\n const [testEndpoint, setTestEndpoint] = useState(\"\");\n const [playgroundResult, setPlaygroundResult] = useState<unknown>(null);\n const [exploring, setExploring] = useState(false);\n const { confirm, alert } = useUIStore();\n\n const [showCreateModal, setShowCreateModal] = useState(false);\n const [newKeyName, setNewKeyName] = useState(\"\");\n\n const loadKeys = async () => {\n try {\n const data = await apiGet(\"/api/keys\");\n setKeys(data);\n } catch (e) {\n console.error(e);\n }\n };\n\n useEffect(() => {\n loadKeys();\n }, []);\n\n const handleGenerateKey = async () => {\n setNewKeyName(\"\");\n setShowCreateModal(true);\n };\n\n const confirmGenerateKey = async () => {\n if (!newKeyName.trim()) return;\n try {\n await apiPost(\"/api/keys\", { name: newKeyName });\n loadKeys();\n setShowCreateModal(false);\n setNewKeyName(\"\");\n } catch (e) {\n console.error(e);\n alert({ title: \"Error\", message: \"Failed to generate API key\" });\n }\n };\n\n const handleRevokeKey = (id: string) => {\n confirm({\n title: \"Revoke API Key\",\n message: \"Are you sure you want to revoke this key? Any integrations using it will stop working.\",\n variant: \"danger\",\n onConfirm: async () => {\n try {\n await apiDelete(`/api/keys/${id}`);\n loadKeys();\n } catch (e) {\n console.error(e);\n alert({ title: \"Error\", message: \"Failed to revoke API key\" });\n }\n }\n });\n };\n\n const handleRunTest = async () => {\n if (!testEndpoint) return;\n setExploring(true);\n try {\n const response = await fetch(resolveApi(`/api/${testEndpoint}`));\n const data = await response.json();\n setPlaygroundResult(data);\n } catch (e) {\n setPlaygroundResult({\n error: \"Failed to fetch. Ensure the endpoint exists.\",\n });\n } finally {\n setExploring(false);\n }\n };\n\n return (\n <div className=\"w-full space-y-8 animate-in fade-in slide-in-from-bottom-4 duration-700 pb-32\">\n <PageHeader\n title=\"Developer Center\"\n description=\"Provision access keys and explore the headless API ecosystem.\"\n icon={Code2}\n actions={[\n {\n label: \"Generate Key\",\n onClick: handleGenerateKey,\n icon: Key,\n },\n ]}\n />\n\n <div className=\"grid grid-cols-1 xl:grid-cols-3 gap-8\">\n {/* API Key List */}\n <section className=\"xl:col-span-2 space-y-6\">\n <div className=\"flex items-center gap-2 px-2\">\n <div className=\"w-1 h-4 bg-[var(--kyro-primary)] rounded-full\" />\n <h2 className=\"text-sm font-medium tracking-[0.2em] opacity-40 uppercase\">Access Credentials</h2>\n </div>\n\n <div className=\"space-y-4\">\n {keys.length === 0 ? (\n <div className=\"p-12 text-center rounded-[2rem] border-2 border-dashed border-[var(--kyro-border)] bg-[var(--kyro-surface-accent)]/30\">\n <Lock className=\"w-10 h-10 mx-auto mb-4 opacity-20\" />\n <p className=\"text-sm text-[var(--kyro-text-secondary)] opacity-50\">No API keys found. Generate one to get started.</p>\n </div>\n ) : (\n keys.map((key) => (\n <div\n key={key.id}\n className=\"group relative overflow-hidden bg-[var(--kyro-surface)] border border-[var(--kyro-border)] rounded-3xl p-6 hover:border-[var(--kyro-primary)]/50 transition-all duration-300\"\n >\n <div className=\"flex flex-col md:flex-row md:items-center justify-between gap-6 relative z-10\">\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-3 mb-4\">\n <div className=\"p-2.5 bg-[var(--kyro-surface-accent)] rounded-xl group-hover:bg-[var(--kyro-primary)]/10 transition-colors\">\n <Key className=\"w-5 h-5 text-[var(--kyro-text-secondary)] group-hover:text-[var(--kyro-primary)] transition-colors\" />\n </div>\n <h3 className=\"text-lg font-bold group-hover:text-[var(--kyro-primary)] transition-colors truncate\">\n {key.name}\n </h3>\n </div>\n \n <div className=\"flex-1 bg-[var(--kyro-bg)] border border-[var(--kyro-border)] rounded-2xl px-4 py-3 flex items-center justify-between group/key overflow-hidden\">\n <code className=\"text-xs font-mono opacity-80 truncate mr-4\">\n {showKey === key.id\n ? key.key\n : \"••••••••••••••••••••••••••••••••\"}\n </code>\n <div className=\"flex items-center gap-2 shrink-0\">\n <button\n type=\"button\"\n onClick={() =>\n setShowKey(showKey === key.id ? null : key.id)\n }\n className=\"p-1.5 hover:bg-[var(--kyro-surface-accent)] rounded-lg transition-all text-[var(--kyro-text-secondary)]\"\n >\n {showKey === key.id ? (\n <EyeOff className=\"w-4 h-4\" />\n ) : (\n <Eye className=\"w-4 h-4\" />\n )}\n </button>\n <button\n type=\"button\"\n className=\"p-1.5 hover:bg-[var(--kyro-surface-accent)] rounded-lg transition-all text-[var(--kyro-text-secondary)]\"\n onClick={() => {\n navigator.clipboard.writeText(key.key);\n alert({ title: \"Success\", message: \"API key copied to clipboard\" });\n }}\n >\n <Copy className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n \n <div className=\"flex items-center gap-6 mt-4 text-[10px] font-bold opacity-30 uppercase tracking-widest\">\n <div className=\"flex items-center gap-2\">\n <span>Issued:</span>\n <span>{new Date(key.createdAt).toLocaleDateString()}</span>\n </div>\n <div className=\"flex items-center gap-2\">\n <span>Status:</span>\n <span className=\"text-green-500\">Active</span>\n </div>\n </div>\n </div>\n \n <button\n type=\"button\"\n onClick={() => handleRevokeKey(key.id)}\n className=\"p-3.5 bg-red-500/5 text-red-500 rounded-2xl hover:bg-red-500/10 transition-all border border-transparent hover:border-red-500/30 self-start md:self-center\"\n title=\"Revoke Key\"\n >\n <Trash2 className=\"w-5 h-5\" />\n </button>\n </div>\n </div>\n ))\n )}\n </div>\n </section>\n\n {/* Sidebar Info - Modernized */}\n <section className=\"space-y-6\">\n <div className=\"relative overflow-hidden rounded-[2.5rem] border border-[var(--kyro-border)] bg-gradient-to-br from-[var(--kyro-primary)] to-[var(--kyro-primary)]/80 p-8 group shadow-2xl shadow-[var(--kyro-primary)]/20\">\n <div className=\"absolute top-0 right-0 p-8 opacity-[0.1] pointer-events-none group-hover:scale-110 transition-transform duration-700\">\n <Terminal className=\"w-48 h-48 rotate-12\" />\n </div>\n <div className=\"relative z-10\">\n <div className=\"w-12 h-12 bg-white/20 backdrop-blur-md rounded-2xl flex items-center justify-center mb-6\">\n <Terminal className=\"w-6 h-6 text-white\" />\n </div>\n <h3 className=\"text-white text-2xl font-bold tracking-tight mb-3\">\n Endpoint Hub\n </h3>\n <p className=\"text-white/80 text-sm font-medium leading-relaxed mb-8\">\n Kyro CMS is built for high-performance content delivery. Use these endpoints to power your headless frontends.\n </p>\n <button\n type=\"button\"\n className=\"w-full py-4 bg-white text-[var(--kyro-primary)] rounded-[1.2rem] font-bold text-xs uppercase tracking-widest hover:shadow-xl transition-all flex items-center justify-center gap-2 active:scale-[0.98]\"\n >\n Full API Documentation\n <ExternalLink className=\"w-3.5 h-3.5\" />\n </button>\n </div>\n </div>\n\n <div className=\"rounded-[2.5rem] border border-[var(--kyro-border)] bg-[var(--kyro-surface)]/50 p-8 space-y-6\">\n <h4 className=\"text-[10px] font-bold uppercase tracking-[0.2em] opacity-40\">Environment Matrix</h4>\n <div className=\"space-y-5\">\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs font-bold\">Content API</span>\n <Badge variant=\"outline\" className=\"text-[8px] font-bold uppercase py-0.5\">Production</Badge>\n </div>\n <div className=\"group relative\">\n <div className=\"absolute -inset-0.5 bg-gradient-to-r from-[var(--kyro-primary)]/30 to-transparent rounded-xl blur opacity-0 group-hover:opacity-100 transition-all\"></div>\n <div className=\"relative bg-[var(--kyro-bg)] p-3.5 rounded-xl border border-[var(--kyro-border)] flex items-center justify-between\">\n <code className=\"text-[10px] font-mono opacity-60\">https://api.kyro.io/v1</code>\n <Copy className=\"w-3.5 h-3.5 opacity-0 group-hover:opacity-40 cursor-pointer transition-opacity\" onClick={() => navigator.clipboard.writeText('https://api.kyro.io/v1')} />\n </div>\n </div>\n </div>\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs font-bold\">Draft Explorer</span>\n <Badge variant=\"outline\" className=\"text-[8px] font-bold uppercase py-0.5\">Staging</Badge>\n </div>\n <div className=\"group relative\">\n <div className=\"absolute -inset-0.5 bg-gradient-to-r from-amber-500/30 to-transparent rounded-xl blur opacity-0 group-hover:opacity-100 transition-all\"></div>\n <div className=\"relative bg-[var(--kyro-bg)] p-3.5 rounded-xl border border-[var(--kyro-border)] flex items-center justify-between\">\n <code className=\"text-[10px] font-mono opacity-60\">https://preview.kyro.io/v1</code>\n <Copy className=\"w-3.5 h-3.5 opacity-0 group-hover:opacity-40 cursor-pointer transition-opacity\" onClick={() => navigator.clipboard.writeText('https://preview.kyro.io/v1')} />\n </div>\n </div>\n </div>\n </div>\n </div>\n </section>\n\n {/* Playground Explorer - High Fidelity */}\n <section className=\"xl:col-span-3 rounded-[3rem] border border-[var(--kyro-border)] bg-[var(--kyro-surface)]/50 p-10 space-y-10 overflow-hidden relative\">\n <div className=\"absolute top-0 right-0 p-20 opacity-[0.02] pointer-events-none\">\n <PlayCircle className=\"w-96 h-96\" />\n </div>\n \n <div className=\"flex flex-col lg:flex-row lg:items-center justify-between gap-10 relative z-10\">\n <div className=\"max-w-xl\">\n <h2 className=\"text-3xl font-bold tracking-tighter flex items-center gap-4 mb-3\">\n <div className=\"w-12 h-12 bg-[var(--kyro-primary)]/10 rounded-2xl flex items-center justify-center\">\n <PlayCircle className=\"w-7 h-7 text-[var(--kyro-primary)]\" />\n </div>\n API <span className=\"text-[var(--kyro-primary)]\">Explorer</span>\n </h2>\n <p className=\"text-[var(--kyro-text-secondary)] text-sm font-medium opacity-60 leading-relaxed\">\n Test your collection endpoints and analyze live response payloads. \n Enter a collection slug to fetch its latest documents.\n </p>\n </div>\n \n <div className=\"flex items-center gap-4 flex-1 lg:max-w-2xl bg-[var(--kyro-bg)] p-2 rounded-[2rem] border border-[var(--kyro-border)] shadow-2xl\">\n <div className=\"flex-1 relative flex items-center pl-6\">\n <span className=\"text-[11px] font-bold opacity-30 uppercase tracking-widest mr-2 whitespace-nowrap\">\n GET {API_BASE}/\n </span>\n <input\n type=\"text\"\n value={testEndpoint}\n onChange={(e) => setTestEndpoint(e.target.value)}\n placeholder=\"collection-slug\"\n className=\"w-full py-4 bg-transparent focus:outline-none font-mono text-sm font-bold text-[var(--kyro-primary)]\"\n />\n </div>\n <button\n type=\"button\"\n onClick={handleRunTest}\n disabled={exploring || !testEndpoint}\n className=\"px-8 py-4 bg-[var(--kyro-primary)] text-white rounded-[1.5rem] font-bold text-sm shadow-xl disabled:opacity-50 disabled:cursor-not-allowed hover:scale-[1.02] transition-all flex items-center gap-3 shrink-0\"\n >\n {exploring ? (\n <RefreshCcw className=\"w-4 h-4 animate-spin\" />\n ) : (\n <ChevronRight className=\"w-5 h-5\" />\n )}\n Run Query\n </button>\n </div>\n </div>\n\n {playgroundResult ? (\n <div className=\"animate-in fade-in zoom-in-95 duration-500 relative z-10\">\n <div className=\"flex items-center justify-between mb-4 px-2\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-1 h-3 bg-[var(--kyro-primary)] rounded-full\" />\n <span className=\"text-[10px] font-bold uppercase tracking-[0.2em] opacity-40\">Response Payload</span>\n </div>\n <Badge variant=\"outline\" className=\"text-[9px] font-mono px-3\">200 OK</Badge>\n </div>\n <div className=\"rounded-[2rem] overflow-hidden border border-[var(--kyro-border)] shadow-2xl bg-[#090b10]\">\n <div className=\"flex items-center gap-2 px-6 py-4 bg-[#11141d] border-b border-[var(--kyro-border)]/50\">\n <div className=\"w-2.5 h-2.5 rounded-full bg-red-500/20\" />\n <div className=\"w-2.5 h-2.5 rounded-full bg-amber-500/20\" />\n <div className=\"w-2.5 h-2.5 rounded-full bg-green-500/20\" />\n </div>\n <CodeMirror\n value={JSON.stringify(playgroundResult, null, 2)}\n height=\"450px\"\n theme={aura}\n extensions={[json()]}\n editable={false}\n className=\"text-sm\"\n />\n </div>\n </div>\n ) : (\n <div className=\"h-80 rounded-[3rem] border-2 border-dashed border-[var(--kyro-border)] flex flex-col items-center justify-center bg-[var(--kyro-surface-accent)]/20 transition-all duration-700\">\n <div className=\"w-20 h-20 bg-[var(--kyro-surface)] rounded-3xl flex items-center justify-center shadow-lg border border-[var(--kyro-border)] mb-6 opacity-20\">\n <Code2 className=\"w-10 h-10\" />\n </div>\n <p className=\"font-bold text-sm opacity-30 uppercase tracking-[0.2em]\">\n Awaiting request dispatch...\n </p>\n </div>\n )}\n </section>\n </div>\n\n {/* Create Modal */}\n <Modal\n open={showCreateModal}\n onClose={() => setShowCreateModal(false)}\n title=\"Generate Access Token\"\n size=\"lg\"\n >\n <ModalContent>\n <div className=\"space-y-6\">\n <p className=\"text-sm text-[var(--kyro-text-secondary)] opacity-70 leading-relaxed\">\n Define a name for this API key to identify its integration context. \n Keys are encrypted at rest and should be treated with extreme caution.\n </p>\n <div className=\"space-y-2\">\n <label className=\"text-xs font-bold uppercase tracking-widest opacity-40 px-1\">Token Name</label>\n <input\n type=\"text\"\n value={newKeyName}\n onChange={(e) => setNewKeyName(e.target.value)}\n placeholder=\"e.g., Mobile App SDK, Production Server\"\n className=\"w-full px-6 py-4 bg-[var(--kyro-bg)] border border-[var(--kyro-border)] rounded-2xl text-[var(--kyro-text-primary)] focus:outline-none focus:border-[var(--kyro-primary)] shadow-sm transition-all\"\n onKeyDown={(e) => e.key === \"Enter\" && confirmGenerateKey()}\n />\n </div>\n </div>\n </ModalContent>\n <ModalActions>\n <button\n type=\"button\"\n onClick={() => setShowCreateModal(false)}\n className=\"px-6 py-3 rounded-xl font-bold text-sm border border-[var(--kyro-border)] text-[var(--kyro-text-secondary)] hover:bg-[var(--kyro-surface-accent)] transition-all\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={confirmGenerateKey}\n className=\"px-8 py-3 rounded-xl font-bold text-sm bg-[var(--kyro-primary)] text-white hover:opacity-90 shadow-lg shadow-[var(--kyro-primary)]/20 transition-all\"\n >\n Generate Token\n </button>\n </ModalActions>\n </Modal>\n </div>\n );\n}\n","import React, { useEffect, type ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport function ModalContent({ children }: { children: ReactNode }) {\n return <div className=\"text-[var(--kyro-text-secondary)]\">{children}</div>;\n}\n\nexport function ModalActions({ children }: { children: ReactNode }) {\n return (\n <div className=\"flex items-center justify-end gap-3 mt-6\">{children}</div>\n );\n}\n\ninterface ModalProps {\n open: boolean;\n onClose: () => void;\n title: string;\n children: ReactNode;\n footer?: ReactNode;\n size?: \"sm\" | \"md\" | \"lg\";\n variant?: \"default\" | \"danger\";\n}\n\nexport function Modal({\n open,\n onClose,\n title,\n children,\n footer,\n size = \"md\",\n variant = \"default\",\n}: ModalProps) {\n useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n };\n\n if (open) {\n document.addEventListener(\"keydown\", handleEscape);\n document.body.style.overflow = \"hidden\";\n }\n\n return () => {\n document.removeEventListener(\"keydown\", handleEscape);\n document.body.style.overflow = \"\";\n };\n }, [open, onClose]);\n\n if (!open) return null;\n\n const sizeClasses = {\n sm: \"max-w-sm\",\n md: \"max-w-md\",\n lg: \"max-w-lg\",\n };\n\n return createPortal(\n <div className=\"fixed inset-0 z-[9999] flex items-center justify-center p-4\">\n <div\n className=\"absolute inset-0 bg-[var(--kyro-black)]/40 backdrop-blur-md transition-all duration-500\"\n onClick={onClose}\n />\n <div\n className={`relative w-full ${sizeClasses[size]} bg-[var(--kyro-surface)] rounded-[var(--kyro-radius-lg)] shadow-2xl animate-in fade-in zoom-in-95 duration-300 border ${variant === \"danger\"\n ? \"border-red-500/30\"\n : \"border-[var(--kyro-border)]\"\n } overflow-hidden`}\n >\n <div className=\"flex items-center justify-between px-8 py-6 border-b border-[var(--kyro-border)] bg-[var(--kyro-surface-accent)]/50 backdrop-blur-md\">\n <h2 className=\"text-xl font-bold text-[var(--kyro-text-primary)]\">\n {title}\n </h2>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"p-2 text-[var(--kyro-text-muted)] hover:text-[var(--kyro-text-primary)] rounded-xl hover:bg-[var(--kyro-surface)] transition-all duration-200\"\n >\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n >\n <path d=\"M18 6L6 18M6 6l12 12\" />\n </svg>\n </button>\n </div>\n <div className=\"px-8 py-8\">{children}</div>\n {footer && (\n <div className=\"flex items-center justify-end gap-3 px-8 py-6 border-t border-[var(--kyro-border)] bg-[var(--kyro-surface-accent)]/50\">\n {footer}\n </div>\n )}\n </div>\n </div>,\n document.body,\n );\n\n}\n\ninterface ConfirmModalProps {\n open: boolean;\n onClose: () => void;\n onConfirm: () => void;\n title: string;\n message: string;\n confirmLabel?: string;\n cancelLabel?: string;\n variant?: \"default\" | \"danger\";\n loading?: boolean;\n}\n\nexport function ConfirmModal({\n open,\n onClose,\n onConfirm,\n title,\n message,\n confirmLabel = \"Confirm\",\n cancelLabel = \"Cancel\",\n variant = \"default\",\n loading = false,\n}: ConfirmModalProps) {\n return (\n <Modal\n open={open}\n onClose={onClose}\n title={title}\n size=\"sm\"\n footer={\n <>\n <button\n type=\"button\"\n onClick={onClose}\n disabled={loading}\n className=\"kyro-btn kyro-btn-md kyro-btn-secondary\"\n >\n {cancelLabel}\n </button>\n <button\n type=\"button\"\n onClick={onConfirm}\n disabled={loading}\n className={`kyro-btn kyro-btn-md ${variant === \"danger\"\n ? \"kyro-btn-danger\"\n : \"kyro-btn-primary\"\n }`}\n >\n {loading ? \"Loading...\" : confirmLabel}\n </button>\n </>\n }\n >\n <p className=\"text-[var(--kyro-text-secondary)]\">{message}</p>\n </Modal>\n );\n}\n","import React, { useState, useEffect } from \"react\";\nimport { apiGet, apiPost, apiPatch, apiDelete } from \"../lib/api\";\nimport { useResourceManager } from \"../lib/useResourceManager\";\n\nimport {\n Webhook,\n Plus,\n Trash2,\n Play,\n Pause,\n Send,\n AlertTriangle,\n CheckCircle2,\n Clock,\n RefreshCw,\n Info,\n ExternalLink,\n Zap,\n Shield,\n} from \"./ui/icons\";\nimport { useUIStore, toast } from \"../lib/stores\";\nimport { Modal, ModalContent, ModalActions } from \"./ui/Modal\";\nimport { Badge } from \"./ui/Badge\";\nimport { PageHeader } from \"./ui/PageHeader\";\n\n\ninterface WebhookItem {\n id: string;\n name: string;\n url: string;\n events: string[];\n secret?: string;\n status: \"active\" | \"paused\";\n lastTriggered?: string;\n createdAt: string;\n}\n\nexport function WebhookManager() {\n const {\n items: webhooks,\n loading,\n create,\n remove,\n update,\n isCreateModalOpen: showCreateModal,\n setIsCreateModalOpen: setShowCreateModal,\n } = useResourceManager<WebhookItem>({\n endpoint: \"/api/webhooks\",\n });\n\n const { alert } = useUIStore();\n const [showTestModal, setShowTestModal] = useState(false);\n const [showHelpModal, setShowHelpModal] = useState(false);\n const [testResult, setTestResult] = useState<{\n success: boolean;\n message: string;\n } | null>(null);\n const [testId, setTestId] = useState<string | null>(null);\n const [formData, setFormData] = useState({\n name: \"\",\n url: \"\",\n events: [] as string[],\n secret: \"\",\n });\n const [createError, setCreateError] = useState(\"\");\n\n const handleCreate = async () => {\n if (!formData.name.trim() || !formData.url.trim()) {\n setCreateError(\"Name and URL are required\");\n return;\n }\n\n try {\n await create(formData);\n setFormData({ name: \"\", url: \"\", events: [], secret: \"\" });\n toast.success(`Webhook established: ${formData.name}`);\n } catch (e) {\n setCreateError(\"Failed to create webhook\");\n }\n };\n\n\n const handleTest = async (id: string) => {\n setTestId(id);\n setTestResult(null);\n setShowTestModal(true);\n try {\n const data = await apiPost<any>(`/api/webhooks/${id}/test`);\n setTestResult({\n success: true,\n message: data.message || \"Webhook triggered successfully\",\n });\n toast.success(\"Dispatch verified: Remote endpoint responded\");\n } catch (e) {\n setTestResult({ success: false, message: \"Failed to trigger webhook\" });\n }\n };\n\n const toggleStatus = async (id: string, currentStatus: string) => {\n try {\n const newStatus = currentStatus === \"active\" ? \"paused\" : \"active\";\n await update(id, {\n status: newStatus,\n });\n toast.success(newStatus === \"active\" ? \"Signals resumed\" : \"Dispatcher paused\");\n } catch (e) {\n console.error(e);\n }\n };\n\n const eventOptions = [\n {\n label: \"Create\",\n value: \"create\",\n description: \"When a new document is created\",\n },\n {\n label: \"Update\",\n value: \"update\",\n description: \"When a document is updated\",\n },\n {\n label: \"Delete\",\n value: \"delete\",\n description: \"When a document is deleted\",\n },\n { label: \"Auth\", value: \"auth\", description: \"User login/logout events\" },\n ];\n\n return (\n <div className=\"w-full space-y-8 animate-in fade-in slide-in-from-bottom-4 duration-700 pb-32\">\n <PageHeader\n title=\"Webhooks\"\n description=\"Receive real-time notifications when your content changes.\"\n icon={Webhook}\n actions={[\n {\n label: \"Create Webhook\",\n onClick: () => {\n setFormData({\n name: \"\",\n url: \"\",\n events: [\"collection.create\", \"collection.update\", \"collection.delete\"],\n secret: \"\",\n });\n setCreateError(\"\");\n setShowCreateModal(true);\n },\n icon: Plus,\n },\n {\n label: \"Guide\",\n onClick: () => setShowHelpModal(true),\n icon: Info,\n variant: \"outline\"\n }\n ]}\n />\n\n {/* Info Banner - Modernized */}\n <div className=\"relative overflow-hidden rounded-[2rem] border border-[var(--kyro-border)] bg-gradient-to-br from-[var(--kyro-surface)] to-[var(--kyro-surface-accent)] p-8\">\n <div className=\"absolute top-0 right-0 p-8 opacity-[0.03] pointer-events-none\">\n <Zap className=\"w-64 h-64 rotate-12\" />\n </div>\n <div className=\"flex flex-col md:flex-row items-center gap-8 relative z-10\">\n <div className=\"p-5 bg-gradient-to-br from-[var(--kyro-primary)] to-[var(--kyro-primary)]/50 rounded-[1.5rem] shadow-xl shadow-[var(--kyro-primary)]/20\">\n <Zap className=\"w-8 h-8 text-white\" />\n </div>\n <div className=\"flex-1 text-center md:text-left\">\n <h3 className=\"text-xl font-bold mb-2\">Real-time Event Synchronization</h3>\n <p className=\"text-sm text-[var(--kyro-text-secondary)] opacity-70 max-w-2xl leading-relaxed\">\n Webhooks allow your application to receive instant HTTP notifications when events happen in your CMS.\n Eliminate polling and build responsive, event-driven architectures with ease.\n </p>\n </div>\n <div className=\"flex gap-4\">\n <div className=\"flex flex-col items-center px-4 py-2 bg-[var(--kyro-surface)]/50 border border-[var(--kyro-border)] rounded-2xl\">\n <span className=\"text-[10px] font-bold opacity-40 uppercase tracking-tighter\">Collections</span>\n <span className=\"text-sm font-bold text-[var(--kyro-primary)]\">Triggered</span>\n </div>\n <div className=\"flex flex-col items-center px-4 py-2 bg-[var(--kyro-surface)]/50 border border-[var(--kyro-border)] rounded-2xl\">\n <span className=\"text-[10px] font-bold opacity-40 uppercase tracking-tighter\">Latency</span>\n <span className=\"text-sm font-bold text-[var(--kyro-primary)]\"><200ms</span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Webhooks List */}\n <section className=\"space-y-6\">\n <div className=\"flex items-center justify-between px-2\">\n <div className=\"flex items-center gap-2\">\n <div className=\"w-1 h-4 bg-[var(--kyro-primary)] rounded-full\" />\n <h2 className=\"text-sm font-medium tracking-[0.2em] opacity-40\">ACTIVE ENDPOINTS</h2>\n </div>\n <div className=\"text-[10px] font-bold opacity-40 uppercase\">\n {webhooks.length} Hook{webhooks.length !== 1 && \"s\"}\n </div>\n </div>\n\n {loading ? (\n <div className=\"flex items-center justify-center p-20 surface-tile rounded-3xl opacity-50 italic\">\n Connecting to dispatcher...\n </div>\n ) : webhooks.length === 0 ? (\n <div className=\"p-16 text-center rounded-[3rem] border-2 border-dashed border-[var(--kyro-border)] bg-[var(--kyro-surface-accent)]/30\">\n <div className=\"w-20 h-20 mx-auto mb-6 bg-gradient-to-tr from-[var(--kyro-surface)] to-[var(--kyro-surface-accent)] rounded-3xl flex items-center justify-center shadow-xl border border-[var(--kyro-border)]\">\n <Webhook className=\"w-10 h-10 text-[var(--kyro-primary)]\" />\n </div>\n <h3 className=\"text-2xl font-bold mb-3\">No Webhooks Found</h3>\n <p className=\"text-sm text-[var(--kyro-text-secondary)] opacity-60 mb-8 max-w-sm mx-auto\">\n Your CMS is currently silent. Create a webhook to start broadcasting events to your external services.\n </p>\n <button\n type=\"button\"\n onClick={() => setShowCreateModal(true)}\n className=\"inline-flex items-center gap-3 px-8 py-4 bg-[var(--kyro-primary)] text-white rounded-2xl font-bold hover:scale-[1.05] transition-all shadow-xl shadow-[var(--kyro-primary)]/10\"\n >\n <Plus className=\"w-5 h-5\" />\n Configure Webhook\n </button>\n </div>\n ) : (\n <div className=\"grid gap-4\">\n {webhooks.map((webhook) => (\n <div\n key={webhook.id}\n className=\"group relative overflow-hidden bg-[var(--kyro-surface)] border border-[var(--kyro-border)] rounded-3xl p-6 hover:border-[var(--kyro-primary)]/50 transition-all duration-300\"\n >\n <div className=\"flex flex-col lg:flex-row lg:items-center justify-between gap-6 relative z-10\">\n <div className=\"flex-1\">\n <div className=\"flex items-center gap-3 mb-4\">\n <div className=\"p-2.5 bg-[var(--kyro-surface-accent)] rounded-xl group-hover:bg-[var(--kyro-primary)]/10 transition-colors\">\n <Webhook className=\"w-5 h-5 text-[var(--kyro-text-secondary)] group-hover:text-[var(--kyro-primary)] transition-colors\" />\n </div>\n <div>\n <h3 className=\"text-lg font-bold group-hover:text-[var(--kyro-primary)] transition-colors\">{webhook.name}</h3>\n <div className=\"flex items-center gap-2 mt-0.5\">\n <span className={`w-2 h-2 rounded-full ${webhook.status === \"active\" ? \"bg-green-500 animate-pulse\" : \"bg-amber-500\"}`} />\n <span className={`text-[10px] font-bold uppercase tracking-wider ${webhook.status === \"active\" ? \"text-green-500\" : \"text-amber-500\"}`}>\n {webhook.status}\n </span>\n </div>\n </div>\n </div>\n\n <div className=\"grid sm:grid-cols-3 gap-6 pt-2\">\n <div className=\"space-y-1\">\n <span className=\"text-[9px] font-bold uppercase tracking-widest opacity-30\">Destination</span>\n <div className=\"font-mono text-xs opacity-60 truncate max-w-[200px]\" title={webhook.url}>\n {webhook.url}\n </div>\n </div>\n <div className=\"space-y-1 border-l border-[var(--kyro-border)] pl-6\">\n <span className=\"text-[9px] font-bold uppercase tracking-widest opacity-30\">Events</span>\n <div className=\"flex flex-wrap gap-1\">\n {webhook.events.slice(0, 2).map((event) => (\n <Badge key={event} variant=\"outline\" className=\"text-[8px] font-bold px-1.5 opacity-60\">\n {event}\n </Badge>\n ))}\n {webhook.events.length > 2 && (\n <span className=\"text-[8px] font-bold opacity-30\">+{webhook.events.length - 2} more</span>\n )}\n </div>\n </div>\n <div className=\"space-y-1 border-l border-[var(--kyro-border)] pl-6\">\n <span className=\"text-[9px] font-bold uppercase tracking-widest opacity-30\">Activity</span>\n <div className=\"text-[10px] font-bold opacity-60 flex items-center gap-1.5\">\n <Clock className=\"w-3 h-3\" />\n {webhook.lastTriggered\n ? `Last triggered: ${new Date(webhook.lastTriggered).toLocaleDateString()}`\n : \"Never triggered\"}\n </div>\n </div>\n </div>\n </div>\n\n <div className=\"flex items-center gap-2 lg:bg-[var(--kyro-surface-accent)]/50 lg:p-2 lg:rounded-2xl lg:opacity-0 group-hover:opacity-100 transition-all duration-300 lg:translate-x-4 group-hover:translate-x-0\">\n <button\n type=\"button\"\n onClick={() => handleTest(webhook.id)}\n className=\"flex-1 lg:flex-none p-3 bg-[var(--kyro-surface)] border border-[var(--kyro-border)] rounded-xl hover:border-[var(--kyro-primary)] transition-all flex items-center justify-center gap-2\"\n title=\"Send test request\"\n >\n <Send className=\"w-4 h-4\" />\n <span className=\"text-xs font-bold\">Test</span>\n </button>\n\n <div className=\"w-px h-6 bg-[var(--kyro-border)] mx-1 hidden lg:block\" />\n\n <button\n type=\"button\"\n onClick={() => toggleStatus(webhook.id, webhook.status)}\n className={`p-3 bg-[var(--kyro-surface)] border border-[var(--kyro-border)] rounded-xl hover:border-[var(--kyro-primary)] transition-all group/toggle ${webhook.status === \"active\" ? \"text-amber-500/50 hover:text-amber-500\" : \"text-green-500/50 hover:text-green-500\"}`}\n title={webhook.status === \"active\" ? \"Pause webhook\" : \"Activate webhook\"}\n >\n {webhook.status === \"active\" ? <Pause className=\"w-4 h-4\" /> : <Play className=\"w-4 h-4\" />}\n </button>\n\n <button\n type=\"button\"\n onClick={() => remove(webhook.id, \"Webhook\")}\n className=\"p-3 bg-red-500/5 border border-red-500/10 rounded-xl hover:bg-red-500/10 hover:border-red-500/30 transition-all group/delete\"\n title=\"Delete webhook\"\n >\n <Trash2 className=\"w-4 h-4 text-red-500/50 group-hover/delete:text-red-500\" />\n </button>\n </div>\n </div>\n </div>\n ))}\n </div>\n )}\n </section>\n\n {/* Create Modal */}\n <Modal\n open={showCreateModal}\n onClose={() => setShowCreateModal(false)}\n title=\"Register Webhook\"\n size=\"lg\"\n >\n <ModalContent>\n <div className=\"space-y-6\">\n <div className=\"flex flex-col gap-6\">\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-xs font-bold mb-1.5 text-[var(--kyro-text-secondary)] uppercase tracking-wider\">Webhook Name</label>\n <input\n type=\"text\"\n value={formData.name}\n onChange={(e) =>\n setFormData({ ...formData, name: e.target.value })\n }\n placeholder=\"e.g., Slack Notifications\"\n className=\"w-full px-4 py-3 bg-[var(--kyro-bg)] border border-[var(--kyro-border)] rounded-xl text-[var(--kyro-text-primary)] focus:outline-none focus:border-[var(--kyro-primary)]\"\n />\n </div>\n <div>\n <label className=\"block text-xs font-bold mb-1.5 text-[var(--kyro-text-secondary)] uppercase tracking-wider\">Payload URL</label>\n <input\n type=\"url\"\n value={formData.url}\n onChange={(e) =>\n setFormData({ ...formData, url: e.target.value })\n }\n placeholder=\"https://your-server.com/webhook\"\n className=\"w-full px-4 py-3 bg-[var(--kyro-bg)] border border-[var(--kyro-border)] rounded-xl text-[var(--kyro-text-primary)] focus:outline-none focus:border-[var(--kyro-primary)]\"\n />\n </div>\n <div>\n <label className=\"block text-xs font-bold mb-1.5 text-[var(--kyro-text-secondary)] uppercase tracking-wider\">Signing Secret</label>\n <input\n type=\"text\"\n value={formData.secret}\n onChange={(e) =>\n setFormData({ ...formData, secret: e.target.value })\n }\n placeholder=\"Optional secret for verification\"\n className=\"w-full px-4 py-3 bg-[var(--kyro-bg)] border border-[var(--kyro-border)] rounded-xl text-[var(--kyro-text-primary)] focus:outline-none focus:border-[var(--kyro-primary)]\"\n />\n </div>\n </div>\n\n <div className=\"space-y-4\">\n <label className=\"block text-xs font-bold mb-1.5 text-[var(--kyro-text-secondary)] uppercase tracking-wider\">Subscribed Events</label>\n <div className=\"grid grid-cols-2 gap-4\">\n {eventOptions.map((opt) => (\n <button\n type=\"button\"\n key={opt.value}\n onClick={() => {\n const events = formData.events.includes(opt.value)\n ? formData.events.filter((e) => e !== opt.value)\n : [...formData.events, opt.value];\n setFormData({ ...formData, events });\n }}\n className={`flex items-center gap-3 p-3 rounded-lg border transition-all text-left ${formData.events.includes(opt.value)\n ? \"bg-[var(--kyro-primary)]/5 border-[var(--kyro-primary)]/30 text-[var(--kyro-primary)]\"\n : \"bg-[var(--kyro-surface-accent)]/50 border-[var(--kyro-border)] hover:border-[var(--kyro-primary)]/30\"\n }`}\n >\n <div className={`w-4 h-4 rounded flex items-center justify-center border transition-all ${formData.events.includes(opt.value) ? \"bg-[var(--kyro-primary)] border-[var(--kyro-primary)]\" : \"border-[var(--kyro-border)]\"}`}>\n {formData.events.includes(opt.value) && <CheckCircle2 className=\"w-3 h-3 text-white\" />}\n </div>\n <div>\n <div className=\"text-xs font-bold\">{opt.label}</div>\n <div className=\"text-[10px] opacity-50\">{opt.description}</div>\n </div>\n </button>\n ))}\n </div>\n </div>\n </div>\n\n {createError && (\n <div className=\"p-3 bg-red-500/10 border border-red-500/20 rounded-xl flex items-center gap-2 text-red-500 text-xs font-bold\">\n <AlertTriangle className=\"w-4 h-4\" />\n {createError}\n </div>\n )}\n </div>\n </ModalContent>\n <ModalActions>\n <button\n type=\"button\"\n onClick={() => setShowCreateModal(false)}\n className=\"px-6 py-2.5 rounded-xl font-bold text-sm border border-[var(--kyro-border)] text-[var(--kyro-text-secondary)] hover:bg-[var(--kyro-surface-accent)] transition-colors\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={handleCreate}\n className=\"px-6 py-2.5 rounded-xl font-bold text-sm bg-[var(--kyro-primary)] text-white hover:opacity-90 transition-all shadow-lg shadow-[var(--kyro-primary)]/10\"\n >\n Create Webhook\n </button>\n </ModalActions>\n </Modal>\n\n {/* Test Webhook Modal */}\n <Modal\n open={showTestModal}\n onClose={() => setShowTestModal(false)}\n title=\"Webhook Test Dispatcher\"\n >\n <ModalContent>\n <div className=\"p-8 rounded-[2rem] bg-[var(--kyro-surface-accent)]/30 border border-[var(--kyro-border)] text-center\">\n {testResult ? (\n <div className=\"space-y-6\">\n <div className={`w-16 h-16 mx-auto rounded-2xl flex items-center justify-center shadow-xl ${testResult.success ? \"bg-green-500/10 text-green-500\" : \"bg-red-500/10 text-red-500\"}`}>\n {testResult.success ? <CheckCircle2 className=\"w-8 h-8\" /> : <AlertTriangle className=\"w-8 h-8\" />}\n </div>\n <div>\n <h4 className=\"text-xl font-bold mb-2\">{testResult.success ? \"Dispatch Successful\" : \"Dispatch Failed\"}</h4>\n <p className=\"text-sm text-[var(--kyro-text-secondary)] opacity-70\">\n {testResult.message}\n </p>\n </div>\n </div>\n ) : (\n <div className=\"space-y-6 py-4\">\n <RefreshCw className=\"w-12 h-12 text-[var(--kyro-primary)] animate-spin mx-auto opacity-50\" />\n <div>\n <h4 className=\"text-xl font-bold mb-1\">Synthesizing Payload</h4>\n <p className=\"text-sm text-[var(--kyro-text-secondary)] opacity-50 italic\">Dispatching to remote endpoint...</p>\n </div>\n </div>\n )}\n </div>\n </ModalContent>\n <ModalActions>\n <button\n type=\"button\"\n onClick={() => setShowTestModal(false)}\n className=\"w-full py-3 rounded-xl font-bold text-sm bg-[var(--kyro-surface-accent)] border border-[var(--kyro-border)] hover:bg-[var(--kyro-surface)] transition-all\"\n >\n Acknowledge\n </button>\n </ModalActions>\n </Modal>\n\n {/* Help Modal */}\n <Modal\n open={showHelpModal}\n onClose={() => setShowHelpModal(false)}\n title=\"Webhook Integration Guide\"\n size=\"lg\"\n >\n <ModalContent>\n <div className=\"space-y-8\">\n <div className=\"grid grid-cols-1 gap-6\">\n <div className=\"p-6 rounded-3xl bg-[var(--kyro-surface-accent)]/50 border border-[var(--kyro-border)]\">\n <h4 className=\"font-bold mb-3 flex items-center gap-2\">\n <ExternalLink className=\"w-4 h-4 text-[var(--kyro-primary)]\" />\n Request Context\n </h4>\n <p className=\"text-sm text-[var(--kyro-text-secondary)] leading-relaxed\">\n When an event triggers, Kyro sends a standard <span className=\"font-bold text-[var(--kyro-text-primary)]\">POST</span> request\n to your endpoint with a JSON payload containing document metadata and operation details.\n </p>\n </div>\n <div className=\"p-6 rounded-3xl bg-[var(--kyro-surface-accent)]/50 border border-[var(--kyro-border)]\">\n <h4 className=\"font-bold mb-3 flex items-center gap-2\">\n <Shield className=\"w-4 h-4 text-[var(--kyro-primary)]\" />\n Security Verification\n </h4>\n <p className=\"text-sm text-[var(--kyro-text-secondary)] leading-relaxed\">\n If a secret is provided, each request includes an <span className=\"font-mono text-[var(--kyro-primary)]\">X-Kyro-Signature</span> header.\n Always verify this signature in production environments.\n </p>\n </div>\n </div>\n\n <div className=\"space-y-3\">\n <h4 className=\"text-xs font-bold uppercase tracking-widest opacity-40 px-1\">Payload Architecture</h4>\n <div className=\"relative group\">\n <div className=\"absolute -inset-1 bg-gradient-to-r from-[var(--kyro-primary)]/20 to-transparent rounded-2xl blur opacity-25 group-hover:opacity-50 transition-all\"></div>\n <div className=\"relative bg-[var(--kyro-bg)] rounded-2xl border border-[var(--kyro-border)] p-6 font-mono text-sm overflow-hidden\">\n <div className=\"flex items-center gap-2 mb-4 border-b border-[var(--kyro-border)] pb-4 opacity-30\">\n <div className=\"w-2 h-2 rounded-full bg-red-500/50\" />\n <div className=\"w-2 h-2 rounded-full bg-amber-500/50\" />\n <div className=\"w-2 h-2 rounded-full bg-green-500/50\" />\n <span className=\"text-[10px] ml-2 tracking-tighter\">payload.json</span>\n </div>\n <div className=\"space-y-1\">\n <div className=\"text-[var(--kyro-text-secondary)]\">{\"{\"}</div>\n <div className=\"pl-4\"><span className=\"text-[var(--kyro-primary)]\">\"event\"</span>: <span className=\"text-green-500\">\"collection.create\"</span>,</div>\n <div className=\"pl-4\"><span className=\"text-[var(--kyro-primary)]\">\"collection\"</span>: <span className=\"text-green-500\">\"products\"</span>,</div>\n <div className=\"pl-4\"><span className=\"text-[var(--kyro-primary)]\">\"id\"</span>: <span className=\"text-green-500\">\"prod_8273\"</span>,</div>\n <div className=\"pl-4\"><span className=\"text-[var(--kyro-primary)]\">\"timestamp\"</span>: <span className=\"text-green-500\">\"2026-05-14T02:53:22Z\"</span></div>\n <div className=\"text-[var(--kyro-text-secondary)]\">{\"}\"}</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ModalContent>\n <ModalActions>\n <button\n type=\"button\"\n onClick={() => setShowHelpModal(false)}\n className=\"w-full py-3 rounded-xl font-bold text-sm bg-[var(--kyro-primary)] text-white hover:opacity-90 transition-all shadow-lg shadow-[var(--kyro-primary)]/20\"\n >\n I Understand\n </button>\n </ModalActions>\n </Modal>\n </div>\n );\n}\n","import { useState, useEffect, useCallback } from \"react\";\nimport { apiGet, apiPost, apiDelete, apiPatch } from \"./api\";\nimport { useUIStore } from \"./stores\";\n\ninterface UseResourceManagerOptions<T> {\n endpoint: string;\n onSuccess?: (action: \"load\" | \"create\" | \"delete\" | \"update\", data?: unknown) => void;\n onError?: (action: \"load\" | \"create\" | \"delete\" | \"update\", error: unknown) => void;\n transformLoad?: (data: unknown[]) => T[];\n}\n\nexport function useResourceManager<T extends { id: string }>(\n options: UseResourceManagerOptions<T>\n) {\n const [items, setItems] = useState<T[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [isCreateModalOpen, setIsCreateModalOpen] = useState(false);\n const { confirm, alert } = useUIStore();\n\n const load = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const response = await apiGet<any>(options.endpoint);\n const data = Array.isArray(response) ? response : response.docs || [];\n const transformed = options.transformLoad ? options.transformLoad(data) : data;\n setItems(transformed);\n options.onSuccess?.(\"load\", transformed);\n} catch (e: unknown) {\n const message = e instanceof Error ? e.message : \"Failed to load resources\";\n setError(message);\n options.onError?.(\"load\", e as Error);\n } finally {\n setLoading(false);\n }\n }, [options.endpoint, options.transformLoad]);\n\n useEffect(() => {\n load();\n }, [load]);\n\n const remove = useCallback((id: string, resourceName = \"item\") => {\n confirm({\n title: `Delete ${resourceName}`,\n message: `Are you sure you want to delete this ${resourceName.toLowerCase()}? This action cannot be undone.`,\n variant: \"danger\",\n onConfirm: async () => {\n try {\n await apiDelete(`${options.endpoint}/${id}`);\n setItems((prev) => prev.filter((item) => item.id !== id));\n options.onSuccess?.(\"delete\", id);\n} catch (e: unknown) {\n const message = e instanceof Error ? e.message : `Failed to delete ${resourceName}`;\n alert({ title: \"Error\", message });\n options.onError?.(\"delete\", e as Error);\n }\n },\n });\n }, [options.endpoint, confirm, alert]);\n\n const create = useCallback(async (data: unknown) => {\n setError(null);\n try {\n const created = await apiPost<T>(options.endpoint, data);\n setItems((prev) => [created, ...prev]);\n setIsCreateModalOpen(false);\n options.onSuccess?.(\"create\", created);\n return created;\n} catch (e: unknown) {\n const message = e instanceof Error ? e.message : \"Failed to create resource\";\n setError(message);\n options.onError?.(\"create\", e as Error);\n throw e;\n }\n }, [options.endpoint]);\n\n const update = useCallback(async (id: string, data: unknown) => {\n setError(null);\n try {\n const updated = await apiPatch<T>(`${options.endpoint}/${id}`, data);\n setItems((prev) => prev.map((item) => (item.id === id ? updated : item)));\n options.onSuccess?.(\"update\", updated);\n return updated;\n} catch (e: unknown) {\n const message = e instanceof Error ? e.message : \"Failed to update resource\";\n setError(message);\n options.onError?.(\"update\", e as Error);\n throw e;\n }\n }, [options.endpoint]);\n\n return {\n items,\n setItems,\n loading,\n error,\n load,\n remove,\n create,\n update,\n isCreateModalOpen,\n setIsCreateModalOpen,\n };\n}\n","import React, { useState, useEffect, useCallback, useRef, useMemo } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { Spinner } from \"./ui/Spinner\";\nimport { SlidePanel } from \"./ui/SlidePanel\";\nimport { Badge } from \"./ui/Badge\";\nimport { Folder } from \"./ui/icons\";\n\nimport {\n Trash2,\n Download,\n Maximize2,\n X,\n FileIcon,\n FolderInput,\n FolderPlus,\n Grid,\n Link,\n Crop as CropIcon,\n Film,\n Music,\n FileText,\n Archive,\n} from \"./ui/icons\";\nimport { PromptModal } from \"./ui/PromptModal\";\nimport ReactCrop, {\n type Crop,\n centerCrop,\n makeAspectCrop,\n convertToPixelCrop,\n} from \"react-image-crop\";\nimport \"react-image-crop/dist/ReactCrop.css\";\nimport {\n apiGet,\n apiPost,\n apiDelete,\n apiPatch,\n withCacheBust,\n apiUpload,\n} from \"../lib/api\";\nimport { useAuthStore, useUIStore } from \"../lib/stores\";\n\ninterface MediaItem {\n id: string;\n title: string;\n filename: string;\n originalName?: string;\n url: string;\n thumbnailUrl?: string;\n type: \"image\" | \"video\" | \"audio\" | \"document\" | \"archive\" | \"other\";\n mimeType: string;\n fileSize: number;\n folder?: string;\n alt?: string;\n caption?: string;\n createdAt: string;\n updatedAt?: string;\n}\n\nfunction getAbsoluteUrl(relativeUrl: string): string {\n if (typeof window === \"undefined\") return relativeUrl;\n // Remote URLs and blob URLs are returned as-is\n if (relativeUrl.startsWith(\"http\") || relativeUrl.startsWith(\"blob:\")) {\n return relativeUrl;\n }\n // Remove consecutive slashes for local paths (e.g. //photo... -> /photo...)\n const sanitized = relativeUrl.replace(/^\\/+/, \"/\");\n return `${window.location.origin}${sanitized}`;\n}\n\ntype FilterType =\n | \"all\"\n | \"image\"\n | \"video\"\n | \"audio\"\n | \"document\"\n | \"archive\"\n | \"other\";\n\nfunction formatFileSize(bytes: number): string {\n if (bytes === 0) return \"0 B\";\n const k = 1024;\n const sizes = [\"B\", \"KB\", \"MB\", \"GB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + \" \" + sizes[i];\n}\n\nfunction formatDate(dateString: string): string {\n const date = new Date(dateString);\n return date.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n}\n\nfunction getFileType(mimeType: string): FilterType {\n if (mimeType.startsWith(\"image/\")) return \"image\";\n if (mimeType.startsWith(\"video/\")) return \"video\";\n if (mimeType.startsWith(\"audio/\")) return \"audio\";\n if (\n mimeType.includes(\"zip\") ||\n mimeType.includes(\"tar\") ||\n mimeType.includes(\"archive\")\n )\n return \"archive\";\n if (\n mimeType.includes(\"pdf\") ||\n mimeType.includes(\"doc\") ||\n mimeType.includes(\"text\")\n )\n return \"document\";\n return \"other\";\n}\n\nexport function MediaGallery({\n onSelect,\n multiple = false,\n}: {\n onSelect?: (items: MediaItem[]) => void;\n multiple?: boolean;\n}) {\n const { permissions } = useAuthStore();\n const canUpload = permissions?.media?.create !== false;\n const canDelete = permissions?.media?.delete !== false;\n const canUpdate = permissions?.media?.update !== false;\n\n const [items, setItems] = useState<MediaItem[]>([]);\n const [loading, setLoading] = useState(true);\n const [folders, setFolders] = useState<string[]>([]);\n const [currentFolder, setCurrentFolder] = useState<string>(\"\");\n const [search, setSearch] = useState(\"\");\n const [filter, setFilter] = useState<FilterType>(\"all\");\n const [view, setView] = useState<\"grid\" | \"list\">(\"grid\");\n const [panelItem, setPanelItem] = useState<MediaItem | null>(null);\n const [showPreview, setShowPreview] = useState(false);\n const [showCrop, setShowCrop] = useState(false);\n const [uploading, setUploading] = useState(false);\n const [uploadProgress, setUploadProgress] = useState<Record<string, number>>(\n {},\n );\n const [showNewFolderModal, setShowNewFolderModal] = useState(false);\n const [storageConfigured, setStorageConfigured] = useState<boolean | null>(\n null,\n );\n const [showStorageConfigModal, setShowStorageConfigModal] = useState(false);\n const [page, setPage] = useState(1);\n const [total, setTotal] = useState(0);\n const [totalPages, setTotalPages] = useState(1);\n const limit = 40;\n\n const [selectedIds, setSelectedIds] = useState<Set<string>>(new Set());\n const { confirm, alert } = useUIStore();\n const [isDragging, setIsDragging] = useState(false);\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n const [crop, setCrop] = useState<Crop>();\n const imgRef = useRef<HTMLImageElement>(null);\n\n const loadMedia = useCallback(async () => {\n setLoading(true);\n try {\n const params = new URLSearchParams({\n page: page.toString(),\n limit: limit.toString(),\n });\n if (currentFolder) params.append(\"folder\", currentFolder);\n if (search) params.append(\"search\", search);\n if (filter !== \"all\") params.append(\"type\", filter);\n\n const result = await apiGet(withCacheBust(`/api/media?${params}`));\n setItems((result.docs || []).map((doc: Record<string, unknown>) => ({\n ...doc,\n type: getFileType(doc.mimeType),\n })));\n setTotal(result.totalDocs || 0);\n setTotalPages(result.totalPages || 1);\n } catch (error) {\n console.error(\"Failed to load media:\", error);\n } finally {\n setLoading(false);\n }\n }, [page, currentFolder, search, filter]);\n\n const loadFolders = useCallback(async () => {\n try {\n const result = await apiGet(withCacheBust(\"/api/media/folders\"));\n setFolders(Array.isArray(result) ? result : result.folders || []);\n } catch (error) {\n console.error(\"Failed to load folders:\", error);\n }\n }, []);\n\n const checkStorage = useCallback(async () => {\n try {\n const res = await apiGet(\"/api/globals/storage-settings\");\n const isConfigured = !!res?.data?.provider;\n setStorageConfigured(isConfigured);\n } catch (e) {\n setStorageConfigured(false);\n }\n }, []);\n\n useEffect(() => {\n checkStorage();\n }, [checkStorage]);\n\n useEffect(() => {\n loadMedia();\n }, [loadMedia]);\n\n useEffect(() => {\n loadFolders();\n }, [loadFolders]);\n\n useEffect(() => {\n const handlePaste = (e: ClipboardEvent) => {\n const files = e.clipboardData?.files;\n if (files && files.length > 0) {\n handleUpload(files);\n }\n };\n window.addEventListener(\"paste\", handlePaste);\n return () => window.removeEventListener(\"paste\", handlePaste);\n }, [currentFolder, storageConfigured]);\n\n const handleUpload = async (files: FileList | File[]) => {\n if (!storageConfigured) {\n setShowStorageConfigModal(true);\n return;\n }\n\n setUploading(true);\n const newProgress = { ...uploadProgress };\n\n for (let i = 0; i < files.length; i++) {\n const file = files[i];\n try {\n const formData = new FormData();\n formData.append(\"file\", file);\n if (currentFolder) formData.append(\"folder\", currentFolder);\n\n await apiUpload(\"/api/media/upload\", formData, (progress: number) => {\n setUploadProgress((prev) => ({\n ...prev,\n [file.name]: progress,\n }));\n });\n } catch (error) {\n console.error(`Upload failed for ${file.name}:`, error);\n alert({ title: \"Upload Failed\", message: `Failed to upload ${file.name}` });\n }\n }\n\n setUploading(false);\n setUploadProgress({});\n loadMedia();\n loadFolders();\n };\n\n const handleBulkDelete = () => {\n confirm({\n title: \"Delete Media\",\n message: `Are you sure you want to delete ${selectedIds.size} item(s)? This cannot be undone.`,\n variant: \"danger\",\n onConfirm: async () => {\n try {\n for (const id of Array.from(selectedIds)) {\n await apiDelete(`/api/media/${id}`);\n }\n setSelectedIds(new Set());\n loadMedia();\n } catch (error) {\n console.error(\"Bulk delete failed:\", error);\n alert({ title: \"Error\", message: \"Failed to delete some items\" });\n }\n }\n });\n };\n\n const handleSelectOne = (id: string, e: React.SyntheticEvent) => {\n e.stopPropagation();\n const newSet = new Set(selectedIds);\n if (newSet.has(id)) {\n newSet.delete(id);\n } else {\n if (!multiple) newSet.clear();\n newSet.add(id);\n }\n setSelectedIds(newSet);\n };\n\n const createFolder = async (name: string) => {\n try {\n await apiPost(\"/api/media/folders\", { name });\n loadFolders();\n setShowNewFolderModal(false);\n } catch (error) {\n console.error(\"Failed to create folder:\", error);\n }\n };\n\n const handleDeleteFolder = (folder: string) => {\n confirm({\n title: \"Delete Folder\",\n message: `Are you sure you want to delete the folder \"${folder}\"? All media in this folder will be moved to the root.`,\n variant: \"danger\",\n confirmLabel: \"Delete Folder\",\n onConfirm: async () => {\n try {\n await apiDelete(`/api/media/folders?path=${encodeURIComponent(folder)}`);\n if (currentFolder === folder) setCurrentFolder(\"\");\n loadFolders();\n loadMedia();\n } catch (error) {\n console.error(\"Failed to delete folder:\", error);\n alert({ title: \"Error\", message: \"Failed to delete folder\" });\n }\n }\n });\n };\n\n const updateMetadata = async (id: string, data: Partial<MediaItem>) => {\n try {\n const result = await apiPatch(`/api/media/${id}`, data);\n setItems((prev) => prev.map((item) => (item.id === id ? result.doc : item)));\n if (panelItem?.id === id) {\n setPanelItem(result.doc);\n }\n } catch (error) {\n console.error(\"Failed to update metadata:\", error);\n }\n };\n\n const onImageLoad = (e: React.SyntheticEvent<HTMLImageElement>) => {\n const { width, height } = e.currentTarget;\n const initialCrop = centerCrop(\n makeAspectCrop({ unit: \"%\", width: 90 }, 1, width, height),\n width,\n height,\n );\n setCrop(initialCrop);\n };\n\n const onCropComplete = async () => {\n if (!crop || !imgRef.current || !panelItem) return;\n\n setUploading(true);\n try {\n const pixelCrop = convertToPixelCrop(\n crop,\n imgRef.current.width,\n imgRef.current.height,\n );\n\n const canvas = document.createElement(\"canvas\");\n const scaleX = imgRef.current.naturalWidth / imgRef.current.width;\n const scaleY = imgRef.current.naturalHeight / imgRef.current.height;\n\n canvas.width = pixelCrop.width;\n canvas.height = pixelCrop.height;\n const ctx = canvas.getContext(\"2d\");\n\n if (ctx) {\n ctx.drawImage(\n imgRef.current,\n pixelCrop.x * scaleX,\n pixelCrop.y * scaleY,\n pixelCrop.width * scaleX,\n pixelCrop.height * scaleY,\n 0,\n 0,\n pixelCrop.width,\n pixelCrop.height,\n );\n\n const blob = await new Promise<Blob | null>((resolve) =>\n canvas.toBlob(resolve, panelItem.mimeType),\n );\n\n if (blob) {\n const formData = new FormData();\n formData.append(\"file\", blob, `cropped-${panelItem.filename}`);\n if (currentFolder) formData.append(\"folder\", currentFolder);\n\n await apiUpload(\"/api/media\", formData);\n loadMedia();\n setShowCrop(false);\n }\n }\n } catch (err) {\n console.error(\"Crop failed:\", err);\n } finally {\n setUploading(false);\n }\n };\n\n const stats = useMemo(() => {\n return items.reduce(\n (acc, item) => {\n acc.totalSize += item.fileSize || 0;\n return acc;\n },\n { totalSize: 0 },\n );\n }, [items]);\n\n return (\n <div\n className={`flex flex-col h-full bg-[var(--kyro-bg)] transition-all duration-300 ${isDragging ? \"ring-4 ring-[var(--kyro-sidebar-active)] ring-inset\" : \"\"}`}\n onDragOver={(e) => {\n e.preventDefault();\n setIsDragging(true);\n }}\n onDragLeave={() => setIsDragging(false)}\n onDrop={(e) => {\n e.preventDefault();\n setIsDragging(false);\n if (e.dataTransfer.files) handleUpload(e.dataTransfer.files);\n }}\n >\n {/* Top Bar */}\n <div className=\"flex flex-col lg:flex-row lg:items-center justify-between p-6 gap-6 border-b border-[var(--kyro-border)] surface-tile backdrop-blur-md sticky top-0 z-40 rounded-xl\">\n <div className=\"flex items-center gap-4\">\n <div>\n <h2 className=\"text-xl font-bold tracking-tighter text-[var(--kyro-text-primary)]\">\n Media Library\n </h2>\n <div className=\"flex items-center gap-3 mt-1\">\n <span className=\"text-[10px] font-bold tracking-widest text-[var(--kyro-text-secondary)] opacity-50\">\n {total} Items · {formatFileSize(stats.totalSize)}\n </span>\n </div>\n </div>\n </div>\n\n <div className=\"flex items-center gap-3 flex-wrap lg:flex-nowrap\">\n <div className=\"relative group flex-1 min-w-[240px]\">\n <svg\n className=\"absolute left-4 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--kyro-text-secondary)] opacity-40 group-focus-within:opacity-100 transition-opacity\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2.5\"\n d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\"\n />\n </svg>\n <input\n type=\"text\"\n placeholder=\"Search assets...\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"w-full pl-11 pr-4 py-2.5 bg-[var(--kyro-surface-accent)] border border-[var(--kyro-border)] rounded-xl focus:outline-none focus:ring-2 focus:ring-[var(--kyro-sidebar-active)] transition-all text-xs font-bold\"\n />\n </div>\n\n <div className=\"flex bg-[var(--kyro-surface-accent)] p-1 rounded-xl border border-[var(--kyro-border)]\">\n <button\n onClick={() => setView(\"grid\")}\n className={`p-2 rounded-lg transition-all ${view === \"grid\" ? \"bg-[var(--kyro-surface)] shadow-sm text-[var(--kyro-text-primary)]\" : \"text-[var(--kyro-text-secondary)] opacity-50 hover:opacity-100\"}`}\n >\n <Grid className=\"w-4 h-4\" />\n </button>\n <button\n onClick={() => setView(\"list\")}\n className={`p-2 rounded-lg transition-all ${view === \"list\" ? \"bg-[var(--kyro-surface)] shadow-sm text-[var(--kyro-text-primary)]\" : \"text-[var(--kyro-text-secondary)] opacity-50 hover:opacity-100\"}`}\n >\n <FileIcon className=\"w-4 h-4\" />\n </button>\n </div>\n\n {canUpload && (\n <button\n onClick={() => fileInputRef.current?.click()}\n className=\"flex items-center gap-2 px-6 py-2.5 bg-[var(--kyro-sidebar-active)] text-[var(--kyro-sidebar-text-active)] rounded-xl font-bold text-xs shadow-lg active:scale-95 transition-all\"\n >\n <Maximize2 className=\"w-4 h-4\" />\n Upload\n </button>\n )}\n </div>\n </div>\n\n <div className=\"flex flex-1 min-h-0 overflow-hidden\">\n {/* Folders Sidebar */}\n <div className=\"w-64 border-r border-[var(--kyro-border)] surface-tile mt-6 overflow-y-auto hidden md:block\">\n <div className=\"p-6 space-y-6\">\n <div>\n <span className=\"text-[10px] font-bold tracking-[0.2em] text-[var(--kyro-text-secondary)] opacity-40 block mb-4\">\n Quick Filters\n </span>\n <div className=\"space-y-1\">\n {(\n [\n \"all\",\n \"image\",\n \"video\",\n \"audio\",\n \"document\",\n \"archive\",\n ] as const\n ).map((t) => (\n <button\n key={t}\n onClick={() => setFilter(t)}\n className={`w-full flex items-center gap-3 px-4 py-2 rounded-xl text-[11px] font-bold capitalize transition-all ${filter === t ? \"text-[var(--kyro-text-primary)] bg-[var(--kyro-surface-accent)]\" : \"text-[var(--kyro-text-secondary)] hover:text-[var(--kyro-text-primary)] hover:bg-[var(--kyro-surface-accent)]/50\"}`}\n >\n <span\n className={`w-1.5 h-1.5 rounded-full ${filter === t ? \"bg-[var(--kyro-primary)]\" : \"bg-transparent border border-current opacity-30\"}`}\n />\n {t}\n </button>\n ))}\n </div>\n </div>\n\n <div className=\"pt-6 border-t border-[var(--kyro-border)]\">\n <div className=\"flex items-center justify-between mb-4\">\n <span className=\"text-[10px] font-bold tracking-[0.2em] text-[var(--kyro-text-secondary)] opacity-40\">\n Folders\n </span>\n <button\n onClick={() => setShowNewFolderModal(true)}\n className=\"p-1.5 hover:bg-[var(--kyro-surface-accent)] rounded-lg transition-colors text-[var(--kyro-text-primary)]\"\n >\n <FolderPlus className=\"w-4 h-4\" />\n </button>\n </div>\n\n <nav className=\"space-y-1\">\n <button\n onClick={() => setCurrentFolder(\"\")}\n className={`w-full flex items-center gap-3 px-4 py-2.5 rounded-xl text-xs font-bold transition-all ${currentFolder === \"\" ? \"bg-[var(--kyro-sidebar-active)] text-[var(--kyro-sidebar-text-active)] shadow-md\" : \"text-[var(--kyro-text-secondary)] hover:bg-[var(--kyro-surface-accent)] hover:text-[var(--kyro-text-primary)]\"}`}\n >\n <FolderInput className=\"w-4 h-4 opacity-70\" />\n All Assets\n </button>\n {folders.map((folder) => (\n <div key={folder} className=\"group relative\">\n <button\n onClick={() => setCurrentFolder(folder)}\n className={`w-full flex items-center gap-3 px-4 py-2.5 rounded-xl text-xs font-bold transition-all ${currentFolder === folder ? \"bg-[var(--kyro-sidebar-active)] text-[var(--kyro-sidebar-text-active)] shadow-md\" : \"text-[var(--kyro-text-secondary)] hover:bg-[var(--kyro-surface-accent)] hover:text-[var(--kyro-text-primary)]\"}`}\n >\n <div className=\"w-4 h-4 flex items-center justify-center opacity-70\">\n <Folder fill={currentFolder === folder ? \"currentColor\" : \"none\"} />\n </div>\n {folder}\n </button>\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleDeleteFolder(folder);\n }}\n className=\"absolute right-2 top-1/2 -translate-y-1/2 p-1.5 text-red-500 opacity-0 group-hover:opacity-100 transition-all hover:bg-red-50 rounded-lg\"\n >\n <Trash2 className=\"w-3.5 h-3.5\" />\n </button>\n </div>\n ))}\n </nav>\n </div>\n </div>\n </div>\n\n {/* Main Content Area */}\n <div className=\"flex-1 flex flex-col min-h-0 bg-[var(--kyro-bg)]\">\n <div className=\"flex-1 overflow-y-auto py-8 px-4 custom-scrollbar\">\n {loading ? (\n <div className=\"flex items-center justify-center h-64\">\n <Spinner />\n </div>\n ) : items.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center py-32 text-center\">\n <div className=\"w-24 h-24 rounded-[2rem] bg-[var(--kyro-surface-accent)] flex items-center justify-center mb-8 rotate-12 group-hover:rotate-0 transition-transform duration-500\">\n <Grid className=\"w-10 h-10 text-[var(--kyro-text-muted)] opacity-30\" />\n </div>\n <h3 className=\"text-xl font-bold text-[var(--kyro-text-primary)] tracking-tight\">\n No assets found\n </h3>\n <p className=\"text-[var(--kyro-text-secondary)] mt-2 max-w-xs mx-auto text-sm font-medium leading-relaxed\">\n Upload your first file or create a folder to organize your\n media assets.\n </p>\n {canUpload && (\n <button\n onClick={() => fileInputRef.current?.click()}\n className=\"mt-8 px-8 py-3 bg-[var(--kyro-text-primary)] text-[var(--kyro-bg)] rounded-2xl font-bold text-xs hover:scale-105 transition-all shadow-xl\"\n >\n Start Uploading\n </button>\n )}\n </div>\n ) : view === \"grid\" ? (\n <div className=\"grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5 2xl:grid-cols-6 gap-1\">\n {items.map((item, index) => (\n <div\n key={item.id}\n className={`group relative aspect-square rounded-lg overflow-hidden bg-[var(--kyro-surface-accent)] border-2 transition-all duration-300 cursor-pointer ${selectedIds.has(item.id) ? \"border-[var(--kyro-primary)]\" : \"border-transparent hover:border-[var(--kyro-border-strong)] hover:shadow-2xl hover:-translate-y-1\"}`}\n onClick={() => setPanelItem(item)}\n onContextMenu={(e) => {\n e.preventDefault();\n handleSelectOne(item.id, e);\n }}\n >\n {item.type === \"image\" ? (\n <img\n src={item.url}\n alt={item.title}\n className=\"w-full h-full object-cover transition-transform duration-700 group-hover:scale-110\"\n loading=\"lazy\"\n />\n ) : (\n <div className=\"w-full h-full flex flex-col items-center justify-center p-6 gap-4\">\n <div className=\"p-4 rounded-2xl bg-[var(--kyro-surface)] shadow-inner text-[var(--kyro-text-secondary)] group-hover:scale-110 transition-transform duration-500\">\n {item.type === \"video\" ? (\n <Film className=\"w-8 h-8\" />\n ) : item.type === \"audio\" ? (\n <Music className=\"w-8 h-8\" />\n ) : item.type === \"document\" ? (\n <FileText className=\"w-8 h-8\" />\n ) : item.type === \"archive\" ? (\n <Archive className=\"w-8 h-8\" />\n ) : (\n <FileIcon className=\"w-8 h-8\" />\n )}\n </div>\n <span className=\"text-[10px] font-bold tracking-widest text-[var(--kyro-text-secondary)] opacity-50 text-center px-4 line-clamp-2\">\n {item.title}\n </span>\n </div>\n )}\n\n <div className=\"absolute inset-0 bg-gradient-to-t from-black/80 via-black/20 to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-300 flex flex-col justify-end p-4\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-white font-bold text-[10px] truncate max-w-[120px]\">\n {item.filename}\n </span>\n <div className=\"flex gap-1\">\n <button\n onClick={(e) => handleSelectOne(item.id, e)}\n className={`p-1.5 rounded-lg transition-all ${selectedIds.has(item.id) ? \"bg-[var(--kyro-primary)] text-white\" : \"bg-white/10 text-white hover:bg-white/20\"}`}\n >\n <svg\n className=\"w-3 h-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"3\"\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n </button>\n </div>\n </div>\n </div>\n\n {selectedIds.has(item.id) && (\n <div className=\"absolute top-3 left-3 w-6 h-6 rounded-lg bg-[var(--kyro-primary)] text-white flex items-center justify-center shadow-lg border-2 border-white/20 animate-in zoom-in duration-300\">\n <svg\n className=\"w-3 h-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"3\"\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n </div>\n )}\n </div>\n ))}\n </div>\n ) : (\n <div className=\"surface-tile overflow-hidden animate-in fade-in duration-500\">\n <table className=\"w-full text-left\">\n <thead>\n <tr className=\"text-[10px] font-bold tracking-[0.2em] text-[var(--kyro-text-secondary)] opacity-40 border-b border-[var(--kyro-border)]\">\n <th className=\"px-6 py-4 w-12\">\n <input\n type=\"checkbox\"\n className=\"w-4 h-4 rounded border-[var(--kyro-border)] text-[var(--kyro-primary)] focus:ring-[var(--kyro-primary)]\"\n checked={selectedIds.size === items.length}\n onChange={(e) => {\n if (e.target.checked)\n setSelectedIds(new Set(items.map((i) => i.id)));\n else setSelectedIds(new Set());\n }}\n />\n </th>\n <th className=\"px-6 py-4\">Asset</th>\n <th className=\"px-6 py-4\">Type</th>\n <th className=\"px-6 py-4\">Size</th>\n <th className=\"px-6 py-4\">Date</th>\n <th className=\"px-6 py-4 text-right\">Actions</th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-[var(--kyro-border)]\">\n {items.map((item) => (\n <tr\n key={item.id}\n className={`group hover:bg-[var(--kyro-surface-accent)] transition-colors cursor-pointer ${selectedIds.has(item.id) ? \"bg-[var(--kyro-surface-accent)]\" : \"\"}`}\n onClick={() => setPanelItem(item)}\n >\n <td\n className=\"px-6 py-4\"\n onClick={(e) => e.stopPropagation()}\n >\n <input\n type=\"checkbox\"\n checked={selectedIds.has(item.id)}\n onChange={(e) => handleSelectOne(item.id, e)}\n className=\"w-4 h-4 rounded border-[var(--kyro-border)] text-[var(--kyro-primary)] focus:ring-[var(--kyro-primary)]\"\n />\n </td>\n <td className=\"px-6 py-4\">\n <div className=\"flex items-center gap-4\">\n <div className=\"w-12 h-12 rounded-xl bg-[var(--kyro-bg)] overflow-hidden border border-[var(--kyro-border)] flex-shrink-0 flex items-center justify-center\">\n {item.type === \"image\" ? (\n <img\n src={item.url}\n alt=\"\"\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <FileIcon className=\"w-5 h-5 text-[var(--kyro-text-secondary)] opacity-50\" />\n )}\n </div>\n <div className=\"flex flex-col min-w-0\">\n <span className=\"font-bold text-xs text-[var(--kyro-text-primary)] truncate max-w-[200px]\">\n {item.title || item.filename}\n </span>\n <span className=\"text-[10px] text-[var(--kyro-text-secondary)] opacity-50 truncate\">\n {item.filename}\n </span>\n </div>\n </div>\n </td>\n <td className=\"px-6 py-4\">\n <Badge variant=\"outline\" className=\"text-[9px]\">\n {item.mimeType}\n </Badge>\n </td>\n <td className=\"px-6 py-4 text-[11px] font-bold text-[var(--kyro-text-secondary)]\">\n {formatFileSize(item.fileSize)}\n </td>\n <td className=\"px-6 py-4 text-[11px] font-bold text-[var(--kyro-text-secondary)]\">\n {formatDate(item.createdAt)}\n </td>\n <td className=\"px-6 py-4 text-right\">\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleSelectOne(item.id, e);\n }}\n className={`p-2 rounded-lg transition-all ${selectedIds.has(item.id) ? \"bg-[var(--kyro-primary)] text-white\" : \"text-[var(--kyro-text-secondary)] hover:bg-[var(--kyro-surface-accent)] opacity-0 group-hover:opacity-100\"}`}\n >\n <Grid className=\"w-4 h-4\" />\n </button>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </div>\n\n {/* Pagination */}\n {totalPages > 1 && (\n <div className=\"p-6 border-t border-[var(--kyro-border)] bg-[var(--kyro-surface)]/50 backdrop-blur-md flex items-center justify-between\">\n <span className=\"text-[10px] font-bold tracking-widest text-[var(--kyro-text-secondary)] opacity-50\">\n Page {page} of {totalPages}\n </span>\n <div className=\"flex gap-2\">\n <button\n disabled={page === 1}\n onClick={() => setPage(page - 1)}\n className=\"px-4 py-2 border border-[var(--kyro-border)] rounded-xl text-xs font-bold text-[var(--kyro-text-secondary)] hover:bg-[var(--kyro-surface-accent)] disabled:opacity-30 transition-all\"\n >\n Previous\n </button>\n <button\n disabled={page === totalPages}\n onClick={() => setPage(page + 1)}\n className=\"px-6 py-2 bg-[var(--kyro-sidebar-active)] text-[var(--kyro-sidebar-text-active)] rounded-xl text-xs font-bold shadow-lg hover:opacity-90 disabled:opacity-30 transition-all\"\n >\n Next\n </button>\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* Upload Banner */}\n {uploading && (\n <div className=\"fixed bottom-12 left-1/2 -translate-x-1/2 z-[60] w-full max-w-lg\">\n <div className=\"bg-[var(--kyro-surface)] border border-[var(--kyro-border)] rounded-[2rem] shadow-2xl p-6 ring-1 ring-white/10 animate-in slide-in-from-bottom-12 duration-700\">\n <div className=\"flex items-center justify-between mb-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-8 h-8 rounded-full bg-[var(--kyro-sidebar-active)] text-[var(--kyro-sidebar-text-active)] flex items-center justify-center animate-pulse\">\n <Spinner />\n </div>\n <span className=\"text-sm font-bold tracking-tight text-[var(--kyro-text-primary)]\">\n Uploading Files\n </span>\n </div>\n <span className=\"text-[10px] font-bold tracking-[0.2em] text-[var(--kyro-text-secondary)] opacity-50\">\n {Object.keys(uploadProgress).length} Total\n </span>\n </div>\n <div className=\"space-y-4 max-h-[160px] overflow-y-auto pr-2 custom-scrollbar\">\n {Object.entries(uploadProgress).map(([name, progress]) => (\n <div key={name} className=\"space-y-2\">\n <div className=\"flex justify-between text-[10px] font-bold\">\n <span className=\"text-[var(--kyro-text-primary)] truncate max-w-[200px]\">\n {name}\n </span>\n <span className=\"text-[var(--kyro-primary)]\">\n {progress}%\n </span>\n </div>\n <div className=\"h-1.5 w-full bg-[var(--kyro-surface-accent)] rounded-full overflow-hidden\">\n <div\n className=\"h-full bg-[var(--kyro-primary)] transition-all duration-300 rounded-full\"\n style={{ width: `${progress}%` }}\n />\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\n )}\n\n {/* Selection Footer */}\n {selectedIds.size > 0 && (\n <div className=\"fixed bottom-12 left-1/2 -translate-x-1/2 z-[60] bg-[var(--kyro-surface)] border border-[var(--kyro-border)] rounded-full shadow-2xl px-2 py-2 flex items-center gap-12 animate-in slide-in-from-bottom-12 duration-700 ring-1 ring-white/10 backdrop-blur-xl\">\n <div className=\"flex items-center gap-5 border-r border-[var(--kyro-border)] pr-12\">\n <div className=\"w-12 h-12 rounded-full bg-[var(--kyro-sidebar-active)] text-[var(--kyro-sidebar-text-active)] flex items-center justify-center text-lg font-bold shadow-inner\">\n {selectedIds.size}\n </div>\n <div>\n <p className=\"text-[11px] font-bold tracking-[0.2em] text-[var(--kyro-text-primary)]\">\n Selected\n </p>\n <button\n onClick={() => setSelectedIds(new Set())}\n className=\"text-[10px] font-bold text-[var(--kyro-primary)] hover:underline opacity-80\"\n >\n Clear all\n </button>\n </div>\n </div>\n <div className=\"flex items-center gap-4\">\n {onSelect && (\n <button\n onClick={() => {\n const selectedItems = items.filter((i) => selectedIds.has(i.id));\n onSelect(selectedItems);\n }}\n className=\"px-8 py-3 bg-[var(--kyro-text-primary)] text-[var(--kyro-bg)] rounded-full font-bold text-xs hover:scale-105 transition-all shadow-xl\"\n >\n Confirm Selection\n </button>\n )}\n {canDelete && (\n <button\n onClick={handleBulkDelete}\n className=\"p-3 bg-red-500/10 text-red-500 hover:bg-red-500 hover:text-white rounded-full transition-all active:scale-90\"\n >\n <Trash2 className=\"w-5 h-5\" />\n </button>\n )}\n </div>\n </div>\n )}\n\n {/* Asset Panel */}\n <SlidePanel\n open={!!panelItem}\n onClose={() => setPanelItem(null)}\n title=\"Asset Details\"\n subtitle={panelItem?.filename}\n >\n {panelItem && (\n <div className=\"flex flex-col h-full\">\n <div className=\"aspect-video w-full rounded-2xl bg-[var(--kyro-bg)] border border-[var(--kyro-border)] overflow-hidden relative group\">\n {panelItem.type === \"image\" ? (\n <img\n src={getAbsoluteUrl(panelItem.url)}\n alt=\"\"\n className=\"w-full h-full object-contain p-4\"\n />\n ) : panelItem.type === \"video\" ? (\n <video\n src={getAbsoluteUrl(panelItem.url)}\n controls\n className=\"w-full h-full\"\n />\n ) : (\n <div className=\"w-full h-full flex flex-col items-center justify-center p-12 gap-6\">\n <div className=\"w-20 h-20 rounded-[2rem] bg-[var(--kyro-surface-accent)] flex items-center justify-center\">\n <FileIcon className=\"w-10 h-10 text-[var(--kyro-text-secondary)]\" />\n </div>\n <Badge variant=\"outline\" className=\"text-xs font-bold\">\n {panelItem.mimeType}\n </Badge>\n </div>\n )}\n\n <div className=\"absolute top-4 right-4 flex gap-2 opacity-0 group-hover:opacity-100 transition-opacity\">\n <button\n onClick={() => setShowPreview(true)}\n className=\"p-2.5 bg-black/50 backdrop-blur-md text-white rounded-xl hover:bg-black/70 transition-all\"\n >\n <Maximize2 className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n\n <div className=\"mt-8 space-y-8 flex-1\">\n <div className=\"grid grid-cols-2 gap-4\">\n <div className=\"p-4 rounded-2xl bg-[var(--kyro-surface-accent)]/50 border border-[var(--kyro-border)]\">\n <span className=\"text-[9px] font-bold tracking-widest text-[var(--kyro-text-secondary)] opacity-50 block mb-1\">\n Dimensions\n </span>\n <span className=\"text-xs font-bold text-[var(--kyro-text-primary)]\">\n {panelItem.type === \"image\" ? \"Original Resolution\" : \"N/A\"}\n </span>\n </div>\n <div className=\"p-4 rounded-2xl bg-[var(--kyro-surface-accent)]/50 border border-[var(--kyro-border)]\">\n <span className=\"text-[9px] font-bold tracking-widest text-[var(--kyro-text-secondary)] opacity-50 block mb-1\">\n File Size\n </span>\n <span className=\"text-xs font-bold text-[var(--kyro-text-primary)]\">\n {formatFileSize(panelItem.fileSize)}\n </span>\n </div>\n </div>\n\n <div className=\"space-y-4\">\n <div>\n <label className=\"text-[10px] font-bold tracking-widest text-[var(--kyro-text-secondary)] opacity-50 block mb-2 px-1\">\n Public Link\n </label>\n <div className=\"flex gap-2\">\n <input\n type=\"text\"\n readOnly\n value={getAbsoluteUrl(panelItem.url)}\n className=\"flex-1 px-4 py-3 bg-[var(--kyro-surface-accent)] border border-[var(--kyro-border)] rounded-xl text-[10px] font-bold font-mono focus:outline-none\"\n />\n <button\n onClick={() => {\n navigator.clipboard.writeText(\n getAbsoluteUrl(panelItem.url),\n );\n alert({ title: \"Copied\", message: \"URL copied to clipboard\" });\n }}\n className=\"p-3 bg-[var(--kyro-surface-accent)] hover:bg-[var(--kyro-border)] border border-[var(--kyro-border)] rounded-xl transition-all\"\n >\n <Link className=\"w-4 h-4 text-[var(--kyro-text-primary)]\" />\n </button>\n </div>\n </div>\n\n <div className=\"space-y-4\">\n <div>\n <label className=\"text-[10px] font-bold tracking-widest text-[var(--kyro-text-secondary)] opacity-50 block mb-2 px-1\">\n Alt Text\n </label>\n <textarea\n value={panelItem.alt || \"\"}\n onChange={(e) =>\n updateMetadata(panelItem.id, { alt: e.target.value })\n }\n className=\"w-full px-4 py-3 bg-[var(--kyro-surface-accent)] border border-[var(--kyro-border)] rounded-lg text-xs font-bold transition-all resize-none min-h-[80px] focus:outline-none focus:ring-2 focus:ring-[var(--kyro-sidebar-active)] focus:border-transparent\"\n placeholder=\"Describe this asset...\"\n />\n </div>\n <div>\n <label className=\"text-[10px] font-bold tracking-widest text-[var(--kyro-text-secondary)] opacity-50 block mb-2 px-1\">\n Caption\n </label>\n <textarea\n value={panelItem.caption || \"\"}\n onChange={(e) =>\n updateMetadata(panelItem.id, {\n caption: e.target.value,\n })\n }\n className=\"w-full px-4 py-3 bg-[var(--kyro-surface-accent)] border border-[var(--kyro-border)] rounded-lg text-xs font-bold transition-all resize-none min-h-[80px] focus:outline-none focus:ring-2 focus:ring-[var(--kyro-sidebar-active)] focus:border-transparent\"\n placeholder=\"Add a caption...\"\n />\n </div>\n </div>\n </div>\n </div>\n\n <div className=\"pt-8 border-t border-[var(--kyro-border)] mt-8 flex gap-3 pb-8\">\n <button\n onClick={() => {\n const link = document.createElement(\"a\");\n link.href = getAbsoluteUrl(panelItem.url);\n link.download = panelItem.filename;\n link.click();\n }}\n className=\"flex-1 flex items-center justify-center gap-2 px-6 py-3 bg-[var(--kyro-sidebar-active)] text-[var(--kyro-sidebar-text-active)] rounded-xl font-bold text-xs shadow-lg hover:opacity-90 transition-all\"\n >\n <Download className=\"w-4 h-4\" />\n Download\n </button>\n {panelItem.type === \"image\" && canUpdate && (\n <button\n onClick={() => setShowCrop(true)}\n className=\"p-3 border border-[var(--kyro-border)] rounded-xl text-[var(--kyro-text-primary)] hover:bg-[var(--kyro-surface-accent)] transition-all\"\n >\n <CropIcon className=\"w-4 h-4\" />\n </button>\n )}\n {canDelete && (\n <button\n onClick={() => {\n confirm({\n title: \"Delete Asset\",\n message: `Are you sure you want to delete ${panelItem.filename}? This cannot be undone.`,\n variant: \"danger\",\n onConfirm: async () => {\n try {\n await apiDelete(`/api/media/${panelItem.id}`);\n setPanelItem(null);\n loadMedia();\n } catch (error) {\n console.error(\"Delete failed:\", error);\n alert({ title: \"Error\", message: \"Failed to delete asset\" });\n }\n }\n });\n }}\n className=\"p-3 border border-red-100 text-red-500 rounded-xl hover:bg-red-50 transition-all\"\n >\n <Trash2 className=\"w-4 h-4\" />\n </button>\n )}\n </div>\n </div>\n )}\n </SlidePanel>\n\n {/* Preview Modal */}\n {showPreview &&\n panelItem &&\n createPortal(\n <div className=\"fixed inset-0 z-[9999] bg-black/95 flex flex-col animate-in fade-in duration-500\">\n <div className=\"flex items-center justify-between p-6\">\n <div className=\"flex flex-col\">\n <span className=\"text-white font-bold text-lg tracking-tight\">\n {panelItem.filename}\n </span>\n <span className=\"text-white/40 text-[10px] font-bold tracking-widest mt-1\">\n {formatFileSize(panelItem.fileSize)} · {panelItem.mimeType}\n </span>\n </div>\n <button\n onClick={() => setShowPreview(false)}\n className=\"p-3 bg-white/10 hover:bg-white/20 text-white rounded-2xl transition-all active:scale-90\"\n >\n <X className=\"w-6 h-6\" />\n </button>\n </div>\n <div className=\"flex-1 w-full flex items-center justify-center p-12\">\n {panelItem.type === \"image\" ? (\n <img\n src={getAbsoluteUrl(panelItem.url)}\n alt=\"\"\n className=\"max-h-full max-w-full object-contain shadow-2xl rounded-lg animate-in zoom-in-95 duration-500\"\n />\n ) : panelItem.type === \"video\" ? (\n <video\n src={getAbsoluteUrl(panelItem.url)}\n controls\n autoPlay\n className=\"max-h-full max-w-full rounded-lg shadow-2xl\"\n />\n ) : (\n <div className=\"text-white text-center\">\n <FileIcon className=\"w-24 h-24 mx-auto mb-6 opacity-20\" />\n <p className=\"text-xl font-bold opacity-50\">\n Preview not available for this file type\n </p>\n </div>\n )}\n </div>\n </div>,\n document.body,\n )}\n\n {/* Crop Modal */}\n {showCrop &&\n panelItem &&\n createPortal(\n <div className=\"fixed inset-0 z-[9999] bg-black/95 flex flex-col p-8\">\n <div className=\"flex items-center justify-between mb-8\">\n <h3 className=\"text-white font-bold text-2xl tracking-tighter\">\n Crop Image\n </h3>\n <div className=\"flex gap-3\">\n <button\n type=\"button\"\n onClick={() => setShowCrop(false)}\n className=\"px-4 py-2 border border-white/20 text-white/80 hover:bg-white/10 rounded-lg font-bold text-sm transition-colors\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n disabled={uploading}\n onClick={onCropComplete}\n className=\"px-4 py-2 bg-[var(--kyro-sidebar-active)] hover:opacity-90 text-[var(--kyro-sidebar-text-active)] rounded-lg font-bold text-sm transition-colors\"\n >\n {uploading ? \"Saving...\" : \"Save Crop\"}\n </button>\n </div>\n </div>\n <div className=\"flex-1 w-full flex items-center justify-center overflow-auto\">\n <ReactCrop crop={crop} onChange={(c) => setCrop(c)}>\n <img\n ref={imgRef}\n src={panelItem.url}\n alt=\"Crop preview\"\n className=\"max-h-[70vh] object-contain\"\n onLoad={onImageLoad}\n />\n </ReactCrop>\n </div>\n </div>,\n document.body,\n )}\n <PromptModal\n open={showNewFolderModal}\n onClose={() => setShowNewFolderModal(false)}\n onSubmit={createFolder}\n title=\"Create New Folder\"\n placeholder=\"Folder name\"\n />\n {showStorageConfigModal &&\n createPortal(\n <div className=\"fixed inset-0 z-[9999] bg-black/80 flex items-center justify-center p-4\">\n <div className=\"bg-[var(--kyro-surface)] border border-[var(--kyro-border)] rounded-2xl p-8 max-w-md w-full shadow-2xl\">\n <div className=\"text-center\">\n <div className=\"w-16 h-16 mx-auto mb-4 rounded-full bg-[var(--kyro-sidebar-active)] flex items-center justify-center\">\n <svg\n className=\"w-8 h-8 text-[var(--kyro-sidebar-text-active)]\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2H5a2 2 0 00-2 2v1m2 2a2 2 0 11-4 0 2 2 0 014 0zm2 2h.008v.008H5v-.008z\"\n />\n </svg>\n </div>\n <h3 className=\"text-xl font-bold text-[var(--kyro-text-primary)] mb-2\">\n Storage Not Configured\n </h3>\n <p className=\"text-[var(--kyro-text-secondary)] mb-6 text-sm\">\n Before uploading media, you need to configure your storage\n settings. Choose where files should be stored and how URLs are\n generated.\n </p>\n <div className=\"flex gap-3\">\n <a\n href=\"/settings/storage-settings\"\n className=\"flex-1 px-4 py-3 bg-[var(--kyro-sidebar-active)] text-[var(--kyro-sidebar-text-active)] rounded-xl font-bold text-center hover:opacity-90 transition-colors\"\n >\n Configure Storage\n </a>\n <button\n type=\"button\"\n onClick={() => {\n // Set default storage config programmatically\n apiPost(\"/api/globals/storage-settings\", {\n provider: \"local\",\n local: {\n uploadDir: \"./public/uploads\",\n baseUrl: \"/uploads\",\n },\n }).then(() => {\n setShowStorageConfigModal(false);\n setStorageConfigured(true);\n window.location.reload();\n });\n }}\n className=\"flex-1 px-4 py-3 border border-[var(--kyro-border)] text-[var(--kyro-text-secondary)] rounded-xl font-bold hover:bg-[var(--kyro-surface-accent)] transition-colors\"\n >\n Use Defaults\n </button>\n </div>\n </div>\n </div>\n </div>,\n document.body,\n )}\n <input\n type=\"file\"\n ref={fileInputRef}\n onChange={(e) => {\n if (e.target.files) handleUpload(e.target.files);\n }}\n multiple\n className=\"hidden\"\n accept=\"image/*,video/*,audio/*,.pdf,.doc,.docx,.txt,.zip,.rar,.tar\"\n />\n </div>\n );\n}\n","import React, { useState } from \"react\";\nimport { createPortal } from \"react-dom\";\n\ninterface PromptModalProps {\n open: boolean;\n onClose: () => void;\n onSubmit: (value: string) => void;\n title: string;\n placeholder?: string;\n defaultValue?: string;\n}\n\nexport function PromptModal({\n open,\n onClose,\n onSubmit,\n title,\n placeholder = \"\",\n defaultValue = \"\",\n}: PromptModalProps) {\n const [value, setValue] = useState(defaultValue);\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n if (value.trim()) {\n onSubmit(value.trim());\n setValue(\"\");\n onClose();\n }\n };\n\n if (!open) return null;\n\n return createPortal(\n <div className=\"fixed inset-0 z-[9999] flex items-center justify-center\">\n <div\n className=\"absolute inset-0 bg-black/50 backdrop-blur-sm\"\n onClick={onClose}\n />\n <div className=\"relative w-full max-w-lg mx-4 bg-[var(--kyro-surface)] rounded-lg shadow-2xl animate-in fade-in zoom-in-95 duration-200 border border-[var(--kyro-border)]\">\n <div className=\"flex items-center justify-between px-6 py-4 border-b border-[var(--kyro-border)]\">\n <h2 className=\"text-lg font-semibold text-[var(--kyro-text-primary)]\">\n {title}\n </h2>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"p-1 text-[var(--kyro-text-muted)] hover:text-[var(--kyro-text-primary)] rounded-lg hover:bg-[var(--kyro-surface-accent)] transition-colors\"\n >\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M18 6L6 18M6 6l12 12\" />\n </svg>\n </button>\n </div>\n <form onSubmit={handleSubmit}>\n <div className=\"px-6 py-4\">\n <input\n type=\"text\"\n value={value}\n onChange={(e) => setValue(e.target.value)}\n placeholder={placeholder}\n autoFocus\n className=\"w-full px-3 py-2 border border-[var(--kyro-input-border)] rounded-lg bg-[var(--kyro-input-bg)] text-[var(--kyro-text-primary)] placeholder-[var(--kyro-text-muted)] focus:outline-none focus:ring-2 focus:ring-[var(--kyro-sidebar-active)] focus:border-transparent\"\n />\n </div>\n <div className=\"flex items-center justify-end gap-3 px-6 py-4 border-t border-[var(--kyro-border)] bg-[var(--kyro-surface-accent)] rounded-b-lg\">\n <button\n type=\"button\"\n onClick={onClose}\n className=\"px-4 py-2 rounded-lg font-medium text-sm border border-[var(--kyro-border)] text-[var(--kyro-text-secondary)] hover:bg-[var(--kyro-surface-accent)] hover:text-[var(--kyro-text-primary)] transition-colors\"\n >\n Cancel\n </button>\n <button\n type=\"submit\"\n disabled={!value.trim()}\n className=\"px-4 py-2 rounded-lg font-medium text-sm bg-[var(--kyro-sidebar-active)] text-[var(--kyro-sidebar-text-active)] hover:opacity-90 transition-colors disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n Confirm\n </button>\n </div>\n </form>\n </div>\n </div>,\n document.body,\n );\n}\n","import React, { useState, useEffect, useRef, useCallback } from \"react\";\nimport { apiGet, resolveApi } from \"../../lib/api\";\nimport {\n Search,\n FileText,\n Image as ImageIcon,\n Settings,\n Plus,\n ArrowRight,\n Clock,\n Loader2,\n File,\n Moon,\n Sun,\n LogOut,\n Shield,\n Code,\n Database,\n Network as NetworkIcon,\n Hexagon,\n} from \"./icons\";\nimport { useAuthStore } from \"../../lib/stores\";\n\ninterface SearchResult {\n collection: string;\n label: string;\n id: string;\n title: string;\n doc?: Record<string, unknown>;\n}\n\ninterface CommandPaletteProps {\n isOpen: boolean;\n onClose: () => void;\n collections: Record<string, unknown>;\n globals: Record<string, unknown>;\n onNavigate: (view: string, collection?: string, id?: string) => void;\n}\n\nexport function CommandPalette({\n isOpen,\n onClose,\n collections,\n globals,\n onNavigate,\n}: CommandPaletteProps) {\n const { user, permissions } = useAuthStore();\n const [query, setQuery] = useState(\"\");\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [loading, setLoading] = useState(false);\n const [searchResults, setSearchResults] = useState<SearchResult[]>([]);\n const inputRef = useRef<HTMLInputElement>(null);\n const debounceRef = useRef<NodeJS.Timeout | null>(null);\n\n useEffect(() => {\n if (isOpen) {\n setQuery(\"\");\n setSelectedIndex(0);\n setSearchResults([]);\n setLoading(false);\n setTimeout(() => inputRef.current?.focus(), 100);\n }\n }, [isOpen]);\n\n const performSearch = useCallback(async (searchQuery: string) => {\n if (!searchQuery || searchQuery.length < 2) {\n setSearchResults([]);\n return;\n }\n\n setLoading(true);\n try {\n const response = await fetch(\n resolveApi(`/api/search?q=${encodeURIComponent(searchQuery)}&limit=15`),\n );\n const data = await response.json();\n if (data.results) {\n setSearchResults(data.results);\n }\n } catch (err) {\n console.error(\"Search error:\", err);\n setSearchResults([]);\n } finally {\n setLoading(false);\n }\n }, []);\n\n useEffect(() => {\n if (debounceRef.current) {\n clearTimeout(debounceRef.current);\n }\n\n if (query.length >= 2) {\n debounceRef.current = setTimeout(() => performSearch(query), 300);\n } else {\n setSearchResults([]);\n }\n\n return () => {\n if (debounceRef.current) {\n clearTimeout(debounceRef.current);\n }\n };\n }, [query, performSearch]);\n\n if (!isOpen) return null;\n\n const collectionItems = Object.entries(collections)\n .filter(([slug]) => permissions?.collections?.[slug]?.read !== false)\n .map(([slug, config]: [string, Record<string, unknown>]) => ({\n id: `col-${slug}`,\n label: config.label || slug,\n type: \"collection\",\n slug,\n icon: FileText,\n }));\n\n const globalItems = Object.entries(globals)\n .filter(([slug]) => permissions?.globals?.[slug]?.read !== false)\n .map(([slug, config]: [string, Record<string, unknown>]) => ({\n id: `global-${slug}`,\n label: config.label || slug,\n type: \"global\",\n slug,\n icon: Settings,\n }));\n\n const isDark =\n typeof document !== \"undefined\" &&\n document.documentElement.classList.contains(\"dark\");\n\n const isAdmin = user?.role === \"admin\";\n\n const actionItems = [\n {\n id: \"action-media\",\n label: \"Media Gallery\",\n type: \"action\",\n view: \"media\",\n icon: ImageIcon,\n visible: permissions?.collections?.media?.read !== false,\n },\n {\n id: \"action-users\",\n label: \"Team Management\",\n type: \"action\",\n view: \"users\",\n icon: Clock,\n visible: isAdmin,\n },\n {\n id: \"action-audit\",\n label: \"Audit Logs\",\n type: \"action\",\n view: \"audit\",\n icon: File,\n visible: isAdmin,\n },\n {\n id: \"action-roles\",\n label: \"Roles & Permissions\",\n type: \"action\",\n view: \"roles\",\n icon: Shield,\n visible: isAdmin,\n },\n {\n id: \"action-api\",\n label: \"REST API Explorer\",\n type: \"action\",\n view: \"api-explorer\",\n icon: Database,\n visible: isAdmin,\n },\n {\n id: \"action-graphql\",\n label: \"GraphQL Playground\",\n type: \"action\",\n view: \"graphql\",\n icon: Hexagon,\n visible: isAdmin,\n },\n {\n id: \"action-rest\",\n label: \"REST Playground\",\n type: \"action\",\n view: \"rest\",\n icon: NetworkIcon,\n visible: isAdmin,\n },\n {\n id: \"action-theme\",\n label: isDark ? \"Switch to Light Mode\" : \"Switch to Dark Mode\",\n type: \"action\",\n view: \"theme\",\n icon: isDark ? Sun : Moon,\n visible: true,\n },\n {\n id: \"action-logout\",\n label: \"Sign Out\",\n type: \"action\",\n view: \"logout\",\n icon: LogOut,\n visible: true,\n },\n ].filter((a) => a.visible);\n\n const docResultItems: { id: string; label: string; type: string; collection: string; label2?: string; docId: string; icon: typeof File; doc?: Record<string, unknown> }[] = searchResults.map((result, idx) => ({\n id: `doc-${result.collection}-${result.id}`,\n label: result.title,\n type: \"document\",\n collection: result.collection,\n label2: result.label,\n docId: result.id,\n icon: File,\n doc: result.doc,\n }));\n\n const allItems =\n query.length >= 2\n ? [...actionItems, ...collectionItems, ...globalItems, ...docResultItems]\n : [...actionItems, ...collectionItems, ...globalItems];\n\n const filteredItems =\n query === \"\"\n ? allItems\n : allItems.filter((item) =>\n item.label.toLowerCase().includes(query.toLowerCase()),\n );\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setSelectedIndex((i) => (i + 1) % filteredItems.length);\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setSelectedIndex(\n (i) => (i - 1 + filteredItems.length) % filteredItems.length,\n );\n } else if (e.key === \"Enter\") {\n const item = filteredItems[selectedIndex];\n if (item) handleSelect(item);\n } else if (e.key === \"Escape\") {\n onClose();\n }\n };\n\n const handleSelect = (item: { type: string; slug?: string; view?: string; collection?: string; docId?: string }) => {\n if (item.type === \"collection\") {\n if (item.slug === \"users\") {\n onNavigate(item.slug, item.slug);\n } else {\n onNavigate(\"list\", item.slug);\n }\n } else if (item.type === \"global\") {\n onNavigate(\"settings\", item.slug);\n } else if (item.type === \"document\") {\n if (item.collection === \"users\") {\n onNavigate(\"users\", \"users\", item.docId);\n } else {\n onNavigate(\"edit\", item.collection, item.docId);\n }\n } else if (item.type === \"action\") {\n if (item.view === \"users\") {\n onNavigate(\"users\", \"users\");\n } else if (item.view === \"media\") {\n onNavigate(\"media\", \"media\");\n } else {\n onNavigate(item.view, item.view);\n }\n }\n onClose();\n };\n\n const getSectionLabel = () => {\n if (query === \"\") return \"Quick Actions & Collections\";\n if (searchResults.length > 0) return \"Documents\";\n if (loading) return \"Searching...\";\n return \"Search Results\";\n };\n\n return (\n <div className=\"fixed inset-0 z-[1000] flex items-start justify-center pt-[15vh] px-4\">\n {/* Backdrop */}\n <div\n className=\"absolute inset-0 bg-black/60 backdrop-blur-sm animate-in fade-in duration-300\"\n onClick={onClose}\n />\n\n {/* Palette Body */}\n <div className=\"relative w-full max-w-2xl bg-[var(--kyro-surface)] rounded-3xl shadow-2xl overflow-hidden animate-in zoom-in-95 fade-in duration-300 ring-1 ring-white/10 border border-white/5\">\n <div className=\"flex items-center px-6 py-5 border-b border-[var(--kyro-border)]\">\n {loading ? (\n <Loader2 className=\"w-5 h-5 text-[var(--kyro-text-secondary)] opacity-50 mr-4 animate-spin\" />\n ) : (\n <Search className=\"w-5 h-5 text-[var(--kyro-text-secondary)] opacity-50 mr-4\" />\n )}\n <input\n ref={inputRef}\n placeholder=\"Search anything...\"\n className=\"flex-1 bg-transparent border-none focus:outline-none text-lg font-medium text-[var(--kyro-text-primary)] placeholder:text-[var(--kyro-text-muted)]\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={handleKeyDown}\n />\n <div className=\"flex items-center gap-2 px-2 py-1 bg-[var(--kyro-bg-secondary)] rounded-lg border border-[var(--kyro-border)]\">\n <span className=\"text-[10px] font-bold opacity-40 tracking-widest\">\n ESC\n </span>\n </div>\n </div>\n\n <div className=\"max-h-[400px] overflow-y-auto py-4\">\n {filteredItems.length > 0 ? (\n <div className=\"space-y-1 px-4\">\n <p className=\"px-4 text-[10px] font-bold tracking-[0.2em] opacity-40 mb-4\">\n {getSectionLabel()}\n </p>\n {filteredItems.map((item, index) => (\n <div\n key={item.id}\n onClick={() => handleSelect(item)}\n onMouseEnter={() => setSelectedIndex(index)}\n className={`flex items-center justify-between px-4 py-4 rounded-2xl cursor-pointer ${index === selectedIndex\n ? \"bg-[var(--kyro-primary)] text-[var(--kyro-sidebar-text-active)] shadow-xl shadow-[var(--kyro-primary)]\"\n : \"hover:bg-[var(--kyro-bg-secondary)] text-[var(--kyro-text-secondary)]\"\n }`}\n >\n <div className=\"flex items-center gap-4\">\n <div\n className={`p-2 rounded-xl ${index === selectedIndex ? \"bg-white/20\" : \"bg-[var(--kyro-bg-secondary)] border border-[var(--kyro-border)]\"}`}\n >\n <item.icon className=\"w-4 h-4\" />\n </div>\n <div className=\"flex flex-col\">\n <span className=\"font-bold text-sm\">{item.label}</span>\n {item.type === \"document\" && item.label2 && (\n <span\n className={`text-[10px] font-bold tracking-widest ${index === selectedIndex ? \"text-[var(--kyro-sidebar-text-active)]/60\" : \"opacity-40\"}`}\n >\n {item.label2}\n </span>\n )}\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <span\n className={`text-[10px] font-bold tracking-widest opacity-40 ${index === selectedIndex ? \"text-[var(--kyro-sidebar-text-active)] p-1\" : \"\"}`}\n >\n {item.type}\n </span>\n {index === selectedIndex && (\n <ArrowRight className=\"w-4 h-4 mr-2\" />\n )}\n </div>\n </div>\n ))}\n </div>\n ) : (\n <div className=\"py-12 text-center\">\n <p className=\"text-[var(--kyro-text-secondary)] italic opacity-60\">\n {query.length >= 2 && !loading\n ? `No results found for \"${query}\"`\n : \"Start typing to search...\"}\n </p>\n </div>\n )}\n </div>\n\n <div className=\"px-8 py-4 bg-[var(--kyro-bg-secondary)] border-t border-[var(--kyro-border)] flex items-center justify-between text-[10px] font-bold tracking-widest text-[var(--kyro-text-secondary)] opacity-60\">\n <div className=\"flex gap-6\">\n <span className=\"flex items-center gap-2 underline underline-offset-4 decoration-2 decoration-[var(--kyro-primary)]\">\n ↑↓ Navigate\n </span>\n <span className=\"flex items-center gap-2 underline underline-offset-4 decoration-2 decoration-[var(--kyro-primary)]\">\n ⏎ Select\n </span>\n </div>\n <div>Kyro Universal Search</div>\n </div>\n </div>\n </div>\n );\n}\n","import React, { useState } from \"react\";\nimport { useUIStore } from \"../../lib/stores\";\nimport { ConfirmModal } from \"./Modal\";\n\nexport function GlobalModal() {\n const { modal, closeModal } = useUIStore();\n const [loading, setLoading] = useState(false);\n\n if (!modal.open || !modal.config) return null;\n\n const { config } = modal;\n\n const handleConfirm = async () => {\n if (config.onConfirm) {\n try {\n setLoading(true);\n await config.onConfirm();\n } catch (error) {\n console.error(\"Modal confirm action failed:\", error);\n } finally {\n setLoading(false);\n closeModal();\n }\n } else {\n closeModal();\n }\n };\n\n const handleClose = () => {\n if (config.onCancel) {\n config.onCancel();\n }\n closeModal();\n };\n\n return (\n <ConfirmModal\n open={modal.open}\n onClose={handleClose}\n onConfirm={handleConfirm}\n title={config.title}\n message={config.message}\n confirmLabel={config.confirmLabel}\n cancelLabel={config.cancelLabel}\n variant={config.variant === \"danger\" ? \"danger\" : \"default\"}\n loading={loading}\n />\n );\n}\n","import React from \"react\";\nimport { Dropdown, DropdownItem, DropdownSeparator } from \"./ui/Dropdown\";\nimport { CountBadge } from \"./ui/Badge\";\n\ninterface BulkAction {\n label: string;\n onClick: () => void;\n icon?: React.ReactNode;\n danger?: boolean;\n}\n\ninterface BulkActionsBarProps {\n selectedCount: number;\n onClearSelection: () => void;\n actions: BulkAction[];\n onSelectAll?: () => void;\n}\n\nexport function BulkActionsBar({\n selectedCount,\n onClearSelection,\n actions,\n onSelectAll,\n}: BulkActionsBarProps) {\n if (selectedCount === 0) return null;\n\n return (\n <div className=\"flex items-center justify-between py-2 px-4 bg-gray-50 border-b border-gray-200\">\n <div className=\"flex items-center gap-4\">\n <div className=\"flex items-center gap-2\">\n <CountBadge count={selectedCount} />\n <span className=\"text-sm text-gray-600\">selected</span>\n </div>\n <button type=\"button\"\n onClick={onClearSelection}\n className=\"text-sm text-gray-500 hover:text-gray-700\"\n >\n Clear selection\n </button>\n {onSelectAll && (\n <button type=\"button\"\n onClick={onSelectAll}\n className=\"text-sm text-gray-500 hover:text-gray-700\"\n >\n Select all\n </button>\n )}\n </div>\n\n <Dropdown\n trigger={\n <button type=\"button\" className=\"kyro-btn kyro-btn-secondary kyro-btn-sm\">\n Actions\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M6 9l6 6 6-6\" />\n </svg>\n </button>\n }\n >\n {actions.map((action, index) => (\n <DropdownItem\n key={index}\n onClick={action.onClick}\n icon={action.icon as React.ReactElement}\n danger={action.danger}\n >\n {action.label}\n </DropdownItem>\n ))}\n </Dropdown>\n </div>\n );\n}\n","import React from \"react\";\nimport { SlidePanel } from \"./ui/SlidePanel\";\nimport { Button } from \"./ui/Button\";\nimport { Spinner } from \"./ui/Spinner\";\n\ninterface Version {\n id: string;\n version: number;\n createdAt: string;\n updatedAt: string;\n createdBy?: {\n id: string;\n name: string;\n email?: string;\n };\n status: \"draft\" | \"published\";\n changelog?: string;\n}\n\ninterface VersionHistoryPanelProps {\n open: boolean;\n onClose: () => void;\n versions: Version[];\n currentVersionId?: string;\n onPreview: (version: Version) => void;\n onRestore: (version: Version) => void;\n onCompare?: (v1: Version, v2: Version) => void;\n loading?: boolean;\n}\n\nexport function VersionHistoryPanel({\n open,\n onClose,\n versions,\n currentVersionId,\n onPreview,\n onRestore,\n onCompare,\n loading = false,\n}: VersionHistoryPanelProps) {\n const formatDate = (dateStr: string) => {\n const date = new Date(dateStr);\n return date.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n };\n\n const formatTimeAgo = (dateStr: string) => {\n const date = new Date(dateStr);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMs / 3600000);\n const diffDays = Math.floor(diffMs / 86400000);\n\n if (diffMins < 1) return \"Just now\";\n if (diffMins < 60) return `${diffMins}m ago`;\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 7) return `${diffDays}d ago`;\n return formatDate(dateStr);\n };\n\n return (\n <SlidePanel\n open={open}\n onClose={onClose}\n title=\"Version History\"\n width=\"md\"\n >\n {loading ? (\n <div className=\"flex items-center justify-center py-12\">\n <Spinner />\n </div>\n ) : versions.length === 0 ? (\n <div className=\"text-center py-12 text-gray-500\">\n <svg\n className=\"w-12 h-12 mx-auto mb-4 text-gray-300\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <polyline points=\"12,6 12,12 16,14\" />\n </svg>\n <p>No version history yet</p>\n <p className=\"text-sm text-gray-400 mt-1\">\n Versions are created when you save changes\n </p>\n </div>\n ) : (\n <div className=\"space-y-1\">\n {versions.map((version) => (\n <div\n key={version.id}\n className={`p-3 rounded-lg border transition-colors ${\n version.id === currentVersionId\n ? \"border-primary bg-primary-light/30\"\n : \"border-gray-100 hover:border-gray-200 hover:bg-gray-50\"\n }`}\n >\n <div className=\"flex items-start justify-between\">\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 mb-1\">\n <span\n className={`inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium ${\n version.status === \"published\"\n ? \"bg-green-100 text-green-700\"\n : \"bg-gray-100 text-gray-600\"\n }`}\n >\n {version.status === \"published\" ? \"Published\" : \"Draft\"}\n </span>\n <span className=\"text-xs text-gray-400\">\n v{version.version}\n </span>\n </div>\n <p className=\"text-sm text-gray-600 truncate\">\n {formatTimeAgo(version.createdAt)}\n </p>\n {version.createdBy && (\n <p className=\"text-xs text-gray-400 mt-0.5\">\n by {version.createdBy.name || version.createdBy.email}\n </p>\n )}\n {version.changelog && (\n <p className=\"text-xs text-gray-500 mt-1 truncate\">\n {version.changelog}\n </p>\n )}\n </div>\n <div className=\"flex items-center gap-1 ml-2\">\n <button type=\"button\"\n onClick={() => onPreview(version)}\n className=\"p-1.5 text-gray-400 hover:text-gray-600 hover:bg-gray-100 rounded transition-colors\"\n title=\"Preview this version\"\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n </button>\n {onCompare && (\n <button type=\"button\"\n onClick={() =>\n onCompare(\n version,\n versions.find((v) => v.id === currentVersionId) ||\n version,\n )\n }\n className=\"p-1.5 text-gray-400 hover:text-gray-600 hover:bg-gray-100 rounded transition-colors\"\n title=\"Compare with current\"\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M16 3h5v5M8 3H3v5M3 16v5h5M21 16v5h-5M3 12h18\" />\n </svg>\n </button>\n )}\n {version.id !== currentVersionId && (\n <button type=\"button\"\n onClick={() => onRestore(version)}\n className=\"p-1.5 text-gray-400 hover:text-primary hover:bg-primary-light rounded transition-colors\"\n title=\"Restore this version\"\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\" />\n <path d=\"M3 3v5h5\" />\n </svg>\n </button>\n )}\n </div>\n </div>\n </div>\n ))}\n </div>\n )}\n </SlidePanel>\n );\n}\n","import type { ReactNode } from 'react';\n\ninterface HeaderProps {\n title: string;\n onMenuClick: () => void;\n actions?: ReactNode;\n}\n\nexport function Header({ title, onMenuClick, actions }: HeaderProps) {\n return (\n <header className=\"kyro-header\">\n <div className=\"kyro-header-left\">\n <button type=\"button\"\n className=\"kyro-header-menu\"\n onClick={onMenuClick}\n aria-label=\"Toggle menu\"\n >\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M3 12h18M3 6h18M3 18h18\" />\n </svg>\n </button>\n <h1 className=\"kyro-header-title\">{title}</h1>\n </div>\n <div className=\"kyro-header-right\">\n {actions}\n <div className=\"kyro-header-user\">\n <button type=\"button\" className=\"kyro-header-user-btn\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <circle cx=\"12\" cy=\"8\" r=\"4\" />\n <path d=\"M4 20c0-4 4-6 8-6s8 2 8 6\" />\n </svg>\n </button>\n </div>\n </div>\n </header>\n );\n}\n","import type { ButtonHTMLAttributes, ReactNode } from 'react';\n\ninterface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: 'primary' | 'secondary' | 'danger' | 'ghost';\n size?: 'sm' | 'md' | 'lg';\n loading?: boolean;\n children: ReactNode;\n}\n\nexport function Button({\n variant = 'secondary',\n size = 'md',\n loading = false,\n children,\n className = '',\n disabled,\n ...props\n}: ButtonProps) {\n const baseClass = 'kyro-btn';\n const variantClass = `kyro-btn-${variant}`;\n const sizeClass = `kyro-btn-${size}`;\n\n return (\n <button type=\"button\"\n className={`${baseClass} ${variantClass} ${sizeClass} ${className}`}\n disabled={disabled || loading}\n {...props}\n >\n {loading ? (\n <span className=\"kyro-btn-loading\">\n <svg className=\"kyro-btn-spinner\" viewBox=\"0 0 24 24\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"3\" fill=\"none\" strokeDasharray=\"60 30\" />\n </svg>\n </span>\n ) : null}\n <span className={loading ? 'kyro-btn-text-hidden' : ''}>\n {children}\n </span>\n </button>\n );\n}\n","import type { AdminContext, HookResult, LifecycleHook } from \"./types.ts\";\n\ntype HookRegistry = {\n ready: LifecycleHook[];\n beforeDeploy: LifecycleHook[];\n afterDeploy: ((ctx: AdminContext, result: HookResult) => void)[];\n};\n\nconst registry: HookRegistry = {\n ready: [],\n beforeDeploy: [],\n afterDeploy: [],\n};\n\nexport function onAdminReady(hook: LifecycleHook) {\n registry.ready.push(hook);\n return () => {\n registry.ready = registry.ready.filter((h) => h !== hook);\n };\n}\n\nexport function beforeDeploy(hook: LifecycleHook) {\n registry.beforeDeploy.push(hook);\n return () => {\n registry.beforeDeploy = registry.beforeDeploy.filter((h) => h !== hook);\n };\n}\n\nexport function afterDeploy(\n hook: (ctx: AdminContext, result: HookResult) => void,\n) {\n registry.afterDeploy.push(hook);\n return () => {\n registry.afterDeploy = registry.afterDeploy.filter((h) => h !== hook);\n };\n}\n\nexport async function emitAdminReady(ctx: AdminContext): Promise<HookResult[]> {\n const results: HookResult[] = [];\n for (const hook of registry.ready) {\n try {\n const result = await hook(ctx);\n if (result && typeof result === \"object\" && \"success\" in result) {\n results.push(result);\n }\n } catch (error) {\n results.push({ success: false, error: String(error) });\n }\n }\n return results;\n}\n\nexport async function emitBeforeDeploy(\n ctx: AdminContext,\n): Promise<HookResult[]> {\n const results: HookResult[] = [];\n for (const hook of registry.beforeDeploy) {\n try {\n const result = await hook(ctx);\n if (result && typeof result === \"object\" && \"success\" in result) {\n results.push(result);\n }\n } catch (error) {\n results.push({ success: false, error: String(error) });\n }\n }\n return results;\n}\n\nexport async function emitAfterDeploy(\n ctx: AdminContext,\n result: HookResult,\n): Promise<void> {\n for (const hook of registry.afterDeploy) {\n try {\n await hook(ctx, result);\n } catch {\n // Silently ignore afterDeploy hook errors\n }\n }\n}\n","import { useState, useEffect, useCallback } from \"react\";\n\nexport interface QueryOptions {\n page?: number;\n limit?: number;\n filter?: Record<string, unknown>;\n sort?: string;\n order?: \"asc\" | \"desc\";\n}\n\nexport interface QueryResult<T> {\n data: T | null;\n loading: boolean;\n error: string | null;\n refetch: () => Promise<void>;\n}\n\nexport interface MutationResult {\n mutate: (\n data?: Record<string, unknown>,\n ) => Promise<Record<string, unknown> | null>;\n loading: boolean;\n error: string | null;\n}\n\nfunction getApiUrl(path: string): string {\n const base = typeof window !== \"undefined\" ? window.location.origin : \"\";\n return `${base}${path}`;\n}\n\nexport function useKyroQuery<T = Record<string, unknown>>(\n slug: string,\n options: QueryOptions = {},\n): QueryResult<T> {\n const [data, setData] = useState<T | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const fetchData = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const params = new URLSearchParams();\n if (options.page) params.set(\"page\", String(options.page));\n if (options.limit) params.set(\"limit\", String(options.limit));\n if (options.sort) params.set(\"sort\", options.sort);\n if (options.order) params.set(\"order\", options.order);\n\n const url = `${getApiUrl(`/api/${slug}`)}?${params.toString()}`;\n const res = await fetch(url, {\n credentials: \"include\",\n });\n\n if (!res.ok) throw new Error(`HTTP ${res.status}: ${res.statusText}`);\n const json = await res.json();\n setData(json.data ?? json);\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setLoading(false);\n }\n }, [slug, options.page, options.limit, options.sort, options.order]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return { data, loading, error, refetch: fetchData };\n}\n\nexport function useKyroMutation(\n slug: string,\n method: \"POST\" | \"PATCH\" | \"DELETE\" = \"POST\",\n): MutationResult {\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const mutate = useCallback(\n async (\n data?: Record<string, unknown>,\n ): Promise<Record<string, unknown> | null> => {\n setLoading(true);\n setError(null);\n try {\n const url = getApiUrl(`/api/${slug}`);\n const res = await fetch(url, {\n method,\n credentials: \"include\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: data ? JSON.stringify(data) : undefined,\n });\n\n if (!res.ok) throw new Error(`HTTP ${res.status}: ${res.statusText}`);\n const json = await res.json();\n return json.data ?? json;\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n return null;\n } finally {\n setLoading(false);\n }\n },\n [slug, method],\n );\n\n return { mutate, loading, error };\n}\n","import type { KyroPlugin } from \"./types.ts\";\n\nconst plugins: Map<string, KyroPlugin> = new Map();\n\nexport function registerPlugin(plugin: KyroPlugin): void {\n if (!plugin.name || typeof plugin.name !== \"string\") {\n throw new Error(\"Plugin must have a valid name\");\n }\n if (plugins.has(plugin.name)) {\n console.warn(`Plugin \"${plugin.name}\" is already registered. Overwriting.`);\n }\n plugins.set(plugin.name, plugin);\n if (plugin.apply) {\n plugin.apply({});\n }\n}\n\nexport function unregisterPlugin(name: string): void {\n plugins.delete(name);\n}\n\nexport function getPlugin(name: string): KyroPlugin | undefined {\n return plugins.get(name);\n}\n\nexport function getPlugins(): KyroPlugin[] {\n return Array.from(plugins.values());\n}\n\nexport function getPluginsWithHook<\n K extends keyof NonNullable<KyroPlugin[\"hooks\"]>,\n>(hookName: K): KyroPlugin[] {\n return Array.from(plugins.values()).filter(\n (p) => p.hooks && typeof p.hooks[hookName] === \"function\",\n );\n}\n","import type { KyroPlugin } from \"../types.js\";\nimport { registerPlugin } from \"../registry.js\";\n\n// Simple MVP plugin demonstrating registration and an onAdminReady hook\nconst samplePlugin: KyroPlugin = {\n name: \"sample-plugin\",\n version: \"0.1.0\",\n description: \"A tiny sample plugin to demonstrate the extensibility surface\",\n hooks: {\n onAdminReady: () => {\n // Lightweight side-effect; in real plugins this could mount UI or register editors\n // eslint-disable-next-line no-console\n console.log(\"[ Kyro Admin ] sample-plugin: onAdminReady executed\");\n return;\n },\n },\n};\n\nregisterPlugin(samplePlugin);\n\nexport default samplePlugin;\n","import type { KyroPlugin } from \"../types.js\";\nimport { registerPlugin } from \"../registry.js\";\n\n// Second MVP plugin demonstrating beforeDeploy hook usage\nconst samplePlugin2: KyroPlugin = {\n name: \"sample-plugin-2\",\n version: \"0.1.0\",\n description: \"Second MVP plugin demonstrating beforeDeploy hook\",\n hooks: {\n beforeDeploy: (ctx) => {\n // Lightweight side-effect; in real plugins, you could validate config, migrations, etc.\n void ctx;\n console.log(\"[Kyro Admin] sample-plugin-2 beforeDeploy\");\n return { success: true };\n },\n },\n};\n\nregisterPlugin(samplePlugin2);\n\nexport default samplePlugin2;\n","import type { KyroBlock } from \"./types.ts\";\n\nconst blocks: Map<string, KyroBlock> = new Map();\n\nexport function registerBlock(block: KyroBlock): void {\n if (!block.id || typeof block.id !== \"string\") {\n throw new Error(\"Block must have a valid id\");\n }\n if (!block.label) {\n throw new Error(\"Block must have a label\");\n }\n blocks.set(block.id, block);\n}\n\nexport function unregisterBlock(id: string): void {\n blocks.delete(id);\n}\n\nexport function getBlock(id: string): KyroBlock | undefined {\n return blocks.get(id);\n}\n\nexport function getBlocks(): KyroBlock[] {\n return Array.from(blocks.values());\n}\n\nexport function getBlocksByCategory(category: string): KyroBlock[] {\n return Array.from(blocks.values()).filter((b) => b.category === category);\n}\n\nexport function useBlockRenderer(id: string) {\n const block = blocks.get(id);\n if (!block) {\n console.warn(`Block \"${id}\" not found in registry`);\n return null;\n }\n return block.render;\n}\n","import React from \"react\";\nimport type { KyroBlock } from \"../types.ts\";\nimport { registerBlock } from \"../registry.ts\";\n\nconst SampleBlockRenderer: KyroBlock[\"render\"] = (props) => {\n const { data } = props;\n return (\n <div style={{ border: \"1px solid #ccc\", padding: 8, borderRadius: 6 }}>\n <strong>Sample Block</strong>\n <pre style={{ marginTop: 6 }}>{JSON.stringify(data ?? {}, null, 2)}</pre>\n </div>\n );\n};\n\nconst block: KyroBlock = {\n id: \"sample-block\",\n label: \"Sample Block\",\n category: \"demo\",\n schema: [{ name: \"title\", label: \"Title\", type: \"text\", required: true }],\n render: SampleBlockRenderer,\n};\n\nregisterBlock(block);\n\nexport default block;\nexport { block as sampleBlock };\n","import React from \"react\";\nimport type { KyroBlock } from \"../types.ts\";\nimport { registerBlock } from \"../registry.ts\";\n\nconst SampleBlock2Renderer: KyroBlock[\"render\"] = (props) => {\n const { data } = props;\n return (\n <div style={{ border: \"2px dashed #888\", padding: 10, borderRadius: 8 }}>\n <strong>Sample Block 2</strong>\n <pre style={{ marginTop: 6 }}>{JSON.stringify(data ?? {}, null, 2)}</pre>\n </div>\n );\n};\n\nconst block: KyroBlock = {\n id: \"sample-block-2\",\n label: \"Sample Block 2\",\n category: \"demo\",\n schema: [\n { name: \"subtitle\", label: \"Subtitle\", type: \"text\", required: false },\n ],\n render: SampleBlock2Renderer,\n};\n\nregisterBlock(block);\nexport default block;\nexport { block as sampleBlock2 };\n","import type { ReactNode, ComponentType } from \"react\";\nimport type { FieldType } from \"@kyro-cms/core\";\nimport type { KyroField, FieldEditorProps } from \"./types.ts\";\n\nconst fields: Map<string, KyroField> = new Map();\n\nexport function registerField(field: KyroField): void {\n if (!field.id || typeof field.id !== \"string\") {\n throw new Error(\"Field must have a valid id\");\n }\n if (!field.type || typeof field.type !== \"string\") {\n throw new Error(\"Field must have a valid type\");\n }\n fields.set(field.id, field);\n}\n\nexport function unregisterField(id: string): void {\n fields.delete(id);\n}\n\nexport function getField(id: string): KyroField | undefined {\n return fields.get(id);\n}\n\nexport function getFields(): KyroField[] {\n return Array.from(fields.values());\n}\n\nexport function getFieldByType(type: FieldType): KyroField | undefined {\n return Array.from(fields.values()).find((f) => f.type === type);\n}\n\nexport function useFieldRenderer(\n fieldId: string,\n props: Omit<FieldEditorProps, \"onChange\"> & {\n onChange?: (value: unknown) => void;\n },\n): ReactNode | null {\n const field = fields.get(fieldId);\n if (!field) {\n console.warn(`Field \"${fieldId}\" not found in registry`);\n return null;\n }\n const FieldEditor: ComponentType<FieldEditorProps> = field.editor;\n return <FieldEditor {...(props as FieldEditorProps)} />;\n}\n","import React from \"react\";\nimport type { FieldEditorProps } from \"../types.ts\";\nimport { registerField } from \"../registry.tsx\";\nimport type { KyroField } from \"../types.ts\";\n\nconst SampleTextEditor: React.FC<FieldEditorProps> = ({\n name,\n value,\n onChange,\n}) => {\n return (\n <input\n name={name}\n value={typeof value === \"string\" ? value : \"\"}\n onChange={(e) => onChange?.(e.target.value)}\n placeholder=\"Sample text\"\n />\n );\n};\n\nconst field: KyroField = {\n id: \"sample-text\",\n type: \"text\",\n label: \"Sample Text\",\n editor: SampleTextEditor,\n};\n\nregisterField(field);\nexport default field;\nexport { field as sampleField };\n","import React from \"react\";\nimport type { FieldEditorProps } from \"../types.ts\";\nimport { registerField } from \"../registry.tsx\";\nimport type { KyroField } from \"../types.ts\";\n\nconst SampleTextareaEditor: React.FC<FieldEditorProps> = ({\n name,\n value,\n onChange,\n}) => {\n return (\n <textarea\n name={name}\n value={typeof value === \"string\" ? value : \"\"}\n onChange={(e) => onChange?.(e.target.value)}\n placeholder=\"Sample textarea\"\n />\n );\n};\n\nconst field: KyroField = {\n id: \"sample-textarea\",\n type: \"textarea\",\n label: \"Sample Textarea\",\n editor: SampleTextareaEditor,\n};\n\nregisterField(field);\nexport default field;\nexport { field as sampleField2 };\n","export {\n registerField,\n unregisterField,\n getField,\n getFields,\n getFieldByType,\n useFieldRenderer,\n} from \"./registry.tsx\";\nexport type { KyroField, FieldEditorProps } from \"./types.ts\";\nexport { default as sampleField } from \"./examples/sample-field\";\nexport { default as sampleField2 } from \"./examples/sample-field-2.tsx\";\n\n// Re-export core field types for type-safe field registration\nexport type {\n FieldType,\n Field,\n TextField,\n NumberField,\n CheckboxField,\n DateField,\n SelectField,\n TextareaField,\n RichTextField,\n CodeField,\n JSONField,\n ImageField,\n UploadField,\n RelationshipField,\n BlocksField,\n ArrayField,\n GroupField,\n} from \"@kyro-cms/core\";\n\nexport { ALL_FIELD_TYPES } from \"@kyro-cms/core\";\n","import type { AstroIntegration } from \"astro\";\nimport path from \"path\";\nimport fs from \"fs\";\n\nexport interface KyroAdminOptions {\n basePath?: string;\n apiPath?: string;\n configPath?: string;\n}\n\nexport function kyroAdmin(options: KyroAdminOptions = {}): AstroIntegration {\n const {\n basePath = \"/admin\",\n apiPath = \"/api\",\n configPath = \"kyro.config.ts\",\n } = options;\n\n return {\n name: \"@kyro-cms/admin\",\n hooks: {\n \"astro:config:setup\": ({ config, updateConfig, injectRoute, logger }) => {\n logger.info(`Kyro Admin mounted at ${basePath} (API: ${apiPath})`);\n\n const fallbackConfig = path.resolve(\n new URL(\".\", import.meta.url).pathname,\n \"lib/default-kyro-config.ts\",\n );\n\n // Try to resolve config from root first, then admin local\n const rootConfig = path.resolve(config.root.pathname, \"..\", configPath);\n const localConfig = path.resolve(config.root.pathname, configPath);\n\n const resolvedConfig = fs.existsSync(rootConfig)\n ? rootConfig\n : fs.existsSync(localConfig)\n ? localConfig\n : fallbackConfig;\n\n if (resolvedConfig !== fallbackConfig) {\n logger.info(`Loaded config from ${resolvedConfig}`);\n } else {\n logger.warn(`Config file not found. Using defaults.`);\n }\n\n // Inject API Routes\n if (apiPath) {\n const apiHandlerPath = path.resolve(\n config.root.pathname,\n \"..\",\n \"src/api-handler.ts\",\n );\n injectRoute({\n pattern: `${apiPath}/[...path]`,\n entrypoint: apiHandlerPath,\n });\n }\n\n // Inject Admin UI Routes\n const pages = [\n { pattern: \"\", entrypoint: \"./pages/index.astro\" },\n { pattern: \"/login\", entrypoint: \"./pages/auth/login.astro\" },\n { pattern: \"/register\", entrypoint: \"./pages/auth/register.astro\" },\n { pattern: \"/media\", entrypoint: \"./pages/media.astro\" },\n { pattern: \"/users\", entrypoint: \"./pages/users/index.astro\" },\n { pattern: \"/users/[id]\", entrypoint: \"./pages/users/[id].astro\" },\n { pattern: \"/roles\", entrypoint: \"./pages/roles/index.astro\" },\n { pattern: \"/settings\", entrypoint: \"./pages/settings/index.astro\" },\n {\n pattern: \"/settings/[slug]\",\n entrypoint: \"./pages/settings/[slug].astro\",\n },\n { pattern: \"/audit\", entrypoint: \"./pages/audit/index.astro\" },\n { pattern: \"/sessions\", entrypoint: \"./pages/sessions.astro\" },\n { pattern: \"/keys\", entrypoint: \"./pages/keys.astro\" },\n { pattern: \"/webhooks\", entrypoint: \"./pages/webhooks.astro\" },\n { pattern: \"/plugins\", entrypoint: \"./pages/plugins.astro\" },\n { pattern: \"/marketplace\", entrypoint: \"./pages/marketplace.astro\" },\n {\n pattern: \"/api-explorer\",\n entrypoint: \"./pages/api-explorer.astro\",\n },\n { pattern: \"/graphql\", entrypoint: \"./pages/graphql.astro\" },\n {\n pattern: \"/rest-playground\",\n entrypoint: \"./pages/rest-playground.astro\",\n },\n {\n pattern: \"/[collection]\",\n entrypoint: \"./pages/[collection]/index.astro\",\n },\n {\n pattern: \"/[collection]/[id]\",\n entrypoint: \"./pages/[collection]/[id].astro\",\n },\n ];\n\n for (const page of pages) {\n const pattern = `${basePath}${page.pattern}`.replace(/\\/$/, \"\");\n injectRoute({\n pattern: pattern || \"/\",\n entrypoint: path.resolve(\n new URL(\".\", import.meta.url).pathname,\n page.entrypoint,\n ),\n });\n }\n\n updateConfig({\n vite: {\n resolve: {\n alias: {\n \"kyro:config\": resolvedConfig,\n },\n },\n define: {\n __KYRO_ADMIN_PATH__: JSON.stringify(basePath),\n __KYRO_API_PATH__: JSON.stringify(apiPath),\n },\n },\n });\n },\n \"astro:build:done\": ({ logger }) => {\n logger.info(\"Kyro Admin build complete\");\n },\n },\n };\n}\n"]}
|