@momentumcms/admin 0.1.0
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/LICENSE +21 -0
- package/README.md +7 -0
- package/fesm2022/momentumcms-admin-global-edit.page-DFDV-uh3.mjs +90 -0
- package/fesm2022/momentumcms-admin-global-edit.page-DFDV-uh3.mjs.map +1 -0
- package/fesm2022/momentumcms-admin-momentumcms-admin-z82jXEsP.mjs +16886 -0
- package/fesm2022/momentumcms-admin-momentumcms-admin-z82jXEsP.mjs.map +1 -0
- package/fesm2022/momentumcms-admin.mjs +2 -0
- package/fesm2022/momentumcms-admin.mjs.map +1 -0
- package/package.json +58 -0
- package/tailwind.preset.js +181 -0
- package/types/momentumcms-admin.d.ts +3706 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"momentumcms-admin-momentumcms-admin-z82jXEsP.mjs","sources":["../../../../libs/admin/src/lib/services/auth.service.ts","../../../../libs/admin/src/lib/guards/auth.guard.ts","../../../../libs/admin/src/lib/guards/guest.guard.ts","../../../../libs/admin/src/lib/guards/setup.guard.ts","../../../../libs/admin/src/lib/services/collection-access.service.ts","../../../../libs/admin/src/lib/guards/collection-access.guard.ts","../../../../libs/admin/src/lib/widgets/feedback/feedback.service.ts","../../../../libs/admin/src/lib/guards/unsaved-changes.guard.ts","../../../../libs/admin/src/lib/routes/momentum-admin-routes.ts","../../../../libs/admin/src/lib/interceptors/crud-toast.interceptor.ts","../../../../libs/admin/src/lib/services/api.service.ts","../../../../libs/admin/src/lib/services/upload.service.ts","../../../../libs/admin/src/lib/services/momentum-api.service.ts","../../../../libs/admin/src/lib/services/entity-sheet.service.ts","../../../../libs/admin/src/lib/services/version.service.ts","../../../../libs/admin/src/lib/ui/theme/theme.service.ts","../../../../libs/admin/src/lib/utils/inject-user.ts","../../../../libs/admin/src/lib/utils/route-data.ts","../../../../libs/admin/src/lib/widgets/entity-form/entity-form.types.ts","../../../../libs/admin/src/lib/widgets/entity-form/form-schema-builder.ts","../../../../libs/admin/src/lib/widgets/entity-form/field-renderers/text-field.component.ts","../../../../libs/admin/src/lib/widgets/entity-form/field-renderers/number-field.component.ts","../../../../libs/admin/src/lib/widgets/entity-form/field-renderers/select-field.component.ts","../../../../libs/admin/src/lib/widgets/entity-form/field-renderers/checkbox-field.component.ts","../../../../libs/admin/src/lib/widgets/entity-form/field-renderers/date-field.component.ts","../../../../libs/admin/src/lib/widgets/media-preview/media-preview.component.ts","../../../../libs/admin/src/lib/widgets/entity-form/field-renderers/media-picker-dialog.component.ts","../../../../libs/admin/src/lib/widgets/entity-form/field-renderers/upload-field.component.ts","../../../../libs/admin/src/lib/widgets/entity-form/field-renderers/group-field.component.ts","../../../../libs/admin/src/lib/widgets/entity-form/field-renderers/array-field.component.ts","../../../../libs/admin/src/lib/widgets/entity-form/field-renderers/blocks-field.component.ts","../../../../libs/admin/src/lib/widgets/entity-form/field-renderers/relationship-field.component.ts","../../../../libs/admin/src/lib/widgets/entity-form/field-renderers/rich-text-field.component.ts","../../../../libs/admin/src/lib/widgets/entity-form/field-renderers/tabs-field.component.ts","../../../../libs/admin/src/lib/widgets/entity-form/field-renderers/collapsible-field.component.ts","../../../../libs/admin/src/lib/widgets/entity-form/field-renderers/row-field.component.ts","../../../../libs/admin/src/lib/widgets/visual-block-editor/block-wrapper.component.ts","../../../../libs/admin/src/lib/widgets/visual-block-editor/block-inserter.component.ts","../../../../libs/admin/src/lib/widgets/visual-block-editor/visual-block-editor.component.ts","../../../../libs/admin/src/lib/widgets/entity-form/field-renderers/field-renderer.component.ts","../../../../libs/admin/src/lib/widgets/version-history/version-diff-dialog.component.ts","../../../../libs/admin/src/lib/widgets/version-history/version-history.component.ts","../../../../libs/admin/src/lib/widgets/entity-form/entity-form.component.ts","../../../../libs/admin/src/lib/widgets/publish-controls/publish-controls.component.ts","../../../../libs/admin/src/lib/widgets/entity-view/entity-view.component.ts","../../../../libs/admin/src/lib/components/entity-sheet/entity-sheet-content.component.ts","../../../../libs/admin/src/lib/widgets/admin-sidebar/admin-sidebar.component.ts","../../../../libs/admin/src/lib/components/shell/admin-shell.component.ts","../../../../libs/admin/src/lib/components/forgot-password-form/forgot-password-form.component.ts","../../../../libs/admin/src/lib/components/reset-password-form/reset-password-form.component.ts","../../../../libs/admin/src/lib/widgets/collection-card/collection-card.component.ts","../../../../libs/admin/src/lib/pages/dashboard/dashboard.page.ts","../../../../libs/admin/src/lib/widgets/entity-list/entity-list.types.ts","../../../../libs/admin/src/lib/widgets/data-preview/data-preview-dialog.component.ts","../../../../libs/admin/src/lib/widgets/entity-list/entity-list.component.ts","../../../../libs/admin/src/lib/components/generate-api-key-dialog/generate-api-key-dialog.component.ts","../../../../libs/admin/src/lib/pages/collection-list/collection-list.page.ts","../../../../libs/admin/src/lib/widgets/live-preview/live-preview.component.ts","../../../../libs/admin/src/lib/pages/collection-view/collection-view.page.ts","../../../../libs/admin/src/lib/widgets/visual-block-editor/block-edit-dialog.component.ts","../../../../libs/admin/src/lib/pages/collection-edit/collection-edit.page.ts","../../../../libs/admin/src/lib/pages/login/login.page.ts","../../../../libs/admin/src/lib/pages/setup/setup.page.ts","../../../../libs/admin/src/lib/widgets/media-edit/media-edit-dialog.component.ts","../../../../libs/admin/src/lib/pages/media-library/media-library.page.ts","../../../../libs/admin/src/lib/pages/forgot-password/forgot-password.page.ts","../../../../libs/admin/src/lib/pages/reset-password/reset-password.page.ts","../../../../libs/admin/src/index.ts","../../../../libs/admin/src/momentumcms-admin.ts"],"sourcesContent":["import { Injectable, inject, signal, computed } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { HttpClient } from '@angular/common/http';\nimport { firstValueFrom } from 'rxjs';\n\n/**\n * Response type for the setup status endpoint.\n */\nexport interface SetupStatus {\n\t/** True if no users exist and setup is required */\n\tneedsSetup: boolean;\n\t/** True if at least one user exists */\n\thasUsers: boolean;\n}\n\n/**\n * User data returned from Better Auth.\n */\nexport interface AuthUser {\n\tid: string;\n\temail: string;\n\tname: string;\n\trole: string;\n\temailVerified: boolean;\n\ttwoFactorEnabled?: boolean;\n\timage?: string | null;\n\tcreatedAt: string;\n\tupdatedAt: string;\n}\n\n/**\n * Session data from Better Auth.\n */\nexport interface AuthSession {\n\tid: string;\n\tuserId: string;\n\ttoken: string;\n\texpiresAt: string;\n}\n\n/**\n * Response from Better Auth session endpoint.\n */\ninterface SessionResponse {\n\tuser: AuthUser | null;\n\tsession: AuthSession | null;\n}\n\n/**\n * Response from Better Auth sign-in/sign-up endpoints.\n */\ninterface AuthResponse {\n\tuser?: AuthUser;\n\tsession?: AuthSession;\n\terror?: {\n\t\tmessage: string;\n\t\tcode?: string;\n\t\tstatus?: number;\n\t};\n}\n\n/**\n * Result type for auth operations.\n */\nexport interface AuthResult {\n\tsuccess: boolean;\n\terror?: string;\n\tuser?: AuthUser;\n}\n\n/**\n * Result type for enabling two-factor authentication.\n */\nexport interface TwoFactorEnableResult {\n\tsuccess: boolean;\n\terror?: string;\n\ttotpURI?: string;\n\tbackupCodes?: string[];\n}\n\n/**\n * Momentum Auth Service\n *\n * Manages authentication state using signals and communicates with Better Auth\n * endpoints on the server.\n *\n * @example\n * ```typescript\n * const auth = inject(MomentumAuthService);\n *\n * // Check if authenticated\n * if (auth.isAuthenticated()) {\n * console.log('User:', auth.user()?.name);\n * }\n *\n * // Sign in\n * const result = await auth.signIn('user@example.com', 'password');\n * if (!result.success) {\n * console.error(result.error);\n * }\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class MomentumAuthService {\n\tprivate readonly http = inject(HttpClient);\n\tprivate readonly document = inject(DOCUMENT);\n\tprivate readonly baseUrl = '/api/auth';\n\n\t// === Writable signals (internal state) ===\n\n\t/** Current authenticated user */\n\treadonly user = signal<AuthUser | null>(null);\n\n\t/** Whether auth state is being loaded */\n\treadonly loading = signal(true);\n\n\t/** Whether the app needs initial setup (no users exist) */\n\treadonly needsSetup = signal(false);\n\n\t// === Computed signals (derived state) ===\n\n\t/** Whether a user is currently authenticated */\n\treadonly isAuthenticated = computed(() => this.user() !== null);\n\n\t/** Current user's role */\n\treadonly role = computed(() => this.user()?.role ?? null);\n\n\t/** Whether current user is an admin */\n\treadonly isAdmin = computed(() => this.role() === 'admin');\n\n\t/** Whether current user has verified their email */\n\treadonly emailVerified = computed(() => this.user()?.emailVerified ?? false);\n\n\t/** Tracks in-flight initialization to prevent duplicate requests */\n\tprivate initPromise: Promise<void> | null = null;\n\n\t/**\n\t * Initialize auth state by checking current session.\n\t * Should be called on app startup. Safe to call concurrently from multiple guards.\n\t */\n\tasync initialize(): Promise<void> {\n\t\t// Return existing promise if initialization is already in progress\n\t\tif (this.initPromise) {\n\t\t\treturn this.initPromise;\n\t\t}\n\n\t\tthis.initPromise = this.doInitialize();\n\t\ttry {\n\t\t\tawait this.initPromise;\n\t\t} finally {\n\t\t\tthis.initPromise = null;\n\t\t}\n\t}\n\n\tprivate async doInitialize(): Promise<void> {\n\t\tthis.loading.set(true);\n\t\ttry {\n\t\t\t// Check setup status first\n\t\t\tconst setupStatus = await this.checkSetupStatus();\n\t\t\tthis.needsSetup.set(setupStatus.needsSetup);\n\n\t\t\t// Only check session if setup is complete\n\t\t\tif (!setupStatus.needsSetup) {\n\t\t\t\tawait this.refreshSession();\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.loading.set(false);\n\t\t}\n\t}\n\n\t/**\n\t * Check if the application needs initial setup (no users exist).\n\t */\n\tasync checkSetupStatus(): Promise<SetupStatus> {\n\t\ttry {\n\t\t\tconst response = await firstValueFrom(this.http.get<SetupStatus>('/api/setup/status'));\n\t\t\treturn response;\n\t\t} catch {\n\t\t\t// If endpoint fails, assume setup is needed\n\t\t\treturn { needsSetup: true, hasUsers: false };\n\t\t}\n\t}\n\n\t/**\n\t * Refresh the current session from the server.\n\t */\n\tasync refreshSession(): Promise<AuthUser | null> {\n\t\ttry {\n\t\t\tconst response = await firstValueFrom(\n\t\t\t\tthis.http.get<SessionResponse>(`${this.baseUrl}/get-session`, {\n\t\t\t\t\twithCredentials: true,\n\t\t\t\t}),\n\t\t\t);\n\n\t\t\tif (response.user) {\n\t\t\t\tthis.user.set(response.user);\n\t\t\t\t// Fetch correct role from Momentum (Better Auth returns default role)\n\t\t\t\tawait this.resolveUserRole();\n\t\t\t\treturn this.user();\n\t\t\t}\n\n\t\t\tthis.user.set(null);\n\t\t\treturn null;\n\t\t} catch {\n\t\t\tthis.user.set(null);\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Fetch the current user from the Momentum session resolver,\n\t * which has the correctly-resolved role from the users collection.\n\t * Better Auth's get-session returns the default role, not the Momentum role.\n\t */\n\tprivate async resolveUserRole(): Promise<void> {\n\t\ttry {\n\t\t\tconst response = await firstValueFrom(\n\t\t\t\tthis.http.get<{ user: AuthUser | null }>('/api/me', {\n\t\t\t\t\twithCredentials: true,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tif (response.user) {\n\t\t\t\tthis.user.set(response.user);\n\t\t\t}\n\t\t} catch {\n\t\t\t// Role resolution failed — keep the Better Auth user as-is\n\t\t}\n\t}\n\n\t/**\n\t * Sign in with email and password.\n\t */\n\tasync signIn(email: string, password: string): Promise<AuthResult> {\n\t\ttry {\n\t\t\tconst response = await firstValueFrom(\n\t\t\t\tthis.http.post<AuthResponse>(\n\t\t\t\t\t`${this.baseUrl}/sign-in/email`,\n\t\t\t\t\t{ email, password },\n\t\t\t\t\t{ withCredentials: true },\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tif (response.error) {\n\t\t\t\treturn { success: false, error: response.error.message };\n\t\t\t}\n\n\t\t\tif (response.user) {\n\t\t\t\tthis.user.set(response.user);\n\t\t\t\tawait this.resolveUserRole();\n\t\t\t\treturn { success: true, user: this.user() ?? response.user };\n\t\t\t}\n\n\t\t\treturn { success: false, error: 'Unknown error occurred' };\n\t\t} catch (error) {\n\t\t\tconst message = this.extractErrorMessage(error);\n\t\t\treturn { success: false, error: message };\n\t\t}\n\t}\n\n\t/**\n\t * Sign up a new user with email and password.\n\t *\n\t * @param name User's display name\n\t * @param email User's email address\n\t * @param password User's password (min 8 characters)\n\t * @param isFirstUser If true, grants admin role (for setup flow)\n\t */\n\tasync signUp(\n\t\tname: string,\n\t\temail: string,\n\t\tpassword: string,\n\t\tisFirstUser = false,\n\t): Promise<AuthResult> {\n\t\ttry {\n\t\t\t// For first user, use the special setup endpoint\n\t\t\tconst endpoint = isFirstUser ? '/api/setup/create-admin' : `${this.baseUrl}/sign-up/email`;\n\n\t\t\tconst response = await firstValueFrom(\n\t\t\t\tthis.http.post<AuthResponse>(\n\t\t\t\t\tendpoint,\n\t\t\t\t\t{ name, email, password },\n\t\t\t\t\t{ withCredentials: true },\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tif (response.error) {\n\t\t\t\treturn { success: false, error: response.error.message };\n\t\t\t}\n\n\t\t\tif (response.user) {\n\t\t\t\tthis.needsSetup.set(false);\n\t\t\t\tthis.user.set(response.user);\n\t\t\t\tawait this.resolveUserRole();\n\t\t\t\treturn { success: true, user: this.user() ?? response.user };\n\t\t\t}\n\n\t\t\treturn { success: false, error: 'Unknown error occurred' };\n\t\t} catch (error) {\n\t\t\tconst message = this.extractErrorMessage(error);\n\t\t\treturn { success: false, error: message };\n\t\t}\n\t}\n\n\t/**\n\t * Sign out the current user.\n\t */\n\tasync signOut(): Promise<void> {\n\t\ttry {\n\t\t\tawait firstValueFrom(\n\t\t\t\tthis.http.post(`${this.baseUrl}/sign-out`, {}, { withCredentials: true }),\n\t\t\t);\n\t\t} finally {\n\t\t\tthis.user.set(null);\n\t\t}\n\t}\n\n\t/**\n\t * Request a password reset email.\n\t *\n\t * @param email The email address to send the reset link to\n\t * @param redirectTo URL to redirect user after clicking the reset link (defaults to /admin/reset-password)\n\t * @returns Always returns success to prevent email enumeration attacks\n\t */\n\tasync requestPasswordReset(email: string, redirectTo?: string): Promise<AuthResult> {\n\t\ttry {\n\t\t\t// Use current origin for the redirect URL\n\t\t\tconst originUrl = this.document.defaultView?.location?.origin ?? '';\n\t\t\tconst resetUrl = redirectTo ?? `${originUrl}/admin/reset-password`;\n\n\t\t\tawait firstValueFrom(\n\t\t\t\tthis.http.post<AuthResponse>(\n\t\t\t\t\t`${this.baseUrl}/request-password-reset`,\n\t\t\t\t\t{ email, redirectTo: resetUrl },\n\t\t\t\t\t{ withCredentials: true },\n\t\t\t\t),\n\t\t\t);\n\t\t\t// Always return success to prevent email enumeration\n\t\t\treturn { success: true };\n\t\t} catch {\n\t\t\t// Still return success to prevent email enumeration\n\t\t\treturn { success: true };\n\t\t}\n\t}\n\n\t/**\n\t * Reset password using a reset token.\n\t *\n\t * @param token The reset token from the email link\n\t * @param newPassword The new password to set\n\t */\n\tasync resetPassword(token: string, newPassword: string): Promise<AuthResult> {\n\t\ttry {\n\t\t\tconst response = await firstValueFrom(\n\t\t\t\tthis.http.post<AuthResponse>(\n\t\t\t\t\t`${this.baseUrl}/reset-password`,\n\t\t\t\t\t{ token, newPassword },\n\t\t\t\t\t{ withCredentials: true },\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tif (response.error) {\n\t\t\t\treturn { success: false, error: response.error.message };\n\t\t\t}\n\n\t\t\treturn { success: true };\n\t\t} catch (error) {\n\t\t\tconst message = this.extractErrorMessage(error);\n\t\t\treturn { success: false, error: message };\n\t\t}\n\t}\n\n\t/** Whether current user has 2FA enabled */\n\treadonly twoFactorEnabled = computed(() => this.user()?.twoFactorEnabled ?? false);\n\n\t/**\n\t * Enable two-factor authentication for the current user.\n\t * Returns the TOTP URI (for QR code generation) and backup codes.\n\t */\n\tasync enableTwoFactor(password: string): Promise<TwoFactorEnableResult> {\n\t\ttry {\n\t\t\tconst response = await firstValueFrom(\n\t\t\t\tthis.http.post<{ totpURI: string; backupCodes: string[] }>(\n\t\t\t\t\t`${this.baseUrl}/two-factor/enable`,\n\t\t\t\t\t{ password },\n\t\t\t\t\t{ withCredentials: true },\n\t\t\t\t),\n\t\t\t);\n\t\t\treturn { success: true, totpURI: response.totpURI, backupCodes: response.backupCodes };\n\t\t} catch (error) {\n\t\t\tconst message = this.extractErrorMessage(error);\n\t\t\treturn { success: false, error: message };\n\t\t}\n\t}\n\n\t/**\n\t * Verify a TOTP code to complete 2FA setup or sign-in.\n\t */\n\tasync verifyTOTP(code: string, trustDevice = false): Promise<AuthResult> {\n\t\ttry {\n\t\t\tconst response = await firstValueFrom(\n\t\t\t\tthis.http.post<AuthResponse>(\n\t\t\t\t\t`${this.baseUrl}/two-factor/verify-totp`,\n\t\t\t\t\t{ code, trustDevice },\n\t\t\t\t\t{ withCredentials: true },\n\t\t\t\t),\n\t\t\t);\n\t\t\tif (response.user) {\n\t\t\t\tthis.user.set(response.user);\n\t\t\t}\n\t\t\treturn { success: true };\n\t\t} catch (error) {\n\t\t\tconst message = this.extractErrorMessage(error);\n\t\t\treturn { success: false, error: message };\n\t\t}\n\t}\n\n\t/**\n\t * Disable two-factor authentication for the current user.\n\t */\n\tasync disableTwoFactor(password: string): Promise<AuthResult> {\n\t\ttry {\n\t\t\tawait firstValueFrom(\n\t\t\t\tthis.http.post<AuthResponse>(\n\t\t\t\t\t`${this.baseUrl}/two-factor/disable`,\n\t\t\t\t\t{ password },\n\t\t\t\t\t{ withCredentials: true },\n\t\t\t\t),\n\t\t\t);\n\t\t\t// Refresh user to update twoFactorEnabled flag\n\t\t\tawait this.refreshSession();\n\t\t\treturn { success: true };\n\t\t} catch (error) {\n\t\t\tconst message = this.extractErrorMessage(error);\n\t\t\treturn { success: false, error: message };\n\t\t}\n\t}\n\n\t/**\n\t * Get the list of enabled OAuth providers from the server.\n\t */\n\tasync getOAuthProviders(): Promise<string[]> {\n\t\ttry {\n\t\t\tconst response = await firstValueFrom(\n\t\t\t\tthis.http.get<{ providers: string[] }>(`${this.baseUrl}/providers`),\n\t\t\t);\n\t\t\treturn response.providers ?? [];\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t}\n\n\t/**\n\t * Initiate OAuth sign-in by redirecting to the provider's authorization page.\n\t * Better Auth handles the redirect flow via /api/auth/sign-in/social.\n\t *\n\t * @param provider The OAuth provider name (e.g., 'google', 'github')\n\t * @param callbackURL URL to redirect to after successful authentication\n\t */\n\tsignInWithOAuth(provider: string, callbackURL = '/admin'): void {\n\t\tconst url = `${this.baseUrl}/sign-in/social?provider=${encodeURIComponent(provider)}&callbackURL=${encodeURIComponent(callbackURL)}`;\n\t\tconst win = this.document.defaultView;\n\t\tif (win) {\n\t\t\twin.location.href = url;\n\t\t}\n\t}\n\n\t/**\n\t * Extract error message from HTTP error response.\n\t */\n\tprivate extractErrorMessage(error: unknown): string {\n\t\tif (this.isHttpErrorWithMessage(error)) {\n\t\t\treturn error.error.message;\n\t\t}\n\t\treturn 'An unexpected error occurred';\n\t}\n\n\t/**\n\t * Type guard for HTTP error responses with message.\n\t */\n\tprivate isHttpErrorWithMessage(error: unknown): error is { error: { message: string } } {\n\t\treturn (\n\t\t\terror !== null &&\n\t\t\ttypeof error === 'object' &&\n\t\t\t'error' in error &&\n\t\t\terror.error !== null &&\n\t\t\ttypeof error.error === 'object' &&\n\t\t\t'message' in error.error &&\n\t\t\ttypeof error.error.message === 'string'\n\t\t);\n\t}\n}\n","import { inject, PLATFORM_ID } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { Router, type CanActivateFn } from '@angular/router';\nimport { MomentumAuthService } from '../services/auth.service';\n\n/**\n * Auth guard that protects routes requiring authentication.\n *\n * Redirects to:\n * - /admin/setup if no users exist (first-time setup)\n * - /admin/login if user is not authenticated\n *\n * During SSR, the guard allows access and defers redirect decisions to\n * client-side hydration. The session resolver middleware provides user\n * context for SSR rendering via MOMENTUM_API_CONTEXT/injectUser(), but\n * guards return true during SSR to avoid hydration conflicts.\n *\n * @example\n * ```typescript\n * const routes: Routes = [\n * {\n * path: 'dashboard',\n * component: DashboardPage,\n * canActivate: [authGuard],\n * },\n * ];\n * ```\n */\nexport const authGuard: CanActivateFn = async () => {\n\tconst platformId = inject(PLATFORM_ID);\n\tconst auth = inject(MomentumAuthService);\n\tconst router = inject(Router);\n\n\t// During SSR, allow access - redirect decisions deferred to client-side\n\t// to avoid hydration conflicts. User context is available for rendering\n\t// via MOMENTUM_API_CONTEXT/injectUser().\n\tif (!isPlatformBrowser(platformId)) {\n\t\treturn true;\n\t}\n\n\t// Wait for auth to initialize if still loading\n\tif (auth.loading()) {\n\t\tawait auth.initialize();\n\t}\n\n\t// Redirect to setup if no users exist\n\tif (auth.needsSetup()) {\n\t\treturn router.createUrlTree(['/admin/setup']);\n\t}\n\n\t// Redirect to login if not authenticated\n\tif (!auth.isAuthenticated()) {\n\t\treturn router.createUrlTree(['/admin/login']);\n\t}\n\n\treturn true;\n};\n\n/**\n * Admin guard that requires admin role.\n *\n * Redirects to:\n * - /admin/setup if no users exist\n * - /admin/login if user is not authenticated\n * - /admin if user is not an admin\n *\n * During SSR, the guard allows access and defers redirect decisions to\n * client-side hydration to avoid hydration conflicts.\n *\n * @example\n * ```typescript\n * const routes: Routes = [\n * {\n * path: 'settings',\n * component: SettingsPage,\n * canActivate: [adminGuard],\n * },\n * ];\n * ```\n */\nexport const adminGuard: CanActivateFn = async () => {\n\tconst platformId = inject(PLATFORM_ID);\n\tconst auth = inject(MomentumAuthService);\n\tconst router = inject(Router);\n\n\t// During SSR, allow access - redirect decisions deferred to client-side\n\tif (!isPlatformBrowser(platformId)) {\n\t\treturn true;\n\t}\n\n\t// Wait for auth to initialize if still loading\n\tif (auth.loading()) {\n\t\tawait auth.initialize();\n\t}\n\n\t// Redirect to setup if no users exist\n\tif (auth.needsSetup()) {\n\t\treturn router.createUrlTree(['/admin/setup']);\n\t}\n\n\t// Redirect to login if not authenticated\n\tif (!auth.isAuthenticated()) {\n\t\treturn router.createUrlTree(['/admin/login']);\n\t}\n\n\t// Redirect to dashboard if not admin\n\tif (!auth.isAdmin()) {\n\t\treturn router.createUrlTree(['/admin']);\n\t}\n\n\treturn true;\n};\n","import { inject, PLATFORM_ID } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { Router, type CanActivateFn } from '@angular/router';\nimport { MomentumAuthService } from '../services/auth.service';\n\n/**\n * Guest guard that allows access only to unauthenticated users.\n *\n * Redirects to:\n * - /admin/setup if no users exist (first-time setup)\n * - /admin if user is already authenticated\n *\n * During SSR, the guard allows access and defers redirect decisions to\n * client-side hydration to avoid hydration conflicts.\n *\n * Use this guard for login/register pages.\n *\n * @example\n * ```typescript\n * const routes: Routes = [\n * {\n * path: 'login',\n * component: LoginPage,\n * canActivate: [guestGuard],\n * },\n * ];\n * ```\n */\nexport const guestGuard: CanActivateFn = async () => {\n\tconst platformId = inject(PLATFORM_ID);\n\tconst auth = inject(MomentumAuthService);\n\tconst router = inject(Router);\n\n\t// During SSR, allow access - redirect decisions deferred to client-side\n\t// to avoid hydration conflicts.\n\tif (!isPlatformBrowser(platformId)) {\n\t\treturn true;\n\t}\n\n\t// Wait for auth to initialize if still loading\n\tif (auth.loading()) {\n\t\tawait auth.initialize();\n\t}\n\n\t// Redirect to setup if no users exist\n\tif (auth.needsSetup()) {\n\t\treturn router.createUrlTree(['/admin/setup']);\n\t}\n\n\t// Redirect to dashboard if already authenticated\n\tif (auth.isAuthenticated()) {\n\t\treturn router.createUrlTree(['/admin']);\n\t}\n\n\treturn true;\n};\n","import { inject, PLATFORM_ID } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { Router, type CanActivateFn } from '@angular/router';\nimport { MomentumAuthService } from '../services/auth.service';\n\n/**\n * Setup guard that allows access only when no users exist.\n *\n * Redirects to:\n * - /admin/login if users already exist\n *\n * During SSR, the guard allows access and defers redirect decisions to\n * client-side hydration to avoid hydration conflicts.\n *\n * Use this guard for the initial setup/first user creation page.\n *\n * @example\n * ```typescript\n * const routes: Routes = [\n * {\n * path: 'setup',\n * component: SetupPage,\n * canActivate: [setupGuard],\n * },\n * ];\n * ```\n */\nexport const setupGuard: CanActivateFn = async () => {\n\tconst platformId = inject(PLATFORM_ID);\n\tconst auth = inject(MomentumAuthService);\n\tconst router = inject(Router);\n\n\t// During SSR, allow access - redirect decisions deferred to client-side\n\t// to avoid hydration conflicts.\n\tif (!isPlatformBrowser(platformId)) {\n\t\treturn true;\n\t}\n\n\t// Wait for auth to initialize if still loading\n\tif (auth.loading()) {\n\t\tawait auth.initialize();\n\t}\n\n\t// Only allow access if setup is needed\n\tif (!auth.needsSetup()) {\n\t\t// If already authenticated, go to dashboard\n\t\tif (auth.isAuthenticated()) {\n\t\t\treturn router.createUrlTree(['/admin']);\n\t\t}\n\t\t// Otherwise go to login\n\t\treturn router.createUrlTree(['/admin/login']);\n\t}\n\n\treturn true;\n};\n","import { Injectable, inject, signal, computed } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { firstValueFrom } from 'rxjs';\n\n/**\n * Permissions for a single collection.\n */\nexport interface CollectionPermissions {\n\tslug: string;\n\tcanAccess: boolean;\n\tcanCreate: boolean;\n\tcanRead: boolean;\n\tcanUpdate: boolean;\n\tcanDelete: boolean;\n}\n\n/**\n * Response from the /api/access endpoint.\n */\ninterface AccessResponse {\n\tcollections: CollectionPermissions[];\n}\n\n/**\n * Collection Access Service\n *\n * Manages collection-level access permissions for the admin panel.\n * Fetches permissions from the server and provides reactive state\n * for guards and components to use.\n *\n * @example\n * ```typescript\n * const accessService = inject(CollectionAccessService);\n *\n * // Load permissions\n * await accessService.loadAccess();\n *\n * // Check access\n * if (accessService.canAccess('posts')) {\n * // Show posts collection\n * }\n *\n * // Check specific operation\n * if (accessService.canCreate('posts')) {\n * // Show create button\n * }\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class CollectionAccessService {\n\tprivate readonly http = inject(HttpClient);\n\n\t// === Writable signals (internal state) ===\n\n\t/** Full permissions for all collections */\n\tprivate readonly _permissions = signal<CollectionPermissions[]>([]);\n\n\t/** Whether permissions are being loaded */\n\treadonly loading = signal(true);\n\n\t/** Whether permissions have been loaded at least once */\n\treadonly initialized = signal(false);\n\n\t/** Error message if loading failed */\n\treadonly error = signal<string | null>(null);\n\n\t// === Computed signals (derived state) ===\n\n\t/** All collection permissions (read-only) */\n\treadonly permissions = computed(() => this._permissions());\n\n\t/** Slugs of collections the user can access in admin panel */\n\treadonly accessibleCollections = computed(() =>\n\t\tthis._permissions()\n\t\t\t.filter((p) => p.canAccess)\n\t\t\t.map((p) => p.slug),\n\t);\n\n\t/** Tracks in-flight load to prevent duplicate requests */\n\tprivate loadPromise: Promise<void> | null = null;\n\n\t/**\n\t * Load collection permissions from the server.\n\t * Should be called when the user authenticates or on app init.\n\t * Safe to call concurrently from multiple guards.\n\t */\n\tasync loadAccess(): Promise<void> {\n\t\t// Return existing promise if loading is already in progress\n\t\tif (this.loadPromise) {\n\t\t\treturn this.loadPromise;\n\t\t}\n\n\t\tthis.loadPromise = this.doLoadAccess();\n\t\ttry {\n\t\t\tawait this.loadPromise;\n\t\t} finally {\n\t\t\tthis.loadPromise = null;\n\t\t}\n\t}\n\n\tprivate async doLoadAccess(): Promise<void> {\n\t\tthis.loading.set(true);\n\t\tthis.error.set(null);\n\n\t\ttry {\n\t\t\tconst response = await firstValueFrom(\n\t\t\t\tthis.http.get<AccessResponse>('/api/access', {\n\t\t\t\t\twithCredentials: true,\n\t\t\t\t}),\n\t\t\t);\n\n\t\t\tthis._permissions.set(response.collections);\n\t\t\tthis.initialized.set(true);\n\t\t} catch {\n\t\t\tthis.error.set('Failed to load collection permissions');\n\t\t\t// Set empty permissions on error\n\t\t\tthis._permissions.set([]);\n\t\t} finally {\n\t\t\tthis.loading.set(false);\n\t\t}\n\t}\n\n\t/**\n\t * Reset permissions state.\n\t * Should be called when the user logs out.\n\t */\n\treset(): void {\n\t\tthis._permissions.set([]);\n\t\tthis.initialized.set(false);\n\t\tthis.error.set(null);\n\t}\n\n\t/**\n\t * Check if the user can access a collection in the admin panel.\n\t */\n\tcanAccess(slug: string): boolean {\n\t\tconst perms = this.getPermissions(slug);\n\t\treturn perms?.canAccess ?? false;\n\t}\n\n\t/**\n\t * Check if the user can create documents in a collection.\n\t */\n\tcanCreate(slug: string): boolean {\n\t\tconst perms = this.getPermissions(slug);\n\t\treturn perms?.canCreate ?? false;\n\t}\n\n\t/**\n\t * Check if the user can read documents in a collection.\n\t */\n\tcanRead(slug: string): boolean {\n\t\tconst perms = this.getPermissions(slug);\n\t\treturn perms?.canRead ?? false;\n\t}\n\n\t/**\n\t * Check if the user can update documents in a collection.\n\t */\n\tcanUpdate(slug: string): boolean {\n\t\tconst perms = this.getPermissions(slug);\n\t\treturn perms?.canUpdate ?? false;\n\t}\n\n\t/**\n\t * Check if the user can delete documents in a collection.\n\t */\n\tcanDelete(slug: string): boolean {\n\t\tconst perms = this.getPermissions(slug);\n\t\treturn perms?.canDelete ?? false;\n\t}\n\n\t/**\n\t * Get full permissions for a specific collection.\n\t */\n\tgetPermissions(slug: string): CollectionPermissions | undefined {\n\t\treturn this._permissions().find((p) => p.slug === slug);\n\t}\n}\n","import { inject, PLATFORM_ID } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { Router, type CanActivateFn, type ActivatedRouteSnapshot } from '@angular/router';\nimport { MomentumAuthService } from '../services/auth.service';\nimport { CollectionAccessService } from '../services/collection-access.service';\n\n/**\n * Collection access guard that checks if the user can access a specific collection.\n *\n * This guard should be used on routes that have a :slug parameter in the path.\n * It checks the collection-level `admin` access function to determine if the\n * user is allowed to view the collection in the admin panel.\n *\n * Redirects to:\n * - /admin/setup if no users exist\n * - /admin/login if user is not authenticated\n * - /admin if user cannot access the collection\n *\n * Note: During SSR, the guard allows access and defers checks to client-side\n * hydration. This is necessary because SSR doesn't have access to browser cookies.\n *\n * @example\n * ```typescript\n * const routes: Routes = [\n * {\n * path: 'collections/:slug',\n * component: CollectionListPage,\n * canActivate: [authGuard, collectionAccessGuard],\n * },\n * ];\n * ```\n */\nexport const collectionAccessGuard: CanActivateFn = async (route: ActivatedRouteSnapshot) => {\n\tconst platformId = inject(PLATFORM_ID);\n\tconst auth = inject(MomentumAuthService);\n\tconst collectionAccess = inject(CollectionAccessService);\n\tconst router = inject(Router);\n\n\t// During SSR, allow access - auth checks will run on client after hydration\n\t// SSR doesn't have access to browser cookies, so auth would always fail\n\tif (!isPlatformBrowser(platformId)) {\n\t\treturn true;\n\t}\n\n\t// Wait for auth to initialize if still loading\n\tif (auth.loading()) {\n\t\tawait auth.initialize();\n\t}\n\n\t// Redirect to setup if no users exist\n\tif (auth.needsSetup()) {\n\t\treturn router.createUrlTree(['/admin/setup']);\n\t}\n\n\t// Redirect to login if not authenticated\n\tif (!auth.isAuthenticated()) {\n\t\treturn router.createUrlTree(['/admin/login']);\n\t}\n\n\t// Load collection permissions if not loaded\n\tif (!collectionAccess.initialized()) {\n\t\tawait collectionAccess.loadAccess();\n\t}\n\n\t// Get the collection slug from route params\n\tconst slug = route.params['slug'];\n\tif (!slug) {\n\t\t// No slug in route, allow access (shouldn't happen with proper routing)\n\t\treturn true;\n\t}\n\n\t// Check if user can access this collection\n\tif (!collectionAccess.canAccess(slug)) {\n\t\t// Redirect to admin dashboard if no access\n\t\treturn router.createUrlTree(['/admin']);\n\t}\n\n\treturn true;\n};\n","import { inject, Injectable } from '@angular/core';\nimport { ToastService, ConfirmationService } from '@momentumcms/ui';\n\n/**\n * Feedback Service\n *\n * CMS-specific toast messages and confirmations for entity operations.\n * Wraps the UI library's ToastService and ConfirmationService with\n * convenience methods for common CMS operations.\n *\n * @example\n * ```typescript\n * const feedback = inject(FeedbackService);\n *\n * // Success messages\n * feedback.entityCreated('Post');\n * feedback.entityUpdated('Post');\n * feedback.entityDeleted('Post');\n *\n * // Error messages\n * feedback.operationFailed('Failed to save', error);\n *\n * // Confirmations\n * const confirmed = await feedback.confirmDelete('Post', 'My Blog Post');\n * if (confirmed) {\n * // Proceed with deletion\n * }\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class FeedbackService {\n\tprivate readonly toast = inject(ToastService);\n\tprivate readonly confirmation = inject(ConfirmationService);\n\n\t// === Success Messages ===\n\n\t/**\n\t * Show success message when an entity is created.\n\t */\n\tentityCreated(collectionLabel: string): void {\n\t\tthis.toast.success(\n\t\t\t`${collectionLabel} created`,\n\t\t\t`The ${collectionLabel.toLowerCase()} has been created successfully.`,\n\t\t);\n\t}\n\n\t/**\n\t * Show success message when an entity is updated.\n\t */\n\tentityUpdated(collectionLabel: string): void {\n\t\tthis.toast.success(\n\t\t\t`${collectionLabel} updated`,\n\t\t\t`The ${collectionLabel.toLowerCase()} has been updated successfully.`,\n\t\t);\n\t}\n\n\t/**\n\t * Show success message when an entity is deleted.\n\t */\n\tentityDeleted(collectionLabel: string): void {\n\t\tthis.toast.success(\n\t\t\t`${collectionLabel} deleted`,\n\t\t\t`The ${collectionLabel.toLowerCase()} has been deleted.`,\n\t\t);\n\t}\n\n\t/**\n\t * Show success message when multiple entities are deleted.\n\t */\n\tentitiesDeleted(collectionLabel: string, count: number): void {\n\t\tthis.toast.success(\n\t\t\t`${count} ${collectionLabel.toLowerCase()} deleted`,\n\t\t\t`${count} items have been deleted successfully.`,\n\t\t);\n\t}\n\n\t/**\n\t * Show success message when an entity is published.\n\t */\n\tentityPublished(collectionLabel: string): void {\n\t\tthis.toast.success(\n\t\t\t`${collectionLabel} published`,\n\t\t\t`The ${collectionLabel.toLowerCase()} is now live.`,\n\t\t);\n\t}\n\n\t/**\n\t * Show success message when an entity is unpublished.\n\t */\n\tentityUnpublished(collectionLabel: string): void {\n\t\tthis.toast.success(\n\t\t\t`${collectionLabel} unpublished`,\n\t\t\t`The ${collectionLabel.toLowerCase()} has been unpublished.`,\n\t\t);\n\t}\n\n\t// === Error Messages ===\n\n\t/**\n\t * Show error message when an operation fails.\n\t */\n\toperationFailed(message: string, error?: Error): void {\n\t\tconst description = error?.message || 'Please try again or contact support.';\n\t\tthis.toast.error(message, description);\n\t}\n\n\t/**\n\t * Show error message when validation fails.\n\t */\n\tvalidationFailed(fieldCount: number): void {\n\t\tconst fields = fieldCount === 1 ? 'field' : 'fields';\n\t\tthis.toast.error('Validation failed', `Please fix ${fieldCount} ${fields} with errors.`);\n\t}\n\n\t/**\n\t * Show error message when not authorized.\n\t */\n\tnotAuthorized(action: string): void {\n\t\tthis.toast.error('Not authorized', `You don't have permission to ${action}.`);\n\t}\n\n\t/**\n\t * Show error message when entity not found.\n\t */\n\tentityNotFound(collectionLabel: string): void {\n\t\tthis.toast.error(\n\t\t\t`${collectionLabel} not found`,\n\t\t\t`The requested ${collectionLabel.toLowerCase()} could not be found.`,\n\t\t);\n\t}\n\n\t// === Warning Messages ===\n\n\t/**\n\t * Show warning about unsaved changes.\n\t */\n\tunsavedChanges(): void {\n\t\tthis.toast.warning('Unsaved changes', 'You have unsaved changes that will be lost.');\n\t}\n\n\t// === Confirmations ===\n\n\t/**\n\t * Confirm delete operation for a single entity.\n\t * @param collectionLabel The collection label (e.g., \"Post\")\n\t * @param entityTitle The entity title to display (optional)\n\t * @returns Promise resolving to true if confirmed\n\t */\n\tconfirmDelete(collectionLabel: string, entityTitle?: string): Promise<boolean> {\n\t\tconst title = entityTitle\n\t\t\t? `Delete \"${entityTitle}\"?`\n\t\t\t: `Delete this ${collectionLabel.toLowerCase()}?`;\n\n\t\treturn this.confirmation.confirm({\n\t\t\ttitle,\n\t\t\tdescription: 'This action cannot be undone.',\n\t\t\tconfirmText: 'Delete',\n\t\t\tcancelText: 'Cancel',\n\t\t\tvariant: 'destructive',\n\t\t\ticon: 'danger',\n\t\t});\n\t}\n\n\t/**\n\t * Confirm bulk delete operation.\n\t * @param collectionLabel The collection label (e.g., \"Posts\")\n\t * @param count Number of items to delete\n\t * @returns Promise resolving to true if confirmed\n\t */\n\tconfirmBulkDelete(collectionLabel: string, count: number): Promise<boolean> {\n\t\treturn this.confirmation.confirm({\n\t\t\ttitle: `Delete ${count} ${collectionLabel.toLowerCase()}?`,\n\t\t\tdescription: 'This action cannot be undone. All selected items will be permanently deleted.',\n\t\t\tconfirmText: `Delete ${count} items`,\n\t\t\tcancelText: 'Cancel',\n\t\t\tvariant: 'destructive',\n\t\t\ticon: 'danger',\n\t\t});\n\t}\n\n\t/**\n\t * Confirm discard changes.\n\t * @returns Promise resolving to true if confirmed\n\t */\n\tconfirmDiscard(): Promise<boolean> {\n\t\treturn this.confirmation.discardChanges();\n\t}\n\n\t/**\n\t * Confirm unpublish operation.\n\t * @param collectionLabel The collection label\n\t * @returns Promise resolving to true if confirmed\n\t */\n\tconfirmUnpublish(collectionLabel: string): Promise<boolean> {\n\t\treturn this.confirmation.confirm({\n\t\t\ttitle: `Unpublish this ${collectionLabel.toLowerCase()}?`,\n\t\t\tdescription: 'This will remove the item from your public site.',\n\t\t\tconfirmText: 'Unpublish',\n\t\t\tcancelText: 'Cancel',\n\t\t\tvariant: 'default',\n\t\t\ticon: 'warning',\n\t\t});\n\t}\n\n\t/**\n\t * Confirm restore version operation.\n\t * @param collectionLabel The collection label\n\t * @returns Promise resolving to true if confirmed\n\t */\n\tconfirmRestore(collectionLabel: string): Promise<boolean> {\n\t\treturn this.confirmation.confirm({\n\t\t\ttitle: `Restore this version?`,\n\t\t\tdescription: `This will revert the ${collectionLabel.toLowerCase()} to this previous version. The current version will be preserved in history.`,\n\t\t\tconfirmText: 'Restore',\n\t\t\tcancelText: 'Cancel',\n\t\t\tvariant: 'default',\n\t\t\ticon: 'question',\n\t\t});\n\t}\n\n\t/**\n\t * Show success message when a version is restored.\n\t */\n\tversionRestored(collectionLabel: string): void {\n\t\tthis.toast.success(\n\t\t\t`Version restored`,\n\t\t\t`The ${collectionLabel.toLowerCase()} has been restored to the selected version.`,\n\t\t);\n\t}\n\n\t/**\n\t * Show success message when a draft is saved.\n\t */\n\tdraftSaved(): void {\n\t\tthis.toast.success('Draft saved', 'Your changes have been saved as a draft.');\n\t}\n\n\t/**\n\t * Show confirmation with custom config.\n\t */\n\tconfirm(config: {\n\t\ttitle: string;\n\t\tdescription: string;\n\t\tconfirmText?: string;\n\t\tcancelText?: string;\n\t\tvariant?: 'default' | 'destructive';\n\t}): Promise<boolean> {\n\t\treturn this.confirmation.confirm({\n\t\t\t...config,\n\t\t\ticon: config.variant === 'destructive' ? 'danger' : 'question',\n\t\t});\n\t}\n}\n","import { inject } from '@angular/core';\nimport type { CanDeactivateFn } from '@angular/router';\nimport { FeedbackService } from '../widgets/feedback/feedback.service';\n\n/**\n * Interface for components that track unsaved changes.\n */\nexport interface HasUnsavedChanges {\n\thasUnsavedChanges(): boolean;\n}\n\n/**\n * Route guard that prompts the user before navigating away from a dirty form.\n */\nexport const unsavedChangesGuard: CanDeactivateFn<HasUnsavedChanges> = (component) => {\n\tif (!component.hasUnsavedChanges()) return true;\n\tconst feedback = inject(FeedbackService);\n\treturn feedback.confirmDiscard();\n};\n","/**\n * Momentum Admin Routes Factory\n *\n * Creates Angular routes for the admin UI that can be integrated into\n * any Angular application or Analog.js app.\n *\n * Usage in Angular:\n * ```typescript\n * import { momentumAdminRoutes } from '@momentumcms/admin';\n * import { collections } from './collections';\n *\n * export const routes: Routes = [\n * ...momentumAdminRoutes({\n * basePath: '/admin',\n * collections,\n * }),\n * ];\n * ```\n */\n\nimport type { Routes, Route } from '@angular/router';\nimport type { Type } from '@angular/core';\nimport type {\n\tCollectionConfig,\n\tGlobalConfig,\n\tMomentumConfig,\n\tMomentumPlugin,\n\tPluginAdminRouteDescriptor,\n} from '@momentumcms/core';\nimport { authGuard } from '../guards/auth.guard';\nimport { guestGuard } from '../guards/guest.guard';\nimport { setupGuard } from '../guards/setup.guard';\nimport { collectionAccessGuard } from '../guards/collection-access.guard';\nimport { unsavedChangesGuard } from '../guards/unsaved-changes.guard';\n\nexport interface MomentumAdminBranding {\n\t/** Logo URL */\n\tlogo?: string;\n\t/** Site title */\n\ttitle?: string;\n\t/** Primary color (CSS color value) */\n\tprimaryColor?: string;\n}\n\n/**\n * Admin plugin route descriptor with Angular-typed loadComponent.\n * Mirrors Angular Route concepts (path, loadComponent, data) with\n * additional Momentum sidebar metadata (label, icon, group).\n */\nexport interface AdminPluginRoute {\n\t/** Route path under admin (e.g., 'analytics') — same as Angular Route.path */\n\tpath: string;\n\t/** Lazy component loader — same as Angular Route.loadComponent */\n\tloadComponent: () => Promise<Type<unknown>>;\n\t/** Optional route data — same as Angular Route.data */\n\tdata?: Record<string, unknown>;\n\t/** Sidebar display label */\n\tlabel: string;\n\t/** Icon name from ng-icons (e.g., 'heroChartBarSquare') */\n\ticon: string;\n\t/** Sidebar section name. @default 'Plugins' */\n\tgroup?: string;\n}\n\nexport interface MomentumAdminOptions {\n\t/** Base path for admin routes (e.g., '/admin') */\n\tbasePath: string;\n\t/** Collection configurations */\n\tcollections: CollectionConfig[];\n\t/** Global configurations (singleton documents) */\n\tglobals?: GlobalConfig[];\n\t/** Optional branding customization */\n\tbranding?: MomentumAdminBranding;\n\t/** Whether to include auth routes (login, setup). Defaults to true */\n\tincludeAuthRoutes?: boolean;\n\t/** Plugin-registered admin routes. Accepts both Angular-typed and core-typed descriptors. */\n\tpluginRoutes?: AdminPluginRoute[] | PluginAdminRouteDescriptor[];\n\t/** Plugins — their static collections and admin routes are merged automatically. */\n\tplugins?: MomentumPlugin[];\n}\n\nexport interface MomentumAdminRouteData {\n\tcollections: CollectionConfig[];\n\tglobals?: GlobalConfig[];\n\tbranding?: MomentumAdminBranding;\n\tpluginRoutes?: AdminPluginRoute[];\n}\n\n/**\n * Converts a PluginAdminRouteDescriptor (from core) to an AdminPluginRoute (Angular-typed).\n */\nfunction toAdminPluginRoute(descriptor: PluginAdminRouteDescriptor): AdminPluginRoute {\n\treturn {\n\t\tpath: descriptor.path,\n\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- core uses `unknown` for loadComponent to avoid Angular dependency\n\t\tloadComponent: descriptor.loadComponent as () => Promise<Type<unknown>>,\n\t\tdata: descriptor.data,\n\t\tlabel: descriptor.label,\n\t\ticon: descriptor.icon,\n\t\tgroup: descriptor.group,\n\t};\n}\n\n/**\n * Creates Angular routes for the Momentum CMS admin UI.\n *\n * Can be called with a full `MomentumConfig` (config-driven) or explicit options.\n *\n * Config-driven usage (recommended):\n * ```typescript\n * import config from '../momentum.config';\n * export const routes = [...momentumAdminRoutes(config)];\n * ```\n *\n * Options-based usage:\n * ```typescript\n * momentumAdminRoutes({ basePath: '/admin', collections, branding })\n * ```\n */\nexport function momentumAdminRoutes(config: MomentumConfig): Routes;\nexport function momentumAdminRoutes(options: MomentumAdminOptions): Routes;\nexport function momentumAdminRoutes(\n\tconfigOrOptions: MomentumConfig | MomentumAdminOptions,\n): Routes {\n\tlet basePath: string;\n\tlet collections: CollectionConfig[];\n\tlet globals: GlobalConfig[] | undefined;\n\tlet branding: MomentumAdminBranding | undefined;\n\tlet includeAuthRoutes: boolean;\n\tlet pluginRoutes: AdminPluginRoute[] | undefined;\n\n\tlet plugins: MomentumPlugin[];\n\n\t// Distinguish MomentumConfig (has `db`) from MomentumAdminOptions (has `basePath` as required string)\n\tif ('db' in configOrOptions) {\n\t\tconst config = configOrOptions;\n\t\tbasePath = (config.admin?.basePath ?? '/admin').replace(/^\\//, '');\n\t\tplugins = config.plugins ?? [];\n\n\t\t// Merge static config collections with plugin-declared collections (e.g. auth collections)\n\t\tconst pluginCollections = plugins.flatMap((p) => p.collections ?? []);\n\t\tconst configSlugs = new Set(config.collections.map((c) => c.slug));\n\t\tconst uniquePluginCollections = pluginCollections.filter((c) => !configSlugs.has(c.slug));\n\t\tcollections = [...config.collections, ...uniquePluginCollections];\n\n\t\tglobals = config.globals;\n\t\tbranding = config.admin?.branding;\n\t\tincludeAuthRoutes = true;\n\t\tpluginRoutes = plugins.flatMap((p) => p.adminRoutes ?? []).map(toAdminPluginRoute);\n\t} else {\n\t\tbasePath = configOrOptions.basePath.replace(/^\\//, '');\n\t\tplugins = configOrOptions.plugins ?? [];\n\n\t\t// Merge plugin-declared collections (e.g. auth collections) with explicit collections\n\t\tconst pluginCollections = plugins.flatMap((p) => p.collections ?? []);\n\t\tconst optSlugs = new Set(configOrOptions.collections.map((c) => c.slug));\n\t\tconst uniquePluginCollections = pluginCollections.filter((c) => !optSlugs.has(c.slug));\n\t\tcollections = [...configOrOptions.collections, ...uniquePluginCollections];\n\n\t\tglobals = configOrOptions.globals;\n\t\tbranding = configOrOptions.branding;\n\t\tincludeAuthRoutes = configOrOptions.includeAuthRoutes ?? true;\n\n\t\t// Merge explicit plugin routes with plugin-declared admin routes\n\t\tconst explicitRoutes = configOrOptions.pluginRoutes?.map(toAdminPluginRoute) ?? [];\n\t\tconst pluginDeclaredRoutes = plugins\n\t\t\t.flatMap((p) => p.adminRoutes ?? [])\n\t\t\t.map(toAdminPluginRoute);\n\t\tpluginRoutes = [...explicitRoutes, ...pluginDeclaredRoutes];\n\t}\n\n\t// Apply plugin collection transforms (e.g. analytics field injection)\n\tfor (const plugin of plugins) {\n\t\tif (plugin.modifyCollections) {\n\t\t\tplugin.modifyCollections(collections);\n\t\t}\n\t}\n\n\tconst routeData: MomentumAdminRouteData = {\n\t\tcollections,\n\t\tglobals,\n\t\tbranding,\n\t\tpluginRoutes,\n\t};\n\n\tconst routes: Routes = [];\n\n\t// Auth routes (login, setup, password reset) - outside the admin shell\n\tif (includeAuthRoutes) {\n\t\troutes.push(\n\t\t\t// Login page - only for unauthenticated users\n\t\t\t{\n\t\t\t\tpath: `${basePath}/login`,\n\t\t\t\tloadComponent: (): Promise<Type<unknown>> =>\n\t\t\t\t\timport('../pages/login/login.page').then((m) => m.LoginPage),\n\t\t\t\tcanActivate: [guestGuard],\n\t\t\t},\n\t\t\t// Setup page - only when no users exist\n\t\t\t{\n\t\t\t\tpath: `${basePath}/setup`,\n\t\t\t\tloadComponent: (): Promise<Type<unknown>> =>\n\t\t\t\t\timport('../pages/setup/setup.page').then((m) => m.SetupPage),\n\t\t\t\tcanActivate: [setupGuard],\n\t\t\t},\n\t\t\t// Forgot password page - only for unauthenticated users\n\t\t\t{\n\t\t\t\tpath: `${basePath}/forgot-password`,\n\t\t\t\tloadComponent: (): Promise<Type<unknown>> =>\n\t\t\t\t\timport('../pages/forgot-password/forgot-password.page').then((m) => m.ForgotPasswordPage),\n\t\t\t\tcanActivate: [guestGuard],\n\t\t\t},\n\t\t\t// Reset password page - only for unauthenticated users\n\t\t\t{\n\t\t\t\tpath: `${basePath}/reset-password`,\n\t\t\t\tloadComponent: (): Promise<Type<unknown>> =>\n\t\t\t\t\timport('../pages/reset-password/reset-password.page').then((m) => m.ResetPasswordPage),\n\t\t\t\tcanActivate: [guestGuard],\n\t\t\t},\n\t\t);\n\t}\n\n\t// Main admin route with shell - protected by authGuard\n\tconst adminRoute: Route = {\n\t\tpath: basePath,\n\t\tloadComponent: (): Promise<Type<unknown>> =>\n\t\t\timport('../components/shell/admin-shell.component').then((m) => m.AdminShellComponent),\n\t\tdata: routeData,\n\t\tcanActivate: [authGuard],\n\t\tchildren: [\n\t\t\t// Dashboard (default route)\n\t\t\t{\n\t\t\t\tpath: '',\n\t\t\t\tloadComponent: (): Promise<Type<unknown>> =>\n\t\t\t\t\timport('../pages/dashboard/dashboard.page').then((m) => m.DashboardPage),\n\t\t\t},\n\t\t\t// Media library\n\t\t\t{\n\t\t\t\tpath: 'media',\n\t\t\t\tloadComponent: (): Promise<Type<unknown>> =>\n\t\t\t\t\timport('../pages/media-library/media-library.page').then((m) => m.MediaLibraryPage),\n\t\t\t},\n\t\t\t// Collection list\n\t\t\t{\n\t\t\t\tpath: 'collections/:slug',\n\t\t\t\tloadComponent: (): Promise<Type<unknown>> =>\n\t\t\t\t\timport('../pages/collection-list/collection-list.page').then((m) => m.CollectionListPage),\n\t\t\t\tcanActivate: [collectionAccessGuard],\n\t\t\t},\n\t\t\t// Create new document\n\t\t\t{\n\t\t\t\tpath: 'collections/:slug/new',\n\t\t\t\tloadComponent: (): Promise<Type<unknown>> =>\n\t\t\t\t\timport('../pages/collection-edit/collection-edit.page').then((m) => m.CollectionEditPage),\n\t\t\t\tcanActivate: [collectionAccessGuard],\n\t\t\t\tcanDeactivate: [unsavedChangesGuard],\n\t\t\t},\n\t\t\t// View existing document\n\t\t\t{\n\t\t\t\tpath: 'collections/:slug/:id',\n\t\t\t\tloadComponent: (): Promise<Type<unknown>> =>\n\t\t\t\t\timport('../pages/collection-view/collection-view.page').then((m) => m.CollectionViewPage),\n\t\t\t\tcanActivate: [collectionAccessGuard],\n\t\t\t},\n\t\t\t// Edit existing document\n\t\t\t{\n\t\t\t\tpath: 'collections/:slug/:id/edit',\n\t\t\t\tloadComponent: (): Promise<Type<unknown>> =>\n\t\t\t\t\timport('../pages/collection-edit/collection-edit.page').then((m) => m.CollectionEditPage),\n\t\t\t\tcanActivate: [collectionAccessGuard],\n\t\t\t\tcanDeactivate: [unsavedChangesGuard],\n\t\t\t},\n\t\t\t// Global edit\n\t\t\t{\n\t\t\t\tpath: 'globals/:slug',\n\t\t\t\tloadComponent: (): Promise<Type<unknown>> =>\n\t\t\t\t\timport('../pages/global-edit/global-edit.page').then((m) => m.GlobalEditPage),\n\t\t\t\tcanDeactivate: [unsavedChangesGuard],\n\t\t\t},\n\t\t\t// Plugin-registered routes\n\t\t\t...(pluginRoutes ?? []).map((pr) => ({\n\t\t\t\tpath: pr.path,\n\t\t\t\tloadComponent: pr.loadComponent,\n\t\t\t\tdata: pr.data,\n\t\t\t})),\n\t\t],\n\t};\n\n\troutes.push(adminRoute);\n\n\treturn routes;\n}\n","import {\n\tHttpContextToken,\n\tHttpErrorResponse,\n\tHttpResponse,\n\ttype HttpInterceptorFn,\n} from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { tap, catchError, throwError } from 'rxjs';\nimport { FeedbackService } from '../widgets/feedback/feedback.service';\n\n/**\n * Set this context token to `true` on any HTTP request to skip\n * the automatic CUD toast for that specific request.\n *\n * @example\n * ```typescript\n * const context = new HttpContext().set(SKIP_AUTO_TOAST, true);\n * this.http.post('/api/posts', data, { context });\n * ```\n */\nexport const SKIP_AUTO_TOAST = new HttpContextToken<boolean>(() => false);\n\n/** Routes that are not collection endpoints and should be ignored. */\nconst EXCLUDED_SLUGS = new Set(['auth', 'setup', 'health', 'config', 'access', 'graphql']);\n\n/** Sub-resource actions that have specific toast behavior. */\nconst LIFECYCLE_ACTIONS = new Set(['publish', 'unpublish', 'draft']);\n\n/** Sub-resource actions that should be completely skipped by the interceptor. */\nconst SKIP_ACTIONS = new Set(['status', 'versions', 'versions/restore', 'versions/compare']);\n\n/** Patterns indicating internal server details that should not be shown to users. */\nconst INTERNAL_ERROR_PATTERNS = [\n\t/\\b(?:SELECT|INSERT INTO|UPDATE|DELETE FROM)\\b.+\\b(?:FROM|WHERE|SET|VALUES)\\b/i,\n\t/(?:\\/[a-z_-]+){2,}\\.(?:[jt]sx?|mjs)(?::\\d+)?/i,\n\t/at .+\\.[jt]s:/,\n\t/SQLITE_|ECONNREFUSED|ENOTFOUND|ETIMEDOUT/i,\n\t/relation \".+\" does not exist/i,\n];\n\ninterface UrlInfo {\n\tslug: string;\n\tsubAction: string | null;\n}\n\n/**\n * Extract the collection slug and optional sub-action from a URL.\n * Returns null for non-collection routes.\n *\n * Examples:\n * - `/api/posts` → { slug: 'posts', subAction: null }\n * - `/api/posts/123` → { slug: 'posts', subAction: null }\n * - `/api/posts/123/publish` → { slug: 'posts', subAction: 'publish' }\n * - `/api/posts/batch` → { slug: 'posts', subAction: null } (batch detected separately)\n */\nfunction extractUrlInfo(url: string): UrlInfo | null {\n\tconst match = /^\\/api\\/([a-z0-9-]+)/i.exec(url);\n\tif (!match) return null;\n\tconst slug = match[1];\n\tif (EXCLUDED_SLUGS.has(slug)) return null;\n\n\t// Check for sub-actions: /api/{slug}/{id}/{action} or /api/{slug}/{id}/versions/{action}\n\tconst actionMatch =\n\t\t/^\\/api\\/[a-z0-9-]+\\/[a-z0-9-]+\\/(publish|unpublish|draft|status|versions(?:\\/restore|\\/compare)?)(?:\\?|$)/i.exec(\n\t\t\turl,\n\t\t);\n\tconst subAction = actionMatch ? actionMatch[1].toLowerCase() : null;\n\n\treturn { slug, subAction };\n}\n\n/**\n * Humanize a kebab-case slug into a singular label.\n * \"blog-posts\" -> \"Blog Post\"\n */\nfunction humanizeSlug(slug: string): string {\n\tconst words = slug.replace(/-/g, ' ').split(' ');\n\tconst capitalized = words.map((w) => w.charAt(0).toUpperCase() + w.slice(1)).join(' ');\n\t// Simple singularization: remove trailing 's' unless it ends in 'ss' (e.g., \"business\")\n\tif (capitalized.endsWith('s') && !capitalized.endsWith('ss')) {\n\t\treturn capitalized.slice(0, -1);\n\t}\n\treturn capitalized;\n}\n\n/**\n * Humanize a kebab-case slug into a plural label (no singularization).\n * \"blog-posts\" -> \"Blog Posts\", \"business\" -> \"Business\"\n */\nfunction humanizeSlugPlural(slug: string): string {\n\tconst words = slug.replace(/-/g, ' ').split(' ');\n\treturn words.map((w) => w.charAt(0).toUpperCase() + w.slice(1)).join(' ');\n}\n\n/**\n * Sanitize error messages from server responses to prevent leaking\n * internal details (SQL, file paths, stack traces) to end users.\n */\nfunction sanitizeErrorMessage(message: string, fallback: string): string {\n\tfor (const pattern of INTERNAL_ERROR_PATTERNS) {\n\t\tif (pattern.test(message)) return fallback;\n\t}\n\treturn message;\n}\n\n/**\n * Map HTTP method to a human-readable operation name.\n */\nfunction getOperationName(method: string, isBatch: boolean): string {\n\tif (isBatch) return 'batch operation on';\n\tswitch (method) {\n\t\tcase 'POST':\n\t\t\treturn 'create';\n\t\tcase 'PATCH':\n\t\tcase 'PUT':\n\t\t\treturn 'update';\n\t\tcase 'DELETE':\n\t\t\treturn 'delete';\n\t\tdefault:\n\t\t\treturn 'modify';\n\t}\n}\n\n/**\n * HTTP interceptor that automatically shows toast notifications\n * for CUD (Create, Update, Delete) operations on collection API endpoints.\n *\n * Handles both success and error responses:\n * - Success: Shows appropriate created/updated/deleted toast\n * - Error 400 with validation errors: Shows validation failed toast\n * - Error 403: Shows not authorized toast\n * - Error 404: Shows entity not found toast\n * - Other errors: Shows generic operation failed toast\n *\n * Use `SKIP_AUTO_TOAST` context token to opt out for specific requests.\n */\nexport const crudToastInterceptor: HttpInterceptorFn = (req, next) => {\n\tconst method = req.method;\n\n\t// Only intercept mutating methods\n\tif (!['POST', 'PATCH', 'PUT', 'DELETE'].includes(method)) {\n\t\treturn next(req);\n\t}\n\n\t// Skip if the request opted out\n\tif (req.context.get(SKIP_AUTO_TOAST)) {\n\t\treturn next(req);\n\t}\n\n\t// Only intercept collection API routes\n\tconst urlInfo = extractUrlInfo(req.url);\n\tif (!urlInfo) return next(req);\n\n\tconst { slug, subAction } = urlInfo;\n\n\t// Skip sub-actions that don't need toasts (read-only or handled elsewhere)\n\tif (subAction && SKIP_ACTIONS.has(subAction)) {\n\t\treturn next(req);\n\t}\n\n\tconst feedback = inject(FeedbackService);\n\tconst label = humanizeSlug(slug);\n\tconst isBatch = req.url.includes('/batch');\n\n\treturn next(req).pipe(\n\t\ttap((event) => {\n\t\t\tif (!(event instanceof HttpResponse)) return;\n\t\t\tif (!event.ok) return;\n\n\t\t\t// Handle lifecycle sub-actions (publish, unpublish, draft)\n\t\t\tif (subAction && LIFECYCLE_ACTIONS.has(subAction)) {\n\t\t\t\tswitch (subAction) {\n\t\t\t\t\tcase 'publish':\n\t\t\t\t\t\tfeedback.entityPublished(label);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'unpublish':\n\t\t\t\t\t\tfeedback.entityUnpublished(label);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'draft':\n\t\t\t\t\t\tfeedback.draftSaved();\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (isBatch) {\n\t\t\t\t// For batch operations, try to extract count from response\n\t\t\t\tconst body = event.body;\n\t\t\t\tconst count =\n\t\t\t\t\t(body && typeof body === 'object' && 'docs' in body && Array.isArray(body.docs)\n\t\t\t\t\t\t? body.docs.length\n\t\t\t\t\t\t: undefined) ??\n\t\t\t\t\t(body && typeof body === 'object' && 'results' in body && Array.isArray(body.results)\n\t\t\t\t\t\t? body.results.length\n\t\t\t\t\t\t: undefined);\n\n\t\t\t\tif (method === 'DELETE' && count !== undefined) {\n\t\t\t\t\tfeedback.entitiesDeleted(label, count);\n\t\t\t\t} else if (method === 'POST' && count !== undefined) {\n\t\t\t\t\t// Use plural form from slug directly (avoids naive re-pluralization)\n\t\t\t\t\tfeedback.entityCreated(`${count} ${humanizeSlugPlural(slug).toLowerCase()}`);\n\t\t\t\t} else {\n\t\t\t\t\tfeedback.entityUpdated(label);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tswitch (method) {\n\t\t\t\tcase 'POST':\n\t\t\t\t\tfeedback.entityCreated(label);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'PATCH':\n\t\t\t\tcase 'PUT':\n\t\t\t\t\tfeedback.entityUpdated(label);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'DELETE':\n\t\t\t\t\tfeedback.entityDeleted(label);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}),\n\t\tcatchError((error: unknown) => {\n\t\t\tif (error instanceof HttpErrorResponse) {\n\t\t\t\tconst operation = getOperationName(method, isBatch);\n\t\t\t\tconst status = error.status;\n\t\t\t\tconst body = error.error;\n\n\t\t\t\tif (status === 403) {\n\t\t\t\t\tfeedback.notAuthorized(`${operation} this ${label.toLowerCase()}`);\n\t\t\t\t} else if (status === 404) {\n\t\t\t\t\tfeedback.entityNotFound(label);\n\t\t\t\t} else if (\n\t\t\t\t\tstatus === 400 &&\n\t\t\t\t\tbody &&\n\t\t\t\t\ttypeof body === 'object' &&\n\t\t\t\t\t'errors' in body &&\n\t\t\t\t\tArray.isArray(body.errors)\n\t\t\t\t) {\n\t\t\t\t\tfeedback.validationFailed(body.errors.length);\n\t\t\t\t} else {\n\t\t\t\t\tconst fallback = `Failed to ${operation} ${label.toLowerCase()}`;\n\t\t\t\t\tconst message =\n\t\t\t\t\t\tbody && typeof body === 'object' && 'error' in body && typeof body.error === 'string'\n\t\t\t\t\t\t\t? sanitizeErrorMessage(body.error, fallback)\n\t\t\t\t\t\t\t: fallback;\n\t\t\t\t\tfeedback.operationFailed(message);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn throwError(() => error);\n\t\t}),\n\t);\n};\n","import { Injectable, inject } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\nexport interface ApiResponse<T> {\n\tdocs?: T[];\n\tdoc?: T;\n\ttotalDocs?: number;\n\terror?: string;\n\tstatus?: number;\n\tdeleted?: boolean;\n}\n\n/**\n * Momentum CMS API Service\n *\n * Handles communication with the Momentum CMS REST API.\n */\n@Injectable({ providedIn: 'root' })\nexport class MomentumApiService {\n\tprivate readonly http = inject(HttpClient);\n\tprivate readonly baseUrl = '/api';\n\n\t/**\n\t * Fetch all documents from a collection\n\t */\n\tfindAll(collection: string): Observable<Record<string, unknown>[]> {\n\t\treturn this.http\n\t\t\t.get<ApiResponse<Record<string, unknown>>>(`${this.baseUrl}/${collection}`)\n\t\t\t.pipe(map((response) => response.docs ?? []));\n\t}\n\n\t/**\n\t * Fetch a single document by ID\n\t */\n\tfindById(collection: string, id: string): Observable<Record<string, unknown> | null> {\n\t\treturn this.http\n\t\t\t.get<ApiResponse<Record<string, unknown>>>(`${this.baseUrl}/${collection}/${id}`)\n\t\t\t.pipe(map((response) => response.doc ?? null));\n\t}\n\n\t/**\n\t * Create a new document\n\t */\n\tcreate(collection: string, data: Record<string, unknown>): Observable<Record<string, unknown>> {\n\t\treturn this.http\n\t\t\t.post<ApiResponse<Record<string, unknown>>>(`${this.baseUrl}/${collection}`, data)\n\t\t\t.pipe(map((response) => response.doc ?? {}));\n\t}\n\n\t/**\n\t * Update an existing document\n\t */\n\tupdate(\n\t\tcollection: string,\n\t\tid: string,\n\t\tdata: Record<string, unknown>,\n\t): Observable<Record<string, unknown>> {\n\t\treturn this.http\n\t\t\t.patch<ApiResponse<Record<string, unknown>>>(`${this.baseUrl}/${collection}/${id}`, data)\n\t\t\t.pipe(map((response) => response.doc ?? {}));\n\t}\n\n\t/**\n\t * Delete a document\n\t */\n\tdelete(collection: string, id: string): Observable<boolean> {\n\t\treturn this.http\n\t\t\t.delete<ApiResponse<unknown>>(`${this.baseUrl}/${collection}/${id}`)\n\t\t\t.pipe(map((response) => response.deleted ?? false));\n\t}\n}\n","import { Injectable, inject, signal, computed } from '@angular/core';\nimport { HttpClient, HttpEventType, HttpRequest } from '@angular/common/http';\nimport { Observable, Subject, finalize } from 'rxjs';\nimport type { MediaDocument } from '@momentumcms/core';\n\n/**\n * Upload progress state.\n */\nexport interface UploadProgress {\n\t/** Current status of the upload */\n\tstatus: 'pending' | 'uploading' | 'complete' | 'error';\n\t/** Upload progress percentage (0-100) */\n\tprogress: number;\n\t/** Original file being uploaded */\n\tfile: File;\n\t/** Created media document (when complete) */\n\tresult?: MediaDocument;\n\t/** Error message (when error) */\n\terror?: string;\n}\n\n/**\n * Upload response from the API.\n */\ninterface UploadApiResponse {\n\tdoc?: MediaDocument;\n\terror?: string;\n\tstatus: number;\n}\n\n/**\n * Service for handling file uploads to Momentum CMS.\n *\n * @example\n * ```typescript\n * const uploadService = inject(UploadService);\n * uploadService.upload(file).subscribe(progress => {\n * console.log(`Progress: ${progress.progress}%`);\n * if (progress.status === 'complete') {\n * console.log('Uploaded:', progress.result);\n * }\n * });\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class UploadService {\n\tprivate readonly http = inject(HttpClient);\n\tprivate readonly uploadUrl = '/api/media/upload';\n\n\t/** Active uploads signal */\n\tprivate readonly activeUploadsSignal = signal<Map<File, UploadProgress>>(new Map());\n\n\t/** Number of active uploads */\n\treadonly activeUploadCount = computed(() => {\n\t\tconst uploads = this.activeUploadsSignal();\n\t\tlet count = 0;\n\t\tfor (const progress of uploads.values()) {\n\t\t\tif (progress.status === 'pending' || progress.status === 'uploading') {\n\t\t\t\tcount++;\n\t\t\t}\n\t\t}\n\t\treturn count;\n\t});\n\n\t/** Whether any uploads are in progress */\n\treadonly isUploading = computed(() => this.activeUploadCount() > 0);\n\n\t/**\n\t * Upload a single file.\n\t *\n\t * @param file - The file to upload\n\t * @param alt - Optional alt text for images\n\t * @returns Observable emitting upload progress\n\t */\n\tupload(file: File, alt?: string): Observable<UploadProgress> {\n\t\tconst subject = new Subject<UploadProgress>();\n\n\t\t// Create FormData with file\n\t\tconst formData = new FormData();\n\t\tformData.append('file', file);\n\t\tif (alt) {\n\t\t\tformData.append('alt', alt);\n\t\t}\n\n\t\t// Initialize progress state\n\t\tconst initialProgress: UploadProgress = {\n\t\t\tstatus: 'pending',\n\t\t\tprogress: 0,\n\t\t\tfile,\n\t\t};\n\n\t\tthis.updateActiveUpload(file, initialProgress);\n\t\tsubject.next(initialProgress);\n\n\t\t// Create request with progress reporting\n\t\tconst request = new HttpRequest('POST', this.uploadUrl, formData, {\n\t\t\treportProgress: true,\n\t\t});\n\n\t\tthis.http\n\t\t\t.request<UploadApiResponse>(request)\n\t\t\t.pipe(\n\t\t\t\tfinalize(() => {\n\t\t\t\t\t// Remove from active uploads when complete\n\t\t\t\t\tconst uploads = new Map(this.activeUploadsSignal());\n\t\t\t\t\tuploads.delete(file);\n\t\t\t\t\tthis.activeUploadsSignal.set(uploads);\n\t\t\t\t\tsubject.complete();\n\t\t\t\t}),\n\t\t\t)\n\t\t\t.subscribe({\n\t\t\t\tnext: (event) => {\n\t\t\t\t\tif (event.type === HttpEventType.UploadProgress) {\n\t\t\t\t\t\tconst progress = event.total ? Math.round((100 * event.loaded) / event.total) : 0;\n\t\t\t\t\t\tconst uploadingProgress: UploadProgress = {\n\t\t\t\t\t\t\tstatus: 'uploading',\n\t\t\t\t\t\t\tprogress,\n\t\t\t\t\t\t\tfile,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tthis.updateActiveUpload(file, uploadingProgress);\n\t\t\t\t\t\tsubject.next(uploadingProgress);\n\t\t\t\t\t} else if (event.type === HttpEventType.Response) {\n\t\t\t\t\t\tconst body = event.body;\n\t\t\t\t\t\tif (body?.doc) {\n\t\t\t\t\t\t\tconst completeProgress: UploadProgress = {\n\t\t\t\t\t\t\t\tstatus: 'complete',\n\t\t\t\t\t\t\t\tprogress: 100,\n\t\t\t\t\t\t\t\tfile,\n\t\t\t\t\t\t\t\tresult: body.doc,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tthis.updateActiveUpload(file, completeProgress);\n\t\t\t\t\t\t\tsubject.next(completeProgress);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst errorProgress: UploadProgress = {\n\t\t\t\t\t\t\t\tstatus: 'error',\n\t\t\t\t\t\t\t\tprogress: 0,\n\t\t\t\t\t\t\t\tfile,\n\t\t\t\t\t\t\t\terror: body?.error ?? 'Upload failed',\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tthis.updateActiveUpload(file, errorProgress);\n\t\t\t\t\t\t\tsubject.next(errorProgress);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\terror: (error: Error) => {\n\t\t\t\t\tconst errorProgress: UploadProgress = {\n\t\t\t\t\t\tstatus: 'error',\n\t\t\t\t\t\tprogress: 0,\n\t\t\t\t\t\tfile,\n\t\t\t\t\t\terror: error.message ?? 'Upload failed',\n\t\t\t\t\t};\n\t\t\t\t\tthis.updateActiveUpload(file, errorProgress);\n\t\t\t\t\tsubject.next(errorProgress);\n\t\t\t\t\tsubject.error(error);\n\t\t\t\t},\n\t\t\t});\n\n\t\treturn subject.asObservable();\n\t}\n\n\t/**\n\t * Upload multiple files.\n\t *\n\t * @param files - Array of files to upload\n\t * @returns Array of observables for each file's progress\n\t */\n\tuploadMultiple(files: File[]): Observable<UploadProgress>[] {\n\t\treturn files.map((file) => this.upload(file));\n\t}\n\n\t/**\n\t * Get the URL for a media document.\n\t *\n\t * @param media - Media document or ID\n\t * @returns URL to access the file\n\t */\n\tgetMediaUrl(media: MediaDocument | string): string {\n\t\tif (typeof media === 'string') {\n\t\t\treturn `/api/media/file/${media}`;\n\t\t}\n\t\treturn media.url ?? `/api/media/file/${media.path}`;\n\t}\n\n\t/**\n\t * Update active upload progress.\n\t */\n\tprivate updateActiveUpload(file: File, progress: UploadProgress): void {\n\t\tconst uploads = new Map(this.activeUploadsSignal());\n\t\tuploads.set(file, progress);\n\t\tthis.activeUploadsSignal.set(uploads);\n\t}\n}\n","/**\n * Momentum API Service for Angular\n *\n * Provides a unified interface for data operations that works seamlessly\n * in both server-side rendering (SSR) and browser contexts.\n *\n * @example\n * ```typescript\n * import { injectMomentumAPI } from '@momentumcms/admin';\n *\n * @Component({...})\n * export class PostsComponent {\n * private readonly api = injectMomentumAPI();\n *\n * async loadPosts(): Promise<void> {\n * const result = await this.api.collection<Post>('posts').find({ limit: 10 });\n * this.posts.set(result.docs);\n * }\n * }\n * ```\n */\n\nimport {\n\tinject,\n\tInjectionToken,\n\tmakeStateKey,\n\tPLATFORM_ID,\n\tProvider,\n\tSignal,\n\tsignal,\n\tStateKey,\n\tTransferState,\n} from '@angular/core';\nimport { isPlatformServer } from '@angular/common';\nimport { HttpClient, HttpParams } from '@angular/common/http';\nimport { firstValueFrom, Observable, of } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\n// ============================================\n// Types (mirrored from server-core for browser use)\n// ============================================\n\n/**\n * User context for API operations.\n */\nexport interface UserContext {\n\tid: string | number;\n\temail?: string;\n\trole?: string;\n\t[key: string]: unknown;\n}\n\n/**\n * Context passed to API operations.\n */\nexport interface MomentumAPIContext {\n\tuser?: UserContext;\n\tdepth?: number;\n\tshowHiddenFields?: boolean;\n}\n\n/**\n * Options for find operations.\n */\nexport interface FindOptions {\n\twhere?: Record<string, unknown>;\n\tsort?: string;\n\tlimit?: number;\n\tpage?: number;\n\tdepth?: number;\n\t/** Enable TransferState caching for SSR hydration (default: true) */\n\ttransfer?: boolean;\n\t/** Include soft-deleted documents in results. @default false */\n\twithDeleted?: boolean;\n\t/** Only return soft-deleted documents. @default false */\n\tonlyDeleted?: boolean;\n}\n\n/**\n * Options for findById operations.\n */\nexport interface FindByIdOptions {\n\tdepth?: number;\n\t/** Enable TransferState caching for SSR hydration (default: true) */\n\ttransfer?: boolean;\n\t/** Include soft-deleted documents. @default false */\n\twithDeleted?: boolean;\n}\n\n/**\n * Result of a find operation with pagination info.\n */\nexport interface FindResult<T> {\n\tdocs: T[];\n\ttotalDocs: number;\n\ttotalPages: number;\n\tpage: number;\n\tlimit: number;\n\thasNextPage: boolean;\n\thasPrevPage: boolean;\n\tnextPage?: number;\n\tprevPage?: number;\n}\n\n/**\n * Result of a delete operation.\n */\nexport interface DeleteResult {\n\tid: string;\n\tdeleted: boolean;\n}\n\n// ============================================\n// Injection Tokens\n// ============================================\n\n/**\n * Server-side Momentum API instance.\n * Provided by Express during SSR via provideMomentumAPI().\n * Must be explicitly provided during SSR - not available in browser.\n */\nexport const MOMENTUM_API = new InjectionToken<MomentumAPIServer>('MOMENTUM_API');\n\n/**\n * User context for the current request.\n * Provided by Express during SSR.\n */\nexport const MOMENTUM_API_CONTEXT = new InjectionToken<MomentumAPIContext>('MOMENTUM_API_CONTEXT');\n\n/**\n * Creates providers for Momentum API during SSR.\n * Use this in your server.ts when calling angularApp.handle().\n *\n * @example\n * ```typescript\n * import { provideMomentumAPI } from '@momentumcms/admin';\n *\n * angularApp.handle(req, {\n * providers: provideMomentumAPI(getMomentumAPI(), { user: req.user }),\n * });\n * ```\n */\nexport function provideMomentumAPI(\n\tapi: MomentumAPIServer,\n\tcontext?: MomentumAPIContext,\n): Provider[] {\n\treturn [\n\t\t{ provide: MOMENTUM_API, useValue: api },\n\t\t{ provide: MOMENTUM_API_CONTEXT, useValue: context ?? {} },\n\t];\n}\n\n// ============================================\n// Interfaces\n// ============================================\n\n/**\n * Server-side API interface (from @momentumcms/server-core).\n * This mirrors the MomentumAPI interface for type safety.\n */\nexport interface MomentumAPIServer {\n\tcollection<T = Record<string, unknown>>(slug: string): CollectionOperationsServer<T>;\n\tglobal<T = Record<string, unknown>>(slug: string): GlobalOperationsServer<T>;\n\tgetConfig(): unknown;\n\tsetContext(ctx: MomentumAPIContext): MomentumAPIServer;\n\tgetContext(): MomentumAPIContext;\n}\n\n/**\n * Server-side collection operations.\n */\nexport interface CollectionOperationsServer<T = Record<string, unknown>> {\n\tfind(options?: FindOptions): Promise<FindResult<T>>;\n\tfindById(id: string, options?: { depth?: number; withDeleted?: boolean }): Promise<T | null>;\n\tcreate(data: Partial<T>): Promise<T>;\n\tupdate(id: string, data: Partial<T>): Promise<T>;\n\tdelete(id: string): Promise<DeleteResult>;\n\tforceDelete(id: string): Promise<DeleteResult>;\n\trestore(id: string): Promise<T>;\n\tcount(where?: Record<string, unknown>, options?: { withDeleted?: boolean }): Promise<number>;\n\tbatchCreate(items: Partial<T>[]): Promise<T[]>;\n\tbatchUpdate(items: { id: string; data: Partial<T> }[]): Promise<T[]>;\n\tbatchDelete(ids: string[]): Promise<DeleteResult[]>;\n}\n\n/**\n * Server-side global operations.\n */\nexport interface GlobalOperationsServer<T = Record<string, unknown>> {\n\tfindOne(options?: { depth?: number }): Promise<T>;\n\tupdate(data: Partial<T>): Promise<T>;\n}\n\n/**\n * Client-side global operations (both Observable and Promise).\n */\nexport interface MomentumGlobalAPI<T = Record<string, unknown>> {\n\t// Observable methods\n\tfindOne$(options?: { depth?: number }): Observable<T>;\n\tupdate$(data: Partial<T>): Observable<T>;\n\n\t// Promise methods\n\tfindOne(options?: { depth?: number }): Promise<T>;\n\tupdate(data: Partial<T>): Promise<T>;\n}\n\n/**\n * Unified client API interface.\n * Works identically on both server (SSR) and browser.\n */\nexport interface MomentumClientAPI {\n\t/**\n\t * Get operations for a specific collection.\n\t */\n\tcollection<T = Record<string, unknown>>(slug: string): MomentumCollectionAPI<T>;\n\n\t/**\n\t * Get operations for a global (singleton document).\n\t */\n\tglobal<T = Record<string, unknown>>(slug: string): MomentumGlobalAPI<T>;\n}\n\n/**\n * Collection operations with both Observable and Promise methods.\n */\nexport interface MomentumCollectionAPI<T = Record<string, unknown>> {\n\t// Observable methods (Angular-friendly)\n\tfind$(options?: FindOptions): Observable<FindResult<T>>;\n\tfindById$(id: string, options?: FindByIdOptions): Observable<T | null>;\n\tcreate$(data: Partial<T>): Observable<T>;\n\tupdate$(id: string, data: Partial<T>): Observable<T>;\n\tdelete$(id: string): Observable<DeleteResult>;\n\tforceDelete$(id: string): Observable<DeleteResult>;\n\trestore$(id: string): Observable<T>;\n\n\t// Batch Observable methods\n\tbatchCreate$(items: Partial<T>[]): Observable<T[]>;\n\tbatchUpdate$(items: { id: string; data: Partial<T> }[]): Observable<T[]>;\n\tbatchDelete$(ids: string[]): Observable<DeleteResult[]>;\n\n\t// Promise methods (async/await)\n\tfind(options?: FindOptions): Promise<FindResult<T>>;\n\tfindById(id: string, options?: FindByIdOptions): Promise<T | null>;\n\tcreate(data: Partial<T>): Promise<T>;\n\tupdate(id: string, data: Partial<T>): Promise<T>;\n\tdelete(id: string): Promise<DeleteResult>;\n\tforceDelete(id: string): Promise<DeleteResult>;\n\trestore(id: string): Promise<T>;\n\n\t// Batch Promise methods\n\tbatchCreate(items: Partial<T>[]): Promise<T[]>;\n\tbatchUpdate(items: { id: string; data: Partial<T> }[]): Promise<T[]>;\n\tbatchDelete(ids: string[]): Promise<DeleteResult[]>;\n\n\t// Signal methods (read-only operations)\n\tfindSignal(options?: FindOptions): Signal<FindResult<T> | undefined>;\n\tfindByIdSignal(id: string, options?: FindByIdOptions): Signal<T | null | undefined>;\n}\n\n// ============================================\n// Type-Safe API Types\n// ============================================\n\n/**\n * Typed find options with where clause type.\n */\nexport interface TypedFindOptions<TWhere> {\n\twhere?: TWhere;\n\tsort?: string;\n\tlimit?: number;\n\tpage?: number;\n\tdepth?: number;\n\t/** Enable TransferState caching for SSR hydration */\n\ttransfer?: boolean;\n}\n\n/**\n * Typed findById options.\n */\nexport interface TypedFindByIdOptions {\n\tdepth?: number;\n\t/** Enable TransferState caching for SSR hydration */\n\ttransfer?: boolean;\n\t/** Include soft-deleted documents. @default false */\n\twithDeleted?: boolean;\n}\n\n/**\n * Type-safe collection API with typed where clauses.\n */\nexport interface TypedCollectionAPI<TDoc, TWhere = Record<string, unknown>> {\n\t// Observable methods\n\tfind$(options?: TypedFindOptions<TWhere>): Observable<FindResult<TDoc>>;\n\tfindById$(id: string, options?: TypedFindByIdOptions): Observable<TDoc | null>;\n\tcreate$(data: Partial<TDoc>): Observable<TDoc>;\n\tupdate$(id: string, data: Partial<TDoc>): Observable<TDoc>;\n\tdelete$(id: string): Observable<DeleteResult>;\n\n\t// Promise methods\n\tfind(options?: TypedFindOptions<TWhere>): Promise<FindResult<TDoc>>;\n\tfindById(id: string, options?: TypedFindByIdOptions): Promise<TDoc | null>;\n\tcreate(data: Partial<TDoc>): Promise<TDoc>;\n\tupdate(id: string, data: Partial<TDoc>): Promise<TDoc>;\n\tdelete(id: string): Promise<DeleteResult>;\n\n\t// Signal methods (read-only operations)\n\tfindSignal(options?: TypedFindOptions<TWhere>): Signal<FindResult<TDoc> | undefined>;\n\tfindByIdSignal(id: string, options?: TypedFindByIdOptions): Signal<TDoc | null | undefined>;\n}\n\n/**\n * Type-safe API interface with direct property access.\n * Maps collection slugs to typed collection APIs.\n *\n * @example\n * ```typescript\n * interface TypedMomentumCollections {\n * 'posts': { doc: Post; where: PostsWhereClause };\n * 'users': { doc: User; where: UsersWhereClause };\n * }\n *\n * const api = injectTypedMomentumAPI<TypedMomentumCollections>();\n * const posts = await api.posts.find(); // posts.docs is Post[]\n * const users = await api.collection('users').find(); // 'users' autocompletes\n * ```\n */\nexport type TypedMomentumClientAPI<\n\tTCollections extends { [key: string]: { doc: unknown; where?: unknown } },\n> = {\n\treadonly [K in keyof TCollections]: TypedCollectionAPI<\n\t\tTCollections[K]['doc'],\n\t\tTCollections[K]['where'] extends undefined ? Record<string, unknown> : TCollections[K]['where']\n\t>;\n} & {\n\tcollection<K extends keyof TCollections & string>(\n\t\tslug: K,\n\t): TypedCollectionAPI<\n\t\tTCollections[K]['doc'],\n\t\tTCollections[K]['where'] extends undefined ? Record<string, unknown> : TCollections[K]['where']\n\t>;\n};\n\n// ============================================\n// TransferState Key Generator\n// ============================================\n\n/**\n * Generates a deterministic TransferState key from collection slug and options.\n * Keys are stable across SSR and browser for the same query.\n */\nfunction generateTransferKey<T>(\n\tcollection: string,\n\toperation: 'find' | 'findById',\n\toptions?: FindOptions | FindByIdOptions,\n\tid?: string,\n): StateKey<T> {\n\tconst parts: string[] = ['mcms', collection, operation];\n\n\tif (id) {\n\t\tparts.push(id);\n\t}\n\n\tif (options) {\n\t\t// Build hash from relevant options (excluding transfer which doesn't affect the query)\n\t\tconst hashParts: Record<string, unknown> = {};\n\n\t\tif ('where' in options && options.where !== undefined) {\n\t\t\thashParts['where'] = options.where;\n\t\t}\n\t\tif ('sort' in options && options.sort !== undefined) {\n\t\t\thashParts['sort'] = options.sort;\n\t\t}\n\t\tif ('limit' in options && options.limit !== undefined) {\n\t\t\thashParts['limit'] = options.limit;\n\t\t}\n\t\tif ('page' in options && options.page !== undefined) {\n\t\t\thashParts['page'] = options.page;\n\t\t}\n\t\tif ('depth' in options && options.depth !== undefined) {\n\t\t\thashParts['depth'] = options.depth;\n\t\t}\n\n\t\tif (Object.keys(hashParts).length > 0) {\n\t\t\t// Sort keys for stable hash\n\t\t\tconst sortedKeys = Object.keys(hashParts).sort();\n\t\t\tconst sorted: Record<string, unknown> = {};\n\t\t\tfor (const key of sortedKeys) {\n\t\t\t\tsorted[key] = hashParts[key];\n\t\t\t}\n\t\t\t// Use btoa for simple hash, slice for reasonable key length\n\t\t\tparts.push(btoa(JSON.stringify(sorted)).slice(0, 16));\n\t\t}\n\t}\n\n\treturn makeStateKey<T>(parts.join(':'));\n}\n\n// ============================================\n// Main Injection Function\n// ============================================\n\n/**\n * Inject the Momentum API with automatic platform detection.\n *\n * - On server (SSR): Uses the direct Momentum API (no HTTP overhead)\n * - On browser: Uses HTTP calls to the REST API\n *\n * @returns The platform-appropriate API implementation\n *\n * @example\n * ```typescript\n * @Component({...})\n * export class PostsComponent {\n * private readonly api = injectMomentumAPI();\n * readonly posts = signal<Post[]>([]);\n *\n * constructor() {\n * // Using observables\n * this.api.collection<Post>('posts').find$().subscribe(result => {\n * this.posts.set(result.docs);\n * });\n *\n * // Or using promises\n * this.loadPosts();\n * }\n *\n * async loadPosts(): Promise<void> {\n * const result = await this.api.collection<Post>('posts').find({ limit: 10 });\n * this.posts.set(result.docs);\n * }\n * }\n * ```\n */\nexport function injectMomentumAPI(): MomentumClientAPI {\n\tconst platformId = inject(PLATFORM_ID);\n\tconst transferState = inject(TransferState, { optional: true });\n\n\tif (isPlatformServer(platformId)) {\n\t\t// Server-side: use direct Momentum API if available\n\t\tconst serverApi = inject(MOMENTUM_API, { optional: true });\n\t\tconst userContext = inject(MOMENTUM_API_CONTEXT, { optional: true });\n\n\t\tif (serverApi) {\n\t\t\t// Use direct server API (no HTTP overhead)\n\t\t\treturn new ServerMomentumAPI(serverApi, userContext ?? {}, transferState);\n\t\t}\n\n\t\t// Fallback to HTTP if server API not initialized yet\n\t\t// This can happen during build-time prerendering\n\t\tconst http = inject(HttpClient);\n\t\treturn new BrowserMomentumAPI(http, transferState, platformId);\n\t} else {\n\t\t// Browser-side: use HTTP client\n\t\tconst http = inject(HttpClient);\n\t\treturn new BrowserMomentumAPI(http, transferState, platformId);\n\t}\n}\n\n/**\n * Inject a type-safe Momentum API with full intellisense for collections.\n *\n * @example\n * ```typescript\n * // First, generate types or define them manually\n * interface TypedMomentumCollections {\n * 'posts': { doc: Post; where: PostsWhereClause };\n * 'users': { doc: User; where: UsersWhereClause };\n * }\n *\n * // Then inject the typed API\n * const api = injectTypedMomentumAPI<TypedMomentumCollections>();\n *\n * // Use with full type safety\n * const posts = await api.posts.find(); // posts.docs is Post[]\n * const users = await api.collection('users').find(); // 'users' autocompletes\n *\n * // Typed where clauses\n * const published = await api.posts.find({\n * where: { status: 'published' } // type-checked\n * });\n * ```\n */\nexport function injectTypedMomentumAPI<\n\tTCollections extends { [key: string]: { doc: unknown; where?: unknown } },\n>(): TypedMomentumClientAPI<TCollections> {\n\tconst baseApi = injectMomentumAPI();\n\treturn createTypedProxy<TCollections>(baseApi);\n}\n\n/**\n * Creates a typed proxy wrapper around the base API.\n * Enables property access (api.posts) in addition to method access (api.collection('posts')).\n */\nfunction createTypedProxy<\n\tTCollections extends { [key: string]: { doc: unknown; where?: unknown } },\n>(baseApi: MomentumClientAPI): TypedMomentumClientAPI<TCollections> {\n\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- Proxy requires empty object cast\n\treturn new Proxy({} as TypedMomentumClientAPI<TCollections>, {\n\t\tget(_, prop: string) {\n\t\t\tif (prop === 'collection') {\n\t\t\t\t// Return the collection method that takes a slug\n\t\t\t\treturn <K extends keyof TCollections & string>(slug: K) => baseApi.collection(slug);\n\t\t\t}\n\t\t\t// Direct property access: api.posts -> api.collection('posts')\n\t\t\treturn baseApi.collection(prop);\n\t\t},\n\t});\n}\n\n// ============================================\n// Server-side Implementation\n// ============================================\n\nclass ServerMomentumAPI implements MomentumClientAPI {\n\tprivate readonly contextualApi: MomentumAPIServer;\n\n\tconstructor(\n\t\tprivate readonly serverApi: MomentumAPIServer,\n\t\tprivate readonly context: MomentumAPIContext,\n\t\tprivate readonly transferState: TransferState | null,\n\t) {\n\t\t// Apply user context\n\t\tthis.contextualApi = context.user ? serverApi.setContext(context) : serverApi;\n\t}\n\n\tcollection<T = Record<string, unknown>>(slug: string): MomentumCollectionAPI<T> {\n\t\treturn new ServerCollectionAPI<T>(\n\t\t\tthis.contextualApi.collection<T>(slug),\n\t\t\tslug,\n\t\t\tthis.transferState,\n\t\t);\n\t}\n\n\tglobal<T = Record<string, unknown>>(slug: string): MomentumGlobalAPI<T> {\n\t\treturn new ServerGlobalAPI<T>(this.contextualApi.global<T>(slug));\n\t}\n}\n\nclass ServerGlobalAPI<T> implements MomentumGlobalAPI<T> {\n\tconstructor(private readonly ops: GlobalOperationsServer<T>) {}\n\n\tfindOne$(options?: { depth?: number }): Observable<T> {\n\t\treturn new Observable((subscriber) => {\n\t\t\tthis.ops\n\t\t\t\t.findOne(options)\n\t\t\t\t.then((result) => {\n\t\t\t\t\tsubscriber.next(result);\n\t\t\t\t\tsubscriber.complete();\n\t\t\t\t})\n\t\t\t\t.catch((err: unknown) => subscriber.error(err));\n\t\t});\n\t}\n\n\tupdate$(data: Partial<T>): Observable<T> {\n\t\treturn new Observable((subscriber) => {\n\t\t\tthis.ops\n\t\t\t\t.update(data)\n\t\t\t\t.then((result) => {\n\t\t\t\t\tsubscriber.next(result);\n\t\t\t\t\tsubscriber.complete();\n\t\t\t\t})\n\t\t\t\t.catch((err: unknown) => subscriber.error(err));\n\t\t});\n\t}\n\n\tfindOne(options?: { depth?: number }): Promise<T> {\n\t\treturn this.ops.findOne(options);\n\t}\n\n\tupdate(data: Partial<T>): Promise<T> {\n\t\treturn this.ops.update(data);\n\t}\n}\n\nclass ServerCollectionAPI<T> implements MomentumCollectionAPI<T> {\n\tconstructor(\n\t\tprivate readonly ops: CollectionOperationsServer<T>,\n\t\tprivate readonly slug: string,\n\t\tprivate readonly transferState: TransferState | null,\n\t) {}\n\n\t// Observable wrappers around promise methods\n\tfind$(options?: FindOptions): Observable<FindResult<T>> {\n\t\treturn new Observable((subscriber) => {\n\t\t\tthis.find(options)\n\t\t\t\t.then((result) => {\n\t\t\t\t\tsubscriber.next(result);\n\t\t\t\t\tsubscriber.complete();\n\t\t\t\t})\n\t\t\t\t.catch((err: unknown) => subscriber.error(err));\n\t\t});\n\t}\n\n\tfindById$(id: string, options?: FindByIdOptions): Observable<T | null> {\n\t\treturn new Observable((subscriber) => {\n\t\t\tthis.findById(id, options)\n\t\t\t\t.then((result) => {\n\t\t\t\t\tsubscriber.next(result);\n\t\t\t\t\tsubscriber.complete();\n\t\t\t\t})\n\t\t\t\t.catch((err: unknown) => subscriber.error(err));\n\t\t});\n\t}\n\n\tcreate$(data: Partial<T>): Observable<T> {\n\t\treturn new Observable((subscriber) => {\n\t\t\tthis.ops\n\t\t\t\t.create(data)\n\t\t\t\t.then((result) => {\n\t\t\t\t\tsubscriber.next(result);\n\t\t\t\t\tsubscriber.complete();\n\t\t\t\t})\n\t\t\t\t.catch((err: unknown) => subscriber.error(err));\n\t\t});\n\t}\n\n\tupdate$(id: string, data: Partial<T>): Observable<T> {\n\t\treturn new Observable((subscriber) => {\n\t\t\tthis.ops\n\t\t\t\t.update(id, data)\n\t\t\t\t.then((result) => {\n\t\t\t\t\tsubscriber.next(result);\n\t\t\t\t\tsubscriber.complete();\n\t\t\t\t})\n\t\t\t\t.catch((err: unknown) => subscriber.error(err));\n\t\t});\n\t}\n\n\tdelete$(id: string): Observable<DeleteResult> {\n\t\treturn new Observable((subscriber) => {\n\t\t\tthis.ops\n\t\t\t\t.delete(id)\n\t\t\t\t.then((result) => {\n\t\t\t\t\tsubscriber.next(result);\n\t\t\t\t\tsubscriber.complete();\n\t\t\t\t})\n\t\t\t\t.catch((err: unknown) => subscriber.error(err));\n\t\t});\n\t}\n\n\tforceDelete$(id: string): Observable<DeleteResult> {\n\t\treturn new Observable((subscriber) => {\n\t\t\tthis.ops\n\t\t\t\t.forceDelete(id)\n\t\t\t\t.then((result) => {\n\t\t\t\t\tsubscriber.next(result);\n\t\t\t\t\tsubscriber.complete();\n\t\t\t\t})\n\t\t\t\t.catch((err: unknown) => subscriber.error(err));\n\t\t});\n\t}\n\n\trestore$(id: string): Observable<T> {\n\t\treturn new Observable((subscriber) => {\n\t\t\tthis.ops\n\t\t\t\t.restore(id)\n\t\t\t\t.then((result) => {\n\t\t\t\t\tsubscriber.next(result);\n\t\t\t\t\tsubscriber.complete();\n\t\t\t\t})\n\t\t\t\t.catch((err: unknown) => subscriber.error(err));\n\t\t});\n\t}\n\n\tbatchCreate$(items: Partial<T>[]): Observable<T[]> {\n\t\treturn new Observable((subscriber) => {\n\t\t\tthis.ops\n\t\t\t\t.batchCreate(items)\n\t\t\t\t.then((result) => {\n\t\t\t\t\tsubscriber.next(result);\n\t\t\t\t\tsubscriber.complete();\n\t\t\t\t})\n\t\t\t\t.catch((err: unknown) => subscriber.error(err));\n\t\t});\n\t}\n\n\tbatchUpdate$(items: { id: string; data: Partial<T> }[]): Observable<T[]> {\n\t\treturn new Observable((subscriber) => {\n\t\t\tthis.ops\n\t\t\t\t.batchUpdate(items)\n\t\t\t\t.then((result) => {\n\t\t\t\t\tsubscriber.next(result);\n\t\t\t\t\tsubscriber.complete();\n\t\t\t\t})\n\t\t\t\t.catch((err: unknown) => subscriber.error(err));\n\t\t});\n\t}\n\n\tbatchDelete$(ids: string[]): Observable<DeleteResult[]> {\n\t\treturn new Observable((subscriber) => {\n\t\t\tthis.ops\n\t\t\t\t.batchDelete(ids)\n\t\t\t\t.then((result) => {\n\t\t\t\t\tsubscriber.next(result);\n\t\t\t\t\tsubscriber.complete();\n\t\t\t\t})\n\t\t\t\t.catch((err: unknown) => subscriber.error(err));\n\t\t});\n\t}\n\n\t// Promise methods with TransferState support (enabled by default)\n\tasync find(options?: FindOptions): Promise<FindResult<T>> {\n\t\tconst result = await this.ops.find(options);\n\n\t\t// Store in TransferState (enabled by default, opt-out with transfer: false)\n\t\tif (options?.transfer !== false && this.transferState) {\n\t\t\tconst key = generateTransferKey<FindResult<T>>(this.slug, 'find', options);\n\t\t\tthis.transferState.set(key, result);\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tasync findById(id: string, options?: FindByIdOptions): Promise<T | null> {\n\t\tconst result = await this.ops.findById(id, options);\n\n\t\t// Store in TransferState (enabled by default, opt-out with transfer: false)\n\t\tif (options?.transfer !== false && this.transferState) {\n\t\t\tconst key = generateTransferKey<T | null>(this.slug, 'findById', options, id);\n\t\t\tthis.transferState.set(key, result);\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tcreate(data: Partial<T>): Promise<T> {\n\t\treturn this.ops.create(data);\n\t}\n\n\tupdate(id: string, data: Partial<T>): Promise<T> {\n\t\treturn this.ops.update(id, data);\n\t}\n\n\tdelete(id: string): Promise<DeleteResult> {\n\t\treturn this.ops.delete(id);\n\t}\n\n\tforceDelete(id: string): Promise<DeleteResult> {\n\t\treturn this.ops.forceDelete(id);\n\t}\n\n\trestore(id: string): Promise<T> {\n\t\treturn this.ops.restore(id);\n\t}\n\n\tbatchCreate(items: Partial<T>[]): Promise<T[]> {\n\t\treturn this.ops.batchCreate(items);\n\t}\n\n\tbatchUpdate(items: { id: string; data: Partial<T> }[]): Promise<T[]> {\n\t\treturn this.ops.batchUpdate(items);\n\t}\n\n\tbatchDelete(ids: string[]): Promise<DeleteResult[]> {\n\t\treturn this.ops.batchDelete(ids);\n\t}\n\n\t// Signal methods (read-only operations)\n\tfindSignal(options?: FindOptions): Signal<FindResult<T> | undefined> {\n\t\tconst result = signal<FindResult<T> | undefined>(undefined);\n\t\tthis.find(options)\n\t\t\t.then((data) => result.set(data))\n\t\t\t.catch((err: unknown) => console.error('[MomentumAPI] findSignal failed:', err));\n\t\treturn result.asReadonly();\n\t}\n\n\tfindByIdSignal(id: string, options?: FindByIdOptions): Signal<T | null | undefined> {\n\t\tconst result = signal<T | null | undefined>(undefined);\n\t\tthis.findById(id, options)\n\t\t\t.then((data) => result.set(data))\n\t\t\t.catch((err: unknown) => console.error('[MomentumAPI] findByIdSignal failed:', err));\n\t\treturn result.asReadonly();\n\t}\n}\n\n// ============================================\n// Browser-side Implementation\n// ============================================\n\n/**\n * API response structure from the REST API.\n */\ninterface ApiResponse<T> {\n\tdocs?: T[];\n\tdoc?: T;\n\ttotalDocs?: number;\n\tdeleted?: boolean;\n\tid?: string;\n\terror?: string;\n\terrors?: Array<{ field: string; message: string }>;\n}\n\n/**\n * Batch operation response from the REST API.\n */\ninterface ApiBatchResponse {\n\tdocs?: Record<string, unknown>[];\n\tresults?: Array<{ id: string; deleted: boolean }>;\n\tmessage?: string;\n\terror?: string;\n}\n\nclass BrowserMomentumAPI implements MomentumClientAPI {\n\tprivate readonly baseUrl = '/api';\n\n\tconstructor(\n\t\tprivate readonly http: HttpClient,\n\t\tprivate readonly transferState: TransferState | null,\n\t\tprivate readonly platformId: object,\n\t) {}\n\n\tcollection<T = Record<string, unknown>>(slug: string): MomentumCollectionAPI<T> {\n\t\treturn new BrowserCollectionAPI<T>(\n\t\t\tthis.http,\n\t\t\t`${this.baseUrl}/${slug}`,\n\t\t\tslug,\n\t\t\tthis.transferState,\n\t\t\tthis.platformId,\n\t\t);\n\t}\n\n\tglobal<T = Record<string, unknown>>(slug: string): MomentumGlobalAPI<T> {\n\t\treturn new BrowserGlobalAPI<T>(this.http, `${this.baseUrl}/globals/${slug}`);\n\t}\n}\n\nclass BrowserGlobalAPI<T> implements MomentumGlobalAPI<T> {\n\tconstructor(\n\t\tprivate readonly http: HttpClient,\n\t\tprivate readonly endpoint: string,\n\t) {}\n\n\tfindOne$(options?: { depth?: number }): Observable<T> {\n\t\tlet params = new HttpParams();\n\t\tif (options?.depth !== undefined) {\n\t\t\tparams = params.set('depth', String(options.depth));\n\t\t}\n\t\treturn (\n\t\t\tthis.http\n\t\t\t\t.get<ApiResponse<T>>(this.endpoint, { params })\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- ApiResponse.doc is unknown\n\t\t\t\t.pipe(map((response) => response.doc as T))\n\t\t);\n\t}\n\n\tupdate$(data: Partial<T>): Observable<T> {\n\t\treturn (\n\t\t\tthis.http\n\t\t\t\t.patch<ApiResponse<T>>(this.endpoint, data)\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- ApiResponse.doc is unknown\n\t\t\t\t.pipe(map((response) => response.doc as T))\n\t\t);\n\t}\n\n\tfindOne(options?: { depth?: number }): Promise<T> {\n\t\treturn firstValueFrom(this.findOne$(options));\n\t}\n\n\tupdate(data: Partial<T>): Promise<T> {\n\t\treturn firstValueFrom(this.update$(data));\n\t}\n}\n\n/**\n * Browser-side collection API implementation.\n * Type assertions are needed because the HTTP client returns ApiResponse<T>\n * and we need to extract/cast the typed document from the response.\n */\n\nclass BrowserCollectionAPI<T> implements MomentumCollectionAPI<T> {\n\tconstructor(\n\t\tprivate readonly http: HttpClient,\n\t\tprivate readonly endpoint: string,\n\t\tprivate readonly slug: string,\n\t\tprivate readonly transferState: TransferState | null,\n\t\tprivate readonly platformId: object,\n\t) {}\n\n\tfind$(options?: FindOptions): Observable<FindResult<T>> {\n\t\t// Check TransferState cache first (enabled by default, opt-out with transfer: false)\n\t\tif (options?.transfer !== false && this.transferState && !isPlatformServer(this.platformId)) {\n\t\t\tconst key = generateTransferKey<FindResult<T>>(this.slug, 'find', options);\n\t\t\tconst cached = this.transferState.get(key, null);\n\t\t\tif (cached) {\n\t\t\t\tthis.transferState.remove(key);\n\t\t\t\treturn of(cached);\n\t\t\t}\n\t\t}\n\n\t\t// Make HTTP call\n\t\tconst params = this.buildQueryParams(options);\n\t\treturn this.http.get<ApiResponse<T>>(this.endpoint, { params }).pipe(\n\t\t\tmap((response) => {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- ApiResponse.docs is unknown[]\n\t\t\t\tconst docs = (response.docs ?? []) as T[];\n\t\t\t\tconst totalDocs = response.totalDocs ?? docs.length;\n\t\t\t\tconst limit = options?.limit ?? 10;\n\t\t\t\tconst page = options?.page ?? 1;\n\t\t\t\tconst totalPages = Math.ceil(totalDocs / limit) || 1;\n\n\t\t\t\treturn {\n\t\t\t\t\tdocs,\n\t\t\t\t\ttotalDocs,\n\t\t\t\t\ttotalPages,\n\t\t\t\t\tpage,\n\t\t\t\t\tlimit,\n\t\t\t\t\thasNextPage: page < totalPages,\n\t\t\t\t\thasPrevPage: page > 1,\n\t\t\t\t\tnextPage: page < totalPages ? page + 1 : undefined,\n\t\t\t\t\tprevPage: page > 1 ? page - 1 : undefined,\n\t\t\t\t};\n\t\t\t}),\n\t\t);\n\t}\n\n\tfindById$(id: string, options?: FindByIdOptions): Observable<T | null> {\n\t\t// Check TransferState cache first (enabled by default, opt-out with transfer: false)\n\t\tif (options?.transfer !== false && this.transferState && !isPlatformServer(this.platformId)) {\n\t\t\tconst key = generateTransferKey<T | null>(this.slug, 'findById', options, id);\n\t\t\tif (this.transferState.hasKey(key)) {\n\t\t\t\tconst cached = this.transferState.get(key, null);\n\t\t\t\tthis.transferState.remove(key);\n\t\t\t\treturn of(cached);\n\t\t\t}\n\t\t}\n\n\t\tlet params = new HttpParams();\n\t\tif (options?.depth !== undefined) {\n\t\t\tparams = params.set('depth', String(options.depth));\n\t\t}\n\t\tif (options?.withDeleted) {\n\t\t\tparams = params.set('withDeleted', 'true');\n\t\t}\n\n\t\treturn (\n\t\t\tthis.http\n\t\t\t\t.get<ApiResponse<T>>(`${this.endpoint}/${id}`, { params })\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- ApiResponse.doc is unknown\n\t\t\t\t.pipe(map((response) => (response.doc as T) ?? null))\n\t\t);\n\t}\n\n\tcreate$(data: Partial<T>): Observable<T> {\n\t\treturn (\n\t\t\tthis.http\n\t\t\t\t.post<ApiResponse<T>>(this.endpoint, data)\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- ApiResponse.doc is unknown\n\t\t\t\t.pipe(map((response) => response.doc as T))\n\t\t);\n\t}\n\n\tupdate$(id: string, data: Partial<T>): Observable<T> {\n\t\treturn (\n\t\t\tthis.http\n\t\t\t\t.patch<ApiResponse<T>>(`${this.endpoint}/${id}`, data)\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- ApiResponse.doc is unknown\n\t\t\t\t.pipe(map((response) => response.doc as T))\n\t\t);\n\t}\n\n\tdelete$(id: string): Observable<DeleteResult> {\n\t\treturn this.http\n\t\t\t.delete<ApiResponse<T>>(`${this.endpoint}/${id}`)\n\t\t\t.pipe(map((response) => ({ id: response.id ?? id, deleted: response.deleted ?? false })));\n\t}\n\n\tforceDelete$(id: string): Observable<DeleteResult> {\n\t\treturn this.http\n\t\t\t.delete<ApiResponse<T>>(`${this.endpoint}/${id}`, {\n\t\t\t\tparams: new HttpParams().set('force', 'true'),\n\t\t\t})\n\t\t\t.pipe(map((response) => ({ id: response.id ?? id, deleted: response.deleted ?? false })));\n\t}\n\n\trestore$(id: string): Observable<T> {\n\t\treturn (\n\t\t\tthis.http\n\t\t\t\t.post<ApiResponse<T>>(`${this.endpoint}/${id}/restore`, {})\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- ApiResponse.doc is unknown\n\t\t\t\t.pipe(map((response) => response.doc as T))\n\t\t);\n\t}\n\n\tbatchCreate$(items: Partial<T>[]): Observable<T[]> {\n\t\treturn (\n\t\t\tthis.http\n\t\t\t\t.post<ApiBatchResponse>(`${this.endpoint}/batch`, { operation: 'create', items })\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- Batch response docs are T[]\n\t\t\t\t.pipe(map((response) => (response.docs ?? []) as T[]))\n\t\t);\n\t}\n\n\tbatchUpdate$(items: { id: string; data: Partial<T> }[]): Observable<T[]> {\n\t\treturn (\n\t\t\tthis.http\n\t\t\t\t.post<ApiBatchResponse>(`${this.endpoint}/batch`, { operation: 'update', items })\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- Batch response docs are T[]\n\t\t\t\t.pipe(map((response) => (response.docs ?? []) as T[]))\n\t\t);\n\t}\n\n\tbatchDelete$(ids: string[]): Observable<DeleteResult[]> {\n\t\treturn this.http\n\t\t\t.post<ApiBatchResponse>(`${this.endpoint}/batch`, { operation: 'delete', ids })\n\t\t\t.pipe(\n\t\t\t\tmap((response) => response.results?.map((r) => ({ id: r.id, deleted: r.deleted })) ?? []),\n\t\t\t);\n\t}\n\n\t// Promise wrappers\n\tfind(options?: FindOptions): Promise<FindResult<T>> {\n\t\treturn firstValueFrom(this.find$(options));\n\t}\n\n\tfindById(id: string, options?: FindByIdOptions): Promise<T | null> {\n\t\treturn firstValueFrom(this.findById$(id, options));\n\t}\n\n\tcreate(data: Partial<T>): Promise<T> {\n\t\treturn firstValueFrom(this.create$(data));\n\t}\n\n\tupdate(id: string, data: Partial<T>): Promise<T> {\n\t\treturn firstValueFrom(this.update$(id, data));\n\t}\n\n\tdelete(id: string): Promise<DeleteResult> {\n\t\treturn firstValueFrom(this.delete$(id));\n\t}\n\n\tforceDelete(id: string): Promise<DeleteResult> {\n\t\treturn firstValueFrom(this.forceDelete$(id));\n\t}\n\n\trestore(id: string): Promise<T> {\n\t\treturn firstValueFrom(this.restore$(id));\n\t}\n\n\tbatchCreate(items: Partial<T>[]): Promise<T[]> {\n\t\treturn firstValueFrom(this.batchCreate$(items));\n\t}\n\n\tbatchUpdate(items: { id: string; data: Partial<T> }[]): Promise<T[]> {\n\t\treturn firstValueFrom(this.batchUpdate$(items));\n\t}\n\n\tbatchDelete(ids: string[]): Promise<DeleteResult[]> {\n\t\treturn firstValueFrom(this.batchDelete$(ids));\n\t}\n\n\t// Signal methods (read-only operations)\n\tfindSignal(options?: FindOptions): Signal<FindResult<T> | undefined> {\n\t\tconst result = signal<FindResult<T> | undefined>(undefined);\n\t\tthis.find(options)\n\t\t\t.then((data) => result.set(data))\n\t\t\t.catch((err: unknown) => console.error('[MomentumAPI] findSignal failed:', err));\n\t\treturn result.asReadonly();\n\t}\n\n\tfindByIdSignal(id: string, options?: FindByIdOptions): Signal<T | null | undefined> {\n\t\tconst result = signal<T | null | undefined>(undefined);\n\t\tthis.findById(id, options)\n\t\t\t.then((data) => result.set(data))\n\t\t\t.catch((err: unknown) => console.error('[MomentumAPI] findByIdSignal failed:', err));\n\t\treturn result.asReadonly();\n\t}\n\n\tprivate buildQueryParams(options?: FindOptions): HttpParams {\n\t\tlet params = new HttpParams();\n\n\t\tif (options?.limit !== undefined) {\n\t\t\tparams = params.set('limit', String(options.limit));\n\t\t}\n\t\tif (options?.page !== undefined) {\n\t\t\tparams = params.set('page', String(options.page));\n\t\t}\n\t\tif (options?.sort) {\n\t\t\tparams = params.set('sort', options.sort);\n\t\t}\n\t\tif (options?.where) {\n\t\t\t// Serialize where clause as JSON\n\t\t\tparams = params.set('where', JSON.stringify(options.where));\n\t\t}\n\t\tif (options?.depth !== undefined) {\n\t\t\tparams = params.set('depth', String(options.depth));\n\t\t}\n\t\tif (options?.withDeleted) {\n\t\t\tparams = params.set('withDeleted', 'true');\n\t\t}\n\t\tif (options?.onlyDeleted) {\n\t\t\tparams = params.set('onlyDeleted', 'true');\n\t\t}\n\n\t\treturn params;\n\t}\n}\n","import { computed, DestroyRef, inject, Injectable, signal } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { filter, Observable, Subject, take } from 'rxjs';\nimport type { Entity } from '../widgets/widget.types';\n\n/**\n * Result emitted when the entity sheet closes.\n */\nexport interface EntitySheetResult {\n\t/** What happened in the sheet */\n\taction: 'created' | 'updated' | 'deleted' | 'cancelled';\n\t/** The entity that was created or updated (undefined on cancel) */\n\tentity?: Entity;\n\t/** The collection slug */\n\tcollection: string;\n}\n\n/** Query parameter keys used by the entity sheet */\nexport const SHEET_QUERY_PARAMS = {\n\tcollection: 'sheetCollection',\n\tentityId: 'sheetEntityId',\n\tmode: 'sheetMode',\n\tcallback: 'sheetCallback',\n};\n\n/** Duration of the close animation in milliseconds (must match CSS) */\nconst CLOSE_ANIMATION_MS = 200;\n\n/**\n * Service for opening/closing the entity sheet via query parameters.\n *\n * The sheet is rendered directly in the AdminShell (no named router outlet).\n * Query parameters carry the state: `sheetCollection`, `sheetEntityId`, `sheetMode`, `sheetCallback`.\n * This approach keeps the URL clean and SSR-friendly (no auxiliary route parentheses).\n *\n * Usage:\n * ```typescript\n * const sheetService = inject(EntitySheetService);\n *\n * sheetService.openCreate('authors').subscribe((result) => {\n * if (result.action === 'created') {\n * console.log('Created:', result.entity);\n * }\n * });\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class EntitySheetService {\n\tprivate readonly router = inject(Router);\n\tprivate readonly destroyRef = inject(DestroyRef);\n\tprivate readonly document = inject(DOCUMENT);\n\n\t/** Pending callback subjects keyed by callback ID */\n\tprivate readonly pendingCallbacks = new Map<string, Subject<EntitySheetResult>>();\n\n\t/** Handle for the close animation timer (for cancellation on rapid open/close) */\n\tprivate closeTimerId: number | undefined = undefined;\n\n\t/** Element that had focus when the sheet was opened (for focus restoration) */\n\tprivate triggerElement: Element | null = null;\n\n\t/** Whether the sheet is currently open */\n\treadonly isOpen = signal(false);\n\n\t/** Whether the sheet is playing its close animation */\n\treadonly isClosing = signal(false);\n\n\t/** Whether the sheet DOM should be present (open or animating closed) */\n\treadonly isVisible = computed(() => this.isOpen() || this.isClosing());\n\n\t/**\n\t * Open the entity sheet to create a new entity.\n\t */\n\topenCreate(collection: string): Observable<EntitySheetResult> {\n\t\treturn this.openSheet(collection, undefined, 'create');\n\t}\n\n\t/**\n\t * Open the entity sheet to edit an existing entity.\n\t */\n\topenEdit(collection: string, entityId: string): Observable<EntitySheetResult> {\n\t\treturn this.openSheet(collection, entityId, 'edit');\n\t}\n\n\t/**\n\t * Open the entity sheet to view an existing entity.\n\t */\n\topenView(collection: string, entityId: string): Observable<EntitySheetResult> {\n\t\treturn this.openSheet(collection, entityId, 'view');\n\t}\n\n\t/**\n\t * Close the sheet with a slide-out animation, then emit the result to any pending callback.\n\t */\n\tclose(result?: EntitySheetResult): void {\n\t\tif (this.isClosing() || !this.isOpen()) return;\n\n\t\t// Resolve pending callback immediately\n\t\tconst callbackId = this.getCurrentCallbackId();\n\t\tif (callbackId) {\n\t\t\tconst subject = this.pendingCallbacks.get(callbackId);\n\t\t\tif (subject) {\n\t\t\t\tif (result) {\n\t\t\t\t\tsubject.next(result);\n\t\t\t\t}\n\t\t\t\tsubject.complete();\n\t\t\t\tthis.pendingCallbacks.delete(callbackId);\n\t\t\t}\n\t\t}\n\n\t\t// Start close animation\n\t\tthis.isClosing.set(true);\n\n\t\tthis.closeTimerId = this.document.defaultView?.setTimeout(() => {\n\t\t\tthis.closeTimerId = undefined;\n\t\t\tthis.isOpen.set(false);\n\t\t\tthis.isClosing.set(false);\n\t\t\tthis.restoreFocus();\n\n\t\t\t// Clear sheet query params after animation completes\n\t\t\tthis.router.navigate([], {\n\t\t\t\tqueryParams: {\n\t\t\t\t\t[SHEET_QUERY_PARAMS.collection]: null,\n\t\t\t\t\t[SHEET_QUERY_PARAMS.entityId]: null,\n\t\t\t\t\t[SHEET_QUERY_PARAMS.mode]: null,\n\t\t\t\t\t[SHEET_QUERY_PARAMS.callback]: null,\n\t\t\t\t},\n\t\t\t\tqueryParamsHandling: 'merge',\n\t\t\t});\n\t\t}, CLOSE_ANIMATION_MS);\n\t}\n\n\t/**\n\t * Restore sheet state from query params and sync on navigation.\n\t * Handles page refresh and browser back/forward.\n\t * Called by AdminShellComponent on browser init.\n\t */\n\tinitFromQueryParams(): void {\n\t\tthis.syncIsOpenFromUrl();\n\n\t\t// Keep isOpen in sync when URL changes (e.g., browser back button)\n\t\tthis.router.events\n\t\t\t.pipe(\n\t\t\t\tfilter((e) => e instanceof NavigationEnd),\n\t\t\t\ttakeUntilDestroyed(this.destroyRef),\n\t\t\t)\n\t\t\t.subscribe(() => this.syncIsOpenFromUrl());\n\t}\n\n\tprivate syncIsOpenFromUrl(): void {\n\t\tconst urlTree = this.router.parseUrl(this.router.url);\n\t\tconst hasSheet = !!urlTree.queryParams[SHEET_QUERY_PARAMS.collection];\n\n\t\tif (hasSheet && !this.isClosing()) {\n\t\t\t// Open sheet from URL (page refresh, browser forward). Skip if close is in progress\n\t\t\t// because a delayed NavigationEnd from the original openSheet() navigation may fire\n\t\t\t// during the 200ms close animation — the explicit close takes priority.\n\t\t\tthis.isOpen.set(true);\n\t\t} else if (!hasSheet && this.isOpen() && !this.isClosing()) {\n\t\t\t// URL lost sheet params (e.g., browser back button) — clean up and close immediately\n\t\t\tthis.cleanupAllPendingCallbacks();\n\t\t\tthis.isOpen.set(false);\n\t\t\tthis.restoreFocus();\n\t\t}\n\t}\n\n\tprivate openSheet(\n\t\tcollection: string,\n\t\tentityId: string | undefined,\n\t\tmode: 'view' | 'edit' | 'create',\n\t): Observable<EntitySheetResult> {\n\t\t// Cancel any in-progress close animation\n\t\tthis.cancelCloseAnimation();\n\n\t\t// Clean up any previous pending callback to prevent memory leaks\n\t\tconst oldCallbackId = this.getCurrentCallbackId();\n\t\tif (oldCallbackId) {\n\t\t\tconst oldSubject = this.pendingCallbacks.get(oldCallbackId);\n\t\t\tif (oldSubject) {\n\t\t\t\toldSubject.complete();\n\t\t\t\tthis.pendingCallbacks.delete(oldCallbackId);\n\t\t\t}\n\t\t}\n\n\t\t// Capture the trigger element for focus restoration on close\n\t\tthis.triggerElement = this.document.activeElement;\n\n\t\tconst callbackId = crypto.randomUUID();\n\t\tconst subject = new Subject<EntitySheetResult>();\n\t\tthis.pendingCallbacks.set(callbackId, subject);\n\n\t\tthis.isOpen.set(true);\n\n\t\tthis.router.navigate([], {\n\t\t\tqueryParams: {\n\t\t\t\t[SHEET_QUERY_PARAMS.collection]: collection,\n\t\t\t\t[SHEET_QUERY_PARAMS.mode]: mode,\n\t\t\t\t[SHEET_QUERY_PARAMS.callback]: callbackId,\n\t\t\t\t[SHEET_QUERY_PARAMS.entityId]: entityId ?? null,\n\t\t\t},\n\t\t\tqueryParamsHandling: 'merge',\n\t\t});\n\n\t\treturn subject.asObservable().pipe(take(1));\n\t}\n\n\tprivate cancelCloseAnimation(): void {\n\t\tif (this.closeTimerId !== undefined) {\n\t\t\tclearTimeout(this.closeTimerId);\n\t\t\tthis.closeTimerId = undefined;\n\t\t\tthis.isClosing.set(false);\n\t\t}\n\t}\n\n\t/** Complete and remove all pending callback subjects (prevents memory leaks) */\n\tprivate cleanupAllPendingCallbacks(): void {\n\t\tfor (const [, subject] of this.pendingCallbacks) {\n\t\t\tsubject.complete();\n\t\t}\n\t\tthis.pendingCallbacks.clear();\n\t}\n\n\t/** Return focus to the element that triggered the sheet open */\n\tprivate restoreFocus(): void {\n\t\tconst el = this.triggerElement;\n\t\tthis.triggerElement = null;\n\t\tif (el instanceof HTMLElement) {\n\t\t\tthis.document.defaultView?.setTimeout(() => el.focus(), 0);\n\t\t}\n\t}\n\n\tprivate getCurrentCallbackId(): string | null {\n\t\tconst urlTree = this.router.parseUrl(this.router.url);\n\t\tconst callbackParam = urlTree.queryParams[SHEET_QUERY_PARAMS.callback];\n\t\tif (typeof callbackParam === 'string') return callbackParam;\n\t\treturn null;\n\t}\n}\n","/**\n * Version Service for Angular Admin UI\n *\n * Provides version management operations for versioned collections.\n * Works in both SSR and browser contexts.\n */\n\nimport { inject, Injectable, signal } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { firstValueFrom, Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\n// ============================================\n// Types\n// ============================================\n\n/**\n * Document status for versioned collections.\n */\nexport type DocumentStatus = 'draft' | 'published';\n\n/**\n * Version query options.\n */\nexport interface VersionFindOptions {\n\tlimit?: number;\n\tpage?: number;\n\tincludeAutosave?: boolean;\n\tstatus?: DocumentStatus;\n}\n\n/**\n * Parsed document version with typed data.\n */\nexport interface DocumentVersionParsed<T = Record<string, unknown>> {\n\tid: string;\n\tparent: string;\n\tversion: T;\n\t_status: DocumentStatus;\n\tautosave: boolean;\n\tpublishedAt?: string;\n\tcreatedAt: string;\n\tupdatedAt: string;\n}\n\n/**\n * Result of a version query with pagination.\n */\nexport interface VersionQueryResult<T = Record<string, unknown>> {\n\tdocs: DocumentVersionParsed<T>[];\n\ttotalDocs: number;\n\ttotalPages: number;\n\tpage: number;\n\tlimit: number;\n\thasNextPage: boolean;\n\thasPrevPage: boolean;\n}\n\n/**\n * Options for restoring a version.\n */\nexport interface RestoreVersionOptions {\n\tversionId: string;\n\tpublish?: boolean;\n}\n\n/**\n * Result of a restore operation.\n */\nexport interface RestoreResult<T = Record<string, unknown>> {\n\tdoc: T;\n\tmessage: string;\n}\n\n/**\n * Result of a publish/unpublish operation.\n */\nexport interface PublishResult<T = Record<string, unknown>> {\n\tdoc: T;\n\tmessage: string;\n}\n\n/**\n * Result of a draft save operation.\n */\nexport interface DraftSaveResult<T = Record<string, unknown>> {\n\tversion: DocumentVersionParsed<T>;\n\tmessage: string;\n}\n\n/**\n * Result of a status query.\n */\nexport interface StatusResult {\n\tstatus: DocumentStatus;\n}\n\n/**\n * A single field difference between two versions.\n */\nexport interface VersionFieldDiff {\n\tfield: string;\n\toldValue: unknown;\n\tnewValue: unknown;\n}\n\n/**\n * Result of comparing two versions.\n */\nexport interface VersionCompareResult {\n\tdifferences: VersionFieldDiff[];\n}\n\n// ============================================\n// Version Service\n// ============================================\n\n/**\n * Service for managing document versions in the admin UI.\n *\n * @example\n * ```typescript\n * @Component({...})\n * export class VersionHistoryComponent {\n * private readonly versionService = inject(VersionService);\n *\n * readonly versions = signal<DocumentVersionParsed[]>([]);\n * readonly isLoading = signal(false);\n *\n * async loadVersions(collection: string, docId: string): Promise<void> {\n * this.isLoading.set(true);\n * const result = await this.versionService.findVersions(collection, docId);\n * this.versions.set(result.docs);\n * this.isLoading.set(false);\n * }\n * }\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class VersionService {\n\tprivate readonly http = inject(HttpClient);\n\n\t/** Loading state signal */\n\treadonly isLoading = signal(false);\n\n\t/** Error state signal */\n\treadonly error = signal<string | null>(null);\n\n\t/** Last saved timestamp signal */\n\treadonly lastSaved = signal<Date | null>(null);\n\n\t// ============================================\n\t// Version Operations\n\t// ============================================\n\n\t/**\n\t * Find all versions for a document.\n\t */\n\tfindVersions$<T = Record<string, unknown>>(\n\t\tcollection: string,\n\t\tdocId: string,\n\t\toptions?: VersionFindOptions,\n\t): Observable<VersionQueryResult<T>> {\n\t\tconst url = this.buildUrl(collection, docId, 'versions');\n\t\tconst params = this.buildParams(options);\n\t\treturn this.http.get<VersionQueryResult<T>>(url, { params });\n\t}\n\n\t/**\n\t * Find all versions for a document (Promise version).\n\t */\n\tasync findVersions<T = Record<string, unknown>>(\n\t\tcollection: string,\n\t\tdocId: string,\n\t\toptions?: VersionFindOptions,\n\t): Promise<VersionQueryResult<T>> {\n\t\treturn firstValueFrom(this.findVersions$<T>(collection, docId, options));\n\t}\n\n\t/**\n\t * Find a specific version by ID.\n\t */\n\tfindVersionById$<T = Record<string, unknown>>(\n\t\tcollection: string,\n\t\tdocId: string,\n\t\tversionId: string,\n\t): Observable<DocumentVersionParsed<T>> {\n\t\tconst url = this.buildUrl(collection, docId, 'versions', versionId);\n\t\treturn this.http.get<DocumentVersionParsed<T>>(url);\n\t}\n\n\t/**\n\t * Find a specific version by ID (Promise version).\n\t */\n\tasync findVersionById<T = Record<string, unknown>>(\n\t\tcollection: string,\n\t\tdocId: string,\n\t\tversionId: string,\n\t): Promise<DocumentVersionParsed<T>> {\n\t\treturn firstValueFrom(this.findVersionById$<T>(collection, docId, versionId));\n\t}\n\n\t/**\n\t * Restore a document to a previous version.\n\t */\n\trestore$<T = Record<string, unknown>>(\n\t\tcollection: string,\n\t\tdocId: string,\n\t\toptions: RestoreVersionOptions,\n\t): Observable<RestoreResult<T>> {\n\t\tconst url = this.buildUrl(collection, docId, 'versions', 'restore');\n\t\treturn this.http.post<RestoreResult<T>>(url, options);\n\t}\n\n\t/**\n\t * Restore a document to a previous version (Promise version).\n\t */\n\tasync restore<T = Record<string, unknown>>(\n\t\tcollection: string,\n\t\tdocId: string,\n\t\toptions: RestoreVersionOptions,\n\t): Promise<RestoreResult<T>> {\n\t\treturn firstValueFrom(this.restore$<T>(collection, docId, options));\n\t}\n\n\t/**\n\t * Publish a document.\n\t */\n\tpublish$<T = Record<string, unknown>>(\n\t\tcollection: string,\n\t\tdocId: string,\n\t): Observable<PublishResult<T>> {\n\t\tconst url = this.buildUrl(collection, docId, 'publish');\n\t\treturn this.http.post<PublishResult<T>>(url, {});\n\t}\n\n\t/**\n\t * Publish a document (Promise version).\n\t */\n\tasync publish<T = Record<string, unknown>>(\n\t\tcollection: string,\n\t\tdocId: string,\n\t): Promise<PublishResult<T>> {\n\t\treturn firstValueFrom(this.publish$<T>(collection, docId));\n\t}\n\n\t/**\n\t * Unpublish a document.\n\t */\n\tunpublish$<T = Record<string, unknown>>(\n\t\tcollection: string,\n\t\tdocId: string,\n\t): Observable<PublishResult<T>> {\n\t\tconst url = this.buildUrl(collection, docId, 'unpublish');\n\t\treturn this.http.post<PublishResult<T>>(url, {});\n\t}\n\n\t/**\n\t * Unpublish a document (Promise version).\n\t */\n\tasync unpublish<T = Record<string, unknown>>(\n\t\tcollection: string,\n\t\tdocId: string,\n\t): Promise<PublishResult<T>> {\n\t\treturn firstValueFrom(this.unpublish$<T>(collection, docId));\n\t}\n\n\t/**\n\t * Save a draft version (autosave).\n\t */\n\tsaveDraft$<T = Record<string, unknown>>(\n\t\tcollection: string,\n\t\tdocId: string,\n\t\tdata: Partial<T>,\n\t): Observable<DraftSaveResult<T>> {\n\t\tconst url = this.buildUrl(collection, docId, 'draft');\n\t\treturn this.http.post<DraftSaveResult<T>>(url, data).pipe(\n\t\t\tmap((result) => {\n\t\t\t\tthis.lastSaved.set(new Date());\n\t\t\t\treturn result;\n\t\t\t}),\n\t\t);\n\t}\n\n\t/**\n\t * Save a draft version (Promise version).\n\t */\n\tasync saveDraft<T = Record<string, unknown>>(\n\t\tcollection: string,\n\t\tdocId: string,\n\t\tdata: Partial<T>,\n\t): Promise<DraftSaveResult<T>> {\n\t\treturn firstValueFrom(this.saveDraft$<T>(collection, docId, data));\n\t}\n\n\t/**\n\t * Get the current status of a document.\n\t */\n\tgetStatus$(collection: string, docId: string): Observable<DocumentStatus> {\n\t\tconst url = this.buildUrl(collection, docId, 'status');\n\t\treturn this.http.get<StatusResult>(url).pipe(map((result) => result.status));\n\t}\n\n\t/**\n\t * Get the current status of a document (Promise version).\n\t */\n\tasync getStatus(collection: string, docId: string): Promise<DocumentStatus> {\n\t\treturn firstValueFrom(this.getStatus$(collection, docId));\n\t}\n\n\t// ============================================\n\t// Compare Methods\n\t// ============================================\n\n\t/**\n\t * Compare two versions and return field-level differences.\n\t */\n\tcompareVersions$(\n\t\tcollection: string,\n\t\tdocId: string,\n\t\tversionId1: string,\n\t\tversionId2: string,\n\t): Observable<VersionFieldDiff[]> {\n\t\tconst url = this.buildUrl(collection, docId, 'versions', 'compare');\n\t\treturn this.http\n\t\t\t.post<VersionCompareResult>(url, { versionId1, versionId2 })\n\t\t\t.pipe(map((result) => result.differences));\n\t}\n\n\t/**\n\t * Compare two versions and return field-level differences (Promise version).\n\t */\n\tasync compareVersions(\n\t\tcollection: string,\n\t\tdocId: string,\n\t\tversionId1: string,\n\t\tversionId2: string,\n\t): Promise<VersionFieldDiff[]> {\n\t\treturn firstValueFrom(this.compareVersions$(collection, docId, versionId1, versionId2));\n\t}\n\n\t// ============================================\n\t// Helper Methods\n\t// ============================================\n\n\t/**\n\t * Build the API URL for version operations.\n\t */\n\tprivate buildUrl(collection: string, docId: string, ...path: string[]): string {\n\t\tconst basePath = '/api';\n\t\tconst segments = [basePath, collection, docId, ...path];\n\t\treturn segments.join('/');\n\t}\n\n\t/**\n\t * Build query params from options.\n\t */\n\tprivate buildParams(options?: VersionFindOptions): Record<string, string> {\n\t\tconst params: Record<string, string> = {};\n\n\t\tif (options?.limit !== undefined) {\n\t\t\tparams['limit'] = String(options.limit);\n\t\t}\n\t\tif (options?.page !== undefined) {\n\t\t\tparams['page'] = String(options.page);\n\t\t}\n\t\tif (options?.includeAutosave !== undefined) {\n\t\t\tparams['includeAutosave'] = String(options.includeAutosave);\n\t\t}\n\t\tif (options?.status !== undefined) {\n\t\t\tparams['status'] = options.status;\n\t\t}\n\n\t\treturn params;\n\t}\n}\n\n// ============================================\n// Injection Helper\n// ============================================\n\n/**\n * Inject the Version Service.\n *\n * @example\n * ```typescript\n * @Component({...})\n * export class VersionHistoryComponent {\n * private readonly versionService = injectVersionService();\n *\n * async restoreVersion(versionId: string): Promise<void> {\n * await this.versionService.restore(this.collection, this.docId, {\n * versionId,\n * publish: false,\n * });\n * }\n * }\n * ```\n */\nexport function injectVersionService(): VersionService {\n\treturn inject(VersionService);\n}\n","import {\n\tInjectable,\n\tsignal,\n\tcomputed,\n\teffect,\n\tPLATFORM_ID,\n\tinject,\n\tDestroyRef,\n} from '@angular/core';\nimport { DOCUMENT, isPlatformBrowser } from '@angular/common';\n\n/**\n * Theme options for the admin UI.\n */\nexport type McmsTheme = 'light' | 'dark' | 'system';\n\n/**\n * Storage key for persisting theme preference.\n */\nconst THEME_STORAGE_KEY = 'mcms-theme';\n\n/**\n * Theme service for Momentum CMS Admin UI.\n *\n * Provides reactive theme state with system preference detection,\n * localStorage persistence, and dark mode toggle.\n *\n * Usage:\n * ```typescript\n * @Component({...})\n * export class MyComponent {\n * private readonly theme = inject(McmsThemeService);\n *\n * toggleDarkMode(): void {\n * this.theme.toggleTheme();\n * }\n * }\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class McmsThemeService {\n\tprivate readonly platformId = inject(PLATFORM_ID);\n\tprivate readonly document = inject(DOCUMENT);\n\tprivate readonly isBrowser = isPlatformBrowser(this.platformId);\n\n\t/**\n\t * Current theme setting (light, dark, or system).\n\t */\n\treadonly theme = signal<McmsTheme>(this.loadTheme());\n\n\t/**\n\t * Resolved theme after applying system preference.\n\t * Always returns either 'light' or 'dark'.\n\t */\n\treadonly resolvedTheme = computed((): 'light' | 'dark' => {\n\t\tconst currentTheme = this.theme();\n\t\tif (currentTheme === 'system') {\n\t\t\treturn this.getSystemPreference();\n\t\t}\n\t\treturn currentTheme;\n\t});\n\n\t/**\n\t * Whether the resolved theme is dark.\n\t */\n\treadonly isDark = computed((): boolean => {\n\t\treturn this.resolvedTheme() === 'dark';\n\t});\n\n\tconstructor() {\n\t\t// Apply theme changes to DOM\n\t\tif (this.isBrowser) {\n\t\t\teffect(() => {\n\t\t\t\tconst isDark = this.isDark();\n\t\t\t\tthis.applyThemeToDOM(isDark);\n\t\t\t});\n\n\t\t\t// Listen for system preference changes\n\t\t\tthis.listenForSystemPreferenceChanges();\n\t\t}\n\t}\n\n\t/**\n\t * Sets the theme and persists to localStorage.\n\t */\n\tsetTheme(theme: McmsTheme): void {\n\t\tthis.theme.set(theme);\n\n\t\tif (this.isBrowser) {\n\t\t\tthis.document.defaultView?.localStorage?.setItem(THEME_STORAGE_KEY, theme);\n\t\t\tthis.document.cookie = `${THEME_STORAGE_KEY}=${theme}; path=/; max-age=31536000; SameSite=Lax`;\n\t\t}\n\t}\n\n\t/**\n\t * Toggles between light and dark themes.\n\t * If currently on system, uses the resolved preference as starting point.\n\t */\n\ttoggleTheme(): void {\n\t\tconst current = this.resolvedTheme();\n\t\tthis.setTheme(current === 'dark' ? 'light' : 'dark');\n\t}\n\n\t/**\n\t * Loads theme from localStorage or defaults to 'system'.\n\t */\n\tprivate loadTheme(): McmsTheme {\n\t\tif (!this.isBrowser) {\n\t\t\treturn 'system';\n\t\t}\n\n\t\tconst stored = this.document.defaultView?.localStorage?.getItem(THEME_STORAGE_KEY) ?? null;\n\t\tif (stored === 'light' || stored === 'dark' || stored === 'system') {\n\t\t\treturn stored;\n\t\t}\n\n\t\treturn 'system';\n\t}\n\n\t/**\n\t * Gets the system color scheme preference.\n\t */\n\tprivate getSystemPreference(): 'light' | 'dark' {\n\t\tif (!this.isBrowser) {\n\t\t\treturn 'light';\n\t\t}\n\n\t\tconst mediaQuery = this.document.defaultView?.matchMedia('(prefers-color-scheme: dark)');\n\t\treturn mediaQuery?.matches ? 'dark' : 'light';\n\t}\n\n\t/**\n\t * Applies theme class to document element.\n\t */\n\tprivate applyThemeToDOM(isDark: boolean): void {\n\t\tif (!this.isBrowser) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (isDark) {\n\t\t\tthis.document.documentElement.classList.add('dark');\n\t\t} else {\n\t\t\tthis.document.documentElement.classList.remove('dark');\n\t\t}\n\t}\n\n\t/**\n\t * Listens for system preference changes when theme is set to 'system'.\n\t */\n\tprivate listenForSystemPreferenceChanges(): void {\n\t\tif (!this.isBrowser) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst mediaQuery = this.document.defaultView?.matchMedia('(prefers-color-scheme: dark)');\n\t\tif (!mediaQuery) return;\n\n\t\tconst handleChange = (): void => {\n\t\t\t// Only react if theme is set to 'system'\n\t\t\tif (this.theme() === 'system') {\n\t\t\t\t// The computed signal will automatically update\n\t\t\t\t// when we trigger a re-evaluation\n\t\t\t\tthis.theme.set('system');\n\t\t\t}\n\t\t};\n\n\t\tmediaQuery.addEventListener('change', handleChange);\n\n\t\t// Clean up the listener when the service is destroyed\n\t\tconst destroyRef = inject(DestroyRef);\n\t\tdestroyRef.onDestroy(() => {\n\t\t\tmediaQuery.removeEventListener('change', handleChange);\n\t\t});\n\t}\n}\n","/**\n * User Injection Utilities for Momentum CMS\n *\n * Provides type-safe access to the current authenticated user in both\n * SSR and browser contexts using Angular signals.\n *\n * @example\n * ```typescript\n * import type { Users } from './types/momentum.generated';\n * import { injectUser } from '@momentumcms/admin';\n *\n * @Component({...})\n * export class MyComponent {\n * // Typed user from your generated types\n * readonly user = injectUser<Users>();\n *\n * // Or use convenience functions\n * readonly isAdmin = injectIsAdmin();\n * readonly isAuthenticated = injectIsAuthenticated();\n * }\n * ```\n */\n\nimport { inject, computed, Signal, PLATFORM_ID } from '@angular/core';\nimport { isPlatformServer } from '@angular/common';\nimport { MOMENTUM_API_CONTEXT } from '../services/momentum-api.service';\nimport { MomentumAuthService, AuthUser } from '../services/auth.service';\n\n/**\n * Base user type that all user types must extend.\n * Matches the common fields between Better Auth users and Momentum collection users.\n */\nexport interface BaseUser {\n\tid: string | number;\n\temail?: string;\n\trole?: string;\n}\n\n/**\n * Inject the current authenticated user with proper typing.\n *\n * Works seamlessly in both SSR and browser contexts:\n * - **SSR**: Returns user from `MOMENTUM_API_CONTEXT` (set by session resolver middleware)\n * - **Browser**: Returns user from `MomentumAuthService` (fetched via /api/auth/get-session)\n *\n * The generic type parameter allows you to use your generated collection types\n * for full type safety with your user schema.\n *\n * @typeParam T - User type extending UserContext (use your generated Users type)\n * @returns Signal containing the current user or null if not authenticated\n *\n * @example\n * ```typescript\n * import type { Users } from './types/momentum.generated';\n *\n * @Component({...})\n * export class ProfileComponent {\n * readonly user = injectUser<Users>();\n *\n * constructor() {\n * effect(() => {\n * const currentUser = this.user();\n * if (currentUser) {\n * console.log('Role:', currentUser.role); // Typed!\n * }\n * });\n * }\n * }\n * ```\n */\nexport function injectUser<T extends BaseUser = AuthUser>(): Signal<T | null> {\n\tconst platformId = inject(PLATFORM_ID);\n\n\tif (isPlatformServer(platformId)) {\n\t\t// SSR: Get user from context provided by session resolver middleware\n\t\tconst context = inject(MOMENTUM_API_CONTEXT, { optional: true });\n\t\tconst user = context?.user ?? null;\n\t\t// Return computed signal (SSR is single-request, value won't change)\n\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- UserContext to generic T\n\t\treturn computed(() => user as T | null);\n\t} else {\n\t\t// Browser: Get user from auth service (reactive to session changes)\n\t\tconst authService = inject(MomentumAuthService);\n\t\treturn computed(() => {\n\t\t\tconst authUser = authService.user();\n\t\t\tif (!authUser) return null;\n\t\t\t// Cast AuthUser to generic T (the fields are compatible)\n\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- AuthUser to generic T\n\t\t\treturn authUser as unknown as T;\n\t\t});\n\t}\n}\n\n/**\n * Inject the current user's role.\n *\n * Convenience wrapper that returns just the role string.\n *\n * @returns Signal containing the user's role or null if not authenticated\n *\n * @example\n * ```typescript\n * @Component({...})\n * export class NavComponent {\n * readonly role = injectUserRole();\n *\n * canEdit = computed(() => {\n * const r = this.role();\n * return r === 'admin' || r === 'editor';\n * });\n * }\n * ```\n */\nexport function injectUserRole(): Signal<string | null> {\n\tconst platformId = inject(PLATFORM_ID);\n\n\tif (isPlatformServer(platformId)) {\n\t\tconst context = inject(MOMENTUM_API_CONTEXT, { optional: true });\n\t\treturn computed(() => context?.user?.role ?? null);\n\t} else {\n\t\tconst authService = inject(MomentumAuthService);\n\t\treturn computed(() => authService.user()?.role ?? null);\n\t}\n}\n\n/**\n * Inject whether the current user is authenticated.\n *\n * @returns Signal containing true if user is authenticated, false otherwise\n *\n * @example\n * ```typescript\n * @Component({\n * template: `\n * @if (isAuthenticated()) {\n * <user-menu />\n * } @else {\n * <login-button />\n * }\n * `\n * })\n * export class HeaderComponent {\n * readonly isAuthenticated = injectIsAuthenticated();\n * }\n * ```\n */\nexport function injectIsAuthenticated(): Signal<boolean> {\n\tconst platformId = inject(PLATFORM_ID);\n\n\tif (isPlatformServer(platformId)) {\n\t\tconst context = inject(MOMENTUM_API_CONTEXT, { optional: true });\n\t\treturn computed(() => context?.user !== undefined && context?.user !== null);\n\t} else {\n\t\tconst authService = inject(MomentumAuthService);\n\t\treturn computed(() => authService.isAuthenticated());\n\t}\n}\n\n/**\n * Inject whether the current user is an admin.\n *\n * @returns Signal containing true if user has admin role, false otherwise\n *\n * @example\n * ```typescript\n * @Component({\n * template: `\n * @if (isAdmin()) {\n * <admin-settings />\n * }\n * `\n * })\n * export class SettingsComponent {\n * readonly isAdmin = injectIsAdmin();\n * }\n * ```\n */\nexport function injectIsAdmin(): Signal<boolean> {\n\tconst platformId = inject(PLATFORM_ID);\n\n\tif (isPlatformServer(platformId)) {\n\t\tconst context = inject(MOMENTUM_API_CONTEXT, { optional: true });\n\t\treturn computed(() => context?.user?.role === 'admin');\n\t} else {\n\t\tconst authService = inject(MomentumAuthService);\n\t\treturn computed(() => authService.isAdmin());\n\t}\n}\n\n/**\n * Inject whether the current user has a specific role.\n *\n * @param role - The role to check for\n * @returns Signal containing true if user has the specified role\n *\n * @example\n * ```typescript\n * @Component({...})\n * export class EditorComponent {\n * readonly canEdit = injectHasRole('editor');\n * }\n * ```\n */\nexport function injectHasRole(role: string): Signal<boolean> {\n\tconst userRole = injectUserRole();\n\treturn computed(() => userRole() === role);\n}\n\n/**\n * Inject whether the current user has any of the specified roles.\n *\n * @param roles - Array of roles to check\n * @returns Signal containing true if user has any of the specified roles\n *\n * @example\n * ```typescript\n * @Component({...})\n * export class ContentComponent {\n * readonly canManageContent = injectHasAnyRole(['admin', 'editor']);\n * }\n * ```\n */\nexport function injectHasAnyRole(roles: string[]): Signal<boolean> {\n\tconst userRole = injectUserRole();\n\treturn computed(() => {\n\t\tconst currentRole = userRole();\n\t\treturn currentRole !== null && roles.includes(currentRole);\n\t});\n}\n","/**\n * Type-safe route data utilities\n */\n\nimport type { CollectionConfig, GlobalConfig } from '@momentumcms/core';\nimport type { MomentumAdminBranding, AdminPluginRoute } from '../routes/momentum-admin-routes';\nimport type { Data } from '@angular/router';\n\n/**\n * Type guard to check if an object is a CollectionConfig\n */\nfunction isCollectionConfig(obj: unknown): obj is CollectionConfig {\n\tif (typeof obj !== 'object' || obj === null) return false;\n\t// Use property access with type narrowing\n\tconst hasSlug = 'slug' in obj && typeof obj.slug === 'string';\n\tconst hasFields = 'fields' in obj && Array.isArray(obj.fields);\n\treturn hasSlug && hasFields;\n}\n\n/**\n * Type guard to check if an array contains CollectionConfig objects\n */\nfunction isCollectionConfigArray(arr: unknown): arr is CollectionConfig[] {\n\treturn Array.isArray(arr) && arr.every(isCollectionConfig);\n}\n\n/**\n * Type guard to check if an object is MomentumAdminBranding\n */\nfunction isBranding(obj: unknown): obj is MomentumAdminBranding {\n\tif (typeof obj !== 'object' || obj === null) return false;\n\t// Branding is optional, so we just check if the known properties have correct types\n\tif ('logo' in obj && typeof obj.logo !== 'string') return false;\n\tif ('title' in obj && typeof obj.title !== 'string') return false;\n\treturn true;\n}\n\n/**\n * Extracts collections from route data with type safety\n */\nexport function getCollectionsFromRouteData(data: Data | undefined): CollectionConfig[] {\n\tif (!data) return [];\n\tconst collections = data['collections'];\n\tif (isCollectionConfigArray(collections)) {\n\t\treturn collections;\n\t}\n\treturn [];\n}\n\n/**\n * Extracts branding from route data with type safety\n */\nexport function getBrandingFromRouteData(\n\tdata: Data | undefined,\n): MomentumAdminBranding | undefined {\n\tif (!data) return undefined;\n\tconst branding = data['branding'];\n\tif (branding === undefined || branding === null) return undefined;\n\tif (isBranding(branding)) {\n\t\treturn branding;\n\t}\n\treturn undefined;\n}\n\n/**\n * Extracts globals from route data with type safety\n */\nexport function getGlobalsFromRouteData(data: Data | undefined): GlobalConfig[] {\n\tif (!data) return [];\n\tconst globals = data['globals'];\n\tif (Array.isArray(globals)) {\n\t\t// Same shape check as collections — slug + fields\n\t\treturn globals.filter(\n\t\t\t(g) => typeof g === 'object' && g !== null && 'slug' in g && 'fields' in g,\n\t\t);\n\t}\n\treturn [];\n}\n\n/**\n * Extracts plugin routes from route data\n */\nexport function getPluginRoutesFromRouteData(data: Data | undefined): AdminPluginRoute[] {\n\tif (!data) return [];\n\tconst routes = data['pluginRoutes'];\n\tif (Array.isArray(routes)) {\n\t\treturn routes;\n\t}\n\treturn [];\n}\n","/**\n * Entity Form Widget Types\n *\n * Types for the entity form widget that handles create/edit operations.\n */\n\nimport type { Signal, WritableSignal } from '@angular/core';\nimport type { Field, CollectionConfig, BlockConfig } from '@momentumcms/core';\nimport { flattenDataFields } from '@momentumcms/core';\n\n/**\n * Form mode - create, edit, or view.\n */\nexport type EntityFormMode = 'create' | 'edit' | 'view';\n\n/**\n * Minimal interface for accessing a FieldState from a signal forms FieldTree node.\n * FieldTree nodes are callable — calling one returns its FieldState.\n */\nexport interface FieldNodeState {\n\treadonly value: WritableSignal<unknown>;\n\treadonly errors: Signal<ReadonlyArray<{ kind: string; message?: string }>>;\n\treadonly touched: Signal<boolean>;\n\treadonly dirty: Signal<boolean>;\n\treadonly invalid: Signal<boolean>;\n\tmarkAsTouched(): void;\n\treset(value?: unknown): void;\n}\n\n/**\n * Safely extract FieldState from an unknown FieldTree node.\n * FieldTree nodes are callable functions — invoking returns the FieldState.\n */\nexport function getFieldNodeState(formNode: unknown): FieldNodeState | null {\n\tif (formNode == null || typeof formNode !== 'function') return null;\n\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\treturn (formNode as () => FieldNodeState)();\n}\n\n/**\n * Get a sub-node from a FieldTree node by key (field name or array index).\n */\nexport function getSubNode(parentNode: unknown, key: string | number): unknown {\n\tif (parentNode == null) return null;\n\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\treturn (parentNode as Record<string, unknown>)[String(key)] ?? null;\n}\n\n/**\n * Get initial value for a field.\n */\nexport function getFieldDefaultValue(field: Field): unknown {\n\tif (field.defaultValue !== undefined) {\n\t\treturn field.defaultValue;\n\t}\n\n\tswitch (field.type) {\n\t\tcase 'text':\n\t\tcase 'textarea':\n\t\tcase 'richText':\n\t\tcase 'email':\n\t\tcase 'slug':\n\t\t\treturn '';\n\t\tcase 'number':\n\t\t\treturn null;\n\t\tcase 'checkbox':\n\t\t\treturn false;\n\t\tcase 'select':\n\t\t\treturn null;\n\t\tcase 'date':\n\t\t\treturn null;\n\t\tcase 'relationship':\n\t\t\treturn null;\n\t\tcase 'array':\n\t\t\treturn [];\n\t\tcase 'group': {\n\t\t\tconst groupDefaults: Record<string, unknown> = {};\n\t\t\tfor (const subField of field.fields) {\n\t\t\t\tgroupDefaults[subField.name] = getFieldDefaultValue(subField);\n\t\t\t}\n\t\t\treturn groupDefaults;\n\t\t}\n\t\tcase 'json':\n\t\t\treturn {};\n\t\tdefault:\n\t\t\treturn null;\n\t}\n}\n\n/**\n * Normalize block items: ensure every block has defaults for all fields defined\n * in its block definition. Blocks saved before new fields were added won't have\n * those keys, and signal-forms only creates controls for keys present in the model.\n */\nexport function normalizeBlockDefaults(\n\titems: unknown[],\n\tblockDefMap: Map<string, BlockConfig>,\n): { normalized: unknown[]; changed: boolean } {\n\tlet changed = false;\n\tconst normalized = items.map((item) => {\n\t\tif (!isRecord(item) || typeof item['blockType'] !== 'string') return item;\n\t\tconst def = blockDefMap.get(item['blockType']);\n\t\tif (!def) return item;\n\n\t\tlet augmented = item;\n\t\tfor (const field of def.fields) {\n\t\t\tif (!(field.name in item)) {\n\t\t\t\tif (augmented === item) augmented = { ...item };\n\t\t\t\taugmented[field.name] = getFieldDefaultValue(field);\n\t\t\t\tchanged = true;\n\t\t\t}\n\t\t}\n\t\treturn augmented;\n\t});\n\n\treturn { normalized, changed };\n}\n\n/**\n * Type guard to check if a value is a record object.\n */\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * Get the best title field name from a collection config.\n * Checks admin.useAsTitle first, then falls back to 'title' or 'name' fields.\n */\nexport function getTitleField(config: Record<string, unknown>): string {\n\tconst admin = config['admin'];\n\tif (isRecord(admin) && typeof admin['useAsTitle'] === 'string') {\n\t\treturn admin['useAsTitle'];\n\t}\n\n\tconst fields = config['fields'];\n\tif (Array.isArray(fields)) {\n\t\tfor (const field of fields) {\n\t\t\tif (isRecord(field) && typeof field['name'] === 'string') {\n\t\t\t\tif (field['name'] === 'title' || field['name'] === 'name') {\n\t\t\t\t\treturn field['name'];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn 'id';\n}\n\n/**\n * Create initial form data from collection fields.\n */\nexport function createInitialFormData(collection: CollectionConfig): Record<string, unknown> {\n\tconst data: Record<string, unknown> = {};\n\n\t// Flatten through layout fields (tabs, collapsible, row) to initialize all data fields\n\tconst dataFields = flattenDataFields(collection.fields);\n\tfor (const field of dataFields) {\n\t\tdata[field.name] = getFieldDefaultValue(field);\n\t}\n\n\treturn data;\n}\n\n/**\n * Get value at a path in an object.\n */\nexport function getValueAtPath(obj: Record<string, unknown>, path: string): unknown {\n\tconst parts = path.split('.');\n\tlet current: unknown = obj;\n\n\tfor (const part of parts) {\n\t\tif (current === null || current === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\t\tif (isRecord(current)) {\n\t\t\tcurrent = current[part];\n\t\t} else {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\treturn current;\n}\n","/**\n * Dynamic schema generator for Angular Signal Forms.\n *\n * Maps Momentum CMS collection field definitions to signal forms validators at runtime.\n * Handles nested structures (groups via `apply()`, arrays via `applyEach()`).\n *\n * Since collections define fields at runtime (not compile time), all schema paths\n * are accessed via bracket notation on `Record<string, unknown>` models.\n */\n\n/* eslint-disable @typescript-eslint/consistent-type-assertions -- Type assertions needed to cast dynamic fieldPath to typed SchemaPath */\n\nimport {\n\trequired,\n\temail,\n\tmin,\n\tmax,\n\tminLength,\n\tmaxLength,\n\tvalidate,\n\tapply,\n\tapplyEach,\n} from '@angular/forms/signals';\nimport type { SchemaPath } from '@angular/forms/signals';\nimport { flattenDataFields, humanizeFieldName } from '@momentumcms/core';\nimport type { Field } from '@momentumcms/core';\n\n/**\n * Applies collection field validators to a signal forms schema path tree.\n *\n * @param fields - Collection field definitions\n * @param schemaPathTree - The schema path tree node (from `form()` or `apply()` callback)\n * @param getFormData - Optional function that returns the current form model data (for cross-field validators)\n */\nexport function applyCollectionSchema(\n\tfields: Field[],\n\tschemaPathTree: Record<string, unknown>,\n\tgetFormData?: () => Record<string, unknown>,\n): void {\n\tfor (const field of flattenDataFields(fields)) {\n\t\tconst fieldPath = schemaPathTree[field.name];\n\t\tif (!fieldPath) continue;\n\n\t\tconst label = field.label ?? humanizeFieldName(field.name);\n\n\t\t// Required validator\n\t\tif (field.required) {\n\t\t\trequired(fieldPath as SchemaPath<unknown>, {\n\t\t\t\tmessage: `${label} is required`,\n\t\t\t});\n\t\t}\n\n\t\t// Type-specific validators\n\t\tswitch (field.type) {\n\t\t\tcase 'text':\n\t\t\tcase 'textarea': {\n\t\t\t\tif (field.minLength !== undefined) {\n\t\t\t\t\tminLength(fieldPath as SchemaPath<string>, field.minLength, {\n\t\t\t\t\t\tmessage: `${label} must be at least ${field.minLength} characters`,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (field.maxLength !== undefined) {\n\t\t\t\t\tmaxLength(fieldPath as SchemaPath<string>, field.maxLength, {\n\t\t\t\t\t\tmessage: `${label} must be no more than ${field.maxLength} characters`,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'password': {\n\t\t\t\tif (field.minLength !== undefined) {\n\t\t\t\t\tminLength(fieldPath as SchemaPath<string>, field.minLength, {\n\t\t\t\t\t\tmessage: `${label} must be at least ${field.minLength} characters`,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'number': {\n\t\t\t\tif (field.min !== undefined) {\n\t\t\t\t\tmin(fieldPath as SchemaPath<number | null>, field.min, {\n\t\t\t\t\t\tmessage: `${label} must be at least ${field.min}`,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (field.max !== undefined) {\n\t\t\t\t\tmax(fieldPath as SchemaPath<number | null>, field.max, {\n\t\t\t\t\t\tmessage: `${label} must be no more than ${field.max}`,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'email': {\n\t\t\t\temail(fieldPath as SchemaPath<string>, {\n\t\t\t\t\tmessage: `${label} must be a valid email address`,\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'select': {\n\t\t\t\tconst validValues = new Set(field.options.map((opt) => opt.value));\n\t\t\t\tvalidate(fieldPath as SchemaPath<string>, ({ value }) => {\n\t\t\t\t\tconst v = value();\n\t\t\t\t\tif (v === '' || v === null || v === undefined) return null;\n\t\t\t\t\tif (!validValues.has(v as string)) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tkind: 'invalidOption',\n\t\t\t\t\t\t\tmessage: `${label} must be one of the available options`,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\treturn null;\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'group': {\n\t\t\t\tapply(\n\t\t\t\t\tfieldPath as SchemaPath<Record<string, unknown>>,\n\t\t\t\t\t(groupPath: Record<string, unknown>) => {\n\t\t\t\t\t\tapplyCollectionSchema(field.fields, groupPath, getFormData);\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'array': {\n\t\t\t\t// Array-level row count validators\n\t\t\t\tif (field.minRows !== undefined) {\n\t\t\t\t\tconst minRowCount = field.minRows;\n\t\t\t\t\tvalidate(fieldPath as SchemaPath<unknown[]>, ({ value }) => {\n\t\t\t\t\t\tconst arr = value();\n\t\t\t\t\t\tif (!Array.isArray(arr)) return null;\n\t\t\t\t\t\tif (arr.length < minRowCount) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tkind: 'minRows',\n\t\t\t\t\t\t\t\tmessage: `${label} must have at least ${minRowCount} row${minRowCount === 1 ? '' : 's'}`,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (field.maxRows !== undefined) {\n\t\t\t\t\tconst maxRowCount = field.maxRows;\n\t\t\t\t\tvalidate(fieldPath as SchemaPath<unknown[]>, ({ value }) => {\n\t\t\t\t\t\tconst arr = value();\n\t\t\t\t\t\tif (!Array.isArray(arr)) return null;\n\t\t\t\t\t\tif (arr.length > maxRowCount) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tkind: 'maxRows',\n\t\t\t\t\t\t\t\tmessage: `${label} must have no more than ${maxRowCount} row${maxRowCount === 1 ? '' : 's'}`,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Apply sub-field validators to each array item\n\t\t\t\tif (field.fields.length > 0) {\n\t\t\t\t\tapplyEach(\n\t\t\t\t\t\tfieldPath as SchemaPath<Record<string, unknown>[]>,\n\t\t\t\t\t\t(itemPath: Record<string, unknown>) => {\n\t\t\t\t\t\t\tapplyCollectionSchema(field.fields, itemPath, getFormData);\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// blocks field - validate minRows/maxRows only (sub-schemas per block type\n\t\t\t// would require applyWhenValue which needs discriminated unions)\n\t\t\tcase 'blocks': {\n\t\t\t\tif (field.minRows !== undefined) {\n\t\t\t\t\tconst minRowCount = field.minRows;\n\t\t\t\t\tvalidate(fieldPath as SchemaPath<unknown[]>, ({ value }) => {\n\t\t\t\t\t\tconst arr = value();\n\t\t\t\t\t\tif (!Array.isArray(arr)) return null;\n\t\t\t\t\t\tif (arr.length < minRowCount) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tkind: 'minRows',\n\t\t\t\t\t\t\t\tmessage: `${label} must have at least ${minRowCount} block${minRowCount === 1 ? '' : 's'}`,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (field.maxRows !== undefined) {\n\t\t\t\t\tconst maxRowCount = field.maxRows;\n\t\t\t\t\tvalidate(fieldPath as SchemaPath<unknown[]>, ({ value }) => {\n\t\t\t\t\t\tconst arr = value();\n\t\t\t\t\t\tif (!Array.isArray(arr)) return null;\n\t\t\t\t\t\tif (arr.length > maxRowCount) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tkind: 'maxRows',\n\t\t\t\t\t\t\t\tmessage: `${label} must have no more than ${maxRowCount} block${maxRowCount === 1 ? '' : 's'}`,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\t// Other field types (date, checkbox, upload, relationship, richText, etc.)\n\t\t\t\t// have no additional built-in constraints beyond required\n\t\t\t\tbreak;\n\t\t}\n\n\t\t// Custom validate function from field definition\n\t\tif (field.validate) {\n\t\t\tconst customValidate = field.validate;\n\t\t\tvalidate(fieldPath as SchemaPath<unknown>, ({ value }) => {\n\t\t\t\tconst data = getFormData ? getFormData() : {};\n\t\t\t\tconst result = customValidate(value(), { data, req: {} });\n\t\t\t\t// Signal forms validators are synchronous — async validators\n\t\t\t\t// (returning Promise) cannot be awaited here. They are enforced\n\t\t\t\t// server-side; warn developers so it's not a silent failure.\n\t\t\t\tif (result && typeof result === 'object' && 'then' in result) {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t`[Momentum] Custom validator on field \"${field.name}\" returned a Promise. ` +\n\t\t\t\t\t\t\t`Async validators are not supported client-side and will be enforced server-side only.`,\n\t\t\t\t\t);\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tif (typeof result === 'string') {\n\t\t\t\t\treturn { kind: 'custom', message: result };\n\t\t\t\t}\n\t\t\t\treturn null;\n\t\t\t});\n\t\t}\n\t}\n}\n","/* eslint-disable @typescript-eslint/consistent-type-assertions -- Type assertions needed to narrow Field union to TextField/TextareaField after type guard */\n\nimport { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { McmsFormField, Input, Textarea } from '@momentumcms/ui';\nimport type { ValidationError } from '@momentumcms/ui';\nimport { humanizeFieldName } from '@momentumcms/core';\nimport type { Field, TextField, TextareaField } from '@momentumcms/core';\nimport type { EntityFormMode } from '../entity-form.types';\nimport { getFieldNodeState } from '../entity-form.types';\n\n/**\n * Text field renderer for text and textarea field types.\n *\n * Uses Angular Signal Forms bridge pattern: reads/writes value via\n * a FieldTree node's FieldState rather than event-based I/O.\n */\n@Component({\n\tselector: 'mcms-text-field-renderer',\n\timports: [McmsFormField, Input, Textarea],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\ttemplate: `\n\t\t<mcms-form-field\n\t\t\t[id]=\"fieldId()\"\n\t\t\t[required]=\"required()\"\n\t\t\t[disabled]=\"isDisabled()\"\n\t\t\t[errors]=\"touchedErrors()\"\n\t\t>\n\t\t\t<span mcmsLabel>{{ label() }}</span>\n\t\t\t@if (isTextarea()) {\n\t\t\t\t<mcms-textarea\n\t\t\t\t\t[id]=\"fieldId()\"\n\t\t\t\t\t[value]=\"stringValue()\"\n\t\t\t\t\t[placeholder]=\"placeholder()\"\n\t\t\t\t\t[disabled]=\"isDisabled()\"\n\t\t\t\t\t[rows]=\"rows()\"\n\t\t\t\t\t[errors]=\"touchedErrors()\"\n\t\t\t\t\t(valueChange)=\"onValueChange($event)\"\n\t\t\t\t\t(blurred)=\"onBlur()\"\n\t\t\t\t/>\n\t\t\t} @else {\n\t\t\t\t<mcms-input\n\t\t\t\t\t[id]=\"fieldId()\"\n\t\t\t\t\t[type]=\"inputType()\"\n\t\t\t\t\t[value]=\"stringValue()\"\n\t\t\t\t\t[placeholder]=\"placeholder()\"\n\t\t\t\t\t[disabled]=\"isDisabled()\"\n\t\t\t\t\t[errors]=\"touchedErrors()\"\n\t\t\t\t\t(valueChange)=\"onValueChange($event)\"\n\t\t\t\t\t(blurred)=\"onBlur()\"\n\t\t\t\t/>\n\t\t\t}\n\t\t\t@if (description()) {\n\t\t\t\t<p class=\"mt-1 text-xs text-muted-foreground\">{{ description() }}</p>\n\t\t\t}\n\t\t\t@if (showCharCount()) {\n\t\t\t\t<p\n\t\t\t\t\tclass=\"mt-1 text-xs text-muted-foreground text-right\"\n\t\t\t\t\t[class.text-destructive]=\"charCountExceeded()\"\n\t\t\t\t>\n\t\t\t\t\t{{ charCount() }}\n\t\t\t\t\t@if (maxLength()) {\n\t\t\t\t\t\t/ {{ maxLength() }}\n\t\t\t\t\t}\n\t\t\t\t</p>\n\t\t\t}\n\t\t</mcms-form-field>\n\t`,\n})\nexport class TextFieldRenderer {\n\t/** Field definition */\n\treadonly field = input.required<Field>();\n\n\t/** Signal forms FieldTree node for this field */\n\treadonly formNode = input<unknown>(null);\n\n\t/** Form mode */\n\treadonly mode = input<EntityFormMode>('create');\n\n\t/** Field path */\n\treadonly path = input.required<string>();\n\n\t/** Bridge: extract FieldState from formNode */\n\tprivate readonly nodeState = computed(() => getFieldNodeState(this.formNode()));\n\n\t/** Unique field ID */\n\treadonly fieldId = computed(() => `field-${this.path().replace(/\\./g, '-')}`);\n\n\t/** Computed label */\n\treadonly label = computed(() => this.field().label || humanizeFieldName(this.field().name));\n\n\t/** Whether the field is required */\n\treadonly required = computed(() => this.field().required ?? false);\n\n\t/** Placeholder text */\n\treadonly placeholder = computed(() => this.field().admin?.placeholder || '');\n\n\t/** Whether the field is disabled */\n\treadonly isDisabled = computed(() => {\n\t\treturn this.mode() === 'view' || (this.field().admin?.readOnly ?? false);\n\t});\n\n\t/** Whether to use textarea */\n\treadonly isTextarea = computed(() => {\n\t\treturn this.field().type === 'textarea';\n\t});\n\n\t/** Input type (text, email, etc.) */\n\treadonly inputType = computed(() => {\n\t\treturn this.field().type === 'email' ? 'email' : 'text';\n\t});\n\n\t/** Number of rows for textarea */\n\treadonly rows = computed(() => {\n\t\treturn 4;\n\t});\n\n\t/** String value from FieldState */\n\treadonly stringValue = computed(() => {\n\t\tconst state = this.nodeState();\n\t\tif (!state) return '';\n\t\tconst val = state.value();\n\t\treturn val === null || val === undefined ? '' : String(val);\n\t});\n\n\t/** Field description */\n\treadonly description = computed(() => this.field().description ?? '');\n\n\t/** Max length from field constraints */\n\treadonly maxLength = computed((): number | undefined => {\n\t\tconst f = this.field();\n\t\tif (f.type === 'text' || f.type === 'textarea') {\n\t\t\treturn (f as TextField | TextareaField).maxLength;\n\t\t}\n\t\treturn undefined;\n\t});\n\n\t/** Current character count */\n\treadonly charCount = computed(() => this.stringValue().length);\n\n\t/** Whether to show character counter */\n\treadonly showCharCount = computed(() => this.maxLength() !== undefined);\n\n\t/** Whether character count exceeds max */\n\treadonly charCountExceeded = computed(() => {\n\t\tconst max = this.maxLength();\n\t\treturn max !== undefined && this.charCount() > max;\n\t});\n\n\t/** Validation errors shown only when field is touched */\n\treadonly touchedErrors = computed((): readonly ValidationError[] => {\n\t\tconst state = this.nodeState();\n\t\tif (!state || !state.touched()) return [];\n\t\treturn state.errors().map((e) => ({ kind: e.kind, message: e.message }));\n\t});\n\n\t/**\n\t * Handle value change from input/textarea.\n\t */\n\tonValueChange(value: string): void {\n\t\tconst state = this.nodeState();\n\t\tif (state) state.value.set(value);\n\t}\n\n\t/**\n\t * Handle blur from input/textarea.\n\t */\n\tonBlur(): void {\n\t\tconst state = this.nodeState();\n\t\tif (state) state.markAsTouched();\n\t}\n}\n","/* eslint-disable @typescript-eslint/consistent-type-assertions -- Type assertions needed to narrow Field union to NumberField after type guard */\n\nimport { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { McmsFormField, Input } from '@momentumcms/ui';\nimport type { ValidationError } from '@momentumcms/ui';\nimport { humanizeFieldName } from '@momentumcms/core';\nimport type { Field, NumberField } from '@momentumcms/core';\nimport type { EntityFormMode } from '../entity-form.types';\nimport { getFieldNodeState } from '../entity-form.types';\n\n/**\n * Number field renderer.\n *\n * Uses Angular Signal Forms bridge pattern: reads/writes value via\n * a FieldTree node's FieldState rather than event-based I/O.\n *\n * NOTE: No clamping is applied on value change. Signal forms validators\n * handle min/max constraint errors. HTML min/max/step attrs still set\n * for browser-native spinner behavior.\n */\n@Component({\n\tselector: 'mcms-number-field-renderer',\n\timports: [McmsFormField, Input],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\ttemplate: `\n\t\t<mcms-form-field\n\t\t\t[id]=\"fieldId()\"\n\t\t\t[required]=\"required()\"\n\t\t\t[disabled]=\"isDisabled()\"\n\t\t\t[errors]=\"touchedErrors()\"\n\t\t>\n\t\t\t<span mcmsLabel>{{ label() }}</span>\n\t\t\t<mcms-input\n\t\t\t\t[id]=\"fieldId()\"\n\t\t\t\ttype=\"number\"\n\t\t\t\t[value]=\"stringValue()\"\n\t\t\t\t[placeholder]=\"placeholder()\"\n\t\t\t\t[disabled]=\"isDisabled()\"\n\t\t\t\t[errors]=\"touchedErrors()\"\n\t\t\t\t[min]=\"minValue()\"\n\t\t\t\t[max]=\"maxValue()\"\n\t\t\t\t[step]=\"stepValue()\"\n\t\t\t\t(valueChange)=\"onValueChange($event)\"\n\t\t\t\t(blurred)=\"onBlur()\"\n\t\t\t/>\n\t\t\t@if (rangeHint()) {\n\t\t\t\t<p class=\"mt-1 text-xs text-muted-foreground\">{{ rangeHint() }}</p>\n\t\t\t}\n\t\t</mcms-form-field>\n\t`,\n})\nexport class NumberFieldRenderer {\n\t/** Field definition */\n\treadonly field = input.required<Field>();\n\n\t/** Signal forms FieldTree node for this field */\n\treadonly formNode = input<unknown>(null);\n\n\t/** Form mode */\n\treadonly mode = input<EntityFormMode>('create');\n\n\t/** Field path */\n\treadonly path = input.required<string>();\n\n\t/** Bridge: extract FieldState from formNode */\n\tprivate readonly nodeState = computed(() => getFieldNodeState(this.formNode()));\n\n\t/** Unique field ID */\n\treadonly fieldId = computed(() => `field-${this.path().replace(/\\./g, '-')}`);\n\n\t/** Computed label */\n\treadonly label = computed(() => this.field().label || humanizeFieldName(this.field().name));\n\n\t/** Whether the field is required */\n\treadonly required = computed(() => this.field().required ?? false);\n\n\t/** Placeholder text */\n\treadonly placeholder = computed(() => this.field().admin?.placeholder || '');\n\n\t/** Whether the field is disabled */\n\treadonly isDisabled = computed(() => {\n\t\treturn this.mode() === 'view' || (this.field().admin?.readOnly ?? false);\n\t});\n\n\t/** String value from FieldState */\n\treadonly stringValue = computed(() => {\n\t\tconst state = this.nodeState();\n\t\tif (!state) return '';\n\t\tconst val = state.value();\n\t\treturn val === null || val === undefined ? '' : String(val);\n\t});\n\n\t/** Min constraint from field definition */\n\treadonly minValue = computed((): number | undefined => {\n\t\tconst f = this.field();\n\t\treturn f.type === 'number' ? (f as NumberField).min : undefined;\n\t});\n\n\t/** Max constraint from field definition */\n\treadonly maxValue = computed((): number | undefined => {\n\t\tconst f = this.field();\n\t\treturn f.type === 'number' ? (f as NumberField).max : undefined;\n\t});\n\n\t/** Step constraint from field definition */\n\treadonly stepValue = computed((): number | undefined => {\n\t\tconst f = this.field();\n\t\treturn f.type === 'number' ? (f as NumberField).step : undefined;\n\t});\n\n\t/** Range hint text based on min/max/step constraints */\n\treadonly rangeHint = computed((): string => {\n\t\tconst f = this.field();\n\t\tif (f.type !== 'number') return '';\n\t\tconst nf = f as NumberField;\n\t\tconst parts: string[] = [];\n\t\tif (nf.min !== undefined && nf.max !== undefined) {\n\t\t\tparts.push(`${nf.min} - ${nf.max}`);\n\t\t} else if (nf.min !== undefined) {\n\t\t\tparts.push(`Min: ${nf.min}`);\n\t\t} else if (nf.max !== undefined) {\n\t\t\tparts.push(`Max: ${nf.max}`);\n\t\t}\n\t\tif (nf.step !== undefined) {\n\t\t\tparts.push(`Step: ${nf.step}`);\n\t\t}\n\t\treturn parts.join(' | ');\n\t});\n\n\t/** Validation errors shown only when field is touched */\n\treadonly touchedErrors = computed((): readonly ValidationError[] => {\n\t\tconst state = this.nodeState();\n\t\tif (!state || !state.touched()) return [];\n\t\treturn state.errors().map((e) => ({ kind: e.kind, message: e.message }));\n\t});\n\n\t/**\n\t * Handle value change from input.\n\t * No clamping — let signal forms validators show min/max errors.\n\t */\n\tonValueChange(value: string): void {\n\t\tconst state = this.nodeState();\n\t\tif (!state) return;\n\t\tconst numValue = value === '' ? null : Number(value);\n\t\tstate.value.set(numValue === null || Number.isNaN(numValue) ? null : numValue);\n\t}\n\n\t/**\n\t * Handle blur from input.\n\t */\n\tonBlur(): void {\n\t\tconst state = this.nodeState();\n\t\tif (state) state.markAsTouched();\n\t}\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { McmsFormField, Select } from '@momentumcms/ui';\nimport type { ValidationError, SelectOption } from '@momentumcms/ui';\nimport { humanizeFieldName } from '@momentumcms/core';\nimport type { Field, SelectField as SelectFieldType } from '@momentumcms/core';\nimport type { EntityFormMode } from '../entity-form.types';\nimport { getFieldNodeState } from '../entity-form.types';\n\n/**\n * Select field renderer.\n *\n * Uses Angular Signal Forms bridge pattern: reads/writes value via\n * a FieldTree node's FieldState rather than event-based I/O.\n */\n@Component({\n\tselector: 'mcms-select-field-renderer',\n\timports: [McmsFormField, Select],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\ttemplate: `\n\t\t<mcms-form-field\n\t\t\t[id]=\"fieldId()\"\n\t\t\t[required]=\"required()\"\n\t\t\t[disabled]=\"isDisabled()\"\n\t\t\t[errors]=\"touchedErrors()\"\n\t\t>\n\t\t\t<span mcmsLabel>{{ label() }}</span>\n\t\t\t<mcms-select\n\t\t\t\t[id]=\"fieldId()\"\n\t\t\t\t[value]=\"stringValue()\"\n\t\t\t\t[options]=\"selectOptions()\"\n\t\t\t\t[placeholder]=\"placeholder()\"\n\t\t\t\t[disabled]=\"isDisabled()\"\n\t\t\t\t[errors]=\"touchedErrors()\"\n\t\t\t\t(valueChange)=\"onValueChange($event)\"\n\t\t\t/>\n\t\t</mcms-form-field>\n\t`,\n})\nexport class SelectFieldRenderer {\n\t/** Field definition */\n\treadonly field = input.required<Field>();\n\n\t/** Signal forms FieldTree node for this field */\n\treadonly formNode = input<unknown>(null);\n\n\t/** Form mode */\n\treadonly mode = input<EntityFormMode>('create');\n\n\t/** Field path */\n\treadonly path = input.required<string>();\n\n\t/** Bridge: extract FieldState from formNode */\n\tprivate readonly nodeState = computed(() => getFieldNodeState(this.formNode()));\n\n\t/** Unique field ID */\n\treadonly fieldId = computed(() => `field-${this.path().replace(/\\./g, '-')}`);\n\n\t/** Computed label */\n\treadonly label = computed(() => this.field().label || humanizeFieldName(this.field().name));\n\n\t/** Whether the field is required */\n\treadonly required = computed(() => this.field().required ?? false);\n\n\t/** Placeholder text */\n\treadonly placeholder = computed(() => this.field().admin?.placeholder || 'Select...');\n\n\t/** Whether the field is disabled */\n\treadonly isDisabled = computed(() => {\n\t\treturn this.mode() === 'view' || (this.field().admin?.readOnly ?? false);\n\t});\n\n\t/** Select options (converted to UI SelectOption format with string values) */\n\treadonly selectOptions = computed((): SelectOption[] => {\n\t\t// This component is only used for select/radio fields\n\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\tconst f = this.field() as SelectFieldType;\n\t\tconst options = f.options || [];\n\t\treturn options.map((opt) => ({\n\t\t\tlabel: opt.label,\n\t\t\tvalue: String(opt.value),\n\t\t}));\n\t});\n\n\t/** String value from FieldState */\n\treadonly stringValue = computed(() => {\n\t\tconst state = this.nodeState();\n\t\tif (!state) return '';\n\t\tconst val = state.value();\n\t\treturn val === null || val === undefined ? '' : String(val);\n\t});\n\n\t/** Validation errors shown only when field is touched */\n\treadonly touchedErrors = computed((): readonly ValidationError[] => {\n\t\tconst state = this.nodeState();\n\t\tif (!state || !state.touched()) return [];\n\t\treturn state.errors().map((e) => ({ kind: e.kind, message: e.message }));\n\t});\n\n\t/**\n\t * Handle value change from select.\n\t * Marks touched immediately since select has no native blur flow.\n\t */\n\tonValueChange(value: string): void {\n\t\tconst state = this.nodeState();\n\t\tif (!state) return;\n\t\tstate.value.set(value || null);\n\t\tstate.markAsTouched();\n\t}\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { McmsFormField, Checkbox } from '@momentumcms/ui';\nimport type { ValidationError } from '@momentumcms/ui';\nimport { humanizeFieldName } from '@momentumcms/core';\nimport type { Field } from '@momentumcms/core';\nimport type { EntityFormMode } from '../entity-form.types';\nimport { getFieldNodeState } from '../entity-form.types';\n\n/**\n * Checkbox field renderer.\n *\n * Uses Angular Signal Forms bridge pattern: reads/writes value via\n * a FieldTree node's FieldState rather than event-based I/O.\n */\n@Component({\n\tselector: 'mcms-checkbox-field-renderer',\n\timports: [McmsFormField, Checkbox],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\ttemplate: `\n\t\t<mcms-form-field [id]=\"fieldId()\" [hasLabel]=\"false\" [errors]=\"touchedErrors()\">\n\t\t\t<mcms-checkbox\n\t\t\t\t[id]=\"fieldId()\"\n\t\t\t\t[value]=\"boolValue()\"\n\t\t\t\t[disabled]=\"isDisabled()\"\n\t\t\t\t[errors]=\"touchedErrors()\"\n\t\t\t\t(valueChange)=\"onValueChange($event)\"\n\t\t\t>\n\t\t\t\t{{ label() }}\n\t\t\t\t@if (required()) {\n\t\t\t\t\t<span class=\"text-destructive ml-1\">*</span>\n\t\t\t\t}\n\t\t\t</mcms-checkbox>\n\t\t\t@if (description()) {\n\t\t\t\t<p class=\"text-sm text-muted-foreground mt-1\">{{ description() }}</p>\n\t\t\t}\n\t\t</mcms-form-field>\n\t`,\n})\nexport class CheckboxFieldRenderer {\n\t/** Field definition */\n\treadonly field = input.required<Field>();\n\n\t/** Signal forms FieldTree node for this field */\n\treadonly formNode = input<unknown>(null);\n\n\t/** Form mode */\n\treadonly mode = input<EntityFormMode>('create');\n\n\t/** Field path */\n\treadonly path = input.required<string>();\n\n\t/** Bridge: extract FieldState from formNode */\n\tprivate readonly nodeState = computed(() => getFieldNodeState(this.formNode()));\n\n\t/** Unique field ID */\n\treadonly fieldId = computed(() => `field-${this.path().replace(/\\./g, '-')}`);\n\n\t/** Computed label */\n\treadonly label = computed(() => this.field().label || humanizeFieldName(this.field().name));\n\n\t/** Whether the field is required */\n\treadonly required = computed(() => this.field().required ?? false);\n\n\t/** Field description */\n\treadonly description = computed(() => this.field().description || '');\n\n\t/** Whether the field is disabled */\n\treadonly isDisabled = computed(() => {\n\t\treturn this.mode() === 'view' || (this.field().admin?.readOnly ?? false);\n\t});\n\n\t/** Boolean value from FieldState */\n\treadonly boolValue = computed(() => {\n\t\tconst state = this.nodeState();\n\t\tif (!state) return false;\n\t\tconst val = state.value();\n\t\treturn val === true || val === 'true';\n\t});\n\n\t/** Validation errors shown only when field is touched */\n\treadonly touchedErrors = computed((): readonly ValidationError[] => {\n\t\tconst state = this.nodeState();\n\t\tif (!state || !state.touched()) return [];\n\t\treturn state.errors().map((e) => ({ kind: e.kind, message: e.message }));\n\t});\n\n\t/**\n\t * Handle value change from checkbox.\n\t * Marks touched immediately since checkboxes don't have a native blur flow.\n\t */\n\tonValueChange(value: boolean): void {\n\t\tconst state = this.nodeState();\n\t\tif (!state) return;\n\t\tstate.value.set(value);\n\t\tstate.markAsTouched();\n\t}\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { McmsFormField, Input } from '@momentumcms/ui';\nimport type { ValidationError } from '@momentumcms/ui';\nimport { humanizeFieldName } from '@momentumcms/core';\nimport type { Field } from '@momentumcms/core';\nimport type { EntityFormMode } from '../entity-form.types';\nimport { getFieldNodeState } from '../entity-form.types';\n\n/**\n * Date field renderer.\n *\n * Uses Angular Signal Forms bridge pattern: reads/writes value via\n * a FieldTree node's FieldState rather than event-based I/O.\n */\n@Component({\n\tselector: 'mcms-date-field-renderer',\n\timports: [McmsFormField, Input],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\ttemplate: `\n\t\t<mcms-form-field\n\t\t\t[id]=\"fieldId()\"\n\t\t\t[required]=\"required()\"\n\t\t\t[disabled]=\"isDisabled()\"\n\t\t\t[errors]=\"touchedErrors()\"\n\t\t>\n\t\t\t<span mcmsLabel>{{ label() }}</span>\n\t\t\t<mcms-input\n\t\t\t\t[id]=\"fieldId()\"\n\t\t\t\t[type]=\"inputType()\"\n\t\t\t\t[value]=\"dateValue()\"\n\t\t\t\t[placeholder]=\"placeholder()\"\n\t\t\t\t[disabled]=\"isDisabled()\"\n\t\t\t\t[errors]=\"touchedErrors()\"\n\t\t\t\t(valueChange)=\"onValueChange($event)\"\n\t\t\t\t(blurred)=\"onBlur()\"\n\t\t\t/>\n\t\t</mcms-form-field>\n\t`,\n})\nexport class DateFieldRenderer {\n\t/** Field definition */\n\treadonly field = input.required<Field>();\n\n\t/** Signal forms FieldTree node for this field */\n\treadonly formNode = input<unknown>(null);\n\n\t/** Form mode */\n\treadonly mode = input<EntityFormMode>('create');\n\n\t/** Field path */\n\treadonly path = input.required<string>();\n\n\t/** Bridge: extract FieldState from formNode */\n\tprivate readonly nodeState = computed(() => getFieldNodeState(this.formNode()));\n\n\t/** Unique field ID */\n\treadonly fieldId = computed(() => `field-${this.path().replace(/\\./g, '-')}`);\n\n\t/** Computed label */\n\treadonly label = computed(() => this.field().label || humanizeFieldName(this.field().name));\n\n\t/** Whether the field is required */\n\treadonly required = computed(() => this.field().required ?? false);\n\n\t/** Placeholder text */\n\treadonly placeholder = computed(() => this.field().admin?.placeholder || '');\n\n\t/** Whether the field is disabled */\n\treadonly isDisabled = computed(() => {\n\t\treturn this.mode() === 'view' || (this.field().admin?.readOnly ?? false);\n\t});\n\n\t/** Input type (date or datetime-local) */\n\treadonly inputType = computed((): 'text' => {\n\t\t// HTML5 date input type isn't in InputType union, use text for now\n\t\t// The browser will still render date picker for type=\"date\"\n\t\treturn 'text';\n\t});\n\n\t/** Formatted date value from FieldState */\n\treadonly dateValue = computed(() => {\n\t\tconst state = this.nodeState();\n\t\tif (!state) return '';\n\t\tconst val = state.value();\n\t\tif (val === null || val === undefined || val === '') {\n\t\t\treturn '';\n\t\t}\n\n\t\ttry {\n\t\t\t// Date constructor accepts string or number\n\t\t\tconst dateInput = typeof val === 'number' ? val : String(val);\n\t\t\tconst date = new Date(dateInput);\n\t\t\tif (Number.isNaN(date.getTime())) {\n\t\t\t\treturn '';\n\t\t\t}\n\t\t\t// Format as YYYY-MM-DD for date input\n\t\t\treturn date.toISOString().split('T')[0];\n\t\t} catch {\n\t\t\treturn '';\n\t\t}\n\t});\n\n\t/** Validation errors shown only when field is touched */\n\treadonly touchedErrors = computed((): readonly ValidationError[] => {\n\t\tconst state = this.nodeState();\n\t\tif (!state || !state.touched()) return [];\n\t\treturn state.errors().map((e) => ({ kind: e.kind, message: e.message }));\n\t});\n\n\t/**\n\t * Handle value change from input.\n\t */\n\tonValueChange(value: string): void {\n\t\tconst state = this.nodeState();\n\t\tif (!state) return;\n\n\t\tif (!value) {\n\t\t\tstate.value.set(null);\n\t\t\treturn;\n\t\t}\n\n\t\t// Convert to ISO string\n\t\ttry {\n\t\t\tconst date = new Date(value);\n\t\t\tstate.value.set(date.toISOString());\n\t\t} catch {\n\t\t\tstate.value.set(null);\n\t\t}\n\t}\n\n\t/**\n\t * Handle blur from input.\n\t */\n\tonBlur(): void {\n\t\tconst state = this.nodeState();\n\t\tif (state) state.markAsTouched();\n\t}\n}\n","import { Component, ChangeDetectionStrategy, input, computed } from '@angular/core';\nimport { NgIcon } from '@ng-icons/core';\nimport {\n\theroPhoto,\n\theroDocument,\n\theroFilm,\n\theroMusicalNote,\n\theroArchiveBox,\n\theroDocumentText,\n} from '@ng-icons/heroicons/outline';\n\n/**\n * Media document data for preview.\n */\nexport interface MediaPreviewData {\n\turl?: string;\n\tpath?: string;\n\tmimeType?: string;\n\tfilename?: string;\n\talt?: string;\n}\n\n/**\n * Media Preview Component\n *\n * Displays a preview of media based on its type:\n * - Images: Thumbnail preview\n * - Videos: Video icon with optional poster\n * - Audio: Audio icon\n * - Documents: Document icon\n * - Other: Generic file icon\n *\n * @example\n * ```html\n * <mcms-media-preview\n * [media]=\"mediaDocument\"\n * [size]=\"'md'\"\n * />\n * ```\n */\n@Component({\n\tselector: 'mcms-media-preview',\n\thost: {\n\t\t'[class]': 'hostClasses()',\n\t},\n\ttemplate: `\n\t\t@if (isImage()) {\n\t\t\t<img\n\t\t\t\t[src]=\"imageUrl()\"\n\t\t\t\t[alt]=\"media()?.alt ?? media()?.filename ?? 'Media preview'\"\n\t\t\t\tclass=\"h-full w-full object-cover\"\n\t\t\t/>\n\t\t} @else {\n\t\t\t<div class=\"flex h-full w-full items-center justify-center bg-mcms-muted\">\n\t\t\t\t<ng-icon [name]=\"iconName()\" [class]=\"iconClasses()\" />\n\t\t\t</div>\n\t\t}\n\t`,\n\timports: [NgIcon],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MediaPreviewComponent {\n\t/** Media data to preview */\n\treadonly media = input<MediaPreviewData | null>(null);\n\n\t/** Size of the preview */\n\treadonly size = input<'xs' | 'sm' | 'md' | 'lg' | 'xl'>('md');\n\n\t/** Custom class override */\n\treadonly class = input('');\n\n\t/** Whether to show rounded corners */\n\treadonly rounded = input(true);\n\n\t/** Host classes */\n\treadonly hostClasses = computed(() => {\n\t\tconst sizeClass = this.sizeClasses()[this.size()];\n\t\tconst roundedClass = this.rounded() ? 'rounded-md overflow-hidden' : '';\n\t\treturn `inline-block ${sizeClass} ${roundedClass} ${this.class()}`;\n\t});\n\n\t/** Size classes map */\n\tprivate readonly sizeClasses = computed(() => ({\n\t\txs: 'h-8 w-8',\n\t\tsm: 'h-12 w-12',\n\t\tmd: 'h-20 w-20',\n\t\tlg: 'h-32 w-32',\n\t\txl: 'h-48 w-48',\n\t}));\n\n\t/** Icon size classes */\n\treadonly iconClasses = computed(() => {\n\t\tconst sizes: Record<string, string> = {\n\t\t\txs: 'text-lg',\n\t\t\tsm: 'text-xl',\n\t\t\tmd: 'text-3xl',\n\t\t\tlg: 'text-4xl',\n\t\t\txl: 'text-6xl',\n\t\t};\n\t\treturn `${sizes[this.size()]} text-mcms-muted-foreground`;\n\t});\n\n\t/** Whether the media is an image */\n\treadonly isImage = computed(() => {\n\t\tconst mimeType = this.media()?.mimeType ?? '';\n\t\treturn mimeType.startsWith('image/');\n\t});\n\n\t/** Whether the media is a video */\n\treadonly isVideo = computed(() => {\n\t\tconst mimeType = this.media()?.mimeType ?? '';\n\t\treturn mimeType.startsWith('video/');\n\t});\n\n\t/** Whether the media is audio */\n\treadonly isAudio = computed(() => {\n\t\tconst mimeType = this.media()?.mimeType ?? '';\n\t\treturn mimeType.startsWith('audio/');\n\t});\n\n\t/** Image URL for preview */\n\treadonly imageUrl = computed(() => {\n\t\tconst media = this.media();\n\t\tif (!media) return '';\n\t\treturn media.url ?? `/api/media/file/${media.path}`;\n\t});\n\n\t/** Icon name based on media type */\n\treadonly iconName = computed(() => {\n\t\tconst mimeType = this.media()?.mimeType ?? '';\n\n\t\tif (mimeType.startsWith('video/')) {\n\t\t\treturn heroFilm;\n\t\t}\n\t\tif (mimeType.startsWith('audio/')) {\n\t\t\treturn heroMusicalNote;\n\t\t}\n\t\tif (mimeType === 'application/pdf') {\n\t\t\treturn heroDocumentText;\n\t\t}\n\t\tif (mimeType.startsWith('application/zip') || mimeType.includes('compressed')) {\n\t\t\treturn heroArchiveBox;\n\t\t}\n\t\tif (mimeType.startsWith('image/')) {\n\t\t\treturn heroPhoto;\n\t\t}\n\n\t\treturn heroDocument;\n\t});\n}\n","import {\n\tChangeDetectionStrategy,\n\tComponent,\n\tcomputed,\n\tinject,\n\tsignal,\n\teffect,\n} from '@angular/core';\nimport {\n\tButton,\n\tDialog,\n\tDialogHeader,\n\tDialogTitle,\n\tDialogContent,\n\tDialogFooter,\n\tDialogClose,\n\tDialogRef,\n\tDIALOG_DATA,\n\tSpinner,\n\tPagination,\n} from '@momentumcms/ui';\nimport { SearchInput } from '@momentumcms/ui';\nimport { injectMomentumAPI } from '../../../services/momentum-api.service';\nimport { MediaPreviewComponent } from '../../../widgets/media-preview/media-preview.component';\n\n/**\n * Media item from the API.\n */\nexport interface MediaItem {\n\tid: string;\n\tfilename: string;\n\tmimeType: string;\n\tpath: string;\n\turl?: string;\n\tfilesize?: number;\n\talt?: string;\n}\n\n/**\n * Type guard to check if value is MediaItem.\n * Note: Type assertion is required for type guard functions.\n */\nfunction isMediaItem(value: unknown): value is MediaItem {\n\tif (typeof value !== 'object' || value === null) return false;\n\t// Type guard requires accessing unknown object - eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\tconst obj = value as Record<string, unknown>; // eslint-disable-line @typescript-eslint/consistent-type-assertions\n\treturn (\n\t\ttypeof obj['id'] === 'string' &&\n\t\ttypeof obj['filename'] === 'string' &&\n\t\ttypeof obj['mimeType'] === 'string' &&\n\t\ttypeof obj['path'] === 'string'\n\t);\n}\n\n/**\n * Convert API docs to MediaItem array.\n */\nfunction toMediaItems(docs: unknown): MediaItem[] {\n\tif (!Array.isArray(docs)) return [];\n\treturn docs.filter(isMediaItem);\n}\n\n/**\n * Data passed to the MediaPickerDialog.\n */\nexport interface MediaPickerDialogData {\n\t/** Allowed MIME types filter */\n\tmimeTypes?: string[];\n\t/** Collection to query (default: 'media') */\n\trelationTo?: string;\n}\n\n/**\n * Result returned from the MediaPickerDialog.\n */\nexport interface MediaPickerResult {\n\tmedia: MediaItem | null;\n}\n\n/**\n * Dialog for selecting media from the media library.\n */\n@Component({\n\tselector: 'mcms-media-picker-dialog',\n\timports: [\n\t\tButton,\n\t\tDialog,\n\t\tDialogHeader,\n\t\tDialogTitle,\n\t\tDialogContent,\n\t\tDialogFooter,\n\t\tDialogClose,\n\t\tSpinner,\n\t\tPagination,\n\t\tMediaPreviewComponent,\n\t\tSearchInput,\n\t],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\ttemplate: `\n\t\t<mcms-dialog>\n\t\t<mcms-dialog-header>\n\t\t\t<mcms-dialog-title>Select Media</mcms-dialog-title>\n\t\t</mcms-dialog-header>\n\n\t\t<mcms-dialog-content class=\"max-h-[60vh] overflow-auto\">\n\t\t\t<!-- Search -->\n\t\t\t<div class=\"mb-4\">\n\t\t\t\t<mcms-search-input\n\t\t\t\t\tplaceholder=\"Search media...\"\n\t\t\t\t\t[value]=\"searchQuery()\"\n\t\t\t\t\t(valueChange)=\"onSearchChange($event)\"\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t@if (isLoading()) {\n\t\t\t\t<div class=\"flex h-48 items-center justify-center\">\n\t\t\t\t\t<mcms-spinner size=\"lg\" />\n\t\t\t\t</div>\n\t\t\t} @else if (mediaItems().length === 0) {\n\t\t\t\t<div class=\"flex h-48 flex-col items-center justify-center text-mcms-muted-foreground\">\n\t\t\t\t\t<p class=\"text-sm\">No media found</p>\n\t\t\t\t\t@if (searchQuery()) {\n\t\t\t\t\t\t<p class=\"text-xs\">Try a different search term</p>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t} @else {\n\t\t\t\t<!-- Media grid -->\n\t\t\t\t<div class=\"grid grid-cols-4 gap-3 sm:grid-cols-5 md:grid-cols-6\">\n\t\t\t\t\t@for (media of mediaItems(); track media.id) {\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"group relative overflow-hidden rounded-lg border-2 transition-all hover:border-mcms-primary\"\n\t\t\t\t\t\t\t[class.border-mcms-primary]=\"selectedMedia()?.id === media.id\"\n\t\t\t\t\t\t\t[class.border-transparent]=\"selectedMedia()?.id !== media.id\"\n\t\t\t\t\t\t\t[class.ring-2]=\"selectedMedia()?.id === media.id\"\n\t\t\t\t\t\t\t[class.ring-mcms-primary/50]=\"selectedMedia()?.id === media.id\"\n\t\t\t\t\t\t\t(click)=\"selectMedia(media)\"\n\t\t\t\t\t\t\t(dblclick)=\"confirmSelection(media)\"\n\t\t\t\t\t\t\t[attr.aria-label]=\"'Select ' + media.filename\"\n\t\t\t\t\t\t\t[attr.aria-pressed]=\"selectedMedia()?.id === media.id\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<mcms-media-preview\n\t\t\t\t\t\t\t\t[media]=\"media\"\n\t\t\t\t\t\t\t\tsize=\"xl\"\n\t\t\t\t\t\t\t\t[rounded]=\"false\"\n\t\t\t\t\t\t\t\tclass=\"aspect-square w-full\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclass=\"absolute inset-x-0 bottom-0 bg-gradient-to-t from-black/60 to-transparent p-2 opacity-0 transition-opacity group-hover:opacity-100\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<p class=\"truncate text-xs text-white\">{{ media.filename }}</p>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\n\t\t\t\t<!-- Pagination -->\n\t\t\t\t@if (totalPages() > 1) {\n\t\t\t\t\t<div class=\"mt-4 flex justify-center\">\n\t\t\t\t\t\t<mcms-pagination\n\t\t\t\t\t\t\t[currentPage]=\"currentPage()\"\n\t\t\t\t\t\t\t[totalPages]=\"totalPages()\"\n\t\t\t\t\t\t\t(pageChange)=\"onPageChange($event)\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t}\n\t\t</mcms-dialog-content>\n\n\t\t<mcms-dialog-footer>\n\t\t\t<button mcms-button variant=\"outline\" mcmsDialogClose type=\"button\">Cancel</button>\n\t\t\t<button\n\t\t\t\tmcms-button\n\t\t\t\ttype=\"button\"\n\t\t\t\t[disabled]=\"!selectedMedia()\"\n\t\t\t\t(click)=\"confirm()\"\n\t\t\t>\n\t\t\t\tSelect\n\t\t\t</button>\n\t\t</mcms-dialog-footer>\n\t\t</mcms-dialog>\n\t`,\n})\nexport class MediaPickerDialog {\n\tprivate readonly dialogRef = inject(DialogRef<MediaPickerResult>);\n\tprivate readonly data = inject<MediaPickerDialogData>(DIALOG_DATA);\n\tprivate readonly api = injectMomentumAPI();\n\n\t/** Internal state */\n\treadonly isLoading = signal(true);\n\treadonly mediaItems = signal<MediaItem[]>([]);\n\treadonly selectedMedia = signal<MediaItem | null>(null);\n\treadonly searchQuery = signal('');\n\treadonly currentPage = signal(1);\n\treadonly totalPages = signal(1);\n\treadonly totalDocs = signal(0);\n\treadonly limit = signal(24);\n\n\t/** Collection to query */\n\treadonly collectionSlug = computed(() => this.data?.relationTo ?? 'media');\n\n\tconstructor() {\n\t\t// Load media on init and when search/page changes\n\t\teffect(() => {\n\t\t\tconst query = this.searchQuery();\n\t\t\tconst page = this.currentPage();\n\t\t\tthis.loadMedia(query, page);\n\t\t});\n\t}\n\n\t/**\n\t * Load media from the API.\n\t */\n\tprivate async loadMedia(search: string, page: number): Promise<void> {\n\t\tthis.isLoading.set(true);\n\n\t\ttry {\n\t\t\tconst collection = this.api.collection(this.collectionSlug());\n\t\t\tconst whereClause: Record<string, unknown> = {};\n\n\t\t\t// Add search filter\n\t\t\tif (search) {\n\t\t\t\twhereClause['filename'] = { contains: search };\n\t\t\t}\n\n\t\t\t// Add MIME type filter\n\t\t\tconst mimeTypes = this.data?.mimeTypes;\n\t\t\tif (mimeTypes && mimeTypes.length > 0) {\n\t\t\t\t// For simple types like 'image/*', filter by prefix\n\t\t\t\tconst prefixes = mimeTypes.filter((t) => t.endsWith('/*')).map((t) => t.slice(0, -2));\n\t\t\t\tconst exactTypes = mimeTypes.filter((t) => !t.endsWith('/*'));\n\n\t\t\t\tif (prefixes.length > 0 || exactTypes.length > 0) {\n\t\t\t\t\tconst orConditions: Array<Record<string, unknown>> = [];\n\n\t\t\t\t\tfor (const prefix of prefixes) {\n\t\t\t\t\t\torConditions.push({ mimeType: { startsWith: prefix } });\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (const type of exactTypes) {\n\t\t\t\t\t\torConditions.push({ mimeType: { equals: type } });\n\t\t\t\t\t}\n\n\t\t\t\t\tif (orConditions.length > 0) {\n\t\t\t\t\t\twhereClause['or'] = orConditions;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst result = await collection.find({\n\t\t\t\twhere: Object.keys(whereClause).length > 0 ? whereClause : undefined,\n\t\t\t\tpage,\n\t\t\t\tlimit: this.limit(),\n\t\t\t\tsort: '-createdAt',\n\t\t\t});\n\n\t\t\tthis.mediaItems.set(toMediaItems(result.docs));\n\t\t\tthis.totalDocs.set(result.totalDocs);\n\t\t\tthis.totalPages.set(result.totalPages);\n\t\t} catch (error) {\n\t\t\tconsole.error('Failed to load media:', error);\n\t\t\tthis.mediaItems.set([]);\n\t\t} finally {\n\t\t\tthis.isLoading.set(false);\n\t\t}\n\t}\n\n\t/**\n\t * Handle search query change.\n\t */\n\tonSearchChange(query: string): void {\n\t\tthis.searchQuery.set(query);\n\t\tthis.currentPage.set(1); // Reset to first page on search\n\t}\n\n\t/**\n\t * Handle page change.\n\t */\n\tonPageChange(page: number): void {\n\t\tthis.currentPage.set(page);\n\t}\n\n\t/**\n\t * Select a media item.\n\t */\n\tselectMedia(media: MediaItem): void {\n\t\tthis.selectedMedia.set(media);\n\t}\n\n\t/**\n\t * Confirm selection on double-click.\n\t */\n\tconfirmSelection(media: MediaItem): void {\n\t\tthis.selectedMedia.set(media);\n\t\tthis.confirm();\n\t}\n\n\t/**\n\t * Confirm and close dialog.\n\t */\n\tconfirm(): void {\n\t\tconst selected = this.selectedMedia();\n\t\tif (selected) {\n\t\t\tthis.dialogRef.close({ media: selected });\n\t\t}\n\t}\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input, signal } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { McmsFormField, Button, Progress, DialogService } from '@momentumcms/ui';\nimport type { ValidationError } from '@momentumcms/ui';\nimport { humanizeFieldName } from '@momentumcms/core';\nimport type { Field, UploadField } from '@momentumcms/core';\nimport type { EntityFormMode } from '../entity-form.types';\nimport { getFieldNodeState } from '../entity-form.types';\nimport { UploadService, type UploadProgress } from '../../../services/upload.service';\nimport {\n\tMediaPreviewComponent,\n\ttype MediaPreviewData,\n} from '../../../widgets/media-preview/media-preview.component';\nimport { MediaPickerDialog, type MediaPickerResult } from './media-picker-dialog.component';\nimport { NgIcon } from '@ng-icons/core';\nimport { heroCloudArrowUp, heroXMark, heroPhoto } from '@ng-icons/heroicons/outline';\n\n/**\n * Type guard for UploadField.\n */\nfunction isUploadField(field: Field): field is UploadField {\n\treturn field.type === 'upload';\n}\n\n/**\n * Check if object has a string property.\n * Note: Type assertion is required for accessing unknown object properties.\n */\nfunction getStringProp(obj: unknown, key: string): string | undefined {\n\tif (typeof obj !== 'object' || obj === null) return undefined;\n\tif (!(key in obj)) return undefined;\n\t// Type guard requires accessing unknown object - eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\tconst value = (obj as Record<string, unknown>)[key]; // eslint-disable-line @typescript-eslint/consistent-type-assertions\n\treturn typeof value === 'string' ? value : undefined;\n}\n\n/**\n * Get HTMLInputElement safely from event.\n */\nfunction getInputFromEvent(event: Event): HTMLInputElement | null {\n\tconst target = event.target;\n\tif (target instanceof HTMLInputElement) {\n\t\treturn target;\n\t}\n\treturn null;\n}\n\n/**\n * Upload field renderer for file upload fields.\n * Supports drag & drop, file selection, and media library picking.\n *\n * Uses Angular Signal Forms bridge pattern: reads/writes value via\n * a FieldTree node's FieldState rather than event-based I/O.\n */\n@Component({\n\tselector: 'mcms-upload-field-renderer',\n\timports: [McmsFormField, Button, Progress, NgIcon, MediaPreviewComponent],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: { class: 'block' },\n\ttemplate: `\n\t\t<mcms-form-field\n\t\t\t[id]=\"fieldId()\"\n\t\t\t[required]=\"required()\"\n\t\t\t[disabled]=\"isDisabled()\"\n\t\t\t[errors]=\"touchedErrors()\"\n\t\t>\n\t\t\t<span mcmsLabel>{{ label() }}</span>\n\n\t\t\t@if (hasValue()) {\n\t\t\t\t<!-- Preview existing media -->\n\t\t\t\t<div class=\"flex items-start gap-4\">\n\t\t\t\t\t<mcms-media-preview [media]=\"mediaPreviewData()\" size=\"lg\" />\n\t\t\t\t\t<div class=\"flex flex-col gap-2\">\n\t\t\t\t\t\t<span class=\"text-sm text-mcms-muted-foreground\">\n\t\t\t\t\t\t\t{{ mediaFilename() }}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t@if (!isDisabled()) {\n\t\t\t\t\t\t\t<div class=\"flex gap-2\">\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tmcms-button\n\t\t\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t(click)=\"openMediaPicker()\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<ng-icon [name]=\"photoIcon\" class=\"h-4 w-4\" />\n\t\t\t\t\t\t\t\t\tChange\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tmcms-button\n\t\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t(click)=\"removeMedia()\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<ng-icon [name]=\"xMarkIcon\" class=\"h-4 w-4\" />\n\t\t\t\t\t\t\t\t\tRemove\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t} @else if (isUploading()) {\n\t\t\t\t<!-- Upload in progress -->\n\t\t\t\t<div class=\"rounded-lg border border-mcms-border bg-mcms-muted/50 p-4\">\n\t\t\t\t\t<div class=\"flex items-center gap-3\">\n\t\t\t\t\t\t<mcms-media-preview [media]=\"uploadingFilePreview()\" size=\"md\" />\n\t\t\t\t\t\t<div class=\"min-w-0 flex-1\">\n\t\t\t\t\t\t\t<p class=\"truncate text-sm font-medium\">{{ uploadingFilename() }}</p>\n\t\t\t\t\t\t\t<mcms-progress [value]=\"uploadProgress()\" class=\"mt-2\" />\n\t\t\t\t\t\t\t<p class=\"mt-1 text-xs text-mcms-muted-foreground\">\n\t\t\t\t\t\t\t\t{{ uploadProgress() }}% uploaded\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t} @else {\n\t\t\t\t<!-- Drop zone -->\n\t\t\t\t<div\n\t\t\t\t\tclass=\"relative rounded-lg border-2 border-dashed transition-colors\"\n\t\t\t\t\t[class.border-mcms-border]=\"!isDragging()\"\n\t\t\t\t\t[class.border-mcms-primary]=\"isDragging()\"\n\t\t\t\t\t[class.bg-mcms-primary/5]=\"isDragging()\"\n\t\t\t\t\t[class.cursor-pointer]=\"!isDisabled()\"\n\t\t\t\t\t[class.opacity-50]=\"isDisabled()\"\n\t\t\t\t\ttabindex=\"0\"\n\t\t\t\t\trole=\"button\"\n\t\t\t\t\t[attr.aria-disabled]=\"isDisabled()\"\n\t\t\t\t\t[attr.aria-label]=\"'Upload ' + label() + ' file. Drag and drop or click to browse.'\"\n\t\t\t\t\t(dragover)=\"onDragOver($event)\"\n\t\t\t\t\t(dragleave)=\"onDragLeave($event)\"\n\t\t\t\t\t(drop)=\"onDrop($event)\"\n\t\t\t\t\t(click)=\"triggerFileInput()\"\n\t\t\t\t\t(keydown.enter)=\"triggerFileInput()\"\n\t\t\t\t\t(keydown.space)=\"triggerFileInput()\"\n\t\t\t\t>\n\t\t\t\t\t<div class=\"flex flex-col items-center justify-center gap-2 p-8\">\n\t\t\t\t\t\t<ng-icon [name]=\"uploadIcon\" class=\"h-10 w-10 text-mcms-muted-foreground\" aria-hidden=\"true\" />\n\t\t\t\t\t\t<div class=\"text-center\">\n\t\t\t\t\t\t\t<p class=\"text-sm font-medium\">\n\t\t\t\t\t\t\t\t@if (isDragging()) {\n\t\t\t\t\t\t\t\t\tDrop file here\n\t\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t\tDrag & drop or click to upload\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t@if (mimeTypesHint()) {\n\t\t\t\t\t\t\t\t<p class=\"mt-1 text-xs text-mcms-muted-foreground\">\n\t\t\t\t\t\t\t\t\t{{ mimeTypesHint() }}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t@if (maxSizeHint()) {\n\t\t\t\t\t\t\t\t<p class=\"text-xs text-mcms-muted-foreground\">\n\t\t\t\t\t\t\t\t\tMax size: {{ maxSizeHint() }}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t@if (!isDisabled()) {\n\t\t\t\t\t\t\t<div class=\"mt-2 flex gap-2\">\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tmcms-button\n\t\t\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t(click)=\"$event.stopPropagation(); openMediaPicker()\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<ng-icon [name]=\"photoIcon\" class=\"h-4 w-4\" />\n\t\t\t\t\t\t\t\t\tSelect from library\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t\t<input\n\t\t\t\t\t\t#fileInput\n\t\t\t\t\t\ttype=\"file\"\n\t\t\t\t\t\tclass=\"sr-only\"\n\t\t\t\t\t\t[accept]=\"acceptAttribute()\"\n\t\t\t\t\t\t[disabled]=\"isDisabled()\"\n\t\t\t\t\t\t(change)=\"onFileSelected($event)\"\n\t\t\t\t\t\t[attr.aria-label]=\"'Choose file for ' + label()\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t}\n\n\t\t\t@if (uploadError()) {\n\t\t\t\t<p class=\"mt-1 text-sm text-mcms-destructive\">{{ uploadError() }}</p>\n\t\t\t}\n\t\t</mcms-form-field>\n\t`,\n})\nexport class UploadFieldRenderer {\n\tprivate readonly document = inject(DOCUMENT);\n\tprivate readonly uploadService = inject(UploadService);\n\tprivate readonly dialogService = inject(DialogService);\n\n\t/** Field definition */\n\treadonly field = input.required<Field>();\n\n\t/** Signal forms FieldTree node for this field */\n\treadonly formNode = input<unknown>(null);\n\n\t/** Form mode */\n\treadonly mode = input<EntityFormMode>('create');\n\n\t/** Field path */\n\treadonly path = input.required<string>();\n\n\t/** Bridge: extract FieldState from formNode */\n\tprivate readonly nodeState = computed(() => getFieldNodeState(this.formNode()));\n\n\t/** Icon references */\n\treadonly uploadIcon = heroCloudArrowUp;\n\treadonly xMarkIcon = heroXMark;\n\treadonly photoIcon = heroPhoto;\n\n\t/** Internal state */\n\treadonly isDragging = signal(false);\n\treadonly uploadProgress = signal(0);\n\treadonly isUploading = signal(false);\n\treadonly uploadingFilename = signal('');\n\treadonly uploadError = signal<string | null>(null);\n\treadonly uploadingFile = signal<File | null>(null);\n\n\t/** Unique field ID */\n\treadonly fieldId = computed(() => `field-${this.path().replace(/\\./g, '-')}`);\n\n\t/** Computed label */\n\treadonly label = computed(() => this.field().label || humanizeFieldName(this.field().name));\n\n\t/** Whether the field is required */\n\treadonly required = computed(() => this.field().required ?? false);\n\n\t/** Whether the field is disabled */\n\treadonly isDisabled = computed(() => {\n\t\treturn this.mode() === 'view' || (this.field().admin?.readOnly ?? false);\n\t});\n\n\t/** Get field as UploadField */\n\treadonly uploadField = computed((): UploadField => {\n\t\tconst field = this.field();\n\t\tif (isUploadField(field)) {\n\t\t\treturn field;\n\t\t}\n\t\t// Return a minimal UploadField if not the right type\n\t\treturn { ...field, type: 'upload', relationTo: 'media' };\n\t});\n\n\t/** Current value from FieldState */\n\tprivate readonly currentValue = computed(() => {\n\t\tconst state = this.nodeState();\n\t\treturn state ? state.value() : null;\n\t});\n\n\t/** Whether we have a value */\n\treadonly hasValue = computed(() => {\n\t\tconst val = this.currentValue();\n\t\treturn val !== null && val !== undefined && val !== '';\n\t});\n\n\t/** Media preview data from value */\n\treadonly mediaPreviewData = computed((): MediaPreviewData | null => {\n\t\tconst val = this.currentValue();\n\t\tif (!val) return null;\n\n\t\t// If value is a full document object\n\t\tif (typeof val === 'object' && val !== null) {\n\t\t\treturn {\n\t\t\t\turl: getStringProp(val, 'url'),\n\t\t\t\tpath: getStringProp(val, 'path'),\n\t\t\t\tmimeType: getStringProp(val, 'mimeType'),\n\t\t\t\tfilename: getStringProp(val, 'filename'),\n\t\t\t\talt: getStringProp(val, 'alt'),\n\t\t\t};\n\t\t}\n\n\t\t// If value is just an ID, we can't preview without fetching\n\t\t// Return a placeholder\n\t\treturn {\n\t\t\tpath: String(val),\n\t\t};\n\t});\n\n\t/** Media filename from value */\n\treadonly mediaFilename = computed(() => {\n\t\tconst val = this.currentValue();\n\t\tif (typeof val === 'object' && val !== null) {\n\t\t\treturn getStringProp(val, 'filename') ?? 'Selected media';\n\t\t}\n\t\treturn 'Selected media';\n\t});\n\n\t/** Preview data for file being uploaded */\n\treadonly uploadingFilePreview = computed((): MediaPreviewData | null => {\n\t\tconst file = this.uploadingFile();\n\t\tif (!file) return null;\n\n\t\treturn {\n\t\t\tmimeType: file.type,\n\t\t\tfilename: file.name,\n\t\t\turl: URL.createObjectURL(file),\n\t\t};\n\t});\n\n\t/** MIME types hint for display */\n\treadonly mimeTypesHint = computed(() => {\n\t\tconst mimeTypes = this.uploadField().mimeTypes;\n\t\tif (!mimeTypes || mimeTypes.length === 0) return null;\n\n\t\tconst simplified = mimeTypes.map((type) => {\n\t\t\tif (type === 'image/*') return 'Images';\n\t\t\tif (type === 'video/*') return 'Videos';\n\t\t\tif (type === 'audio/*') return 'Audio';\n\t\t\tif (type === 'application/pdf') return 'PDF';\n\t\t\treturn type;\n\t\t});\n\n\t\treturn `Allowed: ${simplified.join(', ')}`;\n\t});\n\n\t/** Max size hint for display */\n\treadonly maxSizeHint = computed(() => {\n\t\tconst maxSize = this.uploadField().maxSize;\n\t\tif (!maxSize) return null;\n\n\t\tif (maxSize >= 1024 * 1024 * 1024) {\n\t\t\treturn `${(maxSize / (1024 * 1024 * 1024)).toFixed(1)} GB`;\n\t\t}\n\t\tif (maxSize >= 1024 * 1024) {\n\t\t\treturn `${(maxSize / (1024 * 1024)).toFixed(1)} MB`;\n\t\t}\n\t\tif (maxSize >= 1024) {\n\t\t\treturn `${(maxSize / 1024).toFixed(1)} KB`;\n\t\t}\n\t\treturn `${maxSize} bytes`;\n\t});\n\n\t/** Accept attribute for file input */\n\treadonly acceptAttribute = computed(() => {\n\t\tconst mimeTypes = this.uploadField().mimeTypes;\n\t\tif (!mimeTypes || mimeTypes.length === 0) return '*/*';\n\t\treturn mimeTypes.join(',');\n\t});\n\n\t/** Validation errors shown only when field is touched */\n\treadonly touchedErrors = computed((): readonly ValidationError[] => {\n\t\tconst state = this.nodeState();\n\t\tif (!state || !state.touched()) return [];\n\t\treturn state.errors().map((e) => ({ kind: e.kind, message: e.message }));\n\t});\n\n\t/**\n\t * Handle drag over event.\n\t */\n\tonDragOver(event: DragEvent): void {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\tif (!this.isDisabled()) {\n\t\t\tthis.isDragging.set(true);\n\t\t}\n\t}\n\n\t/**\n\t * Handle drag leave event.\n\t */\n\tonDragLeave(event: DragEvent): void {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\tthis.isDragging.set(false);\n\t}\n\n\t/**\n\t * Handle file drop.\n\t */\n\tonDrop(event: DragEvent): void {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\tthis.isDragging.set(false);\n\n\t\tif (this.isDisabled()) return;\n\n\t\tconst files = event.dataTransfer?.files;\n\t\tif (files && files.length > 0) {\n\t\t\tthis.uploadFile(files[0]);\n\t\t}\n\t}\n\n\t/**\n\t * Trigger hidden file input click.\n\t */\n\ttriggerFileInput(): void {\n\t\tif (this.isDisabled()) return;\n\n\t\tconst input = this.document.querySelector(`#${this.fieldId()} input[type=\"file\"]`);\n\t\tif (input instanceof HTMLInputElement) {\n\t\t\tinput.click();\n\t\t}\n\t}\n\n\t/**\n\t * Handle file selection from input.\n\t */\n\tonFileSelected(event: Event): void {\n\t\tconst input = getInputFromEvent(event);\n\t\tif (!input) return;\n\t\tconst files = input.files;\n\t\tif (files && files.length > 0) {\n\t\t\tthis.uploadFile(files[0]);\n\t\t}\n\t\t// Reset input so same file can be selected again\n\t\tinput.value = '';\n\t}\n\n\t/**\n\t * Upload a file.\n\t */\n\tuploadFile(file: File): void {\n\t\tthis.uploadError.set(null);\n\n\t\t// Validate file size\n\t\tconst maxSize = this.uploadField().maxSize;\n\t\tif (maxSize && file.size > maxSize) {\n\t\t\tthis.uploadError.set(`File size exceeds maximum of ${this.maxSizeHint()}`);\n\t\t\treturn;\n\t\t}\n\n\t\t// Validate MIME type\n\t\tconst mimeTypes = this.uploadField().mimeTypes;\n\t\tif (mimeTypes && mimeTypes.length > 0) {\n\t\t\tconst isAllowed = mimeTypes.some((pattern) => {\n\t\t\t\tif (pattern.endsWith('/*')) {\n\t\t\t\t\tconst prefix = pattern.slice(0, -1);\n\t\t\t\t\treturn file.type.startsWith(prefix);\n\t\t\t\t}\n\t\t\t\treturn file.type === pattern;\n\t\t\t});\n\t\t\tif (!isAllowed) {\n\t\t\t\tthis.uploadError.set(`File type \"${file.type}\" is not allowed`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tthis.isUploading.set(true);\n\t\tthis.uploadProgress.set(0);\n\t\tthis.uploadingFilename.set(file.name);\n\t\tthis.uploadingFile.set(file);\n\n\t\tthis.uploadService.upload(file).subscribe({\n\t\t\tnext: (progress: UploadProgress) => {\n\t\t\t\tthis.uploadProgress.set(progress.progress);\n\n\t\t\t\tif (progress.status === 'complete' && progress.result) {\n\t\t\t\t\tthis.isUploading.set(false);\n\t\t\t\t\tthis.uploadingFile.set(null);\n\t\t\t\t\t// Write the full document to FieldState so we have all the data for preview\n\t\t\t\t\tconst state = this.nodeState();\n\t\t\t\t\tif (state) {\n\t\t\t\t\t\tstate.value.set(progress.result);\n\t\t\t\t\t\tstate.markAsTouched();\n\t\t\t\t\t}\n\t\t\t\t} else if (progress.status === 'error') {\n\t\t\t\t\tthis.isUploading.set(false);\n\t\t\t\t\tthis.uploadingFile.set(null);\n\t\t\t\t\tthis.uploadError.set(progress.error ?? 'Upload failed');\n\t\t\t\t}\n\t\t\t},\n\t\t\terror: (err: Error) => {\n\t\t\t\tthis.isUploading.set(false);\n\t\t\t\tthis.uploadingFile.set(null);\n\t\t\t\tthis.uploadError.set(err.message ?? 'Upload failed');\n\t\t\t},\n\t\t});\n\t}\n\n\t/**\n\t * Open media picker dialog to select existing media.\n\t */\n\topenMediaPicker(): void {\n\t\tconst dialogRef = this.dialogService.open<MediaPickerDialog, unknown, MediaPickerResult>(\n\t\t\tMediaPickerDialog,\n\t\t\t{\n\t\t\t\twidth: '800px',\n\t\t\t\tmaxWidth: '95vw',\n\t\t\t\tdata: {\n\t\t\t\t\tmimeTypes: this.uploadField().mimeTypes,\n\t\t\t\t\trelationTo: this.uploadField().relationTo,\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\n\t\tdialogRef.afterClosed.subscribe((result) => {\n\t\t\tif (result?.media) {\n\t\t\t\tconst state = this.nodeState();\n\t\t\t\tif (state) {\n\t\t\t\t\tstate.value.set(result.media);\n\t\t\t\t\tstate.markAsTouched();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Remove the current media value.\n\t */\n\tremoveMedia(): void {\n\t\tconst state = this.nodeState();\n\t\tif (state) {\n\t\t\tstate.value.set(null);\n\t\t}\n\t}\n}\n","import {\n\tChangeDetectionStrategy,\n\tComponent,\n\tcomputed,\n\teffect,\n\tforwardRef,\n\tinput,\n\tsignal,\n} from '@angular/core';\nimport {\n\tCard,\n\tCardHeader,\n\tCardTitle,\n\tCardContent,\n\tAccordion,\n\tAccordionItem,\n\tAccordionTrigger,\n\tAccordionContent,\n} from '@momentumcms/ui';\nimport { humanizeFieldName } from '@momentumcms/core';\nimport type { Field } from '@momentumcms/core';\nimport type { EntityFormMode } from '../entity-form.types';\nimport { getSubNode } from '../entity-form.types';\nimport { FieldRenderer } from './field-renderer.component';\n\n/**\n * Group field renderer.\n *\n * Renders a group of sub-fields inside a bordered card section.\n * When `admin.collapsible` is true, renders as an accordion instead.\n * Data container pattern: passes sub-field FieldTree nodes via getSubNode().\n */\n@Component({\n\tselector: 'mcms-group-field-renderer',\n\timports: [\n\t\tCard,\n\t\tCardHeader,\n\t\tCardTitle,\n\t\tCardContent,\n\t\tAccordion,\n\t\tAccordionItem,\n\t\tAccordionTrigger,\n\t\tAccordionContent,\n\t\tforwardRef(() => FieldRenderer),\n\t],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\ttemplate: `\n\t\t@if (collapsible()) {\n\t\t\t<mcms-accordion>\n\t\t\t\t<mcms-accordion-item>\n\t\t\t\t\t<mcms-accordion-trigger [panelId]=\"panelId()\" [(expanded)]=\"isExpanded\">\n\t\t\t\t\t\t{{ label() }}\n\t\t\t\t\t</mcms-accordion-trigger>\n\t\t\t\t\t<mcms-accordion-content [panelId]=\"panelId()\">\n\t\t\t\t\t\t@if (description()) {\n\t\t\t\t\t\t\t<p class=\"text-sm text-muted-foreground mb-4\">{{ description() }}</p>\n\t\t\t\t\t\t}\n\t\t\t\t\t\t<div class=\"space-y-4 py-4\">\n\t\t\t\t\t\t\t@for (subField of subFields(); track subField.name) {\n\t\t\t\t\t\t\t\t<mcms-field-renderer\n\t\t\t\t\t\t\t\t\t[field]=\"subField\"\n\t\t\t\t\t\t\t\t\t[formNode]=\"getSubFormNode(subField.name)\"\n\t\t\t\t\t\t\t\t\t[formTree]=\"formTree()\"\n\t\t\t\t\t\t\t\t\t[formModel]=\"formModel()\"\n\t\t\t\t\t\t\t\t\t[mode]=\"mode()\"\n\t\t\t\t\t\t\t\t\t[path]=\"getSubFieldPath(subField.name)\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</mcms-accordion-content>\n\t\t\t\t</mcms-accordion-item>\n\t\t\t</mcms-accordion>\n\t\t} @else {\n\t\t\t<mcms-card>\n\t\t\t\t<mcms-card-header>\n\t\t\t\t\t<mcms-card-title>{{ label() }}</mcms-card-title>\n\t\t\t\t\t@if (description()) {\n\t\t\t\t\t\t<p class=\"text-sm text-muted-foreground\">{{ description() }}</p>\n\t\t\t\t\t}\n\t\t\t\t</mcms-card-header>\n\t\t\t\t<mcms-card-content>\n\t\t\t\t\t<div class=\"space-y-4\">\n\t\t\t\t\t\t@for (subField of subFields(); track subField.name) {\n\t\t\t\t\t\t\t<mcms-field-renderer\n\t\t\t\t\t\t\t\t[field]=\"subField\"\n\t\t\t\t\t\t\t\t[formNode]=\"getSubFormNode(subField.name)\"\n\t\t\t\t\t\t\t\t[formTree]=\"formTree()\"\n\t\t\t\t\t\t\t\t[formModel]=\"formModel()\"\n\t\t\t\t\t\t\t\t[mode]=\"mode()\"\n\t\t\t\t\t\t\t\t[path]=\"getSubFieldPath(subField.name)\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t</mcms-card-content>\n\t\t\t</mcms-card>\n\t\t}\n\t`,\n})\nexport class GroupFieldRenderer {\n\t/** Field definition (must be a GroupField) */\n\treadonly field = input.required<Field>();\n\n\t/** Signal forms FieldTree node for this group */\n\treadonly formNode = input<unknown>(null);\n\n\t/** Root signal forms FieldTree (for layout fields that look up child nodes) */\n\treadonly formTree = input<unknown>(null);\n\n\t/** Form model data (for condition evaluation and relationship filterOptions) */\n\treadonly formModel = input<Record<string, unknown>>({});\n\n\t/** Form mode */\n\treadonly mode = input<EntityFormMode>('create');\n\n\t/** Field path (e.g., \"seo\") */\n\treadonly path = input.required<string>();\n\n\t/** Whether the accordion is expanded (only used in collapsible mode) */\n\treadonly isExpanded = signal(false);\n\n\t/** Whether this group should render as collapsible accordion */\n\treadonly collapsible = computed(() => !!this.field().admin?.collapsible);\n\n\t/** Unique panel ID for accordion aria linkage */\n\treadonly panelId = computed(() => `group-${this.path().replace(/\\./g, '-')}`);\n\n\t/** Computed label */\n\treadonly label = computed(() => this.field().label || humanizeFieldName(this.field().name));\n\n\t/** Computed description */\n\treadonly description = computed(() => this.field().description || '');\n\n\t/** Sub-fields from the group definition */\n\treadonly subFields = computed((): Field[] => {\n\t\tconst f = this.field();\n\t\tif (f.type === 'group') {\n\t\t\treturn f.fields.filter((sf) => !sf.admin?.hidden);\n\t\t}\n\t\treturn [];\n\t});\n\n\tconstructor() {\n\t\teffect(() => {\n\t\t\tif (this.collapsible() && this.field().admin?.defaultOpen) {\n\t\t\t\tthis.isExpanded.set(true);\n\t\t\t}\n\t\t});\n\t}\n\n\t/** Get a FieldTree sub-node for a sub-field */\n\tgetSubFormNode(subFieldName: string): unknown {\n\t\treturn getSubNode(this.formNode(), subFieldName);\n\t}\n\n\t/** Get the full path for a sub-field (e.g., \"seo.metaTitle\") */\n\tgetSubFieldPath(subFieldName: string): string {\n\t\treturn `${this.path()}.${subFieldName}`;\n\t}\n}\n","import { ChangeDetectionStrategy, Component, computed, forwardRef, input } from '@angular/core';\nimport {\n\tCdkDropList,\n\tCdkDrag,\n\tCdkDragHandle,\n\ttype CdkDragDrop,\n\tmoveItemInArray,\n} from '@angular/cdk/drag-drop';\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroPlus, heroTrash, heroBars2 } from '@ng-icons/heroicons/outline';\nimport { Card, CardHeader, CardTitle, CardContent, CardFooter, Button } from '@momentumcms/ui';\nimport { humanizeFieldName } from '@momentumcms/core';\nimport type { Field } from '@momentumcms/core';\nimport type { EntityFormMode } from '../entity-form.types';\nimport {\n\tgetFieldNodeState,\n\tgetSubNode,\n\tisRecord,\n\tgetFieldDefaultValue,\n} from '../entity-form.types';\nimport { FieldRenderer } from './field-renderer.component';\n\n/**\n * Array field renderer.\n *\n * Renders an array of rows, each row displayed as a card with sub-fields.\n * Supports add/remove rows and drag-drop reordering via CDK DragDrop.\n * Respects minRows/maxRows constraints.\n *\n * Data container pattern: passes row sub-field FieldTree nodes via\n * getSubNode(getSubNode(formNode, rowIndex), subFieldName).\n * Array mutations use nodeState.value.set(newArray).\n */\n@Component({\n\tselector: 'mcms-array-field-renderer',\n\timports: [\n\t\tCard,\n\t\tCardHeader,\n\t\tCardTitle,\n\t\tCardContent,\n\t\tCardFooter,\n\t\tButton,\n\t\tNgIcon,\n\t\tCdkDropList,\n\t\tCdkDrag,\n\t\tCdkDragHandle,\n\t\tforwardRef(() => FieldRenderer),\n\t],\n\tproviders: [provideIcons({ heroPlus, heroTrash, heroBars2 })],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\ttemplate: `\n\t\t<mcms-card>\n\t\t\t<mcms-card-header>\n\t\t\t\t<div class=\"flex items-center justify-between\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<mcms-card-title>{{ label() }}</mcms-card-title>\n\t\t\t\t\t\t@if (description()) {\n\t\t\t\t\t\t\t<p class=\"text-sm text-muted-foreground mt-1\">{{ description() }}</p>\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t\t<span class=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t{{ rows().length }}{{ maxRows() ? ' / ' + maxRows() : '' }} rows\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t</mcms-card-header>\n\t\t\t<mcms-card-content>\n\t\t\t\t@if (rows().length === 0) {\n\t\t\t\t\t<p class=\"text-sm text-muted-foreground py-4 text-center\">\n\t\t\t\t\t\tNo items yet. Click \"Add Row\" to get started.\n\t\t\t\t\t</p>\n\t\t\t\t} @else {\n\t\t\t\t\t<div\n\t\t\t\t\t\tcdkDropList\n\t\t\t\t\t\t(cdkDropListDropped)=\"onDrop($event)\"\n\t\t\t\t\t\tclass=\"space-y-3\"\n\t\t\t\t\t\trole=\"list\"\n\t\t\t\t\t\taria-label=\"Array rows\"\n\t\t\t\t\t>\n\t\t\t\t\t\t@for (row of rows(); track $index; let i = $index) {\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tcdkDrag\n\t\t\t\t\t\t\t\tclass=\"border rounded-lg p-4 bg-card flex gap-3 items-start\"\n\t\t\t\t\t\t\t\t[cdkDragDisabled]=\"isDisabled()\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tcdkDragHandle\n\t\t\t\t\t\t\t\t\tclass=\"cursor-grab pt-1 text-muted-foreground hover:text-foreground\"\n\t\t\t\t\t\t\t\t\t[class.hidden]=\"isDisabled()\"\n\t\t\t\t\t\t\t\t\trole=\"button\"\n\t\t\t\t\t\t\t\t\ttabindex=\"0\"\n\t\t\t\t\t\t\t\t\t[attr.aria-label]=\"'Reorder row ' + (i + 1)\"\n\t\t\t\t\t\t\t\t\taria-roledescription=\"sortable\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<ng-icon name=\"heroBars2\" size=\"16\" aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class=\"flex-1 space-y-3\">\n\t\t\t\t\t\t\t\t\t@for (subField of subFields(); track subField.name) {\n\t\t\t\t\t\t\t\t\t\t<mcms-field-renderer\n\t\t\t\t\t\t\t\t\t\t\t[field]=\"subField\"\n\t\t\t\t\t\t\t\t\t\t\t[formNode]=\"getRowSubNode(i, subField.name)\"\n\t\t\t\t\t\t\t\t\t\t\t[formTree]=\"formTree()\"\n\t\t\t\t\t\t\t\t\t\t\t[formModel]=\"formModel()\"\n\t\t\t\t\t\t\t\t\t\t\t[mode]=\"mode()\"\n\t\t\t\t\t\t\t\t\t\t\t[path]=\"getRowSubFieldPath(i, subField.name)\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t@if (canRemoveRow()) {\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\tmcms-button\n\t\t\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\t\t\t\tclass=\"shrink-0 text-destructive hover:text-destructive\"\n\t\t\t\t\t\t\t\t\t\t(click)=\"removeRow(i)\"\n\t\t\t\t\t\t\t\t\t\t[attr.aria-label]=\"'Remove row ' + (i + 1)\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<ng-icon name=\"heroTrash\" size=\"16\" aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t</mcms-card-content>\n\t\t\t@if (canAddRow()) {\n\t\t\t\t<mcms-card-footer>\n\t\t\t\t\t<button mcms-button variant=\"outline\" (click)=\"addRow()\">\n\t\t\t\t\t\t<ng-icon name=\"heroPlus\" size=\"16\" aria-hidden=\"true\" />\n\t\t\t\t\t\tAdd Row\n\t\t\t\t\t</button>\n\t\t\t\t</mcms-card-footer>\n\t\t\t}\n\t\t</mcms-card>\n\t`,\n})\nexport class ArrayFieldRenderer {\n\t/** Field definition (must be an ArrayField) */\n\treadonly field = input.required<Field>();\n\n\t/** Signal forms FieldTree node for this array */\n\treadonly formNode = input<unknown>(null);\n\n\t/** Root signal forms FieldTree (for layout fields that look up child nodes) */\n\treadonly formTree = input<unknown>(null);\n\n\t/** Form model data (for condition evaluation and relationship filterOptions) */\n\treadonly formModel = input<Record<string, unknown>>({});\n\n\t/** Form mode */\n\treadonly mode = input<EntityFormMode>('create');\n\n\t/** Field path (e.g., \"features\") */\n\treadonly path = input.required<string>();\n\n\t/** Bridge: extract FieldState from formNode */\n\tprivate readonly nodeState = computed(() => getFieldNodeState(this.formNode()));\n\n\t/** Computed label */\n\treadonly label = computed(() => this.field().label || humanizeFieldName(this.field().name));\n\n\t/** Computed description */\n\treadonly description = computed(() => this.field().description || '');\n\n\t/** Sub-fields from the array definition */\n\treadonly subFields = computed((): Field[] => {\n\t\tconst f = this.field();\n\t\tif (f.type === 'array') {\n\t\t\treturn f.fields.filter((sf) => !sf.admin?.hidden);\n\t\t}\n\t\treturn [];\n\t});\n\n\t/** Min rows constraint */\n\treadonly minRows = computed((): number => {\n\t\tconst f = this.field();\n\t\treturn f.type === 'array' ? (f.minRows ?? 0) : 0;\n\t});\n\n\t/** Max rows constraint */\n\treadonly maxRows = computed((): number | undefined => {\n\t\tconst f = this.field();\n\t\treturn f.type === 'array' ? f.maxRows : undefined;\n\t});\n\n\t/** Current rows as array of objects (read from FieldState) */\n\treadonly rows = computed((): Record<string, unknown>[] => {\n\t\tconst state = this.nodeState();\n\t\tif (!state) return [];\n\t\tconst val = state.value();\n\t\tif (Array.isArray(val)) {\n\t\t\treturn val.map((item) => (isRecord(item) ? item : {}));\n\t\t}\n\t\treturn [];\n\t});\n\n\t/** Whether the field is disabled (view mode) */\n\treadonly isDisabled = computed(() => this.mode() === 'view');\n\n\t/** Whether a new row can be added */\n\treadonly canAddRow = computed((): boolean => {\n\t\tif (this.isDisabled()) return false;\n\t\tconst max = this.maxRows();\n\t\treturn max === undefined || this.rows().length < max;\n\t});\n\n\t/** Whether rows can be removed */\n\treadonly canRemoveRow = computed((): boolean => {\n\t\tif (this.isDisabled()) return false;\n\t\treturn this.rows().length > this.minRows();\n\t});\n\n\t/** Get a FieldTree sub-node for a row's sub-field */\n\tgetRowSubNode(rowIndex: number, subFieldName: string): unknown {\n\t\tconst rowNode = getSubNode(this.formNode(), rowIndex);\n\t\treturn getSubNode(rowNode, subFieldName);\n\t}\n\n\t/** Get the full path for a row's sub-field */\n\tgetRowSubFieldPath(rowIndex: number, subFieldName: string): string {\n\t\treturn `${this.path()}.${rowIndex}.${subFieldName}`;\n\t}\n\n\t/** Handle drag-drop reorder */\n\tonDrop(event: CdkDragDrop<unknown>): void {\n\t\tconst state = this.nodeState();\n\t\tif (!state) return;\n\t\tconst rows = [...this.rows()];\n\t\tmoveItemInArray(rows, event.previousIndex, event.currentIndex);\n\t\tstate.value.set(rows);\n\t}\n\n\t/** Add a new empty row */\n\taddRow(): void {\n\t\tconst state = this.nodeState();\n\t\tif (!state) return;\n\t\tconst rows = [...this.rows()];\n\t\tconst newRow: Record<string, unknown> = {};\n\t\tfor (const field of this.subFields()) {\n\t\t\tnewRow[field.name] = getFieldDefaultValue(field);\n\t\t}\n\t\trows.push(newRow);\n\t\tstate.value.set(rows);\n\t}\n\n\t/** Remove a row at the given index */\n\tremoveRow(index: number): void {\n\t\tconst state = this.nodeState();\n\t\tif (!state) return;\n\t\tconst rows = this.rows().filter((_, i) => i !== index);\n\t\tstate.value.set(rows);\n\t}\n}\n","import {\n\tChangeDetectionStrategy,\n\tComponent,\n\tcomputed,\n\teffect,\n\tforwardRef,\n\tinput,\n\tuntracked,\n} from '@angular/core';\nimport {\n\tCdkDropList,\n\tCdkDrag,\n\tCdkDragHandle,\n\ttype CdkDragDrop,\n\tmoveItemInArray,\n} from '@angular/cdk/drag-drop';\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroPlus, heroTrash, heroBars2 } from '@ng-icons/heroicons/outline';\nimport {\n\tCard,\n\tCardHeader,\n\tCardTitle,\n\tCardContent,\n\tCardFooter,\n\tButton,\n\tBadge,\n} from '@momentumcms/ui';\nimport { humanizeFieldName } from '@momentumcms/core';\nimport type { Field, BlockConfig } from '@momentumcms/core';\nimport type { EntityFormMode } from '../entity-form.types';\nimport {\n\tgetFieldNodeState,\n\tgetSubNode,\n\tisRecord,\n\tgetFieldDefaultValue,\n\tnormalizeBlockDefaults,\n} from '../entity-form.types';\nimport { FieldRenderer } from './field-renderer.component';\n\n/** Shape of a block item in the stored data */\ninterface BlockItem {\n\tblockType: string;\n\t[key: string]: unknown;\n}\n\n/**\n * Blocks field renderer.\n *\n * Renders a list of typed blocks. Each block has a `blockType` discriminator\n * and type-specific fields. Users can add, remove, and reorder blocks.\n * A dropdown allows selecting which block type to add.\n *\n * Data container pattern: passes block sub-field FieldTree nodes via\n * getSubNode(getSubNode(formNode, blockIndex), subFieldName).\n * Block mutations use nodeState.value.set(newArray).\n */\n@Component({\n\tselector: 'mcms-blocks-field-renderer',\n\timports: [\n\t\tCard,\n\t\tCardHeader,\n\t\tCardTitle,\n\t\tCardContent,\n\t\tCardFooter,\n\t\tButton,\n\t\tBadge,\n\t\tNgIcon,\n\t\tCdkDropList,\n\t\tCdkDrag,\n\t\tCdkDragHandle,\n\t\tforwardRef(() => FieldRenderer),\n\t],\n\tproviders: [provideIcons({ heroPlus, heroTrash, heroBars2 })],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\ttemplate: `\n\t\t<mcms-card>\n\t\t\t<mcms-card-header>\n\t\t\t\t<div class=\"flex items-center justify-between\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<mcms-card-title>{{ label() }}</mcms-card-title>\n\t\t\t\t\t\t@if (description()) {\n\t\t\t\t\t\t\t<p class=\"text-sm text-muted-foreground mt-1\">{{ description() }}</p>\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t\t<span class=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t{{ blocks().length }}{{ maxRows() ? ' / ' + maxRows() : '' }} blocks\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t</mcms-card-header>\n\t\t\t<mcms-card-content>\n\t\t\t\t@if (blocks().length === 0) {\n\t\t\t\t\t<p class=\"text-sm text-muted-foreground py-4 text-center\">\n\t\t\t\t\t\tNo blocks yet. Add a block to get started.\n\t\t\t\t\t</p>\n\t\t\t\t} @else {\n\t\t\t\t\t<div\n\t\t\t\t\t\tcdkDropList\n\t\t\t\t\t\t(cdkDropListDropped)=\"onDrop($event)\"\n\t\t\t\t\t\tclass=\"space-y-3\"\n\t\t\t\t\t\trole=\"list\"\n\t\t\t\t\t\taria-label=\"Content blocks\"\n\t\t\t\t\t>\n\t\t\t\t\t\t@for (block of blocks(); track $index; let i = $index) {\n\t\t\t\t\t\t\t<div cdkDrag class=\"border rounded-lg bg-card\" [cdkDragDisabled]=\"isDisabled()\">\n\t\t\t\t\t\t\t\t<div class=\"flex items-center gap-3 px-4 py-2 border-b bg-muted/50 rounded-t-lg\">\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tcdkDragHandle\n\t\t\t\t\t\t\t\t\t\tclass=\"cursor-grab text-muted-foreground hover:text-foreground\"\n\t\t\t\t\t\t\t\t\t\t[class.hidden]=\"isDisabled()\"\n\t\t\t\t\t\t\t\t\t\trole=\"button\"\n\t\t\t\t\t\t\t\t\t\ttabindex=\"0\"\n\t\t\t\t\t\t\t\t\t\t[attr.aria-label]=\"'Reorder ' + getBlockLabel(block.blockType) + ' block'\"\n\t\t\t\t\t\t\t\t\t\taria-roledescription=\"sortable\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<ng-icon name=\"heroBars2\" size=\"16\" aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<mcms-badge>{{ getBlockLabel(block.blockType) }}</mcms-badge>\n\t\t\t\t\t\t\t\t\t<div class=\"flex-1\"></div>\n\t\t\t\t\t\t\t\t\t@if (canRemoveBlock()) {\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\tmcms-button\n\t\t\t\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\t\t\t\t\tclass=\"h-7 w-7 text-destructive hover:text-destructive\"\n\t\t\t\t\t\t\t\t\t\t\t(click)=\"removeBlock(i)\"\n\t\t\t\t\t\t\t\t\t\t\t[attr.aria-label]=\"'Remove ' + getBlockLabel(block.blockType) + ' block'\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<ng-icon name=\"heroTrash\" size=\"14\" aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class=\"p-4 space-y-3\">\n\t\t\t\t\t\t\t\t\t@for (subField of getBlockFields(block.blockType); track subField.name) {\n\t\t\t\t\t\t\t\t\t\t<mcms-field-renderer\n\t\t\t\t\t\t\t\t\t\t\t[field]=\"subField\"\n\t\t\t\t\t\t\t\t\t\t\t[formNode]=\"getBlockSubNode(i, subField.name)\"\n\t\t\t\t\t\t\t\t\t\t\t[formTree]=\"formTree()\"\n\t\t\t\t\t\t\t\t\t\t\t[formModel]=\"formModel()\"\n\t\t\t\t\t\t\t\t\t\t\t[mode]=\"mode()\"\n\t\t\t\t\t\t\t\t\t\t\t[path]=\"getBlockSubFieldPath(i, subField.name)\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t</mcms-card-content>\n\t\t\t@if (canAddBlock()) {\n\t\t\t\t<mcms-card-footer>\n\t\t\t\t\t<div class=\"flex gap-2\">\n\t\t\t\t\t\t@for (blockDef of blockDefinitions(); track blockDef.slug) {\n\t\t\t\t\t\t\t<button mcms-button variant=\"outline\" (click)=\"addBlock(blockDef.slug)\">\n\t\t\t\t\t\t\t\t<ng-icon name=\"heroPlus\" size=\"16\" aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t{{ blockDef.labels?.singular || blockDef.slug }}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t</mcms-card-footer>\n\t\t\t}\n\t\t</mcms-card>\n\t`,\n})\nexport class BlocksFieldRenderer {\n\t/** Field definition (must be a BlocksField) */\n\treadonly field = input.required<Field>();\n\n\t/** Signal forms FieldTree node for this blocks array */\n\treadonly formNode = input<unknown>(null);\n\n\t/** Root signal forms FieldTree (for layout fields that look up child nodes) */\n\treadonly formTree = input<unknown>(null);\n\n\t/** Form model data (for condition evaluation and relationship filterOptions) */\n\treadonly formModel = input<Record<string, unknown>>({});\n\n\t/** Form mode */\n\treadonly mode = input<EntityFormMode>('create');\n\n\t/** Field path (e.g., \"content\") */\n\treadonly path = input.required<string>();\n\n\t/** Bridge: extract FieldState from formNode */\n\tprivate readonly nodeState = computed(() => getFieldNodeState(this.formNode()));\n\n\t/** Computed label */\n\treadonly label = computed(() => this.field().label || humanizeFieldName(this.field().name));\n\n\t/** Computed description */\n\treadonly description = computed(() => this.field().description || '');\n\n\t/** Block type definitions from the field */\n\treadonly blockDefinitions = computed((): BlockConfig[] => {\n\t\tconst f = this.field();\n\t\tif (f.type === 'blocks') {\n\t\t\treturn f.blocks;\n\t\t}\n\t\treturn [];\n\t});\n\n\t/** Min rows constraint */\n\treadonly minRows = computed((): number => {\n\t\tconst f = this.field();\n\t\treturn f.type === 'blocks' ? (f.minRows ?? 0) : 0;\n\t});\n\n\t/** Max rows constraint */\n\treadonly maxRows = computed((): number | undefined => {\n\t\tconst f = this.field();\n\t\treturn f.type === 'blocks' ? f.maxRows : undefined;\n\t});\n\n\t/** Current blocks as typed items (read from FieldState) */\n\treadonly blocks = computed((): BlockItem[] => {\n\t\tconst state = this.nodeState();\n\t\tif (!state) return [];\n\t\tconst val = state.value();\n\t\tif (Array.isArray(val)) {\n\t\t\treturn val.filter(\n\t\t\t\t(item): item is BlockItem => isRecord(item) && typeof item['blockType'] === 'string',\n\t\t\t);\n\t\t}\n\t\treturn [];\n\t});\n\n\t/**\n\t * Normalize loaded blocks: ensure every block has defaults for all definition fields.\n\t * Blocks saved before new fields were added won't have those keys, and\n\t * signal-forms only creates controls for keys present in the model.\n\t */\n\tprivate readonly _normalizeBlocks = effect(() => {\n\t\tconst state = this.nodeState();\n\t\tif (!state) return;\n\t\tconst val = state.value();\n\t\tif (!Array.isArray(val)) return;\n\n\t\tconst { normalized, changed } = normalizeBlockDefaults(val, this.blockDefMap());\n\t\tif (changed) {\n\t\t\tuntracked(() => state.value.set(normalized));\n\t\t}\n\t});\n\n\t/** Whether the field is disabled (view mode) */\n\treadonly isDisabled = computed(() => this.mode() === 'view');\n\n\t/** Whether a new block can be added */\n\treadonly canAddBlock = computed((): boolean => {\n\t\tif (this.isDisabled()) return false;\n\t\tconst max = this.maxRows();\n\t\treturn max === undefined || this.blocks().length < max;\n\t});\n\n\t/** Whether blocks can be removed */\n\treadonly canRemoveBlock = computed((): boolean => {\n\t\tif (this.isDisabled()) return false;\n\t\treturn this.blocks().length > this.minRows();\n\t});\n\n\t/** Block definition lookup cache */\n\tprivate readonly blockDefMap = computed((): Map<string, BlockConfig> => {\n\t\tconst map = new Map<string, BlockConfig>();\n\t\tfor (const def of this.blockDefinitions()) {\n\t\t\tmap.set(def.slug, def);\n\t\t}\n\t\treturn map;\n\t});\n\n\t/** Get display label for a block type */\n\tgetBlockLabel(blockType: string): string {\n\t\tconst def = this.blockDefMap().get(blockType);\n\t\treturn def?.labels?.singular || blockType;\n\t}\n\n\t/** Get fields for a block type */\n\tgetBlockFields(blockType: string): Field[] {\n\t\tconst def = this.blockDefMap().get(blockType);\n\t\treturn def?.fields.filter((f) => !f.admin?.hidden) ?? [];\n\t}\n\n\t/** Get a FieldTree sub-node for a block's sub-field */\n\tgetBlockSubNode(blockIndex: number, subFieldName: string): unknown {\n\t\tconst blockNode = getSubNode(this.formNode(), blockIndex);\n\t\treturn getSubNode(blockNode, subFieldName);\n\t}\n\n\t/** Get the full path for a block's sub-field */\n\tgetBlockSubFieldPath(blockIndex: number, subFieldName: string): string {\n\t\treturn `${this.path()}.${blockIndex}.${subFieldName}`;\n\t}\n\n\t/** Handle drag-drop reorder */\n\tonDrop(event: CdkDragDrop<unknown>): void {\n\t\tconst state = this.nodeState();\n\t\tif (!state) return;\n\t\tconst blocks = [...this.blocks()];\n\t\tmoveItemInArray(blocks, event.previousIndex, event.currentIndex);\n\t\tstate.value.set(blocks);\n\t}\n\n\t/** Add a new block of the given type */\n\taddBlock(blockType: string): void {\n\t\tconst def = this.blockDefMap().get(blockType);\n\t\tif (!def) return;\n\t\tconst state = this.nodeState();\n\t\tif (!state) return;\n\n\t\tconst newBlock: BlockItem = { blockType };\n\t\tfor (const field of def.fields) {\n\t\t\tnewBlock[field.name] = getFieldDefaultValue(field);\n\t\t}\n\n\t\tconst blocks = [...this.blocks(), newBlock];\n\t\tstate.value.set(blocks);\n\t}\n\n\t/** Remove a block at the given index */\n\tremoveBlock(index: number): void {\n\t\tconst state = this.nodeState();\n\t\tif (!state) return;\n\t\tconst blocks = this.blocks().filter((_, i) => i !== index);\n\t\tstate.value.set(blocks);\n\t}\n}\n","import {\n\tChangeDetectionStrategy,\n\tComponent,\n\tcomputed,\n\teffect,\n\tinject,\n\tinput,\n\tsignal,\n} from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport type { Subscription } from 'rxjs';\nimport { McmsFormField, Badge } from '@momentumcms/ui';\nimport type { ValidationError } from '@momentumcms/ui';\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroXMark, heroPlus, heroEye } from '@ng-icons/heroicons/outline';\nimport { EntitySheetService } from '../../../services/entity-sheet.service';\nimport { humanizeFieldName } from '@momentumcms/core';\nimport type { Field } from '@momentumcms/core';\nimport type { EntityFormMode } from '../entity-form.types';\nimport { getFieldNodeState, isRecord, getTitleField } from '../entity-form.types';\n\n/** Option for the relationship dropdown */\ninterface RelationshipOption {\n\tvalue: string;\n\tlabel: string;\n}\n\n/**\n * Relationship field renderer.\n *\n * Fetches related collection documents and renders a dropdown selector.\n * Supports single select (default) and multi-select (hasMany: true).\n * Multi-select shows selected items as badges with remove buttons.\n *\n * Uses Angular Signal Forms bridge pattern: reads/writes value via\n * a FieldTree node's FieldState rather than event-based I/O.\n */\n@Component({\n\tselector: 'mcms-relationship-field-renderer',\n\timports: [McmsFormField, Badge, NgIcon],\n\tproviders: [provideIcons({ heroXMark, heroPlus, heroEye })],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: { class: 'block' },\n\ttemplate: `\n\t\t<mcms-form-field\n\t\t\t[id]=\"fieldId()\"\n\t\t\t[required]=\"required()\"\n\t\t\t[disabled]=\"isDisabled()\"\n\t\t\t[errors]=\"touchedErrors()\"\n\t\t>\n\t\t\t<span mcmsLabel>{{ label() }}</span>\n\n\t\t\t@if (isLoading()) {\n\t\t\t\t<p class=\"text-sm text-muted-foreground py-2\">Loading options...</p>\n\t\t\t} @else if (isMulti()) {\n\t\t\t\t@if (selectedOptions().length > 0) {\n\t\t\t\t\t<div class=\"flex flex-wrap gap-1 mb-2\">\n\t\t\t\t\t\t@for (opt of selectedOptions(); track opt.value) {\n\t\t\t\t\t\t\t<mcms-badge variant=\"secondary\">\n\t\t\t\t\t\t\t\t{{ opt.label }}\n\t\t\t\t\t\t\t\t@if (!isDisabled()) {\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tclass=\"ml-1 hover:text-destructive\"\n\t\t\t\t\t\t\t\t\t\t(click)=\"removeSelection(opt.value)\"\n\t\t\t\t\t\t\t\t\t\t[attr.aria-label]=\"'Remove ' + opt.label\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<ng-icon name=\"heroXMark\" size=\"12\" aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t</mcms-badge>\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t\t@if (!isDisabled()) {\n\t\t\t\t\t<select\n\t\t\t\t\t\t[id]=\"fieldId()\"\n\t\t\t\t\t\tclass=\"flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm text-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\"\n\t\t\t\t\t\t(change)=\"onMultiSelect($event)\"\n\t\t\t\t\t\t(blur)=\"onBlur()\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<option value=\"\">Add {{ relatedLabel() }}...</option>\n\t\t\t\t\t\t@for (opt of availableOptions(); track opt.value) {\n\t\t\t\t\t\t\t<option [value]=\"opt.value\">{{ opt.label }}</option>\n\t\t\t\t\t\t}\n\t\t\t\t\t</select>\n\t\t\t\t}\n\t\t\t} @else {\n\t\t\t\t<select\n\t\t\t\t\t[id]=\"fieldId()\"\n\t\t\t\t\t[disabled]=\"isDisabled()\"\n\t\t\t\t\tclass=\"flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\"\n\t\t\t\t\t(change)=\"onSingleSelect($event)\"\n\t\t\t\t\t(blur)=\"onBlur()\"\n\t\t\t\t>\n\t\t\t\t\t<option value=\"\">Select {{ relatedLabel() }}...</option>\n\t\t\t\t\t@for (opt of allOptions(); track opt.value) {\n\t\t\t\t\t\t<option [value]=\"opt.value\" [selected]=\"opt.value === singleValue()\">\n\t\t\t\t\t\t\t{{ opt.label }}\n\t\t\t\t\t\t</option>\n\t\t\t\t\t}\n\t\t\t\t</select>\n\t\t\t}\n\t\t</mcms-form-field>\n\n\t\t@if (entitySheetService && !isDisabled()) {\n\t\t\t<div class=\"flex gap-2 mt-1.5\">\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"inline-flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground transition-colors\"\n\t\t\t\t\t(click)=\"onCreateRelated()\"\n\t\t\t\t\t[attr.aria-label]=\"'Create new ' + relatedLabel()\"\n\t\t\t\t>\n\t\t\t\t\t<ng-icon name=\"heroPlus\" size=\"14\" aria-hidden=\"true\" />\n\t\t\t\t\tNew\n\t\t\t\t</button>\n\t\t\t\t@if (hasSelection()) {\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=\"inline-flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground transition-colors\"\n\t\t\t\t\t\t(click)=\"onViewRelated()\"\n\t\t\t\t\t\t[attr.aria-label]=\"'View ' + relatedLabel()\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<ng-icon name=\"heroEye\" size=\"14\" aria-hidden=\"true\" />\n\t\t\t\t\t\tView\n\t\t\t\t\t</button>\n\t\t\t\t}\n\t\t\t</div>\n\t\t}\n\t`,\n})\nexport class RelationshipFieldRenderer {\n\tprivate readonly http = inject(HttpClient);\n\treadonly entitySheetService = inject(EntitySheetService, { optional: true });\n\n\t/** Field definition (must be a RelationshipField) */\n\treadonly field = input.required<Field>();\n\n\t/** Signal forms FieldTree node for this field */\n\treadonly formNode = input<unknown>(null);\n\n\t/** Form mode */\n\treadonly mode = input<EntityFormMode>('create');\n\n\t/** Field path */\n\treadonly path = input.required<string>();\n\n\t/** Full form model data (used for filterOptions) */\n\treadonly formModel = input<Record<string, unknown>>({});\n\n\t/** Bridge: extract FieldState from formNode */\n\tprivate readonly nodeState = computed(() => getFieldNodeState(this.formNode()));\n\n\t/** Loaded options from related collection */\n\treadonly allOptions = signal<RelationshipOption[]>([]);\n\n\t/** Loading state */\n\treadonly isLoading = signal(false);\n\n\t/** Unique field ID */\n\treadonly fieldId = computed(() => `field-${this.path().replace(/\\./g, '-')}`);\n\n\t/** Computed label */\n\treadonly label = computed(() => this.field().label || humanizeFieldName(this.field().name));\n\n\t/** Whether the field is required */\n\treadonly required = computed(() => this.field().required ?? false);\n\n\t/** Whether the field is disabled */\n\treadonly isDisabled = computed(\n\t\t() => this.mode() === 'view' || (this.field().admin?.readOnly ?? false),\n\t);\n\n\t/** Whether this is a hasMany relationship */\n\treadonly isMulti = computed((): boolean => {\n\t\tconst f = this.field();\n\t\treturn f.type === 'relationship' ? (f.hasMany ?? false) : false;\n\t});\n\n\t/** Related collection slug extracted from the lazy collection reference */\n\treadonly relatedSlug = computed((): string => {\n\t\tconst f = this.field();\n\t\tif (f.type === 'relationship') {\n\t\t\tconst config = f.collection();\n\t\t\tif (isRecord(config) && typeof config['slug'] === 'string') {\n\t\t\t\treturn config['slug'];\n\t\t\t}\n\t\t}\n\t\treturn '';\n\t});\n\n\t/** The field name used to display document titles */\n\treadonly titleField = computed((): string => {\n\t\tconst f = this.field();\n\t\tif (f.type !== 'relationship') return 'id';\n\n\t\tconst config = f.collection();\n\t\tif (!isRecord(config)) return 'id';\n\n\t\treturn getTitleField(config);\n\t});\n\n\t/** Label for the related collection (singular) */\n\treadonly relatedLabel = computed((): string => {\n\t\tconst f = this.field();\n\t\tif (f.type !== 'relationship') return 'item';\n\n\t\tconst config = f.collection();\n\t\tif (!isRecord(config)) return 'item';\n\n\t\tconst labels = config['labels'];\n\t\tif (isRecord(labels) && typeof labels['singular'] === 'string') {\n\t\t\treturn labels['singular'];\n\t\t}\n\t\tif (typeof config['slug'] === 'string') {\n\t\t\treturn config['slug'];\n\t\t}\n\t\treturn 'item';\n\t});\n\n\t/** Current value for single-select mode */\n\treadonly singleValue = computed((): string => {\n\t\tconst state = this.nodeState();\n\t\tif (!state) return '';\n\t\tconst val = state.value();\n\t\tif (typeof val === 'string') return val;\n\t\t// Handle populated objects with an id\n\t\tif (isRecord(val) && typeof val['id'] === 'string') return val['id'];\n\t\treturn '';\n\t});\n\n\t/** Current values for multi-select mode */\n\treadonly multiValues = computed((): string[] => {\n\t\tconst state = this.nodeState();\n\t\tif (!state) return [];\n\t\tconst val = state.value();\n\t\tif (!Array.isArray(val)) return [];\n\t\treturn val\n\t\t\t.map((item: unknown) => {\n\t\t\t\tif (typeof item === 'string') return item;\n\t\t\t\tif (isRecord(item) && typeof item['id'] === 'string') return item['id'];\n\t\t\t\treturn '';\n\t\t\t})\n\t\t\t.filter((v: string) => v !== '');\n\t});\n\n\t/** Selected options for multi-select display (resolved to labels) */\n\treadonly selectedOptions = computed((): RelationshipOption[] => {\n\t\tconst values = this.multiValues();\n\t\tconst options = this.allOptions();\n\t\treturn values\n\t\t\t.map((v) => options.find((opt) => opt.value === v))\n\t\t\t.filter((opt): opt is RelationshipOption => opt !== undefined);\n\t});\n\n\t/** Available options for multi-select (excludes already selected) */\n\treadonly availableOptions = computed((): RelationshipOption[] => {\n\t\tconst selected = new Set(this.multiValues());\n\t\treturn this.allOptions().filter((opt) => !selected.has(opt.value));\n\t});\n\n\t/** Validation errors shown only when field is touched */\n\treadonly touchedErrors = computed((): readonly ValidationError[] => {\n\t\tconst state = this.nodeState();\n\t\tif (!state || !state.touched()) return [];\n\t\treturn state.errors().map((e) => ({ kind: e.kind, message: e.message }));\n\t});\n\n\tconstructor() {\n\t\t// Fetch related collection docs when the slug is resolved.\n\t\t// Uses onCleanup to cancel in-flight requests if the slug changes.\n\t\teffect((onCleanup) => {\n\t\t\tconst slug = this.relatedSlug();\n\t\t\tif (slug) {\n\t\t\t\tconst sub = this.fetchOptions(slug);\n\t\t\t\tonCleanup(() => sub.unsubscribe());\n\t\t\t}\n\t\t});\n\t}\n\n\t/** Handle single-select change */\n\tonSingleSelect(event: Event): void {\n\t\tconst target = event.target;\n\t\tif (target instanceof HTMLSelectElement) {\n\t\t\tconst state = this.nodeState();\n\t\t\tif (state) {\n\t\t\t\tstate.value.set(target.value || null);\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Handle multi-select add */\n\tonMultiSelect(event: Event): void {\n\t\tconst target = event.target;\n\t\tif (!(target instanceof HTMLSelectElement)) return;\n\n\t\tconst selectedValue = target.value;\n\t\tif (!selectedValue) return;\n\n\t\tconst state = this.nodeState();\n\t\tif (!state) return;\n\n\t\tconst currentValues = this.multiValues();\n\t\tif (!currentValues.includes(selectedValue)) {\n\t\t\tstate.value.set([...currentValues, selectedValue]);\n\t\t}\n\t\t// Reset dropdown to placeholder\n\t\ttarget.value = '';\n\t}\n\n\t/** Remove a value from multi-select */\n\tremoveSelection(valueToRemove: string): void {\n\t\tconst state = this.nodeState();\n\t\tif (!state) return;\n\t\tconst currentValues = this.multiValues();\n\t\tstate.value.set(currentValues.filter((v) => v !== valueToRemove));\n\t}\n\n\t/** Whether there is a current selection (for showing \"View\" button) */\n\treadonly hasSelection = computed(\n\t\t(): boolean => !!this.singleValue() || this.multiValues().length > 0,\n\t);\n\n\t/**\n\t * Handle blur from select elements.\n\t */\n\tonBlur(): void {\n\t\tconst state = this.nodeState();\n\t\tif (state) state.markAsTouched();\n\t}\n\n\t/** Open the entity sheet to create a new related entity */\n\tonCreateRelated(): void {\n\t\tconst slug = this.relatedSlug();\n\t\tif (!slug || !this.entitySheetService) return;\n\n\t\tthis.entitySheetService.openCreate(slug).subscribe((result) => {\n\t\t\tif (result.action === 'created' && result.entity) {\n\t\t\t\tconst state = this.nodeState();\n\t\t\t\tif (!state) return;\n\n\t\t\t\tconst entityId = String(result.entity.id);\n\t\t\t\tif (this.isMulti()) {\n\t\t\t\t\tconst current = this.multiValues();\n\t\t\t\t\tstate.value.set([...current, entityId]);\n\t\t\t\t} else {\n\t\t\t\t\tstate.value.set(entityId);\n\t\t\t\t}\n\n\t\t\t\t// Refresh options to include the newly created entity\n\t\t\t\tthis.fetchOptions(slug);\n\t\t\t}\n\t\t});\n\t}\n\n\t/** Open the entity sheet to view the selected related entity */\n\tonViewRelated(): void {\n\t\tconst slug = this.relatedSlug();\n\t\tif (!slug || !this.entitySheetService) return;\n\n\t\tconst id = this.isMulti() ? this.multiValues()[0] : this.singleValue();\n\t\tif (!id) return;\n\n\t\tthis.entitySheetService.openView(slug, id).subscribe((result) => {\n\t\t\tif (result.action === 'deleted') {\n\t\t\t\tconst state = this.nodeState();\n\t\t\t\tif (!state) return;\n\n\t\t\t\t// Clear the deleted entity from the selection\n\t\t\t\tif (this.isMulti()) {\n\t\t\t\t\tconst current = this.multiValues();\n\t\t\t\t\tstate.value.set(current.filter((v) => v !== id));\n\t\t\t\t} else {\n\t\t\t\t\tstate.value.set(null);\n\t\t\t\t}\n\n\t\t\t\t// Refresh options to remove the deleted entity\n\t\t\t\tthis.fetchOptions(slug);\n\t\t\t}\n\t\t});\n\t}\n\n\t/** Fetch options from the related collection API, returns subscription for cleanup */\n\tfetchOptions(slug: string): Subscription {\n\t\tthis.isLoading.set(true);\n\t\tconst titleField = this.titleField();\n\n\t\t// Build query params, including filterOptions if defined\n\t\tconst params: Record<string, string> = { limit: '100' };\n\t\tconst f = this.field();\n\t\tif (f.type === 'relationship' && f.filterOptions) {\n\t\t\tconst whereClause = f.filterOptions({ data: this.formModel() });\n\t\t\tfor (const [key, val] of Object.entries(whereClause)) {\n\t\t\t\tif (val !== undefined && val !== null) {\n\t\t\t\t\tparams[`where[${key}]`] = String(val);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.http\n\t\t\t.get<{ docs?: Array<Record<string, unknown>> }>(`/api/${slug}`, {\n\t\t\t\tparams,\n\t\t\t})\n\t\t\t.subscribe({\n\t\t\t\tnext: (response) => {\n\t\t\t\t\tconst docs = response.docs ?? [];\n\t\t\t\t\tconst options: RelationshipOption[] = docs.map((doc) => {\n\t\t\t\t\t\tconst id = typeof doc['id'] === 'string' ? doc['id'] : String(doc['id'] ?? '');\n\t\t\t\t\t\tconst titleValue = doc[titleField];\n\t\t\t\t\t\tconst label = titleField !== 'id' && typeof titleValue === 'string' ? titleValue : id;\n\t\t\t\t\t\treturn { value: id, label };\n\t\t\t\t\t});\n\t\t\t\t\tthis.allOptions.set(options);\n\t\t\t\t\tthis.isLoading.set(false);\n\t\t\t\t},\n\t\t\t\terror: (err: unknown) => {\n\t\t\t\t\tconsole.error(`Failed to load relationship options for \"${slug}\":`, err);\n\t\t\t\t\tthis.allOptions.set([]);\n\t\t\t\t\tthis.isLoading.set(false);\n\t\t\t\t},\n\t\t\t});\n\t}\n}\n","import {\n\tafterNextRender,\n\tChangeDetectionStrategy,\n\tComponent,\n\tcomputed,\n\tDestroyRef,\n\teffect,\n\tElementRef,\n\tinject,\n\tinput,\n\tsignal,\n\tviewChild,\n} from '@angular/core';\nimport { McmsFormField } from '@momentumcms/ui';\nimport type { ValidationError } from '@momentumcms/ui';\nimport { humanizeFieldName } from '@momentumcms/core';\nimport type { Field } from '@momentumcms/core';\nimport type { EntityFormMode } from '../entity-form.types';\nimport { getFieldNodeState } from '../entity-form.types';\nimport { Editor } from '@tiptap/core';\nimport StarterKit from '@tiptap/starter-kit';\nimport Underline from '@tiptap/extension-underline';\nimport Link from '@tiptap/extension-link';\nimport Placeholder from '@tiptap/extension-placeholder';\n\n/**\n * Rich text field renderer using TipTap editor.\n * Provides a toolbar with formatting options and stores content as HTML.\n *\n * Uses Angular Signal Forms bridge pattern: reads/writes value via\n * a FieldTree node's FieldState rather than event-based I/O.\n */\n@Component({\n\tselector: 'mcms-rich-text-field-renderer',\n\timports: [McmsFormField],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: { class: 'block' },\n\ttemplate: `\n\t\t<mcms-form-field\n\t\t\t[id]=\"fieldId()\"\n\t\t\t[required]=\"required()\"\n\t\t\t[disabled]=\"isDisabled()\"\n\t\t\t[errors]=\"touchedErrors()\"\n\t\t>\n\t\t\t<span mcmsLabel>{{ label() }}</span>\n\n\t\t\t@if (!isDisabled()) {\n\t\t\t\t<div\n\t\t\t\t\tclass=\"rounded-md border border-input bg-background focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2\"\n\t\t\t\t>\n\t\t\t\t\t<!-- Toolbar -->\n\t\t\t\t\t<div\n\t\t\t\t\t\tclass=\"flex flex-wrap items-center gap-0.5 border-b border-input px-1 py-1\"\n\t\t\t\t\t\trole=\"toolbar\"\n\t\t\t\t\t\t[attr.aria-label]=\"label() + ' formatting'\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"inline-flex h-8 w-8 items-center justify-center rounded text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground\"\n\t\t\t\t\t\t\t[class.bg-accent]=\"isBold()\"\n\t\t\t\t\t\t\t[class.text-accent-foreground]=\"isBold()\"\n\t\t\t\t\t\t\ttitle=\"Bold (Ctrl+B)\"\n\t\t\t\t\t\t\taria-label=\"Bold\"\n\t\t\t\t\t\t\t[attr.aria-pressed]=\"isBold()\"\n\t\t\t\t\t\t\t(click)=\"toggleBold()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\tclass=\"h-4 w-4\"\n\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\tstroke-width=\"3\"\n\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<path d=\"M6 4h8a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z\" />\n\t\t\t\t\t\t\t\t<path d=\"M6 12h9a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z\" />\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"inline-flex h-8 w-8 items-center justify-center rounded text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground\"\n\t\t\t\t\t\t\t[class.bg-accent]=\"isItalic()\"\n\t\t\t\t\t\t\t[class.text-accent-foreground]=\"isItalic()\"\n\t\t\t\t\t\t\ttitle=\"Italic (Ctrl+I)\"\n\t\t\t\t\t\t\taria-label=\"Italic\"\n\t\t\t\t\t\t\t[attr.aria-pressed]=\"isItalic()\"\n\t\t\t\t\t\t\t(click)=\"toggleItalic()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\tclass=\"h-4 w-4\"\n\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<line x1=\"19\" y1=\"4\" x2=\"10\" y2=\"4\" />\n\t\t\t\t\t\t\t\t<line x1=\"14\" y1=\"20\" x2=\"5\" y2=\"20\" />\n\t\t\t\t\t\t\t\t<line x1=\"15\" y1=\"4\" x2=\"9\" y2=\"20\" />\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"inline-flex h-8 w-8 items-center justify-center rounded text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground\"\n\t\t\t\t\t\t\t[class.bg-accent]=\"isUnderline()\"\n\t\t\t\t\t\t\t[class.text-accent-foreground]=\"isUnderline()\"\n\t\t\t\t\t\t\ttitle=\"Underline (Ctrl+U)\"\n\t\t\t\t\t\t\taria-label=\"Underline\"\n\t\t\t\t\t\t\t[attr.aria-pressed]=\"isUnderline()\"\n\t\t\t\t\t\t\t(click)=\"toggleUnderline()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\tclass=\"h-4 w-4\"\n\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<path d=\"M6 3v7a6 6 0 0 0 6 6 6 6 0 0 0 6-6V3\" />\n\t\t\t\t\t\t\t\t<line x1=\"4\" y1=\"21\" x2=\"20\" y2=\"21\" />\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"inline-flex h-8 w-8 items-center justify-center rounded text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground\"\n\t\t\t\t\t\t\t[class.bg-accent]=\"isStrike()\"\n\t\t\t\t\t\t\t[class.text-accent-foreground]=\"isStrike()\"\n\t\t\t\t\t\t\ttitle=\"Strikethrough\"\n\t\t\t\t\t\t\taria-label=\"Strikethrough\"\n\t\t\t\t\t\t\t[attr.aria-pressed]=\"isStrike()\"\n\t\t\t\t\t\t\t(click)=\"toggleStrike()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\tclass=\"h-4 w-4\"\n\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<path d=\"M16 4H9a3 3 0 0 0-2.83 4\" />\n\t\t\t\t\t\t\t\t<path d=\"M14 12a4 4 0 0 1 0 8H6\" />\n\t\t\t\t\t\t\t\t<line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" />\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t<div class=\"mx-1 h-6 w-px bg-border\" role=\"separator\"></div>\n\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"inline-flex h-8 w-8 items-center justify-center rounded text-sm font-bold transition-colors hover:bg-accent hover:text-accent-foreground\"\n\t\t\t\t\t\t\t[class.bg-accent]=\"isHeading1()\"\n\t\t\t\t\t\t\t[class.text-accent-foreground]=\"isHeading1()\"\n\t\t\t\t\t\t\ttitle=\"Heading 1\"\n\t\t\t\t\t\t\taria-label=\"Heading 1\"\n\t\t\t\t\t\t\t[attr.aria-pressed]=\"isHeading1()\"\n\t\t\t\t\t\t\t(click)=\"toggleHeading(1)\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tH1\n\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"inline-flex h-8 w-8 items-center justify-center rounded text-sm font-bold transition-colors hover:bg-accent hover:text-accent-foreground\"\n\t\t\t\t\t\t\t[class.bg-accent]=\"isHeading2()\"\n\t\t\t\t\t\t\t[class.text-accent-foreground]=\"isHeading2()\"\n\t\t\t\t\t\t\ttitle=\"Heading 2\"\n\t\t\t\t\t\t\taria-label=\"Heading 2\"\n\t\t\t\t\t\t\t[attr.aria-pressed]=\"isHeading2()\"\n\t\t\t\t\t\t\t(click)=\"toggleHeading(2)\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tH2\n\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"inline-flex h-8 w-8 items-center justify-center rounded text-sm font-bold transition-colors hover:bg-accent hover:text-accent-foreground\"\n\t\t\t\t\t\t\t[class.bg-accent]=\"isHeading3()\"\n\t\t\t\t\t\t\t[class.text-accent-foreground]=\"isHeading3()\"\n\t\t\t\t\t\t\ttitle=\"Heading 3\"\n\t\t\t\t\t\t\taria-label=\"Heading 3\"\n\t\t\t\t\t\t\t[attr.aria-pressed]=\"isHeading3()\"\n\t\t\t\t\t\t\t(click)=\"toggleHeading(3)\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tH3\n\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t<div class=\"mx-1 h-6 w-px bg-border\" role=\"separator\"></div>\n\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"inline-flex h-8 w-8 items-center justify-center rounded text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground\"\n\t\t\t\t\t\t\t[class.bg-accent]=\"isBulletList()\"\n\t\t\t\t\t\t\t[class.text-accent-foreground]=\"isBulletList()\"\n\t\t\t\t\t\t\ttitle=\"Bullet List\"\n\t\t\t\t\t\t\taria-label=\"Bullet list\"\n\t\t\t\t\t\t\t[attr.aria-pressed]=\"isBulletList()\"\n\t\t\t\t\t\t\t(click)=\"toggleBulletList()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\tclass=\"h-4 w-4\"\n\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<line x1=\"8\" y1=\"6\" x2=\"21\" y2=\"6\" />\n\t\t\t\t\t\t\t\t<line x1=\"8\" y1=\"12\" x2=\"21\" y2=\"12\" />\n\t\t\t\t\t\t\t\t<line x1=\"8\" y1=\"18\" x2=\"21\" y2=\"18\" />\n\t\t\t\t\t\t\t\t<line x1=\"3\" y1=\"6\" x2=\"3.01\" y2=\"6\" />\n\t\t\t\t\t\t\t\t<line x1=\"3\" y1=\"12\" x2=\"3.01\" y2=\"12\" />\n\t\t\t\t\t\t\t\t<line x1=\"3\" y1=\"18\" x2=\"3.01\" y2=\"18\" />\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"inline-flex h-8 w-8 items-center justify-center rounded text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground\"\n\t\t\t\t\t\t\t[class.bg-accent]=\"isOrderedList()\"\n\t\t\t\t\t\t\t[class.text-accent-foreground]=\"isOrderedList()\"\n\t\t\t\t\t\t\ttitle=\"Numbered List\"\n\t\t\t\t\t\t\taria-label=\"Numbered list\"\n\t\t\t\t\t\t\t[attr.aria-pressed]=\"isOrderedList()\"\n\t\t\t\t\t\t\t(click)=\"toggleOrderedList()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\tclass=\"h-4 w-4\"\n\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<line x1=\"10\" y1=\"6\" x2=\"21\" y2=\"6\" />\n\t\t\t\t\t\t\t\t<line x1=\"10\" y1=\"12\" x2=\"21\" y2=\"12\" />\n\t\t\t\t\t\t\t\t<line x1=\"10\" y1=\"18\" x2=\"21\" y2=\"18\" />\n\t\t\t\t\t\t\t\t<path d=\"M4 6h1v4\" />\n\t\t\t\t\t\t\t\t<path d=\"M4 10h2\" />\n\t\t\t\t\t\t\t\t<path d=\"M6 18H4c0-1 2-2 2-3s-1-1.5-2-1\" />\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t<div class=\"mx-1 h-6 w-px bg-border\" role=\"separator\"></div>\n\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"inline-flex h-8 w-8 items-center justify-center rounded text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground\"\n\t\t\t\t\t\t\t[class.bg-accent]=\"isBlockquote()\"\n\t\t\t\t\t\t\t[class.text-accent-foreground]=\"isBlockquote()\"\n\t\t\t\t\t\t\ttitle=\"Blockquote\"\n\t\t\t\t\t\t\taria-label=\"Blockquote\"\n\t\t\t\t\t\t\t[attr.aria-pressed]=\"isBlockquote()\"\n\t\t\t\t\t\t\t(click)=\"toggleBlockquote()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"h-4 w-4\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\td=\"M4.583 17.321C3.553 16.227 3 15 3 13.011c0-3.5 2.457-6.637 6.03-8.188l.893 1.378c-3.335 1.804-3.987 4.145-4.247 5.621.537-.278 1.24-.375 1.929-.311 1.804.167 3.226 1.648 3.226 3.489a3.5 3.5 0 01-3.5 3.5c-1.073 0-2.099-.49-2.748-1.179zm10 0C13.553 16.227 13 15 13 13.011c0-3.5 2.457-6.637 6.03-8.188l.893 1.378c-3.335 1.804-3.987 4.145-4.247 5.621.537-.278 1.24-.375 1.929-.311 1.804.167 3.226 1.648 3.226 3.489a3.5 3.5 0 01-3.5 3.5c-1.073 0-2.099-.49-2.748-1.179z\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"inline-flex h-8 w-8 items-center justify-center rounded text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground\"\n\t\t\t\t\t\t\t[class.bg-accent]=\"isCodeBlock()\"\n\t\t\t\t\t\t\t[class.text-accent-foreground]=\"isCodeBlock()\"\n\t\t\t\t\t\t\ttitle=\"Code Block\"\n\t\t\t\t\t\t\taria-label=\"Code block\"\n\t\t\t\t\t\t\t[attr.aria-pressed]=\"isCodeBlock()\"\n\t\t\t\t\t\t\t(click)=\"toggleCodeBlock()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\tclass=\"h-4 w-4\"\n\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<polyline points=\"16 18 22 12 16 6\" />\n\t\t\t\t\t\t\t\t<polyline points=\"8 6 2 12 8 18\" />\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"inline-flex h-8 w-8 items-center justify-center rounded text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground\"\n\t\t\t\t\t\t\ttitle=\"Horizontal Rule\"\n\t\t\t\t\t\t\taria-label=\"Horizontal rule\"\n\t\t\t\t\t\t\t(click)=\"insertHorizontalRule()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\tclass=\"h-4 w-4\"\n\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\" />\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<!-- Editor content area -->\n\t\t\t\t\t<div\n\t\t\t\t\t\t#editorElement\n\t\t\t\t\t\tclass=\"tiptap-editor prose prose-sm dark:prose-invert max-w-none px-3 py-2\"\n\t\t\t\t\t\tdata-testid=\"rich-text-editor\"\n\t\t\t\t\t></div>\n\t\t\t\t</div>\n\t\t\t} @else {\n\t\t\t\t<!-- Read-only view -->\n\t\t\t\t<div\n\t\t\t\t\tclass=\"prose prose-sm dark:prose-invert max-w-none rounded-md border border-input bg-muted/50 px-3 py-2\"\n\t\t\t\t\t[innerHTML]=\"stringValue()\"\n\t\t\t\t></div>\n\t\t\t}\n\t\t</mcms-form-field>\n\t`,\n\tstyles: `\n\t\t:host ::ng-deep .tiptap-editor {\n\t\t\tmin-height: 200px;\n\t\t\toutline: none;\n\t\t}\n\n\t\t:host ::ng-deep .tiptap-editor .ProseMirror {\n\t\t\toutline: none;\n\t\t\tmin-height: 200px;\n\t\t}\n\n\t\t:host ::ng-deep .tiptap-editor .ProseMirror p.is-editor-empty:first-child::before {\n\t\t\tcontent: attr(data-placeholder);\n\t\t\tfloat: left;\n\t\t\tcolor: hsl(var(--mcms-muted-foreground));\n\t\t\tpointer-events: none;\n\t\t\theight: 0;\n\t\t}\n\n\t\t:host ::ng-deep .tiptap-editor .ProseMirror h1 {\n\t\t\tfont-size: 1.5em;\n\t\t\tfont-weight: 700;\n\t\t\tmargin: 0.5em 0;\n\t\t}\n\n\t\t:host ::ng-deep .tiptap-editor .ProseMirror h2 {\n\t\t\tfont-size: 1.25em;\n\t\t\tfont-weight: 600;\n\t\t\tmargin: 0.5em 0;\n\t\t}\n\n\t\t:host ::ng-deep .tiptap-editor .ProseMirror h3 {\n\t\t\tfont-size: 1.1em;\n\t\t\tfont-weight: 600;\n\t\t\tmargin: 0.5em 0;\n\t\t}\n\n\t\t:host ::ng-deep .tiptap-editor .ProseMirror ul {\n\t\t\tlist-style: disc;\n\t\t\tpadding-left: 1.5em;\n\t\t}\n\n\t\t:host ::ng-deep .tiptap-editor .ProseMirror ol {\n\t\t\tlist-style: decimal;\n\t\t\tpadding-left: 1.5em;\n\t\t}\n\n\t\t:host ::ng-deep .tiptap-editor .ProseMirror blockquote {\n\t\t\tborder-left: 3px solid hsl(var(--mcms-border));\n\t\t\tpadding-left: 1em;\n\t\t\tmargin-left: 0;\n\t\t\tcolor: hsl(var(--mcms-muted-foreground));\n\t\t}\n\n\t\t:host ::ng-deep .tiptap-editor .ProseMirror pre {\n\t\t\tbackground: hsl(var(--mcms-muted));\n\t\t\tborder-radius: 0.375rem;\n\t\t\tpadding: 0.75em;\n\t\t\tfont-family: monospace;\n\t\t\tfont-size: 0.875em;\n\t\t}\n\n\t\t:host ::ng-deep .tiptap-editor .ProseMirror code {\n\t\t\tbackground: hsl(var(--mcms-muted));\n\t\t\tborder-radius: 0.25rem;\n\t\t\tpadding: 0.125em 0.25em;\n\t\t\tfont-size: 0.875em;\n\t\t}\n\n\t\t:host ::ng-deep .tiptap-editor .ProseMirror hr {\n\t\t\tborder: none;\n\t\t\tborder-top: 1px solid hsl(var(--mcms-border));\n\t\t\tmargin: 1em 0;\n\t\t}\n\n\t\t:host ::ng-deep .tiptap-editor .ProseMirror a {\n\t\t\tcolor: hsl(var(--mcms-primary));\n\t\t\ttext-decoration: underline;\n\t\t}\n\n\t\t:host ::ng-deep .tiptap-editor .ProseMirror p {\n\t\t\tmargin: 0.25em 0;\n\t\t}\n\t`,\n})\nexport class RichTextFieldRenderer {\n\tprivate readonly destroyRef = inject(DestroyRef);\n\n\t/** Field definition */\n\treadonly field = input.required<Field>();\n\n\t/** Signal forms FieldTree node for this field */\n\treadonly formNode = input<unknown>(null);\n\n\t/** Form mode */\n\treadonly mode = input<EntityFormMode>('create');\n\n\t/** Field path */\n\treadonly path = input.required<string>();\n\n\t/** Bridge: extract FieldState from formNode */\n\tprivate readonly nodeState = computed(() => getFieldNodeState(this.formNode()));\n\n\t/** Editor container element */\n\treadonly editorRef = viewChild<ElementRef<HTMLElement>>('editorElement');\n\n\t/** TipTap editor instance */\n\tprivate editor: Editor | null = null;\n\n\t/** Whether we're currently updating from external value (prevents feedback loops) */\n\tprivate updatingFromExternal = false;\n\n\t/** Whether the editor has been initialized (browser only) */\n\treadonly editorReady = signal(false);\n\n\t/** Toolbar state signals */\n\treadonly isBold = signal(false);\n\treadonly isItalic = signal(false);\n\treadonly isUnderline = signal(false);\n\treadonly isStrike = signal(false);\n\treadonly isHeading1 = signal(false);\n\treadonly isHeading2 = signal(false);\n\treadonly isHeading3 = signal(false);\n\treadonly isBulletList = signal(false);\n\treadonly isOrderedList = signal(false);\n\treadonly isBlockquote = signal(false);\n\treadonly isCodeBlock = signal(false);\n\n\t/** Unique field ID */\n\treadonly fieldId = computed(() => `field-${this.path().replace(/\\./g, '-')}`);\n\n\t/** Computed label */\n\treadonly label = computed(() => this.field().label || humanizeFieldName(this.field().name));\n\n\t/** Whether the field is required */\n\treadonly required = computed(() => this.field().required ?? false);\n\n\t/** Whether the field is disabled */\n\treadonly isDisabled = computed(() => {\n\t\treturn this.mode() === 'view' || (this.field().admin?.readOnly ?? false);\n\t});\n\n\t/** String value from FieldState */\n\treadonly stringValue = computed(() => {\n\t\tconst state = this.nodeState();\n\t\tif (!state) return '';\n\t\tconst val = state.value();\n\t\treturn val === null || val === undefined ? '' : String(val);\n\t});\n\n\t/** Validation errors shown only when field is touched */\n\treadonly touchedErrors = computed((): readonly ValidationError[] => {\n\t\tconst state = this.nodeState();\n\t\tif (!state || !state.touched()) return [];\n\t\treturn state.errors().map((e) => ({ kind: e.kind, message: e.message }));\n\t});\n\n\tconstructor() {\n\t\t// Mount editor after first browser render (SSR-safe).\n\t\tafterNextRender(() => {\n\t\t\tthis.mountEditor();\n\t\t});\n\n\t\t// Sync external value changes into the editor\n\t\teffect(() => {\n\t\t\tconst val = this.stringValue();\n\t\t\tif (this.editor && !this.editor.isDestroyed) {\n\t\t\t\tconst currentHtml = this.editor.getHTML();\n\t\t\t\tif (val !== currentHtml && !(val === '' && currentHtml === '<p></p>')) {\n\t\t\t\t\tthis.updatingFromExternal = true;\n\t\t\t\t\tthis.editor.commands.setContent(val || '', { emitUpdate: false });\n\t\t\t\t\tthis.updatingFromExternal = false;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tthis.destroyRef.onDestroy(() => {\n\t\t\tthis.editor?.destroy();\n\t\t\tthis.editor = null;\n\t\t});\n\t}\n\n\t/**\n\t * Handle blur from editor.\n\t */\n\tonBlur(): void {\n\t\tconst state = this.nodeState();\n\t\tif (state) state.markAsTouched();\n\t}\n\n\tprivate mountEditor(): void {\n\t\tconst el = this.editorRef();\n\t\tif (!el || this.isDisabled() || this.editor) return;\n\n\t\tthis.editor = new Editor({\n\t\t\telement: el.nativeElement,\n\t\t\teditorProps: {\n\t\t\t\tattributes: {\n\t\t\t\t\trole: 'textbox',\n\t\t\t\t\t'aria-multiline': 'true',\n\t\t\t\t\t'aria-label': this.label() + ' editor',\n\t\t\t\t},\n\t\t\t},\n\t\t\textensions: [\n\t\t\t\tStarterKit.configure({\n\t\t\t\t\theading: { levels: [1, 2, 3] },\n\t\t\t\t}),\n\t\t\t\tUnderline,\n\t\t\t\tLink.configure({\n\t\t\t\t\topenOnClick: false,\n\t\t\t\t\tHTMLAttributes: {\n\t\t\t\t\t\trel: 'noopener noreferrer nofollow',\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t\tPlaceholder.configure({\n\t\t\t\t\tplaceholder: this.field().admin?.placeholder || 'Start writing...',\n\t\t\t\t}),\n\t\t\t],\n\t\t\tcontent: this.stringValue() || '',\n\t\t\teditable: true,\n\t\t\tonUpdate: ({ editor }) => {\n\t\t\t\tif (!this.updatingFromExternal) {\n\t\t\t\t\tconst html = editor.getHTML();\n\t\t\t\t\tconst value = html === '<p></p>' ? '' : html;\n\t\t\t\t\tconst state = this.nodeState();\n\t\t\t\t\tif (state) state.value.set(value);\n\t\t\t\t}\n\t\t\t},\n\t\t\tonSelectionUpdate: ({ editor }) => {\n\t\t\t\tthis.updateToolbarState(editor);\n\t\t\t},\n\t\t\tonTransaction: ({ editor }) => {\n\t\t\t\tthis.updateToolbarState(editor);\n\t\t\t},\n\t\t\tonBlur: () => {\n\t\t\t\tthis.onBlur();\n\t\t\t},\n\t\t});\n\n\t\tthis.editorReady.set(true);\n\t}\n\n\tprivate updateToolbarState(editor: Editor): void {\n\t\tthis.isBold.set(editor.isActive('bold'));\n\t\tthis.isItalic.set(editor.isActive('italic'));\n\t\tthis.isUnderline.set(editor.isActive('underline'));\n\t\tthis.isStrike.set(editor.isActive('strike'));\n\t\tthis.isHeading1.set(editor.isActive('heading', { level: 1 }));\n\t\tthis.isHeading2.set(editor.isActive('heading', { level: 2 }));\n\t\tthis.isHeading3.set(editor.isActive('heading', { level: 3 }));\n\t\tthis.isBulletList.set(editor.isActive('bulletList'));\n\t\tthis.isOrderedList.set(editor.isActive('orderedList'));\n\t\tthis.isBlockquote.set(editor.isActive('blockquote'));\n\t\tthis.isCodeBlock.set(editor.isActive('codeBlock'));\n\t}\n\n\ttoggleBold(): void {\n\t\tthis.editor?.chain().focus().toggleBold().run();\n\t}\n\n\ttoggleItalic(): void {\n\t\tthis.editor?.chain().focus().toggleItalic().run();\n\t}\n\n\ttoggleUnderline(): void {\n\t\tthis.editor?.chain().focus().toggleUnderline().run();\n\t}\n\n\ttoggleStrike(): void {\n\t\tthis.editor?.chain().focus().toggleStrike().run();\n\t}\n\n\ttoggleHeading(level: 1 | 2 | 3): void {\n\t\tthis.editor?.chain().focus().toggleHeading({ level }).run();\n\t}\n\n\ttoggleBulletList(): void {\n\t\tthis.editor?.chain().focus().toggleBulletList().run();\n\t}\n\n\ttoggleOrderedList(): void {\n\t\tthis.editor?.chain().focus().toggleOrderedList().run();\n\t}\n\n\ttoggleBlockquote(): void {\n\t\tthis.editor?.chain().focus().toggleBlockquote().run();\n\t}\n\n\ttoggleCodeBlock(): void {\n\t\tthis.editor?.chain().focus().toggleCodeBlock().run();\n\t}\n\n\tinsertHorizontalRule(): void {\n\t\tthis.editor?.chain().focus().setHorizontalRule().run();\n\t}\n}\n","import {\n\tChangeDetectionStrategy,\n\tComponent,\n\tcomputed,\n\tforwardRef,\n\tinput,\n\tsignal,\n} from '@angular/core';\nimport { Tabs, TabsList, TabsTrigger, TabsContent } from '@momentumcms/ui';\nimport type { Field, TabConfig } from '@momentumcms/core';\nimport type { EntityFormMode } from '../entity-form.types';\nimport { getSubNode } from '../entity-form.types';\nimport { FieldRenderer } from './field-renderer.component';\n\n/**\n * Tabs layout field renderer.\n *\n * Organizes child fields into tabbed sections. This is a layout-only field;\n * it does not store data itself. Child field FieldTree nodes are looked up\n * from the root formTree using flat field names.\n */\n@Component({\n\tselector: 'mcms-tabs-field-renderer',\n\timports: [Tabs, TabsList, TabsTrigger, TabsContent, forwardRef(() => FieldRenderer)],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: { class: 'block' },\n\ttemplate: `\n\t\t@if (label()) {\n\t\t\t<h3 class=\"text-sm font-medium text-foreground mb-3\">{{ label() }}</h3>\n\t\t}\n\t\t@if (description()) {\n\t\t\t<p class=\"text-sm text-muted-foreground mb-3\">{{ description() }}</p>\n\t\t}\n\t\t<mcms-tabs>\n\t\t\t<mcms-tabs-list [(selectedTab)]=\"selectedTab\">\n\t\t\t\t@for (tab of tabConfigs(); track tab.label) {\n\t\t\t\t\t<mcms-tabs-trigger [value]=\"tab.label\">{{ tab.label }}</mcms-tabs-trigger>\n\t\t\t\t}\n\t\t\t</mcms-tabs-list>\n\t\t\t@for (tab of tabConfigs(); track tab.label) {\n\t\t\t\t<mcms-tabs-content [value]=\"tab.label\">\n\t\t\t\t\t@if (tab.description) {\n\t\t\t\t\t\t<p class=\"text-sm text-muted-foreground mb-4\">{{ tab.description }}</p>\n\t\t\t\t\t}\n\t\t\t\t\t<div class=\"space-y-4 pt-4\">\n\t\t\t\t\t\t@for (subField of getTabFields(tab); track subField.name) {\n\t\t\t\t\t\t\t<mcms-field-renderer\n\t\t\t\t\t\t\t\t[field]=\"subField\"\n\t\t\t\t\t\t\t\t[formNode]=\"getChildFormNode(subField.name)\"\n\t\t\t\t\t\t\t\t[formTree]=\"formTree()\"\n\t\t\t\t\t\t\t\t[formModel]=\"formModel()\"\n\t\t\t\t\t\t\t\t[mode]=\"mode()\"\n\t\t\t\t\t\t\t\t[path]=\"subField.name\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t</mcms-tabs-content>\n\t\t\t}\n\t\t</mcms-tabs>\n\t`,\n})\nexport class TabsFieldRenderer {\n\t/** Field definition (must be a TabsField) */\n\treadonly field = input.required<Field>();\n\n\t/** Root signal forms FieldTree (for looking up child field nodes) */\n\treadonly formTree = input<unknown>(null);\n\n\t/** Form model data (for condition evaluation and relationship filterOptions) */\n\treadonly formModel = input<Record<string, unknown>>({});\n\n\t/** Form mode */\n\treadonly mode = input<EntityFormMode>('create');\n\n\t/** Field path (unused for layout fields, kept for interface consistency) */\n\treadonly path = input.required<string>();\n\n\t/** Currently selected tab */\n\treadonly selectedTab = signal('');\n\n\t/** Computed label */\n\treadonly label = computed(() => this.field().label || '');\n\n\t/** Computed description */\n\treadonly description = computed(() => this.field().description || '');\n\n\t/** Tab configurations from the field */\n\treadonly tabConfigs = computed((): TabConfig[] => {\n\t\tconst f = this.field();\n\t\tif (f.type === 'tabs') {\n\t\t\treturn f.tabs;\n\t\t}\n\t\treturn [];\n\t});\n\n\t/** Get visible fields for a tab */\n\tgetTabFields(tab: TabConfig): Field[] {\n\t\treturn tab.fields.filter((f) => !f.admin?.hidden);\n\t}\n\n\t/** Get a FieldTree sub-node for a child field (flat path from root tree) */\n\tgetChildFormNode(fieldName: string): unknown {\n\t\treturn getSubNode(this.formTree(), fieldName);\n\t}\n}\n","import {\n\tChangeDetectionStrategy,\n\tComponent,\n\tcomputed,\n\teffect,\n\tforwardRef,\n\tinput,\n\tsignal,\n} from '@angular/core';\nimport { Accordion, AccordionItem, AccordionTrigger, AccordionContent } from '@momentumcms/ui';\nimport { humanizeFieldName } from '@momentumcms/core';\nimport type { Field } from '@momentumcms/core';\nimport type { EntityFormMode } from '../entity-form.types';\nimport { getSubNode } from '../entity-form.types';\nimport { FieldRenderer } from './field-renderer.component';\n\n/**\n * Collapsible layout field renderer.\n *\n * Wraps child fields in an expandable/collapsible accordion section.\n * This is a layout-only field; it does not store data itself.\n * Child field FieldTree nodes are looked up from the root formTree\n * using flat field names.\n */\n@Component({\n\tselector: 'mcms-collapsible-field-renderer',\n\timports: [\n\t\tAccordion,\n\t\tAccordionItem,\n\t\tAccordionTrigger,\n\t\tAccordionContent,\n\t\tforwardRef(() => FieldRenderer),\n\t],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: { class: 'block' },\n\ttemplate: `\n\t\t<mcms-accordion>\n\t\t\t<mcms-accordion-item>\n\t\t\t\t<mcms-accordion-trigger [panelId]=\"panelId()\" [(expanded)]=\"isExpanded\">\n\t\t\t\t\t{{ label() }}\n\t\t\t\t</mcms-accordion-trigger>\n\t\t\t\t<mcms-accordion-content [panelId]=\"panelId()\">\n\t\t\t\t\t@if (description()) {\n\t\t\t\t\t\t<p class=\"text-sm text-muted-foreground mb-4\">{{ description() }}</p>\n\t\t\t\t\t}\n\t\t\t\t\t<div class=\"space-y-4 py-4\">\n\t\t\t\t\t\t@for (subField of subFields(); track subField.name) {\n\t\t\t\t\t\t\t<mcms-field-renderer\n\t\t\t\t\t\t\t\t[field]=\"subField\"\n\t\t\t\t\t\t\t\t[formNode]=\"getChildFormNode(subField.name)\"\n\t\t\t\t\t\t\t\t[formTree]=\"formTree()\"\n\t\t\t\t\t\t\t\t[formModel]=\"formModel()\"\n\t\t\t\t\t\t\t\t[mode]=\"mode()\"\n\t\t\t\t\t\t\t\t[path]=\"subField.name\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t</mcms-accordion-content>\n\t\t\t</mcms-accordion-item>\n\t\t</mcms-accordion>\n\t`,\n})\nexport class CollapsibleFieldRenderer {\n\t/** Field definition (must be a CollapsibleField) */\n\treadonly field = input.required<Field>();\n\n\t/** Root signal forms FieldTree (for looking up child field nodes) */\n\treadonly formTree = input<unknown>(null);\n\n\t/** Form model data (for condition evaluation and relationship filterOptions) */\n\treadonly formModel = input<Record<string, unknown>>({});\n\n\t/** Form mode */\n\treadonly mode = input<EntityFormMode>('create');\n\n\t/** Field path (unused for layout fields, kept for interface consistency) */\n\treadonly path = input.required<string>();\n\n\t/** Whether the accordion is expanded */\n\treadonly isExpanded = signal(false);\n\n\t/** Unique panel ID for accordion aria linkage */\n\treadonly panelId = computed(() => `collapsible-${this.path().replace(/\\./g, '-')}`);\n\n\t/** Computed label */\n\treadonly label = computed(() => this.field().label || humanizeFieldName(this.field().name));\n\n\t/** Computed description */\n\treadonly description = computed(() => this.field().description || '');\n\n\t/** Child fields */\n\treadonly subFields = computed((): Field[] => {\n\t\tconst f = this.field();\n\t\tif (f.type === 'collapsible') {\n\t\t\treturn f.fields.filter((sf) => !sf.admin?.hidden);\n\t\t}\n\t\treturn [];\n\t});\n\n\tconstructor() {\n\t\t// Set initial expanded state from field config once input is available\n\t\teffect(() => {\n\t\t\tconst f = this.field();\n\t\t\tif (f.type === 'collapsible' && f.defaultOpen) {\n\t\t\t\tthis.isExpanded.set(true);\n\t\t\t}\n\t\t});\n\t}\n\n\t/** Get a FieldTree sub-node for a child field (flat path from root tree) */\n\tgetChildFormNode(fieldName: string): unknown {\n\t\treturn getSubNode(this.formTree(), fieldName);\n\t}\n}\n","import { ChangeDetectionStrategy, Component, computed, forwardRef, input } from '@angular/core';\nimport type { Field } from '@momentumcms/core';\nimport type { EntityFormMode } from '../entity-form.types';\nimport { getSubNode } from '../entity-form.types';\nimport { FieldRenderer } from './field-renderer.component';\n\n/**\n * Row layout field renderer.\n *\n * Displays child fields side-by-side in a horizontal row.\n * This is a layout-only field; it does not store data itself.\n * Child field FieldTree nodes are looked up from the root formTree\n * using flat field names.\n */\n@Component({\n\tselector: 'mcms-row-field-renderer',\n\timports: [forwardRef(() => FieldRenderer)],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: { class: 'block' },\n\ttemplate: `\n\t\t@if (label()) {\n\t\t\t<h3 class=\"text-sm font-medium text-foreground mb-3\">{{ label() }}</h3>\n\t\t}\n\t\t@if (description()) {\n\t\t\t<p class=\"text-sm text-muted-foreground mb-3\">{{ description() }}</p>\n\t\t}\n\t\t<div class=\"grid gap-4\" [style.grid-template-columns]=\"gridColumns()\">\n\t\t\t@for (subField of subFields(); track subField.name) {\n\t\t\t\t<mcms-field-renderer\n\t\t\t\t\t[field]=\"subField\"\n\t\t\t\t\t[formNode]=\"getChildFormNode(subField.name)\"\n\t\t\t\t\t[formTree]=\"formTree()\"\n\t\t\t\t\t[formModel]=\"formModel()\"\n\t\t\t\t\t[mode]=\"mode()\"\n\t\t\t\t\t[path]=\"subField.name\"\n\t\t\t\t/>\n\t\t\t}\n\t\t</div>\n\t`,\n})\nexport class RowFieldRenderer {\n\t/** Field definition (must be a RowField) */\n\treadonly field = input.required<Field>();\n\n\t/** Root signal forms FieldTree (for looking up child field nodes) */\n\treadonly formTree = input<unknown>(null);\n\n\t/** Form model data (for condition evaluation and relationship filterOptions) */\n\treadonly formModel = input<Record<string, unknown>>({});\n\n\t/** Form mode */\n\treadonly mode = input<EntityFormMode>('create');\n\n\t/** Field path (unused for layout fields, kept for interface consistency) */\n\treadonly path = input.required<string>();\n\n\t/** Computed label */\n\treadonly label = computed(() => this.field().label || '');\n\n\t/** Computed description */\n\treadonly description = computed(() => this.field().description || '');\n\n\t/** Child fields */\n\treadonly subFields = computed((): Field[] => {\n\t\tconst f = this.field();\n\t\tif (f.type === 'row') {\n\t\t\treturn f.fields.filter((sf) => !sf.admin?.hidden);\n\t\t}\n\t\treturn [];\n\t});\n\n\t/** CSS grid columns: equal width for each child */\n\treadonly gridColumns = computed((): string => {\n\t\tconst count = this.subFields().length;\n\t\treturn `repeat(${count}, 1fr)`;\n\t});\n\n\t/** Get a FieldTree sub-node for a child field (flat path from root tree) */\n\tgetChildFormNode(fieldName: string): unknown {\n\t\treturn getSubNode(this.formTree(), fieldName);\n\t}\n}\n","/**\n * Block Wrapper Component\n *\n * Wraps each block with a header bar (block type label, collapse toggle,\n * move/delete controls) and renders form field editors for all fields\n * using the standard FieldRenderer.\n */\n\nimport {\n\tChangeDetectionStrategy,\n\tComponent,\n\tcomputed,\n\tforwardRef,\n\tinput,\n\toutput,\n} from '@angular/core';\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport {\n\theroChevronUp,\n\theroChevronDown,\n\theroChevronRight,\n\theroTrash,\n} from '@ng-icons/heroicons/outline';\nimport type { BlockConfig, Field } from '@momentumcms/core';\nimport { Badge, Button } from '@momentumcms/ui';\nimport { getSubNode } from '../entity-form/entity-form.types';\nimport type { EntityFormMode } from '../entity-form/entity-form.types';\nimport type { BlockItem } from './visual-editor.types';\nimport { FieldRenderer } from '../entity-form/field-renderers/field-renderer.component';\n\n@Component({\n\tselector: 'mcms-block-wrapper',\n\timports: [forwardRef(() => FieldRenderer), NgIcon, Badge, Button],\n\tproviders: [provideIcons({ heroChevronUp, heroChevronDown, heroChevronRight, heroTrash })],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: {\n\t\tclass: 'block relative rounded-lg border transition-colors overflow-hidden',\n\t\t'[class.border-primary]': 'isSelected()',\n\t\t'[class.border-border]': '!isSelected()',\n\t\t'[attr.data-testid]': '\"block-wrapper\"',\n\t\t'[attr.data-block-index]': 'blockIndex()',\n\t\t'[attr.data-block-type]': 'block().blockType',\n\t\t'[attr.role]': '\"listitem\"',\n\t\t'[attr.tabindex]': '\"0\"',\n\t\t'[attr.aria-label]': 'blockAriaLabel()',\n\t\t'(click)': 'selected.emit()',\n\t\t'(mouseenter)': 'hoverStart.emit()',\n\t\t'(mouseleave)': 'hoverEnd.emit()',\n\t\t'(focus)': 'selected.emit()',\n\t},\n\ttemplate: `\n\t\t<!-- Header: always visible -->\n\t\t<!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n\t\t<div\n\t\t\tclass=\"flex items-center gap-2 px-3 py-2 bg-muted/30\"\n\t\t\tdata-testid=\"block-header\"\n\t\t\t(click)=\"$event.stopPropagation()\"\n\t\t>\n\t\t\t<!-- Collapse toggle -->\n\t\t\t<button\n\t\t\t\tclass=\"flex h-5 w-5 shrink-0 items-center justify-center rounded text-muted-foreground hover:text-foreground transition-colors\"\n\t\t\t\t(click)=\"toggleCollapse.emit(); $event.stopPropagation()\"\n\t\t\t\t[attr.aria-label]=\"isCollapsed() ? 'Expand block' : 'Collapse block'\"\n\t\t\t\t[attr.aria-expanded]=\"!isCollapsed()\"\n\t\t\t\tdata-testid=\"block-collapse-toggle\"\n\t\t\t>\n\t\t\t\t<ng-icon\n\t\t\t\t\t[name]=\"isCollapsed() ? 'heroChevronRight' : 'heroChevronDown'\"\n\t\t\t\t\tsize=\"14\"\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t/>\n\t\t\t</button>\n\n\t\t\t<!-- Block type badge -->\n\t\t\t<mcms-badge variant=\"secondary\" class=\"text-xs\" data-testid=\"block-type-label\">\n\t\t\t\t{{ blockLabel() }}\n\t\t\t</mcms-badge>\n\n\t\t\t<!-- Spacer -->\n\t\t\t<div class=\"flex-1\"></div>\n\n\t\t\t<!-- Action buttons (only when not disabled) -->\n\t\t\t@if (!isDisabled()) {\n\t\t\t\t<div\n\t\t\t\t\tclass=\"flex items-center gap-0.5\"\n\t\t\t\t\trole=\"toolbar\"\n\t\t\t\t\t[attr.aria-label]=\"blockLabel() + ' block actions'\"\n\t\t\t\t>\n\t\t\t\t\t<button\n\t\t\t\t\t\tmcms-button\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\tclass=\"h-6 w-6\"\n\t\t\t\t\t\t[disabled]=\"!canMoveUp()\"\n\t\t\t\t\t\t(click)=\"moveUp.emit(); $event.stopPropagation()\"\n\t\t\t\t\t\taria-label=\"Move block up\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<ng-icon name=\"heroChevronUp\" size=\"14\" aria-hidden=\"true\" />\n\t\t\t\t\t</button>\n\t\t\t\t\t<button\n\t\t\t\t\t\tmcms-button\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\tclass=\"h-6 w-6\"\n\t\t\t\t\t\t[disabled]=\"!canMoveDown()\"\n\t\t\t\t\t\t(click)=\"moveDown.emit(); $event.stopPropagation()\"\n\t\t\t\t\t\taria-label=\"Move block down\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<ng-icon name=\"heroChevronDown\" size=\"14\" aria-hidden=\"true\" />\n\t\t\t\t\t</button>\n\t\t\t\t\t<button\n\t\t\t\t\t\tmcms-button\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\tclass=\"h-6 w-6 text-destructive hover:text-destructive\"\n\t\t\t\t\t\t[disabled]=\"!canDelete()\"\n\t\t\t\t\t\t(click)=\"deleteBlock.emit(); $event.stopPropagation()\"\n\t\t\t\t\t\taria-label=\"Delete block\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<ng-icon name=\"heroTrash\" size=\"14\" aria-hidden=\"true\" />\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t}\n\t\t</div>\n\n\t\t<!-- Fields content: hidden when collapsed -->\n\t\t@if (!isCollapsed()) {\n\t\t\t<div class=\"p-4 space-y-3\" data-testid=\"block-fields\">\n\t\t\t\t@for (field of visibleFields(); track field.name) {\n\t\t\t\t\t<mcms-field-renderer\n\t\t\t\t\t\t[field]=\"field\"\n\t\t\t\t\t\t[formNode]=\"getBlockSubNode(field.name)\"\n\t\t\t\t\t\t[formTree]=\"formTree()\"\n\t\t\t\t\t\t[formModel]=\"formModel()\"\n\t\t\t\t\t\t[mode]=\"mode()\"\n\t\t\t\t\t\t[path]=\"getBlockSubFieldPath(field.name)\"\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t</div>\n\t\t}\n\t`,\n})\nexport class BlockWrapperComponent {\n\t/** The block data */\n\treadonly block = input.required<BlockItem>();\n\n\t/** Block index in the blocks array */\n\treadonly blockIndex = input.required<number>();\n\n\t/** Block type configuration */\n\treadonly blockConfig = input.required<BlockConfig>();\n\n\t/** Human-readable block type label */\n\treadonly blockLabel = input.required<string>();\n\n\t/** Whether this block is currently selected */\n\treadonly isSelected = input(false);\n\n\t/** Whether this block is currently hovered */\n\treadonly isHovered = input(false);\n\n\t/** Whether the editor is in view/disabled mode */\n\treadonly isDisabled = input(false);\n\n\t/** Whether this block is collapsed (fields hidden) */\n\treadonly isCollapsed = input(false);\n\n\t/** Whether the block can be moved up */\n\treadonly canMoveUp = input(true);\n\n\t/** Whether the block can be moved down */\n\treadonly canMoveDown = input(true);\n\n\t/** Whether the block can be deleted */\n\treadonly canDelete = input(true);\n\n\t/** Signal forms node for the blocks array */\n\treadonly formNode = input<unknown>(null);\n\n\t/** Root signal forms FieldTree */\n\treadonly formTree = input<unknown>(null);\n\n\t/** Form model data */\n\treadonly formModel = input<Record<string, unknown>>({});\n\n\t/** Form mode */\n\treadonly mode = input<EntityFormMode>('edit');\n\n\t/** Field path prefix (e.g., \"content\") */\n\treadonly path = input('');\n\n\t/** Emitted when the block is clicked/focused */\n\treadonly selected = output<void>();\n\n\t/** Emitted when the mouse enters */\n\treadonly hoverStart = output<void>();\n\n\t/** Emitted when the mouse leaves */\n\treadonly hoverEnd = output<void>();\n\n\t/** Emitted when the move up button is clicked */\n\treadonly moveUp = output<void>();\n\n\t/** Emitted when the move down button is clicked */\n\treadonly moveDown = output<void>();\n\n\t/** Emitted when the delete button is clicked */\n\treadonly deleteBlock = output<void>();\n\n\t/** Emitted when the collapse toggle is clicked */\n\treadonly toggleCollapse = output<void>();\n\n\t/** Visible fields (not hidden by admin config) */\n\treadonly visibleFields = computed((): Field[] => {\n\t\treturn this.blockConfig().fields.filter((f) => !f.admin?.hidden);\n\t});\n\n\treadonly blockAriaLabel = computed((): string => {\n\t\tconst label = this.blockLabel();\n\t\treturn `${label} block, position ${this.blockIndex() + 1}`;\n\t});\n\n\t/** Get a FieldTree sub-node for a block's sub-field */\n\tgetBlockSubNode(fieldName: string): unknown {\n\t\tconst blockNode = getSubNode(this.formNode(), this.blockIndex());\n\t\treturn getSubNode(blockNode, fieldName);\n\t}\n\n\t/** Get the full path for a block's sub-field */\n\tgetBlockSubFieldPath(fieldName: string): string {\n\t\treturn `${this.path()}.${this.blockIndex()}.${fieldName}`;\n\t}\n}\n","/**\n * Block Inserter Component\n *\n * A \"+\" button that appears between blocks. When clicked, opens a command palette\n * for selecting which block type to insert at that position.\n */\n\nimport {\n\tChangeDetectionStrategy,\n\tComponent,\n\tcomputed,\n\tinput,\n\toutput,\n\tsignal,\n\tviewChild,\n} from '@angular/core';\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroPlus } from '@ng-icons/heroicons/outline';\nimport type { BlockConfig } from '@momentumcms/core';\nimport {\n\tPopoverTrigger,\n\tPopoverContent,\n\tCommand,\n\tCommandInput,\n\tCommandList,\n\tCommandGroup,\n\tCommandItem,\n\tCommandEmpty,\n} from '@momentumcms/ui';\n\n@Component({\n\tselector: 'mcms-block-inserter',\n\timports: [\n\t\tNgIcon,\n\t\tPopoverTrigger,\n\t\tPopoverContent,\n\t\tCommand,\n\t\tCommandInput,\n\t\tCommandList,\n\t\tCommandGroup,\n\t\tCommandItem,\n\t\tCommandEmpty,\n\t],\n\tproviders: [provideIcons({ heroPlus })],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: {\n\t\tclass: 'group relative flex items-center justify-center py-1',\n\t\t'[attr.data-testid]': '\"block-inserter\"',\n\t\t'[attr.data-insert-index]': 'insertIndex()',\n\t},\n\ttemplate: `\n\t\t<!-- Horizontal line -->\n\t\t<div\n\t\t\tclass=\"absolute inset-x-0 top-1/2 h-px bg-border opacity-0 transition-opacity group-hover:opacity-100\"\n\t\t\taria-hidden=\"true\"\n\t\t></div>\n\n\t\t<!-- \"+\" button -->\n\t\t<button\n\t\t\tclass=\"relative z-10 flex h-6 w-6 items-center justify-center rounded-full border border-border bg-background text-muted-foreground opacity-0 shadow-sm transition-all hover:bg-primary hover:text-primary-foreground hover:border-primary group-hover:opacity-100 focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n\t\t\t[mcmsPopoverTrigger]=\"blockPicker\"\n\t\t\tpopoverSide=\"bottom\"\n\t\t\tpopoverAlign=\"center\"\n\t\t\t#popover=\"mcmsPopoverTrigger\"\n\t\t\t[popoverDisabled]=\"disabled()\"\n\t\t\t(opened)=\"onPopoverOpened()\"\n\t\t\t(closed)=\"onPopoverClosed()\"\n\t\t\t[attr.aria-label]=\"'Add block at position ' + insertIndex()\"\n\t\t>\n\t\t\t<ng-icon name=\"heroPlus\" size=\"14\" aria-hidden=\"true\" />\n\t\t</button>\n\n\t\t<!-- Block type picker popover -->\n\t\t<ng-template #blockPicker>\n\t\t\t<mcms-popover-content>\n\t\t\t\t<mcms-command class=\"w-64\">\n\t\t\t\t\t<mcms-command-input\n\t\t\t\t\t\tplaceholder=\"Search blocks...\"\n\t\t\t\t\t\t[autofocus]=\"true\"\n\t\t\t\t\t\t[(value)]=\"searchQuery\"\n\t\t\t\t\t/>\n\t\t\t\t\t<mcms-command-list maxHeight=\"200px\">\n\t\t\t\t\t\t<mcms-command-empty>No blocks found.</mcms-command-empty>\n\t\t\t\t\t\t<mcms-command-group label=\"Blocks\">\n\t\t\t\t\t\t\t@for (blockDef of filteredBlocks(); track blockDef.slug) {\n\t\t\t\t\t\t\t\t<mcms-command-item\n\t\t\t\t\t\t\t\t\t[value]=\"blockDef.slug\"\n\t\t\t\t\t\t\t\t\t(itemSelect)=\"selectBlockType(blockDef.slug)\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{{ blockDef.labels?.singular || blockDef.slug }}\n\t\t\t\t\t\t\t\t</mcms-command-item>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</mcms-command-group>\n\t\t\t\t\t</mcms-command-list>\n\t\t\t\t</mcms-command>\n\t\t\t</mcms-popover-content>\n\t\t</ng-template>\n\t`,\n})\nexport class BlockInserterComponent {\n\t/** Position where the new block will be inserted */\n\treadonly insertIndex = input.required<number>();\n\n\t/** Available block type definitions */\n\treadonly blockDefinitions = input.required<BlockConfig[]>();\n\n\t/** Whether the inserter is disabled */\n\treadonly disabled = input(false);\n\n\t/** Emitted when a block type is selected */\n\treadonly blockTypeSelected = output<{ blockType: string; atIndex: number }>();\n\n\treadonly popover = viewChild<PopoverTrigger>('popover');\n\n\treadonly searchQuery = signal('');\n\n\treadonly filteredBlocks = computed((): BlockConfig[] => {\n\t\tconst query = this.searchQuery().toLowerCase();\n\t\tif (!query) return this.blockDefinitions();\n\t\treturn this.blockDefinitions().filter((b) => {\n\t\t\tconst label = (b.labels?.singular || b.slug).toLowerCase();\n\t\t\treturn label.includes(query);\n\t\t});\n\t});\n\n\tselectBlockType(slug: string): void {\n\t\tthis.blockTypeSelected.emit({ blockType: slug, atIndex: this.insertIndex() });\n\t\tthis.popover()?.close();\n\t\tthis.searchQuery.set('');\n\t}\n\n\tonPopoverOpened(): void {\n\t\tthis.searchQuery.set('');\n\t}\n\n\tonPopoverClosed(): void {\n\t\tthis.searchQuery.set('');\n\t}\n}\n","/**\n * Visual Block Editor Component\n *\n * Main orchestrator for the visual block editor. Replaces the form-card-style\n * BlocksFieldRenderer when admin.editor === 'visual'.\n *\n * Renders blocks with header bars (block type, collapse, move/delete controls),\n * drag-drop reorder, and block insertion via command palette.\n *\n * Data flows through the same Signal Forms bridge as BlocksFieldRenderer:\n * - Reads from nodeState.value() -> BlockItem[]\n * - Writes via nodeState.value.set(newArray)\n */\n\nimport {\n\tChangeDetectionStrategy,\n\tComponent,\n\tcomputed,\n\teffect,\n\tforwardRef,\n\tinput,\n\tsignal,\n\tuntracked,\n} from '@angular/core';\nimport {\n\tCdkDropList,\n\tCdkDrag,\n\tCdkDragPlaceholder,\n\ttype CdkDragDrop,\n\tmoveItemInArray,\n} from '@angular/cdk/drag-drop';\nimport type { Field, BlockConfig } from '@momentumcms/core';\nimport { humanizeFieldName } from '@momentumcms/core';\nimport type { EntityFormMode } from '../entity-form/entity-form.types';\nimport {\n\tgetFieldNodeState,\n\tgetFieldDefaultValue,\n\tisRecord,\n\tnormalizeBlockDefaults,\n} from '../entity-form/entity-form.types';\nimport type { BlockItem, VisualEditorState } from './visual-editor.types';\nimport { BlockWrapperComponent } from './block-wrapper.component';\nimport { BlockInserterComponent } from './block-inserter.component';\n\n@Component({\n\tselector: 'mcms-visual-block-editor',\n\timports: [\n\t\tCdkDropList,\n\t\tCdkDrag,\n\t\tCdkDragPlaceholder,\n\t\tforwardRef(() => BlockWrapperComponent),\n\t\tBlockInserterComponent,\n\t],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: {\n\t\tclass: 'block',\n\t\t'[attr.data-testid]': '\"visual-block-editor\"',\n\t\t'(keydown)': 'onKeydown($event)',\n\t},\n\ttemplate: `\n\t\t<!-- Header -->\n\t\t<div class=\"mb-4\">\n\t\t\t<h3 class=\"text-sm font-medium text-foreground\">{{ label() }}</h3>\n\t\t\t@if (description()) {\n\t\t\t\t<p class=\"text-sm text-muted-foreground mt-1\">{{ description() }}</p>\n\t\t\t}\n\t\t</div>\n\n\t\t<!-- Block list with drag-drop -->\n\t\t@if (blocks().length === 0 && !isDisabled()) {\n\t\t\t<!-- Empty state with single inserter -->\n\t\t\t<div class=\"rounded-lg border-2 border-dashed border-border p-8 text-center\">\n\t\t\t\t<p class=\"text-sm text-muted-foreground mb-3\">No content blocks yet.</p>\n\t\t\t\t<mcms-block-inserter\n\t\t\t\t\t[insertIndex]=\"0\"\n\t\t\t\t\t[blockDefinitions]=\"blockDefinitions()\"\n\t\t\t\t\t[disabled]=\"isDisabled()\"\n\t\t\t\t\t(blockTypeSelected)=\"addBlock($event.blockType, $event.atIndex)\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t} @else {\n\t\t\t<div\n\t\t\t\tcdkDropList\n\t\t\t\t(cdkDropListDropped)=\"onDrop($event)\"\n\t\t\t\t[cdkDropListDisabled]=\"isDisabled()\"\n\t\t\t\tclass=\"space-y-0\"\n\t\t\t\trole=\"list\"\n\t\t\t\t[attr.aria-label]=\"label() + ' blocks'\"\n\t\t\t>\n\t\t\t\t<!-- Inserter before first block -->\n\t\t\t\t@if (!isDisabled()) {\n\t\t\t\t\t<mcms-block-inserter\n\t\t\t\t\t\t[insertIndex]=\"0\"\n\t\t\t\t\t\t[blockDefinitions]=\"blockDefinitions()\"\n\t\t\t\t\t\t(blockTypeSelected)=\"addBlock($event.blockType, $event.atIndex)\"\n\t\t\t\t\t/>\n\t\t\t\t}\n\n\t\t\t\t@for (block of blocks(); track $index; let i = $index) {\n\t\t\t\t\t<!-- Block with drag handle -->\n\t\t\t\t\t<div cdkDrag [cdkDragDisabled]=\"isDisabled()\">\n\t\t\t\t\t\t<!-- Drag preview placeholder -->\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t*cdkDragPlaceholder\n\t\t\t\t\t\t\tclass=\"rounded-lg border-2 border-dashed border-primary/50 bg-primary/5 h-16\"\n\t\t\t\t\t\t></div>\n\n\t\t\t\t\t\t<!-- Block content with integrated header and controls -->\n\t\t\t\t\t\t<mcms-block-wrapper\n\t\t\t\t\t\t\t[block]=\"block\"\n\t\t\t\t\t\t\t[blockIndex]=\"i\"\n\t\t\t\t\t\t\t[blockConfig]=\"getBlockConfig(block.blockType)\"\n\t\t\t\t\t\t\t[blockLabel]=\"getBlockLabel(block.blockType)\"\n\t\t\t\t\t\t\t[isSelected]=\"editorState.selectedBlockIndex() === i\"\n\t\t\t\t\t\t\t[isHovered]=\"editorState.hoveredBlockIndex() === i\"\n\t\t\t\t\t\t\t[isCollapsed]=\"isBlockCollapsed(i)\"\n\t\t\t\t\t\t\t[isDisabled]=\"isDisabled()\"\n\t\t\t\t\t\t\t[canMoveUp]=\"i > 0\"\n\t\t\t\t\t\t\t[canMoveDown]=\"i < blocks().length - 1\"\n\t\t\t\t\t\t\t[canDelete]=\"canRemoveBlock()\"\n\t\t\t\t\t\t\t[formNode]=\"formNode()\"\n\t\t\t\t\t\t\t[formTree]=\"formTree()\"\n\t\t\t\t\t\t\t[formModel]=\"formModel()\"\n\t\t\t\t\t\t\t[mode]=\"mode()\"\n\t\t\t\t\t\t\t[path]=\"path()\"\n\t\t\t\t\t\t\t(selected)=\"selectBlock(i)\"\n\t\t\t\t\t\t\t(hoverStart)=\"editorState.hoveredBlockIndex.set(i)\"\n\t\t\t\t\t\t\t(hoverEnd)=\"editorState.hoveredBlockIndex.set(null)\"\n\t\t\t\t\t\t\t(moveUp)=\"moveBlock(i, i - 1)\"\n\t\t\t\t\t\t\t(moveDown)=\"moveBlock(i, i + 1)\"\n\t\t\t\t\t\t\t(deleteBlock)=\"removeBlock(i)\"\n\t\t\t\t\t\t\t(toggleCollapse)=\"toggleBlockCollapse(i)\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<!-- Inserter after each block -->\n\t\t\t\t\t@if (!isDisabled()) {\n\t\t\t\t\t\t<mcms-block-inserter\n\t\t\t\t\t\t\t[insertIndex]=\"i + 1\"\n\t\t\t\t\t\t\t[blockDefinitions]=\"blockDefinitions()\"\n\t\t\t\t\t\t\t(blockTypeSelected)=\"addBlock($event.blockType, $event.atIndex)\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t</div>\n\t\t}\n\n\t\t<!-- Block count -->\n\t\t<div class=\"mt-2 text-xs text-muted-foreground text-right\">\n\t\t\t{{ blocks().length }}{{ maxRows() ? ' / ' + maxRows() : '' }} blocks\n\t\t</div>\n\t`,\n})\nexport class VisualBlockEditorComponent {\n\t/** Field definition (must be a BlocksField) */\n\treadonly field = input.required<Field>();\n\n\t/** Signal forms FieldTree node for this blocks array */\n\treadonly formNode = input<unknown>(null);\n\n\t/** Root signal forms FieldTree */\n\treadonly formTree = input<unknown>(null);\n\n\t/** Form model data */\n\treadonly formModel = input<Record<string, unknown>>({});\n\n\t/** Form mode */\n\treadonly mode = input<EntityFormMode>('create');\n\n\t/** Field path */\n\treadonly path = input.required<string>();\n\n\t/** Editor state */\n\treadonly editorState: VisualEditorState = {\n\t\tselectedBlockIndex: signal(null),\n\t\thoveredBlockIndex: signal(null),\n\t\tinserterOpen: signal(null),\n\t\tcollapsedBlocks: signal(new Set<number>()),\n\t};\n\n\t/** Bridge: extract FieldState from formNode */\n\tprivate readonly nodeState = computed(() => getFieldNodeState(this.formNode()));\n\n\t/** Computed label */\n\treadonly label = computed(() => this.field().label || humanizeFieldName(this.field().name));\n\n\t/** Computed description */\n\treadonly description = computed(() => this.field().description || '');\n\n\t/** Block type definitions from the field */\n\treadonly blockDefinitions = computed((): BlockConfig[] => {\n\t\tconst f = this.field();\n\t\tif (f.type === 'blocks') {\n\t\t\treturn f.blocks;\n\t\t}\n\t\treturn [];\n\t});\n\n\treadonly minRows = computed((): number => {\n\t\tconst f = this.field();\n\t\treturn f.type === 'blocks' ? (f.minRows ?? 0) : 0;\n\t});\n\n\treadonly maxRows = computed((): number | undefined => {\n\t\tconst f = this.field();\n\t\treturn f.type === 'blocks' ? f.maxRows : undefined;\n\t});\n\n\t/** Current blocks as typed items */\n\treadonly blocks = computed((): BlockItem[] => {\n\t\tconst state = this.nodeState();\n\t\tif (!state) return [];\n\t\tconst val = state.value();\n\t\tif (Array.isArray(val)) {\n\t\t\treturn val.filter(\n\t\t\t\t(item): item is BlockItem => isRecord(item) && typeof item['blockType'] === 'string',\n\t\t\t);\n\t\t}\n\t\treturn [];\n\t});\n\n\treadonly isDisabled = computed(() => this.mode() === 'view');\n\n\t/**\n\t * Normalize loaded blocks: ensure every block has defaults for all fields\n\t * defined in its block definition. This is needed because blocks saved before\n\t * a new field was added (e.g. _analytics) won't have those keys, and the\n\t * signal-forms tree only creates controls for keys present in the model.\n\t */\n\tprivate readonly _normalizeBlocks = effect(() => {\n\t\tconst state = this.nodeState();\n\t\tif (!state) return;\n\t\tconst val = state.value();\n\t\tif (!Array.isArray(val)) return;\n\n\t\tconst { normalized, changed } = normalizeBlockDefaults(val, this.blockDefMap());\n\t\tif (changed) {\n\t\t\tuntracked(() => state.value.set(normalized));\n\t\t}\n\t});\n\n\treadonly canRemoveBlock = computed((): boolean => {\n\t\tif (this.isDisabled()) return false;\n\t\treturn this.blocks().length > this.minRows();\n\t});\n\n\t/** Block definition lookup cache */\n\tprivate readonly blockDefMap = computed((): Map<string, BlockConfig> => {\n\t\tconst map = new Map<string, BlockConfig>();\n\t\tfor (const def of this.blockDefinitions()) {\n\t\t\tmap.set(def.slug, def);\n\t\t}\n\t\treturn map;\n\t});\n\n\t/** Fallback empty block config for unknown types */\n\tprivate readonly emptyBlockConfig: BlockConfig = { slug: 'unknown', fields: [] };\n\n\tgetBlockLabel(blockType: string): string {\n\t\tconst def = this.blockDefMap().get(blockType);\n\t\treturn def?.labels?.singular || blockType;\n\t}\n\n\tgetBlockConfig(blockType: string): BlockConfig {\n\t\treturn this.blockDefMap().get(blockType) ?? this.emptyBlockConfig;\n\t}\n\n\t// ── Collapse Management ──\n\n\tisBlockCollapsed(index: number): boolean {\n\t\treturn this.editorState.collapsedBlocks().has(index);\n\t}\n\n\ttoggleBlockCollapse(index: number): void {\n\t\tconst current = this.editorState.collapsedBlocks();\n\t\tconst next = new Set(current);\n\t\tif (next.has(index)) {\n\t\t\tnext.delete(index);\n\t\t} else {\n\t\t\tnext.add(index);\n\t\t}\n\t\tthis.editorState.collapsedBlocks.set(next);\n\t}\n\n\t/** Shift collapsed indices after a block is added at atIndex */\n\tprivate shiftCollapsedUp(atIndex: number): void {\n\t\tconst current = this.editorState.collapsedBlocks();\n\t\tconst next = new Set<number>();\n\t\tfor (const idx of current) {\n\t\t\tnext.add(idx >= atIndex ? idx + 1 : idx);\n\t\t}\n\t\tthis.editorState.collapsedBlocks.set(next);\n\t}\n\n\t/** Shift collapsed indices after a block is removed at removedIndex */\n\tprivate shiftCollapsedDown(removedIndex: number): void {\n\t\tconst current = this.editorState.collapsedBlocks();\n\t\tconst next = new Set<number>();\n\t\tfor (const idx of current) {\n\t\t\tif (idx === removedIndex) continue;\n\t\t\tnext.add(idx > removedIndex ? idx - 1 : idx);\n\t\t}\n\t\tthis.editorState.collapsedBlocks.set(next);\n\t}\n\n\t/** Swap collapsed state between two indices */\n\tprivate swapCollapsed(from: number, to: number): void {\n\t\tconst current = this.editorState.collapsedBlocks();\n\t\tconst fromCollapsed = current.has(from);\n\t\tconst toCollapsed = current.has(to);\n\t\tconst next = new Set(current);\n\t\tif (fromCollapsed) {\n\t\t\tnext.delete(from);\n\t\t\tnext.add(to);\n\t\t} else {\n\t\t\tnext.delete(to);\n\t\t}\n\t\tif (toCollapsed) {\n\t\t\tnext.add(from);\n\t\t} else {\n\t\t\tnext.delete(from);\n\t\t}\n\t\tthis.editorState.collapsedBlocks.set(next);\n\t}\n\n\t// ── Block Operations ──\n\n\taddBlock(blockType: string, atIndex: number): void {\n\t\tconst def = this.blockDefMap().get(blockType);\n\t\tif (!def) return;\n\t\tconst state = this.nodeState();\n\t\tif (!state) return;\n\n\t\tconst newBlock: BlockItem = { blockType };\n\t\tfor (const field of def.fields) {\n\t\t\tnewBlock[field.name] = getFieldDefaultValue(field);\n\t\t}\n\n\t\tconst blocks = [...this.blocks()];\n\t\tblocks.splice(atIndex, 0, newBlock);\n\t\tthis.shiftCollapsedUp(atIndex);\n\t\tstate.value.set(blocks);\n\n\t\t// Select the new block\n\t\tthis.editorState.selectedBlockIndex.set(atIndex);\n\t}\n\n\tremoveBlock(index: number): void {\n\t\tconst state = this.nodeState();\n\t\tif (!state) return;\n\t\tconst blocks = this.blocks().filter((_, i) => i !== index);\n\t\tthis.shiftCollapsedDown(index);\n\t\tstate.value.set(blocks);\n\n\t\t// Adjust selection\n\t\tconst selected = this.editorState.selectedBlockIndex();\n\t\tif (selected === index) {\n\t\t\tthis.editorState.selectedBlockIndex.set(\n\t\t\t\tblocks.length > 0 ? Math.min(index, blocks.length - 1) : null,\n\t\t\t);\n\t\t} else if (selected !== null && selected > index) {\n\t\t\tthis.editorState.selectedBlockIndex.set(selected - 1);\n\t\t}\n\t}\n\n\tmoveBlock(from: number, to: number): void {\n\t\tconst state = this.nodeState();\n\t\tif (!state) return;\n\t\tif (to < 0 || to >= this.blocks().length) return;\n\t\tconst blocks = [...this.blocks()];\n\t\tmoveItemInArray(blocks, from, to);\n\t\tthis.swapCollapsed(from, to);\n\t\tstate.value.set(blocks);\n\t\tthis.editorState.selectedBlockIndex.set(to);\n\t}\n\n\tselectBlock(index: number): void {\n\t\tthis.editorState.selectedBlockIndex.set(index);\n\t}\n\n\tonDrop(event: CdkDragDrop<unknown>): void {\n\t\tthis.moveBlock(event.previousIndex, event.currentIndex);\n\t}\n\n\t// ── Keyboard Navigation ──\n\n\tonKeydown(event: KeyboardEvent): void {\n\t\tconst selected = this.editorState.selectedBlockIndex();\n\n\t\t// Don't handle navigation when focused on form inputs\n\t\tconst target = event.target;\n\t\tif (target instanceof HTMLElement) {\n\t\t\tconst tagName = target.tagName.toLowerCase();\n\t\t\tif (\n\t\t\t\ttarget.isContentEditable ||\n\t\t\t\ttagName === 'input' ||\n\t\t\t\ttagName === 'textarea' ||\n\t\t\t\ttagName === 'select' ||\n\t\t\t\ttarget.closest('[role=\"textbox\"]')\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tswitch (event.key) {\n\t\t\tcase 'ArrowUp':\n\t\t\t\tif (selected !== null && selected > 0) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tthis.editorState.selectedBlockIndex.set(selected - 1);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'ArrowDown':\n\t\t\t\tif (selected !== null && selected < this.blocks().length - 1) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tthis.editorState.selectedBlockIndex.set(selected + 1);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'Escape':\n\t\t\t\tthis.editorState.selectedBlockIndex.set(null);\n\t\t\t\tbreak;\n\t\t\tcase 'Delete':\n\t\t\tcase 'Backspace':\n\t\t\t\tif (selected !== null && this.canRemoveBlock()) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tthis.removeBlock(selected);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t}\n}\n","import { ChangeDetectionStrategy, Component, computed, forwardRef, input } from '@angular/core';\nimport type { Field } from '@momentumcms/core';\nimport type { EntityFormMode } from '../entity-form.types';\nimport { TextFieldRenderer } from './text-field.component';\nimport { NumberFieldRenderer } from './number-field.component';\nimport { SelectFieldRenderer } from './select-field.component';\nimport { CheckboxFieldRenderer } from './checkbox-field.component';\nimport { DateFieldRenderer } from './date-field.component';\nimport { UploadFieldRenderer } from './upload-field.component';\nimport { GroupFieldRenderer } from './group-field.component';\nimport { ArrayFieldRenderer } from './array-field.component';\nimport { BlocksFieldRenderer } from './blocks-field.component';\nimport { RelationshipFieldRenderer } from './relationship-field.component';\nimport { RichTextFieldRenderer } from './rich-text-field.component';\nimport { TabsFieldRenderer } from './tabs-field.component';\nimport { CollapsibleFieldRenderer } from './collapsible-field.component';\nimport { RowFieldRenderer } from './row-field.component';\nimport { VisualBlockEditorComponent } from '../../visual-block-editor/visual-block-editor.component';\n\n/**\n * Dynamic field renderer that switches based on field type.\n *\n * Uses Angular Signal Forms bridge pattern: each renderer receives\n * its formNode (FieldTree) and reads/writes values via FieldState.\n */\n@Component({\n\tselector: 'mcms-field-renderer',\n\timports: [\n\t\tTextFieldRenderer,\n\t\tNumberFieldRenderer,\n\t\tSelectFieldRenderer,\n\t\tCheckboxFieldRenderer,\n\t\tDateFieldRenderer,\n\t\tUploadFieldRenderer,\n\t\tGroupFieldRenderer,\n\t\tArrayFieldRenderer,\n\t\tBlocksFieldRenderer,\n\t\tRelationshipFieldRenderer,\n\t\tRichTextFieldRenderer,\n\t\tTabsFieldRenderer,\n\t\tCollapsibleFieldRenderer,\n\t\tRowFieldRenderer,\n\t\tforwardRef(() => VisualBlockEditorComponent),\n\t],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: { class: 'block' },\n\ttemplate: `\n\t\t@switch (fieldType()) {\n\t\t\t@case ('text') {\n\t\t\t\t<mcms-text-field-renderer\n\t\t\t\t\t[field]=\"field()\"\n\t\t\t\t\t[formNode]=\"formNode()\"\n\t\t\t\t\t[mode]=\"mode()\"\n\t\t\t\t\t[path]=\"path()\"\n\t\t\t\t/>\n\t\t\t}\n\t\t\t@case ('textarea') {\n\t\t\t\t<mcms-text-field-renderer\n\t\t\t\t\t[field]=\"field()\"\n\t\t\t\t\t[formNode]=\"formNode()\"\n\t\t\t\t\t[mode]=\"mode()\"\n\t\t\t\t\t[path]=\"path()\"\n\t\t\t\t/>\n\t\t\t}\n\t\t\t@case ('richText') {\n\t\t\t\t<mcms-rich-text-field-renderer\n\t\t\t\t\t[field]=\"field()\"\n\t\t\t\t\t[formNode]=\"formNode()\"\n\t\t\t\t\t[mode]=\"mode()\"\n\t\t\t\t\t[path]=\"path()\"\n\t\t\t\t/>\n\t\t\t}\n\t\t\t@case ('email') {\n\t\t\t\t<mcms-text-field-renderer\n\t\t\t\t\t[field]=\"field()\"\n\t\t\t\t\t[formNode]=\"formNode()\"\n\t\t\t\t\t[mode]=\"mode()\"\n\t\t\t\t\t[path]=\"path()\"\n\t\t\t\t/>\n\t\t\t}\n\t\t\t@case ('slug') {\n\t\t\t\t<mcms-text-field-renderer\n\t\t\t\t\t[field]=\"field()\"\n\t\t\t\t\t[formNode]=\"formNode()\"\n\t\t\t\t\t[mode]=\"mode()\"\n\t\t\t\t\t[path]=\"path()\"\n\t\t\t\t/>\n\t\t\t}\n\t\t\t@case ('number') {\n\t\t\t\t<mcms-number-field-renderer\n\t\t\t\t\t[field]=\"field()\"\n\t\t\t\t\t[formNode]=\"formNode()\"\n\t\t\t\t\t[mode]=\"mode()\"\n\t\t\t\t\t[path]=\"path()\"\n\t\t\t\t/>\n\t\t\t}\n\t\t\t@case ('select') {\n\t\t\t\t<mcms-select-field-renderer\n\t\t\t\t\t[field]=\"field()\"\n\t\t\t\t\t[formNode]=\"formNode()\"\n\t\t\t\t\t[mode]=\"mode()\"\n\t\t\t\t\t[path]=\"path()\"\n\t\t\t\t/>\n\t\t\t}\n\t\t\t@case ('checkbox') {\n\t\t\t\t<mcms-checkbox-field-renderer\n\t\t\t\t\t[field]=\"field()\"\n\t\t\t\t\t[formNode]=\"formNode()\"\n\t\t\t\t\t[mode]=\"mode()\"\n\t\t\t\t\t[path]=\"path()\"\n\t\t\t\t/>\n\t\t\t}\n\t\t\t@case ('date') {\n\t\t\t\t<mcms-date-field-renderer\n\t\t\t\t\t[field]=\"field()\"\n\t\t\t\t\t[formNode]=\"formNode()\"\n\t\t\t\t\t[mode]=\"mode()\"\n\t\t\t\t\t[path]=\"path()\"\n\t\t\t\t/>\n\t\t\t}\n\t\t\t@case ('upload') {\n\t\t\t\t<mcms-upload-field-renderer\n\t\t\t\t\t[field]=\"field()\"\n\t\t\t\t\t[formNode]=\"formNode()\"\n\t\t\t\t\t[mode]=\"mode()\"\n\t\t\t\t\t[path]=\"path()\"\n\t\t\t\t/>\n\t\t\t}\n\t\t\t@case ('group') {\n\t\t\t\t<mcms-group-field-renderer\n\t\t\t\t\t[field]=\"field()\"\n\t\t\t\t\t[formNode]=\"formNode()\"\n\t\t\t\t\t[formTree]=\"formTree()\"\n\t\t\t\t\t[formModel]=\"formModel()\"\n\t\t\t\t\t[mode]=\"mode()\"\n\t\t\t\t\t[path]=\"path()\"\n\t\t\t\t/>\n\t\t\t}\n\t\t\t@case ('array') {\n\t\t\t\t<mcms-array-field-renderer\n\t\t\t\t\t[field]=\"field()\"\n\t\t\t\t\t[formNode]=\"formNode()\"\n\t\t\t\t\t[formTree]=\"formTree()\"\n\t\t\t\t\t[formModel]=\"formModel()\"\n\t\t\t\t\t[mode]=\"mode()\"\n\t\t\t\t\t[path]=\"path()\"\n\t\t\t\t/>\n\t\t\t}\n\t\t\t@case ('blocks') {\n\t\t\t\t@if (field().admin?.editor === 'visual') {\n\t\t\t\t\t<mcms-visual-block-editor\n\t\t\t\t\t\t[field]=\"field()\"\n\t\t\t\t\t\t[formNode]=\"formNode()\"\n\t\t\t\t\t\t[formTree]=\"formTree()\"\n\t\t\t\t\t\t[formModel]=\"formModel()\"\n\t\t\t\t\t\t[mode]=\"mode()\"\n\t\t\t\t\t\t[path]=\"path()\"\n\t\t\t\t\t/>\n\t\t\t\t} @else {\n\t\t\t\t\t<mcms-blocks-field-renderer\n\t\t\t\t\t\t[field]=\"field()\"\n\t\t\t\t\t\t[formNode]=\"formNode()\"\n\t\t\t\t\t\t[formTree]=\"formTree()\"\n\t\t\t\t\t\t[formModel]=\"formModel()\"\n\t\t\t\t\t\t[mode]=\"mode()\"\n\t\t\t\t\t\t[path]=\"path()\"\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t}\n\t\t\t@case ('relationship') {\n\t\t\t\t<mcms-relationship-field-renderer\n\t\t\t\t\t[field]=\"field()\"\n\t\t\t\t\t[formNode]=\"formNode()\"\n\t\t\t\t\t[formModel]=\"formModel()\"\n\t\t\t\t\t[mode]=\"mode()\"\n\t\t\t\t\t[path]=\"path()\"\n\t\t\t\t/>\n\t\t\t}\n\t\t\t@case ('tabs') {\n\t\t\t\t<mcms-tabs-field-renderer\n\t\t\t\t\t[field]=\"field()\"\n\t\t\t\t\t[formTree]=\"formTree()\"\n\t\t\t\t\t[formModel]=\"formModel()\"\n\t\t\t\t\t[mode]=\"mode()\"\n\t\t\t\t\t[path]=\"path()\"\n\t\t\t\t/>\n\t\t\t}\n\t\t\t@case ('collapsible') {\n\t\t\t\t<mcms-collapsible-field-renderer\n\t\t\t\t\t[field]=\"field()\"\n\t\t\t\t\t[formTree]=\"formTree()\"\n\t\t\t\t\t[formModel]=\"formModel()\"\n\t\t\t\t\t[mode]=\"mode()\"\n\t\t\t\t\t[path]=\"path()\"\n\t\t\t\t/>\n\t\t\t}\n\t\t\t@case ('row') {\n\t\t\t\t<mcms-row-field-renderer\n\t\t\t\t\t[field]=\"field()\"\n\t\t\t\t\t[formTree]=\"formTree()\"\n\t\t\t\t\t[formModel]=\"formModel()\"\n\t\t\t\t\t[mode]=\"mode()\"\n\t\t\t\t\t[path]=\"path()\"\n\t\t\t\t/>\n\t\t\t}\n\t\t\t@default {\n\t\t\t\t<mcms-text-field-renderer\n\t\t\t\t\t[field]=\"field()\"\n\t\t\t\t\t[formNode]=\"formNode()\"\n\t\t\t\t\t[mode]=\"mode()\"\n\t\t\t\t\t[path]=\"path()\"\n\t\t\t\t/>\n\t\t\t}\n\t\t}\n\t`,\n})\nexport class FieldRenderer {\n\t/** Field definition */\n\treadonly field = input.required<Field>();\n\n\t/** Signal forms FieldTree node for this field */\n\treadonly formNode = input<unknown>(null);\n\n\t/** Root signal forms FieldTree (for layout fields that look up child nodes) */\n\treadonly formTree = input<unknown>(null);\n\n\t/** Form model data (for condition evaluation and relationship filterOptions) */\n\treadonly formModel = input<Record<string, unknown>>({});\n\n\t/** Form mode */\n\treadonly mode = input<EntityFormMode>('create');\n\n\t/** Field path (for nested fields) */\n\treadonly path = input.required<string>();\n\n\t/** Field type for template switching */\n\treadonly fieldType = computed(() => this.field().type);\n}\n","import { ChangeDetectionStrategy, Component, inject, signal } from '@angular/core';\nimport {\n\tDialog,\n\tDialogHeader,\n\tDialogTitle,\n\tDialogContent,\n\tDialogFooter,\n\tDialogClose,\n\tButton,\n\tBadge,\n\tSkeleton,\n\tDIALOG_DATA,\n} from '@momentumcms/ui';\nimport { VersionService, type VersionFieldDiff } from '../../services/version.service';\n\n/**\n * Data passed to the version diff dialog.\n */\nexport interface VersionDiffDialogData {\n\tcollection: string;\n\tdocumentId: string;\n\tversionId1: string;\n\tversionId2: string;\n\tlabel1: string;\n\tlabel2: string;\n}\n\n/**\n * Dialog component for displaying field-by-field differences between two versions.\n */\n@Component({\n\tselector: 'mcms-version-diff-dialog',\n\timports: [\n\t\tDialog,\n\t\tDialogHeader,\n\t\tDialogTitle,\n\t\tDialogContent,\n\t\tDialogFooter,\n\t\tDialogClose,\n\t\tButton,\n\t\tBadge,\n\t\tSkeleton,\n\t],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\ttemplate: `\n\t\t<mcms-dialog>\n\t\t\t<mcms-dialog-header>\n\t\t\t\t<mcms-dialog-title>Compare Versions</mcms-dialog-title>\n\t\t\t</mcms-dialog-header>\n\n\t\t\t<mcms-dialog-content>\n\t\t\t\t@if (isLoading()) {\n\t\t\t\t\t<div class=\"space-y-4\">\n\t\t\t\t\t\t@for (i of [1, 2, 3]; track i) {\n\t\t\t\t\t\t\t<mcms-skeleton class=\"h-20 w-full\" />\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t} @else if (error()) {\n\t\t\t\t\t<p class=\"text-sm text-destructive\">{{ error() }}</p>\n\t\t\t\t} @else if (differences().length === 0) {\n\t\t\t\t\t<p class=\"text-sm text-muted-foreground\">No differences found between these versions.</p>\n\t\t\t\t} @else {\n\t\t\t\t\t<div class=\"mb-3 flex items-center gap-4 text-xs text-muted-foreground\">\n\t\t\t\t\t\t<span class=\"flex items-center gap-1\">\n\t\t\t\t\t\t\t<span class=\"inline-block h-3 w-3 rounded bg-red-100 dark:bg-red-900/30\"></span>\n\t\t\t\t\t\t\t{{ data.label1 }} (old)\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span class=\"flex items-center gap-1\">\n\t\t\t\t\t\t\t<span class=\"inline-block h-3 w-3 rounded bg-green-100 dark:bg-green-900/30\"></span>\n\t\t\t\t\t\t\t{{ data.label2 }} (new)\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"space-y-3\">\n\t\t\t\t\t\t@for (diff of differences(); track diff.field) {\n\t\t\t\t\t\t\t<div class=\"rounded-md border border-border p-3\">\n\t\t\t\t\t\t\t\t<div class=\"mb-2 flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t<mcms-badge variant=\"outline\">{{ diff.field }}</mcms-badge>\n\t\t\t\t\t\t\t\t\t@if (diff.oldValue === undefined || diff.oldValue === null) {\n\t\t\t\t\t\t\t\t\t\t<mcms-badge variant=\"default\" class=\"text-xs\">added</mcms-badge>\n\t\t\t\t\t\t\t\t\t} @else if (diff.newValue === undefined || diff.newValue === null) {\n\t\t\t\t\t\t\t\t\t\t<mcms-badge variant=\"destructive\" class=\"text-xs\">removed</mcms-badge>\n\t\t\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t\t\t<mcms-badge variant=\"secondary\" class=\"text-xs\">changed</mcms-badge>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class=\"space-y-1 text-sm\">\n\t\t\t\t\t\t\t\t\t@if (diff.oldValue !== undefined && diff.oldValue !== null) {\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tclass=\"rounded bg-red-50 px-2 py-1 dark:bg-red-900/20\"\n\t\t\t\t\t\t\t\t\t\t\tdata-testid=\"diff-old-value\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"text-muted-foreground\">- </span>\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"break-all\">{{ formatValue(diff.oldValue) }}</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t@if (diff.newValue !== undefined && diff.newValue !== null) {\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tclass=\"rounded bg-green-50 px-2 py-1 dark:bg-green-900/20\"\n\t\t\t\t\t\t\t\t\t\t\tdata-testid=\"diff-new-value\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"text-muted-foreground\">+ </span>\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"break-all\">{{ formatValue(diff.newValue) }}</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t</mcms-dialog-content>\n\n\t\t\t<mcms-dialog-footer>\n\t\t\t\t<button mcms-button variant=\"outline\" [mcmsDialogClose]>Close</button>\n\t\t\t</mcms-dialog-footer>\n\t\t</mcms-dialog>\n\t`,\n})\nexport class VersionDiffDialogComponent {\n\treadonly data = inject<VersionDiffDialogData>(DIALOG_DATA);\n\tprivate readonly versionService = inject(VersionService);\n\n\treadonly isLoading = signal(true);\n\treadonly error = signal<string | null>(null);\n\treadonly differences = signal<VersionFieldDiff[]>([]);\n\n\tconstructor() {\n\t\tthis.loadDifferences();\n\t}\n\n\tprivate async loadDifferences(): Promise<void> {\n\t\ttry {\n\t\t\tconst diffs = await this.versionService.compareVersions(\n\t\t\t\tthis.data.collection,\n\t\t\t\tthis.data.documentId,\n\t\t\t\tthis.data.versionId1,\n\t\t\t\tthis.data.versionId2,\n\t\t\t);\n\t\t\tthis.differences.set(diffs);\n\t\t} catch {\n\t\t\tthis.error.set('Failed to compare versions');\n\t\t} finally {\n\t\t\tthis.isLoading.set(false);\n\t\t}\n\t}\n\n\t/**\n\t * Format a value for display.\n\t */\n\tformatValue(value: unknown): string {\n\t\tif (typeof value === 'string') return value;\n\t\tif (typeof value === 'number' || typeof value === 'boolean') return String(value);\n\t\treturn JSON.stringify(value, null, 2);\n\t}\n}\n","import {\n\tChangeDetectionStrategy,\n\tComponent,\n\teffect,\n\tinject,\n\tinput,\n\toutput,\n\tsignal,\n} from '@angular/core';\nimport { DatePipe } from '@angular/common';\nimport {\n\tBadge,\n\tButton,\n\tSkeleton,\n\tCard,\n\tCardHeader,\n\tCardContent,\n\tSeparator,\n\tDialogService,\n} from '@momentumcms/ui';\nimport {\n\tVersionService,\n\ttype DocumentVersionParsed,\n\ttype DocumentStatus,\n} from '../../services/version.service';\nimport { FeedbackService } from '../feedback/feedback.service';\nimport {\n\tVersionDiffDialogComponent,\n\ttype VersionDiffDialogData,\n} from './version-diff-dialog.component';\n\n/**\n * Version History Widget\n *\n * Displays a list of document versions with the ability to restore previous versions.\n *\n * @example\n * ```html\n * <mcms-version-history\n * [collection]=\"'posts'\"\n * [documentId]=\"'abc123'\"\n * [documentLabel]=\"'Post'\"\n * (restored)=\"onVersionRestored($event)\"\n * />\n * ```\n */\n@Component({\n\tselector: 'mcms-version-history',\n\timports: [DatePipe, Badge, Button, Skeleton, Card, CardHeader, CardContent, Separator],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: { class: 'block' },\n\ttemplate: `\n\t\t<mcms-card>\n\t\t\t<mcms-card-header>\n\t\t\t\t<div class=\"flex items-center justify-between\">\n\t\t\t\t\t<h3 class=\"font-semibold\">Version History</h3>\n\t\t\t\t\t@if (versions().length > 0) {\n\t\t\t\t\t\t<mcms-badge variant=\"secondary\">{{ versions().length }}</mcms-badge>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t</mcms-card-header>\n\n\t\t\t<mcms-card-content class=\"space-y-3\">\n\t\t\t\t@if (isLoading()) {\n\t\t\t\t\t<div class=\"space-y-3\">\n\t\t\t\t\t\t@for (i of [1, 2, 3]; track i) {\n\t\t\t\t\t\t\t<mcms-skeleton class=\"h-16 w-full\" />\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t} @else if (error()) {\n\t\t\t\t\t<p class=\"text-sm text-destructive\">{{ error() }}</p>\n\t\t\t\t} @else if (versions().length === 0) {\n\t\t\t\t\t<p class=\"text-sm text-muted-foreground\">No version history available</p>\n\t\t\t\t} @else {\n\t\t\t\t\t@for (version of versions(); track version.id; let first = $first) {\n\t\t\t\t\t\t@if (!first) {\n\t\t\t\t\t\t\t<mcms-separator />\n\t\t\t\t\t\t}\n\t\t\t\t\t\t<div class=\"flex items-center justify-between py-2\">\n\t\t\t\t\t\t\t<div class=\"flex flex-col gap-1\">\n\t\t\t\t\t\t\t\t<div class=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t<mcms-badge [variant]=\"getStatusVariant(version._status)\">\n\t\t\t\t\t\t\t\t\t\t{{ version._status }}\n\t\t\t\t\t\t\t\t\t</mcms-badge>\n\t\t\t\t\t\t\t\t\t@if (version.autosave) {\n\t\t\t\t\t\t\t\t\t\t<mcms-badge variant=\"outline\">autosave</mcms-badge>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t@if (first) {\n\t\t\t\t\t\t\t\t\t\t<mcms-badge variant=\"secondary\">current</mcms-badge>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<span class=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t{{ version.createdAt | date: 'medium' }}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t@if (!first) {\n\t\t\t\t\t\t\t\t<div class=\"flex items-center gap-1\">\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\tmcms-button\n\t\t\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\ttitle=\"Compare with current version\"\n\t\t\t\t\t\t\t\t\t\taria-label=\"Compare with current version\"\n\t\t\t\t\t\t\t\t\t\t(click)=\"onCompare(version)\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tCompare\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\tmcms-button\n\t\t\t\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t[disabled]=\"isRestoring()\"\n\t\t\t\t\t\t\t\t\t\t(click)=\"onRestore(version)\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t@if (isRestoring() && restoringVersionId() === version.id) {\n\t\t\t\t\t\t\t\t\t\t\tRestoring...\n\t\t\t\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t\t\t\tRestore\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t@if (hasNextPage()) {\n\t\t\t\t\t<div class=\"pt-2\">\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tmcms-button\n\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\tclass=\"w-full\"\n\t\t\t\t\t\t\t[disabled]=\"isLoadingMore()\"\n\t\t\t\t\t\t\t(click)=\"loadMore()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t@if (isLoadingMore()) {\n\t\t\t\t\t\t\t\tLoading...\n\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\tLoad more\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t</mcms-card-content>\n\t\t</mcms-card>\n\t`,\n})\nexport class VersionHistoryWidget {\n\tprivate readonly versionService = inject(VersionService);\n\tprivate readonly feedback = inject(FeedbackService);\n\tprivate readonly dialogService = inject(DialogService);\n\n\t/** Collection slug */\n\treadonly collection = input.required<string>();\n\n\t/** Document ID */\n\treadonly documentId = input.required<string>();\n\n\t/** Document label for feedback messages */\n\treadonly documentLabel = input('Document');\n\n\t/** Emitted when a version is restored */\n\treadonly restored = output<DocumentVersionParsed>();\n\n\t/** Versions list */\n\treadonly versions = signal<DocumentVersionParsed[]>([]);\n\n\t/** Whether versions are loading */\n\treadonly isLoading = signal(true);\n\n\t/** Whether more versions are loading */\n\treadonly isLoadingMore = signal(false);\n\n\t/** Whether a restore is in progress */\n\treadonly isRestoring = signal(false);\n\n\t/** ID of the version being restored */\n\treadonly restoringVersionId = signal<string | null>(null);\n\n\t/** Error message */\n\treadonly error = signal<string | null>(null);\n\n\t/** Current page */\n\treadonly currentPage = signal(1);\n\n\t/** Whether there are more versions */\n\treadonly hasNextPage = signal(false);\n\n\tconstructor() {\n\t\t// Load versions when inputs change\n\t\teffect(() => {\n\t\t\tconst collection = this.collection();\n\t\t\tconst docId = this.documentId();\n\n\t\t\tif (collection && docId) {\n\t\t\t\tthis.loadVersions(collection, docId, 1);\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Load versions from the API.\n\t */\n\tprivate async loadVersions(\n\t\tcollection: string,\n\t\tdocId: string,\n\t\tpage: number,\n\t\tappend = false,\n\t): Promise<void> {\n\t\tif (page === 1) {\n\t\t\tthis.isLoading.set(true);\n\t\t} else {\n\t\t\tthis.isLoadingMore.set(true);\n\t\t}\n\t\tthis.error.set(null);\n\n\t\ttry {\n\t\t\tconst result = await this.versionService.findVersions(collection, docId, {\n\t\t\t\tlimit: 10,\n\t\t\t\tpage,\n\t\t\t\tincludeAutosave: true,\n\t\t\t});\n\n\t\t\tif (append) {\n\t\t\t\tthis.versions.update((current) => [...current, ...result.docs]);\n\t\t\t} else {\n\t\t\t\tthis.versions.set(result.docs);\n\t\t\t}\n\n\t\t\tthis.currentPage.set(page);\n\t\t\tthis.hasNextPage.set(result.hasNextPage);\n\t\t} catch {\n\t\t\tthis.error.set('Failed to load version history');\n\t\t} finally {\n\t\t\tthis.isLoading.set(false);\n\t\t\tthis.isLoadingMore.set(false);\n\t\t}\n\t}\n\n\t/**\n\t * Load more versions.\n\t */\n\tloadMore(): void {\n\t\tconst nextPage = this.currentPage() + 1;\n\t\tthis.loadVersions(this.collection(), this.documentId(), nextPage, true);\n\t}\n\n\t/**\n\t * Restore a version.\n\t */\n\tasync onRestore(version: DocumentVersionParsed): Promise<void> {\n\t\tconst confirmed = await this.feedback.confirmRestore(this.documentLabel());\n\n\t\tif (!confirmed) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.isRestoring.set(true);\n\t\tthis.restoringVersionId.set(version.id);\n\n\t\ttry {\n\t\t\tawait this.versionService.restore(this.collection(), this.documentId(), {\n\t\t\t\tversionId: version.id,\n\t\t\t});\n\n\t\t\tthis.feedback.versionRestored(this.documentLabel());\n\t\t\tthis.restored.emit(version);\n\n\t\t\t// Reload versions to show the new state\n\t\t\tthis.loadVersions(this.collection(), this.documentId(), 1);\n\t\t} catch (err) {\n\t\t\tconst error = err instanceof Error ? err : new Error('Could not restore to selected version');\n\t\t\tthis.feedback.operationFailed('Restore failed', error);\n\t\t} finally {\n\t\t\tthis.isRestoring.set(false);\n\t\t\tthis.restoringVersionId.set(null);\n\t\t}\n\t}\n\n\t/**\n\t * Compare a version with the current (most recent) version.\n\t */\n\tonCompare(version: DocumentVersionParsed): void {\n\t\tconst current = this.versions()[0];\n\t\tif (!current) return;\n\n\t\tconst data: VersionDiffDialogData = {\n\t\t\tcollection: this.collection(),\n\t\t\tdocumentId: this.documentId(),\n\t\t\tversionId1: version.id,\n\t\t\tversionId2: current.id,\n\t\t\tlabel1: new Date(version.createdAt).toLocaleString(),\n\t\t\tlabel2: 'Current',\n\t\t};\n\n\t\tthis.dialogService.open(VersionDiffDialogComponent, {\n\t\t\tdata,\n\t\t\twidth: '40rem',\n\t\t});\n\t}\n\n\t/**\n\t * Get badge variant for status.\n\t */\n\tgetStatusVariant(status: DocumentStatus): 'default' | 'secondary' | 'destructive' | 'outline' {\n\t\treturn status === 'published' ? 'default' : 'secondary';\n\t}\n}\n","import {\n\tChangeDetectionStrategy,\n\tComponent,\n\tcomputed,\n\teffect,\n\tinject,\n\tInjector,\n\tinput,\n\toutput,\n\trunInInjectionContext,\n\tsignal,\n\tuntracked,\n} from '@angular/core';\nimport { Router } from '@angular/router';\nimport { LiveAnnouncer } from '@angular/cdk/a11y';\nimport { form, submit } from '@angular/forms/signals';\nimport type { CollectionConfig, Field } from '@momentumcms/core';\nimport { humanizeFieldName } from '@momentumcms/core';\nimport {\n\tCard,\n\tCardContent,\n\tCardFooter,\n\tButton,\n\tSpinner,\n\tAlert,\n\tBreadcrumbs,\n\tBreadcrumbItem,\n\tBreadcrumbSeparator,\n} from '@momentumcms/ui';\nimport { injectMomentumAPI } from '../../services/momentum-api.service';\nimport { VersionService } from '../../services/version.service';\nimport { CollectionAccessService } from '../../services/collection-access.service';\nimport { FeedbackService } from '../feedback/feedback.service';\nimport type { Entity } from '../widget.types';\nimport { type EntityFormMode, createInitialFormData } from './entity-form.types';\nimport { applyCollectionSchema } from './form-schema-builder';\nimport { FieldRenderer } from './field-renderers/field-renderer.component';\nimport { VersionHistoryWidget } from '../version-history/version-history.component';\n\n/**\n * Entity Form Widget\n *\n * Dynamic form for create/edit operations using Angular Signal Forms.\n *\n * @example\n * ```html\n * <mcms-entity-form\n * [collection]=\"postsCollection\"\n * entityId=\"123\"\n * mode=\"edit\"\n * (saved)=\"onSaved($event)\"\n * (cancelled)=\"onCancel()\"\n * />\n * ```\n */\n@Component({\n\tselector: 'mcms-entity-form',\n\timports: [\n\t\tCard,\n\t\tCardContent,\n\t\tCardFooter,\n\t\tButton,\n\t\tSpinner,\n\t\tAlert,\n\t\tFieldRenderer,\n\t\tBreadcrumbs,\n\t\tBreadcrumbItem,\n\t\tBreadcrumbSeparator,\n\t\tVersionHistoryWidget,\n\t],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: { class: 'block' },\n\ttemplate: `\n\t\t<div class=\"max-w-3xl\">\n\t\t\t@if (showBreadcrumbs()) {\n\t\t\t\t<mcms-breadcrumbs class=\"mb-6\">\n\t\t\t\t\t<mcms-breadcrumb-item [href]=\"dashboardPath()\">Dashboard</mcms-breadcrumb-item>\n\t\t\t\t\t<mcms-breadcrumb-separator />\n\t\t\t\t\t<mcms-breadcrumb-item [href]=\"collectionListPath()\">{{\n\t\t\t\t\t\tcollectionLabel()\n\t\t\t\t\t}}</mcms-breadcrumb-item>\n\t\t\t\t\t<mcms-breadcrumb-separator />\n\t\t\t\t\t<mcms-breadcrumb-item [current]=\"true\">{{ pageTitle() }}</mcms-breadcrumb-item>\n\t\t\t\t</mcms-breadcrumbs>\n\t\t\t}\n\n\t\t\t<!-- Page Header -->\n\t\t\t<div class=\"mb-8\">\n\t\t\t\t<div class=\"flex items-start justify-between gap-4\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<h1 class=\"text-2xl font-semibold tracking-tight\">\n\t\t\t\t\t\t\t@if (isGlobal()) {\n\t\t\t\t\t\t\t\t{{ collectionLabelSingular() }}\n\t\t\t\t\t\t\t} @else if (mode() === 'create') {\n\t\t\t\t\t\t\t\tCreate {{ collectionLabelSingular() }}\n\t\t\t\t\t\t\t} @else if (mode() === 'edit') {\n\t\t\t\t\t\t\t\tEdit {{ collectionLabelSingular() }}\n\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\tView {{ collectionLabelSingular() }}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</h1>\n\t\t\t\t\t\t<p class=\"mt-1 text-muted-foreground\">\n\t\t\t\t\t\t\t@if (isGlobal()) {\n\t\t\t\t\t\t\t\tManage {{ collectionLabelSingular().toLowerCase() }} settings.\n\t\t\t\t\t\t\t} @else if (mode() === 'create') {\n\t\t\t\t\t\t\t\tAdd a new {{ collectionLabelSingular().toLowerCase() }} to your collection.\n\t\t\t\t\t\t\t} @else if (mode() === 'edit') {\n\t\t\t\t\t\t\t\tUpdate the {{ collectionLabelSingular().toLowerCase() }} details below.\n\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\tViewing {{ collectionLabelSingular().toLowerCase() }} details.\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<ng-content select=\"[entityFormHeaderExtra]\" />\n\t\t\t</div>\n\n\t\t\t<mcms-card>\n\t\t\t\t<mcms-card-content>\n\t\t\t\t\t@if (isLoading()) {\n\t\t\t\t\t\t<div class=\"flex items-center justify-center py-12\">\n\t\t\t\t\t\t\t<mcms-spinner size=\"lg\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t} @else {\n\t\t\t\t\t\t@if (formError()) {\n\t\t\t\t\t\t\t<mcms-alert variant=\"destructive\" class=\"mb-6\" role=\"alert\" aria-live=\"assertive\">\n\t\t\t\t\t\t\t\t{{ formError() }}\n\t\t\t\t\t\t\t</mcms-alert>\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t<div class=\"space-y-6\">\n\t\t\t\t\t\t\t@for (field of visibleFields(); track field.name) {\n\t\t\t\t\t\t\t\t<mcms-field-renderer\n\t\t\t\t\t\t\t\t\t[field]=\"field\"\n\t\t\t\t\t\t\t\t\t[formNode]=\"getFormNode(field.name)\"\n\t\t\t\t\t\t\t\t\t[formTree]=\"entityForm()\"\n\t\t\t\t\t\t\t\t\t[formModel]=\"formModel()\"\n\t\t\t\t\t\t\t\t\t[mode]=\"mode()\"\n\t\t\t\t\t\t\t\t\t[path]=\"field.name\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t</mcms-card-content>\n\n\t\t\t\t<mcms-card-footer class=\"flex justify-end gap-3 border-t bg-muted/50 px-6 py-4\">\n\t\t\t\t\t@if (mode() !== 'view') {\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tmcms-button\n\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\t[disabled]=\"isSubmitting() || isSavingDraft()\"\n\t\t\t\t\t\t\t(click)=\"onCancel()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tCancel\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t@if (canSaveDraft()) {\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tmcms-button\n\t\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\t\t[disabled]=\"isSubmitting() || isSavingDraft()\"\n\t\t\t\t\t\t\t\t(click)=\"onSaveDraft()\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t@if (isSavingDraft()) {\n\t\t\t\t\t\t\t\t\t<mcms-spinner size=\"sm\" class=\"mr-2\" />\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tSave Draft\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t}\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tmcms-button\n\t\t\t\t\t\t\tvariant=\"primary\"\n\t\t\t\t\t\t\t[disabled]=\"isSubmitting() || isSavingDraft()\"\n\t\t\t\t\t\t\t(click)=\"onSubmit()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t@if (isSubmitting()) {\n\t\t\t\t\t\t\t\t<mcms-spinner size=\"sm\" class=\"mr-2\" />\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t{{ mode() === 'create' ? 'Create' : 'Save Changes' }}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t} @else {\n\t\t\t\t\t\t@if (canEdit()) {\n\t\t\t\t\t\t\t<button mcms-button variant=\"primary\" (click)=\"switchToEdit()\">Edit</button>\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t</mcms-card-footer>\n\t\t\t</mcms-card>\n\n\t\t\t@if (hasVersioning() && mode() === 'edit' && entityId()) {\n\t\t\t\t<div class=\"mt-8\">\n\t\t\t\t\t<mcms-version-history\n\t\t\t\t\t\t[collection]=\"collection().slug\"\n\t\t\t\t\t\t[documentId]=\"entityId()!\"\n\t\t\t\t\t\t[documentLabel]=\"collectionLabelSingular()\"\n\t\t\t\t\t\t(restored)=\"onVersionRestored()\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t}\n\t\t</div>\n\t`,\n})\nexport class EntityFormWidget<T extends Entity = Entity> {\n\tprivate readonly api = injectMomentumAPI();\n\tprivate readonly injector = inject(Injector);\n\tprivate readonly versionService = inject(VersionService);\n\tprivate readonly collectionAccess = inject(CollectionAccessService);\n\tprivate readonly feedback = inject(FeedbackService);\n\tprivate readonly router = inject(Router);\n\tprivate readonly liveAnnouncer = inject(LiveAnnouncer);\n\n\t/** The collection configuration */\n\treadonly collection = input.required<CollectionConfig>();\n\n\t/** Entity ID for edit mode (undefined for create) */\n\treadonly entityId = input<string | undefined>(undefined);\n\n\t/** Form mode */\n\treadonly mode = input<EntityFormMode>('create');\n\n\t/** Base path for navigation */\n\treadonly basePath = input('/admin/collections');\n\n\t/** Whether to show breadcrumbs */\n\treadonly showBreadcrumbs = input(true);\n\n\t/** When true, prevents router navigation after save/cancel (used in entity sheet) */\n\treadonly suppressNavigation = input(false);\n\n\t/** When true, uses the global API instead of collection API (singleton mode) */\n\treadonly isGlobal = input(false);\n\n\t/** The global slug (used when isGlobal is true) */\n\treadonly globalSlug = input<string | undefined>(undefined);\n\n\t/** Outputs */\n\treadonly saved = output<T>();\n\treadonly cancelled = output<void>();\n\treadonly saveError = output<Error>();\n\treadonly modeChange = output<EntityFormMode>();\n\treadonly draftSaved = output<void>();\n\n\t/** Model signal — the single source of truth for form data */\n\treadonly formModel = signal<Record<string, unknown>>({});\n\n\t/** Alias for backward compatibility (CollectionEditPage reads formData) */\n\treadonly formData = this.formModel;\n\n\t/** Signal forms tree — created once when collection is available */\n\treadonly entityForm = signal<ReturnType<typeof form<Record<string, unknown>>> | null>(null);\n\n\t/** Original data for edit mode */\n\treadonly originalData = signal<T | null>(null);\n\n\t/** UI state */\n\treadonly isLoading = signal(false);\n\treadonly isSubmitting = signal(false);\n\treadonly isSavingDraft = signal(false);\n\treadonly formError = signal<string | null>(null);\n\n\t/** Whether the form has been set up */\n\tprivate formCreated = false;\n\n\t/** Whether the form has unsaved changes (from signal forms dirty tracking) */\n\treadonly isDirty = computed(() => {\n\t\tconst ef = this.entityForm();\n\t\treturn ef ? ef().dirty() : false;\n\t});\n\n\t/** Computed collection label */\n\treadonly collectionLabel = computed(() => {\n\t\tconst col = this.collection();\n\t\treturn humanizeFieldName(col.labels?.plural || col.slug);\n\t});\n\n\t/** Computed collection label singular */\n\treadonly collectionLabelSingular = computed(() => {\n\t\tconst col = this.collection();\n\t\treturn humanizeFieldName(col.labels?.singular || col.slug);\n\t});\n\n\t/** Dashboard path (remove /collections from base path) */\n\treadonly dashboardPath = computed(() => {\n\t\tconst base = this.basePath();\n\t\treturn base.replace(/\\/collections$/, '');\n\t});\n\n\t/** Collection list path */\n\treadonly collectionListPath = computed(() => {\n\t\treturn `${this.basePath()}/${this.collection().slug}`;\n\t});\n\n\t/** Page title for breadcrumb */\n\treadonly pageTitle = computed(() => {\n\t\tif (this.isGlobal()) {\n\t\t\treturn this.collectionLabelSingular();\n\t\t}\n\n\t\tconst currentMode = this.mode();\n\t\tif (currentMode === 'create') {\n\t\t\treturn `Create ${this.collectionLabelSingular()}`;\n\t\t}\n\n\t\tconst data = this.formModel();\n\t\tconst titleFields = ['title', 'name', 'label', 'subject'];\n\t\tfor (const field of titleFields) {\n\t\t\tif (data[field] && typeof data[field] === 'string') {\n\t\t\t\treturn data[field];\n\t\t\t}\n\t\t}\n\n\t\treturn `Edit ${this.collectionLabelSingular()}`;\n\t});\n\n\t/** Visible fields (excluding hidden ones and those failing admin.condition) */\n\treadonly visibleFields = computed((): Field[] => {\n\t\tconst col = this.collection();\n\t\tconst data = this.formModel();\n\t\treturn col.fields.filter((field) => {\n\t\t\tif (field.admin?.hidden) return false;\n\t\t\tif (field.admin?.condition && !field.admin.condition(data)) return false;\n\t\t\treturn true;\n\t\t});\n\t});\n\n\t/** Whether user can edit */\n\treadonly canEdit = computed(() => {\n\t\treturn this.collectionAccess.canUpdate(this.collection().slug);\n\t});\n\n\t/** Whether collection has versioning with drafts enabled */\n\treadonly hasVersioning = computed(() => {\n\t\tconst col = this.collection();\n\t\tconst versions = col.versions;\n\t\tif (typeof versions === 'object' && versions !== null) {\n\t\t\treturn !!versions.drafts;\n\t\t}\n\t\treturn false;\n\t});\n\n\t/** Whether draft save is available (edit mode with existing entity) */\n\treadonly canSaveDraft = computed(() => {\n\t\treturn this.hasVersioning() && this.mode() === 'edit' && !!this.entityId();\n\t});\n\n\tconstructor() {\n\t\teffect(() => {\n\t\t\tconst col = this.collection();\n\t\t\tconst id = this.entityId();\n\t\t\tconst currentMode = this.mode();\n\t\t\tconst globalMode = this.isGlobal();\n\t\t\tconst gSlug = this.globalSlug();\n\n\t\t\tif (col) {\n\t\t\t\t// Create the signal forms tree once per collection\n\t\t\t\tif (!this.formCreated) {\n\t\t\t\t\tthis.formCreated = true;\n\t\t\t\t\tthis.formModel.set(createInitialFormData(col));\n\t\t\t\t\tconst formModelRef = this.formModel;\n\t\t\t\t\tconst f = untracked(() =>\n\t\t\t\t\t\trunInInjectionContext(this.injector, () =>\n\t\t\t\t\t\t\tform(this.formModel, (tree) => {\n\t\t\t\t\t\t\t\tapplyCollectionSchema(\n\t\t\t\t\t\t\t\t\tcol.fields,\n\t\t\t\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- FieldTree generic not exported\n\t\t\t\t\t\t\t\t\ttree as unknown as Record<string, unknown>,\n\t\t\t\t\t\t\t\t\t() => formModelRef(),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\tthis.entityForm.set(f);\n\t\t\t\t}\n\n\t\t\t\tif (globalMode && gSlug) {\n\t\t\t\t\t// Global mode: always load the singleton\n\t\t\t\t\tthis.loadGlobal(gSlug);\n\t\t\t\t} else if (currentMode === 'create' || !id) {\n\t\t\t\t\tthis.formModel.set(createInitialFormData(col));\n\t\t\t\t\tconst ef = this.entityForm();\n\t\t\t\t\tif (ef) ef().reset();\n\t\t\t\t} else {\n\t\t\t\t\tthis.loadEntity(col.slug, id);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Get a FieldTree node for a top-level field by name.\n\t */\n\tgetFormNode(fieldName: string): unknown {\n\t\tconst ef = this.entityForm();\n\t\tif (!ef) return null;\n\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- FieldTree generic not exported\n\t\treturn (ef as unknown as Record<string, unknown>)[fieldName] ?? null;\n\t}\n\n\t/**\n\t * Load entity for edit mode.\n\t */\n\tprivate async loadEntity(slug: string, id: string): Promise<void> {\n\t\tthis.isLoading.set(true);\n\t\tthis.formError.set(null);\n\n\t\ttry {\n\t\t\tconst entity = await this.api.collection<T>(slug).findById(id);\n\t\t\tif (entity) {\n\t\t\t\tthis.originalData.set(entity);\n\t\t\t\tthis.formModel.set({ ...entity });\n\t\t\t\tconst ef = this.entityForm();\n\t\t\t\tif (ef) ef().reset();\n\t\t\t} else {\n\t\t\t\tthis.formError.set(`${this.collectionLabelSingular()} not found`);\n\t\t\t\tthis.feedback.entityNotFound(this.collectionLabelSingular());\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tthis.formError.set('Failed to load data');\n\t\t\tthis.saveError.emit(err instanceof Error ? err : new Error('Failed to load data'));\n\t\t} finally {\n\t\t\tthis.isLoading.set(false);\n\t\t}\n\t}\n\n\t/**\n\t * Load global singleton document.\n\t */\n\tprivate async loadGlobal(slug: string): Promise<void> {\n\t\tthis.isLoading.set(true);\n\t\tthis.formError.set(null);\n\n\t\ttry {\n\t\t\tconst data = await this.api.global<T>(slug).findOne();\n\t\t\tif (data) {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\t\tthis.originalData.set(data as T);\n\t\t\t\t// Merge API data with initial field defaults so all field keys exist in the model.\n\t\t\t\t// Auto-created globals only have metadata (slug, timestamps) — without merging,\n\t\t\t\t// signal-forms can't update fields that don't exist in the model.\n\t\t\t\tconst initial = createInitialFormData(this.collection());\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\t\tthis.formModel.set({ ...initial, ...(data as Record<string, unknown>) });\n\t\t\t\tconst ef = this.entityForm();\n\t\t\t\tif (ef) ef().reset();\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tthis.formError.set('Failed to load data');\n\t\t\tthis.saveError.emit(err instanceof Error ? err : new Error('Failed to load data'));\n\t\t} finally {\n\t\t\tthis.isLoading.set(false);\n\t\t}\n\t}\n\n\t/**\n\t * Handle form submission using Angular Signal Forms submit().\n\t * submit() marks all fields as touched, then only calls the callback if valid.\n\t */\n\tasync onSubmit(): Promise<void> {\n\t\tconst ef = this.entityForm();\n\t\tif (!ef || this.isSubmitting()) return;\n\n\t\tlet submitted = false;\n\n\t\tawait submit(ef, async () => {\n\t\t\tsubmitted = true;\n\t\t\tthis.isSubmitting.set(true);\n\t\t\tthis.formError.set(null);\n\n\t\t\ttry {\n\t\t\t\tconst slug = this.collection().slug;\n\t\t\t\tconst data = this.formModel();\n\t\t\t\tlet result: T;\n\n\t\t\t\tif (this.isGlobal()) {\n\t\t\t\t\t// Global mode: always update (singleton)\n\t\t\t\t\tconst gSlug = this.globalSlug() ?? slug;\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\t\t\tresult = await this.api.global<T>(gSlug).update(data as Partial<T>);\n\t\t\t\t} else if (this.mode() === 'create') {\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\t\t\tresult = await this.api.collection<T>(slug).create(data as Partial<T>);\n\t\t\t\t} else {\n\t\t\t\t\tconst id = this.entityId();\n\t\t\t\t\tif (!id) throw new Error('Entity ID required for update');\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\t\t\tresult = await this.api.collection<T>(slug).update(id, data as Partial<T>);\n\t\t\t\t}\n\n\t\t\t\tthis.originalData.set(result);\n\t\t\t\tthis.formModel.set({ ...result });\n\t\t\t\tef().reset();\n\t\t\t\tthis.saved.emit(result);\n\n\t\t\t\tif (!this.suppressNavigation() && !this.isGlobal()) {\n\t\t\t\t\tconst listPath = `${this.basePath()}/${slug}`;\n\t\t\t\t\tthis.router.navigate([listPath]);\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tconst errorMessage = err instanceof Error ? err.message : 'Save failed';\n\t\t\t\tthis.formError.set(errorMessage);\n\t\t\t\t// Error toast handled by crudToastInterceptor\n\t\t\t\tthis.saveError.emit(err instanceof Error ? err : new Error(errorMessage));\n\t\t\t} finally {\n\t\t\t\tthis.isSubmitting.set(false);\n\t\t\t}\n\t\t});\n\n\t\t// submit() didn't call the callback — form is invalid\n\t\tif (!submitted) {\n\t\t\tthis.formError.set('Please fix the errors above before submitting.');\n\t\t\tvoid this.liveAnnouncer.announce(\n\t\t\t\t'Form submission failed. Please fix the errors above before submitting.',\n\t\t\t\t'assertive',\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Handle cancel.\n\t */\n\tonCancel(): void {\n\t\tthis.cancelled.emit();\n\t\tif (!this.suppressNavigation()) {\n\t\t\tconst listPath = `${this.basePath()}/${this.collection().slug}`;\n\t\t\tthis.router.navigate([listPath]);\n\t\t}\n\t}\n\n\t/**\n\t * Switch from view to edit mode.\n\t */\n\tswitchToEdit(): void {\n\t\tthis.modeChange.emit('edit');\n\t}\n\n\t/**\n\t * Handle version restore — reload the entity data.\n\t */\n\tonVersionRestored(): void {\n\t\tconst id = this.entityId();\n\t\tif (id) {\n\t\t\tthis.loadEntity(this.collection().slug, id);\n\t\t}\n\t}\n\n\t/**\n\t * Save form data as a draft.\n\t */\n\tasync onSaveDraft(): Promise<void> {\n\t\tconst id = this.entityId();\n\t\tif (!id || this.isSavingDraft()) return;\n\n\t\tthis.isSavingDraft.set(true);\n\t\tthis.formError.set(null);\n\n\t\ttry {\n\t\t\tconst slug = this.collection().slug;\n\t\t\tconst data = this.formModel();\n\n\t\t\tawait this.versionService.saveDraft(slug, id, data);\n\t\t\tthis.feedback.draftSaved();\n\t\t\tthis.draftSaved.emit();\n\t\t} catch (err) {\n\t\t\tconst errorMessage = err instanceof Error ? err.message : 'Failed to save draft';\n\t\t\tthis.formError.set(errorMessage);\n\t\t\tthis.feedback.operationFailed('Draft save failed', err instanceof Error ? err : undefined);\n\t\t} finally {\n\t\t\tthis.isSavingDraft.set(false);\n\t\t}\n\t}\n}\n","import {\n\tChangeDetectionStrategy,\n\tComponent,\n\tcomputed,\n\teffect,\n\tinject,\n\tinput,\n\toutput,\n\tsignal,\n} from '@angular/core';\nimport { Badge, Button } from '@momentumcms/ui';\nimport { VersionService, type DocumentStatus } from '../../services/version.service';\nimport { FeedbackService } from '../feedback/feedback.service';\n\n/**\n * Publish Controls Widget\n *\n * Displays the current document status and provides publish/unpublish actions.\n *\n * @example\n * ```html\n * <mcms-publish-controls\n * [collection]=\"'posts'\"\n * [documentId]=\"'abc123'\"\n * [documentLabel]=\"'Post'\"\n * (statusChanged)=\"onStatusChanged($event)\"\n * />\n * ```\n */\n@Component({\n\tselector: 'mcms-publish-controls',\n\timports: [Badge, Button],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: { class: 'inline-flex items-center gap-3' },\n\ttemplate: `\n\t\t<mcms-badge [variant]=\"statusVariant()\">\n\t\t\t{{ statusLabel() }}\n\t\t</mcms-badge>\n\n\t\t@if (status() === 'draft') {\n\t\t\t<button\n\t\t\t\tmcms-button\n\t\t\t\tvariant=\"primary\"\n\t\t\t\tsize=\"sm\"\n\t\t\t\t[disabled]=\"isUpdating()\"\n\t\t\t\t(click)=\"onPublish()\"\n\t\t\t>\n\t\t\t\t@if (isUpdating()) {\n\t\t\t\t\tPublishing...\n\t\t\t\t} @else {\n\t\t\t\t\tPublish\n\t\t\t\t}\n\t\t\t</button>\n\t\t} @else {\n\t\t\t<button\n\t\t\t\tmcms-button\n\t\t\t\tvariant=\"outline\"\n\t\t\t\tsize=\"sm\"\n\t\t\t\t[disabled]=\"isUpdating()\"\n\t\t\t\t(click)=\"onUnpublish()\"\n\t\t\t>\n\t\t\t\t@if (isUpdating()) {\n\t\t\t\t\tUnpublishing...\n\t\t\t\t} @else {\n\t\t\t\t\tUnpublish\n\t\t\t\t}\n\t\t\t</button>\n\t\t}\n\t`,\n})\nexport class PublishControlsWidget {\n\tprivate readonly versionService = inject(VersionService);\n\tprivate readonly feedback = inject(FeedbackService);\n\n\t/** Collection slug */\n\treadonly collection = input.required<string>();\n\n\t/** Document ID */\n\treadonly documentId = input.required<string>();\n\n\t/** Document label for feedback messages */\n\treadonly documentLabel = input('Document');\n\n\t/** Initial status (optional, will be fetched if not provided) */\n\treadonly initialStatus = input<DocumentStatus | undefined>(undefined);\n\n\t/** Emitted when the status changes */\n\treadonly statusChanged = output<DocumentStatus>();\n\n\t/** Current status */\n\treadonly status = signal<DocumentStatus>('draft');\n\n\t/** Whether a status update is in progress */\n\treadonly isUpdating = signal(false);\n\n\t/** Whether status is loading */\n\treadonly isLoading = signal(false);\n\n\t/** Badge variant based on status (derived from status signal) */\n\treadonly statusVariant = computed<'default' | 'secondary' | 'outline'>(() =>\n\t\tthis.status() === 'published' ? 'default' : 'secondary',\n\t);\n\n\t/** Status label (derived from status signal) */\n\treadonly statusLabel = computed(() => (this.status() === 'published' ? 'Published' : 'Draft'));\n\n\tconstructor() {\n\t\t// Load status when inputs change\n\t\teffect(() => {\n\t\t\tconst collection = this.collection();\n\t\t\tconst docId = this.documentId();\n\t\t\tconst initial = this.initialStatus();\n\n\t\t\tif (initial !== undefined) {\n\t\t\t\tthis.updateStatusDisplay(initial);\n\t\t\t} else if (collection && docId) {\n\t\t\t\tthis.loadStatus(collection, docId);\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Load the current status from the API.\n\t */\n\tprivate async loadStatus(collection: string, docId: string): Promise<void> {\n\t\tthis.isLoading.set(true);\n\n\t\ttry {\n\t\t\tconst status = await this.versionService.getStatus(collection, docId);\n\t\t\tthis.updateStatusDisplay(status);\n\t\t} catch {\n\t\t\t// Default to draft if we can't load status\n\t\t\tthis.updateStatusDisplay('draft');\n\t\t} finally {\n\t\t\tthis.isLoading.set(false);\n\t\t}\n\t}\n\n\t/**\n\t * Update the status display.\n\t * statusVariant and statusLabel are computed signals that automatically update.\n\t */\n\tprivate updateStatusDisplay(status: DocumentStatus): void {\n\t\tthis.status.set(status);\n\t}\n\n\t/**\n\t * Publish the document.\n\t */\n\tasync onPublish(): Promise<void> {\n\t\tthis.isUpdating.set(true);\n\n\t\ttry {\n\t\t\tawait this.versionService.publish(this.collection(), this.documentId());\n\t\t\tthis.updateStatusDisplay('published');\n\t\t\tthis.statusChanged.emit('published');\n\t\t} catch {\n\t\t\t// Error handled by crudToastInterceptor\n\t\t} finally {\n\t\t\tthis.isUpdating.set(false);\n\t\t}\n\t}\n\n\t/**\n\t * Unpublish the document.\n\t */\n\tasync onUnpublish(): Promise<void> {\n\t\tconst confirmed = await this.feedback.confirmUnpublish(this.documentLabel());\n\n\t\tif (!confirmed) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.isUpdating.set(true);\n\n\t\ttry {\n\t\t\tawait this.versionService.unpublish(this.collection(), this.documentId());\n\t\t\tthis.updateStatusDisplay('draft');\n\t\t\tthis.statusChanged.emit('draft');\n\t\t} catch {\n\t\t\t// Error handled by crudToastInterceptor\n\t\t} finally {\n\t\t\tthis.isUpdating.set(false);\n\t\t}\n\t}\n}\n","import {\n\tChangeDetectionStrategy,\n\tComponent,\n\tcomputed,\n\teffect,\n\tinject,\n\tinput,\n\toutput,\n\tsignal,\n} from '@angular/core';\nimport { Router } from '@angular/router';\nimport type { CollectionConfig, Field, DocumentStatus } from '@momentumcms/core';\nimport { humanizeFieldName, getSoftDeleteField } from '@momentumcms/core';\nimport {\n\tCard,\n\tCardContent,\n\tCardFooter,\n\tButton,\n\tAlert,\n\tSkeleton,\n\tFieldDisplay,\n\tBreadcrumbs,\n\tBreadcrumbItem,\n\tBreadcrumbSeparator,\n} from '@momentumcms/ui';\nimport type {\n\tFieldDisplayType,\n\tFieldDisplayFieldMeta,\n\tFieldDisplayNumberFormat,\n\tFieldDisplayDateFormat,\n} from '@momentumcms/ui';\nimport { injectMomentumAPI } from '../../services/momentum-api.service';\nimport { CollectionAccessService } from '../../services/collection-access.service';\nimport { FeedbackService } from '../feedback/feedback.service';\nimport { isRecord, getTitleField } from '../entity-form/entity-form.types';\nimport type { Entity, EntityAction } from '../widget.types';\nimport type { EntityViewFieldConfig } from './entity-view.types';\nimport { VersionHistoryWidget } from '../version-history/version-history.component';\nimport { PublishControlsWidget } from '../publish-controls/publish-controls.component';\n\n/**\n * Entity View Widget\n *\n * Read-only entity display connected to Momentum API.\n *\n * @example\n * ```html\n * <mcms-entity-view\n * [collection]=\"postsCollection\"\n * entityId=\"123\"\n * (edit)=\"onEdit($event)\"\n * (delete)=\"onDelete($event)\"\n * />\n * ```\n */\n@Component({\n\tselector: 'mcms-entity-view',\n\timports: [\n\t\tCard,\n\t\tCardContent,\n\t\tCardFooter,\n\t\tButton,\n\t\tAlert,\n\t\tSkeleton,\n\t\tFieldDisplay,\n\t\tBreadcrumbs,\n\t\tBreadcrumbItem,\n\t\tBreadcrumbSeparator,\n\t\tVersionHistoryWidget,\n\t\tPublishControlsWidget,\n\t],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: { class: 'block' },\n\ttemplate: `\n\t\t<div class=\"max-w-4xl\">\n\t\t\t@if (showBreadcrumbs()) {\n\t\t\t\t<mcms-breadcrumbs class=\"mb-6\">\n\t\t\t\t\t<mcms-breadcrumb-item [href]=\"dashboardPath()\">Dashboard</mcms-breadcrumb-item>\n\t\t\t\t\t<mcms-breadcrumb-separator />\n\t\t\t\t\t<mcms-breadcrumb-item [href]=\"collectionListPath()\">{{\n\t\t\t\t\t\tcollectionLabel()\n\t\t\t\t\t}}</mcms-breadcrumb-item>\n\t\t\t\t\t<mcms-breadcrumb-separator />\n\t\t\t\t\t<mcms-breadcrumb-item [current]=\"true\">{{ entityTitle() }}</mcms-breadcrumb-item>\n\t\t\t\t</mcms-breadcrumbs>\n\t\t\t}\n\n\t\t\t@if (isDeleted()) {\n\t\t\t\t<mcms-alert variant=\"destructive\" class=\"mb-6\">\n\t\t\t\t\tThis {{ collectionLabelSingular().toLowerCase() }} has been deleted.\n\t\t\t\t</mcms-alert>\n\t\t\t}\n\n\t\t\t<!-- Page Header -->\n\t\t\t<div class=\"mb-8 flex items-start justify-between\">\n\t\t\t\t<div>\n\t\t\t\t\t<div class=\"flex items-center gap-3\">\n\t\t\t\t\t\t<h1 class=\"text-2xl font-semibold tracking-tight\">{{ entityTitle() }}</h1>\n\t\t\t\t\t\t@if (hasVersioning() && entity()) {\n\t\t\t\t\t\t\t<mcms-publish-controls\n\t\t\t\t\t\t\t\t[collection]=\"collection().slug\"\n\t\t\t\t\t\t\t\t[documentId]=\"entityId()\"\n\t\t\t\t\t\t\t\t[documentLabel]=\"collectionLabelSingular()\"\n\t\t\t\t\t\t\t\t[initialStatus]=\"documentStatus()\"\n\t\t\t\t\t\t\t\t(statusChanged)=\"onStatusChanged($event)\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t\t<p class=\"mt-1 text-muted-foreground\">\n\t\t\t\t\t\tViewing {{ collectionLabelSingular().toLowerCase() }} details\n\t\t\t\t\t</p>\n\t\t\t\t\t<ng-content select=\"[entityViewHeaderExtra]\" />\n\t\t\t\t</div>\n\t\t\t\t<div class=\"flex items-center gap-3\">\n\t\t\t\t\t@if (previewUrl(); as url) {\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\tmcms-button\n\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\t[href]=\"url\"\n\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\t\tdata-testid=\"open-page-link\"\n\t\t\t\t\t\t\t>Open Page ↗</a\n\t\t\t\t\t\t>\n\t\t\t\t\t}\n\t\t\t\t\t@if (isDeleted()) {\n\t\t\t\t\t\t@if (canEdit()) {\n\t\t\t\t\t\t\t<button mcms-button variant=\"outline\" (click)=\"onRestoreClick()\">Restore</button>\n\t\t\t\t\t\t}\n\t\t\t\t\t\t@if (canDelete()) {\n\t\t\t\t\t\t\t<button mcms-button variant=\"destructive\" (click)=\"onForceDeleteClick()\">\n\t\t\t\t\t\t\t\tPermanently Delete\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t}\n\t\t\t\t\t} @else {\n\t\t\t\t\t\t@if (canEdit()) {\n\t\t\t\t\t\t\t<button mcms-button variant=\"outline\" (click)=\"onEditClick()\">Edit</button>\n\t\t\t\t\t\t}\n\t\t\t\t\t\t@if (canDelete()) {\n\t\t\t\t\t\t\t<button mcms-button variant=\"destructive\" (click)=\"onDeleteClick()\">\n\t\t\t\t\t\t\t\t{{ hasSoftDelete() ? 'Move to Trash' : 'Delete' }}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t@for (action of actions(); track action.id) {\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tmcms-button\n\t\t\t\t\t\t\t[variant]=\"action.variant === 'destructive' ? 'destructive' : 'outline'\"\n\t\t\t\t\t\t\t[disabled]=\"action.disabled ?? false\"\n\t\t\t\t\t\t\t(click)=\"onActionClick(action)\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{{ action.label }}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<mcms-card>\n\t\t\t\t<mcms-card-content>\n\t\t\t\t\t@if (isLoading()) {\n\t\t\t\t\t\t<div class=\"grid gap-6 md:grid-cols-2\">\n\t\t\t\t\t\t\t@for (_ of [1, 2, 3, 4]; track $index) {\n\t\t\t\t\t\t\t\t<div class=\"space-y-2\">\n\t\t\t\t\t\t\t\t\t<mcms-skeleton class=\"h-4 w-24\" />\n\t\t\t\t\t\t\t\t\t<mcms-skeleton class=\"h-6 w-full\" />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t} @else if (loadError()) {\n\t\t\t\t\t\t<mcms-alert variant=\"destructive\">\n\t\t\t\t\t\t\t{{ loadError() }}\n\t\t\t\t\t\t</mcms-alert>\n\t\t\t\t\t} @else if (entity()) {\n\t\t\t\t\t\t<div class=\"grid gap-6 md:grid-cols-2\">\n\t\t\t\t\t\t\t@for (field of visibleFields(); track field.name) {\n\t\t\t\t\t\t\t\t<mcms-field-display\n\t\t\t\t\t\t\t\t\t[value]=\"getFieldValue(field.name)\"\n\t\t\t\t\t\t\t\t\t[type]=\"getFieldDisplayType(field)\"\n\t\t\t\t\t\t\t\t\t[label]=\"field.label || field.name\"\n\t\t\t\t\t\t\t\t\t[fieldMeta]=\"getFieldMeta(field)\"\n\t\t\t\t\t\t\t\t\t[numberFormat]=\"getNumberFormat(field)\"\n\t\t\t\t\t\t\t\t\t[dateFormat]=\"getDateFormat(field)\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t@if (hasTimestamps()) {\n\t\t\t\t\t\t\t\t<mcms-field-display\n\t\t\t\t\t\t\t\t\t[value]=\"entity()!['createdAt']\"\n\t\t\t\t\t\t\t\t\ttype=\"datetime\"\n\t\t\t\t\t\t\t\t\tlabel=\"Created At\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<mcms-field-display\n\t\t\t\t\t\t\t\t\t[value]=\"entity()!['updatedAt']\"\n\t\t\t\t\t\t\t\t\ttype=\"datetime\"\n\t\t\t\t\t\t\t\t\tlabel=\"Updated At\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t</mcms-card-content>\n\n\t\t\t\t@if (!suppressNavigation()) {\n\t\t\t\t\t<mcms-card-footer class=\"flex justify-start border-t bg-muted/50 px-6 py-4\">\n\t\t\t\t\t\t<button mcms-button variant=\"outline\" (click)=\"navigateBack()\">\n\t\t\t\t\t\t\t← Back to {{ collectionLabel() }}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</mcms-card-footer>\n\t\t\t\t}\n\t\t\t</mcms-card>\n\n\t\t\t@if (hasVersioning() && entity() && showVersionHistory()) {\n\t\t\t\t<div class=\"mt-8\">\n\t\t\t\t\t<mcms-version-history\n\t\t\t\t\t\t[collection]=\"collection().slug\"\n\t\t\t\t\t\t[documentId]=\"entityId()\"\n\t\t\t\t\t\t[documentLabel]=\"collectionLabelSingular()\"\n\t\t\t\t\t\t(restored)=\"onVersionRestored()\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t}\n\t\t</div>\n\t`,\n})\nexport class EntityViewWidget<T extends Entity = Entity> {\n\tprivate readonly api = injectMomentumAPI();\n\tprivate readonly collectionAccess = inject(CollectionAccessService);\n\tprivate readonly feedback = inject(FeedbackService);\n\tprivate readonly router = inject(Router);\n\n\t/** The collection configuration */\n\treadonly collection = input.required<CollectionConfig>();\n\n\t/** Entity ID to view */\n\treadonly entityId = input.required<string>();\n\n\t/** Base path for navigation */\n\treadonly basePath = input('/admin/collections');\n\n\t/** Whether to show breadcrumbs */\n\treadonly showBreadcrumbs = input(true);\n\n\t/** Custom field configurations */\n\treadonly fieldConfigs = input<EntityViewFieldConfig[]>([]);\n\n\t/** Additional actions to show */\n\treadonly actions = input<EntityAction[]>([]);\n\n\t/** Whether to show version history (only shown if versioning is enabled) */\n\treadonly showVersionHistory = input(true);\n\n\t/** When true, prevents router navigation (used in entity sheet) */\n\treadonly suppressNavigation = input(false);\n\n\t/** Outputs */\n\treadonly edit = output<T>();\n\treadonly statusChanged = output<DocumentStatus>();\n\treadonly delete_ = output<T>();\n\treadonly actionClick = output<{ action: EntityAction; entity: T }>();\n\n\t/** Internal state */\n\treadonly entity = signal<T | null>(null);\n\treadonly isLoading = signal(false);\n\treadonly loadError = signal<string | null>(null);\n\treadonly resolvedRelationships = signal<Map<string, string>>(new Map());\n\n\t/** Computed collection label */\n\treadonly collectionLabel = computed(() => {\n\t\tconst col = this.collection();\n\t\treturn humanizeFieldName(col.labels?.plural || col.slug);\n\t});\n\n\t/** Computed collection label singular */\n\treadonly collectionLabelSingular = computed(() => {\n\t\tconst col = this.collection();\n\t\treturn humanizeFieldName(col.labels?.singular || col.slug);\n\t});\n\n\t/** Entity title (uses title field or ID) */\n\treadonly entityTitle = computed(() => {\n\t\tconst e = this.entity();\n\t\tif (!e) return 'Loading...';\n\n\t\t// Try common title fields\n\t\tconst titleFields = ['title', 'name', 'label', 'subject'];\n\t\tfor (const field of titleFields) {\n\t\t\tif (e[field] && typeof e[field] === 'string') {\n\t\t\t\treturn e[field];\n\t\t\t}\n\t\t}\n\n\t\treturn `${this.collectionLabelSingular()} ${e.id}`;\n\t});\n\n\t/** Visible fields (excluding hidden ones) */\n\treadonly visibleFields = computed((): Field[] => {\n\t\tconst col = this.collection();\n\t\tconst configs = this.fieldConfigs();\n\n\t\treturn col.fields.filter((field) => {\n\t\t\t// Check custom config\n\t\t\tconst config = configs.find((c) => c.field === field.name);\n\t\t\tif (config?.hidden) return false;\n\n\t\t\t// Check admin hidden\n\t\t\tif (field.admin?.hidden) return false;\n\n\t\t\treturn true;\n\t\t});\n\t});\n\n\t/** Whether collection has timestamps */\n\treadonly hasTimestamps = computed(() => {\n\t\tconst col = this.collection();\n\t\treturn (\n\t\t\tcol.timestamps === true ||\n\t\t\t(typeof col.timestamps === 'object' && col.timestamps.createdAt !== false)\n\t\t);\n\t});\n\n\t/** Dashboard path */\n\treadonly dashboardPath = computed(() => {\n\t\tconst base = this.basePath();\n\t\t// Remove /collections from base if present\n\t\treturn base.replace(/\\/collections$/, '');\n\t});\n\n\t/** Collection list path */\n\treadonly collectionListPath = computed(() => {\n\t\treturn `${this.basePath()}/${this.collection().slug}`;\n\t});\n\n\t/** Whether user can edit */\n\treadonly canEdit = computed(() => {\n\t\treturn this.collectionAccess.canUpdate(this.collection().slug);\n\t});\n\n\t/** Whether user can delete */\n\treadonly canDelete = computed(() => {\n\t\treturn this.collectionAccess.canDelete(this.collection().slug);\n\t});\n\n\t/** Whether collection has soft delete enabled */\n\treadonly hasSoftDelete = computed(() => !!this.collection().softDelete);\n\n\t/** Whether the current entity is soft-deleted */\n\treadonly isDeleted = computed(() => {\n\t\tconst e = this.entity();\n\t\tif (!e || !this.hasSoftDelete()) return false;\n\t\tconst field = getSoftDeleteField(this.collection());\n\t\treturn field ? !!e[field] : false;\n\t});\n\n\t/** Whether collection has versioning enabled */\n\treadonly hasVersioning = computed(() => {\n\t\tconst col = this.collection();\n\t\treturn !!col.versions;\n\t});\n\n\t/** Current document status (from entity or default to 'draft') */\n\treadonly documentStatus = computed((): DocumentStatus => {\n\t\tconst e = this.entity();\n\t\tif (!e) return 'draft';\n\t\tconst status = e['_status'];\n\t\tif (status === 'published') return 'published';\n\t\treturn 'draft';\n\t});\n\n\t/** Preview URL derived from collection's admin.preview config */\n\treadonly previewUrl = computed((): string | null => {\n\t\tconst col = this.collection();\n\t\tconst e = this.entity();\n\t\tif (!e || !col.admin?.preview) return null;\n\t\tif (typeof col.admin.preview === 'function') {\n\t\t\ttry {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- T extends Entity with index signature\n\t\t\t\treturn col.admin.preview(e as Record<string, unknown>);\n\t\t\t} catch {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t});\n\n\tconstructor() {\n\t\t// Load entity when collection or entityId changes\n\t\teffect(() => {\n\t\t\tconst col = this.collection();\n\t\t\tconst id = this.entityId();\n\n\t\t\tif (col && id) {\n\t\t\t\tthis.loadEntity(col.slug, id);\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Load entity from API.\n\t */\n\tprivate async loadEntity(slug: string, id: string): Promise<void> {\n\t\tthis.isLoading.set(true);\n\t\tthis.loadError.set(null);\n\n\t\ttry {\n\t\t\tconst entity = await this.api\n\t\t\t\t.collection<T>(slug)\n\t\t\t\t.findById(id, { depth: 1, withDeleted: this.hasSoftDelete() });\n\t\t\tif (entity) {\n\t\t\t\tthis.entity.set(entity);\n\t\t\t\tthis.resolveRelationships(entity);\n\t\t\t} else {\n\t\t\t\tthis.loadError.set(`${this.collectionLabelSingular()} not found`);\n\t\t\t\tthis.feedback.entityNotFound(this.collectionLabelSingular());\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tthis.loadError.set('Failed to load data');\n\t\t\tthis.feedback.operationFailed('Load failed', err instanceof Error ? err : undefined);\n\t\t} finally {\n\t\t\tthis.isLoading.set(false);\n\t\t}\n\t}\n\n\t/**\n\t * Get field value from entity, resolving relationship labels.\n\t */\n\tgetFieldValue(fieldName: string): unknown {\n\t\tconst e = this.entity();\n\t\tif (!e) return undefined;\n\n\t\tconst resolved = this.resolvedRelationships().get(fieldName);\n\t\tif (resolved !== undefined) return resolved;\n\n\t\tconst value = e[fieldName];\n\n\t\t// Handle populated relationship objects (from depth: 1)\n\t\tif (isRecord(value) && 'id' in value) {\n\t\t\tconst title = value['title'] ?? value['name'] ?? value['label'];\n\t\t\tif (typeof title === 'string') return title;\n\t\t\treturn String(value['id']);\n\t\t}\n\n\t\treturn value;\n\t}\n\n\t/**\n\t * Get field display type from field definition.\n\t */\n\tgetFieldDisplayType(field: Field): FieldDisplayType {\n\t\t// Check custom config first\n\t\tconst configs = this.fieldConfigs();\n\t\tconst config = configs.find((c) => c.field === field.name);\n\t\tif (config?.type) return config.type;\n\n\t\t// Map field type to display type\n\t\tswitch (field.type) {\n\t\t\tcase 'text':\n\t\t\tcase 'textarea':\n\t\t\t\treturn 'text';\n\t\t\tcase 'richText':\n\t\t\t\treturn 'html';\n\t\t\tcase 'email':\n\t\t\t\treturn 'email';\n\t\t\tcase 'number':\n\t\t\t\treturn 'number';\n\t\t\tcase 'checkbox':\n\t\t\t\treturn 'boolean';\n\t\t\tcase 'date':\n\t\t\t\treturn 'date';\n\t\t\tcase 'select':\n\t\t\tcase 'radio':\n\t\t\t\treturn 'badge';\n\t\t\tcase 'relationship':\n\t\t\t\treturn 'text';\n\t\t\tcase 'array':\n\t\t\t\treturn 'array-table';\n\t\t\tcase 'group':\n\t\t\t\treturn 'group';\n\t\t\tcase 'json':\n\t\t\t\treturn 'json';\n\t\t\tdefault:\n\t\t\t\treturn 'text';\n\t\t}\n\t}\n\n\t/**\n\t * Get sub-field metadata for group and array field types.\n\t */\n\tgetFieldMeta(field: Field): FieldDisplayFieldMeta[] {\n\t\tif (field.type === 'group' || field.type === 'array') {\n\t\t\treturn field.fields\n\t\t\t\t.filter((f) => !f.admin?.hidden)\n\t\t\t\t.map((f) => ({\n\t\t\t\t\tname: f.name,\n\t\t\t\t\tlabel: f.label ?? humanizeFieldName(f.name),\n\t\t\t\t\ttype: f.type,\n\t\t\t\t}));\n\t\t}\n\t\treturn [];\n\t}\n\n\t/**\n\t * Get number format config from field definition.\n\t */\n\tgetNumberFormat(field: Field): FieldDisplayNumberFormat | undefined {\n\t\tif (field.type === 'number' && field.displayFormat) {\n\t\t\treturn field.displayFormat;\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Get date format config from field definition.\n\t */\n\tgetDateFormat(field: Field): FieldDisplayDateFormat | undefined {\n\t\tif (field.type === 'date' && field.displayFormat) {\n\t\t\treturn field.displayFormat;\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Handle edit button click.\n\t */\n\tonEditClick(): void {\n\t\tconst e = this.entity();\n\t\tif (e) {\n\t\t\tthis.edit.emit(e);\n\t\t\tif (!this.suppressNavigation()) {\n\t\t\t\tthis.router.navigate([`${this.collectionListPath()}/${e.id}/edit`]);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Handle delete button click.\n\t */\n\tasync onDeleteClick(): Promise<void> {\n\t\tconst e = this.entity();\n\t\tif (!e) return;\n\n\t\tconst entityTitle = this.entityTitle();\n\t\tconst confirmed = await this.feedback.confirmDelete(\n\t\t\tthis.collectionLabelSingular(),\n\t\t\tentityTitle !== `${this.collectionLabelSingular()} ${e.id}` ? entityTitle : undefined,\n\t\t);\n\n\t\tif (confirmed) {\n\t\t\ttry {\n\t\t\t\tawait this.api.collection(this.collection().slug).delete(String(e.id));\n\t\t\t\tthis.delete_.emit(e);\n\t\t\t\tthis.navigateBack();\n\t\t\t} catch {\n\t\t\t\t// Error handled by crudToastInterceptor\n\t\t\t}\n\t\t}\n\t}\n\n\tasync onRestoreClick(): Promise<void> {\n\t\tconst e = this.entity();\n\t\tif (!e) return;\n\n\t\ttry {\n\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- T extends Entity, safe cast for API call\n\t\t\tconst restored = (await this.api\n\t\t\t\t.collection(this.collection().slug)\n\t\t\t\t.restore(String(e.id))) as T;\n\t\t\tthis.entity.set(restored);\n\t\t} catch {\n\t\t\t// Error handled by crudToastInterceptor\n\t\t}\n\t}\n\n\tasync onForceDeleteClick(): Promise<void> {\n\t\tconst e = this.entity();\n\t\tif (!e) return;\n\n\t\tconst entityTitle = this.entityTitle();\n\t\tconst confirmed = await this.feedback.confirmDelete(\n\t\t\tthis.collectionLabelSingular(),\n\t\t\tentityTitle !== `${this.collectionLabelSingular()} ${e.id}` ? entityTitle : undefined,\n\t\t);\n\n\t\tif (confirmed) {\n\t\t\ttry {\n\t\t\t\tawait this.api.collection(this.collection().slug).forceDelete(String(e.id));\n\t\t\t\tthis.delete_.emit(e);\n\t\t\t\tthis.navigateBack();\n\t\t\t} catch {\n\t\t\t\t// Error handled by crudToastInterceptor\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Handle custom action click.\n\t */\n\tonActionClick(action: EntityAction): void {\n\t\tconst e = this.entity();\n\t\tif (e) {\n\t\t\tthis.actionClick.emit({ action, entity: e });\n\t\t}\n\t}\n\n\t/**\n\t * Navigate back to collection list.\n\t */\n\tnavigateBack(): void {\n\t\tif (!this.suppressNavigation()) {\n\t\t\tthis.router.navigate([this.collectionListPath()]);\n\t\t}\n\t}\n\n\t/**\n\t * Handle status change from publish controls.\n\t */\n\tonStatusChanged(status: DocumentStatus): void {\n\t\t// Update the entity's status in the local state\n\t\tconst e = this.entity();\n\t\tif (e) {\n\t\t\tthis.entity.set({ ...e, _status: status });\n\t\t}\n\t\tthis.statusChanged.emit(status);\n\t}\n\n\t/**\n\t * Handle version restoration.\n\t */\n\tonVersionRestored(): void {\n\t\t// Reload the entity to get the restored data\n\t\tthis.loadEntity(this.collection().slug, this.entityId());\n\t}\n\n\t/**\n\t * Resolve relationship field values from IDs to display labels.\n\t */\n\tprivate resolveRelationships(entity: T): void {\n\t\tconst fields = this.collection().fields;\n\t\tconst resolved = new Map<string, string>();\n\n\t\tconst promises: Promise<void>[] = [];\n\n\t\tfor (const field of fields) {\n\t\t\tif (field.type !== 'relationship') continue;\n\n\t\t\tconst rawValue = entity[field.name];\n\t\t\tif (!rawValue || typeof rawValue !== 'string') continue;\n\n\t\t\tconst config = field.collection();\n\t\t\tif (!isRecord(config) || typeof config['slug'] !== 'string') continue;\n\n\t\t\tconst relSlug = config['slug'];\n\t\t\tconst titleField = getTitleField(config);\n\n\t\t\tpromises.push(\n\t\t\t\tthis.api\n\t\t\t\t\t.collection<Record<string, unknown>>(relSlug)\n\t\t\t\t\t.findById(rawValue)\n\t\t\t\t\t.then((doc) => {\n\t\t\t\t\t\tif (doc) {\n\t\t\t\t\t\t\tif (titleField !== 'id') {\n\t\t\t\t\t\t\t\tconst titleValue = doc[titleField];\n\t\t\t\t\t\t\t\tif (typeof titleValue === 'string') {\n\t\t\t\t\t\t\t\t\tresolved.set(field.name, titleValue);\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tresolved.set(field.name, String(doc['id'] ?? rawValue));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tresolved.set(field.name, 'Unknown');\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t.catch(() => {\n\t\t\t\t\t\tresolved.set(field.name, 'Unknown');\n\t\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tif (promises.length > 0) {\n\t\t\tPromise.all(promises).then(() => {\n\t\t\t\tthis.resolvedRelationships.set(resolved);\n\t\t\t});\n\t\t}\n\t}\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, signal } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport type { CollectionConfig } from '@momentumcms/core';\nimport { humanizeFieldName } from '@momentumcms/core';\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroXMark } from '@ng-icons/heroicons/outline';\nimport { Button } from '@momentumcms/ui';\nimport { EntityFormWidget } from '../../widgets/entity-form/entity-form.component';\nimport { EntityViewWidget } from '../../widgets/entity-view/entity-view.component';\nimport { EntitySheetService, SHEET_QUERY_PARAMS } from '../../services/entity-sheet.service';\nimport { getCollectionsFromRouteData } from '../../utils/route-data';\nimport type { EntityFormMode } from '../../widgets/entity-form/entity-form.types';\nimport type { Entity } from '../../widgets/widget.types';\n\n/**\n * Entity Sheet Content Component\n *\n * Rendered directly inside the AdminShell when the sheet is open.\n * Reads query parameters to determine which collection/entity to show\n * and renders the appropriate form or view widget.\n */\n@Component({\n\tselector: 'mcms-entity-sheet-content',\n\timports: [EntityFormWidget, EntityViewWidget, NgIcon, Button],\n\tproviders: [provideIcons({ heroXMark })],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: { class: 'flex flex-col h-full' },\n\ttemplate: `\n\t\t<!-- Header -->\n\t\t<header\n\t\t\tclass=\"flex items-center justify-between gap-4 border-b border-border bg-card px-6 py-4 shrink-0\"\n\t\t>\n\t\t\t<h2 id=\"mcms-sheet-title\" class=\"text-lg font-semibold tracking-tight truncate\">\n\t\t\t\t{{ title() }}\n\t\t\t</h2>\n\t\t\t<button\n\t\t\t\tmcms-button\n\t\t\t\tvariant=\"ghost\"\n\t\t\t\tclass=\"shrink-0\"\n\t\t\t\t(click)=\"onClose()\"\n\t\t\t\taria-label=\"Close sheet\"\n\t\t\t>\n\t\t\t\t<ng-icon name=\"heroXMark\" size=\"20\" aria-hidden=\"true\" />\n\t\t\t</button>\n\t\t</header>\n\n\t\t<!-- Content -->\n\t\t<div class=\"flex-1 overflow-y-auto p-6\">\n\t\t\t@if (mode() === 'view' && collection() && entityId()) {\n\t\t\t\t<mcms-entity-view\n\t\t\t\t\t[collection]=\"collection()!\"\n\t\t\t\t\t[entityId]=\"entityId()!\"\n\t\t\t\t\t[suppressNavigation]=\"true\"\n\t\t\t\t\t[showBreadcrumbs]=\"false\"\n\t\t\t\t\t[showVersionHistory]=\"false\"\n\t\t\t\t\t(edit)=\"onSwitchToEdit()\"\n\t\t\t\t\t(delete_)=\"onDeleted($event)\"\n\t\t\t\t/>\n\t\t\t} @else if (collection()) {\n\t\t\t\t<mcms-entity-form\n\t\t\t\t\t[collection]=\"collection()!\"\n\t\t\t\t\t[entityId]=\"entityId()\"\n\t\t\t\t\t[mode]=\"formMode()\"\n\t\t\t\t\t[suppressNavigation]=\"true\"\n\t\t\t\t\t[showBreadcrumbs]=\"false\"\n\t\t\t\t\t(saved)=\"onSaved($event)\"\n\t\t\t\t\t(cancelled)=\"onClose()\"\n\t\t\t\t/>\n\t\t\t}\n\t\t</div>\n\t`,\n})\nexport class EntitySheetContentComponent {\n\tprivate readonly route = inject(ActivatedRoute);\n\tprivate readonly router = inject(Router);\n\tprivate readonly sheetService = inject(EntitySheetService);\n\n\t/** Query params as a signal */\n\tprivate readonly queryParams = toSignal(this.route.queryParamMap);\n\n\t/** The collection slug from query params */\n\treadonly collectionSlug = computed(\n\t\t() => this.queryParams()?.get(SHEET_QUERY_PARAMS.collection) ?? null,\n\t);\n\n\t/** The entity ID from query params (null for create mode) */\n\treadonly entityId = computed(\n\t\t() => this.queryParams()?.get(SHEET_QUERY_PARAMS.entityId) ?? undefined,\n\t);\n\n\t/** The mode from query params */\n\tprivate readonly rawMode = computed(\n\t\t() => this.queryParams()?.get(SHEET_QUERY_PARAMS.mode) ?? null,\n\t);\n\n\t/** Local mode override (for switching from view to edit within the sheet) */\n\tprivate readonly localModeOverride = signal<EntityFormMode | null>(null);\n\n\t/** Effective mode */\n\treadonly mode = computed((): EntityFormMode => {\n\t\tconst override = this.localModeOverride();\n\t\tif (override) return override;\n\n\t\tconst raw = this.rawMode();\n\t\tif (raw === 'view' || raw === 'edit' || raw === 'create') return raw;\n\t\treturn this.entityId() ? 'view' : 'create';\n\t});\n\n\t/** Form mode (maps 'view' to 'edit' for the form widget since view uses EntityViewWidget) */\n\treadonly formMode = computed((): EntityFormMode => {\n\t\tconst m = this.mode();\n\t\treturn m === 'view' ? 'edit' : m;\n\t});\n\n\t/** Collection config resolved from route data */\n\treadonly collection = computed((): CollectionConfig | null => {\n\t\tconst slug = this.collectionSlug();\n\t\tif (!slug) return null;\n\n\t\t// Walk up the route tree to find the admin shell route with collections data\n\t\tlet current: ActivatedRoute | null = this.route;\n\t\twhile (current) {\n\t\t\tconst collections = getCollectionsFromRouteData(current.snapshot.data);\n\t\t\tif (collections.length > 0) {\n\t\t\t\treturn collections.find((c) => c.slug === slug) ?? null;\n\t\t\t}\n\t\t\tcurrent = current.parent;\n\t\t}\n\t\treturn null;\n\t});\n\n\t/** Human-readable title */\n\treadonly title = computed((): string => {\n\t\tconst col = this.collection();\n\t\tconst m = this.mode();\n\t\tconst label = col ? humanizeFieldName(col.labels?.singular ?? col.slug) : 'Entity';\n\n\t\tswitch (m) {\n\t\t\tcase 'create':\n\t\t\t\treturn `Create ${label}`;\n\t\t\tcase 'edit':\n\t\t\t\treturn `Edit ${label}`;\n\t\t\tdefault:\n\t\t\t\treturn label;\n\t\t}\n\t});\n\n\t/** Handle entity saved */\n\tonSaved(entity: Entity): void {\n\t\tconst slug = this.collectionSlug() ?? '';\n\t\tthis.sheetService.close({\n\t\t\taction: this.mode() === 'create' ? 'created' : 'updated',\n\t\t\tentity,\n\t\t\tcollection: slug,\n\t\t});\n\t}\n\n\t/** Handle entity deleted */\n\tonDeleted(entity: Entity): void {\n\t\tconst slug = this.collectionSlug() ?? '';\n\t\tthis.sheetService.close({ action: 'deleted', entity, collection: slug });\n\t}\n\n\t/** Handle close */\n\tonClose(): void {\n\t\tconst slug = this.collectionSlug() ?? '';\n\t\tthis.sheetService.close({ action: 'cancelled', collection: slug });\n\t}\n\n\t/** Switch from view to edit mode within the sheet */\n\tonSwitchToEdit(): void {\n\t\tthis.localModeOverride.set('edit');\n\t\t// Also update the query param so URL stays in sync\n\t\tthis.router.navigate([], {\n\t\t\tqueryParams: { [SHEET_QUERY_PARAMS.mode]: 'edit' },\n\t\t\tqueryParamsHandling: 'merge',\n\t\t});\n\t}\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input, output } from '@angular/core';\nimport type { CollectionConfig, GlobalConfig } from '@momentumcms/core';\nimport {\n\tSidebar,\n\tSidebarNav,\n\tSidebarNavItem,\n\tSidebarSection,\n\tAvatar,\n\tAvatarFallback,\n\tDropdownMenu,\n\tDropdownMenuItem,\n\tDropdownSeparator,\n\tDropdownLabel,\n\tDropdownTrigger,\n} from '@momentumcms/ui';\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport {\n\theroSquares2x2,\n\theroNewspaper,\n\theroUsers,\n\theroPhoto,\n\theroDocument,\n\theroFolder,\n\theroBolt,\n\theroChevronUpDown,\n\theroChartBarSquare,\n\theroDocumentText,\n\theroCog6Tooth,\n\theroPuzzlePiece,\n} from '@ng-icons/heroicons/outline';\nimport type { AdminBranding, AdminUser } from '../widget.types';\nimport { humanizeFieldName } from '@momentumcms/core';\nimport { McmsThemeService } from '../../ui/theme/theme.service';\nimport type { AdminPluginRoute } from '../../routes/momentum-admin-routes';\n\ninterface CollectionGroup {\n\tname: string;\n\tcollections: CollectionConfig[];\n}\n\ninterface GlobalGroup {\n\tname: string;\n\tglobals: GlobalConfig[];\n}\n\ninterface PluginRouteGroup {\n\tname: string;\n\troutes: AdminPluginRoute[];\n}\n\n/**\n * Admin Sidebar Widget\n *\n * CMS-specific sidebar with collection navigation and user section.\n * Composes UI library Sidebar components with Momentum CMS logic.\n *\n * Features:\n * - Collection grouping via admin.group field\n * - Plugin-registered route sections\n *\n * @example\n * ```html\n * <mcms-admin-sidebar\n * [branding]=\"{ title: 'My CMS', logo: '/logo.svg' }\"\n * [collections]=\"collections\"\n * [pluginRoutes]=\"pluginRoutes\"\n * [user]=\"currentUser\"\n * basePath=\"/admin\"\n * (signOut)=\"onSignOut()\"\n * />\n * ```\n */\n@Component({\n\tselector: 'mcms-admin-sidebar',\n\timports: [\n\t\tSidebar,\n\t\tSidebarNav,\n\t\tSidebarNavItem,\n\t\tSidebarSection,\n\t\tAvatar,\n\t\tAvatarFallback,\n\t\tDropdownMenu,\n\t\tDropdownMenuItem,\n\t\tDropdownSeparator,\n\t\tDropdownLabel,\n\t\tDropdownTrigger,\n\t\tNgIcon,\n\t],\n\tproviders: [\n\t\tprovideIcons({\n\t\t\theroSquares2x2,\n\t\t\theroNewspaper,\n\t\t\theroUsers,\n\t\t\theroPhoto,\n\t\t\theroDocument,\n\t\t\theroFolder,\n\t\t\theroBolt,\n\t\t\theroChevronUpDown,\n\t\t\theroChartBarSquare,\n\t\t\theroDocumentText,\n\t\t\theroCog6Tooth,\n\t\t\theroPuzzlePiece,\n\t\t}),\n\t],\n\thost: {\n\t\tclass: 'shrink-0',\n\t},\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\ttemplate: `\n\t\t<mcms-sidebar [collapsed]=\"collapsed()\" [width]=\"width()\">\n\t\t\t<!-- Header -->\n\t\t\t<div mcmsSidebarHeader>\n\t\t\t\t<div class=\"flex items-center gap-3\">\n\t\t\t\t\t@if (branding()?.logo) {\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t[src]=\"branding()!.logo\"\n\t\t\t\t\t\t\t[alt]=\"(branding()?.title || 'Momentum CMS') + ' logo'\"\n\t\t\t\t\t\t\tclass=\"h-8 w-8\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t} @else {\n\t\t\t\t\t\t<!-- Default logo icon -->\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=\"h-9 w-9 rounded-lg bg-sidebar-primary flex items-center justify-center shrink-0\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<ng-icon\n\t\t\t\t\t\t\t\tname=\"heroBolt\"\n\t\t\t\t\t\t\t\tclass=\"text-sidebar-primary-foreground\"\n\t\t\t\t\t\t\t\tsize=\"20\"\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t\t<h1 class=\"text-lg font-bold tracking-tight\">\n\t\t\t\t\t\t{{ branding()?.title || 'Momentum CMS' }}\n\t\t\t\t\t</h1>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<!-- Navigation -->\n\t\t\t<div mcmsSidebarContent>\n\t\t\t\t<mcms-sidebar-nav ariaLabel=\"Main navigation\">\n\t\t\t\t\t<!-- Dashboard -->\n\t\t\t\t\t<mcms-sidebar-nav-item\n\t\t\t\t\t\tlabel=\"Dashboard\"\n\t\t\t\t\t\t[href]=\"basePath()\"\n\t\t\t\t\t\ticon=\"heroSquares2x2\"\n\t\t\t\t\t\t[exact]=\"true\"\n\t\t\t\t\t/>\n\n\t\t\t\t\t<!-- Collection Sections (grouped by admin.group) -->\n\t\t\t\t\t@for (group of collectionGroups(); track group.name) {\n\t\t\t\t\t\t<mcms-sidebar-section [title]=\"group.name\">\n\t\t\t\t\t\t\t@for (collection of group.collections; track collection.slug) {\n\t\t\t\t\t\t\t\t<mcms-sidebar-nav-item\n\t\t\t\t\t\t\t\t\t[label]=\"getCollectionLabel(collection)\"\n\t\t\t\t\t\t\t\t\t[href]=\"getCollectionPath(collection)\"\n\t\t\t\t\t\t\t\t\t[icon]=\"getCollectionIcon(collection)\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</mcms-sidebar-section>\n\t\t\t\t\t}\n\t\t\t\t\t@if (collections().length === 0) {\n\t\t\t\t\t\t<mcms-sidebar-section title=\"Collections\">\n\t\t\t\t\t\t\t<p class=\"px-3 py-2 text-sm text-sidebar-foreground/70\">No collections available</p>\n\t\t\t\t\t\t</mcms-sidebar-section>\n\t\t\t\t\t}\n\n\t\t\t\t\t<!-- Global Sections (grouped by admin.group) -->\n\t\t\t\t\t@for (group of globalGroups(); track group.name) {\n\t\t\t\t\t\t<mcms-sidebar-section [title]=\"group.name\">\n\t\t\t\t\t\t\t@for (global of group.globals; track global.slug) {\n\t\t\t\t\t\t\t\t<mcms-sidebar-nav-item\n\t\t\t\t\t\t\t\t\t[label]=\"getGlobalLabel(global)\"\n\t\t\t\t\t\t\t\t\t[href]=\"basePath() + '/globals/' + global.slug\"\n\t\t\t\t\t\t\t\t\ticon=\"heroCog6Tooth\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</mcms-sidebar-section>\n\t\t\t\t\t}\n\n\t\t\t\t\t<!-- Plugin Route Sections -->\n\t\t\t\t\t@for (group of pluginRouteGroups(); track group.name) {\n\t\t\t\t\t\t<mcms-sidebar-section [title]=\"group.name\">\n\t\t\t\t\t\t\t@for (route of group.routes; track route.path) {\n\t\t\t\t\t\t\t\t<mcms-sidebar-nav-item\n\t\t\t\t\t\t\t\t\t[label]=\"route.label\"\n\t\t\t\t\t\t\t\t\t[href]=\"basePath() + '/' + route.path\"\n\t\t\t\t\t\t\t\t\t[icon]=\"route.icon\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</mcms-sidebar-section>\n\t\t\t\t\t}\n\t\t\t\t</mcms-sidebar-nav>\n\t\t\t</div>\n\n\t\t\t<!-- Footer with User Menu -->\n\t\t\t<div mcmsSidebarFooter>\n\t\t\t\t@if (user(); as u) {\n\t\t\t\t\t<button\n\t\t\t\t\t\tclass=\"w-full flex items-center gap-3 p-2 rounded-md hover:bg-sidebar-accent transition-colors cursor-pointer text-left border-none bg-transparent\"\n\t\t\t\t\t\t[mcmsDropdownTrigger]=\"userMenu\"\n\t\t\t\t\t\tdropdownSide=\"top\"\n\t\t\t\t\t\tdropdownAlign=\"start\"\n\t\t\t\t\t\taria-haspopup=\"menu\"\n\t\t\t\t\t\t[attr.aria-label]=\"'User menu for ' + u.name\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<mcms-avatar size=\"sm\" [ariaLabel]=\"u.name + ' avatar'\">\n\t\t\t\t\t\t\t<mcms-avatar-fallback [delayMs]=\"0\">\n\t\t\t\t\t\t\t\t{{ getUserInitials(u.name) }}\n\t\t\t\t\t\t\t</mcms-avatar-fallback>\n\t\t\t\t\t\t</mcms-avatar>\n\t\t\t\t\t\t<div class=\"flex-1 min-w-0\">\n\t\t\t\t\t\t\t<p class=\"text-sm font-medium truncate\">{{ u.name }}</p>\n\t\t\t\t\t\t\t<p class=\"text-xs text-sidebar-foreground/70 truncate\">{{ u.email }}</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<ng-icon\n\t\t\t\t\t\t\tname=\"heroChevronUpDown\"\n\t\t\t\t\t\t\tclass=\"text-muted-foreground\"\n\t\t\t\t\t\t\tsize=\"16\"\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</button>\n\n\t\t\t\t\t<ng-template #userMenu>\n\t\t\t\t\t\t<mcms-dropdown-menu class=\"w-56\">\n\t\t\t\t\t\t\t<mcms-dropdown-label>{{ u.email }}</mcms-dropdown-label>\n\t\t\t\t\t\t\t<mcms-dropdown-separator />\n\t\t\t\t\t\t\t<button mcms-dropdown-item value=\"theme\" (selected)=\"toggleTheme()\">\n\t\t\t\t\t\t\t\t{{ theme.isDark() ? 'Light mode' : 'Dark mode' }}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t<mcms-dropdown-separator />\n\t\t\t\t\t\t\t<button mcms-dropdown-item value=\"signout\" (selected)=\"onSignOutClick()\">\n\t\t\t\t\t\t\t\tSign out\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</mcms-dropdown-menu>\n\t\t\t\t\t</ng-template>\n\t\t\t\t}\n\t\t\t</div>\n\t\t</mcms-sidebar>\n\t`,\n})\nexport class AdminSidebarWidget {\n\treadonly theme = inject(McmsThemeService);\n\n\t/** Branding configuration (logo, title) */\n\treadonly branding = input<AdminBranding>();\n\n\t/** Collections to display in navigation */\n\treadonly collections = input<CollectionConfig[]>([]);\n\n\t/** Globals to display in navigation */\n\treadonly globals = input<GlobalConfig[]>([]);\n\n\t/** Plugin-registered admin routes */\n\treadonly pluginRoutes = input<AdminPluginRoute[]>([]);\n\n\t/** Current authenticated user */\n\treadonly user = input<AdminUser | null>(null);\n\n\t/** Base path for admin routes */\n\treadonly basePath = input('/admin');\n\n\t/** Whether the sidebar is collapsed */\n\treadonly collapsed = input(false);\n\n\t/** Sidebar width */\n\treadonly width = input('16rem');\n\n\t/** Emitted when user clicks sign out */\n\treadonly signOut = output<void>();\n\n\t/** Computed collections base path */\n\treadonly collectionsBasePath = computed(() => `${this.basePath()}/collections`);\n\n\t/** Collections grouped by admin.group field */\n\treadonly collectionGroups = computed((): CollectionGroup[] => {\n\t\tconst collections = this.collections();\n\t\tconst DEFAULT_GROUP = 'Collections';\n\t\tconst groupMap = new Map<string, CollectionConfig[]>();\n\n\t\tfor (const c of collections) {\n\t\t\tconst name = c.admin?.group ?? DEFAULT_GROUP;\n\t\t\tconst list = groupMap.get(name) ?? [];\n\t\t\tlist.push(c);\n\t\t\tgroupMap.set(name, list);\n\t\t}\n\n\t\t// Named groups first (in order of first appearance), default last\n\t\tconst groups: CollectionGroup[] = [];\n\t\tfor (const [name, colls] of groupMap) {\n\t\t\tif (name !== DEFAULT_GROUP) groups.push({ name, collections: colls });\n\t\t}\n\t\tconst defaultGroup = groupMap.get(DEFAULT_GROUP);\n\t\tif (defaultGroup) groups.push({ name: DEFAULT_GROUP, collections: defaultGroup });\n\t\treturn groups;\n\t});\n\n\t/** Globals grouped by admin.group field */\n\treadonly globalGroups = computed((): GlobalGroup[] => {\n\t\tconst globals = this.globals();\n\t\tif (globals.length === 0) return [];\n\n\t\tconst DEFAULT_GROUP = 'Globals';\n\t\tconst groupMap = new Map<string, GlobalConfig[]>();\n\n\t\tfor (const g of globals) {\n\t\t\tconst name = g.admin?.group ?? DEFAULT_GROUP;\n\t\t\tconst list = groupMap.get(name) ?? [];\n\t\t\tlist.push(g);\n\t\t\tgroupMap.set(name, list);\n\t\t}\n\n\t\tconst groups: GlobalGroup[] = [];\n\t\tfor (const [name, globalList] of groupMap) {\n\t\t\tgroups.push({ name, globals: globalList });\n\t\t}\n\t\treturn groups;\n\t});\n\n\t/** Plugin routes grouped by group field */\n\treadonly pluginRouteGroups = computed((): PluginRouteGroup[] => {\n\t\tconst routes = this.pluginRoutes();\n\t\tif (routes.length === 0) return [];\n\n\t\tconst DEFAULT_GROUP = 'Plugins';\n\t\tconst groupMap = new Map<string, AdminPluginRoute[]>();\n\n\t\tfor (const r of routes) {\n\t\t\tconst name = r.group ?? DEFAULT_GROUP;\n\t\t\tconst list = groupMap.get(name) ?? [];\n\t\t\tlist.push(r);\n\t\t\tgroupMap.set(name, list);\n\t\t}\n\n\t\tconst groups: PluginRouteGroup[] = [];\n\t\tfor (const [name, routeList] of groupMap) {\n\t\t\tgroups.push({ name, routes: routeList });\n\t\t}\n\t\treturn groups;\n\t});\n\n\t/** Collection icon names by slug */\n\tprivate readonly collectionIcons: Record<string, string> = {\n\t\tposts: 'heroNewspaper',\n\t\tusers: 'heroUsers',\n\t\tmedia: 'heroPhoto',\n\t\tpages: 'heroDocument',\n\t\tdefault: 'heroFolder',\n\t};\n\n\t/**\n\t * Get display label for a collection.\n\t */\n\tgetCollectionLabel(collection: CollectionConfig): string {\n\t\treturn humanizeFieldName(collection.labels?.plural || collection.slug);\n\t}\n\n\t/**\n\t * Get router path for a collection.\n\t */\n\tgetCollectionPath(collection: CollectionConfig): string {\n\t\treturn `${this.collectionsBasePath()}/${collection.slug}`;\n\t}\n\n\t/**\n\t * Get icon name for a collection based on its slug.\n\t */\n\tgetCollectionIcon(collection: CollectionConfig): string {\n\t\treturn this.collectionIcons[collection.slug] || this.collectionIcons['default'];\n\t}\n\n\t/**\n\t * Get display label for a global.\n\t */\n\tgetGlobalLabel(global: GlobalConfig): string {\n\t\treturn global.label ?? humanizeFieldName(global.slug);\n\t}\n\n\t/**\n\t * Get initials from user name.\n\t */\n\tgetUserInitials(name: string): string {\n\t\tif (!name) return '?';\n\t\treturn name\n\t\t\t.split(' ')\n\t\t\t.map((n) => n[0])\n\t\t\t.join('')\n\t\t\t.toUpperCase()\n\t\t\t.slice(0, 2);\n\t}\n\n\t/**\n\t * Toggle theme between light and dark.\n\t */\n\ttoggleTheme(): void {\n\t\tthis.theme.toggleTheme();\n\t}\n\n\t/**\n\t * Handle sign out click.\n\t */\n\tonSignOutClick(): void {\n\t\tthis.signOut.emit();\n\t}\n}\n","import {\n\tComponent,\n\tChangeDetectionStrategy,\n\tinject,\n\tcomputed,\n\tOnInit,\n\tPLATFORM_ID,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { RouterOutlet, ActivatedRoute, Router } from '@angular/router';\nimport { A11yModule } from '@angular/cdk/a11y';\nimport type { CollectionConfig, GlobalConfig } from '@momentumcms/core';\nimport { SidebarService, SidebarTrigger, ToastContainer } from '@momentumcms/ui';\nimport {\n\tgetCollectionsFromRouteData,\n\tgetGlobalsFromRouteData,\n\tgetBrandingFromRouteData,\n\tgetPluginRoutesFromRouteData,\n} from '../../utils/route-data';\nimport type { AdminPluginRoute } from '../../routes/momentum-admin-routes';\nimport { MomentumAuthService } from '../../services/auth.service';\nimport { CollectionAccessService } from '../../services/collection-access.service';\nimport { EntitySheetService } from '../../services/entity-sheet.service';\nimport { EntitySheetContentComponent } from '../entity-sheet/entity-sheet-content.component';\nimport { injectUser } from '../../utils/inject-user';\nimport { AdminSidebarWidget } from '../../widgets/admin-sidebar/admin-sidebar.component';\nimport type { AdminUser, AdminBranding } from '../../widgets/widget.types';\n\n/**\n * Admin Shell Component\n *\n * The main layout component for the admin UI.\n * Provides navigation sidebar and content area.\n *\n * Features:\n * - Responsive sidebar (drawer on mobile, static on desktop)\n * - Keyboard shortcuts (Cmd+B / Ctrl+B to toggle sidebar)\n * - Mobile header with hamburger menu\n * - Entity sheet for inline entity create/edit/view (driven by query params)\n */\n@Component({\n\tselector: 'mcms-admin-shell',\n\timports: [\n\t\tRouterOutlet,\n\t\tAdminSidebarWidget,\n\t\tSidebarTrigger,\n\t\tA11yModule,\n\t\tEntitySheetContentComponent,\n\t\tToastContainer,\n\t],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: {\n\t\tclass: 'flex h-screen overflow-hidden bg-background',\n\t\t'(document:keydown.escape)': 'onEscapeKey()',\n\t},\n\tstyles: `\n\t\t@keyframes mcms-fade-in {\n\t\t\tfrom {\n\t\t\t\topacity: 0;\n\t\t\t}\n\t\t\tto {\n\t\t\t\topacity: 1;\n\t\t\t}\n\t\t}\n\t\t@keyframes mcms-fade-out {\n\t\t\tfrom {\n\t\t\t\topacity: 1;\n\t\t\t}\n\t\t\tto {\n\t\t\t\topacity: 0;\n\t\t\t}\n\t\t}\n\t\t@keyframes mcms-slide-in-right {\n\t\t\tfrom {\n\t\t\t\ttransform: translateX(100%);\n\t\t\t}\n\t\t\tto {\n\t\t\t\ttransform: translateX(0);\n\t\t\t}\n\t\t}\n\t\t@keyframes mcms-slide-out-right {\n\t\t\tfrom {\n\t\t\t\ttransform: translateX(0);\n\t\t\t}\n\t\t\tto {\n\t\t\t\ttransform: translateX(100%);\n\t\t\t}\n\t\t}\n\t\t.sheet-backdrop {\n\t\t\tanimation: mcms-fade-in 0.15s ease-out;\n\t\t}\n\t\t.sheet-backdrop-closing {\n\t\t\tanimation: mcms-fade-out 0.15s ease-in forwards;\n\t\t}\n\t\t.sheet-panel {\n\t\t\tanimation: mcms-slide-in-right 0.2s ease-out;\n\t\t}\n\t\t.sheet-panel-closing {\n\t\t\tanimation: mcms-slide-out-right 0.2s ease-in forwards;\n\t\t}\n\t`,\n\ttemplate: `\n\t\t<!-- Skip navigation link for keyboard users -->\n\t\t<a\n\t\t\thref=\"#mcms-main-content\"\n\t\t\tclass=\"sr-only focus:not-sr-only focus:absolute focus:z-50 focus:top-4 focus:left-4 focus:px-4 focus:py-2 focus:bg-primary focus:text-primary-foreground focus:rounded-md focus:shadow-lg\"\n\t\t>\n\t\t\tSkip to main content\n\t\t</a>\n\n\t\t<!-- Mobile header with hamburger (hidden at md breakpoint = 768px+) -->\n\t\t<header\n\t\t\tclass=\"md:hidden fixed top-0 inset-x-0 h-14 border-b border-border bg-background z-30 flex items-center px-4 gap-4\"\n\t\t>\n\t\t\t<mcms-sidebar-trigger />\n\t\t\t<span class=\"font-semibold\">{{ sidebarBranding()?.title || 'Momentum CMS' }}</span>\n\t\t</header>\n\n\t\t<mcms-admin-sidebar\n\t\t\t[branding]=\"sidebarBranding()\"\n\t\t\t[collections]=\"collections()\"\n\t\t\t[globals]=\"globals()\"\n\t\t\t[pluginRoutes]=\"pluginRoutes()\"\n\t\t\t[user]=\"sidebarUser()\"\n\t\t\tbasePath=\"/admin\"\n\t\t\t(signOut)=\"onSignOut()\"\n\t\t/>\n\n\t\t<!-- Main Content (with top padding on mobile for header, normal padding at md+) -->\n\t\t<main id=\"mcms-main-content\" class=\"flex-1 p-8 overflow-y-auto overflow-x-hidden pt-20 md:pt-8\">\n\t\t\t@defer (hydrate on immediate) {\n\t\t\t\t<router-outlet></router-outlet>\n\t\t\t}\n\t\t</main>\n\n\t\t<mcms-toast-container />\n\n\t\t<!-- Entity Sheet (query-param driven, no named router outlet) -->\n\t\t@if (entitySheet.isVisible()) {\n\t\t\t<div class=\"fixed inset-0 z-50\" role=\"presentation\">\n\t\t\t\t<!-- Backdrop (not keyboard-interactive; Escape key handles keyboard close) -->\n\t\t\t\t<div\n\t\t\t\t\t[class]=\"\n\t\t\t\t\t\tentitySheet.isClosing()\n\t\t\t\t\t\t\t? 'sheet-backdrop-closing absolute inset-0 bg-black/50'\n\t\t\t\t\t\t\t: 'sheet-backdrop absolute inset-0 bg-black/50'\n\t\t\t\t\t\"\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t(click)=\"onSheetBackdropClick()\"\n\t\t\t\t></div>\n\t\t\t\t<!-- Sheet panel -->\n\t\t\t\t<div\n\t\t\t\t\t[class]=\"\n\t\t\t\t\t\tentitySheet.isClosing()\n\t\t\t\t\t\t\t? 'sheet-panel-closing absolute inset-y-0 right-0 w-full max-w-2xl bg-card border-l border-border shadow-xl flex flex-col'\n\t\t\t\t\t\t\t: 'sheet-panel absolute inset-y-0 right-0 w-full max-w-2xl bg-card border-l border-border shadow-xl flex flex-col'\n\t\t\t\t\t\"\n\t\t\t\t\trole=\"dialog\"\n\t\t\t\t\taria-modal=\"true\"\n\t\t\t\t\taria-labelledby=\"mcms-sheet-title\"\n\t\t\t\t\tcdkTrapFocus\n\t\t\t\t\tcdkTrapFocusAutoCapture\n\t\t\t\t>\n\t\t\t\t\t<mcms-entity-sheet-content />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t}\n\t`,\n})\nexport class AdminShellComponent implements OnInit {\n\tprivate readonly route = inject(ActivatedRoute);\n\tprivate readonly router = inject(Router);\n\tprivate readonly platformId = inject(PLATFORM_ID);\n\tprivate readonly auth = inject(MomentumAuthService);\n\tprivate readonly collectionAccess = inject(CollectionAccessService);\n\tprivate readonly sidebar = inject(SidebarService);\n\treadonly entitySheet = inject(EntitySheetService);\n\n\t/** All collections from route data */\n\tprivate readonly allCollections = computed((): CollectionConfig[] => {\n\t\treturn getCollectionsFromRouteData(this.route.snapshot.data);\n\t});\n\n\t/** Collections filtered by access permissions and visibility */\n\treadonly collections = computed((): CollectionConfig[] => {\n\t\tconst all = this.allCollections();\n\t\tconst accessible = this.collectionAccess.accessibleCollections();\n\n\t\t// If permissions not loaded yet, show all non-hidden (will be filtered after load)\n\t\tif (!this.collectionAccess.initialized()) {\n\t\t\treturn all.filter((c) => !c.admin?.hidden);\n\t\t}\n\n\t\t// Filter to only accessible, non-hidden collections\n\t\treturn all.filter((c) => !c.admin?.hidden && accessible.includes(c.slug));\n\t});\n\n\t/** Globals from route data */\n\treadonly globals = computed((): GlobalConfig[] => {\n\t\treturn getGlobalsFromRouteData(this.route.snapshot.data);\n\t});\n\n\t/** Plugin routes from route data */\n\treadonly pluginRoutes = computed((): AdminPluginRoute[] => {\n\t\treturn getPluginRoutesFromRouteData(this.route.snapshot.data);\n\t});\n\n\t/** Branding for sidebar */\n\treadonly sidebarBranding = computed((): AdminBranding | undefined => {\n\t\tconst routeBranding = getBrandingFromRouteData(this.route.snapshot.data);\n\t\tif (!routeBranding) return undefined;\n\t\treturn {\n\t\t\ttitle: routeBranding.title,\n\t\t\tlogo: routeBranding.logo,\n\t\t};\n\t});\n\n\t/** SSR-aware user signal (reads from MOMENTUM_API_CONTEXT during SSR, auth service in browser) */\n\tprivate readonly currentUser = injectUser();\n\n\t/** User for sidebar */\n\treadonly sidebarUser = computed((): AdminUser | null => {\n\t\tconst user = this.currentUser();\n\t\tif (!user) return null;\n\t\treturn {\n\t\t\tid: user.id,\n\t\t\tname: user.name,\n\t\t\temail: user.email,\n\t\t\trole: user.role,\n\t\t};\n\t});\n\n\tngOnInit(): void {\n\t\t// Keyboard shortcuts, auth, and sheet restoration only run in the browser.\n\t\t// SSR user is provided via MOMENTUM_API_CONTEXT (used by injectUser above).\n\t\tif (!isPlatformBrowser(this.platformId)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.sidebar.setupKeyboardShortcuts();\n\t\tthis.entitySheet.initFromQueryParams();\n\t\tthis.initializeAuth();\n\t}\n\n\t/** Close the sheet when the Escape key is pressed */\n\tonEscapeKey(): void {\n\t\tif (this.entitySheet.isOpen() && !this.entitySheet.isClosing()) {\n\t\t\tthis.entitySheet.close();\n\t\t}\n\t}\n\n\t/** Close the sheet when the backdrop is clicked */\n\tonSheetBackdropClick(): void {\n\t\tif (!this.entitySheet.isClosing()) {\n\t\t\tthis.entitySheet.close();\n\t\t}\n\t}\n\n\tprivate async initializeAuth(): Promise<void> {\n\t\t// Wait for auth to initialize if still loading\n\t\tif (this.auth.loading()) {\n\t\t\tawait this.auth.initialize();\n\t\t}\n\n\t\t// Redirect to setup if no users exist\n\t\tif (this.auth.needsSetup()) {\n\t\t\tawait this.router.navigate(['/admin/setup']);\n\t\t\treturn;\n\t\t}\n\n\t\t// Redirect to login if not authenticated\n\t\tif (!this.auth.isAuthenticated()) {\n\t\t\tawait this.router.navigate(['/admin/login']);\n\t\t\treturn;\n\t\t}\n\n\t\t// Load collection access permissions\n\t\tif (!this.collectionAccess.initialized()) {\n\t\t\tthis.collectionAccess.loadAccess();\n\t\t}\n\t}\n\n\tasync onSignOut(): Promise<void> {\n\t\tawait this.auth.signOut();\n\t\tawait this.router.navigate(['/admin/login']);\n\t}\n}\n","import {\n\tComponent,\n\tChangeDetectionStrategy,\n\tinject,\n\tsignal,\n\tcomputed,\n\toutput,\n\tafterNextRender,\n} from '@angular/core';\nimport { Input, Button, McmsFormField } from '@momentumcms/ui';\nimport { MomentumAuthService } from '../../services/auth.service';\n\n/**\n * Forgot Password Form Component\n *\n * A reusable form for requesting password reset emails.\n * Can be embedded in any layout or used with the ForgotPasswordPage wrapper.\n *\n * @example\n * ```html\n * <mcms-forgot-password-form\n * (resetRequested)=\"onResetRequested($event)\"\n * (backToLogin)=\"navigateToLogin()\"\n * />\n * ```\n */\n@Component({\n\tselector: 'mcms-forgot-password-form',\n\timports: [Input, Button, McmsFormField],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\ttemplate: `\n\t\t<form (submit)=\"onSubmit($event)\" class=\"space-y-4\">\n\t\t\t@if (submitted() && !error()) {\n\t\t\t\t<div\n\t\t\t\t\tclass=\"rounded-md bg-green-50 p-4 text-sm text-green-800 dark:bg-green-900/20 dark:text-green-400\"\n\t\t\t\t\trole=\"status\"\n\t\t\t\t\taria-live=\"polite\"\n\t\t\t\t>\n\t\t\t\t\t<p class=\"font-medium\">Check your email</p>\n\t\t\t\t\t<p class=\"mt-1\">\n\t\t\t\t\t\tIf an account exists for {{ email() }}, you'll receive a password reset link shortly.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t}\n\n\t\t\t@if (error()) {\n\t\t\t\t<div\n\t\t\t\t\tclass=\"rounded-md bg-destructive/15 p-3 text-sm text-destructive\"\n\t\t\t\t\trole=\"alert\"\n\t\t\t\t\taria-live=\"polite\"\n\t\t\t\t>\n\t\t\t\t\t{{ error() }}\n\t\t\t\t</div>\n\t\t\t}\n\n\t\t\t@if (!submitted()) {\n\t\t\t\t<p class=\"text-sm text-muted-foreground\">\n\t\t\t\t\tEnter your email address and we'll send you a link to reset your password.\n\t\t\t\t</p>\n\n\t\t\t\t<mcms-form-field id=\"email\" [required]=\"true\" [errors]=\"emailErrors()\">\n\t\t\t\t\t<span mcmsLabel>Email</span>\n\t\t\t\t\t<mcms-input\n\t\t\t\t\t\ttype=\"email\"\n\t\t\t\t\t\tid=\"email\"\n\t\t\t\t\t\tname=\"email\"\n\t\t\t\t\t\t[(value)]=\"email\"\n\t\t\t\t\t\tplaceholder=\"Enter your email address\"\n\t\t\t\t\t\tautocomplete=\"email\"\n\t\t\t\t\t\t[disabled]=\"!hydrated() || isSubmitting()\"\n\t\t\t\t\t/>\n\t\t\t\t</mcms-form-field>\n\n\t\t\t\t<button\n\t\t\t\t\tmcms-button\n\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\tclass=\"w-full\"\n\t\t\t\t\t[disabled]=\"!hydrated() || isSubmitting() || !isValid()\"\n\t\t\t\t>\n\t\t\t\t\t@if (isSubmitting()) {\n\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\tclass=\"inline-block h-4 w-4 animate-spin\"\n\t\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<circle\n\t\t\t\t\t\t\t\tclass=\"opacity-25\"\n\t\t\t\t\t\t\t\tcx=\"12\"\n\t\t\t\t\t\t\t\tcy=\"12\"\n\t\t\t\t\t\t\t\tr=\"10\"\n\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\tstroke-width=\"4\"\n\t\t\t\t\t\t\t></circle>\n\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\tclass=\"opacity-75\"\n\t\t\t\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\t\t\t\td=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\"\n\t\t\t\t\t\t\t></path>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t\tSending...\n\t\t\t\t\t} @else {\n\t\t\t\t\t\tSend Reset Link\n\t\t\t\t\t}\n\t\t\t\t</button>\n\t\t\t}\n\n\t\t\t<div class=\"text-center\">\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"text-sm text-primary hover:underline\"\n\t\t\t\t\t(click)=\"onBackToLogin()\"\n\t\t\t\t>\n\t\t\t\t\tBack to Sign In\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</form>\n\t`,\n})\nexport class ForgotPasswordFormComponent {\n\tprivate readonly auth = inject(MomentumAuthService);\n\n\t/** Emitted when reset email has been requested */\n\treadonly resetRequested = output<string>();\n\n\t/** Emitted when user wants to go back to login */\n\treadonly backToLogin = output<void>();\n\n\t/** Whether the component has been hydrated (SSR → client transition complete) */\n\treadonly hydrated = signal(false);\n\n\tconstructor() {\n\t\tafterNextRender(() => {\n\t\t\tthis.hydrated.set(true);\n\t\t});\n\t}\n\n\t// Form state\n\treadonly email = signal('');\n\treadonly error = signal<string | null>(null);\n\treadonly isSubmitting = signal(false);\n\treadonly submitted = signal(false);\n\treadonly touched = signal(false);\n\n\t// Validation\n\treadonly emailErrors = computed(() => {\n\t\tif (!this.touched()) return [];\n\t\tconst value = this.email();\n\t\tif (!value) return [{ kind: 'required', message: 'Email is required' }];\n\t\tif (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value)) {\n\t\t\treturn [{ kind: 'email', message: 'Please enter a valid email' }];\n\t\t}\n\t\treturn [];\n\t});\n\n\treadonly isValid = computed(() => {\n\t\treturn this.email().length > 0 && this.emailErrors().length === 0;\n\t});\n\n\tasync onSubmit(event: Event): Promise<void> {\n\t\tevent.preventDefault();\n\t\tthis.touched.set(true);\n\n\t\tif (!this.isValid()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.isSubmitting.set(true);\n\t\tthis.error.set(null);\n\n\t\ttry {\n\t\t\tconst result = await this.auth.requestPasswordReset(this.email());\n\n\t\t\tif (result.success) {\n\t\t\t\tthis.submitted.set(true);\n\t\t\t\tthis.resetRequested.emit(this.email());\n\t\t\t} else {\n\t\t\t\tthis.error.set(result.error ?? 'Failed to send reset email');\n\t\t\t}\n\t\t} catch {\n\t\t\tthis.error.set('An unexpected error occurred');\n\t\t} finally {\n\t\t\tthis.isSubmitting.set(false);\n\t\t}\n\t}\n\n\tonBackToLogin(): void {\n\t\tthis.backToLogin.emit();\n\t}\n}\n","import {\n\tComponent,\n\tChangeDetectionStrategy,\n\tinject,\n\tsignal,\n\tcomputed,\n\tinput,\n\toutput,\n\tafterNextRender,\n} from '@angular/core';\nimport { Input, Button, McmsFormField } from '@momentumcms/ui';\nimport { MomentumAuthService } from '../../services/auth.service';\n\n/**\n * Reset Password Form Component\n *\n * A reusable form for resetting password with a token.\n * Can be embedded in any layout or used with the ResetPasswordPage wrapper.\n *\n * @example\n * ```html\n * <mcms-reset-password-form\n * [token]=\"tokenFromUrl\"\n * (resetComplete)=\"onResetComplete()\"\n * (resetFailed)=\"onResetFailed($event)\"\n * />\n * ```\n */\n@Component({\n\tselector: 'mcms-reset-password-form',\n\timports: [Input, Button, McmsFormField],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\ttemplate: `\n\t\t<form (submit)=\"onSubmit($event)\" class=\"space-y-4\">\n\t\t\t@if (resetSuccess()) {\n\t\t\t\t<div\n\t\t\t\t\tclass=\"rounded-md bg-green-50 p-4 text-sm text-green-800 dark:bg-green-900/20 dark:text-green-400\"\n\t\t\t\t\trole=\"status\"\n\t\t\t\t\taria-live=\"polite\"\n\t\t\t\t>\n\t\t\t\t\t<p class=\"font-medium\">Password reset successful</p>\n\t\t\t\t\t<p class=\"mt-1\">\n\t\t\t\t\t\tYour password has been updated. You can now sign in with your new password.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\n\t\t\t\t<button mcms-button type=\"button\" class=\"w-full\" (click)=\"onGoToLogin()\">\n\t\t\t\t\tGo to Sign In\n\t\t\t\t</button>\n\t\t\t} @else {\n\t\t\t\t@if (error()) {\n\t\t\t\t\t<div\n\t\t\t\t\t\tclass=\"rounded-md bg-destructive/15 p-3 text-sm text-destructive\"\n\t\t\t\t\t\trole=\"alert\"\n\t\t\t\t\t\taria-live=\"polite\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ error() }}\n\t\t\t\t\t</div>\n\t\t\t\t}\n\n\t\t\t\t@if (!token()) {\n\t\t\t\t\t<div class=\"rounded-md bg-destructive/15 p-3 text-sm text-destructive\" role=\"alert\">\n\t\t\t\t\t\tInvalid or missing reset token. Please request a new password reset link.\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<button mcms-button type=\"button\" class=\"w-full\" (click)=\"onGoToForgotPassword()\">\n\t\t\t\t\t\tRequest New Link\n\t\t\t\t\t</button>\n\t\t\t\t} @else {\n\t\t\t\t\t<p class=\"text-sm text-muted-foreground\">Enter your new password below.</p>\n\n\t\t\t\t\t<mcms-form-field id=\"password\" [required]=\"true\" [errors]=\"passwordErrors()\">\n\t\t\t\t\t\t<span mcmsLabel>New Password</span>\n\t\t\t\t\t\t<mcms-input\n\t\t\t\t\t\t\ttype=\"password\"\n\t\t\t\t\t\t\tid=\"password\"\n\t\t\t\t\t\t\tname=\"password\"\n\t\t\t\t\t\t\t[(value)]=\"password\"\n\t\t\t\t\t\t\tplaceholder=\"Enter new password\"\n\t\t\t\t\t\t\tautocomplete=\"new-password\"\n\t\t\t\t\t\t\t[disabled]=\"!hydrated() || isSubmitting()\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</mcms-form-field>\n\n\t\t\t\t\t<mcms-form-field\n\t\t\t\t\t\tid=\"confirmPassword\"\n\t\t\t\t\t\t[required]=\"true\"\n\t\t\t\t\t\t[errors]=\"confirmPasswordErrors()\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<span mcmsLabel>Confirm Password</span>\n\t\t\t\t\t\t<mcms-input\n\t\t\t\t\t\t\ttype=\"password\"\n\t\t\t\t\t\t\tid=\"confirmPassword\"\n\t\t\t\t\t\t\tname=\"confirmPassword\"\n\t\t\t\t\t\t\t[(value)]=\"confirmPassword\"\n\t\t\t\t\t\t\tplaceholder=\"Confirm new password\"\n\t\t\t\t\t\t\tautocomplete=\"new-password\"\n\t\t\t\t\t\t\t[disabled]=\"!hydrated() || isSubmitting()\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</mcms-form-field>\n\n\t\t\t\t\t<button\n\t\t\t\t\t\tmcms-button\n\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\tclass=\"w-full\"\n\t\t\t\t\t\t[disabled]=\"!hydrated() || isSubmitting() || !isValid()\"\n\t\t\t\t\t>\n\t\t\t\t\t\t@if (isSubmitting()) {\n\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\tclass=\"inline-block h-4 w-4 animate-spin\"\n\t\t\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<circle\n\t\t\t\t\t\t\t\t\tclass=\"opacity-25\"\n\t\t\t\t\t\t\t\t\tcx=\"12\"\n\t\t\t\t\t\t\t\t\tcy=\"12\"\n\t\t\t\t\t\t\t\t\tr=\"10\"\n\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\tstroke-width=\"4\"\n\t\t\t\t\t\t\t\t></circle>\n\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\tclass=\"opacity-75\"\n\t\t\t\t\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\t\t\t\t\td=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\"\n\t\t\t\t\t\t\t\t></path>\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\tResetting...\n\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\tReset Password\n\t\t\t\t\t\t}\n\t\t\t\t\t</button>\n\t\t\t\t}\n\t\t\t}\n\t\t</form>\n\t`,\n})\nexport class ResetPasswordFormComponent {\n\tprivate readonly auth = inject(MomentumAuthService);\n\n\t/** Whether the component has been hydrated (SSR → client transition complete) */\n\treadonly hydrated = signal(false);\n\n\tconstructor() {\n\t\tafterNextRender(() => {\n\t\t\tthis.hydrated.set(true);\n\t\t});\n\t}\n\n\t/** The reset token from the URL */\n\treadonly token = input<string>('');\n\n\t/** Emitted when password reset is complete */\n\treadonly resetComplete = output<void>();\n\n\t/** Emitted when password reset fails */\n\treadonly resetFailed = output<string>();\n\n\t/** Emitted when user wants to go to login */\n\treadonly goToLogin = output<void>();\n\n\t/** Emitted when user wants to request a new reset link */\n\treadonly goToForgotPassword = output<void>();\n\n\t// Form state\n\treadonly password = signal('');\n\treadonly confirmPassword = signal('');\n\treadonly error = signal<string | null>(null);\n\treadonly isSubmitting = signal(false);\n\treadonly resetSuccess = signal(false);\n\treadonly touched = signal(false);\n\n\t// Validation\n\treadonly passwordErrors = computed(() => {\n\t\tif (!this.touched()) return [];\n\t\tconst value = this.password();\n\t\tif (!value) return [{ kind: 'required', message: 'Password is required' }];\n\t\tif (value.length < 8) {\n\t\t\treturn [{ kind: 'minlength', message: 'Password must be at least 8 characters' }];\n\t\t}\n\t\treturn [];\n\t});\n\n\treadonly confirmPasswordErrors = computed(() => {\n\t\tif (!this.touched()) return [];\n\t\tconst value = this.confirmPassword();\n\t\tif (!value) return [{ kind: 'required', message: 'Please confirm your password' }];\n\t\tif (value !== this.password()) {\n\t\t\treturn [{ kind: 'mismatch', message: 'Passwords do not match' }];\n\t\t}\n\t\treturn [];\n\t});\n\n\treadonly isValid = computed(() => {\n\t\treturn (\n\t\t\tthis.password().length >= 8 &&\n\t\t\tthis.confirmPassword() === this.password() &&\n\t\t\tthis.passwordErrors().length === 0 &&\n\t\t\tthis.confirmPasswordErrors().length === 0\n\t\t);\n\t});\n\n\tasync onSubmit(event: Event): Promise<void> {\n\t\tevent.preventDefault();\n\t\tthis.touched.set(true);\n\n\t\tif (!this.isValid() || !this.token()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.isSubmitting.set(true);\n\t\tthis.error.set(null);\n\n\t\ttry {\n\t\t\tconst result = await this.auth.resetPassword(this.token(), this.password());\n\n\t\t\tif (result.success) {\n\t\t\t\tthis.resetSuccess.set(true);\n\t\t\t\tthis.resetComplete.emit();\n\t\t\t} else {\n\t\t\t\tconst errorMessage = result.error ?? 'Failed to reset password';\n\t\t\t\tthis.error.set(errorMessage);\n\t\t\t\tthis.resetFailed.emit(errorMessage);\n\t\t\t}\n\t\t} catch {\n\t\t\tconst errorMessage = 'An unexpected error occurred';\n\t\t\tthis.error.set(errorMessage);\n\t\t\tthis.resetFailed.emit(errorMessage);\n\t\t} finally {\n\t\t\tthis.isSubmitting.set(false);\n\t\t}\n\t}\n\n\tonGoToLogin(): void {\n\t\tthis.goToLogin.emit();\n\t}\n\n\tonGoToForgotPassword(): void {\n\t\tthis.goToForgotPassword.emit();\n\t}\n}\n","import {\n\tChangeDetectionStrategy,\n\tComponent,\n\tcomputed,\n\teffect,\n\tinject,\n\tinput,\n\toutput,\n\tsignal,\n} from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport type { CollectionConfig } from '@momentumcms/core';\nimport { humanizeFieldName } from '@momentumcms/core';\nimport {\n\tCard,\n\tCardHeader,\n\tCardContent,\n\tCardFooter,\n\tBadge,\n\tButton,\n\tSkeleton,\n} from '@momentumcms/ui';\nimport { injectMomentumAPI } from '../../services/momentum-api.service';\nimport { CollectionAccessService } from '../../services/collection-access.service';\n\n/**\n * Collection Card Widget\n *\n * Displays a collection card with document count fetched from API.\n * Useful for dashboard overviews and collection navigation.\n *\n * @example\n * ```html\n * <mcms-collection-card\n * [collection]=\"postsCollection\"\n * basePath=\"/admin/collections\"\n * (viewAll)=\"navigateToCollection($event)\"\n * />\n * ```\n */\n@Component({\n\tselector: 'mcms-collection-card',\n\timports: [RouterLink, Card, CardHeader, CardContent, CardFooter, Badge, Button, Skeleton],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: { class: 'block' },\n\ttemplate: `\n\t\t<mcms-card>\n\t\t\t<mcms-card-header>\n\t\t\t\t<div class=\"flex items-center justify-between\">\n\t\t\t\t\t<h3 class=\"font-semibold text-lg\">{{ collectionLabel() }}</h3>\n\t\t\t\t\t@if (loading()) {\n\t\t\t\t\t\t<mcms-skeleton class=\"w-12 h-6\" />\n\t\t\t\t\t} @else if (error()) {\n\t\t\t\t\t\t<mcms-badge variant=\"destructive\">Error</mcms-badge>\n\t\t\t\t\t} @else {\n\t\t\t\t\t\t<mcms-badge variant=\"secondary\">{{ count() }}</mcms-badge>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t</mcms-card-header>\n\n\t\t\t<mcms-card-content>\n\t\t\t\t@if (collection().admin?.description) {\n\t\t\t\t\t<p class=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t{{ collection().admin!.description }}\n\t\t\t\t\t</p>\n\t\t\t\t} @else {\n\t\t\t\t\t<p class=\"text-sm text-muted-foreground\">Manage {{ collectionLabelLower() }}</p>\n\t\t\t\t}\n\t\t\t</mcms-card-content>\n\n\t\t\t<mcms-card-footer class=\"flex gap-3 pt-2\">\n\t\t\t\t@if (canCreate()) {\n\t\t\t\t\t<a mcms-button variant=\"primary\" size=\"sm\" [routerLink]=\"createPath()\"> Create </a>\n\t\t\t\t}\n\t\t\t\t<a mcms-button variant=\"outline\" size=\"sm\" [routerLink]=\"viewPath()\"> View all </a>\n\t\t\t</mcms-card-footer>\n\t\t</mcms-card>\n\t`,\n})\nexport class CollectionCardWidget {\n\tprivate readonly api = injectMomentumAPI();\n\tprivate readonly collectionAccess = inject(CollectionAccessService);\n\n\t/** The collection to display */\n\treadonly collection = input.required<CollectionConfig>();\n\n\t/** Base path for collection routes */\n\treadonly basePath = input('/admin/collections');\n\n\t/** Whether to show document count */\n\treadonly showDocumentCount = input(true);\n\n\t/** Emitted when view all is clicked */\n\treadonly viewAll = output<CollectionConfig>();\n\n\t/** Document count from API */\n\treadonly count = signal(0);\n\n\t/** Whether count is loading */\n\treadonly loading = signal(true);\n\n\t/** Error message if count fetch failed */\n\treadonly error = signal<string | null>(null);\n\n\t/** Display label for the collection */\n\treadonly collectionLabel = computed(() => {\n\t\tconst col = this.collection();\n\t\treturn humanizeFieldName(col.labels?.plural || col.slug);\n\t});\n\n\t/** Lowercase label for descriptions */\n\treadonly collectionLabelLower = computed(() => {\n\t\treturn this.collectionLabel().toLowerCase();\n\t});\n\n\t/** Path to view all documents */\n\treadonly viewPath = computed(() => {\n\t\treturn `${this.basePath()}/${this.collection().slug}`;\n\t});\n\n\t/** Path to create new document */\n\treadonly createPath = computed(() => {\n\t\treturn `${this.basePath()}/${this.collection().slug}/new`;\n\t});\n\n\t/** Whether user can create documents */\n\treadonly canCreate = computed(() => {\n\t\treturn this.collectionAccess.canCreate(this.collection().slug);\n\t});\n\n\tconstructor() {\n\t\t// Fetch count when collection changes\n\t\teffect(() => {\n\t\t\tconst col = this.collection();\n\t\t\tconst showCount = this.showDocumentCount();\n\n\t\t\tif (showCount && col) {\n\t\t\t\tthis.fetchCount(col.slug);\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Fetch document count for the collection.\n\t */\n\tprivate async fetchCount(slug: string): Promise<void> {\n\t\tthis.loading.set(true);\n\t\tthis.error.set(null);\n\n\t\ttry {\n\t\t\tconst result = await this.api.collection(slug).find({ limit: 0 });\n\t\t\tthis.count.set(result.totalDocs);\n\t\t} catch {\n\t\t\tthis.error.set('Failed to load count');\n\t\t\tthis.count.set(0);\n\t\t} finally {\n\t\t\tthis.loading.set(false);\n\t\t}\n\t}\n}\n","import { Component, ChangeDetectionStrategy, inject, computed } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport type { CollectionConfig } from '@momentumcms/core';\nimport { getCollectionsFromRouteData } from '../../utils/route-data';\nimport { CollectionAccessService } from '../../services/collection-access.service';\nimport { CollectionCardWidget } from '../../widgets/collection-card/collection-card.component';\n\n/**\n * Dashboard Page Component\n *\n * The main dashboard showing an overview of all collections.\n */\n@Component({\n\tselector: 'mcms-dashboard',\n\timports: [CollectionCardWidget],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: { class: 'block max-w-6xl' },\n\ttemplate: `\n\t\t<header class=\"mb-10\">\n\t\t\t<h1 class=\"text-4xl font-bold tracking-tight text-foreground\">Dashboard</h1>\n\t\t\t<p class=\"text-muted-foreground mt-3 text-lg\">Manage your content and collections</p>\n\t\t</header>\n\n\t\t<section>\n\t\t\t<h2 class=\"text-sm font-semibold uppercase tracking-wider text-muted-foreground mb-4\">\n\t\t\t\tCollections\n\t\t\t</h2>\n\t\t\t<div class=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6\">\n\t\t\t\t@for (collection of collections(); track collection.slug) {\n\t\t\t\t\t<mcms-collection-card [collection]=\"collection\" [basePath]=\"basePath\" />\n\t\t\t\t} @empty {\n\t\t\t\t\t<div\n\t\t\t\t\t\tclass=\"col-span-full flex flex-col items-center justify-center p-16 bg-card/50 rounded-xl border border-dashed border-border/60\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div class=\"w-16 h-16 rounded-full bg-muted flex items-center justify-center mb-4\">\n\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\tclass=\"w-8 h-8 text-muted-foreground\"\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t\t\tstroke-width=\"1.5\"\n\t\t\t\t\t\t\t\t\td=\"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\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<p class=\"text-foreground font-medium text-lg\">No collections configured</p>\n\t\t\t\t\t\t<p class=\"text-sm text-muted-foreground mt-2 text-center max-w-sm\">\n\t\t\t\t\t\t\tAdd collections to your configuration to start managing content.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t</div>\n\t\t</section>\n\t`,\n})\nexport class DashboardPage {\n\tprivate readonly route = inject(ActivatedRoute);\n\tprivate readonly collectionAccess = inject(CollectionAccessService);\n\n\treadonly basePath = '/admin/collections';\n\n\t/** All collections from route data (unfiltered) */\n\tprivate readonly allCollections = computed((): CollectionConfig[] => {\n\t\treturn getCollectionsFromRouteData(this.route.parent?.snapshot.data);\n\t});\n\n\t/** Collections filtered by visibility and access permissions */\n\treadonly collections = computed((): CollectionConfig[] => {\n\t\tconst all = this.allCollections();\n\t\tconst accessible = this.collectionAccess.accessibleCollections();\n\n\t\t// If permissions not loaded yet, show all non-hidden (will be filtered after load)\n\t\tif (!this.collectionAccess.initialized()) {\n\t\t\treturn all.filter((c) => !c.admin?.hidden);\n\t\t}\n\n\t\t// Filter to only accessible, non-hidden collections\n\t\treturn all.filter((c) => !c.admin?.hidden && accessible.includes(c.slug));\n\t});\n}\n","/**\n * Entity List Widget Types\n *\n * Types for the entity list widget that displays collection data.\n */\n\nimport type { DataTableColumn, DataTableRowAction } from '@momentumcms/ui';\nimport type { Entity, EntityAction } from '../widget.types';\n\n/**\n * Column configuration for entity list.\n * Extends DataTableColumn with collection-specific options.\n */\nexport interface EntityListColumn<T = Entity> extends DataTableColumn<T> {\n\t/** Field type for automatic formatting */\n\ttype?:\n\t\t| 'text'\n\t\t| 'number'\n\t\t| 'date'\n\t\t| 'datetime'\n\t\t| 'boolean'\n\t\t| 'badge'\n\t\t| 'relationship'\n\t\t| 'array'\n\t\t| 'group'\n\t\t| 'json';\n\t/** Badge variant for 'badge' type columns */\n\tbadgeVariant?: 'default' | 'secondary' | 'destructive' | 'outline';\n\t/** Badge color mapping for 'badge' type columns */\n\tbadgeMap?: Record<\n\t\tstring,\n\t\t{ label: string; variant: 'default' | 'secondary' | 'destructive' | 'outline' }\n\t>;\n}\n\n/**\n * Event emitted when an entity action is triggered.\n */\nexport interface EntityListActionEvent<T = Entity> {\n\t/** The action that was triggered */\n\taction: EntityAction;\n\t/** The entity the action was triggered on */\n\tentity: T;\n}\n\n/**\n * Event emitted when a bulk action is triggered.\n */\nexport interface EntityListBulkActionEvent<T = Entity> {\n\t/** The action that was triggered */\n\taction: EntityAction;\n\t/** The entities the action was triggered on */\n\tentities: T[];\n}\n\n/**\n * Result of a find operation.\n */\nexport interface EntityListFindResult<T = Entity> {\n\tdocs: T[];\n\ttotalDocs: number;\n\ttotalPages: number;\n\tpage: number;\n\tlimit: number;\n\thasNextPage: boolean;\n\thasPrevPage: boolean;\n}\n\n/**\n * Default field to column type mapping.\n */\nexport const FIELD_TYPE_TO_COLUMN_TYPE: Record<string, EntityListColumn['type']> = {\n\ttext: 'text',\n\ttextarea: 'text',\n\trichText: 'text',\n\temail: 'text',\n\tslug: 'text',\n\tnumber: 'number',\n\tcheckbox: 'boolean',\n\tdate: 'date',\n\tselect: 'badge',\n\trelationship: 'relationship',\n\tarray: 'array',\n\tgroup: 'group',\n\tjson: 'json',\n};\n\n/**\n * Maps row actions from EntityAction to DataTableRowAction.\n */\nexport function mapEntityActionsToRowActions<T = Entity>(\n\tactions: EntityAction[],\n): DataTableRowAction<T>[] {\n\treturn actions.map((action) => {\n\t\tconst isDisabled = action.disabled;\n\t\treturn {\n\t\t\tid: action.id,\n\t\t\tlabel: action.label,\n\t\t\ticon: action.icon,\n\t\t\tvariant: action.variant === 'destructive' ? 'destructive' : 'default',\n\t\t\tdisabled: isDisabled !== undefined ? () => isDisabled : undefined,\n\t\t};\n\t});\n}\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport {\n\tButton,\n\tDialog,\n\tDialogHeader,\n\tDialogTitle,\n\tDialogContent,\n\tDialogFooter,\n\tDialogClose,\n\tDialogRef,\n\tDIALOG_DATA,\n\tFieldDisplay,\n} from '@momentumcms/ui';\nimport type { FieldDisplayType, FieldDisplayFieldMeta } from '@momentumcms/ui';\n\n/** Data passed to the DataPreviewDialog. */\nexport interface DataPreviewDialogData {\n\ttitle: string;\n\tvalue: unknown;\n\ttype: FieldDisplayType;\n\tfieldMeta: FieldDisplayFieldMeta[];\n}\n\n/**\n * Read-only dialog for previewing complex field data (group, array, JSON).\n */\n@Component({\n\tselector: 'mcms-data-preview-dialog',\n\timports: [\n\t\tButton,\n\t\tDialog,\n\t\tDialogHeader,\n\t\tDialogTitle,\n\t\tDialogContent,\n\t\tDialogFooter,\n\t\tDialogClose,\n\t\tFieldDisplay,\n\t],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: { style: 'display: block; width: 100%' },\n\ttemplate: `\n\t\t<mcms-dialog>\n\t\t\t<mcms-dialog-header>\n\t\t\t\t<mcms-dialog-title>{{ data.title }}</mcms-dialog-title>\n\t\t\t</mcms-dialog-header>\n\n\t\t\t<mcms-dialog-content>\n\t\t\t\t<div class=\"max-h-[60vh] overflow-y-auto\">\n\t\t\t\t\t<mcms-field-display\n\t\t\t\t\t\t[value]=\"data.value\"\n\t\t\t\t\t\t[type]=\"data.type\"\n\t\t\t\t\t\t[fieldMeta]=\"data.fieldMeta\"\n\t\t\t\t\t\t[maxItems]=\"50\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</mcms-dialog-content>\n\n\t\t\t<mcms-dialog-footer>\n\t\t\t\t<button mcms-button variant=\"outline\" mcmsDialogClose type=\"button\">Close</button>\n\t\t\t</mcms-dialog-footer>\n\t\t</mcms-dialog>\n\t`,\n})\nexport class DataPreviewDialog {\n\treadonly data = inject<DataPreviewDialogData>(DIALOG_DATA);\n\tprivate readonly dialogRef = inject(DialogRef);\n\n\tclose(): void {\n\t\tthis.dialogRef.close();\n\t}\n}\n","import {\n\tChangeDetectionStrategy,\n\tComponent,\n\tcomputed,\n\teffect,\n\tinject,\n\tinput,\n\tmodel,\n\toutput,\n\tsignal,\n\ttype TemplateRef,\n\tviewChild,\n} from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport type { CollectionConfig, Field } from '@momentumcms/core';\nimport { humanizeFieldName, getSoftDeleteField } from '@momentumcms/core';\nimport {\n\tDataTable,\n\tButton,\n\tBadge,\n\tBreadcrumbs,\n\tBreadcrumbItem,\n\tBreadcrumbSeparator,\n\tDialogService,\n\ttype DataTableSort,\n\ttype DataTableRowAction,\n\ttype DataTableRowActionEvent,\n\ttype DataTableCellContext,\n} from '@momentumcms/ui';\nimport type { FieldDisplayFieldMeta } from '@momentumcms/ui';\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroEye } from '@ng-icons/heroicons/outline';\nimport { injectMomentumAPI, type FindResult } from '../../services/momentum-api.service';\nimport { CollectionAccessService } from '../../services/collection-access.service';\nimport { FeedbackService } from '../feedback/feedback.service';\nimport type { Entity, EntityAction } from '../widget.types';\nimport {\n\ttype EntityListColumn,\n\ttype EntityListActionEvent,\n\ttype EntityListBulkActionEvent,\n\tFIELD_TYPE_TO_COLUMN_TYPE,\n\tmapEntityActionsToRowActions,\n} from './entity-list.types';\nimport {\n\tDataPreviewDialog,\n\ttype DataPreviewDialogData,\n} from '../data-preview/data-preview-dialog.component';\n\n/**\n * Entity List Widget\n *\n * Displays a collection's data in a data table with search, sorting,\n * pagination, and actions. Connects to Momentum API for data fetching.\n *\n * @example\n * ```html\n * <mcms-entity-list\n * [collection]=\"postsCollection\"\n * basePath=\"/admin/collections\"\n * (entityClick)=\"onEntityClick($event)\"\n * />\n * ```\n */\n@Component({\n\tselector: 'mcms-entity-list',\n\timports: [DataTable, Button, Badge, Breadcrumbs, BreadcrumbItem, BreadcrumbSeparator, NgIcon],\n\tproviders: [provideIcons({ heroEye })],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: { class: 'block' },\n\ttemplate: `\n\t\t@if (showHeader()) {\n\t\t\t@if (showBreadcrumbs()) {\n\t\t\t\t<mcms-breadcrumbs class=\"mb-6\">\n\t\t\t\t\t<mcms-breadcrumb-item [href]=\"dashboardPath()\">Dashboard</mcms-breadcrumb-item>\n\t\t\t\t\t<mcms-breadcrumb-separator />\n\t\t\t\t\t<mcms-breadcrumb-item [current]=\"true\">{{ collectionLabel() }}</mcms-breadcrumb-item>\n\t\t\t\t</mcms-breadcrumbs>\n\t\t\t}\n\n\t\t\t<header class=\"mb-8 flex items-center justify-between\">\n\t\t\t\t<div>\n\t\t\t\t\t<h1 class=\"text-2xl font-semibold tracking-tight\">\n\t\t\t\t\t\t{{ viewingTrash() ? 'Trash' : collectionLabel() }}\n\t\t\t\t\t</h1>\n\t\t\t\t\t@if (totalItems() > 0) {\n\t\t\t\t\t\t<p class=\"mt-1 text-muted-foreground\">\n\t\t\t\t\t\t\t{{ totalItems() }}\n\t\t\t\t\t\t\t{{ totalItems() === 1 ? collectionLabelSingular() : collectionLabel() }}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t\t<div class=\"flex items-center gap-2\">\n\t\t\t\t\t@if (hasSoftDelete()) {\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tmcms-button\n\t\t\t\t\t\t\t[variant]=\"viewingTrash() ? 'outline' : 'ghost'\"\n\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t(click)=\"toggleTrashView()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{{ viewingTrash() ? 'View Active' : 'View Trash' }}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t}\n\t\t\t\t\t@for (action of headerActions(); track action.id) {\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tmcms-button\n\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\t[attr.data-testid]=\"'header-action-' + action.id\"\n\t\t\t\t\t\t\t(click)=\"headerActionClick.emit(action)\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{{ action.label }}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t}\n\t\t\t\t\t@if (canCreate() && !viewingTrash()) {\n\t\t\t\t\t\t<button mcms-button variant=\"primary\" (click)=\"onCreateClick()\">\n\t\t\t\t\t\t\tCreate {{ collectionLabelSingular() }}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t</header>\n\t\t}\n\n\t\t<mcms-data-table\n\t\t\t[data]=\"entities()\"\n\t\t\t[columns]=\"tableColumns()\"\n\t\t\t[loading]=\"loading()\"\n\t\t\t[searchable]=\"searchable()\"\n\t\t\t[searchPlaceholder]=\"searchPlaceholder()\"\n\t\t\t[(searchQuery)]=\"searchQuery\"\n\t\t\t[sortable]=\"sortable()\"\n\t\t\t[(sort)]=\"sort\"\n\t\t\t[selectable]=\"selectable()\"\n\t\t\t[(selectedItems)]=\"selectedEntities\"\n\t\t\t[paginated]=\"paginated()\"\n\t\t\t[pageSize]=\"pageSize()\"\n\t\t\t[(currentPage)]=\"currentPage\"\n\t\t\t[totalItems]=\"totalItems()\"\n\t\t\t[emptyTitle]=\"emptyTitle()\"\n\t\t\t[emptyDescription]=\"emptyDescription()\"\n\t\t\t[clickableRows]=\"true\"\n\t\t\t[rowActions]=\"tableRowActions()\"\n\t\t\t[trackByFn]=\"trackById\"\n\t\t\t(rowClick)=\"onRowClick($event)\"\n\t\t\t(rowAction)=\"onRowAction($event)\"\n\t\t\t(searchChange)=\"onSearchChange($event)\"\n\t\t\t(pageChange)=\"onPageChange($event)\"\n\t\t\t(sortChange)=\"onSortChange($event)\"\n\t\t>\n\t\t\t<!-- Bulk actions toolbar -->\n\t\t\t@if (selectedEntities().length > 0) {\n\t\t\t\t<div mcmsDataTableToolbar class=\"flex items-center gap-2\">\n\t\t\t\t\t<mcms-badge variant=\"secondary\"> {{ selectedEntities().length }} selected </mcms-badge>\n\t\t\t\t\t@for (action of bulkActions(); track action.id) {\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tmcms-button\n\t\t\t\t\t\t\t[variant]=\"action.variant === 'destructive' ? 'destructive' : 'outline'\"\n\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t(click)=\"onBulkAction(action)\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{{ action.label }}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t}\n\t\t</mcms-data-table>\n\n\t\t<!-- Template for complex field cells (group, array, json) -->\n\t\t<ng-template #complexCell let-value let-column=\"column\">\n\t\t\t<div class=\"flex items-center gap-1.5\">\n\t\t\t\t<span class=\"text-muted-foreground\">{{ getComplexSummary(value, column.type) }}</span>\n\t\t\t\t@if (value !== null && value !== undefined) {\n\t\t\t\t\t<button\n\t\t\t\t\t\tmcms-button\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\tclass=\"h-6 w-6 shrink-0\"\n\t\t\t\t\t\t(click)=\"$event.stopPropagation(); openDataPreview(value, column.field)\"\n\t\t\t\t\t\taria-label=\"View details\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<ng-icon name=\"heroEye\" class=\"h-3 w-3\" aria-hidden=\"true\" />\n\t\t\t\t\t</button>\n\t\t\t\t}\n\t\t\t</div>\n\t\t</ng-template>\n\t`,\n})\nexport class EntityListWidget<T extends Entity = Entity> {\n\tprivate readonly api = injectMomentumAPI();\n\tprivate readonly collectionAccess = inject(CollectionAccessService);\n\tprivate readonly feedback = inject(FeedbackService);\n\tprivate readonly dialog = inject(DialogService);\n\tprivate readonly router = inject(Router);\n\tprivate readonly route = inject(ActivatedRoute);\n\n\t/** Template ref for complex cell rendering (group, array, json). */\n\tprivate readonly complexCellTemplate =\n\t\tviewChild<TemplateRef<DataTableCellContext<T>>>('complexCell');\n\n\t/** The collection configuration */\n\treadonly collection = input.required<CollectionConfig>();\n\n\t/** Base path for entity routes */\n\treadonly basePath = input('/admin/collections');\n\n\t/** Whether to show the header with title and create button */\n\treadonly showHeader = input(true);\n\n\t/** Whether to show breadcrumbs */\n\treadonly showBreadcrumbs = input(true);\n\n\t/** Custom columns (auto-derived from collection if not provided) */\n\treadonly columns = input<EntityListColumn<T>[]>([]);\n\n\t/** Row actions for each entity */\n\treadonly rowActions = input<EntityAction[]>([]);\n\n\t/** Bulk actions for selected entities */\n\treadonly bulkActions = input<EntityAction[]>([]);\n\n\t/** Custom action buttons displayed in the collection list header */\n\treadonly headerActions = input<\n\t\tNonNullable<NonNullable<CollectionConfig['admin']>['headerActions']>\n\t>([]);\n\n\t/** Emitted when a header action button is clicked */\n\treadonly headerActionClick =\n\t\toutput<NonNullable<NonNullable<CollectionConfig['admin']>['headerActions']>[number]>();\n\n\t/** Whether the table is searchable */\n\treadonly searchable = input(true);\n\n\t/** Search placeholder */\n\treadonly searchPlaceholder = input('Search...');\n\n\t/** Fields to search in (auto-derived if not provided) */\n\treadonly searchFields = input<string[]>([]);\n\n\t/** Whether the table is sortable */\n\treadonly sortable = input(true);\n\n\t/** Whether the table is selectable */\n\treadonly selectable = input(false);\n\n\t/** Whether the table is paginated */\n\treadonly paginated = input(true);\n\n\t/** Default page size */\n\treadonly pageSize = input(10);\n\n\t/** Empty state title */\n\treadonly emptyTitle = input('No items found');\n\n\t/** Empty state description */\n\treadonly emptyDescription = input('');\n\n\t/** Outputs */\n\treadonly entityClick = output<T>();\n\treadonly entityAction = output<EntityListActionEvent<T>>();\n\treadonly bulkAction = output<EntityListBulkActionEvent<T>>();\n\treadonly dataLoaded = output<FindResult<T>>();\n\n\t/** Internal state */\n\treadonly entities = signal<T[]>([]);\n\treadonly totalItems = signal(0);\n\treadonly loading = signal(true);\n\treadonly error = signal<string | null>(null);\n\treadonly currentPage = signal(1);\n\treadonly sort = signal<DataTableSort<T> | undefined>(undefined);\n\treadonly selectedEntities = signal<T[]>([]);\n\treadonly searchQuery = model('');\n\treadonly viewingTrash = signal(false);\n\n\t/** Whether the collection has soft delete enabled */\n\treadonly hasSoftDelete = computed(() => getSoftDeleteField(this.collection()) !== null);\n\n\t/** Computed collection label */\n\treadonly collectionLabel = computed(() => {\n\t\tconst col = this.collection();\n\t\treturn humanizeFieldName(col.labels?.plural || col.slug);\n\t});\n\n\t/** Computed collection label singular */\n\treadonly collectionLabelSingular = computed(() => {\n\t\tconst col = this.collection();\n\t\treturn humanizeFieldName(col.labels?.singular || col.slug);\n\t});\n\n\t/** Dashboard path (remove /collections from base path) */\n\treadonly dashboardPath = computed(() => {\n\t\tconst base = this.basePath();\n\t\treturn base.replace(/\\/collections$/, '');\n\t});\n\n\t/** Auto-derive columns from collection fields if not provided */\n\treadonly tableColumns = computed(() => {\n\t\t// Read template signal at top level so the computed re-runs when viewChild resolves\n\t\tconst complexTemplate = this.complexCellTemplate();\n\n\t\tconst customColumns = this.columns();\n\t\tif (customColumns.length > 0) {\n\t\t\treturn customColumns;\n\t\t}\n\n\t\t// Auto-derive from collection fields\n\t\tconst col = this.collection();\n\t\tconst columns: EntityListColumn<T>[] = [];\n\n\t\t// Add first text/title-like field as primary column\n\t\tfor (const field of col.fields) {\n\t\t\tif (this.shouldShowFieldInList(field)) {\n\t\t\t\tcolumns.push(this.fieldToColumn(field, complexTemplate));\n\t\t\t}\n\t\t\t// Limit to 5 auto-derived columns\n\t\t\tif (columns.length >= 5) break;\n\t\t}\n\n\t\t// Add deletedAt column when viewing trash\n\t\tif (this.viewingTrash() && this.hasSoftDelete()) {\n\t\t\tconst softDeleteField = getSoftDeleteField(col) ?? 'deletedAt';\n\t\t\tcolumns.push({\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\t\tfield: softDeleteField as keyof T & string,\n\t\t\t\theader: 'Deleted',\n\t\t\t\tsortable: true,\n\t\t\t\ttype: 'datetime',\n\t\t\t\twidth: '170px',\n\t\t\t});\n\t\t} else {\n\t\t\t// Add createdAt if timestamps enabled (only in active view)\n\t\t\tconst hasCreatedAt =\n\t\t\t\tcol.timestamps === true ||\n\t\t\t\t(typeof col.timestamps === 'object' && col.timestamps.createdAt !== false);\n\t\t\tif (hasCreatedAt && columns.length < 6) {\n\t\t\t\tcolumns.push({\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\t\t\tfield: 'createdAt' as keyof T & string,\n\t\t\t\t\theader: 'Created',\n\t\t\t\t\tsortable: true,\n\t\t\t\t\ttype: 'datetime',\n\t\t\t\t\twidth: '150px',\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn columns;\n\t});\n\n\t/** Convert row actions to DataTable format */\n\treadonly tableRowActions = computed((): DataTableRowAction<T>[] => {\n\t\tconst actions = this.rowActions();\n\t\treturn mapEntityActionsToRowActions<T>(actions);\n\t});\n\n\t/** Track entities by ID */\n\treadonly trackById = (item: T): string | number => item.id;\n\n\t/** Can user create entities */\n\treadonly canCreate = computed(() => {\n\t\treturn this.collectionAccess.canCreate(this.collection().slug);\n\t});\n\n\t/** Can user delete entities */\n\treadonly canDelete = computed(() => {\n\t\treturn this.collectionAccess.canDelete(this.collection().slug);\n\t});\n\n\tprivate previousCollectionSlug: string | null = null;\n\n\tconstructor() {\n\t\t// Initialize search and sort from URL params\n\t\tconst queryParams = this.route.snapshot.queryParams;\n\n\t\t// Initialize search (type guard for string)\n\t\tconst initialSearch = queryParams['search'];\n\t\tif (typeof initialSearch === 'string') {\n\t\t\tthis.searchQuery.set(initialSearch);\n\t\t}\n\n\t\t// Initialize sort from URL (format: \"field\" for asc, \"-field\" for desc)\n\t\tconst initialSort = queryParams['sort'];\n\t\tif (typeof initialSort === 'string' && initialSort) {\n\t\t\tconst isDesc = initialSort.startsWith('-');\n\t\t\tconst field = isDesc ? initialSort.slice(1) : initialSort;\n\t\t\t// field is already a string, which satisfies DataTableSort<T>['field'] = keyof T | string\n\t\t\tthis.sort.set({\n\t\t\t\tfield,\n\t\t\t\tdirection: isDesc ? 'desc' : 'asc',\n\t\t\t});\n\t\t}\n\n\t\t// Load data when collection, pagination, or trash view changes\n\t\teffect(() => {\n\t\t\tconst col = this.collection();\n\t\t\tconst page = this.currentPage();\n\t\t\tconst trash = this.viewingTrash();\n\t\t\tlet sortState = this.sort();\n\t\t\tlet search = this.searchQuery();\n\n\t\t\tif (col) {\n\t\t\t\t// Clear search and sort when collection changes (synchronously before data load)\n\t\t\t\tif (this.previousCollectionSlug !== null && this.previousCollectionSlug !== col.slug) {\n\t\t\t\t\tthis.searchQuery.set('');\n\t\t\t\t\tthis.sort.set(undefined);\n\t\t\t\t\tthis.currentPage.set(1);\n\t\t\t\t\tthis.viewingTrash.set(false);\n\t\t\t\t\tsearch = '';\n\t\t\t\t\tsortState = undefined;\n\t\t\t\t\t// Clear URL params\n\t\t\t\t\tthis.router.navigate([], {\n\t\t\t\t\t\tqueryParams: { search: null, sort: null },\n\t\t\t\t\t\tqueryParamsHandling: 'merge',\n\t\t\t\t\t\treplaceUrl: true,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tthis.previousCollectionSlug = col.slug;\n\n\t\t\t\tthis.loadData(col.slug, page, sortState, search, trash);\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Load data from API.\n\t */\n\tprivate async loadData(\n\t\tslug: string,\n\t\tpage: number,\n\t\tsortState?: DataTableSort<T>,\n\t\tsearch?: string,\n\t\tonlyDeleted?: boolean,\n\t): Promise<void> {\n\t\tthis.loading.set(true);\n\t\tthis.error.set(null);\n\n\t\ttry {\n\t\t\tconst options: Record<string, unknown> = {\n\t\t\t\tpage,\n\t\t\t\tlimit: this.pageSize(),\n\t\t\t\tdepth: 1,\n\t\t\t};\n\n\t\t\tif (onlyDeleted) {\n\t\t\t\toptions['onlyDeleted'] = true;\n\t\t\t}\n\n\t\t\tif (sortState) {\n\t\t\t\toptions['sort'] =\n\t\t\t\t\tsortState.direction === 'desc' ? `-${String(sortState.field)}` : String(sortState.field);\n\t\t\t}\n\n\t\t\tif (search) {\n\t\t\t\t// Build where clause for search\n\t\t\t\tconst searchFields =\n\t\t\t\t\tthis.searchFields().length > 0 ? this.searchFields() : this.getDefaultSearchFields();\n\n\t\t\t\tif (searchFields.length > 0) {\n\t\t\t\t\toptions['where'] = {\n\t\t\t\t\t\tor: searchFields.map((field) => ({\n\t\t\t\t\t\t\t[field]: { contains: search },\n\t\t\t\t\t\t})),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst result = await this.api.collection<T>(slug).find(options);\n\t\t\tthis.entities.set(result.docs);\n\t\t\tthis.totalItems.set(result.totalDocs);\n\t\t\tthis.dataLoaded.emit(result);\n\t\t} catch {\n\t\t\tthis.error.set('Failed to load data');\n\t\t\tthis.entities.set([]);\n\t\t\tthis.totalItems.set(0);\n\t\t} finally {\n\t\t\tthis.loading.set(false);\n\t\t}\n\t}\n\n\t/**\n\t * Get default search fields from collection.\n\t */\n\tprivate getDefaultSearchFields(): string[] {\n\t\tconst col = this.collection();\n\t\tconst fields: string[] = [];\n\n\t\tfor (const field of col.fields) {\n\t\t\tif (field.type === 'text' || field.type === 'textarea' || field.type === 'email') {\n\t\t\t\tfields.push(field.name);\n\t\t\t\tif (fields.length >= 3) break; // Limit search fields\n\t\t\t}\n\t\t}\n\n\t\treturn fields;\n\t}\n\n\t/**\n\t * Determine if a field should be shown in the list.\n\t */\n\tprivate shouldShowFieldInList(field: Field): boolean {\n\t\t// Skip hidden fields\n\t\tif (field.admin?.hidden) return false;\n\n\t\t// Skip blocks (too complex for table cells)\n\t\tif (field.type === 'blocks') return false;\n\n\t\t// Skip richText (too long for table cells)\n\t\tif (field.type === 'richText') return false;\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Convert a collection field to a table column.\n\t */\n\tprivate fieldToColumn(\n\t\tfield: Field,\n\t\tcomplexTemplate?: TemplateRef<DataTableCellContext<T>>,\n\t): EntityListColumn<T> {\n\t\tconst column: EntityListColumn<T> = {\n\t\t\t// Field name is a valid key on the entity type\n\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\tfield: field.name as keyof T & string,\n\t\t\theader: field.label || field.name,\n\t\t\tsortable:\n\t\t\t\tfield.type !== 'array' &&\n\t\t\t\tfield.type !== 'relationship' &&\n\t\t\t\tfield.type !== 'group' &&\n\t\t\t\tfield.type !== 'json',\n\t\t\ttype: FIELD_TYPE_TO_COLUMN_TYPE[field.type] || 'text',\n\t\t};\n\n\t\t// Set width for specific types\n\t\tif (field.type === 'checkbox') {\n\t\t\tcolumn.width = '80px';\n\t\t\tcolumn.align = 'center';\n\t\t} else if (field.type === 'date') {\n\t\t\tcolumn.width = '120px';\n\t\t} else if (field.type === 'number') {\n\t\t\tcolumn.width = '100px';\n\t\t\tcolumn.align = 'right';\n\t\t} else if (field.type === 'group' || field.type === 'array' || field.type === 'json') {\n\t\t\tcolumn.width = '150px';\n\t\t}\n\n\t\t// Use complex cell template for group, array, and json fields\n\t\tif (\n\t\t\tcomplexTemplate &&\n\t\t\t(field.type === 'group' || field.type === 'array' || field.type === 'json')\n\t\t) {\n\t\t\tcolumn.template = complexTemplate;\n\t\t} else if (field.type === 'number' && field.displayFormat) {\n\t\t\t// Use Intl.NumberFormat for formatted numbers\n\t\t\tconst fmt = field.displayFormat;\n\t\t\tcolumn.render = (value: unknown) => {\n\t\t\t\tif (value === null || value === undefined) return '-';\n\t\t\t\tconst num = Number(value);\n\t\t\t\tif (isNaN(num)) return String(value);\n\t\t\t\tconst options: Intl.NumberFormatOptions = {};\n\t\t\t\tif (fmt.style) options.style = fmt.style;\n\t\t\t\tif (fmt.currency) options.currency = fmt.currency;\n\t\t\t\tif (fmt.minimumFractionDigits !== undefined)\n\t\t\t\t\toptions.minimumFractionDigits = fmt.minimumFractionDigits;\n\t\t\t\tif (fmt.maximumFractionDigits !== undefined)\n\t\t\t\t\toptions.maximumFractionDigits = fmt.maximumFractionDigits;\n\t\t\t\treturn new Intl.NumberFormat(fmt.locale, options).format(num);\n\t\t\t};\n\t\t} else if (field.type === 'date' && field.displayFormat) {\n\t\t\t// Use Intl.DateTimeFormat for formatted dates\n\t\t\tconst fmt = field.displayFormat;\n\t\t\tcolumn.render = (value: unknown) => {\n\t\t\t\tif (value === null || value === undefined) return '-';\n\t\t\t\tconst date = new Date(String(value));\n\t\t\t\tif (isNaN(date.getTime())) return String(value);\n\t\t\t\tconst options: Intl.DateTimeFormatOptions = {};\n\t\t\t\tif (fmt.preset) options.dateStyle = fmt.preset;\n\t\t\t\tif (fmt.includeTime && fmt.timePreset) options.timeStyle = fmt.timePreset;\n\t\t\t\treturn new Intl.DateTimeFormat(fmt.locale, options).format(date);\n\t\t\t};\n\t\t} else {\n\t\t\t// Default render function\n\t\t\tcolumn.render = (value: unknown) => this.formatValue(value, column.type);\n\t\t}\n\n\t\treturn column;\n\t}\n\n\t/**\n\t * Format a value based on its type.\n\t */\n\tprivate formatValue(value: unknown, type?: EntityListColumn['type']): string {\n\t\tif (value === null || value === undefined) return '-';\n\n\t\tswitch (type) {\n\t\t\tcase 'date': {\n\t\t\t\tconst dateStr = typeof value === 'string' ? value : String(value);\n\t\t\t\treturn new Date(dateStr).toLocaleDateString();\n\t\t\t}\n\t\t\tcase 'datetime': {\n\t\t\t\tconst dtStr = typeof value === 'string' ? value : String(value);\n\t\t\t\treturn new Date(dtStr).toLocaleString();\n\t\t\t}\n\t\t\tcase 'boolean':\n\t\t\t\treturn value ? 'Yes' : 'No';\n\t\t\tcase 'array':\n\t\t\t\treturn Array.isArray(value) ? `${value.length} item${value.length !== 1 ? 's' : ''}` : '-';\n\t\t\tcase 'group': {\n\t\t\t\tif (typeof value === 'object' && value !== null) {\n\t\t\t\t\tconst keys = Object.keys(value);\n\t\t\t\t\treturn `${keys.length} field${keys.length !== 1 ? 's' : ''}`;\n\t\t\t\t}\n\t\t\t\treturn '-';\n\t\t\t}\n\t\t\tcase 'json': {\n\t\t\t\tif (typeof value === 'object' && value !== null) {\n\t\t\t\t\tconst keys = Object.keys(value);\n\t\t\t\t\treturn `${keys.length} key${keys.length !== 1 ? 's' : ''}`;\n\t\t\t\t}\n\t\t\t\treturn String(value);\n\t\t\t}\n\t\t\tcase 'relationship': {\n\t\t\t\tif (typeof value === 'object' && value !== null && 'id' in value) {\n\t\t\t\t\t// Access object properties directly after type narrowing\n\t\t\t\t\tconst obj = value;\n\t\t\t\t\tconst title = 'title' in obj ? obj.title : undefined;\n\t\t\t\t\tconst name = 'name' in obj ? obj.name : undefined;\n\t\t\t\t\treturn String(title || name || obj.id);\n\t\t\t\t}\n\t\t\t\treturn String(value);\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\t// Truncate long text\n\t\t\t\tconst str = String(value);\n\t\t\t\treturn str.length > 100 ? `${str.slice(0, 100)}...` : str;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Generate a brief summary string for complex field values (group, array, json).\n\t */\n\tgetComplexSummary(value: unknown, type?: string): string {\n\t\tif (value === null || value === undefined) return '-';\n\t\tif (Array.isArray(value)) {\n\t\t\treturn `${value.length} item${value.length !== 1 ? 's' : ''}`;\n\t\t}\n\t\tif (typeof value === 'object') {\n\t\t\tconst keys = Object.keys(value);\n\t\t\tif (type === 'group') {\n\t\t\t\treturn `${keys.length} field${keys.length !== 1 ? 's' : ''}`;\n\t\t\t}\n\t\t\treturn `${keys.length} key${keys.length !== 1 ? 's' : ''}`;\n\t\t}\n\t\treturn String(value);\n\t}\n\n\t/**\n\t * Open a dialog to preview the full data for a complex field.\n\t */\n\topenDataPreview(value: unknown, fieldName: string | number | symbol): void {\n\t\tconst col = this.collection();\n\t\tconst name = String(fieldName);\n\t\tconst field = col.fields.find((f) => f.name === name);\n\t\tconst title = field?.label ?? humanizeFieldName(name);\n\n\t\tlet displayType: DataPreviewDialogData['type'] = 'json';\n\t\tlet fieldMeta: FieldDisplayFieldMeta[] = [];\n\n\t\tif (field?.type === 'group') {\n\t\t\tdisplayType = 'group';\n\t\t\tfieldMeta = field.fields\n\t\t\t\t.filter((f) => !f.admin?.hidden)\n\t\t\t\t.map((f) => ({\n\t\t\t\t\tname: f.name,\n\t\t\t\t\tlabel: f.label ?? humanizeFieldName(f.name),\n\t\t\t\t\ttype: f.type,\n\t\t\t\t}));\n\t\t} else if (field?.type === 'array') {\n\t\t\tdisplayType = 'array-table';\n\t\t\tfieldMeta = field.fields\n\t\t\t\t.filter((f) => !f.admin?.hidden)\n\t\t\t\t.map((f) => ({\n\t\t\t\t\tname: f.name,\n\t\t\t\t\tlabel: f.label ?? humanizeFieldName(f.name),\n\t\t\t\t\ttype: f.type,\n\t\t\t\t}));\n\t\t}\n\n\t\tthis.dialog.open<DataPreviewDialog, DataPreviewDialogData>(DataPreviewDialog, {\n\t\t\tdata: { title, value, type: displayType, fieldMeta },\n\t\t\twidth: '40rem',\n\t\t});\n\t}\n\n\t/**\n\t * Handle row click.\n\t */\n\tonRowClick(entity: T): void {\n\t\tthis.entityClick.emit(entity);\n\t\t// Navigate to entity view/edit by default\n\t\tconst path = `${this.basePath()}/${this.collection().slug}/${entity.id}`;\n\t\tthis.router.navigate([path]);\n\t}\n\n\t/**\n\t * Handle row action.\n\t */\n\tonRowAction(event: DataTableRowActionEvent<T>): void {\n\t\tconst action = this.rowActions().find((a) => a.id === event.action.id);\n\t\tif (action) {\n\t\t\tthis.entityAction.emit({ action, entity: event.item });\n\t\t}\n\t}\n\n\t/**\n\t * Handle bulk action.\n\t */\n\tasync onBulkAction(action: EntityAction): Promise<void> {\n\t\tconst selected = this.selectedEntities();\n\n\t\tif (action.requiresConfirmation) {\n\t\t\tif (action.id === 'delete') {\n\t\t\t\tconst confirmed = await this.feedback.confirmBulkDelete(\n\t\t\t\t\tthis.collectionLabel(),\n\t\t\t\t\tselected.length,\n\t\t\t\t);\n\t\t\t\tif (!confirmed) return;\n\t\t\t}\n\t\t}\n\n\t\tthis.bulkAction.emit({ action, entities: selected });\n\n\t\t// Clear selection after bulk action\n\t\tthis.selectedEntities.set([]);\n\t}\n\n\t/**\n\t * Handle search change.\n\t */\n\tonSearchChange(query: string): void {\n\t\tthis.searchQuery.set(query);\n\t\tthis.currentPage.set(1); // Reset to first page on search\n\n\t\t// Sync search to URL (use replaceUrl to avoid polluting browser history)\n\t\tthis.router.navigate([], {\n\t\t\tqueryParams: { search: query || null },\n\t\t\tqueryParamsHandling: 'merge',\n\t\t\treplaceUrl: true,\n\t\t});\n\t}\n\n\t/**\n\t * Handle page change.\n\t */\n\tonPageChange(page: number): void {\n\t\tthis.currentPage.set(page);\n\t}\n\n\t/**\n\t * Handle sort change.\n\t */\n\tonSortChange(sortState: DataTableSort<T> | undefined): void {\n\t\tthis.sort.set(sortState);\n\t\tif (sortState) {\n\t\t\tthis.currentPage.set(1); // Reset to first page on sort\n\t\t}\n\n\t\t// Sync sort to URL (format: \"field\" for asc, \"-field\" for desc)\n\t\tconst sortParam = sortState\n\t\t\t? sortState.direction === 'desc'\n\t\t\t\t? `-${String(sortState.field)}`\n\t\t\t\t: String(sortState.field)\n\t\t\t: null;\n\n\t\tthis.router.navigate([], {\n\t\t\tqueryParams: { sort: sortParam },\n\t\t\tqueryParamsHandling: 'merge',\n\t\t\treplaceUrl: true,\n\t\t});\n\t}\n\n\t/**\n\t * Reload data.\n\t */\n\treload(): void {\n\t\tconst col = this.collection();\n\t\tif (col) {\n\t\t\tthis.loadData(\n\t\t\t\tcol.slug,\n\t\t\t\tthis.currentPage(),\n\t\t\t\tthis.sort(),\n\t\t\t\tthis.searchQuery(),\n\t\t\t\tthis.viewingTrash(),\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Toggle between active and trash views.\n\t */\n\ttoggleTrashView(): void {\n\t\tthis.viewingTrash.update((v) => !v);\n\t\tthis.currentPage.set(1);\n\t\tthis.selectedEntities.set([]);\n\t}\n\n\t/**\n\t * Handle create button click.\n\t */\n\tonCreateClick(): void {\n\t\tconst path = `${this.basePath()}/${this.collection().slug}/new`;\n\t\tthis.router.navigate([path]);\n\t}\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, signal } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { HttpClient } from '@angular/common/http';\nimport { firstValueFrom } from 'rxjs';\nimport {\n\tButton,\n\tDialog,\n\tDialogHeader,\n\tDialogTitle,\n\tDialogContent,\n\tDialogFooter,\n\tDialogClose,\n\tDIALOG_DATA,\n\tInput,\n\tLabel,\n\tSelect,\n} from '@momentumcms/ui';\nimport type { SelectOption } from '@momentumcms/ui';\nimport { MomentumAuthService } from '../../services/auth.service';\n\n/** Data passed to the GenerateApiKeyDialog. */\nexport interface GenerateApiKeyDialogData {\n\t/** HTTP endpoint to POST to (e.g., '/api/auth/api-keys') */\n\tendpoint: string;\n}\n\n/** Response from the API key creation endpoint. */\ninterface ApiKeyCreateResponse {\n\tid: string;\n\tname: string;\n\tkey: string;\n\tkeyPrefix: string;\n\trole: string;\n\texpiresAt: string | null;\n\tcreatedAt: string;\n}\n\n/** Role hierarchy: lower index = higher privilege.\n * Keep in sync with AUTH_ROLES in @momentumcms/auth/collections */\nconst ROLE_HIERARCHY: SelectOption[] = [\n\t{ label: 'Admin', value: 'admin' },\n\t{ label: 'Editor', value: 'editor' },\n\t{ label: 'User', value: 'user' },\n\t{ label: 'Viewer', value: 'viewer' },\n];\n\n/**\n * Dialog for generating a new API key.\n *\n * Shows a form with name + role fields, calls the API endpoint,\n * then displays the raw key with a copy button.\n */\n@Component({\n\tselector: 'mcms-generate-api-key-dialog',\n\timports: [\n\t\tButton,\n\t\tDialog,\n\t\tDialogHeader,\n\t\tDialogTitle,\n\t\tDialogContent,\n\t\tDialogFooter,\n\t\tDialogClose,\n\t\tInput,\n\t\tLabel,\n\t\tSelect,\n\t],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: { style: 'display: block; width: 100%' },\n\ttemplate: `\n\t\t<mcms-dialog>\n\t\t\t<mcms-dialog-header>\n\t\t\t\t<mcms-dialog-title>Generate API Key</mcms-dialog-title>\n\t\t\t</mcms-dialog-header>\n\n\t\t\t<mcms-dialog-content>\n\t\t\t\t@if (generatedKey()) {\n\t\t\t\t\t<!-- Success: show the generated key -->\n\t\t\t\t\t<div class=\"space-y-4\">\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=\"rounded-md border border-amber-200 bg-amber-50 p-3 text-sm text-amber-800 dark:border-amber-800 dark:bg-amber-950 dark:text-amber-200\"\n\t\t\t\t\t\t\trole=\"alert\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tThis key will only be shown once. Copy it now.\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<mcms-label>API Key</mcms-label>\n\t\t\t\t\t\t\t<div class=\"mt-1.5 flex gap-2\">\n\t\t\t\t\t\t\t\t<code\n\t\t\t\t\t\t\t\t\tclass=\"flex-1 rounded-md border bg-muted px-3 py-2 text-sm font-mono break-all\"\n\t\t\t\t\t\t\t\t\tdata-testid=\"generated-api-key\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{{ generatedKey() }}\n\t\t\t\t\t\t\t\t</code>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tmcms-button\n\t\t\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\tdata-testid=\"copy-api-key\"\n\t\t\t\t\t\t\t\t\t[attr.aria-label]=\"\n\t\t\t\t\t\t\t\t\t\tcopied() ? 'API key copied to clipboard' : 'Copy API key to clipboard'\n\t\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t\t(click)=\"copyKey()\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{{ copied() ? 'Copied!' : 'Copy' }}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<span class=\"sr-only\" aria-live=\"polite\">\n\t\t\t\t\t\t\t\t{{ copied() ? 'API key copied to clipboard' : '' }}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t@if (generatedKeyPrefix()) {\n\t\t\t\t\t\t\t<div class=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\tKey prefix: <code>{{ generatedKeyPrefix() }}</code>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t} @else {\n\t\t\t\t\t<!-- Form: enter name and role -->\n\t\t\t\t\t<div class=\"space-y-4\">\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<mcms-label for=\"api-key-name\">Key Name</mcms-label>\n\t\t\t\t\t\t\t<mcms-input\n\t\t\t\t\t\t\t\tid=\"api-key-name\"\n\t\t\t\t\t\t\t\tplaceholder=\"e.g. CI/CD Pipeline\"\n\t\t\t\t\t\t\t\t[value]=\"name()\"\n\t\t\t\t\t\t\t\t(valueChange)=\"name.set($event)\"\n\t\t\t\t\t\t\t\tclass=\"mt-1.5\"\n\t\t\t\t\t\t\t\tdata-testid=\"api-key-name-input\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<mcms-label for=\"api-key-role\">Role</mcms-label>\n\t\t\t\t\t\t\t<mcms-select\n\t\t\t\t\t\t\t\tid=\"api-key-role\"\n\t\t\t\t\t\t\t\t[options]=\"roleOptions()\"\n\t\t\t\t\t\t\t\t[value]=\"role()\"\n\t\t\t\t\t\t\t\t(valueChange)=\"role.set($event)\"\n\t\t\t\t\t\t\t\tclass=\"mt-1.5\"\n\t\t\t\t\t\t\t\tdata-testid=\"api-key-role-select\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t@if (errorMessage()) {\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclass=\"rounded-md border border-destructive/50 bg-destructive/10 p-3 text-sm text-destructive\"\n\t\t\t\t\t\t\t\trole=\"alert\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{{ errorMessage() }}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t</mcms-dialog-content>\n\n\t\t\t<mcms-dialog-footer>\n\t\t\t\t@if (generatedKey()) {\n\t\t\t\t\t<button\n\t\t\t\t\t\tmcms-button\n\t\t\t\t\t\tvariant=\"primary\"\n\t\t\t\t\t\t[mcmsDialogClose]=\"true\"\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tdata-testid=\"api-key-done\"\n\t\t\t\t\t>\n\t\t\t\t\t\tDone\n\t\t\t\t\t</button>\n\t\t\t\t} @else {\n\t\t\t\t\t<button mcms-button variant=\"outline\" mcmsDialogClose type=\"button\">Cancel</button>\n\t\t\t\t\t<button\n\t\t\t\t\t\tmcms-button\n\t\t\t\t\t\tvariant=\"primary\"\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t[disabled]=\"!name().trim() || submitting()\"\n\t\t\t\t\t\tdata-testid=\"api-key-submit\"\n\t\t\t\t\t\t(click)=\"submit()\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ submitting() ? 'Generating...' : 'Generate' }}\n\t\t\t\t\t</button>\n\t\t\t\t}\n\t\t\t</mcms-dialog-footer>\n\t\t</mcms-dialog>\n\t`,\n})\nexport class GenerateApiKeyDialog {\n\tprivate readonly data = inject<GenerateApiKeyDialogData>(DIALOG_DATA);\n\tprivate readonly http = inject(HttpClient);\n\tprivate readonly auth = inject(MomentumAuthService);\n\tprivate readonly doc = inject(DOCUMENT);\n\n\t/** Form state */\n\treadonly name = signal('');\n\treadonly role = signal('user');\n\treadonly submitting = signal(false);\n\treadonly errorMessage = signal('');\n\n\t/** Result state */\n\treadonly generatedKey = signal('');\n\treadonly generatedKeyPrefix = signal('');\n\treadonly copied = signal(false);\n\n\t/** Admins see all roles; non-admins see only their role level and below. */\n\treadonly roleOptions = computed<SelectOption[]>(() => {\n\t\tconst userRole = this.auth.role() ?? 'viewer';\n\t\tif (userRole === 'admin') return ROLE_HIERARCHY;\n\t\tconst idx = ROLE_HIERARCHY.findIndex((r) => r.value === userRole);\n\t\treturn idx >= 0 ? ROLE_HIERARCHY.slice(idx) : ROLE_HIERARCHY.slice(-1);\n\t});\n\n\tasync submit(): Promise<void> {\n\t\tconst trimmedName = this.name().trim();\n\t\tif (!trimmedName) return;\n\n\t\tthis.submitting.set(true);\n\t\tthis.errorMessage.set('');\n\n\t\ttry {\n\t\t\tconst response = await firstValueFrom(\n\t\t\t\tthis.http.post<ApiKeyCreateResponse>(this.data.endpoint, {\n\t\t\t\t\tname: trimmedName,\n\t\t\t\t\trole: this.role(),\n\t\t\t\t}),\n\t\t\t);\n\n\t\t\tthis.generatedKey.set(response.key);\n\t\t\tthis.generatedKeyPrefix.set(response.keyPrefix);\n\t\t} catch {\n\t\t\tthis.errorMessage.set('Failed to generate API key. Please try again.');\n\t\t} finally {\n\t\t\tthis.submitting.set(false);\n\t\t}\n\t}\n\n\tasync copyKey(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.doc.defaultView?.navigator.clipboard.writeText(this.generatedKey());\n\t\t\tthis.copied.set(true);\n\t\t\tthis.doc.defaultView?.setTimeout(() => this.copied.set(false), 2000);\n\t\t} catch {\n\t\t\t// Clipboard API not available, user can manually copy\n\t\t}\n\t}\n}\n","import { Component, ChangeDetectionStrategy, inject, computed, viewChild } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { map } from 'rxjs/operators';\nimport type { AdminConfig, CollectionConfig } from '@momentumcms/core';\nimport { DialogService } from '@momentumcms/ui';\nimport { getCollectionsFromRouteData } from '../../utils/route-data';\nimport { EntityListWidget } from '../../widgets/entity-list/entity-list.component';\nimport type { Entity, EntityAction } from '../../widgets/widget.types';\nimport type { EntityListBulkActionEvent } from '../../widgets/entity-list/entity-list.types';\nimport { injectMomentumAPI } from '../../services/momentum-api.service';\nimport { FeedbackService } from '../../widgets/feedback/feedback.service';\nimport {\n\tGenerateApiKeyDialog,\n\ttype GenerateApiKeyDialogData,\n} from '../../components/generate-api-key-dialog/generate-api-key-dialog.component';\n\n/**\n * Collection List Page Component\n *\n * Displays a list of documents in a collection using the EntityListWidget.\n * Supports bulk actions (e.g., bulk delete) via selection checkboxes.\n */\n@Component({\n\tselector: 'mcms-collection-list',\n\timports: [EntityListWidget],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: { class: 'block' },\n\ttemplate: `\n\t\t@if (collection(); as col) {\n\t\t\t<mcms-entity-list\n\t\t\t\t#entityList\n\t\t\t\t[collection]=\"col\"\n\t\t\t\t[basePath]=\"basePath\"\n\t\t\t\t[selectable]=\"true\"\n\t\t\t\t[bulkActions]=\"bulkActions()\"\n\t\t\t\t[headerActions]=\"headerActions()\"\n\t\t\t\t(entityClick)=\"onEntityClick($event)\"\n\t\t\t\t(bulkAction)=\"onBulkAction($event)\"\n\t\t\t\t(headerActionClick)=\"onHeaderAction($event)\"\n\t\t\t/>\n\t\t} @else {\n\t\t\t<div class=\"p-12 text-center text-muted-foreground\">Collection not found</div>\n\t\t}\n\t`,\n})\nexport class CollectionListPage {\n\tprivate readonly route = inject(ActivatedRoute);\n\tprivate readonly router = inject(Router);\n\tprivate readonly api = injectMomentumAPI();\n\tprivate readonly feedback = inject(FeedbackService);\n\tprivate readonly dialog = inject(DialogService);\n\n\treadonly entityList = viewChild<EntityListWidget>('entityList');\n\n\treadonly basePath = '/admin/collections';\n\n\t// Reactive slug signal that updates when route params change\n\tprivate readonly slug = toSignal(\n\t\tthis.route.paramMap.pipe(map((params) => params.get('slug') ?? '')),\n\t\t{ initialValue: this.route.snapshot.paramMap.get('slug') ?? '' },\n\t);\n\n\treadonly collection = computed((): CollectionConfig | undefined => {\n\t\tconst currentSlug = this.slug();\n\t\tif (!currentSlug) return undefined;\n\n\t\tconst collections = getCollectionsFromRouteData(this.route.parent?.snapshot.data);\n\t\treturn collections.find((c) => c.slug === currentSlug);\n\t});\n\n\treadonly headerActions = computed((): NonNullable<AdminConfig['headerActions']> => {\n\t\treturn this.collection()?.admin?.headerActions ?? [];\n\t});\n\n\treadonly bulkActions = computed((): EntityAction[] => [\n\t\t{\n\t\t\tid: 'delete',\n\t\t\tlabel: 'Delete',\n\t\t\tvariant: 'destructive',\n\t\t\trequiresConfirmation: true,\n\t\t},\n\t]);\n\n\tonEntityClick(entity: Entity): void {\n\t\tconst col = this.collection();\n\t\tif (col) {\n\t\t\tthis.router.navigate([this.basePath, col.slug, entity.id]);\n\t\t}\n\t}\n\n\tonHeaderAction(action: NonNullable<AdminConfig['headerActions']>[number]): void {\n\t\tif (action.id === 'generate-key' && action.endpoint) {\n\t\t\tconst ref = this.dialog.open<GenerateApiKeyDialog, GenerateApiKeyDialogData, boolean>(\n\t\t\t\tGenerateApiKeyDialog,\n\t\t\t\t{\n\t\t\t\t\twidth: '28rem',\n\t\t\t\t\tdata: { endpoint: action.endpoint },\n\t\t\t\t},\n\t\t\t);\n\t\t\tref.afterClosed.subscribe((created) => {\n\t\t\t\tif (created) {\n\t\t\t\t\tthis.entityList()?.reload();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tasync onBulkAction(event: EntityListBulkActionEvent): Promise<void> {\n\t\tconst col = this.collection();\n\t\tif (!col) return;\n\n\t\tif (event.action.id === 'delete') {\n\t\t\tconst ids = event.entities.map((e) => String(e.id));\n\t\t\ttry {\n\t\t\t\tawait this.api.collection(col.slug).batchDelete(ids);\n\t\t\t\tthis.entityList()?.reload();\n\t\t\t} catch {\n\t\t\t\t// Error handled by crudToastInterceptor\n\t\t\t}\n\t\t}\n\t}\n}\n","import {\n\tChangeDetectionStrategy,\n\tComponent,\n\tcomputed,\n\tDestroyRef,\n\teffect,\n\tElementRef,\n\tinput,\n\toutput,\n\tsignal,\n\tviewChild,\n} from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { DomSanitizer, type SafeResourceUrl } from '@angular/platform-browser';\nimport { inject } from '@angular/core';\nimport { Button } from '@momentumcms/ui';\n\n/** Device size preset for the preview iframe. */\nexport type DeviceSize = 'desktop' | 'tablet' | 'mobile';\n\n/**\n * Live Preview Widget\n *\n * Displays an iframe that shows a live preview of the document being edited.\n * Sends form data to the iframe via postMessage on each change.\n */\n@Component({\n\tselector: 'mcms-live-preview',\n\timports: [Button],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: { class: 'flex flex-col h-full border-l border-border' },\n\ttemplate: `\n\t\t<!-- Preview toolbar -->\n\t\t<div class=\"flex items-center gap-2 px-4 py-2 border-b border-border bg-muted/50\">\n\t\t\t<span class=\"text-sm font-medium text-foreground\">Preview</span>\n\t\t\t<div class=\"flex-1\"></div>\n\n\t\t\t<!-- Device size toggle -->\n\t\t\t<div\n\t\t\t\tclass=\"flex rounded-md border border-border overflow-hidden\"\n\t\t\t\trole=\"group\"\n\t\t\t\taria-label=\"Preview device size\"\n\t\t\t\tdata-testid=\"device-toggle\"\n\t\t\t>\n\t\t\t\t<button\n\t\t\t\t\tclass=\"px-2 py-1 text-xs transition-colors\"\n\t\t\t\t\t[class]=\"\n\t\t\t\t\t\tdeviceSize() === 'desktop'\n\t\t\t\t\t\t\t? 'bg-primary text-primary-foreground'\n\t\t\t\t\t\t\t: 'bg-background text-muted-foreground hover:bg-muted'\n\t\t\t\t\t\"\n\t\t\t\t\t[attr.aria-pressed]=\"deviceSize() === 'desktop'\"\n\t\t\t\t\t(click)=\"deviceSize.set('desktop')\"\n\t\t\t\t\tdata-testid=\"device-desktop\"\n\t\t\t\t>\n\t\t\t\t\tDesktop\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\tclass=\"px-2 py-1 text-xs border-l border-border transition-colors\"\n\t\t\t\t\t[class]=\"\n\t\t\t\t\t\tdeviceSize() === 'tablet'\n\t\t\t\t\t\t\t? 'bg-primary text-primary-foreground'\n\t\t\t\t\t\t\t: 'bg-background text-muted-foreground hover:bg-muted'\n\t\t\t\t\t\"\n\t\t\t\t\t[attr.aria-pressed]=\"deviceSize() === 'tablet'\"\n\t\t\t\t\t(click)=\"deviceSize.set('tablet')\"\n\t\t\t\t\tdata-testid=\"device-tablet\"\n\t\t\t\t>\n\t\t\t\t\tTablet\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\tclass=\"px-2 py-1 text-xs border-l border-border transition-colors\"\n\t\t\t\t\t[class]=\"\n\t\t\t\t\t\tdeviceSize() === 'mobile'\n\t\t\t\t\t\t\t? 'bg-primary text-primary-foreground'\n\t\t\t\t\t\t\t: 'bg-background text-muted-foreground hover:bg-muted'\n\t\t\t\t\t\"\n\t\t\t\t\t[attr.aria-pressed]=\"deviceSize() === 'mobile'\"\n\t\t\t\t\t(click)=\"deviceSize.set('mobile')\"\n\t\t\t\t\tdata-testid=\"device-mobile\"\n\t\t\t\t>\n\t\t\t\t\tMobile\n\t\t\t\t</button>\n\t\t\t</div>\n\n\t\t\t<button\n\t\t\t\tmcms-button\n\t\t\t\tvariant=\"ghost\"\n\t\t\t\tsize=\"sm\"\n\t\t\t\t(click)=\"refreshPreview()\"\n\t\t\t\tdata-testid=\"preview-refresh\"\n\t\t\t\taria-label=\"Refresh preview\"\n\t\t\t>\n\t\t\t\t↻ Refresh\n\t\t\t</button>\n\t\t</div>\n\n\t\t<!-- Preview iframe container -->\n\t\t<div class=\"flex-1 overflow-auto bg-muted/30 flex justify-center p-4\">\n\t\t\t@if (safePreviewUrl(); as url) {\n\t\t\t\t<iframe\n\t\t\t\t\t#previewFrame\n\t\t\t\t\t[src]=\"url\"\n\t\t\t\t\t[style.width]=\"iframeWidth()\"\n\t\t\t\t\tclass=\"h-full bg-white border border-border rounded-md shadow-sm transition-[width] duration-300\"\n\t\t\t\t\tsandbox=\"allow-same-origin allow-scripts allow-popups allow-forms\"\n\t\t\t\t\ttitle=\"Live document preview\"\n\t\t\t\t\tdata-testid=\"preview-iframe\"\n\t\t\t\t></iframe>\n\t\t\t} @else {\n\t\t\t\t<div class=\"flex items-center justify-center h-full text-muted-foreground text-sm\">\n\t\t\t\t\tPreview not available\n\t\t\t\t</div>\n\t\t\t}\n\t\t</div>\n\t`,\n})\nexport class LivePreviewComponent {\n\tprivate readonly document = inject(DOCUMENT);\n\tprivate readonly sanitizer = inject(DomSanitizer);\n\tprivate readonly destroyRef = inject(DestroyRef);\n\n\t/** Preview configuration from collection admin config */\n\treadonly preview = input.required<boolean | ((doc: Record<string, unknown>) => string)>();\n\n\t/** Current document data from the form */\n\treadonly documentData = input.required<Record<string, unknown>>();\n\n\t/** Collection slug */\n\treadonly collectionSlug = input.required<string>();\n\n\t/** Document ID (undefined for create mode) */\n\treadonly entityId = input<string | undefined>(undefined);\n\n\t/** Emitted when the preview iframe requests editing a block */\n\treadonly editBlockRequest = output<number>();\n\n\t/** Current device size */\n\treadonly deviceSize = signal<DeviceSize>('desktop');\n\n\t/** Refresh counter to force iframe reload */\n\tprivate readonly refreshCounter = signal(0);\n\n\t/** Reference to the iframe element */\n\treadonly previewFrame = viewChild<ElementRef<HTMLIFrameElement>>('previewFrame');\n\n\t/** Compute the raw preview URL */\n\treadonly previewUrl = computed((): string | null => {\n\t\t// Force recomputation on refresh\n\t\tthis.refreshCounter();\n\n\t\tconst previewConfig = this.preview();\n\t\tconst data = this.documentData();\n\t\tconst slug = this.collectionSlug();\n\t\tconst id = this.entityId();\n\n\t\tif (typeof previewConfig === 'function') {\n\t\t\ttry {\n\t\t\t\treturn previewConfig(data);\n\t\t\t} catch {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\tif (previewConfig === true && id) {\n\t\t\treturn `/api/${slug}/${id}/preview`;\n\t\t}\n\n\t\treturn null;\n\t});\n\n\t/** Sanitized preview URL for iframe binding */\n\treadonly safePreviewUrl = computed((): SafeResourceUrl | null => {\n\t\tconst url = this.previewUrl();\n\t\tif (!url) return null;\n\t\treturn this.sanitizer.bypassSecurityTrustResourceUrl(url);\n\t});\n\n\t/** Computed iframe width based on device size */\n\treadonly iframeWidth = computed((): string => {\n\t\tswitch (this.deviceSize()) {\n\t\t\tcase 'tablet':\n\t\t\t\treturn '768px';\n\t\t\tcase 'mobile':\n\t\t\t\treturn '375px';\n\t\t\tdefault:\n\t\t\t\treturn '100%';\n\t\t}\n\t});\n\n\t/** Debounce timer for postMessage updates */\n\tprivate debounceTimer: number | undefined = undefined;\n\n\tconstructor() {\n\t\t// Send form data to iframe via postMessage whenever data changes\n\t\teffect(() => {\n\t\t\tconst data = this.documentData();\n\t\t\tconst frame = this.previewFrame();\n\t\t\tif (!frame?.nativeElement?.contentWindow) return;\n\n\t\t\t// Debounce to avoid thrashing\n\t\t\tif (this.debounceTimer) {\n\t\t\t\tclearTimeout(this.debounceTimer);\n\t\t\t}\n\n\t\t\tthis.debounceTimer = this.document.defaultView?.setTimeout(() => {\n\t\t\t\tconst iframeWindow = frame.nativeElement.contentWindow;\n\t\t\t\tif (iframeWindow) {\n\t\t\t\t\tconst targetOrigin = this.document.defaultView?.location?.origin ?? '';\n\t\t\t\t\tiframeWindow.postMessage({ type: 'momentum-preview-update', data }, targetOrigin);\n\t\t\t\t}\n\t\t\t}, 300);\n\t\t});\n\n\t\t// Listen for edit block requests from preview iframe\n\t\tconst win = this.document.defaultView;\n\t\tif (win) {\n\t\t\tconst editHandler = (event: MessageEvent): void => {\n\t\t\t\tif (event.origin !== win.location.origin) return;\n\t\t\t\tif (event.data?.type !== 'momentum-edit-block') return;\n\t\t\t\tconst blockIndex = event.data.blockIndex;\n\t\t\t\tif (typeof blockIndex === 'number') {\n\t\t\t\t\tthis.editBlockRequest.emit(blockIndex);\n\t\t\t\t}\n\t\t\t};\n\t\t\twin.addEventListener('message', editHandler);\n\t\t\tthis.destroyRef.onDestroy(() => win.removeEventListener('message', editHandler));\n\t\t}\n\n\t\t// Clean up debounce timer on destroy\n\t\tthis.destroyRef.onDestroy(() => {\n\t\t\tif (this.debounceTimer) {\n\t\t\t\tclearTimeout(this.debounceTimer);\n\t\t\t\tthis.debounceTimer = undefined;\n\t\t\t}\n\t\t});\n\t}\n\n\t/** Force iframe to reload */\n\trefreshPreview(): void {\n\t\tthis.refreshCounter.update((c) => c + 1);\n\t}\n}\n","import {\n\tComponent,\n\tChangeDetectionStrategy,\n\tinject,\n\tcomputed,\n\tsignal,\n\tviewChild,\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { map } from 'rxjs/operators';\nimport type { CollectionConfig } from '@momentumcms/core';\nimport { Button } from '@momentumcms/ui';\nimport { getCollectionsFromRouteData } from '../../utils/route-data';\nimport { EntityViewWidget } from '../../widgets/entity-view/entity-view.component';\nimport { LivePreviewComponent } from '../../widgets/live-preview/live-preview.component';\nimport type { Entity } from '../../widgets/widget.types';\n\n/**\n * Collection View Page Component\n *\n * Displays a read-only view of a document using the EntityViewWidget.\n * When preview is enabled, shows a toggleable live preview panel.\n */\n@Component({\n\tselector: 'mcms-collection-view',\n\timports: [EntityViewWidget, LivePreviewComponent, Button],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: { class: 'block' },\n\ttemplate: `\n\t\t@if (collection(); as col) {\n\t\t\t@if (entityId(); as id) {\n\t\t\t\t@if (previewConfig(); as preview) {\n\t\t\t\t\t@if (showPreview()) {\n\t\t\t\t\t\t<!-- Split layout: entity view + preview -->\n\t\t\t\t\t\t<div class=\"flex gap-0 h-[calc(100vh-64px)]\" data-testid=\"preview-layout\">\n\t\t\t\t\t\t\t<div class=\"flex-1 overflow-y-auto p-6\">\n\t\t\t\t\t\t\t\t<mcms-entity-view\n\t\t\t\t\t\t\t\t\t#entityView\n\t\t\t\t\t\t\t\t\t[collection]=\"col\"\n\t\t\t\t\t\t\t\t\t[entityId]=\"id\"\n\t\t\t\t\t\t\t\t\t[basePath]=\"basePath\"\n\t\t\t\t\t\t\t\t\t(edit)=\"onEdit($event)\"\n\t\t\t\t\t\t\t\t\t(delete_)=\"onDelete($event)\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<div entityViewHeaderExtra class=\"mt-3\">\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\tmcms-button\n\t\t\t\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\tdata-testid=\"preview-toggle\"\n\t\t\t\t\t\t\t\t\t\t\t(click)=\"showPreview.set(false)\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\tHide Preview\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</mcms-entity-view>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"w-[50%] min-w-[400px] max-w-[720px]\">\n\t\t\t\t\t\t\t\t<mcms-live-preview\n\t\t\t\t\t\t\t\t\t[preview]=\"preview\"\n\t\t\t\t\t\t\t\t\t[documentData]=\"viewEntityData()\"\n\t\t\t\t\t\t\t\t\t[collectionSlug]=\"col.slug\"\n\t\t\t\t\t\t\t\t\t[entityId]=\"id\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t} @else {\n\t\t\t\t\t\t<!-- Full-width view (preview hidden) -->\n\t\t\t\t\t\t<mcms-entity-view\n\t\t\t\t\t\t\t#entityView\n\t\t\t\t\t\t\t[collection]=\"col\"\n\t\t\t\t\t\t\t[entityId]=\"id\"\n\t\t\t\t\t\t\t[basePath]=\"basePath\"\n\t\t\t\t\t\t\t(edit)=\"onEdit($event)\"\n\t\t\t\t\t\t\t(delete_)=\"onDelete($event)\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div entityViewHeaderExtra class=\"mt-3\">\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tmcms-button\n\t\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\tdata-testid=\"preview-toggle\"\n\t\t\t\t\t\t\t\t\t(click)=\"showPreview.set(true)\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tShow Preview\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</mcms-entity-view>\n\t\t\t\t\t}\n\t\t\t\t} @else {\n\t\t\t\t\t<!-- No preview configured -->\n\t\t\t\t\t<mcms-entity-view\n\t\t\t\t\t\t#entityView\n\t\t\t\t\t\t[collection]=\"col\"\n\t\t\t\t\t\t[entityId]=\"id\"\n\t\t\t\t\t\t[basePath]=\"basePath\"\n\t\t\t\t\t\t(edit)=\"onEdit($event)\"\n\t\t\t\t\t\t(delete_)=\"onDelete($event)\"\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t} @else {\n\t\t\t\t<div class=\"p-12 text-center text-muted-foreground\">Entity ID not provided</div>\n\t\t\t}\n\t\t} @else {\n\t\t\t<div class=\"p-12 text-center text-muted-foreground\">Collection not found</div>\n\t\t}\n\t`,\n})\nexport class CollectionViewPage {\n\tprivate readonly route = inject(ActivatedRoute);\n\tprivate readonly router = inject(Router);\n\n\treadonly basePath = '/admin/collections';\n\n\t/** Whether the live preview panel is visible */\n\treadonly showPreview = signal(true);\n\n\t/** Reference to the entity view widget to read its entity data */\n\tprivate readonly entityViewRef = viewChild<EntityViewWidget>('entityView');\n\n\t// Reactive slug signal that updates when route params change\n\tprivate readonly slug = toSignal(\n\t\tthis.route.paramMap.pipe(map((params) => params.get('slug') ?? '')),\n\t\t{ initialValue: this.route.snapshot.paramMap.get('slug') ?? '' },\n\t);\n\n\t// Reactive entity ID signal\n\treadonly entityId = toSignal(this.route.paramMap.pipe(map((params) => params.get('id') ?? '')), {\n\t\tinitialValue: this.route.snapshot.paramMap.get('id') ?? '',\n\t});\n\n\treadonly collection = computed((): CollectionConfig | undefined => {\n\t\tconst currentSlug = this.slug();\n\t\tif (!currentSlug) return undefined;\n\n\t\tconst collections = getCollectionsFromRouteData(this.route.parent?.snapshot.data);\n\t\treturn collections.find((c) => c.slug === currentSlug);\n\t});\n\n\t/** Preview config from collection admin settings */\n\treadonly previewConfig = computed(\n\t\t(): boolean | ((doc: Record<string, unknown>) => string) | undefined => {\n\t\t\tconst col = this.collection();\n\t\t\treturn col?.admin?.preview || undefined;\n\t\t},\n\t);\n\n\t/** Entity data from the entity view widget (for live preview) */\n\treadonly viewEntityData = computed((): Record<string, unknown> => {\n\t\tconst view = this.entityViewRef();\n\t\tconst entity = view?.entity();\n\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- T extends Entity with index signature\n\t\treturn (entity as Record<string, unknown>) ?? {};\n\t});\n\n\tonEdit(entity: Entity): void {\n\t\tconst col = this.collection();\n\t\tif (col) {\n\t\t\tthis.router.navigate([this.basePath, col.slug, entity.id, 'edit']);\n\t\t}\n\t}\n\n\tonDelete(_entity: Entity): void {\n\t\t// Navigation is handled by EntityViewWidget\n\t}\n}\n","/**\n * Block Edit Dialog\n *\n * Opens from the preview iframe's \"Edit Block\" overlay. Renders FieldRenderer\n * for each visible field of the selected block, using the parent form's signal\n * forms tree nodes so edits are reflected live in the preview.\n */\n\nimport { ChangeDetectionStrategy, Component, forwardRef, inject } from '@angular/core';\nimport type { BlockConfig, Field } from '@momentumcms/core';\nimport {\n\tButton,\n\tDialog,\n\tDialogHeader,\n\tDialogTitle,\n\tDialogContent,\n\tDialogFooter,\n\tDialogClose,\n\tDialogRef,\n\tDIALOG_DATA,\n} from '@momentumcms/ui';\nimport { getSubNode } from '../entity-form/entity-form.types';\nimport type { EntityFormMode } from '../entity-form/entity-form.types';\nimport { FieldRenderer } from '../entity-form/field-renderers/field-renderer.component';\n\n/** Data passed to the BlockEditDialog via DIALOG_DATA. */\nexport interface BlockEditDialogData {\n\tblockConfig: BlockConfig;\n\tformNode: unknown;\n\tblockIndex: number;\n\tformTree: unknown;\n\tformModel: Record<string, unknown>;\n\tmode: EntityFormMode;\n\tpath: string;\n}\n\n@Component({\n\tselector: 'mcms-block-edit-dialog',\n\timports: [\n\t\tButton,\n\t\tDialog,\n\t\tDialogHeader,\n\t\tDialogTitle,\n\t\tDialogContent,\n\t\tDialogFooter,\n\t\tDialogClose,\n\t\tforwardRef(() => FieldRenderer),\n\t],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: { style: 'display: block; width: 100%' },\n\ttemplate: `\n\t\t<mcms-dialog>\n\t\t\t<mcms-dialog-header>\n\t\t\t\t<mcms-dialog-title>Edit {{ blockLabel }}</mcms-dialog-title>\n\t\t\t</mcms-dialog-header>\n\n\t\t\t<mcms-dialog-content>\n\t\t\t\t<div class=\"space-y-4 max-h-[60vh] overflow-y-auto py-1\">\n\t\t\t\t\t@for (field of visibleFields; track field.name) {\n\t\t\t\t\t\t<mcms-field-renderer\n\t\t\t\t\t\t\t[field]=\"field\"\n\t\t\t\t\t\t\t[formNode]=\"getFieldNode(field.name)\"\n\t\t\t\t\t\t\t[formTree]=\"data.formTree\"\n\t\t\t\t\t\t\t[formModel]=\"data.formModel\"\n\t\t\t\t\t\t\t[mode]=\"data.mode\"\n\t\t\t\t\t\t\t[path]=\"getFieldPath(field.name)\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t</mcms-dialog-content>\n\n\t\t\t<mcms-dialog-footer>\n\t\t\t\t<button mcms-button variant=\"outline\" mcmsDialogClose type=\"button\">Done</button>\n\t\t\t</mcms-dialog-footer>\n\t\t</mcms-dialog>\n\t`,\n})\nexport class BlockEditDialog {\n\treadonly data = inject<BlockEditDialogData>(DIALOG_DATA);\n\tprivate readonly dialogRef = inject(DialogRef);\n\n\treadonly blockLabel = this.data.blockConfig.labels?.singular || this.data.blockConfig.slug;\n\n\treadonly visibleFields: Field[] = this.data.blockConfig.fields.filter((f) => !f.admin?.hidden);\n\n\tgetFieldNode(fieldName: string): unknown {\n\t\tconst blockNode = getSubNode(this.data.formNode, this.data.blockIndex);\n\t\treturn getSubNode(blockNode, fieldName);\n\t}\n\n\tgetFieldPath(fieldName: string): string {\n\t\treturn `${this.data.path}.${this.data.blockIndex}.${fieldName}`;\n\t}\n}\n","import {\n\tComponent,\n\tChangeDetectionStrategy,\n\tinject,\n\tcomputed,\n\tsignal,\n\tviewChild,\n} from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport type { CollectionConfig } from '@momentumcms/core';\nimport { Button, DialogService } from '@momentumcms/ui';\nimport { CollectionAccessService } from '../../services/collection-access.service';\nimport { getCollectionsFromRouteData } from '../../utils/route-data';\nimport { EntityFormWidget } from '../../widgets/entity-form/entity-form.component';\nimport type { EntityFormMode } from '../../widgets/entity-form/entity-form.types';\nimport { LivePreviewComponent } from '../../widgets/live-preview/live-preview.component';\nimport {\n\tBlockEditDialog,\n\ttype BlockEditDialogData,\n} from '../../widgets/visual-block-editor/block-edit-dialog.component';\nimport type { HasUnsavedChanges } from '../../guards/unsaved-changes.guard';\n\n/**\n * Collection Edit Page Component\n *\n * Form for creating or editing a document in a collection using EntityFormWidget.\n * When preview is enabled on the collection, shows a live preview panel alongside the form.\n */\n@Component({\n\tselector: 'mcms-collection-edit',\n\timports: [EntityFormWidget, LivePreviewComponent, Button],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: { class: 'block' },\n\ttemplate: `\n\t\t@if (collection(); as col) {\n\t\t\t@if (previewConfig(); as preview) {\n\t\t\t\t@if (showPreview()) {\n\t\t\t\t\t<!-- Split layout: form + preview -->\n\t\t\t\t\t<div class=\"flex gap-0 h-[calc(100vh-64px)]\" data-testid=\"preview-layout\">\n\t\t\t\t\t\t<div class=\"flex-1 overflow-y-auto p-6\">\n\t\t\t\t\t\t\t<mcms-entity-form\n\t\t\t\t\t\t\t\t#entityForm\n\t\t\t\t\t\t\t\t[collection]=\"col\"\n\t\t\t\t\t\t\t\t[entityId]=\"entityId()\"\n\t\t\t\t\t\t\t\t[mode]=\"mode()\"\n\t\t\t\t\t\t\t\t[basePath]=\"basePath\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<div entityFormHeaderExtra class=\"mt-3\">\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\tmcms-button\n\t\t\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\tdata-testid=\"preview-toggle\"\n\t\t\t\t\t\t\t\t\t\t(click)=\"showPreview.set(false)\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tHide Preview\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</mcms-entity-form>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"w-[50%] min-w-[400px] max-w-[720px]\">\n\t\t\t\t\t\t\t<mcms-live-preview\n\t\t\t\t\t\t\t\t[preview]=\"preview\"\n\t\t\t\t\t\t\t\t[documentData]=\"formData()\"\n\t\t\t\t\t\t\t\t[collectionSlug]=\"col.slug\"\n\t\t\t\t\t\t\t\t[entityId]=\"entityId()\"\n\t\t\t\t\t\t\t\t(editBlockRequest)=\"onEditBlockRequest($event)\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t} @else {\n\t\t\t\t\t<!-- Full-width form (preview hidden) -->\n\t\t\t\t\t<mcms-entity-form\n\t\t\t\t\t\t#entityForm\n\t\t\t\t\t\t[collection]=\"col\"\n\t\t\t\t\t\t[entityId]=\"entityId()\"\n\t\t\t\t\t\t[mode]=\"mode()\"\n\t\t\t\t\t\t[basePath]=\"basePath\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div entityFormHeaderExtra class=\"mt-3\">\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tmcms-button\n\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\tdata-testid=\"preview-toggle\"\n\t\t\t\t\t\t\t\t(click)=\"showPreview.set(true)\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tShow Preview\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</mcms-entity-form>\n\t\t\t\t}\n\t\t\t} @else {\n\t\t\t\t<!-- Standard layout: form only -->\n\t\t\t\t<mcms-entity-form\n\t\t\t\t\t#entityForm\n\t\t\t\t\t[collection]=\"col\"\n\t\t\t\t\t[entityId]=\"entityId()\"\n\t\t\t\t\t[mode]=\"mode()\"\n\t\t\t\t\t[basePath]=\"basePath\"\n\t\t\t\t/>\n\t\t\t}\n\t\t} @else {\n\t\t\t<div class=\"p-12 text-center text-muted-foreground\">Collection not found</div>\n\t\t}\n\t`,\n})\nexport class CollectionEditPage implements HasUnsavedChanges {\n\tprivate readonly route = inject(ActivatedRoute);\n\tprivate readonly dialogService = inject(DialogService);\n\tprivate readonly collectionAccess = inject(CollectionAccessService);\n\n\treadonly basePath = '/admin/collections';\n\n\t/** Whether the live preview panel is visible */\n\treadonly showPreview = signal(true);\n\n\t/** Reference to the entity form widget to read its formData signal */\n\tprivate readonly entityFormRef = viewChild<EntityFormWidget>('entityForm');\n\n\treadonly entityId = computed((): string | undefined => {\n\t\tconst id = this.route.snapshot.paramMap.get('id');\n\t\t// 'create' or null means create mode (no entity ID)\n\t\tif (id === 'create' || id === null) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn id;\n\t});\n\n\treadonly mode = computed((): EntityFormMode => {\n\t\tif (!this.entityId()) return 'create';\n\t\tconst slug = this.collection()?.slug;\n\t\tif (slug && !this.collectionAccess.canUpdate(slug)) return 'view';\n\t\treturn 'edit';\n\t});\n\n\treadonly collection = computed((): CollectionConfig | undefined => {\n\t\tconst slug = this.route.snapshot.paramMap.get('slug');\n\t\tconst collections = getCollectionsFromRouteData(this.route.parent?.snapshot.data);\n\t\treturn collections.find((c) => c.slug === slug);\n\t});\n\n\t/** Preview config from collection admin settings (false-y when not configured) */\n\treadonly previewConfig = computed(\n\t\t(): boolean | ((doc: Record<string, unknown>) => string) | undefined => {\n\t\t\tconst col = this.collection();\n\t\t\treturn col?.admin?.preview || undefined;\n\t\t},\n\t);\n\n\t/** Reactive form data from the entity form widget */\n\treadonly formData = computed((): Record<string, unknown> => {\n\t\tconst form = this.entityFormRef();\n\t\treturn form?.formData() ?? {};\n\t});\n\n\t/** HasUnsavedChanges implementation for the route guard */\n\thasUnsavedChanges(): boolean {\n\t\treturn this.entityFormRef()?.isDirty() ?? false;\n\t}\n\n\t/** Handle edit block request from preview iframe overlay */\n\tonEditBlockRequest(blockIndex: number): void {\n\t\tconst col = this.collection();\n\t\tconst formRef = this.entityFormRef();\n\t\tif (!col || !formRef) return;\n\n\t\t// Find the blocks field in the collection\n\t\tconst blocksField = col.fields.find((f) => f.type === 'blocks');\n\t\tif (!blocksField || blocksField.type !== 'blocks') return;\n\n\t\t// Get current block data to determine its type\n\t\tconst data = formRef.formData();\n\t\tconst blocksArray = data[blocksField.name];\n\t\tif (!Array.isArray(blocksArray) || !blocksArray[blockIndex]) return;\n\n\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- blocksArray elements are untyped\n\t\tconst block = blocksArray[blockIndex] as Record<string, unknown>;\n\t\tconst blockType = block['blockType'];\n\t\tif (typeof blockType !== 'string') return;\n\n\t\t// Find the block config for this type\n\t\tconst blockConfig = blocksField.blocks.find((b) => b.slug === blockType);\n\t\tif (!blockConfig) return;\n\n\t\t// Get the signal forms node for the blocks field\n\t\tconst formNode = formRef.getFormNode(blocksField.name);\n\n\t\tthis.dialogService.open<BlockEditDialog, BlockEditDialogData>(BlockEditDialog, {\n\t\t\twidth: '32rem',\n\t\t\tdata: {\n\t\t\t\tblockConfig,\n\t\t\t\tformNode,\n\t\t\t\tblockIndex,\n\t\t\t\tformTree: formRef.entityForm(),\n\t\t\t\tformModel: formRef.formModel(),\n\t\t\t\tmode: 'edit',\n\t\t\t\tpath: blocksField.name,\n\t\t\t},\n\t\t});\n\t}\n}\n","import {\n\tComponent,\n\tChangeDetectionStrategy,\n\tinject,\n\tsignal,\n\tcomputed,\n\tOnInit,\n\tafterNextRender,\n} from '@angular/core';\nimport { Router, RouterLink } from '@angular/router';\nimport {\n\tInput,\n\tButton,\n\tMcmsFormField,\n\tCard,\n\tCardHeader,\n\tCardTitle,\n\tCardDescription,\n\tCardContent,\n\tCardFooter,\n} from '@momentumcms/ui';\nimport { MomentumAuthService } from '../../services/auth.service';\n\n/**\n * Login Page Component\n *\n * Allows users to sign in with email and password, or via OAuth providers.\n */\n@Component({\n\tselector: 'mcms-login-page',\n\timports: [\n\t\tRouterLink,\n\t\tInput,\n\t\tButton,\n\t\tMcmsFormField,\n\t\tCard,\n\t\tCardHeader,\n\t\tCardTitle,\n\t\tCardDescription,\n\t\tCardContent,\n\t\tCardFooter,\n\t],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: {\n\t\tclass: 'flex min-h-screen items-center justify-center bg-background p-4',\n\t},\n\ttemplate: `\n\t\t<mcms-card class=\"w-full max-w-md\">\n\t\t\t<mcms-card-header class=\"text-center\">\n\t\t\t\t<mcms-card-title>Sign In</mcms-card-title>\n\t\t\t\t<mcms-card-description>\n\t\t\t\t\tEnter your credentials to access the admin dashboard\n\t\t\t\t</mcms-card-description>\n\t\t\t</mcms-card-header>\n\n\t\t\t<mcms-card-content>\n\t\t\t\t<form (submit)=\"onSubmit($event)\" class=\"space-y-4\">\n\t\t\t\t\t@if (error()) {\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=\"rounded-md bg-destructive/15 p-3 text-sm text-destructive\"\n\t\t\t\t\t\t\trole=\"alert\"\n\t\t\t\t\t\t\taria-live=\"polite\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{{ error() }}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\n\t\t\t\t\t<mcms-form-field id=\"login-email\" [required]=\"true\" [errors]=\"emailErrors()\">\n\t\t\t\t\t\t<span mcmsLabel>Email</span>\n\t\t\t\t\t\t<mcms-input\n\t\t\t\t\t\t\ttype=\"email\"\n\t\t\t\t\t\t\tid=\"login-email\"\n\t\t\t\t\t\t\tname=\"email\"\n\t\t\t\t\t\t\t[(value)]=\"email\"\n\t\t\t\t\t\t\tplaceholder=\"admin@example.com\"\n\t\t\t\t\t\t\tautocomplete=\"email\"\n\t\t\t\t\t\t\t[disabled]=\"!hydrated() || isSubmitting()\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</mcms-form-field>\n\n\t\t\t\t\t<mcms-form-field id=\"login-password\" [required]=\"true\" [errors]=\"passwordErrors()\">\n\t\t\t\t\t\t<span mcmsLabel>Password</span>\n\t\t\t\t\t\t<mcms-input\n\t\t\t\t\t\t\ttype=\"password\"\n\t\t\t\t\t\t\tid=\"login-password\"\n\t\t\t\t\t\t\tname=\"password\"\n\t\t\t\t\t\t\t[(value)]=\"password\"\n\t\t\t\t\t\t\tplaceholder=\"Enter your password\"\n\t\t\t\t\t\t\tautocomplete=\"current-password\"\n\t\t\t\t\t\t\t[disabled]=\"!hydrated() || isSubmitting()\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</mcms-form-field>\n\n\t\t\t\t\t<div class=\"flex justify-end\">\n\t\t\t\t\t\t<a routerLink=\"/admin/forgot-password\" class=\"text-sm text-primary hover:underline\">\n\t\t\t\t\t\t\tForgot your password?\n\t\t\t\t\t\t</a>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<button\n\t\t\t\t\t\tmcms-button\n\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\tclass=\"w-full\"\n\t\t\t\t\t\t[disabled]=\"!hydrated() || isSubmitting() || !isValid()\"\n\t\t\t\t\t>\n\t\t\t\t\t\t@if (isSubmitting()) {\n\t\t\t\t\t\t\t<span class=\"animate-spin\" aria-hidden=\"true\">⏳</span>\n\t\t\t\t\t\t\tSigning in...\n\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\tSign In\n\t\t\t\t\t\t}\n\t\t\t\t\t</button>\n\t\t\t\t</form>\n\n\t\t\t\t@if (oauthProviders().length > 0) {\n\t\t\t\t\t<div class=\"relative my-4\">\n\t\t\t\t\t\t<div class=\"absolute inset-0 flex items-center\">\n\t\t\t\t\t\t\t<span class=\"w-full border-t border-border\"></span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"relative flex justify-center text-xs uppercase\">\n\t\t\t\t\t\t\t<span class=\"bg-card px-2 text-muted-foreground\">Or continue with</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"flex flex-col gap-2\">\n\t\t\t\t\t\t@for (provider of oauthProviders(); track provider) {\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tmcms-button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\t\tclass=\"w-full\"\n\t\t\t\t\t\t\t\t(click)=\"signInWithOAuth(provider)\"\n\t\t\t\t\t\t\t\t[disabled]=\"!hydrated() || isSubmitting()\"\n\t\t\t\t\t\t\t\t[attr.data-provider]=\"provider\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t@switch (provider) {\n\t\t\t\t\t\t\t\t\t@case ('google') {\n\t\t\t\t\t\t\t\t\t\t<svg class=\"mr-2 h-4 w-4\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\t\td=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 0 1-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z\"\n\t\t\t\t\t\t\t\t\t\t\t\tfill=\"#4285F4\"\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\t\td=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"\n\t\t\t\t\t\t\t\t\t\t\t\tfill=\"#34A853\"\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\t\td=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"\n\t\t\t\t\t\t\t\t\t\t\t\tfill=\"#FBBC05\"\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\t\td=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"\n\t\t\t\t\t\t\t\t\t\t\t\tfill=\"#EA4335\"\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t\t\tContinue with Google\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t@case ('github') {\n\t\t\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\t\t\tclass=\"mr-2 h-4 w-4\"\n\t\t\t\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\t\td=\"M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0 0 24 12c0-6.63-5.37-12-12-12z\"\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t\t\tContinue with GitHub\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t@default {\n\t\t\t\t\t\t\t\t\t\tContinue with {{ provider }}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t</mcms-card-content>\n\n\t\t\t<mcms-card-footer class=\"justify-center\">\n\t\t\t\t<p class=\"text-sm text-muted-foreground\">Momentum CMS</p>\n\t\t\t</mcms-card-footer>\n\t\t</mcms-card>\n\t`,\n})\nexport class LoginPage implements OnInit {\n\tprivate readonly auth = inject(MomentumAuthService);\n\tprivate readonly router = inject(Router);\n\n\t/** Whether the component has been hydrated (SSR → client transition complete) */\n\treadonly hydrated = signal(false);\n\n\tconstructor() {\n\t\tafterNextRender(() => {\n\t\t\tthis.hydrated.set(true);\n\t\t});\n\t}\n\n\t// Form state\n\treadonly email = signal('');\n\treadonly password = signal('');\n\treadonly error = signal<string | null>(null);\n\treadonly isSubmitting = signal(false);\n\treadonly touched = signal(false);\n\n\t// OAuth providers\n\treadonly oauthProviders = signal<string[]>([]);\n\n\t// Validation\n\treadonly emailErrors = computed(() => {\n\t\tif (!this.touched()) return [];\n\t\tconst value = this.email();\n\t\tif (!value) return [{ kind: 'required', message: 'Email is required' }];\n\t\tif (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value)) {\n\t\t\treturn [{ kind: 'email', message: 'Please enter a valid email' }];\n\t\t}\n\t\treturn [];\n\t});\n\n\treadonly passwordErrors = computed(() => {\n\t\tif (!this.touched()) return [];\n\t\tconst value = this.password();\n\t\tif (!value) return [{ kind: 'required', message: 'Password is required' }];\n\t\treturn [];\n\t});\n\n\treadonly isValid = computed(() => {\n\t\treturn this.email().length > 0 && this.password().length > 0;\n\t});\n\n\tasync ngOnInit(): Promise<void> {\n\t\tconst providers = await this.auth.getOAuthProviders();\n\t\tthis.oauthProviders.set(providers);\n\t}\n\n\tsignInWithOAuth(provider: string): void {\n\t\tthis.auth.signInWithOAuth(provider);\n\t}\n\n\tasync onSubmit(event: Event): Promise<void> {\n\t\tevent.preventDefault();\n\t\tthis.touched.set(true);\n\n\t\tif (!this.isValid() || this.emailErrors().length > 0 || this.passwordErrors().length > 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.isSubmitting.set(true);\n\t\tthis.error.set(null);\n\n\t\ttry {\n\t\t\tconst result = await this.auth.signIn(this.email(), this.password());\n\n\t\t\tif (result.success) {\n\t\t\t\tawait this.router.navigate(['/admin']);\n\t\t\t} else {\n\t\t\t\tthis.error.set(result.error ?? 'Failed to sign in');\n\t\t\t}\n\t\t} catch {\n\t\t\tthis.error.set('An unexpected error occurred');\n\t\t} finally {\n\t\t\tthis.isSubmitting.set(false);\n\t\t}\n\t}\n}\n","import {\n\tComponent,\n\tChangeDetectionStrategy,\n\tinject,\n\tsignal,\n\tcomputed,\n\tafterNextRender,\n} from '@angular/core';\nimport { Router } from '@angular/router';\nimport {\n\tInput,\n\tButton,\n\tMcmsFormField,\n\tCard,\n\tCardHeader,\n\tCardTitle,\n\tCardDescription,\n\tCardContent,\n\tCardFooter,\n} from '@momentumcms/ui';\nimport { MomentumAuthService } from '../../services/auth.service';\n\n/**\n * Setup Page Component\n *\n * First-time setup page for creating the initial admin user.\n * Only accessible when no users exist in the database.\n */\n@Component({\n\tselector: 'mcms-setup-page',\n\timports: [\n\t\tInput,\n\t\tButton,\n\t\tMcmsFormField,\n\t\tCard,\n\t\tCardHeader,\n\t\tCardTitle,\n\t\tCardDescription,\n\t\tCardContent,\n\t\tCardFooter,\n\t],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: {\n\t\tclass: 'flex min-h-screen items-center justify-center bg-background p-4',\n\t},\n\ttemplate: `\n\t\t<mcms-card class=\"w-full max-w-md\">\n\t\t\t<mcms-card-header class=\"text-center\">\n\t\t\t\t<mcms-card-title>Welcome to Momentum CMS</mcms-card-title>\n\t\t\t\t<mcms-card-description> Create your admin account to get started </mcms-card-description>\n\t\t\t</mcms-card-header>\n\n\t\t\t<mcms-card-content>\n\t\t\t\t<form (submit)=\"onSubmit($event)\" class=\"space-y-4\">\n\t\t\t\t\t@if (error()) {\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=\"rounded-md bg-destructive/15 p-3 text-sm text-destructive\"\n\t\t\t\t\t\t\trole=\"alert\"\n\t\t\t\t\t\t\taria-live=\"polite\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{{ error() }}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\n\t\t\t\t\t<mcms-form-field id=\"setup-name\" [required]=\"true\" [errors]=\"nameErrors()\">\n\t\t\t\t\t\t<span mcmsLabel>Full Name</span>\n\t\t\t\t\t\t<mcms-input\n\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\tid=\"setup-name\"\n\t\t\t\t\t\t\tname=\"name\"\n\t\t\t\t\t\t\t[(value)]=\"name\"\n\t\t\t\t\t\t\tplaceholder=\"Your name\"\n\t\t\t\t\t\t\tautocomplete=\"name\"\n\t\t\t\t\t\t\t[disabled]=\"!hydrated() || isSubmitting()\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</mcms-form-field>\n\n\t\t\t\t\t<mcms-form-field id=\"setup-email\" [required]=\"true\" [errors]=\"emailErrors()\">\n\t\t\t\t\t\t<span mcmsLabel>Email Address</span>\n\t\t\t\t\t\t<mcms-input\n\t\t\t\t\t\t\ttype=\"email\"\n\t\t\t\t\t\t\tid=\"setup-email\"\n\t\t\t\t\t\t\tname=\"email\"\n\t\t\t\t\t\t\t[(value)]=\"email\"\n\t\t\t\t\t\t\tplaceholder=\"admin@example.com\"\n\t\t\t\t\t\t\tautocomplete=\"email\"\n\t\t\t\t\t\t\t[disabled]=\"!hydrated() || isSubmitting()\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</mcms-form-field>\n\n\t\t\t\t\t<mcms-form-field id=\"setup-password\" [required]=\"true\" [errors]=\"passwordErrors()\">\n\t\t\t\t\t\t<span mcmsLabel>Password</span>\n\t\t\t\t\t\t<mcms-input\n\t\t\t\t\t\t\ttype=\"password\"\n\t\t\t\t\t\t\tid=\"setup-password\"\n\t\t\t\t\t\t\tname=\"password\"\n\t\t\t\t\t\t\t[(value)]=\"password\"\n\t\t\t\t\t\t\tplaceholder=\"At least 8 characters\"\n\t\t\t\t\t\t\tautocomplete=\"new-password\"\n\t\t\t\t\t\t\t[disabled]=\"!hydrated() || isSubmitting()\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</mcms-form-field>\n\n\t\t\t\t\t<mcms-form-field\n\t\t\t\t\t\tid=\"setup-confirm-password\"\n\t\t\t\t\t\t[required]=\"true\"\n\t\t\t\t\t\t[errors]=\"confirmPasswordErrors()\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<span mcmsLabel>Confirm Password</span>\n\t\t\t\t\t\t<mcms-input\n\t\t\t\t\t\t\ttype=\"password\"\n\t\t\t\t\t\t\tid=\"setup-confirm-password\"\n\t\t\t\t\t\t\tname=\"confirmPassword\"\n\t\t\t\t\t\t\t[(value)]=\"confirmPassword\"\n\t\t\t\t\t\t\tplaceholder=\"Repeat your password\"\n\t\t\t\t\t\t\tautocomplete=\"new-password\"\n\t\t\t\t\t\t\t[disabled]=\"!hydrated() || isSubmitting()\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</mcms-form-field>\n\n\t\t\t\t\t<button\n\t\t\t\t\t\tmcms-button\n\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\tclass=\"w-full\"\n\t\t\t\t\t\t[disabled]=\"!hydrated() || isSubmitting() || !isValid()\"\n\t\t\t\t\t>\n\t\t\t\t\t\t@if (isSubmitting()) {\n\t\t\t\t\t\t\t<span class=\"animate-spin\" aria-hidden=\"true\">⏳</span>\n\t\t\t\t\t\t\tCreating account...\n\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\tCreate Admin Account\n\t\t\t\t\t\t}\n\t\t\t\t\t</button>\n\t\t\t\t</form>\n\t\t\t</mcms-card-content>\n\n\t\t\t<mcms-card-footer class=\"justify-center\">\n\t\t\t\t<p class=\"text-sm text-muted-foreground\">This account will have full admin privileges</p>\n\t\t\t</mcms-card-footer>\n\t\t</mcms-card>\n\t`,\n})\nexport class SetupPage {\n\tprivate readonly auth = inject(MomentumAuthService);\n\tprivate readonly router = inject(Router);\n\n\t/** Whether the component has been hydrated (SSR → client transition complete) */\n\treadonly hydrated = signal(false);\n\n\tconstructor() {\n\t\tafterNextRender(() => {\n\t\t\tthis.hydrated.set(true);\n\t\t});\n\t}\n\n\t// Form state\n\treadonly name = signal('');\n\treadonly email = signal('');\n\treadonly password = signal('');\n\treadonly confirmPassword = signal('');\n\treadonly error = signal<string | null>(null);\n\treadonly isSubmitting = signal(false);\n\treadonly touched = signal(false);\n\n\t// Validation\n\treadonly nameErrors = computed(() => {\n\t\tif (!this.touched()) return [];\n\t\tconst value = this.name();\n\t\tif (!value.trim()) return [{ kind: 'required', message: 'Name is required' }];\n\t\treturn [];\n\t});\n\n\treadonly emailErrors = computed(() => {\n\t\tif (!this.touched()) return [];\n\t\tconst value = this.email();\n\t\tif (!value) return [{ kind: 'required', message: 'Email is required' }];\n\t\tif (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value)) {\n\t\t\treturn [{ kind: 'email', message: 'Please enter a valid email' }];\n\t\t}\n\t\treturn [];\n\t});\n\n\treadonly passwordErrors = computed(() => {\n\t\tif (!this.touched()) return [];\n\t\tconst value = this.password();\n\t\tif (!value) return [{ kind: 'required', message: 'Password is required' }];\n\t\tif (value.length < 8) {\n\t\t\treturn [{ kind: 'minLength', message: 'Password must be at least 8 characters' }];\n\t\t}\n\t\treturn [];\n\t});\n\n\treadonly confirmPasswordErrors = computed(() => {\n\t\tif (!this.touched()) return [];\n\t\tconst value = this.confirmPassword();\n\t\tif (!value) return [{ kind: 'required', message: 'Please confirm your password' }];\n\t\tif (value !== this.password()) {\n\t\t\treturn [{ kind: 'match', message: 'Passwords do not match' }];\n\t\t}\n\t\treturn [];\n\t});\n\n\treadonly isValid = computed(() => {\n\t\treturn (\n\t\t\tthis.name().trim().length > 0 &&\n\t\t\tthis.email().length > 0 &&\n\t\t\tthis.password().length >= 8 &&\n\t\t\tthis.password() === this.confirmPassword()\n\t\t);\n\t});\n\n\tasync onSubmit(event: Event): Promise<void> {\n\t\tevent.preventDefault();\n\t\tthis.touched.set(true);\n\n\t\t// Check all validation\n\t\tif (\n\t\t\t!this.isValid() ||\n\t\t\tthis.nameErrors().length > 0 ||\n\t\t\tthis.emailErrors().length > 0 ||\n\t\t\tthis.passwordErrors().length > 0 ||\n\t\t\tthis.confirmPasswordErrors().length > 0\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.isSubmitting.set(true);\n\t\tthis.error.set(null);\n\n\t\ttry {\n\t\t\tconst result = await this.auth.signUp(\n\t\t\t\tthis.name(),\n\t\t\t\tthis.email(),\n\t\t\t\tthis.password(),\n\t\t\t\ttrue, // isFirstUser - creates admin\n\t\t\t);\n\n\t\t\tif (result.success) {\n\t\t\t\t// After creating admin, sign in automatically\n\t\t\t\tconst signInResult = await this.auth.signIn(this.email(), this.password());\n\t\t\t\tif (signInResult.success) {\n\t\t\t\t\tawait this.router.navigate(['/admin']);\n\t\t\t\t} else {\n\t\t\t\t\t// If auto sign-in fails, redirect to login\n\t\t\t\t\tawait this.router.navigate(['/admin/login']);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.error.set(result.error ?? 'Failed to create admin account');\n\t\t\t}\n\t\t} catch {\n\t\t\tthis.error.set('An unexpected error occurred');\n\t\t} finally {\n\t\t\tthis.isSubmitting.set(false);\n\t\t}\n\t}\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, signal } from '@angular/core';\nimport {\n\tButton,\n\tDialog,\n\tDialogHeader,\n\tDialogTitle,\n\tDialogContent,\n\tDialogFooter,\n\tDialogClose,\n\tDialogRef,\n\tDIALOG_DATA,\n\tInput,\n\tTextarea,\n\tLabel,\n\tSpinner,\n\tAlert,\n} from '@momentumcms/ui';\nimport { injectMomentumAPI } from '../../services/momentum-api.service';\nimport { MediaPreviewComponent } from '../media-preview/media-preview.component';\n\n/** Media item shape passed to the dialog. */\nexport interface MediaEditItem {\n\tid: string;\n\tfilename: string;\n\tmimeType: string;\n\tpath: string;\n\turl?: string;\n\tfilesize?: number;\n\talt?: string;\n\twidth?: number;\n\theight?: number;\n}\n\n/** Data passed to the MediaEditDialog. */\nexport interface MediaEditDialogData {\n\tmedia: MediaEditItem;\n}\n\n/** Result returned when the dialog closes. */\nexport interface MediaEditResult {\n\tupdated: boolean;\n\tmedia?: MediaEditItem;\n}\n\n/**\n * Type guard to check if a value has the shape of a MediaEditItem.\n */\nfunction isMediaEditItem(value: unknown): value is MediaEditItem {\n\tif (typeof value !== 'object' || value === null) return false;\n\tconst obj = value as Record<string, unknown>; // eslint-disable-line @typescript-eslint/consistent-type-assertions\n\treturn (\n\t\ttypeof obj['id'] === 'string' &&\n\t\ttypeof obj['filename'] === 'string' &&\n\t\ttypeof obj['mimeType'] === 'string' &&\n\t\ttypeof obj['path'] === 'string'\n\t);\n}\n\n/**\n * Format file size in human-readable form.\n */\nfunction formatFileSize(bytes?: number): string {\n\tif (!bytes) return 'Unknown size';\n\tif (bytes >= 1024 * 1024 * 1024) {\n\t\treturn `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;\n\t}\n\tif (bytes >= 1024 * 1024) {\n\t\treturn `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n\t}\n\tif (bytes >= 1024) {\n\t\treturn `${(bytes / 1024).toFixed(1)} KB`;\n\t}\n\treturn `${bytes} bytes`;\n}\n\n/**\n * Dialog for editing media metadata (filename, alt text).\n */\n@Component({\n\tselector: 'mcms-media-edit-dialog',\n\timports: [\n\t\tButton,\n\t\tDialog,\n\t\tDialogHeader,\n\t\tDialogTitle,\n\t\tDialogContent,\n\t\tDialogFooter,\n\t\tDialogClose,\n\t\tInput,\n\t\tTextarea,\n\t\tLabel,\n\t\tSpinner,\n\t\tAlert,\n\t\tMediaPreviewComponent,\n\t],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: { style: 'display: block; width: 100%' },\n\ttemplate: `\n\t\t<mcms-dialog>\n\t\t\t<mcms-dialog-header>\n\t\t\t\t<mcms-dialog-title>Edit Media</mcms-dialog-title>\n\t\t\t</mcms-dialog-header>\n\n\t\t\t<mcms-dialog-content>\n\t\t\t\t<div class=\"flex gap-6\">\n\t\t\t\t\t<!-- Preview -->\n\t\t\t\t\t<div class=\"shrink-0\">\n\t\t\t\t\t\t<mcms-media-preview [media]=\"media\" size=\"lg\" />\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<!-- Form -->\n\t\t\t\t\t<div class=\"flex-1 space-y-4\">\n\t\t\t\t\t\t<div class=\"space-y-2\">\n\t\t\t\t\t\t\t<mcms-label for=\"media-filename\">Filename</mcms-label>\n\t\t\t\t\t\t\t<mcms-input id=\"media-filename\" [(value)]=\"filename\" placeholder=\"File name\" />\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div class=\"space-y-2\">\n\t\t\t\t\t\t\t<mcms-label for=\"media-alt\">Alt Text</mcms-label>\n\t\t\t\t\t\t\t<mcms-textarea\n\t\t\t\t\t\t\t\tid=\"media-alt\"\n\t\t\t\t\t\t\t\t[(value)]=\"altText\"\n\t\t\t\t\t\t\t\tplaceholder=\"Describe this media for accessibility\"\n\t\t\t\t\t\t\t\t[rows]=\"3\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<!-- Read-only info -->\n\t\t\t\t\t\t<div class=\"space-y-1 text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t<p>Type: {{ media.mimeType }}</p>\n\t\t\t\t\t\t\t<p>Size: {{ formattedSize }}</p>\n\t\t\t\t\t\t\t@if (media.width && media.height) {\n\t\t\t\t\t\t\t\t<p>Dimensions: {{ media.width }} x {{ media.height }}</p>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t@if (saveError()) {\n\t\t\t\t\t<mcms-alert variant=\"destructive\" class=\"mt-4\">\n\t\t\t\t\t\t{{ saveError() }}\n\t\t\t\t\t</mcms-alert>\n\t\t\t\t}\n\t\t\t</mcms-dialog-content>\n\n\t\t\t<mcms-dialog-footer>\n\t\t\t\t<button mcms-button variant=\"outline\" mcmsDialogClose type=\"button\">Cancel</button>\n\t\t\t\t<button mcms-button type=\"button\" [disabled]=\"isSaving() || !hasChanges()\" (click)=\"save()\">\n\t\t\t\t\t@if (isSaving()) {\n\t\t\t\t\t\t<mcms-spinner size=\"sm\" />\n\t\t\t\t\t}\n\t\t\t\t\tSave Changes\n\t\t\t\t</button>\n\t\t\t</mcms-dialog-footer>\n\t\t</mcms-dialog>\n\t`,\n})\nexport class MediaEditDialog {\n\tprivate readonly dialogRef = inject(DialogRef<MediaEditResult>);\n\tprivate readonly data = inject<MediaEditDialogData>(DIALOG_DATA);\n\tprivate readonly api = injectMomentumAPI();\n\n\treadonly media = this.data.media;\n\treadonly filename = signal(this.data.media.filename);\n\treadonly altText = signal(this.data.media.alt ?? '');\n\treadonly isSaving = signal(false);\n\treadonly saveError = signal<string | null>(null);\n\treadonly formattedSize = formatFileSize(this.data.media.filesize);\n\n\treadonly hasChanges = computed(() => {\n\t\treturn this.filename() !== this.media.filename || this.altText() !== (this.media.alt ?? '');\n\t});\n\n\t/**\n\t * Save media metadata changes via API.\n\t */\n\tasync save(): Promise<void> {\n\t\tthis.isSaving.set(true);\n\t\tthis.saveError.set(null);\n\n\t\ttry {\n\t\t\tconst result = await this.api.collection('media').update(this.media.id, {\n\t\t\t\tfilename: this.filename(),\n\t\t\t\talt: this.altText(),\n\t\t\t});\n\n\t\t\tif (isMediaEditItem(result)) {\n\t\t\t\tthis.dialogRef.close({ updated: true, media: result });\n\t\t\t} else {\n\t\t\t\tthis.dialogRef.close({ updated: true });\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tthis.saveError.set(err instanceof Error ? err.message : 'Failed to save changes');\n\t\t} finally {\n\t\t\tthis.isSaving.set(false);\n\t\t}\n\t}\n}\n","import {\n\tComponent,\n\tChangeDetectionStrategy,\n\tinject,\n\tsignal,\n\teffect,\n\tDestroyRef,\n} from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { type Subscription } from 'rxjs';\nimport {\n\tButton,\n\tSpinner,\n\tPagination,\n\tSearchInput,\n\tBadge,\n\tToastService,\n\tDialogService,\n} from '@momentumcms/ui';\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport {\n\theroCloudArrowUp,\n\theroTrash,\n\theroArrowDownTray,\n\theroEye,\n\theroPencilSquare,\n} from '@ng-icons/heroicons/outline';\nimport { injectMomentumAPI } from '../../services/momentum-api.service';\nimport { UploadService, type UploadProgress } from '../../services/upload.service';\nimport { FeedbackService } from '../../widgets/feedback/feedback.service';\nimport { MediaPreviewComponent } from '../../widgets/media-preview/media-preview.component';\nimport {\n\tMediaEditDialog,\n\ttype MediaEditResult,\n} from '../../widgets/media-edit/media-edit-dialog.component';\n\n/** Helper type to represent media document from API */\ninterface MediaItem {\n\tid: string;\n\tfilename: string;\n\tmimeType: string;\n\tpath: string;\n\turl?: string;\n\tfilesize?: number;\n\talt?: string;\n\twidth?: number;\n\theight?: number;\n}\n\n/**\n * Type guard to check if value is MediaItem.\n * Note: Type assertion is required for type guard functions.\n */\nfunction isMediaItem(value: unknown): value is MediaItem {\n\tif (typeof value !== 'object' || value === null) return false;\n\t// Type guard requires accessing unknown object - eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\tconst obj = value as Record<string, unknown>; // eslint-disable-line @typescript-eslint/consistent-type-assertions\n\treturn (\n\t\ttypeof obj['id'] === 'string' &&\n\t\ttypeof obj['filename'] === 'string' &&\n\t\ttypeof obj['mimeType'] === 'string' &&\n\t\ttypeof obj['path'] === 'string'\n\t);\n}\n\n/**\n * Convert API docs to MediaItem array.\n */\nfunction toMediaItems(docs: unknown): MediaItem[] {\n\tif (!Array.isArray(docs)) return [];\n\treturn docs.filter(isMediaItem);\n}\n\n/**\n * Get HTMLInputElement from event safely.\n */\nfunction getInputElement(event: Event): HTMLInputElement | null {\n\tconst target = event.target;\n\tif (target instanceof HTMLInputElement) {\n\t\treturn target;\n\t}\n\treturn null;\n}\n\n/**\n * Media Library Page\n *\n * Full-page view for managing media files: browse, upload, and delete.\n */\n@Component({\n\tselector: 'mcms-media-library',\n\timports: [Button, Spinner, Pagination, SearchInput, Badge, NgIcon, MediaPreviewComponent],\n\tproviders: [\n\t\tprovideIcons({ heroCloudArrowUp, heroTrash, heroArrowDownTray, heroEye, heroPencilSquare }),\n\t],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: { class: 'block' },\n\ttemplate: `\n\t\t<div class=\"space-y-6\">\n\t\t\t<!-- Header -->\n\t\t\t<div class=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n\t\t\t\t<div>\n\t\t\t\t\t<h1 class=\"text-2xl font-bold tracking-tight\">Media Library</h1>\n\t\t\t\t\t<p class=\"text-sm text-mcms-muted-foreground\">\n\t\t\t\t\t\t{{ totalDocs() }} file{{ totalDocs() === 1 ? '' : 's' }}\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"flex gap-2\">\n\t\t\t\t\t<label class=\"cursor-pointer\">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\ttype=\"file\"\n\t\t\t\t\t\t\tclass=\"sr-only\"\n\t\t\t\t\t\t\tmultiple\n\t\t\t\t\t\t\t(change)=\"onFilesSelected($event)\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tmcms-button\n\t\t\t\t\t\t\tclass=\"inline-flex\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<ng-icon name=\"heroCloudArrowUp\" class=\"h-4 w-4\" />\n\t\t\t\t\t\t\tUpload Files\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</label>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<!-- Search and filters -->\n\t\t\t<div class=\"flex flex-col gap-4 sm:flex-row sm:items-center\">\n\t\t\t\t<mcms-search-input\n\t\t\t\t\tplaceholder=\"Search media...\"\n\t\t\t\t\t[value]=\"searchQuery()\"\n\t\t\t\t\t(valueChange)=\"onSearchChange($event)\"\n\t\t\t\t\tclass=\"flex-1\"\n\t\t\t\t\taria-label=\"Search media files\"\n\t\t\t\t/>\n\t\t\t\t@if (selectedItems().size > 0) {\n\t\t\t\t\t<div class=\"flex items-center gap-2\">\n\t\t\t\t\t\t<mcms-badge variant=\"secondary\">\n\t\t\t\t\t\t\t{{ selectedItems().size }} selected\n\t\t\t\t\t\t</mcms-badge>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tmcms-button\n\t\t\t\t\t\t\tvariant=\"destructive\"\n\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t(click)=\"deleteSelected()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<ng-icon name=\"heroTrash\" class=\"h-4 w-4\" />\n\t\t\t\t\t\t\tDelete\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t</div>\n\n\t\t\t<!-- Upload progress -->\n\t\t\t@if (activeUploads().length > 0) {\n\t\t\t\t<div class=\"rounded-lg border border-mcms-border bg-mcms-muted/50 p-4\">\n\t\t\t\t\t<h3 class=\"mb-2 font-medium\">Uploading files...</h3>\n\t\t\t\t\t<div class=\"space-y-2\">\n\t\t\t\t\t\t@for (upload of activeUploads(); track upload.file.name) {\n\t\t\t\t\t\t\t<div class=\"flex items-center gap-3\">\n\t\t\t\t\t\t\t\t<mcms-media-preview\n\t\t\t\t\t\t\t\t\t[media]=\"{ mimeType: upload.file.type, filename: upload.file.name }\"\n\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<div class=\"min-w-0 flex-1\">\n\t\t\t\t\t\t\t\t\t<p class=\"truncate text-sm\">{{ upload.file.name }}</p>\n\t\t\t\t\t\t\t\t\t<div class=\"mt-1 h-2 overflow-hidden rounded-full bg-mcms-muted\" role=\"progressbar\" [attr.aria-valuenow]=\"upload.progress\" aria-valuemin=\"0\" aria-valuemax=\"100\" [attr.aria-label]=\"'Uploading ' + upload.file.name\">\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tclass=\"h-full bg-mcms-primary transition-all\"\n\t\t\t\t\t\t\t\t\t\t\t[style.width.%]=\"upload.progress\"\n\t\t\t\t\t\t\t\t\t\t></div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<span class=\"text-xs text-mcms-muted-foreground\">\n\t\t\t\t\t\t\t\t\t{{ upload.progress }}%\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t}\n\n\t\t\t<!-- Content -->\n\t\t\t@if (isLoading()) {\n\t\t\t\t<div class=\"flex h-64 items-center justify-center\">\n\t\t\t\t\t<mcms-spinner size=\"lg\" />\n\t\t\t\t</div>\n\t\t\t} @else if (mediaItems().length === 0) {\n\t\t\t\t<div class=\"flex h-64 flex-col items-center justify-center text-mcms-muted-foreground\">\n\t\t\t\t\t<ng-icon name=\"heroCloudArrowUp\" class=\"mb-4 h-16 w-16 opacity-50\" aria-hidden=\"true\" />\n\t\t\t\t\t@if (searchQuery()) {\n\t\t\t\t\t\t<p class=\"text-lg\">No media found</p>\n\t\t\t\t\t\t<p class=\"text-sm\">Try a different search term</p>\n\t\t\t\t\t} @else {\n\t\t\t\t\t\t<p class=\"text-lg\">No media uploaded yet</p>\n\t\t\t\t\t\t<p class=\"text-sm\">Upload files to get started</p>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t} @else {\n\t\t\t\t<!-- Media grid -->\n\t\t\t\t<div class=\"grid grid-cols-2 gap-4 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 xl:grid-cols-6\">\n\t\t\t\t\t@for (media of mediaItems(); track media.id) {\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=\"group relative overflow-hidden rounded-lg border transition-all\"\n\t\t\t\t\t\t\t[class.border-mcms-border]=\"!selectedItems().has(media.id)\"\n\t\t\t\t\t\t\t[class.border-mcms-primary]=\"selectedItems().has(media.id)\"\n\t\t\t\t\t\t\t[class.ring-2]=\"selectedItems().has(media.id)\"\n\t\t\t\t\t\t\t[class.ring-mcms-primary/50]=\"selectedItems().has(media.id)\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<!-- Selection checkbox -->\n\t\t\t\t\t\t\t<div class=\"absolute left-2 top-2 z-10\">\n\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\t\t\tclass=\"h-4 w-4 cursor-pointer rounded border-mcms-border\"\n\t\t\t\t\t\t\t\t\t[checked]=\"selectedItems().has(media.id)\"\n\t\t\t\t\t\t\t\t\t(change)=\"toggleSelection(media)\"\n\t\t\t\t\t\t\t\t\t[attr.aria-label]=\"'Select ' + media.filename\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<!-- Preview -->\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclass=\"block aspect-square w-full\"\n\t\t\t\t\t\t\t\t(click)=\"viewMedia(media)\"\n\t\t\t\t\t\t\t\t[attr.aria-label]=\"'View ' + media.filename\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<mcms-media-preview\n\t\t\t\t\t\t\t\t\t[media]=\"media\"\n\t\t\t\t\t\t\t\t\tsize=\"xl\"\n\t\t\t\t\t\t\t\t\t[rounded]=\"false\"\n\t\t\t\t\t\t\t\t\tclass=\"h-full w-full\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t\t<!-- Hover overlay -->\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclass=\"absolute inset-x-0 bottom-0 bg-gradient-to-t from-black/80 via-black/50 to-transparent p-3 opacity-0 transition-opacity group-hover:opacity-100\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<p class=\"truncate text-sm font-medium text-white\">\n\t\t\t\t\t\t\t\t\t{{ media.filename }}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t<p class=\"text-xs text-white/70\">\n\t\t\t\t\t\t\t\t\t{{ formatFileSize(media.filesize) }}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t<div class=\"mt-2 flex gap-1\">\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\tmcms-button\n\t\t\t\t\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t(click)=\"$event.stopPropagation(); editMedia(media)\"\n\t\t\t\t\t\t\t\t\t\taria-label=\"Edit file details\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<ng-icon name=\"heroPencilSquare\" class=\"h-3 w-3\" aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\tmcms-button\n\t\t\t\t\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t(click)=\"$event.stopPropagation(); viewMedia(media)\"\n\t\t\t\t\t\t\t\t\t\taria-label=\"View file\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<ng-icon name=\"heroEye\" class=\"h-3 w-3\" aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\t\tmcms-button\n\t\t\t\t\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t[href]=\"getMediaUrl(media)\"\n\t\t\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t\t\tdownload\n\t\t\t\t\t\t\t\t\t\t(click)=\"$event.stopPropagation()\"\n\t\t\t\t\t\t\t\t\t\taria-label=\"Download file\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<ng-icon name=\"heroArrowDownTray\" class=\"h-3 w-3\" aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\tmcms-button\n\t\t\t\t\t\t\t\t\t\tvariant=\"destructive\"\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t(click)=\"$event.stopPropagation(); deleteMedia(media)\"\n\t\t\t\t\t\t\t\t\t\taria-label=\"Delete file\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<ng-icon name=\"heroTrash\" class=\"h-3 w-3\" aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\n\t\t\t\t<!-- Pagination -->\n\t\t\t\t@if (totalPages() > 1) {\n\t\t\t\t\t<div class=\"flex justify-center pt-4\">\n\t\t\t\t\t\t<mcms-pagination\n\t\t\t\t\t\t\t[currentPage]=\"currentPage()\"\n\t\t\t\t\t\t\t[totalPages]=\"totalPages()\"\n\t\t\t\t\t\t\t(pageChange)=\"onPageChange($event)\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t}\n\t\t</div>\n\t`,\n})\nexport class MediaLibraryPage {\n\tprivate readonly document = inject(DOCUMENT);\n\tprivate readonly api = injectMomentumAPI();\n\tprivate readonly uploadService = inject(UploadService);\n\tprivate readonly feedback = inject(FeedbackService);\n\tprivate readonly toast = inject(ToastService);\n\tprivate readonly dialog = inject(DialogService);\n\tprivate readonly destroyRef = inject(DestroyRef);\n\tprivate readonly uploadSubscriptions: Subscription[] = [];\n\n\t/** Internal state */\n\treadonly isLoading = signal(true);\n\treadonly mediaItems = signal<MediaItem[]>([]);\n\treadonly searchQuery = signal('');\n\treadonly currentPage = signal(1);\n\treadonly totalPages = signal(1);\n\treadonly totalDocs = signal(0);\n\treadonly limit = signal(24);\n\treadonly selectedItems = signal<Set<string>>(new Set());\n\treadonly activeUploads = signal<UploadProgress[]>([]);\n\n\tconstructor() {\n\t\t// Load media on init and when search/page changes\n\t\teffect(() => {\n\t\t\tconst query = this.searchQuery();\n\t\t\tconst page = this.currentPage();\n\t\t\tthis.loadMedia(query, page);\n\t\t});\n\n\t\t// Clean up upload subscriptions on destroy\n\t\tthis.destroyRef.onDestroy(() => {\n\t\t\tfor (const sub of this.uploadSubscriptions) {\n\t\t\t\tsub.unsubscribe();\n\t\t\t}\n\t\t\tthis.uploadSubscriptions.length = 0;\n\t\t});\n\t}\n\n\t/**\n\t * Load media from the API.\n\t */\n\tprivate async loadMedia(search: string, page: number): Promise<void> {\n\t\tthis.isLoading.set(true);\n\n\t\ttry {\n\t\t\tconst collection = this.api.collection('media');\n\t\t\tconst whereClause: Record<string, unknown> = {};\n\n\t\t\tif (search) {\n\t\t\t\twhereClause['filename'] = { contains: search };\n\t\t\t}\n\n\t\t\tconst result = await collection.find({\n\t\t\t\twhere: Object.keys(whereClause).length > 0 ? whereClause : undefined,\n\t\t\t\tpage,\n\t\t\t\tlimit: this.limit(),\n\t\t\t\tsort: '-createdAt',\n\t\t\t});\n\n\t\t\tthis.mediaItems.set(toMediaItems(result.docs));\n\t\t\tthis.totalDocs.set(result.totalDocs);\n\t\t\tthis.totalPages.set(result.totalPages);\n\t\t} catch (error) {\n\t\t\tconsole.error('Failed to load media:', error);\n\t\t\tthis.feedback.operationFailed('Failed to load media');\n\t\t\tthis.mediaItems.set([]);\n\t\t} finally {\n\t\t\tthis.isLoading.set(false);\n\t\t}\n\t}\n\n\t/**\n\t * Handle search query change.\n\t */\n\tonSearchChange(query: string): void {\n\t\tthis.searchQuery.set(query);\n\t\tthis.currentPage.set(1);\n\t}\n\n\t/**\n\t * Handle page change.\n\t */\n\tonPageChange(page: number): void {\n\t\tthis.currentPage.set(page);\n\t}\n\n\t/**\n\t * Handle file selection from input.\n\t */\n\tonFilesSelected(event: Event): void {\n\t\tconst input = getInputElement(event);\n\t\tif (!input) return;\n\t\tconst files = input.files;\n\t\tif (!files || files.length === 0) return;\n\n\t\tconst uploads: UploadProgress[] = [];\n\n\t\tfor (let i = 0; i < files.length; i++) {\n\t\t\tconst file = files[i];\n\t\t\tuploads.push({\n\t\t\t\tstatus: 'pending',\n\t\t\t\tprogress: 0,\n\t\t\t\tfile,\n\t\t\t});\n\t\t}\n\n\t\tthis.activeUploads.set(uploads);\n\n\t\t// Upload each file\n\t\tfor (const file of Array.from(files)) {\n\t\t\tconst sub = this.uploadService.upload(file).subscribe({\n\t\t\t\tnext: (progress) => {\n\t\t\t\t\tthis.updateUploadProgress(file, progress);\n\n\t\t\t\t\tif (progress.status === 'complete') {\n\t\t\t\t\t\tthis.removeUpload(file);\n\t\t\t\t\t\t// Reload media list\n\t\t\t\t\t\tthis.loadMedia(this.searchQuery(), this.currentPage());\n\t\t\t\t\t} else if (progress.status === 'error') {\n\t\t\t\t\t\tthis.removeUpload(file);\n\t\t\t\t\t\tthis.toast.error(`Upload failed`, `Failed to upload ${file.name}: ${progress.error}`);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\terror: (err: Error) => {\n\t\t\t\t\tthis.removeUpload(file);\n\t\t\t\t\tthis.toast.error(`Upload failed`, `Failed to upload ${file.name}: ${err.message}`);\n\t\t\t\t},\n\t\t\t});\n\t\t\tthis.uploadSubscriptions.push(sub);\n\t\t}\n\n\t\t// Reset input\n\t\tinput.value = '';\n\t}\n\n\t/**\n\t * Update upload progress in the active uploads list.\n\t */\n\tprivate updateUploadProgress(file: File, progress: UploadProgress): void {\n\t\tconst uploads = this.activeUploads().map((u) => (u.file === file ? progress : u));\n\t\tthis.activeUploads.set(uploads);\n\t}\n\n\t/**\n\t * Remove upload from active uploads list.\n\t */\n\tprivate removeUpload(file: File): void {\n\t\tconst uploads = this.activeUploads().filter((u) => u.file !== file);\n\t\tthis.activeUploads.set(uploads);\n\t}\n\n\t/**\n\t * Toggle selection of a media item.\n\t */\n\ttoggleSelection(media: MediaItem): void {\n\t\tconst selected = new Set(this.selectedItems());\n\t\tif (selected.has(media.id)) {\n\t\t\tselected.delete(media.id);\n\t\t} else {\n\t\t\tselected.add(media.id);\n\t\t}\n\t\tthis.selectedItems.set(selected);\n\t}\n\n\t/**\n\t * View media file in a new tab.\n\t */\n\tviewMedia(media: MediaItem): void {\n\t\tthis.document.defaultView?.open(this.getMediaUrl(media), '_blank');\n\t}\n\n\t/**\n\t * Open the edit dialog for a media item.\n\t */\n\teditMedia(media: MediaItem): void {\n\t\tconst dialogRef = this.dialog.open<MediaEditDialog, { media: MediaItem }, MediaEditResult>(\n\t\t\tMediaEditDialog,\n\t\t\t{\n\t\t\t\tdata: { media },\n\t\t\t\twidth: '36rem',\n\t\t\t},\n\t\t);\n\n\t\tdialogRef.afterClosed.subscribe((result) => {\n\t\t\tif (result?.updated) {\n\t\t\t\tthis.loadMedia(this.searchQuery(), this.currentPage());\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Delete a single media item.\n\t */\n\tasync deleteMedia(media: MediaItem): Promise<void> {\n\t\tconst confirmed = await this.feedback.confirmDelete('Media', media.filename);\n\n\t\tif (!confirmed) return;\n\n\t\ttry {\n\t\t\tconst collection = this.api.collection('media');\n\t\t\tawait collection.delete(media.id);\n\t\t\tthis.loadMedia(this.searchQuery(), this.currentPage());\n\t\t} catch (error) {\n\t\t\tconsole.error('Failed to delete media:', error);\n\t\t\t// Error handled by crudToastInterceptor\n\t\t}\n\t}\n\n\t/**\n\t * Delete all selected media items.\n\t */\n\tasync deleteSelected(): Promise<void> {\n\t\tconst count = this.selectedItems().size;\n\t\tconst confirmed = await this.feedback.confirmBulkDelete('Files', count);\n\n\t\tif (!confirmed) return;\n\n\t\ttry {\n\t\t\tconst collection = this.api.collection('media');\n\t\t\tconst ids = Array.from(this.selectedItems());\n\n\t\t\t// Use batchDelete for a single request with a single summary toast\n\t\t\tawait collection.batchDelete(ids);\n\n\t\t\tthis.selectedItems.set(new Set());\n\t\t\tthis.loadMedia(this.searchQuery(), this.currentPage());\n\t\t} catch (error) {\n\t\t\tconsole.error('Failed to delete media:', error);\n\t\t\t// Error handled by crudToastInterceptor\n\t\t}\n\t}\n\n\t/**\n\t * Get the URL for a media document.\n\t */\n\tgetMediaUrl(media: MediaItem): string {\n\t\treturn media.url ?? `/api/media/file/${media.path}`;\n\t}\n\n\t/**\n\t * Format file size for display.\n\t */\n\tformatFileSize(bytes?: number): string {\n\t\tif (!bytes) return 'Unknown size';\n\n\t\tif (bytes >= 1024 * 1024 * 1024) {\n\t\t\treturn `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;\n\t\t}\n\t\tif (bytes >= 1024 * 1024) {\n\t\t\treturn `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n\t\t}\n\t\tif (bytes >= 1024) {\n\t\t\treturn `${(bytes / 1024).toFixed(1)} KB`;\n\t\t}\n\t\treturn `${bytes} bytes`;\n\t}\n}\n","import { Component, ChangeDetectionStrategy, inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport {\n\tCard,\n\tCardHeader,\n\tCardTitle,\n\tCardDescription,\n\tCardContent,\n\tCardFooter,\n} from '@momentumcms/ui';\nimport { ForgotPasswordFormComponent } from '../../components/forgot-password-form/forgot-password-form.component';\n\n/**\n * Forgot Password Page\n *\n * Full-page wrapper for the forgot password form.\n * Uses a centered card layout matching the login page.\n */\n@Component({\n\tselector: 'mcms-forgot-password-page',\n\timports: [\n\t\tCard,\n\t\tCardHeader,\n\t\tCardTitle,\n\t\tCardDescription,\n\t\tCardContent,\n\t\tCardFooter,\n\t\tForgotPasswordFormComponent,\n\t],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: {\n\t\tclass: 'flex min-h-screen items-center justify-center bg-background p-4',\n\t},\n\ttemplate: `\n\t\t<mcms-card class=\"w-full max-w-md\">\n\t\t\t<mcms-card-header class=\"text-center\">\n\t\t\t\t<mcms-card-title>Reset Password</mcms-card-title>\n\t\t\t\t<mcms-card-description>\n\t\t\t\t\tWe'll send you a link to reset your password\n\t\t\t\t</mcms-card-description>\n\t\t\t</mcms-card-header>\n\n\t\t\t<mcms-card-content>\n\t\t\t\t<mcms-forgot-password-form (backToLogin)=\"navigateToLogin()\" />\n\t\t\t</mcms-card-content>\n\n\t\t\t<mcms-card-footer class=\"justify-center\">\n\t\t\t\t<p class=\"text-sm text-muted-foreground\">Momentum CMS</p>\n\t\t\t</mcms-card-footer>\n\t\t</mcms-card>\n\t`,\n})\nexport class ForgotPasswordPage {\n\tprivate readonly router = inject(Router);\n\n\tnavigateToLogin(): void {\n\t\tvoid this.router.navigate(['/admin/login']);\n\t}\n}\n","import { Component, ChangeDetectionStrategy, inject, OnInit, signal } from '@angular/core';\nimport { Router, ActivatedRoute } from '@angular/router';\nimport {\n\tCard,\n\tCardHeader,\n\tCardTitle,\n\tCardDescription,\n\tCardContent,\n\tCardFooter,\n} from '@momentumcms/ui';\nimport { ResetPasswordFormComponent } from '../../components/reset-password-form/reset-password-form.component';\n\n/**\n * Reset Password Page\n *\n * Full-page wrapper for the reset password form.\n * Reads the token from query parameters and passes it to the form.\n */\n@Component({\n\tselector: 'mcms-reset-password-page',\n\timports: [\n\t\tCard,\n\t\tCardHeader,\n\t\tCardTitle,\n\t\tCardDescription,\n\t\tCardContent,\n\t\tCardFooter,\n\t\tResetPasswordFormComponent,\n\t],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: {\n\t\tclass: 'flex min-h-screen items-center justify-center bg-background p-4',\n\t},\n\ttemplate: `\n\t\t<mcms-card class=\"w-full max-w-md\">\n\t\t\t<mcms-card-header class=\"text-center\">\n\t\t\t\t<mcms-card-title>Set New Password</mcms-card-title>\n\t\t\t\t<mcms-card-description> Enter your new password below </mcms-card-description>\n\t\t\t</mcms-card-header>\n\n\t\t\t<mcms-card-content>\n\t\t\t\t<mcms-reset-password-form\n\t\t\t\t\t[token]=\"token()\"\n\t\t\t\t\t(goToLogin)=\"navigateToLogin()\"\n\t\t\t\t\t(goToForgotPassword)=\"navigateToForgotPassword()\"\n\t\t\t\t/>\n\t\t\t</mcms-card-content>\n\n\t\t\t<mcms-card-footer class=\"justify-center\">\n\t\t\t\t<p class=\"text-sm text-muted-foreground\">Momentum CMS</p>\n\t\t\t</mcms-card-footer>\n\t\t</mcms-card>\n\t`,\n})\nexport class ResetPasswordPage implements OnInit {\n\tprivate readonly router = inject(Router);\n\tprivate readonly route = inject(ActivatedRoute);\n\n\treadonly token = signal('');\n\n\tngOnInit(): void {\n\t\t// Get token from query params\n\t\tconst tokenParam = this.route.snapshot.queryParamMap.get('token');\n\t\tif (tokenParam) {\n\t\t\tthis.token.set(tokenParam);\n\t\t}\n\t}\n\n\tnavigateToLogin(): void {\n\t\tvoid this.router.navigate(['/admin/login']);\n\t}\n\n\tnavigateToForgotPassword(): void {\n\t\tvoid this.router.navigate(['/admin/forgot-password']);\n\t}\n}\n","// Routes\nexport * from './lib/routes';\n\n// Interceptors\nexport { crudToastInterceptor, SKIP_AUTO_TOAST } from './lib/interceptors/crud-toast.interceptor';\n\n// Services\nexport { MomentumApiService } from './lib/services/api.service';\nexport {\n\tMomentumAuthService,\n\ttype AuthUser,\n\ttype AuthSession,\n\ttype AuthResult,\n\ttype SetupStatus,\n} from './lib/services/auth.service';\nexport {\n\tCollectionAccessService,\n\ttype CollectionPermissions,\n} from './lib/services/collection-access.service';\nexport { UploadService, type UploadProgress } from './lib/services/upload.service';\n// Momentum API (unified SSR/Browser)\nexport {\n\tinjectMomentumAPI,\n\tprovideMomentumAPI,\n\tMOMENTUM_API,\n\tMOMENTUM_API_CONTEXT,\n\ttype MomentumClientAPI,\n\ttype MomentumCollectionAPI,\n\ttype MomentumAPIServer,\n\ttype MomentumAPIContext,\n\ttype FindOptions,\n\ttype FindByIdOptions,\n\ttype FindResult,\n\ttype DeleteResult,\n\ttype UserContext,\n\t// Type-safe API\n\tinjectTypedMomentumAPI,\n\ttype TypedMomentumClientAPI,\n\ttype TypedCollectionAPI,\n\ttype TypedFindOptions,\n\ttype TypedFindByIdOptions,\n} from './lib/services/momentum-api.service';\n\n// Entity Sheet Service\nexport {\n\tEntitySheetService,\n\tSHEET_QUERY_PARAMS,\n\ttype EntitySheetResult,\n} from './lib/services/entity-sheet.service';\n\n// Version Service\nexport {\n\tVersionService,\n\tinjectVersionService,\n\ttype DocumentStatus,\n\ttype VersionFindOptions,\n\ttype DocumentVersionParsed,\n\ttype VersionQueryResult,\n\ttype RestoreVersionOptions,\n\ttype RestoreResult,\n\ttype PublishResult,\n\ttype DraftSaveResult,\n\ttype StatusResult,\n} from './lib/services/version.service';\n\n// Guards\nexport * from './lib/guards';\n\n// UI Components and Services\nexport * from './lib/ui/theme';\n\n// User Injection Utilities\nexport {\n\tinjectUser,\n\tinjectUserRole,\n\tinjectIsAuthenticated,\n\tinjectIsAdmin,\n\tinjectHasRole,\n\tinjectHasAnyRole,\n\ttype BaseUser,\n} from './lib/utils/inject-user';\n\n// Components (for direct usage in Analog apps)\nexport { AdminShellComponent } from './lib/components/shell/admin-shell.component';\nexport { ForgotPasswordFormComponent } from './lib/components/forgot-password-form/forgot-password-form.component';\nexport { ResetPasswordFormComponent } from './lib/components/reset-password-form/reset-password-form.component';\n\n// Pages\nexport { DashboardPage } from './lib/pages/dashboard/dashboard.page';\nexport { CollectionListPage } from './lib/pages/collection-list/collection-list.page';\nexport { CollectionViewPage } from './lib/pages/collection-view/collection-view.page';\nexport { CollectionEditPage } from './lib/pages/collection-edit/collection-edit.page';\nexport { LoginPage } from './lib/pages/login/login.page';\nexport { SetupPage } from './lib/pages/setup/setup.page';\nexport { MediaLibraryPage } from './lib/pages/media-library/media-library.page';\nexport { ForgotPasswordPage } from './lib/pages/forgot-password/forgot-password.page';\nexport { ResetPasswordPage } from './lib/pages/reset-password/reset-password.page';\n\n// Widgets\nexport { AdminSidebarWidget } from './lib/widgets/admin-sidebar/admin-sidebar.component';\nexport { CollectionCardWidget } from './lib/widgets/collection-card/collection-card.component';\nexport { EntityListWidget } from './lib/widgets/entity-list/entity-list.component';\nexport { EntityFormWidget } from './lib/widgets/entity-form/entity-form.component';\nexport { EntityViewWidget } from './lib/widgets/entity-view/entity-view.component';\nexport { FeedbackService } from './lib/widgets/feedback/feedback.service';\nexport { VersionHistoryWidget } from './lib/widgets/version-history/version-history.component';\nexport { PublishControlsWidget } from './lib/widgets/publish-controls/publish-controls.component';\nexport {\n\tMediaPreviewComponent,\n\ttype MediaPreviewData,\n} from './lib/widgets/media-preview/media-preview.component';\nexport {\n\tLivePreviewComponent,\n\ttype DeviceSize,\n} from './lib/widgets/live-preview/live-preview.component';\n\n// Visual Block Editor\nexport { VisualBlockEditorComponent } from './lib/widgets/visual-block-editor/visual-block-editor.component';\nexport { BlockWrapperComponent } from './lib/widgets/visual-block-editor/block-wrapper.component';\nexport { BlockInserterComponent } from './lib/widgets/visual-block-editor/block-inserter.component';\nexport type {\n\tBlockItem,\n\tVisualEditorState,\n} from './lib/widgets/visual-block-editor/visual-editor.types';\nexport {\n\tBlockEditDialog,\n\ttype BlockEditDialogData,\n} from './lib/widgets/visual-block-editor/block-edit-dialog.component';\n\n// Field Renderers (for custom forms)\nexport { FieldRenderer } from './lib/widgets/entity-form/field-renderers/field-renderer.component';\nexport { TextFieldRenderer } from './lib/widgets/entity-form/field-renderers/text-field.component';\nexport { NumberFieldRenderer } from './lib/widgets/entity-form/field-renderers/number-field.component';\nexport { SelectFieldRenderer } from './lib/widgets/entity-form/field-renderers/select-field.component';\nexport { CheckboxFieldRenderer } from './lib/widgets/entity-form/field-renderers/checkbox-field.component';\nexport { DateFieldRenderer } from './lib/widgets/entity-form/field-renderers/date-field.component';\nexport { UploadFieldRenderer } from './lib/widgets/entity-form/field-renderers/upload-field.component';\nexport {\n\tMediaPickerDialog,\n\ttype MediaPickerDialogData,\n\ttype MediaPickerResult,\n} from './lib/widgets/entity-form/field-renderers/media-picker-dialog.component';\n\n// Widget Types\nexport type {\n\tAdminBranding,\n\tAdminNavItem,\n\tAdminNavSection,\n\tAdminUser,\n\tCollectionWithCount,\n\tEntityAction,\n\tEntity,\n} from './lib/widgets/widget.types';\n\nexport type {\n\tEntityListColumn,\n\tEntityListActionEvent,\n\tEntityListBulkActionEvent,\n\tEntityListFindResult,\n} from './lib/widgets/entity-list/entity-list.types';\n\nexport type { EntityFormMode, FieldNodeState } from './lib/widgets/entity-form/entity-form.types';\n\nexport {\n\tgetFieldNodeState,\n\tgetSubNode,\n\tgetTitleField,\n} from './lib/widgets/entity-form/entity-form.types';\n\nexport type {\n\tEntityViewFieldConfig,\n\tBreadcrumbItem,\n\tEntityViewActionEvent,\n} from './lib/widgets/entity-view/entity-view.types';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["isMediaItem","toMediaItems"],"mappings":"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"}
|