@kustomizer/visual-editor 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kustomizer-visual-editor.mjs","sources":["../../../projects/visual-editor/src/lib/navigation/visual-editor-navigation.types.ts","../../../projects/visual-editor/src/lib/navigation/default-router-navigation.service.ts","../../../projects/visual-editor/src/lib/services/page-memory.repository.ts","../../../projects/visual-editor/src/lib/services/supabase-auth.service.ts","../../../projects/visual-editor/src/lib/services/shop-auth.service.ts","../../../projects/visual-editor/src/lib/services/shopify-token.service.ts","../../../projects/visual-editor/src/lib/services/shopify-graphql-client.service.ts","../../../projects/visual-editor/src/lib/services/shopify-metafield-repository.service.ts","../../../projects/visual-editor/src/lib/services/page-shopify-repository.service.ts","../../../projects/visual-editor/src/lib/services/page.service.ts","../../../projects/visual-editor/src/lib/page-loading/page-loading-strategy.types.ts","../../../projects/visual-editor/src/lib/config/visual-editor-config.types.ts","../../../projects/visual-editor/src/lib/provide-visual-editor.ts","../../../projects/visual-editor/src/lib/store/visual-editor.state.ts","../../../projects/visual-editor/src/lib/store/visual-editor.actions.ts","../../../projects/visual-editor/src/lib/store/visual-editor.reducer.ts","../../../projects/visual-editor/src/lib/store/visual-editor.selectors.ts","../../../projects/visual-editor/src/lib/store/provide-visual-editor-store.ts","../../../projects/visual-editor/src/lib/registry/provide-editor-components.ts","../../../projects/visual-editor/src/lib/registry/component-registry.service.ts","../../../projects/visual-editor/src/lib/components/dynamic-renderer.component.ts","../../../projects/visual-editor/src/lib/components/slot-renderer.component.ts","../../../projects/visual-editor/src/lib/services/visual-editor-facade.service.ts","../../../projects/visual-editor/src/lib/dnd/drag-drop.service.ts","../../../projects/visual-editor/src/lib/components/editor/block-tree-item.component.ts","../../../projects/visual-editor/src/lib/services/shopify-files.service.ts","../../../projects/visual-editor/src/lib/components/editor/shopify-file-picker.component.ts","../../../projects/visual-editor/src/lib/components/editor/visual-editor.component.ts","../../../projects/visual-editor/src/lib/components/page-manager/page-manager.component.ts","../../../projects/visual-editor/src/lib/components/license-guard/license-guard.component.ts","../../../projects/visual-editor/src/lib/components/auth/login.component.ts","../../../projects/visual-editor/src/lib/components/auth/activate-license.component.ts","../../../projects/visual-editor/src/lib/components/app-shell/app-shell.component.ts","../../../projects/visual-editor/src/lib/components/no-access/no-access.component.ts","../../../projects/visual-editor/src/lib/components/license-expired/license-expired.component.ts","../../../projects/visual-editor/src/lib/services/shop-team.service.ts","../../../projects/visual-editor/src/lib/models/page.model.ts","../../../projects/visual-editor/src/lib/guards/auth.guard.ts","../../../projects/visual-editor/src/lib/guards/license.guard.ts","../../../projects/visual-editor/src/lib/guards/shop-auth.guard.ts","../../../projects/visual-editor/src/lib/visual-editor.ts","../../../projects/visual-editor/src/public-api.ts","../../../projects/visual-editor/src/kustomizer-visual-editor.ts"],"sourcesContent":["import { Observable } from 'rxjs';\n\n/**\n * Navigation target for the visual editor\n */\nexport type VisualEditorNavigationTarget =\n | { type: 'page-list' }\n | { type: 'page-edit'; pageId: string }\n | { type: 'page-preview'; pageId: string };\n\n/**\n * Confirmation dialog options\n */\nexport interface ConfirmDialogOptions {\n title: string;\n message: string;\n confirmText?: string;\n cancelText?: string;\n}\n\n/**\n * Abstract navigation service that consumers can implement\n * to customize how the visual editor navigates between views\n */\nexport abstract class VisualEditorNavigation {\n /**\n * Navigate to a target within the editor context\n */\n abstract navigate(target: VisualEditorNavigationTarget): void;\n\n /**\n * Show a confirmation dialog\n * Returns Observable<boolean> to support async dialogs (e.g., Material Dialog)\n */\n abstract confirm(options: ConfirmDialogOptions): Observable<boolean>;\n\n /**\n * Get the current page ID from the navigation context\n * Returns null if not on a page edit route\n */\n abstract getCurrentPageId(): Observable<string | null>;\n}\n","import { inject, Injectable, InjectionToken } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { map, Observable, of, startWith } from 'rxjs';\nimport {\n ConfirmDialogOptions,\n VisualEditorNavigation,\n VisualEditorNavigationTarget,\n} from './visual-editor-navigation.types';\n\n/**\n * Configuration for the default router navigation\n */\nexport interface RouterNavigationConfig {\n /** Route path for page list (default: '/admin') */\n pageListPath: string;\n /** Route path pattern for page edit (default: '/admin/pages/:pageId') */\n pageEditPath: string;\n /** Route path pattern for preview (optional) */\n pagePreviewPath?: string;\n /** Route param name for page ID (default: 'pageId') */\n pageIdParam: string;\n}\n\n/**\n * Default router navigation configuration\n */\nexport const DEFAULT_ROUTER_NAVIGATION_CONFIG: RouterNavigationConfig = {\n pageListPath: '/admin',\n pageEditPath: '/admin/pages/:pageId',\n pageIdParam: 'pageId',\n};\n\n/**\n * Injection token for router navigation configuration\n */\nexport const ROUTER_NAVIGATION_CONFIG = new InjectionToken<RouterNavigationConfig>(\n 'ROUTER_NAVIGATION_CONFIG',\n {\n providedIn: 'root',\n factory: () => DEFAULT_ROUTER_NAVIGATION_CONFIG,\n }\n);\n\n/**\n * Default navigation service implementation using Angular Router\n */\n@Injectable()\nexport class DefaultRouterNavigationService extends VisualEditorNavigation {\n private readonly router = inject(Router);\n private readonly route = inject(ActivatedRoute);\n private readonly config = inject(ROUTER_NAVIGATION_CONFIG);\n\n navigate(target: VisualEditorNavigationTarget): void {\n switch (target.type) {\n case 'page-list':\n this.router.navigate([this.config.pageListPath]);\n break;\n case 'page-edit': {\n const editPath = this.config.pageEditPath.replace(\n `:${this.config.pageIdParam}`,\n target.pageId\n );\n this.router.navigate([editPath]);\n break;\n }\n case 'page-preview':\n if (this.config.pagePreviewPath) {\n const previewPath = this.config.pagePreviewPath.replace(\n `:${this.config.pageIdParam}`,\n target.pageId\n );\n this.router.navigate([previewPath]);\n }\n break;\n }\n }\n\n confirm(options: ConfirmDialogOptions): Observable<boolean> {\n // Default to window.confirm - consumers can override with custom dialogs\n // eslint-disable-next-line no-restricted-globals\n return of(confirm(options.message));\n }\n\n getCurrentPageId(): Observable<string | null> {\n // Extract pageId from URL using the configured path pattern\n const extractPageIdFromUrl = (): string | null => {\n const url = this.router.url;\n // Convert pageEditPath pattern to regex\n // e.g., '/admin/pages/:pageId' -> /\\/admin\\/pages\\/([^\\/]+)/\n const paramPlaceholder = `:${this.config.pageIdParam}`;\n const pattern = this.config.pageEditPath\n .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&') // Escape regex special chars\n .replace(paramPlaceholder.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), '([^/]+)');\n\n const regex = new RegExp(pattern);\n const match = url.match(regex);\n return match ? match[1] : null;\n };\n\n // Emit initial value immediately, then on each navigation event\n return this.router.events.pipe(\n startWith(null), // Trigger initial emission\n map(() => extractPageIdFromUrl())\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Observable, of, delay, throwError } from 'rxjs';\nimport {\n CreatePageRequest,\n Page,\n PageSummary,\n PublishPageRequest,\n UpdatePageRequest,\n} from '../models/page.model';\n\n/**\n * In-memory page repository for development/testing.\n * Simulates backend API with artificial delay.\n */\n@Injectable({ providedIn: 'root' })\nexport class PageMemoryRepository {\n private pages: Map<string, Page> = new Map();\n private readonly DELAY_MS = 300;\n\n constructor() {\n this.seedData();\n }\n\n private seedData(): void {\n const samplePages: Page[] = [\n {\n id: 'page-1',\n slug: 'home',\n title: 'Home Page',\n description: 'The main landing page',\n sections: [\n {\n id: 'section-1',\n type: 'hero-section',\n props: {\n title: 'Welcome to Our Store',\n subtitle: 'Discover amazing products',\n ctaText: 'Shop Now',\n ctaUrl: '/products',\n backgroundImage: '',\n backgroundColor: '#1a1a2e',\n },\n elements: [],\n },\n ],\n status: 'published',\n createdAt: '2024-01-15T10:00:00Z',\n updatedAt: '2024-01-20T14:30:00Z',\n publishedAt: '2024-01-20T14:30:00Z',\n version: 3,\n },\n {\n id: 'page-2',\n slug: 'about',\n title: 'About Us',\n description: 'Learn more about our company',\n sections: [\n {\n id: 'section-2',\n type: 'hero-section',\n props: {\n title: 'About Our Company',\n subtitle: 'Building the future, one product at a time',\n ctaText: 'Contact Us',\n ctaUrl: '/contact',\n backgroundColor: '#2d3436',\n },\n elements: [],\n },\n {\n id: 'section-3',\n type: 'features-grid',\n props: {\n title: 'Our Values',\n columns: 3,\n },\n elements: [\n {\n id: 'feature-1',\n type: 'feature-item',\n slotName: 'features',\n props: {\n icon: '🎯',\n title: 'Quality First',\n description: 'We never compromise on quality',\n },\n },\n {\n id: 'feature-2',\n type: 'feature-item',\n slotName: 'features',\n props: {\n icon: '💡',\n title: 'Innovation',\n description: 'Always pushing boundaries',\n },\n },\n {\n id: 'feature-3',\n type: 'feature-item',\n slotName: 'features',\n props: {\n icon: '🤝',\n title: 'Trust',\n description: 'Building lasting relationships',\n },\n },\n ],\n },\n ],\n status: 'draft',\n createdAt: '2024-02-01T09:00:00Z',\n updatedAt: '2024-02-05T11:00:00Z',\n version: 2,\n },\n {\n id: 'page-3',\n slug: 'contact',\n title: 'Contact Us',\n description: 'Get in touch with our team',\n sections: [],\n status: 'draft',\n createdAt: '2024-02-10T08:00:00Z',\n updatedAt: '2024-02-10T08:00:00Z',\n version: 1,\n },\n ];\n\n samplePages.forEach((page) => this.pages.set(page.id, page));\n }\n\n private generateId(): string {\n return `page-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n\n private toSummary(page: Page): PageSummary {\n return {\n id: page.id,\n slug: page.slug,\n title: page.title,\n status: page.status,\n updatedAt: page.updatedAt,\n publishedAt: page.publishedAt,\n };\n }\n\n getPages(environment?: string): Observable<PageSummary[]> {\n const summaries = Array.from(this.pages.values())\n .map((p) => this.toSummary(p))\n .sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime());\n return of(summaries).pipe(delay(this.DELAY_MS));\n }\n\n getPage(id: string, environment?: string): Observable<Page> {\n const page = this.pages.get(id);\n if (!page) {\n return throwError(() => new Error(`Page not found: ${id}`)).pipe(delay(this.DELAY_MS));\n }\n return of(structuredClone(page)).pipe(delay(this.DELAY_MS));\n }\n\n getPublishedPageBySlug(slug: string, environment?: string): Observable<Page> {\n const page = Array.from(this.pages.values()).find(\n (p) => p.slug === slug && p.status === 'published'\n );\n if (!page) {\n return throwError(() => new Error(`Published page not found: ${slug}`)).pipe(\n delay(this.DELAY_MS)\n );\n }\n return of(structuredClone(page)).pipe(delay(this.DELAY_MS));\n }\n\n createPage(request: CreatePageRequest, environment?: string): Observable<Page> {\n // Check for duplicate slug\n const existingSlug = Array.from(this.pages.values()).find((p) => p.slug === request.slug);\n if (existingSlug) {\n return throwError(() => new Error(`Slug already exists: ${request.slug}`)).pipe(\n delay(this.DELAY_MS)\n );\n }\n\n const now = new Date().toISOString();\n const page: Page = {\n id: this.generateId(),\n slug: request.slug,\n title: request.title,\n description: request.description,\n sections: [],\n status: 'draft',\n createdAt: now,\n updatedAt: now,\n version: 1,\n };\n\n this.pages.set(page.id, page);\n console.log('[PageMemoryRepository] Created page:', page.id, page.title);\n return of(structuredClone(page)).pipe(delay(this.DELAY_MS));\n }\n\n updatePage(id: string, request: UpdatePageRequest, environment?: string): Observable<Page> {\n const page = this.pages.get(id);\n if (!page) {\n return throwError(() => new Error(`Page not found: ${id}`)).pipe(delay(this.DELAY_MS));\n }\n\n // Optimistic locking check\n if (request.version !== page.version) {\n return throwError(\n () => new Error(`Version conflict. Expected ${page.version}, got ${request.version}`)\n ).pipe(delay(this.DELAY_MS));\n }\n\n // Check for duplicate slug if changing\n if (request.slug && request.slug !== page.slug) {\n const existingSlug = Array.from(this.pages.values()).find(\n (p) => p.slug === request.slug && p.id !== id\n );\n if (existingSlug) {\n return throwError(() => new Error(`Slug already exists: ${request.slug}`)).pipe(\n delay(this.DELAY_MS)\n );\n }\n }\n\n const updatedPage: Page = {\n ...page,\n title: request.title ?? page.title,\n slug: request.slug ?? page.slug,\n description: request.description ?? page.description,\n sections: request.sections ?? page.sections,\n updatedAt: new Date().toISOString(),\n version: page.version + 1,\n };\n\n this.pages.set(id, updatedPage);\n console.log('[PageMemoryRepository] Updated page:', id, 'v' + updatedPage.version);\n console.log('[PageMemoryRepository] Sections JSON:', JSON.stringify(updatedPage.sections, null, 2));\n return of(structuredClone(updatedPage)).pipe(delay(this.DELAY_MS));\n }\n\n deletePage(id: string, environment?: string): Observable<void> {\n if (!this.pages.has(id)) {\n return throwError(() => new Error(`Page not found: ${id}`)).pipe(delay(this.DELAY_MS));\n }\n\n this.pages.delete(id);\n console.log('[PageMemoryRepository] Deleted page:', id);\n return of(undefined).pipe(delay(this.DELAY_MS));\n }\n\n publishPage(id: string, request: PublishPageRequest, environment?: string): Observable<Page> {\n const page = this.pages.get(id);\n if (!page) {\n return throwError(() => new Error(`Page not found: ${id}`)).pipe(delay(this.DELAY_MS));\n }\n\n if (request.version !== page.version) {\n return throwError(\n () => new Error(`Version conflict. Expected ${page.version}, got ${request.version}`)\n ).pipe(delay(this.DELAY_MS));\n }\n\n const now = new Date().toISOString();\n const updatedPage: Page = {\n ...page,\n status: 'published',\n publishedAt: now,\n updatedAt: now,\n version: page.version + 1,\n };\n\n this.pages.set(id, updatedPage);\n console.log('[PageMemoryRepository] Published page:', id);\n return of(structuredClone(updatedPage)).pipe(delay(this.DELAY_MS));\n }\n\n unpublishPage(id: string, request: PublishPageRequest, environment?: string): Observable<Page> {\n const page = this.pages.get(id);\n if (!page) {\n return throwError(() => new Error(`Page not found: ${id}`)).pipe(delay(this.DELAY_MS));\n }\n\n if (request.version !== page.version) {\n return throwError(\n () => new Error(`Version conflict. Expected ${page.version}, got ${request.version}`)\n ).pipe(delay(this.DELAY_MS));\n }\n\n const updatedPage: Page = {\n ...page,\n status: 'draft',\n updatedAt: new Date().toISOString(),\n version: page.version + 1,\n };\n\n this.pages.set(id, updatedPage);\n console.log('[PageMemoryRepository] Unpublished page:', id);\n return of(structuredClone(updatedPage)).pipe(delay(this.DELAY_MS));\n }\n\n duplicatePage(id: string, environment?: string): Observable<Page> {\n const page = this.pages.get(id);\n if (!page) {\n return throwError(() => new Error(`Page not found: ${id}`)).pipe(delay(this.DELAY_MS));\n }\n\n const now = new Date().toISOString();\n const newPage: Page = {\n ...structuredClone(page),\n id: this.generateId(),\n slug: `${page.slug}-copy-${Date.now()}`,\n title: `${page.title} (Copy)`,\n status: 'draft',\n createdAt: now,\n updatedAt: now,\n publishedAt: undefined,\n version: 1,\n };\n\n this.pages.set(newPage.id, newPage);\n console.log('[PageMemoryRepository] Duplicated page:', id, '->', newPage.id);\n return of(structuredClone(newPage)).pipe(delay(this.DELAY_MS));\n }\n\n // Utility method to reset to initial state (useful for testing)\n reset(): void {\n this.pages.clear();\n this.seedData();\n console.log('[PageMemoryRepository] Reset to initial state');\n }\n\n deletePagesByEnvironment(environment?: string): Observable<void> {\n this.pages.clear();\n console.log('[PageMemoryRepository] Deleted all pages for environment:', environment ?? 'production');\n return of(undefined).pipe(delay(this.DELAY_MS));\n }\n\n // Utility method to get all pages (useful for debugging)\n getAllPages(): Page[] {\n return Array.from(this.pages.values());\n }\n}\n","import { Injectable, inject, signal, computed, InjectionToken, OnDestroy } from '@angular/core';\nimport type { SupabaseClient, Session, User, AuthChangeEvent } from '@supabase/supabase-js';\n\nexport interface SupabaseConfig {\n supabaseUrl: string;\n supabaseAnonKey: string;\n}\n\nexport const SUPABASE_CONFIG = new InjectionToken<SupabaseConfig>('SUPABASE_CONFIG');\n\n@Injectable({ providedIn: 'root' })\nexport class SupabaseAuthService implements OnDestroy {\n private config = inject(SUPABASE_CONFIG, { optional: true });\n private supabase: SupabaseClient | null = null;\n private supabasePromise: Promise<SupabaseClient | null> | null = null;\n private authSubscription: { unsubscribe: () => void } | null = null;\n\n private _session = signal<Session | null>(null);\n private _user = signal<User | null>(null);\n private _loading = signal(true);\n private _error = signal<string | null>(null);\n private _initialized = signal(false);\n\n readonly session = this._session.asReadonly();\n readonly user = this._user.asReadonly();\n readonly loading = this._loading.asReadonly();\n readonly error = this._error.asReadonly();\n readonly initialized = this._initialized.asReadonly();\n\n readonly isAuthenticated = computed(() => this._initialized() && !!this._session());\n readonly accessToken = computed(() => this._session()?.access_token ?? null);\n readonly userEmail = computed(() => this._user()?.email ?? null);\n\n private async getSupabaseClient(): Promise<SupabaseClient | null> {\n if (this.supabase) return this.supabase;\n if (this.supabasePromise) return this.supabasePromise;\n\n if (!this.config || typeof window === 'undefined') {\n this._loading.set(false);\n this._initialized.set(true);\n return null;\n }\n\n this.supabasePromise = this.initializeClient();\n return this.supabasePromise;\n }\n\n private async initializeClient(): Promise<SupabaseClient | null> {\n try {\n const { createClient } = await import('@supabase/supabase-js');\n\n this.supabase = createClient(this.config!.supabaseUrl, this.config!.supabaseAnonKey, {\n auth: {\n autoRefreshToken: true,\n persistSession: true,\n detectSessionInUrl: true,\n },\n });\n\n const { data: { subscription } } = this.supabase.auth.onAuthStateChange(\n (event: AuthChangeEvent, session: Session | null) => {\n this._session.set(session);\n this._user.set(session?.user ?? null);\n this._loading.set(false);\n this._initialized.set(true);\n\n if (event === 'SIGNED_OUT') {\n this._error.set(null);\n }\n }\n );\n\n this.authSubscription = subscription;\n\n const { data: { session }, error } = await this.supabase.auth.getSession();\n if (!error) {\n this._session.set(session);\n this._user.set(session?.user ?? null);\n }\n\n this._loading.set(false);\n this._initialized.set(true);\n\n return this.supabase;\n } catch (err) {\n this._error.set(err instanceof Error ? err.message : 'Failed to initialize');\n this._loading.set(false);\n this._initialized.set(true);\n return null;\n }\n }\n\n async ensureInitialized(): Promise<void> {\n await this.getSupabaseClient();\n }\n\n async signInWithPassword(email: string, password: string): Promise<{ success: boolean; error?: string }> {\n const client = await this.getSupabaseClient();\n if (!client) {\n return { success: false, error: 'Supabase not initialized' };\n }\n\n this._loading.set(true);\n this._error.set(null);\n\n try {\n const { data, error } = await client.auth.signInWithPassword({\n email,\n password,\n });\n\n if (error) throw error;\n\n this._session.set(data.session);\n this._user.set(data.user);\n return { success: true };\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Login failed';\n this._error.set(message);\n return { success: false, error: message };\n } finally {\n this._loading.set(false);\n }\n }\n\n async signUp(email: string, password: string): Promise<{ success: boolean; error?: string }> {\n const client = await this.getSupabaseClient();\n if (!client) {\n return { success: false, error: 'Supabase not initialized' };\n }\n\n this._loading.set(true);\n this._error.set(null);\n\n try {\n const { data, error } = await client.auth.signUp({\n email,\n password,\n });\n\n if (error) throw error;\n\n if (data.session) {\n this._session.set(data.session);\n this._user.set(data.user);\n }\n\n return { success: true };\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Sign up failed';\n this._error.set(message);\n return { success: false, error: message };\n } finally {\n this._loading.set(false);\n }\n }\n\n async signOut(): Promise<void> {\n const client = await this.getSupabaseClient();\n if (!client) return;\n\n this._loading.set(true);\n try {\n await client.auth.signOut();\n this._session.set(null);\n this._user.set(null);\n } catch (err) {\n this._error.set(err instanceof Error ? err.message : 'Sign out failed');\n } finally {\n this._loading.set(false);\n }\n }\n\n async resetPassword(email: string): Promise<{ success: boolean; error?: string }> {\n const client = await this.getSupabaseClient();\n if (!client) {\n return { success: false, error: 'Supabase not initialized' };\n }\n\n try {\n const { error } = await client.auth.resetPasswordForEmail(email);\n if (error) throw error;\n return { success: true };\n } catch (err) {\n return { success: false, error: err instanceof Error ? err.message : 'Reset failed' };\n }\n }\n\n async getClient(): Promise<SupabaseClient | null> {\n return this.getSupabaseClient();\n }\n\n ngOnDestroy() {\n this.authSubscription?.unsubscribe();\n }\n}\n","import { Injectable, InjectionToken, inject, signal, computed } from '@angular/core';\nimport { HttpClient, HttpErrorResponse } from '@angular/common/http';\nimport { SupabaseAuthService, SUPABASE_CONFIG } from './supabase-auth.service';\nimport { firstValueFrom } from 'rxjs';\n\n/**\n * Token para inyectar el dominio de la tienda.\n * Debe ser configurado por la aplicación que instala el editor.\n *\n * Ejemplo de uso:\n * ```typescript\n * providers: [\n * { provide: STORE_DOMAIN, useValue: 'nike.com' }\n * ]\n * ```\n *\n * Si no se provee, el servicio intentará detectar el dominio desde window.location.hostname\n */\nexport const STORE_DOMAIN = new InjectionToken<string>('STORE_DOMAIN');\n\nexport interface Shop {\n id: string;\n name: string;\n shopify_domain: string;\n}\n\nexport interface ShopUser {\n email: string;\n role: 'owner' | 'admin' | 'reader';\n}\n\nexport interface ShopLicense {\n tier: 'starter' | 'growth' | 'enterprise';\n expires_at: string | null;\n active: boolean;\n}\n\nexport interface ShopAuthData {\n shop: Shop | null;\n user: ShopUser | null;\n license: ShopLicense | null;\n}\n\nexport interface ShopAuthError {\n code: string;\n message: string;\n}\n\ninterface ShopAuthResponse {\n success: boolean;\n shop: Shop;\n user: ShopUser;\n license: ShopLicense;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class ShopAuthService {\n private http = inject(HttpClient);\n private config = inject(SUPABASE_CONFIG, { optional: true });\n private authService = inject(SupabaseAuthService);\n private storeDomainConfig = inject(STORE_DOMAIN, { optional: true });\n\n // Estado interno\n private _shop = signal<Shop | null>(null);\n private _user = signal<ShopUser | null>(null);\n private _license = signal<ShopLicense | null>(null);\n private _loading = signal(false);\n private _error = signal<ShopAuthError | null>(null);\n private _initialized = signal(false);\n\n // Exponer estado como readonly\n readonly shop = this._shop.asReadonly();\n readonly user = this._user.asReadonly();\n readonly license = this._license.asReadonly();\n readonly loading = this._loading.asReadonly();\n readonly error = this._error.asReadonly();\n readonly initialized = this._initialized.asReadonly();\n\n // Computed helpers\n readonly shopId = computed(() => this._shop()?.id ?? null);\n readonly shopName = computed(() => this._shop()?.name ?? null);\n readonly shopifyDomain = computed(() => this._shop()?.shopify_domain ?? null);\n\n readonly userEmail = computed(() => this._user()?.email ?? null);\n readonly userRole = computed(() => this._user()?.role ?? null);\n\n readonly isOwner = computed(() => this._user()?.role === 'owner');\n readonly isAdmin = computed(() => ['owner', 'admin'].includes(this._user()?.role ?? ''));\n readonly canEdit = computed(() => ['owner', 'admin'].includes(this._user()?.role ?? ''));\n\n readonly licenseTier = computed(() => this._license()?.tier ?? null);\n readonly licenseActive = computed(() => this._license()?.active ?? false);\n readonly licenseExpiresAt = computed(() => this._license()?.expires_at ?? null);\n\n readonly hasAccess = computed(() => {\n return this._shop() !== null && this._user() !== null && this._license()?.active === true;\n });\n\n readonly daysRemaining = computed(() => {\n const expiresAt = this._license()?.expires_at;\n if (!expiresAt) return null;\n const days = Math.ceil((new Date(expiresAt).getTime() - Date.now()) / (1000 * 60 * 60 * 24));\n return Math.max(0, days);\n });\n\n readonly isLicenseExpiringSoon = computed(() => {\n const days = this.daysRemaining();\n return days !== null && days <= 7;\n });\n\n /**\n * Obtiene el dominio actual.\n * Prioridad:\n * 1. STORE_DOMAIN token (inyectado)\n * 2. Query param ?shop= (solo en localhost)\n * 3. window.location.hostname\n */\n getCurrentDomain(): string {\n if (this.storeDomainConfig) {\n return this.storeDomainConfig;\n }\n\n if (typeof window !== 'undefined') {\n const hostname = window.location.hostname;\n\n if (hostname === 'localhost' || hostname === '127.0.0.1') {\n const params = new URLSearchParams(window.location.search);\n const shopParam = params.get('shop');\n if (shopParam) {\n localStorage.setItem('kustomizer_shop_domain', shopParam);\n return shopParam;\n }\n const stored = localStorage.getItem('kustomizer_shop_domain');\n if (stored) {\n return stored;\n }\n }\n\n return hostname;\n }\n\n return '';\n }\n\n /**\n * Autentica al usuario para el dominio actual.\n * Esta es la función principal que debe llamarse al cargar la app.\n */\n async authenticate(): Promise<ShopAuthData> {\n // Si ya está inicializado y tiene datos, retornar cache\n if (this._initialized() && this._shop()) {\n return {\n shop: this._shop(),\n user: this._user(),\n license: this._license(),\n };\n }\n\n // Esperar a que el auth service esté listo\n await this.authService.ensureInitialized();\n\n const token = this.authService.accessToken();\n const email = this.authService.userEmail();\n\n if (!token || !email) {\n this._error.set({ code: 'NOT_AUTHENTICATED', message: 'User is not authenticated' });\n this._initialized.set(true);\n return { shop: null, user: null, license: null };\n }\n\n const domain = this.getCurrentDomain();\n\n if (!domain) {\n this._error.set({ code: 'NO_DOMAIN', message: 'Could not determine current domain' });\n this._initialized.set(true);\n return { shop: null, user: null, license: null };\n }\n\n if (domain === 'localhost' || domain === '127.0.0.1') {\n this._error.set({\n code: 'LOCALHOST_NO_SHOP',\n message: 'Running on localhost. Add ?shop=your-store.myshopify.com to the URL'\n });\n this._initialized.set(true);\n return { shop: null, user: null, license: null };\n }\n\n this._loading.set(true);\n this._error.set(null);\n\n try {\n const url = this.config\n ? `${this.config.supabaseUrl}/functions/v1/shop_auth`\n : '/functions/v1/shop_auth';\n\n const anonKey = this.config?.supabaseAnonKey ?? '';\n\n const response = await firstValueFrom(\n this.http.post<ShopAuthResponse>(url, { domain, email }, {\n headers: {\n 'Authorization': `Bearer ${anonKey}`,\n 'apikey': anonKey,\n 'Content-Type': 'application/json',\n },\n })\n );\n\n this._shop.set(response.shop);\n this._user.set(response.user);\n this._license.set(response.license);\n this._initialized.set(true);\n this._loading.set(false);\n\n return {\n shop: response.shop,\n user: response.user,\n license: response.license,\n };\n } catch (err: unknown) {\n console.error('[ShopAuthService] Authentication failed:', err);\n\n const httpError = err as HttpErrorResponse;\n let errorCode = 'UNKNOWN_ERROR';\n let errorMessage = 'Authentication failed';\n\n if (httpError.error?.code) {\n errorCode = httpError.error.code;\n errorMessage = httpError.error.error || httpError.error.message || errorMessage;\n } else if (httpError.status === 404) {\n errorCode = 'SHOP_NOT_FOUND';\n errorMessage = 'This domain is not registered';\n } else if (httpError.status === 403) {\n errorCode = 'NO_ACCESS';\n errorMessage = 'You do not have access to this shop';\n }\n\n this._error.set({ code: errorCode, message: errorMessage });\n this._shop.set(null);\n this._user.set(null);\n this._license.set(null);\n this._initialized.set(true);\n this._loading.set(false);\n\n return { shop: null, user: null, license: null };\n }\n }\n\n /**\n * Limpia el estado (para logout)\n */\n clear(): void {\n this._shop.set(null);\n this._user.set(null);\n this._license.set(null);\n this._error.set(null);\n this._initialized.set(false);\n if (typeof window !== 'undefined') {\n localStorage.removeItem('kustomizer_shop_domain');\n }\n }\n\n /**\n * Refresca la autenticación\n */\n async refresh(): Promise<ShopAuthData> {\n this._initialized.set(false);\n return this.authenticate();\n }\n\n /**\n * Verifica si el error actual indica que el usuario no tiene acceso\n */\n isNoAccessError(): boolean {\n const code = this._error()?.code;\n return code === 'NO_ACCESS' || code === 'SHOP_NOT_FOUND';\n }\n\n /**\n * Verifica si el error actual indica que la licencia expiró\n */\n isLicenseExpiredError(): boolean {\n return this._error()?.code === 'LICENSE_EXPIRED';\n }\n\n /**\n * Verifica si el usuario está inactivo\n */\n isUserInactiveError(): boolean {\n return this._error()?.code === 'USER_INACTIVE';\n }\n}\n","import { Injectable, inject, signal, computed, InjectionToken } from '@angular/core';\nimport { HttpClient, HttpErrorResponse } from '@angular/common/http';\nimport { Observable, throwError, of } from 'rxjs';\nimport { tap, catchError, shareReplay, take } from 'rxjs/operators';\nimport { SupabaseAuthService } from './supabase-auth.service';\nimport { ShopAuthService } from './shop-auth.service';\n\nexport interface ShopifyAppConfig {\n appUrl: string;\n}\n\nexport interface ShopifyTokenResponse {\n accessToken: string;\n shopifyDomain: string;\n}\n\ninterface TokenCacheEntry {\n accessToken: string;\n shopifyDomain: string;\n expiresAt: number;\n}\n\nexport type TokenErrorCode =\n | 'NOT_AUTHENTICATED'\n | 'NO_ACTIVE_STORE'\n | 'TOKEN_FETCH_FAILED'\n | 'SESSION_EXPIRED'\n | 'NO_STORE_ACCESS'\n | 'NETWORK_ERROR'\n | 'UNKNOWN_ERROR';\n\nexport interface TokenError {\n code: TokenErrorCode;\n message: string;\n status?: number;\n}\n\nexport const SHOPIFY_APP_CONFIG = new InjectionToken<ShopifyAppConfig>('SHOPIFY_APP_CONFIG', {\n providedIn: 'root',\n factory: () => ({\n appUrl: 'https://kustomizer.xyz'\n })\n});\n\n@Injectable({ providedIn: 'root' })\nexport class ShopifyTokenService {\n private readonly http = inject(HttpClient);\n private readonly config = inject(SHOPIFY_APP_CONFIG);\n private readonly authService = inject(SupabaseAuthService);\n private readonly shopAuthService = inject(ShopAuthService);\n\n private readonly CACHE_TTL_MS = 5 * 60 * 1000;\n private readonly tokenCache = new Map<string, TokenCacheEntry>();\n\n private readonly _currentToken = signal<string | null>(null);\n private readonly _currentDomain = signal<string | null>(null);\n private readonly _loading = signal(false);\n private readonly _error = signal<TokenError | null>(null);\n\n private pendingRequest: Observable<ShopifyTokenResponse> | null = null;\n\n readonly currentToken = this._currentToken.asReadonly();\n readonly currentDomain = this._currentDomain.asReadonly();\n readonly loading = this._loading.asReadonly();\n readonly error = this._error.asReadonly();\n\n readonly hasToken = computed(() => !!this._currentToken());\n readonly isReady = computed(() =>\n this.authService.isAuthenticated() && !!this.shopAuthService.shop()\n );\n\n getToken(): Observable<ShopifyTokenResponse> {\n if (!this.authService.isAuthenticated()) {\n return throwError(() => this.createError('NOT_AUTHENTICATED', 'User is not authenticated'));\n }\n\n const shop = this.shopAuthService.shop();\n if (!shop?.shopify_domain) {\n return throwError(() => this.createError('NO_ACTIVE_STORE', 'No active store selected'));\n }\n\n return this.getTokenForDomain(shop.shopify_domain);\n }\n\n getTokenForDomain(shopifyDomain: string): Observable<ShopifyTokenResponse> {\n const cached = this.getCachedToken(shopifyDomain);\n if (cached) {\n this._currentToken.set(cached.accessToken);\n this._currentDomain.set(cached.shopifyDomain);\n return of({\n accessToken: cached.accessToken,\n shopifyDomain: cached.shopifyDomain\n });\n }\n\n if (this.pendingRequest) {\n return this.pendingRequest;\n }\n\n return this.fetchToken(shopifyDomain);\n }\n\n refreshToken(): Observable<ShopifyTokenResponse> {\n const shop = this.shopAuthService.shop();\n if (!shop?.shopify_domain) {\n return throwError(() => this.createError('NO_ACTIVE_STORE', 'No active store selected'));\n }\n\n this.invalidateCache(shop.shopify_domain);\n return this.fetchToken(shop.shopify_domain);\n }\n\n invalidateCache(shopifyDomain?: string): void {\n if (shopifyDomain) {\n this.tokenCache.delete(shopifyDomain);\n if (this._currentDomain() === shopifyDomain) {\n this._currentToken.set(null);\n this._currentDomain.set(null);\n }\n } else {\n this.tokenCache.clear();\n this._currentToken.set(null);\n this._currentDomain.set(null);\n }\n }\n\n clear(): void {\n this.invalidateCache();\n this._error.set(null);\n this._loading.set(false);\n this.pendingRequest = null;\n }\n\n private fetchToken(shopifyDomain: string): Observable<ShopifyTokenResponse> {\n this._loading.set(true);\n this._error.set(null);\n\n const supabaseToken = this.authService.accessToken();\n if (!supabaseToken) {\n this._loading.set(false);\n return throwError(() => this.createError('NOT_AUTHENTICATED', 'No authentication token available'));\n }\n\n const url = `${this.config.appUrl}/api/get-token`;\n\n this.pendingRequest = this.http.post<ShopifyTokenResponse>(\n url,\n { shopifyDomain },\n {\n headers: {\n 'Authorization': `Bearer ${supabaseToken}`,\n 'Content-Type': 'application/json'\n }\n }\n ).pipe(\n tap(response => {\n this.setCachedToken(shopifyDomain, response);\n this._currentToken.set(response.accessToken);\n this._currentDomain.set(response.shopifyDomain);\n this._loading.set(false);\n this.pendingRequest = null;\n }),\n catchError((error: HttpErrorResponse) => {\n this._loading.set(false);\n this.pendingRequest = null;\n\n const tokenError = this.handleHttpError(error);\n this._error.set(tokenError);\n\n return throwError(() => tokenError);\n }),\n shareReplay(1),\n take(1)\n );\n\n return this.pendingRequest;\n }\n\n private getCachedToken(shopifyDomain: string): TokenCacheEntry | null {\n const entry = this.tokenCache.get(shopifyDomain);\n if (entry && Date.now() < entry.expiresAt) {\n return entry;\n }\n if (entry) {\n this.tokenCache.delete(shopifyDomain);\n }\n return null;\n }\n\n private setCachedToken(shopifyDomain: string, response: ShopifyTokenResponse): void {\n this.tokenCache.set(shopifyDomain, {\n accessToken: response.accessToken,\n shopifyDomain: response.shopifyDomain,\n expiresAt: Date.now() + this.CACHE_TTL_MS\n });\n }\n\n private handleHttpError(error: HttpErrorResponse): TokenError {\n if (error.error instanceof ErrorEvent) {\n return this.createError('NETWORK_ERROR', 'Network error occurred', error.status);\n }\n\n switch (error.status) {\n case 401:\n return this.createError('SESSION_EXPIRED', 'Session expired. Please login again.', 401);\n case 403:\n return this.createError('NO_STORE_ACCESS', 'You do not have access to this store.', 403);\n case 404:\n return this.createError('NO_STORE_ACCESS', 'Store not found or not linked.', 404);\n default:\n const message = error.error?.error || error.error?.message || 'Failed to get token';\n return this.createError('TOKEN_FETCH_FAILED', message, error.status);\n }\n }\n\n private createError(code: TokenErrorCode, message: string, status?: number): TokenError {\n return { code, message, status };\n }\n}\n","import { HttpClient, HttpErrorResponse } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { Observable, throwError } from 'rxjs';\nimport { catchError, map } from 'rxjs/operators';\nimport { SupabaseAuthService } from './supabase-auth.service';\nimport { ShopAuthService } from './shop-auth.service';\nimport { SHOPIFY_APP_CONFIG } from './shopify-token.service';\n\ninterface GraphQLResponse<T = unknown> {\n data?: T;\n errors?: Array<{\n message: string;\n locations?: Array<{ line: number; column: number }>;\n path?: string[];\n extensions?: Record<string, unknown>;\n }>;\n}\n\nexport type GraphQLErrorCode =\n | 'GRAPHQL_ERROR'\n | 'EMPTY_RESPONSE'\n | 'UNAUTHORIZED'\n | 'FORBIDDEN'\n | 'RATE_LIMIT'\n | 'SERVER_ERROR'\n | 'NETWORK_ERROR'\n | 'HTTP_ERROR'\n | 'TOKEN_ERROR'\n | 'UNKNOWN_ERROR';\n\nexport interface GraphQLError {\n code: GraphQLErrorCode;\n message: string;\n status?: number;\n errors?: Array<{ message: string }>;\n original?: unknown;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class ShopifyGraphQLClient {\n private readonly http = inject(HttpClient);\n private readonly authService = inject(SupabaseAuthService);\n private readonly shopAuthService = inject(ShopAuthService);\n private readonly config = inject(SHOPIFY_APP_CONFIG);\n\n query<T>(query: string, variables?: Record<string, unknown>): Observable<T> {\n return this.executeOperation<T>(query, variables);\n }\n\n mutate<T>(mutation: string, variables?: Record<string, unknown>): Observable<T> {\n return this.executeOperation<T>(mutation, variables);\n }\n\n private executeOperation<T>(operation: string, variables?: Record<string, unknown>): Observable<T> {\n const shop = this.shopAuthService.shop();\n if (!shop?.shopify_domain) {\n return throwError(() => this.createError('TOKEN_ERROR', 'No active store selected'));\n }\n\n const supabaseToken = this.authService.accessToken();\n if (!supabaseToken) {\n return throwError(() => this.createError('UNAUTHORIZED', 'Not authenticated'));\n }\n\n const shopifyDomain = shop.shopify_domain;\n const proxyUrl = `${this.config.appUrl}/api/graphql-proxy`;\n\n return this.http.post<GraphQLResponse<T>>(\n proxyUrl,\n {\n shopifyDomain,\n query: operation,\n variables,\n },\n {\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${supabaseToken}`,\n },\n }\n ).pipe(\n map(response => this.handleResponse<T>(response)),\n catchError(error => this.handleHttpError(error))\n );\n }\n\n private handleResponse<T>(response: GraphQLResponse<T>): T {\n if (response.errors && response.errors.length > 0) {\n const error: GraphQLError = {\n code: 'GRAPHQL_ERROR',\n message: response.errors[0].message,\n errors: response.errors.map(e => ({ message: e.message }))\n };\n throw error;\n }\n\n if (!response.data) {\n const error: GraphQLError = {\n code: 'EMPTY_RESPONSE',\n message: 'GraphQL response contains no data'\n };\n throw error;\n }\n\n return response.data;\n }\n\n private handleHttpError(error: HttpErrorResponse): Observable<never> {\n if (error.error instanceof ErrorEvent) {\n return throwError(() => this.createError('NETWORK_ERROR', error.error.message));\n }\n\n let code: GraphQLErrorCode;\n let message: string;\n\n switch (error.status) {\n case 401:\n code = 'UNAUTHORIZED';\n message = 'Session expired. Please login again.';\n break;\n case 403:\n code = 'FORBIDDEN';\n message = 'Access denied to this store.';\n break;\n case 404:\n code = 'TOKEN_ERROR';\n message = 'Store not connected. Please install the Shopify app.';\n break;\n case 429:\n code = 'RATE_LIMIT';\n message = 'Rate limit exceeded. Please try again later.';\n break;\n case 500:\n case 502:\n case 503:\n case 504:\n code = 'SERVER_ERROR';\n message = 'Server error. Please try again.';\n break;\n default:\n code = 'HTTP_ERROR';\n message = error.error?.error || `HTTP ${error.status}: ${error.statusText || 'Unknown error'}`;\n }\n\n return throwError(() => this.createError(code, message, error.status, error));\n }\n\n private createError(\n code: GraphQLErrorCode,\n message: string,\n status?: number,\n original?: unknown\n ): GraphQLError {\n return { code, message, status, original };\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { Observable, throwError } from 'rxjs';\nimport { map, switchMap } from 'rxjs/operators';\nimport { Metafield, Page, PagesIndex } from '../models/page.model';\nimport { ShopifyGraphQLClient } from './shopify-graphql-client.service';\n\nexport const NAMESPACE = 'kustomizer';\nexport const INDEX_KEY = 'pages_index';\nexport const MAX_METAFIELD_SIZE = 64 * 1024;\n\nexport const GET_SHOP_METAFIELD_QUERY = `\n query GetShopMetafield($namespace: String!, $key: String!) {\n shop {\n id\n metafield(namespace: $namespace, key: $key) {\n id\n value\n createdAt\n updatedAt\n }\n }\n }\n`;\n\nexport const SET_METAFIELD_MUTATION = `\n mutation SetMetafield($metafields: [MetafieldsSetInput!]!) {\n metafieldsSet(metafields: $metafields) {\n metafields {\n id\n namespace\n key\n value\n }\n userErrors {\n field\n message\n }\n }\n }\n`;\n\nexport const DELETE_METAFIELDS_MUTATION = `\n mutation DeleteMetafields($metafields: [MetafieldIdentifierInput!]!) {\n metafieldsDelete(metafields: $metafields) {\n deletedMetafields {\n key\n namespace\n }\n userErrors {\n field\n message\n }\n }\n }\n`;\n\nexport const GET_SHOP_ID_QUERY = `\n query GetShopId {\n shop {\n id\n }\n }\n`;\n\ninterface GetMetafieldResponse {\n shop: {\n id: string;\n metafield: {\n id: string;\n value: string;\n createdAt?: string;\n updatedAt?: string;\n } | null;\n };\n}\n\ninterface SetMetafieldResponse {\n metafieldsSet: {\n metafields: Array<{\n id: string;\n namespace: string;\n key: string;\n value: string;\n }>;\n userErrors: Array<{\n field: string;\n message: string;\n }>;\n };\n}\n\ninterface DeleteMetafieldsResponse {\n metafieldsDelete: {\n deletedMetafields: Array<{\n key: string;\n namespace: string;\n }>;\n userErrors: Array<{\n field: string;\n message: string;\n }>;\n };\n}\n\ninterface GetShopIdResponse {\n shop: {\n id: string;\n };\n}\n\n@Injectable({ providedIn: 'root' })\nexport class ShopifyMetafieldRepository {\n private readonly client = inject(ShopifyGraphQLClient);\n\n private resolveEnvironment(environment?: string): string {\n const trimmed = environment?.trim();\n return trimmed ? trimmed : 'production';\n }\n\n private buildIndexKey(environment?: string): string {\n const env = this.resolveEnvironment(environment);\n return `${env}.${INDEX_KEY}`;\n }\n\n private buildPageKey(pageId: string, environment?: string): string {\n const env = this.resolveEnvironment(environment);\n return `${env}.page_${pageId}`;\n }\n\n getMetafield(namespace: string, key: string): Observable<Metafield | null> {\n return this.client.query<GetMetafieldResponse>(GET_SHOP_METAFIELD_QUERY, { namespace, key }).pipe(\n map(response => {\n if (!response.shop.metafield) {\n return null;\n }\n\n return {\n id: response.shop.metafield.id,\n namespace,\n key,\n value: response.shop.metafield.value,\n type: 'json',\n createdAt: response.shop.metafield.createdAt,\n updatedAt: response.shop.metafield.updatedAt,\n };\n })\n );\n }\n\n setMetafield(namespace: string, key: string, value: any, ownerId: string): Observable<Metafield> {\n const valueString = typeof value === 'string' ? value : JSON.stringify(value);\n\n const validation = this.validateSize(value);\n if (!validation.valid) {\n return throwError(() => ({\n code: 'SIZE_EXCEEDED',\n message: `Metafield size exceeds ${MAX_METAFIELD_SIZE} bytes limit`,\n size: validation.size,\n maxSize: MAX_METAFIELD_SIZE,\n percentUsed: validation.percentUsed,\n }));\n }\n\n const metafields = [{\n namespace,\n key,\n value: valueString,\n type: 'json',\n ownerId,\n }];\n\n return this.client.mutate<SetMetafieldResponse>(SET_METAFIELD_MUTATION, { metafields }).pipe(\n map(response => {\n if (response.metafieldsSet.userErrors.length > 0) {\n throw {\n code: 'SHOPIFY_METAFIELD_ERROR',\n message: response.metafieldsSet.userErrors[0].message,\n errors: response.metafieldsSet.userErrors,\n };\n }\n\n const metafield = response.metafieldsSet.metafields[0];\n return {\n id: metafield.id,\n namespace: metafield.namespace,\n key: metafield.key,\n value: metafield.value,\n type: 'json',\n };\n })\n );\n }\n\n deleteMetafield(namespace: string, key: string): Observable<void> {\n return this.getShopId().pipe(\n switchMap(shopId => {\n const metafields = [{\n ownerId: shopId,\n namespace,\n key,\n }];\n\n return this.client.mutate<DeleteMetafieldsResponse>(DELETE_METAFIELDS_MUTATION, { metafields }).pipe(\n map(response => {\n if (response.metafieldsDelete.userErrors.length > 0) {\n throw {\n code: 'SHOPIFY_METAFIELD_ERROR',\n message: response.metafieldsDelete.userErrors[0].message,\n errors: response.metafieldsDelete.userErrors,\n };\n }\n })\n );\n })\n );\n }\n\n getShopId(): Observable<string> {\n return this.client.query<GetShopIdResponse>(GET_SHOP_ID_QUERY).pipe(\n map(response => response.shop.id)\n );\n }\n\n getPageIndex(environment?: string): Observable<PagesIndex> {\n const key = this.buildIndexKey(environment);\n return this.getMetafield(NAMESPACE, key).pipe(\n map(metafield => {\n if (!metafield) {\n return this.getDefaultIndex();\n }\n\n try {\n const parsed = JSON.parse(metafield.value);\n if (!parsed.pages || !Array.isArray(parsed.pages)) {\n throw new Error('Invalid index structure');\n }\n return parsed as PagesIndex;\n } catch (error) {\n throw {\n code: 'INDEX_PARSE_ERROR',\n message: 'Stored index data is corrupted',\n original: error,\n };\n }\n })\n );\n }\n\n updatePageIndex(index: PagesIndex, environment?: string): Observable<PagesIndex> {\n return this.getShopId().pipe(\n switchMap(shopId => {\n const updatedIndex: PagesIndex = {\n ...index,\n version: index.version + 1,\n lastUpdated: new Date().toISOString(),\n };\n\n const key = this.buildIndexKey(environment);\n return this.setMetafield(NAMESPACE, key, updatedIndex, shopId).pipe(\n map(() => updatedIndex)\n );\n })\n );\n }\n\n getPageMetafield(pageId: string, environment?: string): Observable<Page | null> {\n const key = this.buildPageKey(pageId, environment);\n return this.getMetafield(NAMESPACE, key).pipe(\n map(metafield => {\n if (!metafield) {\n return null;\n }\n\n try {\n return JSON.parse(metafield.value) as Page;\n } catch (error) {\n throw {\n code: 'PAGE_PARSE_ERROR',\n message: 'Stored page data is corrupted',\n original: error,\n };\n }\n })\n );\n }\n\n setPageMetafield(pageId: string, page: Page, environment?: string): Observable<Page> {\n const key = this.buildPageKey(pageId, environment);\n return this.getShopId().pipe(\n switchMap(shopId => {\n return this.setMetafield(NAMESPACE, key, page, shopId).pipe(\n map(() => page)\n );\n })\n );\n }\n\n deletePageMetafield(pageId: string, environment?: string): Observable<void> {\n const key = this.buildPageKey(pageId, environment);\n return this.deleteMetafield(NAMESPACE, key);\n }\n\n resetPageIndex(environment?: string): Observable<PagesIndex> {\n const key = this.buildIndexKey(environment);\n const resetIndex = this.getDefaultIndex();\n return this.getShopId().pipe(\n switchMap(shopId => {\n return this.setMetafield(NAMESPACE, key, resetIndex, shopId).pipe(\n map(() => resetIndex)\n );\n })\n );\n }\n\n validateSize(data: any): { valid: boolean; size: number; percentUsed: number } {\n const json = JSON.stringify(data);\n const size = new Blob([json]).size;\n const percentUsed = (size / MAX_METAFIELD_SIZE) * 100;\n\n return {\n valid: size <= MAX_METAFIELD_SIZE,\n size,\n percentUsed: parseFloat(percentUsed.toFixed(2)),\n };\n }\n\n private getDefaultIndex(): PagesIndex {\n return {\n version: 0,\n lastUpdated: new Date().toISOString(),\n pages: [],\n };\n }\n\n}\n","import { inject, Injectable } from '@angular/core';\nimport { Observable, forkJoin, throwError } from 'rxjs';\nimport { map, switchMap } from 'rxjs/operators';\nimport {\n CreatePageRequest,\n Page,\n PageIndexEntry,\n PageSummary,\n PagesIndex,\n PublishPageRequest,\n UpdatePageRequest,\n} from '../models/page.model';\nimport { ShopifyMetafieldRepository } from './shopify-metafield-repository.service';\n\n@Injectable({ providedIn: 'root' })\nexport class PageShopifyRepository {\n private readonly metafieldRepo = inject(ShopifyMetafieldRepository);\n\n private resolveEnvironment(environment?: string): string {\n const trimmed = environment?.trim();\n return trimmed ? trimmed : 'production';\n }\n\n getPages(environment?: string): Observable<PageSummary[]> {\n const env = this.resolveEnvironment(environment);\n return this.metafieldRepo.getPageIndex(env).pipe(\n map(index => {\n return index.pages\n .map(entry => this.mapIndexEntryToSummary(entry))\n .sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));\n })\n );\n }\n\n getPage(id: string, environment?: string): Observable<Page> {\n const env = this.resolveEnvironment(environment);\n return this.metafieldRepo.getPageMetafield(id, env).pipe(\n map(page => {\n if (!page) {\n throw {\n code: 'PAGE_NOT_FOUND',\n message: `Page with id ${id} not found`,\n };\n }\n return page;\n })\n );\n }\n\n getPublishedPageBySlug(slug: string, environment?: string): Observable<Page> {\n const env = this.resolveEnvironment(environment);\n return this.metafieldRepo.getPageIndex(env).pipe(\n switchMap(index => {\n const entry = index.pages.find(\n p => p.slug === slug && p.status === 'published'\n );\n\n if (!entry) {\n return throwError(() => ({\n code: 'PAGE_NOT_FOUND',\n message: `Published page with slug '${slug}' not found`,\n }));\n }\n\n return this.getPage(entry.id, env);\n })\n );\n }\n\n createPage(request: CreatePageRequest, environment?: string): Observable<Page> {\n const env = this.resolveEnvironment(environment);\n return this.metafieldRepo.getPageIndex(env).pipe(\n switchMap(index => {\n this.validateUniqueSlug(request.slug, index);\n\n const newPage: Page = {\n id: crypto.randomUUID(),\n slug: request.slug,\n title: request.title,\n description: request.description,\n sections: [],\n status: 'draft',\n version: 1,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n\n const validation = this.metafieldRepo.validateSize(newPage);\n if (!validation.valid) {\n return throwError(() => ({\n code: 'SIZE_EXCEEDED',\n message: 'Page content exceeds 64KB limit',\n size: validation.size,\n maxSize: 64 * 1024,\n percentUsed: validation.percentUsed,\n }));\n }\n\n return this.metafieldRepo.setPageMetafield(newPage.id, newPage, env).pipe(\n switchMap(() => {\n const updatedIndex = this.addPageToIndex(index, newPage, validation.size);\n return this.metafieldRepo.updatePageIndex(updatedIndex, env);\n }),\n map(() => newPage)\n );\n })\n );\n }\n\n updatePage(id: string, request: UpdatePageRequest, environment?: string): Observable<Page> {\n const env = this.resolveEnvironment(environment);\n return this.getPage(id, env).pipe(\n switchMap(currentPage => {\n if (currentPage.version !== request.version) {\n return throwError(() => ({\n code: 'VERSION_CONFLICT',\n message: `Version mismatch: expected ${request.version}, got ${currentPage.version}`,\n currentVersion: currentPage.version,\n }));\n }\n\n return this.metafieldRepo.getPageIndex(env).pipe(\n switchMap(index => {\n if (request.slug && request.slug !== currentPage.slug) {\n this.validateUniqueSlug(request.slug, index, id);\n }\n\n const updatedPage: Page = {\n ...currentPage,\n title: request.title !== undefined ? request.title : currentPage.title,\n slug: request.slug !== undefined ? request.slug : currentPage.slug,\n description: request.description !== undefined ? request.description : currentPage.description,\n sections: request.sections !== undefined ? request.sections : currentPage.sections,\n version: currentPage.version + 1,\n updatedAt: new Date().toISOString(),\n };\n\n const validation = this.metafieldRepo.validateSize(updatedPage);\n if (!validation.valid) {\n return throwError(() => ({\n code: 'SIZE_EXCEEDED',\n message: 'Page content exceeds 64KB limit',\n size: validation.size,\n maxSize: 64 * 1024,\n percentUsed: validation.percentUsed,\n }));\n }\n\n return this.metafieldRepo.setPageMetafield(id, updatedPage, env).pipe(\n switchMap(() => {\n const updatedIndex = this.updatePageInIndex(index, updatedPage, validation.size);\n return this.metafieldRepo.updatePageIndex(updatedIndex, env);\n }),\n map(() => updatedPage)\n );\n })\n );\n })\n );\n }\n\n deletePage(id: string, environment?: string): Observable<void> {\n const env = this.resolveEnvironment(environment);\n return this.metafieldRepo.deletePageMetafield(id, env).pipe(\n switchMap(() => this.metafieldRepo.getPageIndex(env)),\n switchMap(index => {\n const updatedIndex = this.removePageFromIndex(index, id);\n return this.metafieldRepo.updatePageIndex(updatedIndex, env);\n }),\n map(() => undefined)\n );\n }\n\n publishPage(id: string, request: PublishPageRequest, environment?: string): Observable<Page> {\n const env = this.resolveEnvironment(environment);\n return this.getPage(id, env).pipe(\n switchMap(currentPage => {\n if (currentPage.version !== request.version) {\n return throwError(() => ({\n code: 'VERSION_CONFLICT',\n message: `Version mismatch: expected ${request.version}, got ${currentPage.version}`,\n currentVersion: currentPage.version,\n }));\n }\n\n const publishedPage: Page = {\n ...currentPage,\n status: 'published',\n publishedAt: new Date().toISOString(),\n version: currentPage.version + 1,\n updatedAt: new Date().toISOString(),\n };\n\n const validation = this.metafieldRepo.validateSize(publishedPage);\n\n return this.metafieldRepo.setPageMetafield(id, publishedPage, env).pipe(\n switchMap(() => this.metafieldRepo.getPageIndex(env)),\n switchMap(index => {\n const updatedIndex = this.updatePageInIndex(index, publishedPage, validation.size);\n return this.metafieldRepo.updatePageIndex(updatedIndex, env);\n }),\n map(() => publishedPage)\n );\n })\n );\n }\n\n unpublishPage(id: string, request: PublishPageRequest, environment?: string): Observable<Page> {\n const env = this.resolveEnvironment(environment);\n return this.getPage(id, env).pipe(\n switchMap(currentPage => {\n if (currentPage.version !== request.version) {\n return throwError(() => ({\n code: 'VERSION_CONFLICT',\n message: `Version mismatch: expected ${request.version}, got ${currentPage.version}`,\n currentVersion: currentPage.version,\n }));\n }\n\n if (currentPage.status !== 'published') {\n return throwError(() => ({\n code: 'PAGE_NOT_PUBLISHED',\n message: 'Page is not published',\n }));\n }\n\n const unpublishedPage: Page = {\n ...currentPage,\n status: 'draft',\n publishedAt: undefined,\n version: currentPage.version + 1,\n updatedAt: new Date().toISOString(),\n };\n\n const validation = this.metafieldRepo.validateSize(unpublishedPage);\n\n return this.metafieldRepo.setPageMetafield(id, unpublishedPage, env).pipe(\n switchMap(() => this.metafieldRepo.getPageIndex(env)),\n switchMap(index => {\n const updatedIndex = this.updatePageInIndex(index, unpublishedPage, validation.size);\n return this.metafieldRepo.updatePageIndex(updatedIndex, env);\n }),\n map(() => unpublishedPage)\n );\n })\n );\n }\n\n duplicatePage(id: string, environment?: string): Observable<Page> {\n const env = this.resolveEnvironment(environment);\n return this.getPage(id, env).pipe(\n switchMap(sourcePage => {\n return this.metafieldRepo.getPageIndex(env).pipe(\n switchMap(index => {\n const newSlug = this.generateUniqueSlug(sourcePage.slug, index);\n\n const duplicatedPage: Page = {\n ...sourcePage,\n id: crypto.randomUUID(),\n slug: newSlug,\n title: `${sourcePage.title} (Copy)`,\n status: 'draft',\n version: 1,\n publishedAt: undefined,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n\n const validation = this.metafieldRepo.validateSize(duplicatedPage);\n if (!validation.valid) {\n return throwError(() => ({\n code: 'SIZE_EXCEEDED',\n message: 'Duplicated page content exceeds 64KB limit',\n size: validation.size,\n maxSize: 64 * 1024,\n percentUsed: validation.percentUsed,\n }));\n }\n\n return this.metafieldRepo.setPageMetafield(duplicatedPage.id, duplicatedPage, env).pipe(\n switchMap(() => {\n const updatedIndex = this.addPageToIndex(index, duplicatedPage, validation.size);\n return this.metafieldRepo.updatePageIndex(updatedIndex, env);\n }),\n map(() => duplicatedPage)\n );\n })\n );\n })\n );\n }\n\n deletePagesByEnvironment(environment?: string): Observable<void> {\n const env = this.resolveEnvironment(environment);\n return this.metafieldRepo.getPageIndex(env).pipe(\n switchMap(index => {\n const deletions = index.pages.map(entry =>\n this.metafieldRepo.deletePageMetafield(entry.id, env)\n );\n\n if (deletions.length === 0) {\n return this.metafieldRepo.resetPageIndex(env).pipe(map(() => undefined));\n }\n\n return forkJoin(deletions).pipe(\n switchMap(() => this.metafieldRepo.resetPageIndex(env)),\n map(() => undefined)\n );\n })\n );\n }\n\n private validateUniqueSlug(slug: string, index: PagesIndex, excludeId?: string): void {\n const existingPage = index.pages.find(p => p.slug === slug && p.id !== excludeId);\n\n if (existingPage) {\n throw {\n code: 'DUPLICATE_SLUG',\n message: `Page with slug '${slug}' already exists`,\n };\n }\n }\n\n private generateUniqueSlug(baseSlug: string, index: PagesIndex): string {\n let counter = 1;\n let newSlug = `${baseSlug}-copy`;\n\n while (index.pages.some(p => p.slug === newSlug)) {\n counter++;\n newSlug = `${baseSlug}-copy-${counter}`;\n }\n\n return newSlug;\n }\n\n private addPageToIndex(index: PagesIndex, page: Page, size: number): PagesIndex {\n const entry: PageIndexEntry = {\n id: page.id,\n slug: page.slug,\n title: page.title,\n status: page.status,\n updatedAt: page.updatedAt,\n publishedAt: page.publishedAt,\n size,\n };\n\n return {\n ...index,\n pages: [...index.pages, entry],\n };\n }\n\n private updatePageInIndex(index: PagesIndex, page: Page, size: number): PagesIndex {\n const updatedPages = index.pages.map(entry => {\n if (entry.id === page.id) {\n return {\n id: page.id,\n slug: page.slug,\n title: page.title,\n status: page.status,\n updatedAt: page.updatedAt,\n publishedAt: page.publishedAt,\n size,\n };\n }\n return entry;\n });\n\n return {\n ...index,\n pages: updatedPages,\n };\n }\n\n private removePageFromIndex(index: PagesIndex, pageId: string): PagesIndex {\n return {\n ...index,\n pages: index.pages.filter(entry => entry.id !== pageId),\n };\n }\n\n private mapIndexEntryToSummary(entry: PageIndexEntry): PageSummary {\n return {\n id: entry.id,\n slug: entry.slug,\n title: entry.title,\n status: entry.status,\n updatedAt: entry.updatedAt,\n publishedAt: entry.publishedAt,\n };\n }\n}\n","import { inject, Injectable, InjectionToken } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport {\n CreatePageRequest,\n Page,\n PageSummary,\n PublishPageRequest,\n UpdatePageRequest,\n} from '../models/page.model';\nimport { PageMemoryRepository } from './page-memory.repository';\nimport { PageShopifyRepository } from './page-shopify-repository.service';\n\n/**\n * Injection token to enable in-memory page storage (for development)\n * When false (default), uses Shopify metafields via GraphQL API\n */\nexport const USE_IN_MEMORY_PAGES = new InjectionToken<boolean>('USE_IN_MEMORY_PAGES', {\n providedIn: 'root',\n factory: () => false,\n});\n\n/**\n * Injection token for page environment (metafield key prefix).\n * Default is 'production'.\n */\nexport const PAGE_ENVIRONMENT = new InjectionToken<string>('PAGE_ENVIRONMENT', {\n providedIn: 'root',\n factory: () => 'production',\n});\n\n@Injectable({ providedIn: 'root' })\nexport class PageService {\n private readonly useInMemory = inject(USE_IN_MEMORY_PAGES);\n private readonly pageEnvironment = inject(PAGE_ENVIRONMENT);\n private readonly memoryRepo = inject(PageMemoryRepository);\n private readonly shopifyRepo = inject(PageShopifyRepository);\n\n private resolveEnvironment(environment?: string): string {\n const trimmed = environment?.trim();\n return trimmed ? trimmed : this.pageEnvironment;\n }\n\n /**\n * Get all pages (summaries only for listing)\n */\n getPages(environment?: string): Observable<PageSummary[]> {\n const env = this.resolveEnvironment(environment);\n if (this.useInMemory) {\n return this.memoryRepo.getPages(env);\n }\n return this.shopifyRepo.getPages(env);\n }\n\n /**\n * Get a single page by ID (full content)\n */\n getPage(id: string, environment?: string): Observable<Page> {\n const env = this.resolveEnvironment(environment);\n if (this.useInMemory) {\n return this.memoryRepo.getPage(id, env);\n }\n return this.shopifyRepo.getPage(id, env);\n }\n\n /**\n * Get a published page by slug (for public rendering)\n */\n getPublishedPageBySlug(slug: string, environment?: string): Observable<Page> {\n const env = this.resolveEnvironment(environment);\n if (this.useInMemory) {\n return this.memoryRepo.getPublishedPageBySlug(slug, env);\n }\n return this.shopifyRepo.getPublishedPageBySlug(slug, env);\n }\n\n /**\n * Create a new page\n */\n createPage(request: CreatePageRequest, environment?: string): Observable<Page> {\n const env = this.resolveEnvironment(environment);\n if (this.useInMemory) {\n return this.memoryRepo.createPage(request, env);\n }\n return this.shopifyRepo.createPage(request, env);\n }\n\n /**\n * Update an existing page\n */\n updatePage(id: string, request: UpdatePageRequest, environment?: string): Observable<Page> {\n const env = this.resolveEnvironment(environment);\n if (this.useInMemory) {\n return this.memoryRepo.updatePage(id, request, env);\n }\n return this.shopifyRepo.updatePage(id, request, env);\n }\n\n /**\n * Delete a page\n */\n deletePage(id: string, environment?: string): Observable<void> {\n const env = this.resolveEnvironment(environment);\n if (this.useInMemory) {\n return this.memoryRepo.deletePage(id, env);\n }\n return this.shopifyRepo.deletePage(id, env);\n }\n\n /**\n * Publish a page (changes status to 'published')\n */\n publishPage(id: string, request: PublishPageRequest, environment?: string): Observable<Page> {\n const env = this.resolveEnvironment(environment);\n if (this.useInMemory) {\n return this.memoryRepo.publishPage(id, request, env);\n }\n return this.shopifyRepo.publishPage(id, request, env);\n }\n\n /**\n * Unpublish a page (changes status to 'draft')\n */\n unpublishPage(id: string, request: PublishPageRequest, environment?: string): Observable<Page> {\n const env = this.resolveEnvironment(environment);\n if (this.useInMemory) {\n return this.memoryRepo.unpublishPage(id, request, env);\n }\n return this.shopifyRepo.unpublishPage(id, request, env);\n }\n\n /**\n * Duplicate an existing page\n */\n duplicatePage(id: string, environment?: string): Observable<Page> {\n const env = this.resolveEnvironment(environment);\n if (this.useInMemory) {\n return this.memoryRepo.duplicatePage(id, env);\n }\n return this.shopifyRepo.duplicatePage(id, env);\n }\n\n /**\n * Delete all pages for a given environment\n */\n deletePagesByEnvironment(environment?: string): Observable<void> {\n const env = this.resolveEnvironment(environment);\n if (this.useInMemory) {\n return this.memoryRepo.deletePagesByEnvironment(env);\n }\n return this.shopifyRepo.deletePagesByEnvironment(env);\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { Page } from '../models/page.model';\nimport { PageService } from '../services/page.service';\nimport { VisualEditorNavigation } from '../navigation/visual-editor-navigation.types';\n\n/**\n * Abstract strategy for loading pages into the editor\n * Consumers can implement custom strategies for different use cases\n */\nexport abstract class PageLoadingStrategy {\n /**\n * Load a page by ID\n */\n abstract loadPage(pageId: string): Observable<Page>;\n\n /**\n * Get the current page ID to load\n * This abstracts the source of the page ID (route, input, etc.)\n */\n abstract getPageIdToLoad(): Observable<string | null>;\n}\n\n/**\n * Default strategy that uses route params via the navigation service\n */\n@Injectable()\nexport class RoutePageLoadingStrategy extends PageLoadingStrategy {\n private readonly pageService = inject(PageService);\n private readonly navigation = inject(VisualEditorNavigation);\n\n loadPage(pageId: string): Observable<Page> {\n return this.pageService.getPage(pageId);\n }\n\n getPageIdToLoad(): Observable<string | null> {\n return this.navigation.getCurrentPageId();\n }\n}\n\n/**\n * Input-based strategy for when page is passed via component input\n * Useful for embedding the editor in modals or custom layouts\n */\n@Injectable()\nexport class InputPageLoadingStrategy extends PageLoadingStrategy {\n private readonly pageService = inject(PageService);\n private readonly pageId$ = new BehaviorSubject<string | null>(null);\n\n /**\n * Set the page ID to load\n * Call this when the input changes\n */\n setPageId(pageId: string | null): void {\n this.pageId$.next(pageId);\n }\n\n loadPage(pageId: string): Observable<Page> {\n return this.pageService.getPage(pageId);\n }\n\n getPageIdToLoad(): Observable<string | null> {\n return this.pageId$.asObservable();\n }\n}\n","import { InjectionToken, Type } from '@angular/core';\nimport { VisualEditorNavigation } from '../navigation/visual-editor-navigation.types';\nimport { PageLoadingStrategy } from '../page-loading/page-loading-strategy.types';\nimport { RouterNavigationConfig } from '../navigation/default-router-navigation.service';\n\n/**\n * Main configuration interface for the Visual Editor library\n */\nexport interface VisualEditorConfig {\n /**\n * Navigation configuration\n */\n navigation?: {\n /**\n * Custom navigation service class\n * If provided, routerConfig is ignored\n */\n navigationService?: Type<VisualEditorNavigation>;\n\n /**\n * Router-based config (used with DefaultRouterNavigationService)\n * Only used if navigationService is not provided\n */\n routerConfig?: Partial<RouterNavigationConfig>;\n };\n\n /**\n * Page loading configuration\n */\n pageLoading?: {\n /**\n * Custom page loading strategy\n * Defaults to RoutePageLoadingStrategy\n */\n strategy?: Type<PageLoadingStrategy>;\n };\n\n /**\n * Page service configuration\n */\n pages?: {\n /**\n * Use in-memory storage instead of Shopify\n * Useful for development and demos\n * Defaults to false (uses Shopify)\n */\n useInMemory?: boolean;\n };\n\n /**\n * UI configuration\n */\n ui?: {\n /**\n * Show back button in editor toolbar\n * Defaults to true\n */\n showBackButton?: boolean;\n\n /**\n * Show publish/unpublish buttons\n * Defaults to true\n */\n showPublishButtons?: boolean;\n\n /**\n * Show save button\n * Defaults to true\n */\n showSaveButton?: boolean;\n };\n}\n\n/**\n * Injection token for the Visual Editor configuration\n */\nexport const VISUAL_EDITOR_CONFIG = new InjectionToken<VisualEditorConfig>(\n 'VISUAL_EDITOR_CONFIG',\n {\n providedIn: 'root',\n factory: () => ({}),\n }\n);\n\n/**\n * Default configuration values\n */\nexport const DEFAULT_VISUAL_EDITOR_CONFIG: Required<VisualEditorConfig> = {\n navigation: {},\n pageLoading: {},\n pages: {\n useInMemory: false,\n },\n ui: {\n showBackButton: true,\n showPublishButtons: true,\n showSaveButton: true,\n },\n};\n","import { EnvironmentProviders, makeEnvironmentProviders, Provider } from '@angular/core';\n\n// Note: NgRx store should be provided by the consumer app via provideStore()\n// We only provide our feature state through provideVisualEditorStore()\n\n// Navigation\nimport { VisualEditorNavigation } from './navigation/visual-editor-navigation.types';\nimport {\n DefaultRouterNavigationService,\n DEFAULT_ROUTER_NAVIGATION_CONFIG,\n ROUTER_NAVIGATION_CONFIG,\n} from './navigation/default-router-navigation.service';\n\n// Page Loading\nimport { PageLoadingStrategy, RoutePageLoadingStrategy } from './page-loading/page-loading-strategy.types';\n\n// Config\nimport { VisualEditorConfig, VISUAL_EDITOR_CONFIG } from './config/visual-editor-config.types';\n\n// Services\nimport { USE_IN_MEMORY_PAGES } from './services/page.service';\n\n/**\n * Provides all necessary services and configuration for the Visual Editor\n *\n * Note: You must also call provideVisualEditorStore() to set up the NgRx state.\n *\n * @example\n * ```typescript\n * // Minimal setup (uses Shopify by default)\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideStore(),\n * provideVisualEditorStore(), // Required: sets up NgRx state\n * provideVisualEditor(), // Sets up services and config\n * provideEditorComponents(myComponents),\n * ],\n * };\n *\n * // With custom configuration\n * provideVisualEditor({\n * navigation: {\n * routerConfig: {\n * pageListPath: '/cms',\n * pageEditPath: '/cms/editor/:id',\n * pageIdParam: 'id',\n * }\n * },\n * pages: {\n * useInMemory: true // Use in-memory storage for development\n * }\n * })\n * ```\n */\nexport function provideVisualEditor(config: VisualEditorConfig = {}): EnvironmentProviders {\n const providers: Provider[] = [\n // Configuration\n { provide: VISUAL_EDITOR_CONFIG, useValue: config },\n\n // Page storage configuration\n {\n provide: USE_IN_MEMORY_PAGES,\n useValue: config.pages?.useInMemory ?? false,\n },\n ];\n\n // Navigation provider\n if (config.navigation?.navigationService) {\n // Custom navigation service provided\n providers.push({\n provide: VisualEditorNavigation,\n useClass: config.navigation.navigationService,\n });\n } else {\n // Use default router-based navigation\n providers.push(\n {\n provide: ROUTER_NAVIGATION_CONFIG,\n useValue: {\n ...DEFAULT_ROUTER_NAVIGATION_CONFIG,\n ...config.navigation?.routerConfig,\n },\n },\n {\n provide: VisualEditorNavigation,\n useClass: DefaultRouterNavigationService,\n }\n );\n }\n\n // Page loading strategy\n if (config.pageLoading?.strategy) {\n providers.push({\n provide: PageLoadingStrategy,\n useClass: config.pageLoading.strategy,\n });\n } else {\n providers.push({\n provide: PageLoadingStrategy,\n useClass: RoutePageLoadingStrategy,\n });\n }\n\n return makeEnvironmentProviders(providers);\n}\n","import { PageContext } from '../models/page.model';\n\nexport interface EditorElement {\n id: string;\n type: string;\n props: Record<string, unknown>;\n slotName?: string;\n children?: EditorElement[];\n adminLabel?: string;\n}\n\nexport interface EditorSection {\n id: string;\n type: string;\n props: Record<string, unknown>;\n elements: EditorElement[];\n adminLabel?: string;\n}\n\nexport interface HistoryEntry {\n sections: EditorSection[];\n timestamp: number;\n actionType: string;\n}\n\nexport interface VisualEditorState {\n sections: EditorSection[];\n selectedElementId: string | null;\n selectedSectionId: string | null;\n isDragging: boolean;\n draggedElementId: string | null;\n history: HistoryEntry[];\n historyIndex: number;\n maxHistorySize: number;\n // Page management\n currentPage: PageContext | null;\n isDirty: boolean;\n}\n\nexport const initialVisualEditorState: VisualEditorState = {\n sections: [],\n selectedElementId: null,\n selectedSectionId: null,\n isDragging: false,\n draggedElementId: null,\n history: [],\n historyIndex: -1,\n maxHistorySize: 50,\n currentPage: null,\n isDirty: false,\n};\n\nexport const VISUAL_EDITOR_FEATURE_KEY = 'visualEditor';","import { createActionGroup, emptyProps, props } from '@ngrx/store';\nimport { EditorElement, EditorSection } from './visual-editor.state';\nimport { Page, PageContext } from '../models/page.model';\n\nexport const VisualEditorActions = createActionGroup({\n source: 'Visual Editor',\n events: {\n // Section actions\n 'Add Section': props<{ section: EditorSection; index?: number }>(),\n 'Remove Section': props<{ sectionId: string }>(),\n 'Move Section': props<{ sectionId: string; newIndex: number }>(),\n 'Update Section': props<{ sectionId: string; changes: Partial<EditorSection> }>(),\n 'Update Section Props': props<{ sectionId: string; props: Record<string, unknown> }>(),\n\n // Element actions\n 'Add Element': props<{ sectionId: string; element: EditorElement; index?: number }>(),\n 'Remove Element': props<{ sectionId: string; elementId: string }>(),\n 'Move Element': props<{\n sourceSectionId: string;\n targetSectionId: string;\n elementId: string;\n newIndex: number;\n }>(),\n 'Update Element': props<{\n sectionId: string;\n elementId: string;\n changes: Partial<EditorElement>;\n }>(),\n 'Update Element Props': props<{\n sectionId: string;\n elementId: string;\n props: Record<string, unknown>;\n }>(),\n\n // Block actions (elements within section slots)\n 'Add Block': props<{\n sectionId: string;\n slotName: string;\n element: EditorElement;\n index?: number;\n }>(),\n 'Remove Block': props<{ sectionId: string; elementId: string }>(),\n 'Move Block': props<{\n sectionId: string;\n elementId: string;\n targetSlotName: string;\n newIndex: number;\n }>(),\n 'Update Block Props': props<{\n sectionId: string;\n elementId: string;\n props: Record<string, unknown>;\n }>(),\n\n // Rename actions\n 'Rename Section': props<{ sectionId: string; adminLabel: string }>(),\n 'Rename Block': props<{ sectionId: string; elementId: string; adminLabel: string }>(),\n\n // Duplicate actions\n 'Duplicate Section': props<{ sectionId: string }>(),\n 'Duplicate Block': props<{ sectionId: string; elementId: string }>(),\n 'Duplicate Nested Block': props<{ sectionId: string; parentPath: string[]; elementId: string }>(),\n\n // Nested block actions (blocks within blocks)\n 'Add Nested Block': props<{\n sectionId: string;\n parentPath: string[]; // IDs from section to parent element\n slotName: string;\n element: EditorElement;\n index?: number;\n }>(),\n 'Remove Nested Block': props<{\n sectionId: string;\n parentPath: string[];\n elementId: string;\n }>(),\n 'Update Nested Block Props': props<{\n sectionId: string;\n parentPath: string[];\n elementId: string;\n props: Record<string, unknown>;\n }>(),\n 'Move Nested Block': props<{\n sectionId: string;\n parentPath: string[];\n elementId: string;\n targetSlotName: string;\n newIndex: number;\n }>(),\n 'Reparent Block': props<{\n sourceSectionId: string;\n sourceParentPath: string[];\n elementId: string;\n targetSectionId: string;\n targetParentPath: string[];\n targetSlotName: string;\n targetIndex: number;\n }>(),\n\n // Selection actions\n 'Select Element': props<{ sectionId: string | null; elementId: string | null }>(),\n 'Clear Selection': emptyProps(),\n\n // Drag actions\n 'Start Drag': props<{ elementId: string }>(),\n 'End Drag': emptyProps(),\n\n // History actions\n 'Undo': emptyProps(),\n 'Redo': emptyProps(),\n 'Clear History': emptyProps(),\n\n // Bulk actions\n 'Load Sections': props<{ sections: EditorSection[] }>(),\n 'Reset Editor': emptyProps(),\n\n // Page actions\n 'Load Page': props<{ page: Page }>(),\n 'Update Page Context': props<{ context: Partial<PageContext> }>(),\n 'Mark Dirty': emptyProps(),\n 'Mark Clean': emptyProps(),\n 'Clear Page': emptyProps(),\n },\n});","import { createReducer, on } from '@ngrx/store';\nimport { VisualEditorActions } from './visual-editor.actions';\nimport {\n EditorElement,\n EditorSection,\n HistoryEntry,\n initialVisualEditorState,\n VisualEditorState,\n} from './visual-editor.state';\n\nfunction pushToHistory(\n state: VisualEditorState,\n actionType: string\n): Pick<VisualEditorState, 'history' | 'historyIndex' | 'isDirty'> {\n const entry: HistoryEntry = {\n sections: structuredClone(state.sections),\n timestamp: Date.now(),\n actionType,\n };\n\n const newHistory = state.history.slice(0, state.historyIndex + 1);\n newHistory.push(entry);\n\n if (newHistory.length > state.maxHistorySize) {\n newHistory.shift();\n }\n\n return {\n history: newHistory,\n historyIndex: newHistory.length - 1,\n isDirty: true,\n };\n}\n\nfunction updateSection(\n sections: EditorSection[],\n sectionId: string,\n updater: (section: EditorSection) => EditorSection\n): EditorSection[] {\n return sections.map((section) => (section.id === sectionId ? updater(section) : section));\n}\n\nfunction deepCloneElement(element: EditorElement): EditorElement {\n return {\n ...element,\n id: crypto.randomUUID(),\n props: { ...element.props },\n children: element.children?.map((child) => deepCloneElement(child)),\n };\n}\n\n/**\n * Recursively find and update an element by following a path of IDs\n * @param elements - Array of elements to search in\n * @param path - Array of element IDs to follow (excluding the target)\n * @param updater - Function to update the parent element's children\n */\nfunction updateNestedElements(\n elements: EditorElement[],\n path: string[],\n updater: (children: EditorElement[]) => EditorElement[]\n): EditorElement[] {\n if (path.length === 0) {\n return updater(elements);\n }\n\n const [currentId, ...remainingPath] = path;\n\n return elements.map((element) => {\n if (element.id !== currentId) {\n return element;\n }\n\n if (remainingPath.length === 0) {\n // We've reached the parent, update its children\n return {\n ...element,\n children: updater(element.children ?? []),\n };\n }\n\n // Continue down the path\n return {\n ...element,\n children: updateNestedElements(element.children ?? [], remainingPath, updater),\n };\n });\n}\n\n/**\n * Add a child element to a nested parent\n */\nfunction addNestedChild(\n elements: EditorElement[],\n path: string[],\n child: EditorElement,\n slotName: string,\n index?: number\n): EditorElement[] {\n const childWithSlot = { ...child, slotName };\n\n return updateNestedElements(elements, path, (children) => {\n const slotChildren = children.filter((c) => c.slotName === slotName);\n const otherChildren = children.filter((c) => c.slotName !== slotName);\n const insertIndex = index !== undefined ? index : slotChildren.length;\n\n const newSlotChildren = [\n ...slotChildren.slice(0, insertIndex),\n childWithSlot,\n ...slotChildren.slice(insertIndex),\n ];\n\n return [...otherChildren, ...newSlotChildren];\n });\n}\n\n/**\n * Remove a child element from a nested parent\n */\nfunction removeNestedChild(\n elements: EditorElement[],\n path: string[],\n childId: string\n): EditorElement[] {\n return updateNestedElements(elements, path, (children) =>\n children.filter((c) => c.id !== childId)\n );\n}\n\n/**\n * Update props of a nested child element\n */\nfunction updateNestedChildProps(\n elements: EditorElement[],\n path: string[],\n childId: string,\n props: Record<string, unknown>\n): EditorElement[] {\n return updateNestedElements(elements, path, (children) =>\n children.map((c) =>\n c.id === childId ? { ...c, props: { ...c.props, ...props } } : c\n )\n );\n}\n\n/**\n * Recursively update adminLabel of an element by ID anywhere in the tree\n */\nfunction updateElementAdminLabelRecursive(\n elements: EditorElement[],\n elementId: string,\n adminLabel: string\n): EditorElement[] {\n return elements.map((element) => {\n if (element.id === elementId) {\n return { ...element, adminLabel: adminLabel || undefined };\n }\n if (element.children && element.children.length > 0) {\n return {\n ...element,\n children: updateElementAdminLabelRecursive(element.children, elementId, adminLabel),\n };\n }\n return element;\n });\n}\n\n/**\n * Recursively update props of an element by ID anywhere in the tree\n */\nfunction updateElementPropsRecursive(\n elements: EditorElement[],\n elementId: string,\n props: Record<string, unknown>\n): EditorElement[] {\n return elements.map((element) => {\n if (element.id === elementId) {\n return { ...element, props: { ...element.props, ...props } };\n }\n if (element.children && element.children.length > 0) {\n return {\n ...element,\n children: updateElementPropsRecursive(element.children, elementId, props),\n };\n }\n return element;\n });\n}\n\n/**\n * Move a nested child within its parent (can change slots)\n */\nfunction moveNestedChild(\n elements: EditorElement[],\n path: string[],\n childId: string,\n targetSlotName: string,\n newIndex: number\n): EditorElement[] {\n return updateNestedElements(elements, path, (children) => {\n const child = children.find((c) => c.id === childId);\n if (!child) return children;\n\n const updatedChild = { ...child, slotName: targetSlotName };\n const childrenWithoutTarget = children.filter((c) => c.id !== childId);\n const targetSlotChildren = childrenWithoutTarget.filter((c) => c.slotName === targetSlotName);\n const otherChildren = childrenWithoutTarget.filter((c) => c.slotName !== targetSlotName);\n\n const newTargetChildren = [\n ...targetSlotChildren.slice(0, newIndex),\n updatedChild,\n ...targetSlotChildren.slice(newIndex),\n ];\n\n return [...otherChildren, ...newTargetChildren];\n });\n}\n\n/**\n * Find an element by ID anywhere in the tree and return it\n */\nfunction findNestedElement(elements: EditorElement[], elementId: string): EditorElement | null {\n for (const el of elements) {\n if (el.id === elementId) return el;\n if (el.children?.length) {\n const found = findNestedElement(el.children, elementId);\n if (found) return found;\n }\n }\n return null;\n}\n\nexport const visualEditorReducer = createReducer(\n initialVisualEditorState,\n\n // Section actions\n on(VisualEditorActions.addSection, (state, { section, index }) => {\n const sections =\n index !== undefined\n ? [...state.sections.slice(0, index), section, ...state.sections.slice(index)]\n : [...state.sections, section];\n\n return {\n ...state,\n sections,\n ...pushToHistory(state, 'Add Section'),\n };\n }),\n\n on(VisualEditorActions.removeSection, (state, { sectionId }) => ({\n ...state,\n sections: state.sections.filter((s) => s.id !== sectionId),\n selectedSectionId: state.selectedSectionId === sectionId ? null : state.selectedSectionId,\n selectedElementId:\n state.sections.find((s) => s.id === sectionId)?.elements.some((e) => e.id === state.selectedElementId)\n ? null\n : state.selectedElementId,\n ...pushToHistory(state, 'Remove Section'),\n })),\n\n on(VisualEditorActions.moveSection, (state, { sectionId, newIndex }) => {\n const currentIndex = state.sections.findIndex((s) => s.id === sectionId);\n if (currentIndex === -1 || currentIndex === newIndex) return state;\n\n const sections = [...state.sections];\n const [removed] = sections.splice(currentIndex, 1);\n sections.splice(newIndex, 0, removed);\n\n return {\n ...state,\n sections,\n ...pushToHistory(state, 'Move Section'),\n };\n }),\n\n on(VisualEditorActions.updateSection, (state, { sectionId, changes }) => ({\n ...state,\n sections: updateSection(state.sections, sectionId, (section) => ({\n ...section,\n ...changes,\n })),\n ...pushToHistory(state, 'Update Section'),\n })),\n\n on(VisualEditorActions.updateSectionProps, (state, { sectionId, props }) => ({\n ...state,\n sections: updateSection(state.sections, sectionId, (section) => ({\n ...section,\n props: { ...section.props, ...props },\n })),\n ...pushToHistory(state, 'Update Section Props'),\n })),\n\n // Rename actions\n on(VisualEditorActions.renameSection, (state, { sectionId, adminLabel }) => ({\n ...state,\n sections: updateSection(state.sections, sectionId, (section) => ({\n ...section,\n adminLabel: adminLabel || undefined,\n })),\n ...pushToHistory(state, 'Rename Section'),\n })),\n\n on(VisualEditorActions.renameBlock, (state, { sectionId, elementId, adminLabel }) => ({\n ...state,\n sections: updateSection(state.sections, sectionId, (section) => ({\n ...section,\n elements: updateElementAdminLabelRecursive(section.elements, elementId, adminLabel),\n })),\n ...pushToHistory(state, 'Rename Block'),\n })),\n\n // Element actions\n on(VisualEditorActions.addElement, (state, { sectionId, element, index }) => ({\n ...state,\n sections: updateSection(state.sections, sectionId, (section) => ({\n ...section,\n elements:\n index !== undefined\n ? [...section.elements.slice(0, index), element, ...section.elements.slice(index)]\n : [...section.elements, element],\n })),\n ...pushToHistory(state, 'Add Element'),\n })),\n\n on(VisualEditorActions.removeElement, (state, { sectionId, elementId }) => ({\n ...state,\n sections: updateSection(state.sections, sectionId, (section) => ({\n ...section,\n elements: section.elements.filter((e) => e.id !== elementId),\n })),\n selectedElementId: state.selectedElementId === elementId ? null : state.selectedElementId,\n ...pushToHistory(state, 'Remove Element'),\n })),\n\n on(VisualEditorActions.moveElement, (state, { sourceSectionId, targetSectionId, elementId, newIndex }) => {\n const sourceSection = state.sections.find((s) => s.id === sourceSectionId);\n const element = sourceSection?.elements.find((e) => e.id === elementId);\n if (!element) return state;\n\n let sections = updateSection(state.sections, sourceSectionId, (section) => ({\n ...section,\n elements: section.elements.filter((e) => e.id !== elementId),\n }));\n\n sections = updateSection(sections, targetSectionId, (section) => ({\n ...section,\n elements: [...section.elements.slice(0, newIndex), element, ...section.elements.slice(newIndex)],\n }));\n\n return {\n ...state,\n sections,\n ...pushToHistory(state, 'Move Element'),\n };\n }),\n\n on(VisualEditorActions.updateElement, (state, { sectionId, elementId, changes }) => ({\n ...state,\n sections: updateSection(state.sections, sectionId, (section) => ({\n ...section,\n elements: section.elements.map((e) => (e.id === elementId ? { ...e, ...changes } : e)),\n })),\n ...pushToHistory(state, 'Update Element'),\n })),\n\n on(VisualEditorActions.updateElementProps, (state, { sectionId, elementId, props }) => ({\n ...state,\n sections: updateSection(state.sections, sectionId, (section) => ({\n ...section,\n elements: section.elements.map((e) =>\n e.id === elementId ? { ...e, props: { ...e.props, ...props } } : e\n ),\n })),\n ...pushToHistory(state, 'Update Element Props'),\n })),\n\n // Block actions (elements within section slots)\n on(VisualEditorActions.addBlock, (state, { sectionId, slotName, element, index }) => {\n const blockWithSlot = { ...element, slotName };\n return {\n ...state,\n sections: updateSection(state.sections, sectionId, (section) => {\n const slotBlocks = section.elements.filter((e) => e.slotName === slotName);\n const otherBlocks = section.elements.filter((e) => e.slotName !== slotName);\n const insertIndex = index !== undefined ? index : slotBlocks.length;\n const newSlotBlocks = [\n ...slotBlocks.slice(0, insertIndex),\n blockWithSlot,\n ...slotBlocks.slice(insertIndex),\n ];\n return {\n ...section,\n elements: [...otherBlocks, ...newSlotBlocks],\n };\n }),\n ...pushToHistory(state, 'Add Block'),\n };\n }),\n\n on(VisualEditorActions.removeBlock, (state, { sectionId, elementId }) => ({\n ...state,\n sections: updateSection(state.sections, sectionId, (section) => ({\n ...section,\n elements: section.elements.filter((e) => e.id !== elementId),\n })),\n selectedElementId: state.selectedElementId === elementId ? null : state.selectedElementId,\n ...pushToHistory(state, 'Remove Block'),\n })),\n\n on(VisualEditorActions.moveBlock, (state, { sectionId, elementId, targetSlotName, newIndex }) => ({\n ...state,\n sections: updateSection(state.sections, sectionId, (section) => {\n const block = section.elements.find((e) => e.id === elementId);\n if (!block) return section;\n\n const updatedBlock = { ...block, slotName: targetSlotName };\n const elementsWithoutBlock = section.elements.filter((e) => e.id !== elementId);\n const targetSlotBlocks = elementsWithoutBlock.filter((e) => e.slotName === targetSlotName);\n const otherBlocks = elementsWithoutBlock.filter((e) => e.slotName !== targetSlotName);\n\n const newTargetBlocks = [\n ...targetSlotBlocks.slice(0, newIndex),\n updatedBlock,\n ...targetSlotBlocks.slice(newIndex),\n ];\n\n return {\n ...section,\n elements: [...otherBlocks, ...newTargetBlocks],\n };\n }),\n ...pushToHistory(state, 'Move Block'),\n })),\n\n // Duplicate actions\n on(VisualEditorActions.duplicateSection, (state, { sectionId }) => {\n const index = state.sections.findIndex((s) => s.id === sectionId);\n if (index === -1) return state;\n\n const original = state.sections[index];\n const clone: EditorSection = {\n ...original,\n id: crypto.randomUUID(),\n props: { ...original.props },\n elements: original.elements.map((el) => deepCloneElement(el)),\n };\n\n const sections = [\n ...state.sections.slice(0, index + 1),\n clone,\n ...state.sections.slice(index + 1),\n ];\n\n return {\n ...state,\n sections,\n ...pushToHistory(state, 'Duplicate Section'),\n };\n }),\n\n on(VisualEditorActions.duplicateBlock, (state, { sectionId, elementId }) => ({\n ...state,\n sections: updateSection(state.sections, sectionId, (section) => {\n const index = section.elements.findIndex((e) => e.id === elementId);\n if (index === -1) return section;\n\n const clone = deepCloneElement(section.elements[index]);\n return {\n ...section,\n elements: [\n ...section.elements.slice(0, index + 1),\n clone,\n ...section.elements.slice(index + 1),\n ],\n };\n }),\n ...pushToHistory(state, 'Duplicate Block'),\n })),\n\n on(VisualEditorActions.duplicateNestedBlock, (state, { sectionId, parentPath, elementId }) => ({\n ...state,\n sections: updateSection(state.sections, sectionId, (section) => ({\n ...section,\n elements: updateNestedElements(section.elements, parentPath, (children) => {\n const index = children.findIndex((c) => c.id === elementId);\n if (index === -1) return children;\n\n const clone = deepCloneElement(children[index]);\n return [\n ...children.slice(0, index + 1),\n clone,\n ...children.slice(index + 1),\n ];\n }),\n })),\n ...pushToHistory(state, 'Duplicate Nested Block'),\n })),\n\n on(VisualEditorActions.updateBlockProps, (state, { sectionId, elementId, props }) => ({\n ...state,\n sections: updateSection(state.sections, sectionId, (section) => ({\n ...section,\n // Use recursive function to find and update nested blocks\n elements: updateElementPropsRecursive(section.elements, elementId, props),\n })),\n ...pushToHistory(state, 'Update Block Props'),\n })),\n\n // Nested block actions (blocks within blocks, up to 12 levels deep)\n on(VisualEditorActions.addNestedBlock, (state, { sectionId, parentPath, slotName, element, index }) => {\n // Validate max depth (12 levels)\n if (parentPath.length >= 12) {\n console.warn('Maximum nesting depth (12) reached');\n return state;\n }\n\n return {\n ...state,\n sections: updateSection(state.sections, sectionId, (section) => ({\n ...section,\n elements: addNestedChild(section.elements, parentPath, element, slotName, index),\n })),\n ...pushToHistory(state, 'Add Nested Block'),\n };\n }),\n\n on(VisualEditorActions.removeNestedBlock, (state, { sectionId, parentPath, elementId }) => ({\n ...state,\n sections: updateSection(state.sections, sectionId, (section) => ({\n ...section,\n elements: removeNestedChild(section.elements, parentPath, elementId),\n })),\n selectedElementId: state.selectedElementId === elementId ? null : state.selectedElementId,\n ...pushToHistory(state, 'Remove Nested Block'),\n })),\n\n on(VisualEditorActions.updateNestedBlockProps, (state, { sectionId, parentPath, elementId, props }) => ({\n ...state,\n sections: updateSection(state.sections, sectionId, (section) => ({\n ...section,\n elements: updateNestedChildProps(section.elements, parentPath, elementId, props),\n })),\n ...pushToHistory(state, 'Update Nested Block Props'),\n })),\n\n on(VisualEditorActions.moveNestedBlock, (state, { sectionId, parentPath, elementId, targetSlotName, newIndex }) => ({\n ...state,\n sections: updateSection(state.sections, sectionId, (section) => ({\n ...section,\n elements: moveNestedChild(section.elements, parentPath, elementId, targetSlotName, newIndex),\n })),\n ...pushToHistory(state, 'Move Nested Block'),\n })),\n\n on(VisualEditorActions.reparentBlock, (state, {\n sourceSectionId, sourceParentPath, elementId,\n targetSectionId, targetParentPath, targetSlotName, targetIndex,\n }) => {\n // 1. Find the element in its source location\n const sourceSection = state.sections.find((s) => s.id === sourceSectionId);\n if (!sourceSection) return state;\n\n let element: EditorElement | null = null;\n if (sourceParentPath.length === 0) {\n element = sourceSection.elements.find((e) => e.id === elementId) ?? null;\n } else {\n element = findNestedElement(sourceSection.elements, elementId);\n }\n if (!element) return state;\n\n // 2. Remove from source\n let sections = state.sections;\n if (sourceParentPath.length === 0) {\n sections = updateSection(sections, sourceSectionId, (section) => ({\n ...section,\n elements: section.elements.filter((e) => e.id !== elementId),\n }));\n } else {\n sections = updateSection(sections, sourceSectionId, (section) => ({\n ...section,\n elements: removeNestedChild(section.elements, sourceParentPath, elementId),\n }));\n }\n\n // 3. Update slotName and insert at target\n const reparentedElement = { ...element, slotName: targetSlotName };\n\n if (targetParentPath.length === 0) {\n sections = updateSection(sections, targetSectionId, (section) => {\n const slotChildren = section.elements.filter((e) => e.slotName === targetSlotName);\n const otherChildren = section.elements.filter((e) => e.slotName !== targetSlotName);\n const insertIdx = Math.min(targetIndex, slotChildren.length);\n const newSlotChildren = [\n ...slotChildren.slice(0, insertIdx),\n reparentedElement,\n ...slotChildren.slice(insertIdx),\n ];\n return {\n ...section,\n elements: [...otherChildren, ...newSlotChildren],\n };\n });\n } else {\n sections = updateSection(sections, targetSectionId, (section) => ({\n ...section,\n elements: addNestedChild(section.elements, targetParentPath, reparentedElement, targetSlotName, targetIndex),\n }));\n }\n\n return {\n ...state,\n sections,\n ...pushToHistory(state, 'Reparent Block'),\n };\n }),\n\n // Selection actions\n on(VisualEditorActions.selectElement, (state, { sectionId, elementId }) => ({\n ...state,\n selectedSectionId: sectionId,\n selectedElementId: elementId,\n })),\n\n on(VisualEditorActions.clearSelection, (state) => ({\n ...state,\n selectedSectionId: null,\n selectedElementId: null,\n })),\n\n // Drag actions\n on(VisualEditorActions.startDrag, (state, { elementId }) => ({\n ...state,\n isDragging: true,\n draggedElementId: elementId,\n })),\n\n on(VisualEditorActions.endDrag, (state) => ({\n ...state,\n isDragging: false,\n draggedElementId: null,\n })),\n\n // History actions\n on(VisualEditorActions.undo, (state) => {\n if (state.historyIndex <= 0) return state;\n\n const newIndex = state.historyIndex - 1;\n const entry = state.history[newIndex];\n\n return {\n ...state,\n sections: structuredClone(entry.sections),\n historyIndex: newIndex,\n };\n }),\n\n on(VisualEditorActions.redo, (state) => {\n if (state.historyIndex >= state.history.length - 1) return state;\n\n const newIndex = state.historyIndex + 1;\n const entry = state.history[newIndex];\n\n return {\n ...state,\n sections: structuredClone(entry.sections),\n historyIndex: newIndex,\n };\n }),\n\n on(VisualEditorActions.clearHistory, (state) => ({\n ...state,\n history: [],\n historyIndex: -1,\n })),\n\n // Bulk actions\n on(VisualEditorActions.loadSections, (state, { sections }) => ({\n ...state,\n sections,\n ...pushToHistory(state, 'Load Sections'),\n })),\n\n on(VisualEditorActions.resetEditor, () => initialVisualEditorState),\n\n // Page actions\n on(VisualEditorActions.loadPage, (state, { page }) => ({\n ...initialVisualEditorState,\n sections: page.sections,\n currentPage: {\n id: page.id,\n slug: page.slug,\n title: page.title,\n status: page.status,\n version: page.version,\n },\n isDirty: false,\n })),\n\n on(VisualEditorActions.updatePageContext, (state, { context }) => ({\n ...state,\n currentPage: state.currentPage ? { ...state.currentPage, ...context } : null,\n })),\n\n on(VisualEditorActions.markDirty, (state) => ({\n ...state,\n isDirty: true,\n })),\n\n on(VisualEditorActions.markClean, (state) => ({\n ...state,\n isDirty: false,\n })),\n\n on(VisualEditorActions.clearPage, () => initialVisualEditorState)\n);","import { createFeatureSelector, createSelector } from '@ngrx/store';\nimport { EditorElement, VISUAL_EDITOR_FEATURE_KEY, VisualEditorState } from './visual-editor.state';\n\n/**\n * Recursively find an element by ID in a tree of elements\n */\nfunction findElementRecursive(elements: EditorElement[], elementId: string): EditorElement | null {\n for (const element of elements) {\n if (element.id === elementId) {\n return element;\n }\n if (element.children && element.children.length > 0) {\n const found = findElementRecursive(element.children, elementId);\n if (found) {\n return found;\n }\n }\n }\n return null;\n}\n\nexport const selectVisualEditorState =\n createFeatureSelector<VisualEditorState>(VISUAL_EDITOR_FEATURE_KEY);\n\nexport const selectSections = createSelector(selectVisualEditorState, (state) => state.sections);\n\nexport const selectSelectedElementId = createSelector(\n selectVisualEditorState,\n (state) => state.selectedElementId\n);\n\nexport const selectSelectedSectionId = createSelector(\n selectVisualEditorState,\n (state) => state.selectedSectionId\n);\n\nexport const selectIsDragging = createSelector(selectVisualEditorState, (state) => state.isDragging);\n\nexport const selectDraggedElementId = createSelector(\n selectVisualEditorState,\n (state) => state.draggedElementId\n);\n\nexport const selectHistoryIndex = createSelector(\n selectVisualEditorState,\n (state) => state.historyIndex\n);\n\nexport const selectHistoryLength = createSelector(\n selectVisualEditorState,\n (state) => state.history.length\n);\n\nexport const selectCanUndo = createSelector(selectVisualEditorState, (state) => state.historyIndex > 0);\n\nexport const selectCanRedo = createSelector(\n selectVisualEditorState,\n (state) => state.historyIndex < state.history.length - 1\n);\n\nexport const selectSelectedSection = createSelector(\n selectSections,\n selectSelectedSectionId,\n (sections, sectionId) => sections.find((s) => s.id === sectionId) ?? null\n);\n\nexport const selectSelectedElement = createSelector(\n selectSelectedSection,\n selectSelectedElementId,\n (section, elementId) => {\n if (!section || !elementId) return null;\n // Search recursively to find nested elements\n return findElementRecursive(section.elements, elementId);\n }\n);\n\nexport const selectSectionById = (sectionId: string) =>\n createSelector(selectSections, (sections) => sections.find((s) => s.id === sectionId) ?? null);\n\nexport const selectElementById = (sectionId: string, elementId: string) =>\n createSelector(selectSectionById(sectionId), (section) => {\n if (!section) return null;\n // Search recursively to find nested elements\n return findElementRecursive(section.elements, elementId);\n });\n\nexport const selectHistory = createSelector(selectVisualEditorState, (state) => state.history);\n\nexport const selectLastAction = createSelector(selectHistory, selectHistoryIndex, (history, index) =>\n index >= 0 && index < history.length ? history[index].actionType : null\n);\n\nexport const selectSelectedElementType = createSelector(\n selectSelectedElement,\n (element) => element?.type ?? null\n);\n\nexport const selectSelectedSectionType = createSelector(\n selectSelectedSection,\n (section) => section?.type ?? null\n);\n\n// Block selectors\nexport const selectBlocksForSection = (sectionId: string) =>\n createSelector(selectSectionById(sectionId), (section) => section?.elements ?? []);\n\nexport const selectBlocksForSlot = (sectionId: string, slotName: string) =>\n createSelector(selectBlocksForSection(sectionId), (elements) =>\n elements.filter((e) => e.slotName === slotName)\n );\n\nexport const selectSelectedBlock = createSelector(\n selectSelectedSection,\n selectSelectedElementId,\n (section, elementId) => {\n if (!section || !elementId) return null;\n // Search recursively to find nested blocks\n return findElementRecursive(section.elements, elementId);\n }\n);\n\nexport const selectSelectedBlockSlotName = createSelector(\n selectSelectedBlock,\n (block) => block?.slotName ?? null\n);\n\n// Page selectors\nexport const selectCurrentPage = createSelector(\n selectVisualEditorState,\n (state) => state.currentPage\n);\n\nexport const selectCurrentPageId = createSelector(\n selectCurrentPage,\n (page) => page?.id ?? null\n);\n\nexport const selectCurrentPageSlug = createSelector(\n selectCurrentPage,\n (page) => page?.slug ?? null\n);\n\nexport const selectCurrentPageTitle = createSelector(\n selectCurrentPage,\n (page) => page?.title ?? null\n);\n\nexport const selectCurrentPageStatus = createSelector(\n selectCurrentPage,\n (page) => page?.status ?? null\n);\n\nexport const selectCurrentPageVersion = createSelector(\n selectCurrentPage,\n (page) => page?.version ?? null\n);\n\nexport const selectIsDirty = createSelector(selectVisualEditorState, (state) => state.isDirty);\n\nexport const selectIsPageLoaded = createSelector(selectCurrentPage, (page) => page !== null);","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { provideState } from '@ngrx/store';\nimport { VISUAL_EDITOR_FEATURE_KEY } from './visual-editor.state';\nimport { visualEditorReducer } from './visual-editor.reducer';\n\nexport function provideVisualEditorStore(): EnvironmentProviders {\n return makeEnvironmentProviders([provideState(VISUAL_EDITOR_FEATURE_KEY, visualEditorReducer)]);\n}","import { EnvironmentProviders, InjectionToken, makeEnvironmentProviders } from '@angular/core';\nimport { ComponentDefinition } from './component-definition.types';\n\n/**\n * Injection token for editor component definitions\n */\nexport const EDITOR_COMPONENT_DEFINITIONS = new InjectionToken<ComponentDefinition[][]>(\n 'EDITOR_COMPONENT_DEFINITIONS'\n);\n\n/**\n * Provider function to register editor components.\n *\n * @example\n * ```typescript\n * // app.config.ts\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideStore(),\n * provideVisualEditorStore(),\n * provideEditorComponents([\n * heroSectionDefinition,\n * textBlockDefinition,\n * ]),\n * ],\n * };\n * ```\n */\nexport function provideEditorComponents(\n definitions: ComponentDefinition[]\n): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: EDITOR_COMPONENT_DEFINITIONS,\n useValue: definitions,\n multi: true,\n },\n ]);\n}\n","import { Injectable, Type, inject } from '@angular/core';\nimport { ComponentDefinition, ComponentCategory, ComponentPreset } from './component-definition.types';\nimport { PropSchemaMap } from './prop-schema.types';\nimport { SlotDefinition } from './slot.types';\nimport { EDITOR_COMPONENT_DEFINITIONS } from './provide-editor-components';\n\n/**\n * A resolved preset entry for use in pickers.\n * If the component has no presets, preset is null and display fields come from the definition.\n */\nexport interface ResolvedPreset {\n definition: ComponentDefinition;\n preset: ComponentPreset | null;\n displayName: string;\n displayCategory: string;\n displayIcon: string | undefined;\n displayDescription: string | undefined;\n}\n\n/**\n * Central service for registering and querying editor components\n */\n@Injectable({ providedIn: 'root' })\nexport class ComponentRegistryService {\n private readonly definitions = new Map<string, ComponentDefinition>();\n private readonly injectedDefinitions = inject(EDITOR_COMPONENT_DEFINITIONS, { optional: true }) ?? [];\n\n constructor() {\n this.injectedDefinitions.flat().forEach((def) => this.register(def));\n }\n\n /**\n * Register a component definition\n */\n register(definition: ComponentDefinition): void {\n if (this.definitions.has(definition.type)) {\n console.warn(\n `ComponentRegistry: Component type \"${definition.type}\" is already registered. Overwriting.`\n );\n }\n this.definitions.set(definition.type, definition);\n }\n\n /**\n * Register multiple definitions\n */\n registerAll(definitions: ComponentDefinition[]): void {\n definitions.forEach((def) => this.register(def));\n }\n\n /**\n * Get a definition by type\n */\n get(type: string): ComponentDefinition | undefined {\n return this.definitions.get(type);\n }\n\n /**\n * Check if a type is registered\n */\n has(type: string): boolean {\n return this.definitions.has(type);\n }\n\n /**\n * Get the Angular component for a type\n */\n getComponent(type: string): Type<unknown> | undefined {\n return this.definitions.get(type)?.component;\n }\n\n /**\n * Get the props schema for a type\n */\n getPropsSchema(type: string): PropSchemaMap | undefined {\n return this.definitions.get(type)?.props;\n }\n\n /**\n * Get the slots for a type\n */\n getSlots(type: string): SlotDefinition[] {\n return this.definitions.get(type)?.slots ?? [];\n }\n\n /**\n * Check if a component type has slots (can contain nested blocks)\n */\n hasSlots(type: string): boolean {\n const slots = this.getSlots(type);\n return slots.length > 0;\n }\n\n /**\n * Get all definitions\n */\n getAll(): ComponentDefinition[] {\n return Array.from(this.definitions.values());\n }\n\n /**\n * Get definitions filtered by category\n */\n getByCategory(category: ComponentCategory): ComponentDefinition[] {\n return this.getAll()\n .filter((def) => def.category === category)\n .sort((a, b) => (a.order ?? 999) - (b.order ?? 999));\n }\n\n /**\n * Get only section components\n */\n getSections(): ComponentDefinition[] {\n return this.getAll()\n .filter((def) => def.isSection === true)\n .sort((a, b) => (a.order ?? 999) - (b.order ?? 999));\n }\n\n /**\n * Get only element components (non-sections, non-blocks)\n */\n getElements(): ComponentDefinition[] {\n return this.getAll()\n .filter((def) => def.isSection !== true && def.isBlock !== true)\n .sort((a, b) => (a.order ?? 999) - (b.order ?? 999));\n }\n\n /**\n * Get only block components (elements that live inside section slots)\n */\n getBlocks(): ComponentDefinition[] {\n return this.getAll()\n .filter((def) => def.isBlock === true)\n .sort((a, b) => (a.order ?? 999) - (b.order ?? 999));\n }\n\n /**\n * Get blocks available for a specific section type\n * Returns theme blocks (global) + section blocks specific to this section type\n */\n getBlocksForSectionType(sectionType: string): ComponentDefinition[] {\n return this.getBlocks().filter((def) => {\n // Theme blocks (or no scope specified) are available everywhere\n if (!def.blockScope || def.blockScope === 'theme') {\n return true;\n }\n // Section blocks are only available in their specified sections\n if (def.blockScope === 'section') {\n return def.sectionTypes?.includes(sectionType) ?? false;\n }\n return false;\n });\n }\n\n /**\n * Search components by name or tags\n */\n search(query: string): ComponentDefinition[] {\n const normalizedQuery = query.toLowerCase().trim();\n if (!normalizedQuery) return this.getAll();\n\n return this.getAll().filter((def) => {\n const nameMatch = def.name.toLowerCase().includes(normalizedQuery);\n const tagMatch = def.tags?.some((tag) => tag.toLowerCase().includes(normalizedQuery));\n const descMatch = def.description?.toLowerCase().includes(normalizedQuery);\n return nameMatch || tagMatch || descMatch;\n });\n }\n\n /**\n * Generate default props for a type\n */\n getDefaultProps(type: string): Record<string, unknown> {\n const schema = this.getPropsSchema(type);\n if (!schema) return {};\n\n const defaults: Record<string, unknown> = {};\n for (const [key, propSchema] of Object.entries(schema)) {\n defaults[key] = propSchema.defaultValue;\n }\n return defaults;\n }\n\n /**\n * Resolve a definition into ResolvedPreset entries.\n * If it has presets, returns one entry per preset; otherwise one entry for the definition itself.\n */\n resolvePresets(definition: ComponentDefinition): ResolvedPreset[] {\n if (definition.presets && definition.presets.length > 0) {\n return definition.presets.map((preset) => ({\n definition,\n preset,\n displayName: preset.name,\n displayCategory: preset.category ?? definition.category,\n displayIcon: preset.icon ?? definition.icon,\n displayDescription: preset.description ?? definition.description,\n }));\n }\n\n return [\n {\n definition,\n preset: null,\n displayName: definition.name,\n displayCategory: definition.category,\n displayIcon: definition.icon,\n displayDescription: definition.description,\n },\n ];\n }\n\n /**\n * Get all section definitions expanded into presets\n */\n getSectionPresets(): ResolvedPreset[] {\n return this.getSections().flatMap((def) => this.resolvePresets(def));\n }\n\n /**\n * Get all block definitions expanded into presets\n */\n getBlockPresets(): ResolvedPreset[] {\n return this.getBlocks().flatMap((def) => this.resolvePresets(def));\n }\n\n /**\n * Get block presets available for a specific section type\n */\n getBlockPresetsForSectionType(sectionType: string): ResolvedPreset[] {\n return this.getBlocksForSectionType(sectionType).flatMap((def) => this.resolvePresets(def));\n }\n\n /**\n * Merge schema defaults with preset settings to produce final props\n */\n getPresetProps(type: string, preset: ComponentPreset | null): Record<string, unknown> {\n const defaults = this.getDefaultProps(type);\n if (!preset?.settings) return defaults;\n return { ...defaults, ...preset.settings };\n }\n\n /**\n * Validate props against the schema\n */\n validateProps(type: string, props: Record<string, unknown>): Map<string, string> {\n const errors = new Map<string, string>();\n const schema = this.getPropsSchema(type);\n if (!schema) return errors;\n\n for (const [key, propSchema] of Object.entries(schema)) {\n const value = props[key];\n const validation = propSchema.validation;\n\n if (!validation) continue;\n\n if (validation.required && (value === undefined || value === null || value === '')) {\n errors.set(key, `${propSchema.label} is required`);\n continue;\n }\n\n if (value === undefined || value === null) continue;\n\n if (typeof value === 'number') {\n if (validation.min !== undefined && value < validation.min) {\n errors.set(key, `${propSchema.label} must be at least ${validation.min}`);\n }\n if (validation.max !== undefined && value > validation.max) {\n errors.set(key, `${propSchema.label} must be at most ${validation.max}`);\n }\n }\n\n if (typeof value === 'string') {\n if (validation.minLength !== undefined && value.length < validation.minLength) {\n errors.set(key, `${propSchema.label} must be at least ${validation.minLength} characters`);\n }\n if (validation.maxLength !== undefined && value.length > validation.maxLength) {\n errors.set(key, `${propSchema.label} must be at most ${validation.maxLength} characters`);\n }\n if (validation.pattern && !new RegExp(validation.pattern).test(value)) {\n errors.set(key, `${propSchema.label} format is invalid`);\n }\n }\n }\n\n return errors;\n }\n}\n","import {\n Component,\n ChangeDetectionStrategy,\n input,\n inject,\n ViewContainerRef,\n effect,\n ComponentRef,\n DestroyRef,\n reflectComponentType,\n Type,\n} from '@angular/core';\nimport { ComponentRegistryService } from '../registry/component-registry.service';\nimport { EditorElement } from '../store/visual-editor.state';\n\n/**\n * Component that dynamically renders an EditorElement\n * based on its type registered in the ComponentRegistry\n */\n@Component({\n selector: 'lib-dynamic-renderer',\n template: `\n @if (error()) {\n <div class=\"dynamic-renderer-error\">\n <span>Unknown component type: {{ element().type }}</span>\n </div>\n }\n `,\n styles: `\n :host {\n display: contents;\n }\n .dynamic-renderer-error {\n padding: 1rem;\n background: #fee2e2;\n border: 1px dashed #ef4444;\n color: #dc2626;\n border-radius: 4px;\n font-size: 0.875rem;\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DynamicRendererComponent {\n private readonly registry = inject(ComponentRegistryService);\n private readonly viewContainerRef = inject(ViewContainerRef);\n private readonly destroyRef = inject(DestroyRef);\n\n /** Element to render */\n readonly element = input.required<EditorElement>();\n\n /** Additional context (sectionId, index, etc.) */\n readonly context = input<Record<string, unknown>>({});\n\n /** Error state signal */\n private _error = false;\n error = () => this._error;\n\n private componentRef: ComponentRef<unknown> | null = null;\n private currentType: string | null = null;\n private currentAvailableInputs: Set<string> | null = null;\n private previousInputs = new Map<string, unknown>();\n\n constructor() {\n effect(() => {\n const el = this.element();\n const ctx = this.context();\n\n if (this.componentRef && this.currentType === el.type) {\n // Same type: update only inputs that changed\n this.updateInputs(el, ctx);\n } else {\n // Different type or first render: full create\n this.renderComponent(el, ctx);\n }\n });\n\n this.destroyRef.onDestroy(() => {\n this.cleanup();\n });\n }\n\n private renderComponent(element: EditorElement, context: Record<string, unknown>): void {\n this.cleanup();\n\n const componentType = this.registry.getComponent(element.type);\n if (!componentType) {\n this._error = true;\n this.currentType = null;\n this.currentAvailableInputs = null;\n console.warn(`DynamicRenderer: No component registered for type \"${element.type}\"`);\n return;\n }\n\n this._error = false;\n this.currentType = element.type;\n this.previousInputs.clear();\n this.componentRef = this.viewContainerRef.createComponent(componentType);\n this.currentAvailableInputs = this.getComponentInputs(componentType);\n\n // Stamp the host element so canvas elements are discoverable by ID\n const hostEl = this.componentRef.location.nativeElement as HTMLElement;\n if (hostEl?.setAttribute) {\n hostEl.setAttribute('data-element-id', element.id);\n }\n\n this.updateInputs(element, context);\n }\n\n private updateInputs(element: EditorElement, context: Record<string, unknown>): void {\n if (!this.componentRef || !this.currentAvailableInputs) return;\n\n const availableInputs = this.currentAvailableInputs;\n\n // Pass props — only call setInput when the value actually changed\n for (const [key, value] of Object.entries(element.props)) {\n if (availableInputs.has(key)) {\n this.setInputIfChanged(key, value);\n }\n }\n\n // Pass special editor props (only if the component declares them)\n if (availableInputs.has('_elementId')) {\n this.setInputIfChanged('_elementId', element.id);\n }\n\n // Pass children: for sections use 'elements', for elements use 'children'\n if (availableInputs.has('_children')) {\n const children = (element as unknown as { elements?: unknown[] }).elements ?? element.children;\n this.setInputIfChanged('_children', children ?? []);\n }\n\n if (availableInputs.has('_context')) {\n this.setInputIfChanged('_context', context);\n }\n }\n\n private setInputIfChanged(key: string, value: unknown): void {\n if (this.previousInputs.get(key) !== value) {\n this.previousInputs.set(key, value);\n this.componentRef!.setInput(key, value);\n }\n }\n\n private getComponentInputs(componentType: Type<unknown>): Set<string> {\n const mirror = reflectComponentType(componentType);\n if (!mirror) {\n return new Set();\n }\n return new Set(mirror.inputs.map(i => i.propName));\n }\n\n private cleanup(): void {\n if (this.componentRef) {\n this.componentRef.destroy();\n this.componentRef = null;\n }\n this.viewContainerRef.clear();\n }\n}\n","import { Component, ChangeDetectionStrategy, input, computed, inject } from '@angular/core';\nimport { ComponentRegistryService } from '../registry/component-registry.service';\nimport { EditorElement } from '../store/visual-editor.state';\nimport { SlotDefinition } from '../registry/slot.types';\nimport { DynamicRendererComponent } from './dynamic-renderer.component';\n\n/**\n * Renders child elements within a specific slot\n */\n@Component({\n selector: 'lib-slot-renderer',\n imports: [DynamicRendererComponent],\n template: `\n @if (filteredChildren().length === 0 && slot().emptyPlaceholder) {\n <div class=\"slot-empty\" [attr.data-slot]=\"slot().name\">\n {{ slot().emptyPlaceholder }}\n </div>\n } @else {\n @for (child of filteredChildren(); track child.id; let idx = $index) {\n <lib-dynamic-renderer\n [element]=\"child\"\n [context]=\"{ slotName: slot().name, index: idx, parentId: parentElementId() }\"\n />\n }\n }\n `,\n styles: `\n :host {\n display: contents;\n }\n .slot-empty {\n padding: 2rem;\n border: 2px dashed #d1d5db;\n color: #9ca3af;\n text-align: center;\n border-radius: 4px;\n font-size: 0.875rem;\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SlotRendererComponent {\n private readonly registry = inject(ComponentRegistryService);\n\n /** Slot definition */\n readonly slot = input.required<SlotDefinition>();\n\n /** All children of the parent element */\n readonly children = input.required<EditorElement[]>();\n\n /** Parent element ID */\n readonly parentElementId = input.required<string>();\n\n /** Children filtered by slot name and constraints */\n readonly filteredChildren = computed(() => {\n const slotDef = this.slot();\n const allChildren = this.children() ?? [];\n\n return allChildren.filter((child) => {\n // Filter by slot name - children must match the slot they belong to\n // Children without slotName go to the 'default' slot (or first slot)\n const childSlot = child.slotName ?? 'default';\n if (childSlot !== slotDef.name && slotDef.name !== 'default') {\n return false;\n }\n\n // Check allowed types\n if (slotDef.constraints?.allowedTypes?.length) {\n if (!slotDef.constraints.allowedTypes.includes(child.type)) {\n return false;\n }\n }\n\n // Check disallowed types\n if (slotDef.constraints?.disallowedTypes?.length) {\n if (slotDef.constraints.disallowedTypes.includes(child.type)) {\n return false;\n }\n }\n\n return true;\n });\n });\n}\n","import { Injectable, computed, inject } from '@angular/core';\nimport { Store } from '@ngrx/store';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { Observable, tap } from 'rxjs';\nimport { ComponentRegistryService } from '../registry/component-registry.service';\nimport { ComponentDefinition, ComponentPreset, PresetBlockConfig } from '../registry/component-definition.types';\nimport { ResolvedPreset } from '../registry/component-registry.service';\nimport { SlotDefinition } from '../registry/slot.types';\nimport { VisualEditorActions } from '../store/visual-editor.actions';\nimport {\n selectSelectedElement,\n selectSelectedSection,\n selectSections,\n selectCanUndo,\n selectCanRedo,\n selectIsDragging,\n selectSelectedBlock,\n selectSelectedBlockSlotName,\n selectCurrentPage,\n selectCurrentPageId,\n selectIsDirty,\n selectIsPageLoaded,\n} from '../store/visual-editor.selectors';\nimport { EditorElement, EditorSection } from '../store/visual-editor.state';\nimport { PageService } from './page.service';\nimport {\n CreatePageRequest,\n Page,\n PageContext,\n PageSummary,\n UpdatePageRequest,\n} from '../models/page.model';\n\n/**\n * Recursively find an element by ID in a tree of elements\n */\nfunction findElementRecursive(elements: EditorElement[], elementId: string): EditorElement | null {\n for (const element of elements) {\n if (element.id === elementId) {\n return element;\n }\n if (element.children && element.children.length > 0) {\n const found = findElementRecursive(element.children, elementId);\n if (found) {\n return found;\n }\n }\n }\n return null;\n}\n\n/**\n * Facade service that combines Store operations with ComponentRegistry\n */\n@Injectable({ providedIn: 'root' })\nexport class VisualEditorFacade {\n private readonly store = inject(Store);\n private readonly registry = inject(ComponentRegistryService);\n private readonly pageService = inject(PageService);\n\n // State signals\n readonly sections = toSignal(this.store.select(selectSections), { initialValue: [] });\n readonly selectedElement = toSignal(this.store.select(selectSelectedElement), {\n initialValue: null,\n });\n readonly selectedSection = toSignal(this.store.select(selectSelectedSection), {\n initialValue: null,\n });\n readonly canUndo = toSignal(this.store.select(selectCanUndo), { initialValue: false });\n readonly canRedo = toSignal(this.store.select(selectCanRedo), { initialValue: false });\n readonly isDragging = toSignal(this.store.select(selectIsDragging), { initialValue: false });\n readonly selectedBlock = toSignal(this.store.select(selectSelectedBlock), { initialValue: null });\n readonly selectedBlockSlotName = toSignal(this.store.select(selectSelectedBlockSlotName), {\n initialValue: null,\n });\n\n // Page state signals\n readonly currentPage = toSignal(this.store.select(selectCurrentPage), { initialValue: null });\n readonly currentPageId = toSignal(this.store.select(selectCurrentPageId), { initialValue: null });\n readonly isDirty = toSignal(this.store.select(selectIsDirty), { initialValue: false });\n readonly isPageLoaded = toSignal(this.store.select(selectIsPageLoaded), { initialValue: false });\n\n // Computed: definition of selected element\n readonly selectedElementDefinition = computed<ComponentDefinition | null>(() => {\n const element = this.selectedElement();\n if (!element) return null;\n return this.registry.get(element.type) ?? null;\n });\n\n // Computed: definition of selected section\n readonly selectedSectionDefinition = computed<ComponentDefinition | null>(() => {\n const section = this.selectedSection();\n if (!section) return null;\n return this.registry.get(section.type) ?? null;\n });\n\n // Computed: definition of selected block\n readonly selectedBlockDefinition = computed<ComponentDefinition | null>(() => {\n const block = this.selectedBlock();\n if (!block) return null;\n return this.registry.get(block.type) ?? null;\n });\n\n // Registry access\n readonly availableSections = computed(() => this.registry.getSections());\n readonly availableElements = computed(() => this.registry.getElements());\n readonly availableBlocks = computed(() => this.registry.getBlocks());\n\n // Preset-aware computed signals\n readonly availableSectionPresets = computed(() => this.registry.getSectionPresets());\n readonly availableBlockPresets = computed(() => this.registry.getBlockPresets());\n\n /**\n * Create a new element with default props from registry\n */\n createElementWithDefaults(type: string, overrides?: Partial<EditorElement>): EditorElement {\n const defaultProps = this.registry.getDefaultProps(type);\n return {\n id: crypto.randomUUID(),\n type,\n props: { ...defaultProps, ...overrides?.props },\n children: overrides?.children,\n };\n }\n\n /**\n * Create a new section with default props from registry\n */\n createSectionWithDefaults(type: string, overrides?: Partial<EditorSection>): EditorSection {\n const defaultProps = this.registry.getDefaultProps(type);\n return {\n id: crypto.randomUUID(),\n type,\n props: { ...defaultProps, ...overrides?.props },\n elements: overrides?.elements ?? [],\n };\n }\n\n /**\n * Add a section to the editor\n */\n addSection(type: string, index?: number): void {\n const section = this.createSectionWithDefaults(type);\n this.store.dispatch(VisualEditorActions.addSection({ section, index }));\n }\n\n /**\n * Add an element to a section\n */\n addElement(sectionId: string, type: string, index?: number): void {\n const element = this.createElementWithDefaults(type);\n this.store.dispatch(VisualEditorActions.addElement({ sectionId, element, index }));\n }\n\n /**\n * Remove a section\n */\n removeSection(sectionId: string): void {\n this.store.dispatch(VisualEditorActions.removeSection({ sectionId }));\n }\n\n /**\n * Remove an element\n */\n removeElement(sectionId: string, elementId: string): void {\n this.store.dispatch(VisualEditorActions.removeElement({ sectionId, elementId }));\n }\n\n /**\n * Move a section to a new index\n */\n moveSection(sectionId: string, newIndex: number): void {\n this.store.dispatch(VisualEditorActions.moveSection({ sectionId, newIndex }));\n }\n\n /**\n * Move an element within or between sections\n */\n moveElement(\n sourceSectionId: string,\n targetSectionId: string,\n elementId: string,\n newIndex: number\n ): void {\n this.store.dispatch(\n VisualEditorActions.moveElement({ sourceSectionId, targetSectionId, elementId, newIndex })\n );\n }\n\n // ========== Rename Operations ==========\n\n /**\n * Rename a section (set adminLabel)\n */\n renameSection(sectionId: string, adminLabel: string): void {\n this.store.dispatch(VisualEditorActions.renameSection({ sectionId, adminLabel }));\n }\n\n /**\n * Rename a block (set adminLabel)\n */\n renameBlock(sectionId: string, elementId: string, adminLabel: string): void {\n this.store.dispatch(VisualEditorActions.renameBlock({ sectionId, elementId, adminLabel }));\n }\n\n // ========== Block Operations ==========\n\n /**\n * Create a block element with default props and slotName\n */\n createBlockWithDefaults(\n type: string,\n slotName: string,\n overrides?: Partial<EditorElement>\n ): EditorElement {\n const defaultProps = this.registry.getDefaultProps(type);\n // Initialize children array if the block type has slots\n const hasSlots = this.registry.hasSlots(type);\n return {\n id: crypto.randomUUID(),\n type,\n props: { ...defaultProps, ...overrides?.props },\n slotName,\n children: overrides?.children ?? (hasSlots ? [] : undefined),\n };\n }\n\n /**\n * Add a block to a section's slot\n */\n addBlock(sectionId: string, slotName: string, type: string, index?: number): void {\n const element = this.createBlockWithDefaults(type, slotName);\n this.store.dispatch(VisualEditorActions.addBlock({ sectionId, slotName, element, index }));\n }\n\n // ========== Preset Operations ==========\n\n /**\n * Add a section from a resolved preset.\n * Merges preset settings into default props and creates pre-configured blocks.\n */\n addSectionFromPreset(resolvedPreset: ResolvedPreset, index?: number): void {\n const { definition, preset } = resolvedPreset;\n const props = this.registry.getPresetProps(definition.type, preset);\n const elements = this.createPresetBlocks(definition, preset);\n\n const section: EditorSection = {\n id: crypto.randomUUID(),\n type: definition.type,\n props,\n elements,\n };\n\n this.store.dispatch(VisualEditorActions.addSection({ section, index }));\n }\n\n /**\n * Add a block from a resolved preset to a section's slot.\n */\n addBlockFromPreset(\n sectionId: string,\n slotName: string,\n resolvedPreset: ResolvedPreset,\n index?: number\n ): void {\n const { definition, preset } = resolvedPreset;\n const props = this.registry.getPresetProps(definition.type, preset);\n const hasSlots = this.registry.hasSlots(definition.type);\n\n const element: EditorElement = {\n id: crypto.randomUUID(),\n type: definition.type,\n props,\n slotName,\n children: hasSlots ? this.createPresetBlockChildren(preset?.blocks) : undefined,\n };\n\n this.store.dispatch(VisualEditorActions.addBlock({ sectionId, slotName, element, index }));\n }\n\n /**\n * Generate EditorElement[] from a preset's blocks configuration\n */\n private createPresetBlocks(\n definition: ComponentDefinition,\n preset: ComponentPreset | null\n ): EditorElement[] {\n if (!preset?.blocks || preset.blocks.length === 0) return [];\n\n const defaultSlotName = definition.slots?.[0]?.name ?? 'default';\n\n return preset.blocks.map((blockConfig) => {\n const blockProps = this.registry.getPresetProps(blockConfig.type, {\n name: blockConfig.type,\n settings: blockConfig.settings,\n });\n const hasSlots = this.registry.hasSlots(blockConfig.type);\n\n return {\n id: crypto.randomUUID(),\n type: blockConfig.type,\n props: blockProps,\n slotName: blockConfig.slotName ?? defaultSlotName,\n children: hasSlots ? this.createPresetBlockChildren(blockConfig.blocks) : undefined,\n };\n });\n }\n\n /**\n * Generate children for blocks that have slots, from preset block configs\n */\n private createPresetBlockChildren(blockConfigs?: PresetBlockConfig[]): EditorElement[] {\n if (!blockConfigs || blockConfigs.length === 0) return [];\n\n return blockConfigs.map((blockConfig) => {\n const blockProps = this.registry.getPresetProps(blockConfig.type, {\n name: blockConfig.type,\n settings: blockConfig.settings,\n });\n const hasSlots = this.registry.hasSlots(blockConfig.type);\n\n return {\n id: crypto.randomUUID(),\n type: blockConfig.type,\n props: blockProps,\n slotName: blockConfig.slotName ?? 'default',\n children: hasSlots ? this.createPresetBlockChildren(blockConfig.blocks) : undefined,\n };\n });\n }\n\n /**\n * Remove a block from a section\n */\n removeBlock(sectionId: string, elementId: string): void {\n this.store.dispatch(VisualEditorActions.removeBlock({ sectionId, elementId }));\n }\n\n /**\n * Move a block within a section (can change slots)\n */\n moveBlock(sectionId: string, elementId: string, targetSlotName: string, newIndex: number): void {\n this.store.dispatch(\n VisualEditorActions.moveBlock({ sectionId, elementId, targetSlotName, newIndex })\n );\n }\n\n // ========== Duplicate Operations ==========\n\n /**\n * Check if a section type can be duplicated\n */\n isSectionDuplicable(type: string): boolean {\n const def = this.registry.get(type);\n return def?.duplicable !== false;\n }\n\n /**\n * Check if a block type can be duplicated\n */\n isBlockDuplicable(type: string): boolean {\n const def = this.registry.get(type);\n return def?.duplicable !== false;\n }\n\n /**\n * Duplicate a section (deep clone with new IDs)\n */\n duplicateSection(sectionId: string): void {\n this.store.dispatch(VisualEditorActions.duplicateSection({ sectionId }));\n }\n\n /**\n * Duplicate a block within a section\n */\n duplicateBlock(sectionId: string, elementId: string): void {\n this.store.dispatch(VisualEditorActions.duplicateBlock({ sectionId, elementId }));\n }\n\n /**\n * Duplicate a nested block\n */\n duplicateNestedBlock(sectionId: string, parentPath: string[], elementId: string): void {\n this.store.dispatch(\n VisualEditorActions.duplicateNestedBlock({ sectionId, parentPath, elementId })\n );\n }\n\n /**\n * Update block props with validation (works for both direct and nested blocks)\n */\n updateBlockProps(sectionId: string, elementId: string, props: Record<string, unknown>): void {\n const section = this.sections().find((s) => s.id === sectionId);\n if (!section) return;\n\n // Search recursively for the block (may be nested)\n const block = findElementRecursive(section.elements, elementId);\n\n if (block) {\n const errors = this.registry.validateProps(block.type, { ...block.props, ...props });\n if (errors.size === 0) {\n this.store.dispatch(VisualEditorActions.updateBlockProps({ sectionId, elementId, props }));\n } else {\n console.warn('Validation errors:', Object.fromEntries(errors));\n }\n }\n }\n\n /**\n * Get blocks for a specific slot in a section\n */\n getBlocksForSlot(sectionId: string, slotName: string): EditorElement[] {\n const section = this.sections().find((s) => s.id === sectionId);\n if (!section) return [];\n return section.elements.filter((e) => e.slotName === slotName);\n }\n\n /**\n * Get allowed block types for a slot\n */\n getAllowedBlocksForSlot(sectionType: string, slotName: string): ComponentDefinition[] {\n const slots = this.registry.getSlots(sectionType);\n const slot = slots.find((s) => s.name === slotName);\n const allowedTypes = slot?.constraints?.allowedTypes;\n\n if (!allowedTypes || allowedTypes.length === 0) {\n return this.availableBlocks();\n }\n\n return this.availableBlocks().filter((block) => allowedTypes.includes(block.type));\n }\n\n // ========== Nested Block Operations ==========\n\n /**\n * Check if a component type has slots (can contain nested blocks)\n */\n hasSlots(type: string): boolean {\n return this.registry.hasSlots(type);\n }\n\n /**\n * Get slots for a block type\n */\n getBlockSlots(type: string): SlotDefinition[] {\n return this.registry.getSlots(type);\n }\n\n /**\n * Check if adding a nested block is allowed (max 12 levels)\n */\n canAddNestedBlock(parentPath: string[]): boolean {\n return parentPath.length < 12;\n }\n\n /**\n * Add a nested block to a parent element\n */\n addNestedBlock(\n sectionId: string,\n parentPath: string[],\n slotName: string,\n type: string,\n index?: number\n ): void {\n if (!this.canAddNestedBlock(parentPath)) {\n console.warn('Maximum nesting depth (12) reached');\n return;\n }\n\n const element = this.createBlockWithDefaults(type, slotName);\n this.store.dispatch(\n VisualEditorActions.addNestedBlock({ sectionId, parentPath, slotName, element, index })\n );\n }\n\n /**\n * Remove a nested block from a parent element\n */\n removeNestedBlock(sectionId: string, parentPath: string[], elementId: string): void {\n this.store.dispatch(\n VisualEditorActions.removeNestedBlock({ sectionId, parentPath, elementId })\n );\n }\n\n /**\n * Update nested block props\n */\n updateNestedBlockProps(\n sectionId: string,\n parentPath: string[],\n elementId: string,\n props: Record<string, unknown>\n ): void {\n this.store.dispatch(\n VisualEditorActions.updateNestedBlockProps({ sectionId, parentPath, elementId, props })\n );\n }\n\n /**\n * Move a nested block within its parent\n */\n moveNestedBlock(\n sectionId: string,\n parentPath: string[],\n elementId: string,\n targetSlotName: string,\n newIndex: number\n ): void {\n this.store.dispatch(\n VisualEditorActions.moveNestedBlock({ sectionId, parentPath, elementId, targetSlotName, newIndex })\n );\n }\n\n /**\n * Reparent a block: move it from one parent/section to another\n */\n reparentBlock(\n sourceSectionId: string,\n sourceParentPath: string[],\n elementId: string,\n targetSectionId: string,\n targetParentPath: string[],\n targetSlotName: string,\n targetIndex: number\n ): void {\n this.store.dispatch(\n VisualEditorActions.reparentBlock({\n sourceSectionId,\n sourceParentPath,\n elementId,\n targetSectionId,\n targetParentPath,\n targetSlotName,\n targetIndex,\n })\n );\n }\n\n /**\n * Get children of an element filtered by slot\n */\n getElementChildren(element: EditorElement, slotName?: string): EditorElement[] {\n const children = element.children ?? [];\n if (!slotName) return children;\n return children.filter((c) => c.slotName === slotName);\n }\n\n /**\n * Get allowed blocks for a nested slot\n */\n getAllowedBlocksForNestedSlot(parentType: string, slotName: string): ComponentDefinition[] {\n const slots = this.registry.getSlots(parentType);\n const slot = slots.find((s) => s.name === slotName);\n const allowedTypes = slot?.constraints?.allowedTypes;\n\n if (!allowedTypes || allowedTypes.length === 0) {\n return this.availableBlocks();\n }\n\n return this.availableBlocks().filter((block) => allowedTypes.includes(block.type));\n }\n\n /**\n * Select an element\n */\n selectElement(sectionId: string | null, elementId: string | null): void {\n this.store.dispatch(VisualEditorActions.selectElement({ sectionId, elementId }));\n }\n\n /**\n * Clear selection\n */\n clearSelection(): void {\n this.store.dispatch(VisualEditorActions.clearSelection());\n }\n\n /**\n * Update element props with validation\n */\n updateElementProps(sectionId: string, elementId: string, props: Record<string, unknown>): void {\n const element = this.sections()\n .find((s) => s.id === sectionId)\n ?.elements.find((e) => e.id === elementId);\n\n if (element) {\n const errors = this.registry.validateProps(element.type, { ...element.props, ...props });\n if (errors.size === 0) {\n this.store.dispatch(VisualEditorActions.updateElementProps({ sectionId, elementId, props }));\n } else {\n console.warn('Validation errors:', Object.fromEntries(errors));\n }\n }\n }\n\n /**\n * Update section props with validation\n */\n updateSectionProps(sectionId: string, props: Record<string, unknown>): void {\n const section = this.sections().find((s) => s.id === sectionId);\n\n if (section) {\n const errors = this.registry.validateProps(section.type, { ...section.props, ...props });\n if (errors.size === 0) {\n this.store.dispatch(VisualEditorActions.updateSectionProps({ sectionId, props }));\n } else {\n console.warn('Validation errors:', Object.fromEntries(errors));\n }\n }\n }\n\n /**\n * Undo last action\n */\n undo(): void {\n this.store.dispatch(VisualEditorActions.undo());\n }\n\n /**\n * Redo last undone action\n */\n redo(): void {\n this.store.dispatch(VisualEditorActions.redo());\n }\n\n /**\n * Load sections into the editor\n */\n loadSections(sections: EditorSection[]): void {\n this.store.dispatch(VisualEditorActions.loadSections({ sections }));\n }\n\n /**\n * Reset editor to initial state\n */\n resetEditor(): void {\n this.store.dispatch(VisualEditorActions.resetEditor());\n }\n\n /**\n * Get component definition by type\n */\n getDefinition(type: string): ComponentDefinition | undefined {\n return this.registry.get(type);\n }\n\n /**\n * Search components\n */\n searchComponents(query: string): ComponentDefinition[] {\n return this.registry.search(query);\n }\n\n // ========== Page Operations ==========\n\n /**\n * Get all pages (summaries)\n */\n getPages(): Observable<PageSummary[]> {\n return this.pageService.getPages();\n }\n\n /**\n * Get a page by ID and load it into the editor\n */\n getPage(id: string): Observable<Page> {\n return this.pageService.getPage(id);\n }\n\n /**\n * Get a published page by slug (for public rendering)\n */\n getPublishedPageBySlug(slug: string): Observable<Page> {\n return this.pageService.getPublishedPageBySlug(slug);\n }\n\n /**\n * Load a page into the editor\n */\n loadPage(page: Page): void {\n this.store.dispatch(VisualEditorActions.loadPage({ page }));\n }\n\n /**\n * Create a new page\n */\n createPage(request: CreatePageRequest): Observable<Page> {\n return this.pageService.createPage(request);\n }\n\n /**\n * Save current editor state to a page\n */\n savePage(pageId: string): Observable<Page> {\n const currentPage = this.currentPage();\n if (!currentPage) {\n throw new Error('No page loaded in editor');\n }\n\n const request: UpdatePageRequest = {\n sections: this.sections(),\n version: currentPage.version,\n };\n\n console.log('Saving page:', request);\n\n return this.pageService.updatePage(pageId, request).pipe(\n tap((page) => {\n this.store.dispatch(\n VisualEditorActions.updatePageContext({\n context: { version: page.version },\n })\n );\n this.store.dispatch(VisualEditorActions.markClean());\n })\n );\n }\n\n /**\n * Update page metadata (title, slug, etc.)\n */\n updatePageMetadata(pageId: string, metadata: Partial<PageContext>): Observable<Page> {\n const currentPage = this.currentPage();\n if (!currentPage) {\n throw new Error('No page loaded in editor');\n }\n\n const request: UpdatePageRequest = {\n ...metadata,\n version: currentPage.version,\n };\n\n return this.pageService.updatePage(pageId, request).pipe(\n tap((page) => {\n this.store.dispatch(\n VisualEditorActions.updatePageContext({\n context: {\n title: page.title,\n slug: page.slug,\n version: page.version,\n },\n })\n );\n })\n );\n }\n\n /**\n * Delete a page\n */\n deletePage(id: string): Observable<void> {\n return this.pageService.deletePage(id);\n }\n\n /**\n * Publish a page\n */\n publishPage(pageId: string): Observable<Page> {\n const currentPage = this.currentPage();\n if (!currentPage) {\n throw new Error('No page loaded in editor');\n }\n\n return this.pageService.publishPage(pageId, { version: currentPage.version }).pipe(\n tap((page) => {\n this.store.dispatch(\n VisualEditorActions.updatePageContext({\n context: { status: page.status, version: page.version },\n })\n );\n })\n );\n }\n\n /**\n * Unpublish a page\n */\n unpublishPage(pageId: string): Observable<Page> {\n const currentPage = this.currentPage();\n if (!currentPage) {\n throw new Error('No page loaded in editor');\n }\n\n return this.pageService.unpublishPage(pageId, { version: currentPage.version }).pipe(\n tap((page) => {\n this.store.dispatch(\n VisualEditorActions.updatePageContext({\n context: { status: page.status, version: page.version },\n })\n );\n })\n );\n }\n\n /**\n * Duplicate a page\n */\n duplicatePage(id: string): Observable<Page> {\n return this.pageService.duplicatePage(id);\n }\n\n /**\n * Clear the current page from editor\n */\n clearPage(): void {\n this.store.dispatch(VisualEditorActions.clearPage());\n }\n\n /**\n * Mark editor as dirty (has unsaved changes)\n */\n markDirty(): void {\n this.store.dispatch(VisualEditorActions.markDirty());\n }\n\n /**\n * Mark editor as clean (no unsaved changes)\n */\n markClean(): void {\n this.store.dispatch(VisualEditorActions.markClean());\n }\n}\n","import { Injectable, inject, signal, computed } from '@angular/core';\nimport { Store } from '@ngrx/store';\nimport { DragItem, DropTarget, DropZone } from './drag-drop.types';\nimport { VisualEditorActions } from '../store/visual-editor.actions';\nimport { selectSections } from '../store/visual-editor.selectors';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { EditorElement } from '../store/visual-editor.state';\nimport { ComponentRegistryService } from '../registry/component-registry.service';\n\nconst MAX_DEPTH = 12;\n\n@Injectable({ providedIn: 'root' })\nexport class DragDropService {\n private readonly store = inject(Store);\n private readonly registry = inject(ComponentRegistryService);\n private readonly sections = toSignal(this.store.select(selectSections), { initialValue: [] });\n\n readonly dragItem = signal<DragItem | null>(null);\n readonly dropTarget = signal<DropTarget | null>(null);\n readonly isDragging = computed(() => this.dragItem() !== null);\n\n startDrag(item: DragItem, event: DragEvent): void {\n this.dragItem.set(item);\n this.store.dispatch(VisualEditorActions.startDrag({ elementId: item.elementId }));\n\n if (event.dataTransfer) {\n event.dataTransfer.effectAllowed = 'move';\n event.dataTransfer.setData('text/plain', item.elementId);\n }\n }\n\n endDrag(): void {\n this.dragItem.set(null);\n this.dropTarget.set(null);\n this.store.dispatch(VisualEditorActions.endDrag());\n }\n\n updateDropTarget(target: DropTarget | null): void {\n this.dropTarget.set(target);\n }\n\n computeDropZone(event: DragEvent, element: HTMLElement, canDropInside: boolean): DropZone {\n const rect = element.getBoundingClientRect();\n const y = event.clientY - rect.top;\n const ratio = y / rect.height;\n\n if (canDropInside) {\n if (ratio < 0.25) return 'before';\n if (ratio > 0.75) return 'after';\n return 'inside';\n }\n\n return ratio < 0.5 ? 'before' : 'after';\n }\n\n validateDrop(item: DragItem, target: DropTarget): boolean {\n // Rule 1: Cannot drop on itself\n if (item.elementId === target.sectionId && target.parentPath.length === 0 && item.kind === 'section') {\n return false;\n }\n\n // Rule 2: Sections only reorder among sections\n if (item.kind === 'section' && target.kind !== 'section') {\n return false;\n }\n if (item.kind !== 'section' && target.kind === 'section') {\n return false;\n }\n\n // For blocks:\n if (item.kind === 'block') {\n // Rule 1 for blocks: cannot drop on itself\n if (target.zone === 'inside' && this.isDropOnSelf(item, target)) {\n return false;\n }\n\n // Rule 3: Cannot create circular reference\n if (target.zone === 'inside' && this.wouldCreateCircular(item, target)) {\n return false;\n }\n\n // Rule 4: Respect slot type constraints\n if (!this.isTypeAllowedInSlot(item, target)) {\n return false;\n }\n\n // Rule 5: Max depth\n if (target.zone === 'inside' && target.depth + 1 >= MAX_DEPTH) {\n return false;\n }\n }\n\n return true;\n }\n\n executeDrop(): void {\n const item = this.dragItem();\n const target = this.dropTarget();\n if (!item || !target) return;\n\n if (!this.validateDrop(item, target)) {\n this.endDrag();\n return;\n }\n\n if (item.kind === 'section') {\n this.executeSectionDrop(item, target);\n } else {\n this.executeBlockDrop(item, target);\n }\n\n this.endDrag();\n }\n\n private executeSectionDrop(item: DragItem, target: DropTarget): void {\n const sections = this.sections();\n const currentIndex = sections.findIndex((s) => s.id === item.elementId);\n if (currentIndex === -1) return;\n\n let newIndex = target.index;\n if (currentIndex < newIndex) {\n newIndex--;\n }\n\n this.store.dispatch(VisualEditorActions.moveSection({ sectionId: item.elementId, newIndex }));\n }\n\n private executeBlockDrop(item: DragItem, target: DropTarget): void {\n const isSameParent =\n item.sectionId === target.sectionId &&\n this.pathsEqual(item.parentPath, target.parentPath);\n\n if (isSameParent && target.zone !== 'inside') {\n // Same parent - reorder\n const slotName = target.slotName;\n let newIndex = target.index;\n\n // Adjust index if moving within same slot\n if (item.slotName === slotName && item.sourceIndex < newIndex) {\n newIndex--;\n }\n\n if (item.parentPath.length === 0) {\n this.store.dispatch(VisualEditorActions.moveBlock({\n sectionId: item.sectionId,\n elementId: item.elementId,\n targetSlotName: slotName,\n newIndex,\n }));\n } else {\n this.store.dispatch(VisualEditorActions.moveNestedBlock({\n sectionId: item.sectionId,\n parentPath: item.parentPath,\n elementId: item.elementId,\n targetSlotName: slotName,\n newIndex,\n }));\n }\n } else {\n // Different parent or drop inside - reparent\n let targetParentPath: string[];\n let targetSlotName: string;\n let targetIndex: number;\n\n if (target.zone === 'inside') {\n // Dropping inside a block - the target block becomes the parent\n targetParentPath = target.parentPath;\n targetSlotName = target.slotName;\n targetIndex = target.index;\n } else {\n targetParentPath = target.parentPath;\n targetSlotName = target.slotName;\n targetIndex = target.index;\n }\n\n this.store.dispatch(VisualEditorActions.reparentBlock({\n sourceSectionId: item.sectionId,\n sourceParentPath: item.parentPath,\n elementId: item.elementId,\n targetSectionId: target.sectionId,\n targetParentPath,\n targetSlotName,\n targetIndex,\n }));\n }\n }\n\n private isDropOnSelf(item: DragItem, target: DropTarget): boolean {\n // Check if we're trying to drop an element inside itself\n return target.parentPath.includes(item.elementId);\n }\n\n private wouldCreateCircular(item: DragItem, target: DropTarget): boolean {\n // Cannot drop a parent inside its own descendant\n if (target.parentPath.includes(item.elementId)) {\n return true;\n }\n\n // If the target's parentPath ends with the dragged element, it would be circular\n const lastPathId = target.parentPath[target.parentPath.length - 1];\n if (lastPathId === item.elementId) {\n return true;\n }\n\n // Check if any element in the dragged subtree contains the target parent\n const sections = this.sections();\n const section = sections.find((s) => s.id === item.sectionId);\n if (!section) return false;\n\n const draggedElement = this.findElementInTree(section.elements, item.elementId);\n if (!draggedElement) return false;\n\n // Check if the target element is a descendant of the dragged element\n const targetParentId = target.parentPath[target.parentPath.length - 1];\n if (targetParentId && this.isDescendant(draggedElement, targetParentId)) {\n return true;\n }\n\n return false;\n }\n\n private isTypeAllowedInSlot(item: DragItem, target: DropTarget): boolean {\n // Find the parent element to check its slot constraints\n if (target.parentPath.length === 0) {\n // Dropping at section level\n const section = this.sections().find((s) => s.id === target.sectionId);\n if (!section) return true;\n\n const sectionDef = this.registry.get(section.type);\n if (!sectionDef?.slots) return true;\n\n const slot = sectionDef.slots.find((s) => s.name === target.slotName);\n if (!slot?.constraints?.allowedTypes) return true;\n\n return slot.constraints.allowedTypes.includes(item.elementType);\n }\n\n // Dropping inside a nested block\n const parentId = target.parentPath[target.parentPath.length - 1];\n const section = this.sections().find((s) => s.id === target.sectionId);\n if (!section) return true;\n\n const parentElement = this.findElementInTree(section.elements, parentId);\n if (!parentElement) return true;\n\n const parentDef = this.registry.get(parentElement.type);\n if (!parentDef?.slots) return true;\n\n const slot = parentDef.slots.find((s) => s.name === target.slotName);\n if (!slot?.constraints?.allowedTypes) return true;\n\n return slot.constraints.allowedTypes.includes(item.elementType);\n }\n\n private findElementInTree(elements: EditorElement[], elementId: string): EditorElement | null {\n for (const el of elements) {\n if (el.id === elementId) return el;\n if (el.children?.length) {\n const found = this.findElementInTree(el.children, elementId);\n if (found) return found;\n }\n }\n return null;\n }\n\n private isDescendant(parent: EditorElement, targetId: string): boolean {\n if (!parent.children) return false;\n for (const child of parent.children) {\n if (child.id === targetId) return true;\n if (this.isDescendant(child, targetId)) return true;\n }\n return false;\n }\n\n private pathsEqual(a: string[], b: string[]): boolean {\n if (a.length !== b.length) return false;\n return a.every((id, i) => id === b[i]);\n }\n}\n","import {\n Component,\n ChangeDetectionStrategy,\n input,\n output,\n inject,\n signal,\n computed,\n ElementRef,\n viewChild,\n} from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { VisualEditorFacade } from '../../services/visual-editor-facade.service';\nimport { DragDropService } from '../../dnd/drag-drop.service';\nimport type { DragItem, DropTarget, DropZone } from '../../dnd/drag-drop.types';\nimport { EditorElement } from '../../store/visual-editor.state';\nimport { SlotDefinition } from '../../registry/slot.types';\n\n/**\n * Context for a block in the tree hierarchy\n */\nexport interface BlockTreeContext {\n sectionId: string;\n parentPath: string[];\n depth: number;\n}\n\n/**\n * Target information for opening the block picker\n */\nexport interface BlockPickerTarget {\n sectionId: string;\n parentPath: string[];\n parentType: string;\n slots: SlotDefinition[];\n}\n\n/**\n * Recursive component for rendering a block in the sidebar tree\n * Supports nested blocks with expand/collapse functionality\n */\n@Component({\n selector: 'lib-block-tree-item',\n imports: [BlockTreeItemComponent],\n template: `\n <div\n class=\"tree-block\"\n #treeBlock\n draggable=\"true\"\n [class.selected]=\"facade.selectedBlock()?.id === block().id\"\n [class.has-children]=\"blockHasSlots()\"\n [class.drag-over-before]=\"dropZone() === 'before'\"\n [class.drag-over-inside]=\"dropZone() === 'inside'\"\n [class.drag-over-after]=\"dropZone() === 'after'\"\n [class.is-dragging]=\"isDragSource()\"\n [style.paddingLeft.rem]=\"0.75 + context().depth * 0.75\"\n [attr.data-drag-id]=\"block().id\"\n (click)=\"onSelect($event)\"\n (dragstart)=\"onDragStart($event)\"\n (dragend)=\"onDragEnd($event)\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n >\n @if (blockHasSlots()) {\n <button\n class=\"expand-btn\"\n [class.expanded]=\"isExpanded()\"\n (click)=\"toggleExpand($event)\"\n [attr.aria-expanded]=\"isExpanded()\"\n [attr.aria-label]=\"isExpanded() ? 'Collapse' : 'Expand'\"\n >\n <span class=\"expand-icon\">&#9654;</span>\n </button>\n } @else {\n <span class=\"block-indent\"></span>\n }\n <span class=\"icon-drag-wrapper\">\n <span class=\"block-icon\" [innerHTML]=\"blockIcon()\"></span>\n <span\n class=\"drag-handle\"\n role=\"button\"\n [attr.aria-label]=\"'Drag ' + blockName() + ' to reorder'\"\n [attr.aria-roledescription]=\"'draggable'\"\n tabindex=\"0\"\n (keydown)=\"onDragHandleKeydown($event)\"\n >\n <svg width=\"10\" height=\"16\" viewBox=\"0 0 10 16\" fill=\"currentColor\" aria-hidden=\"true\">\n <circle cx=\"3\" cy=\"2\" r=\"1.5\"/>\n <circle cx=\"7\" cy=\"2\" r=\"1.5\"/>\n <circle cx=\"3\" cy=\"8\" r=\"1.5\"/>\n <circle cx=\"7\" cy=\"8\" r=\"1.5\"/>\n <circle cx=\"3\" cy=\"14\" r=\"1.5\"/>\n <circle cx=\"7\" cy=\"14\" r=\"1.5\"/>\n </svg>\n </span>\n </span>\n <span class=\"block-name\">{{ blockName() }}</span>\n <div class=\"tree-actions\">\n @if (index() > 0) {\n <button class=\"tree-btn\" (click)=\"onMoveUp($event)\" title=\"Move up\">&#8593;</button>\n }\n @if (index() < totalSiblings() - 1) {\n <button class=\"tree-btn\" (click)=\"onMoveDown($event)\" title=\"Move down\">&#8595;</button>\n }\n @if (duplicable()) {\n <button class=\"tree-btn\" (click)=\"onDuplicate($event)\" title=\"Duplicate\">\n <span class=\"material-icon\">content_copy</span>\n </button>\n }\n <button class=\"tree-btn delete\" (click)=\"onDelete($event)\" title=\"Delete\">&times;</button>\n </div>\n </div>\n\n @if (isExpanded() && blockHasSlots()) {\n <div class=\"nested-content\">\n @for (child of children(); track child.id; let childIdx = $index) {\n <lib-block-tree-item\n [block]=\"child\"\n [context]=\"childContext()\"\n [index]=\"childIdx\"\n [totalSiblings]=\"children().length\"\n [expandAll]=\"expandAll()\"\n (selectBlock)=\"selectBlock.emit($event)\"\n (deleteBlock)=\"deleteBlock.emit($event)\"\n (duplicateBlock)=\"duplicateBlock.emit($event)\"\n (moveBlock)=\"moveBlock.emit($event)\"\n (openBlockPicker)=\"openBlockPicker.emit($event)\"\n />\n }\n @if (canAddMore()) {\n <button\n class=\"add-block-btn nested\"\n [style.marginLeft.rem]=\"0.75 + (context().depth + 1) * 0.75\"\n (click)=\"onAddBlock($event)\"\n >\n <span class=\"add-icon-circle\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" aria-hidden=\"true\">\n <circle cx=\"10\" cy=\"10\" r=\"9\"/>\n <line x1=\"10\" y1=\"6\" x2=\"10\" y2=\"14\"/>\n <line x1=\"6\" y1=\"10\" x2=\"14\" y2=\"10\"/>\n </svg>\n </span> Add block\n </button>\n }\n </div>\n }\n `,\n styles: `\n :host {\n display: block;\n font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n }\n\n .tree-block {\n display: flex;\n align-items: center;\n gap: 0.375rem;\n padding: 0.375rem 0.5rem;\n padding-right: 0.75rem;\n cursor: pointer;\n transition: background 0.15s;\n position: relative;\n }\n\n .tree-block:hover {\n background: #f6f6f7;\n border-radius: 8px;\n margin-right: 0.375rem;\n }\n\n .tree-block.selected {\n background: #005bd3;\n color: #fff;\n border-radius: 8px;\n margin-right: 0.375rem;\n }\n\n .tree-block.selected .block-icon,\n .tree-block.selected .block-name,\n .tree-block.selected .expand-btn,\n .tree-block.selected .drag-handle,\n .tree-block.selected .tree-btn {\n color: inherit;\n }\n\n .tree-block.drag-over-before {\n box-shadow: inset 0 2px 0 0 #005bd3;\n }\n\n .tree-block.drag-over-inside {\n background: rgba(0, 91, 211, 0.08);\n box-shadow: inset 0 0 0 2px #005bd3;\n }\n\n .tree-block.drag-over-after {\n box-shadow: inset 0 -2px 0 0 #005bd3;\n }\n\n .tree-block.is-dragging {\n opacity: 0.4;\n cursor: grabbing;\n }\n\n .drag-handle {\n cursor: grab;\n color: #8c9196;\n opacity: 0;\n transition: opacity 0.15s;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n padding: 0.125rem;\n border: none;\n background: none;\n border-radius: 4px;\n }\n\n .drag-handle:hover {\n color: #303030;\n background: #e3e3e3;\n }\n\n .drag-handle:focus-visible {\n opacity: 1;\n outline: 2px solid #005bd3;\n outline-offset: 1px;\n }\n\n .tree-block:hover .drag-handle {\n opacity: 1;\n }\n\n @media (prefers-reduced-motion: reduce) {\n .tree-block,\n .drag-handle,\n .tree-actions,\n .expand-icon {\n transition: none;\n }\n }\n\n .expand-btn {\n width: 16px;\n height: 16px;\n padding: 0;\n border: none;\n background: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #8c9196;\n flex-shrink: 0;\n }\n\n .expand-btn.expanded .expand-icon {\n transform: rotate(90deg);\n }\n\n .expand-icon {\n font-size: 0.5rem;\n transition: transform 0.15s;\n }\n\n .block-indent {\n width: 18px;\n height: 1px;\n background: #e3e3e3;\n flex-shrink: 0;\n }\n\n .icon-drag-wrapper {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n }\n\n .icon-drag-wrapper .drag-handle {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .tree-block:hover .icon-drag-wrapper .block-icon,\n .icon-drag-wrapper:has(.drag-handle:focus-visible) .block-icon {\n visibility: hidden;\n }\n\n .block-icon {\n font-size: 0.875rem;\n color: #8c9196;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n }\n\n .block-name {\n flex: 1;\n font-size: 0.8125rem;\n color: #303030;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .tree-actions {\n display: flex;\n gap: 0.125rem;\n opacity: 0;\n transition: opacity 0.15s;\n }\n\n .tree-block:hover .tree-actions {\n opacity: 1;\n }\n\n .tree-btn {\n padding: 0.125rem 0.375rem;\n border: none;\n border-radius: 4px;\n background: transparent;\n cursor: pointer;\n font-size: 0.6875rem;\n color: #8c9196;\n transition: all 0.15s;\n }\n\n .tree-btn:hover {\n background: #e3e3e3;\n color: #303030;\n }\n\n .tree-btn.delete:hover {\n background: #fef2f0;\n color: #d72c0d;\n }\n\n .material-icon {\n font-family: 'Material Icons', sans-serif;\n font-size: inherit;\n font-weight: normal;\n font-style: normal;\n line-height: 1;\n letter-spacing: normal;\n text-transform: none;\n white-space: nowrap;\n word-wrap: normal;\n direction: ltr;\n -webkit-font-smoothing: antialiased;\n text-rendering: optimizeLegibility;\n }\n\n .nested-content {\n border-left: 1px solid #e3e3e3;\n margin-left: 1.25rem;\n }\n\n .add-block-btn {\n display: flex;\n align-items: center;\n gap: 0.375rem;\n width: calc(100% - 1rem);\n margin: 0.25rem 0.5rem;\n padding: 0.375rem 0.5rem;\n border: none;\n border-radius: 8px;\n background: transparent;\n cursor: pointer;\n font-size: 0.8125rem;\n font-family: inherit;\n color: #005bd3;\n transition: all 0.15s;\n }\n\n .add-block-btn:hover {\n background: #f0f5ff;\n color: #004299;\n }\n\n .add-icon {\n font-size: 0.8125rem;\n font-weight: 600;\n }\n\n .add-icon-circle {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BlockTreeItemComponent {\n readonly facade = inject(VisualEditorFacade);\n private readonly dndService = inject(DragDropService);\n private readonly sanitizer = inject(DomSanitizer);\n\n private readonly treeBlock = viewChild<ElementRef<HTMLElement>>('treeBlock');\n\n readonly block = input.required<EditorElement>();\n readonly context = input.required<BlockTreeContext>();\n readonly index = input.required<number>();\n readonly totalSiblings = input.required<number>();\n readonly expandAll = input(false);\n\n readonly selectBlock = output<{ block: EditorElement; context: BlockTreeContext }>();\n readonly deleteBlock = output<{ block: EditorElement; context: BlockTreeContext }>();\n readonly duplicateBlock = output<{ block: EditorElement; context: BlockTreeContext }>();\n readonly moveBlock = output<{ block: EditorElement; context: BlockTreeContext; newIndex: number }>();\n readonly openBlockPicker = output<BlockPickerTarget>();\n\n private readonly expanded = signal(false);\n readonly dropZone = signal<DropZone | null>(null);\n\n readonly isDragSource = computed(() => {\n const dragItem = this.dndService.dragItem();\n return dragItem !== null && dragItem.elementId === this.block().id;\n });\n\n readonly blockHasSlots = computed(() => this.facade.hasSlots(this.block().type));\n readonly blockSlots = computed(() => this.facade.getBlockSlots(this.block().type));\n readonly children = computed(() => this.block().children ?? []);\n readonly childContext = computed<BlockTreeContext>(() => ({\n sectionId: this.context().sectionId,\n parentPath: [...this.context().parentPath, this.block().id],\n depth: this.context().depth + 1,\n }));\n readonly blockIcon = computed(() => {\n const iconMap: Record<string, string> = {\n 'text-block': '<svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path d=\"M4 3h12a1 1 0 011 1v1a1 1 0 01-1 1h-5v10a1 1 0 01-2 0V6H4a1 1 0 01-1-1V4a1 1 0 011-1z\"/></svg>',\n 'button-block': '<svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path d=\"M3 6a2 2 0 012-2h10a2 2 0 012 2v8a2 2 0 01-2 2H5a2 2 0 01-2-2V6zm4 4a1 1 0 100 2h6a1 1 0 100-2H7z\"/></svg>',\n 'image-block': '<svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path d=\"M4 3a2 2 0 00-2 2v10a2 2 0 002 2h12a2 2 0 002-2V5a2 2 0 00-2-2H4zm12 12H4l4-8 3 6 2-4 3 6zM6 7a1 1 0 110-2 1 1 0 010 2z\"/></svg>',\n 'icon-block': '<svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path d=\"M10 2l2.39 4.84L18 7.77l-4 3.9.94 5.5L10 14.27l-4.94 2.9.94-5.5-4-3.9 5.61-.93L10 2z\"/></svg>',\n 'feature-item': '<svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path d=\"M10 2l2.39 4.84L18 7.77l-4 3.9.94 5.5L10 14.27l-4.94 2.9.94-5.5-4-3.9 5.61-.93L10 2z\"/></svg>',\n 'card-block': '<svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path d=\"M4 3a2 2 0 00-2 2v10a2 2 0 002 2h12a2 2 0 002-2V5a2 2 0 00-2-2H4zm0 2h12v4H4V5zm0 6h8v4H4v-4z\"/></svg>',\n 'video-block': '<svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path d=\"M4 3a2 2 0 00-2 2v10a2 2 0 002 2h12a2 2 0 002-2V5a2 2 0 00-2-2H4zm4 3.5l5 3.5-5 3.5v-7z\"/></svg>',\n 'picture-block': '<svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path d=\"M4 3a2 2 0 00-2 2v10a2 2 0 002 2h12a2 2 0 002-2V5a2 2 0 00-2-2H4zm12 12H4l4-8 3 6 2-4 3 6zM6 7a1 1 0 110-2 1 1 0 010 2z\"/></svg>',\n 'flex-layout-block': '<svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path d=\"M3 3h4v14H3V3zm5 0h4v14H8V3zm5 0h4v14h-4V3z\"/></svg>',\n };\n const def = this.facade.getDefinition(this.block().type);\n const raw = iconMap[this.block().type] ?? def?.icon ?? '<svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path d=\"M10 2l1.5 3h3.5l-2.5 2.5 1 3.5-3.5-2-3.5 2 1-3.5L4 5h3.5L10 2zm-6 10h12v2H4v-2zm2 4h8v2H6v-2z\"/></svg>';\n const html = raw.trim().startsWith('<') ? raw : `<span style=\"font-family:'Material Icons',sans-serif;font-weight:normal;font-style:normal;line-height:1;letter-spacing:normal;text-transform:none;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility\">${raw}</span>`;\n return this.sanitizer.bypassSecurityTrustHtml(html);\n });\n readonly blockName = computed(() => {\n const block = this.block();\n if (block.adminLabel) return block.adminLabel;\n const def = this.facade.getDefinition(block.type);\n const preview = String(block.props['content'] ?? block.props['label'] ?? block.props['text'] ?? '');\n if (preview && preview.length > 20) {\n return preview.substring(0, 20) + '...';\n }\n return preview || def?.name || block.type;\n });\n readonly duplicable = computed(() => this.facade.isBlockDuplicable(this.block().type));\n readonly canAddMore = computed(() => {\n const newDepth = this.context().depth + 1;\n return this.facade.canAddNestedBlock([...this.context().parentPath, this.block().id]) && newDepth < 12;\n });\n\n isExpanded(): boolean {\n return this.expandAll() || this.expanded();\n }\n\n toggleExpand(event: Event): void {\n event.stopPropagation();\n this.expanded.update((v) => !v);\n }\n\n hasSlots(): boolean {\n return this.blockHasSlots();\n }\n\n getBlockSlots(): SlotDefinition[] {\n return this.blockSlots();\n }\n\n onDuplicate(event: Event): void {\n event.stopPropagation();\n this.duplicateBlock.emit({ block: this.block(), context: this.context() });\n }\n\n onSelect(event: Event): void {\n event.stopPropagation();\n this.selectBlock.emit({ block: this.block(), context: this.context() });\n }\n\n onDelete(event: Event): void {\n event.stopPropagation();\n this.deleteBlock.emit({ block: this.block(), context: this.context() });\n }\n\n onMoveUp(event: Event): void {\n event.stopPropagation();\n this.moveBlock.emit({ block: this.block(), context: this.context(), newIndex: this.index() - 1 });\n }\n\n onMoveDown(event: Event): void {\n event.stopPropagation();\n this.moveBlock.emit({ block: this.block(), context: this.context(), newIndex: this.index() + 1 });\n }\n\n onAddBlock(event: Event): void {\n event.stopPropagation();\n const slots = this.getBlockSlots();\n this.openBlockPicker.emit({\n sectionId: this.context().sectionId,\n parentPath: [...this.context().parentPath, this.block().id],\n parentType: this.block().type,\n slots,\n });\n this.expanded.set(true);\n }\n\n // Drag & Drop handlers\n\n onDragStart(event: DragEvent): void {\n event.stopPropagation();\n const block = this.block();\n const ctx = this.context();\n const item: DragItem = {\n kind: 'block',\n elementId: block.id,\n elementType: block.type,\n sectionId: ctx.sectionId,\n parentPath: ctx.parentPath,\n slotName: block.slotName,\n sourceIndex: this.index(),\n };\n this.dndService.startDrag(item, event);\n }\n\n onDragEnd(event: DragEvent): void {\n event.stopPropagation();\n this.dndService.endDrag();\n this.dropZone.set(null);\n }\n\n onDragOver(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n\n const dragItem = this.dndService.dragItem();\n if (!dragItem || dragItem.kind !== 'block') return;\n\n const el = this.treeBlock()?.nativeElement;\n if (!el) return;\n\n const canDropInside = this.hasSlots();\n const zone = this.dndService.computeDropZone(event, el, canDropInside);\n const target = this.buildDropTarget(zone);\n\n if (this.dndService.validateDrop(dragItem, target)) {\n event.dataTransfer!.dropEffect = 'move';\n this.dropZone.set(zone);\n this.dndService.updateDropTarget(target);\n } else {\n event.dataTransfer!.dropEffect = 'none';\n this.dropZone.set(null);\n this.dndService.updateDropTarget(null);\n }\n }\n\n onDragLeave(event: DragEvent): void {\n const el = this.treeBlock()?.nativeElement;\n if (!el) return;\n\n // Only clear if we're actually leaving this element (not entering a child)\n const relatedTarget = event.relatedTarget as Node | null;\n if (relatedTarget && el.contains(relatedTarget)) {\n return;\n }\n\n this.dropZone.set(null);\n }\n\n onDrop(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.dropZone.set(null);\n this.dndService.executeDrop();\n }\n\n onDragHandleKeydown(event: KeyboardEvent): void {\n if (event.key === 'ArrowUp' && this.index() > 0) {\n event.preventDefault();\n this.moveBlock.emit({ block: this.block(), context: this.context(), newIndex: this.index() - 1 });\n } else if (event.key === 'ArrowDown' && this.index() < this.totalSiblings() - 1) {\n event.preventDefault();\n this.moveBlock.emit({ block: this.block(), context: this.context(), newIndex: this.index() + 1 });\n }\n }\n\n private buildDropTarget(zone: DropZone): DropTarget {\n const ctx = this.context();\n const block = this.block();\n\n if (zone === 'inside') {\n // Dropping inside this block: becomes a child\n const slots = this.blockSlots();\n const slotName = slots[0]?.name ?? 'default';\n return {\n kind: 'block',\n sectionId: ctx.sectionId,\n parentPath: [...ctx.parentPath, block.id],\n slotName,\n index: this.children().length,\n depth: ctx.depth + 1,\n zone,\n };\n }\n\n // Dropping before/after this block: sibling position\n const slotName = block.slotName ?? 'default';\n return {\n kind: 'block',\n sectionId: ctx.sectionId,\n parentPath: ctx.parentPath,\n slotName,\n index: zone === 'before' ? this.index() : this.index() + 1,\n depth: ctx.depth,\n zone,\n };\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { ShopifyGraphQLClient } from './shopify-graphql-client.service';\n\nexport interface ShopifyFile {\n id: string;\n alt: string;\n url: string;\n filename: string;\n mediaType: 'IMAGE' | 'VIDEO';\n mimeType: string;\n width?: number;\n height?: number;\n createdAt: string;\n}\n\nexport interface ShopifyFilesPage {\n files: ShopifyFile[];\n pageInfo: {\n hasNextPage: boolean;\n endCursor: string | null;\n };\n}\n\nexport const FILES_QUERY = `\n query GetFiles($first: Int!, $after: String, $query: String) {\n files(first: $first, after: $after, query: $query) {\n edges {\n node {\n ... on MediaImage {\n id\n alt\n createdAt\n mimeType\n image {\n url\n width\n height\n }\n originalSource {\n fileSize\n }\n }\n ... on Video {\n id\n alt\n createdAt\n filename\n originalSource {\n mimeType\n url\n }\n sources {\n url\n mimeType\n width\n height\n }\n }\n }\n cursor\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n }\n`;\n\ninterface MediaImageNode {\n id: string;\n alt: string;\n createdAt: string;\n mimeType: string;\n image: {\n url: string;\n width: number;\n height: number;\n };\n originalSource?: {\n fileSize?: number;\n };\n}\n\ninterface VideoNode {\n id: string;\n alt: string;\n createdAt: string;\n filename: string;\n originalSource?: {\n mimeType?: string;\n url?: string;\n };\n sources: Array<{\n url: string;\n mimeType: string;\n width: number;\n height: number;\n }>;\n}\n\ninterface FilesResponse {\n files: {\n edges: Array<{\n node: MediaImageNode | VideoNode;\n cursor: string;\n }>;\n pageInfo: {\n hasNextPage: boolean;\n endCursor: string | null;\n };\n };\n}\n\n@Injectable({ providedIn: 'root' })\nexport class ShopifyFilesService {\n private readonly client = inject(ShopifyGraphQLClient);\n\n getFiles(\n mediaType: 'IMAGE' | 'VIDEO',\n search?: string,\n first = 24,\n after?: string\n ): Observable<ShopifyFilesPage> {\n const queryParts = [`media_type:${mediaType}`];\n if (search?.trim()) {\n queryParts.push(search.trim());\n }\n\n const variables: Record<string, unknown> = {\n first,\n query: queryParts.join(' '),\n };\n if (after) {\n variables['after'] = after;\n }\n\n return this.client.query<FilesResponse>(FILES_QUERY, variables).pipe(\n map(response => ({\n files: response.files.edges\n .map(edge => this.mapNode(edge.node, mediaType))\n .filter((f): f is ShopifyFile => f !== null),\n pageInfo: response.files.pageInfo,\n }))\n );\n }\n\n private mapNode(node: MediaImageNode | VideoNode, mediaType: 'IMAGE' | 'VIDEO'): ShopifyFile | null {\n if (mediaType === 'IMAGE' && 'image' in node) {\n const img = node as MediaImageNode;\n if (!img.image?.url) return null;\n return {\n id: img.id,\n alt: img.alt ?? '',\n url: img.image.url,\n filename: this.extractFilename(img.image.url),\n mediaType: 'IMAGE',\n mimeType: img.mimeType ?? 'image/jpeg',\n width: img.image.width,\n height: img.image.height,\n createdAt: img.createdAt,\n };\n }\n\n if (mediaType === 'VIDEO' && 'sources' in node) {\n const vid = node as VideoNode;\n const source = vid.sources[0];\n const url = source?.url ?? vid.originalSource?.url ?? '';\n if (!url) return null;\n return {\n id: vid.id,\n alt: vid.alt ?? '',\n url,\n filename: vid.filename ?? this.extractFilename(url),\n mediaType: 'VIDEO',\n mimeType: source?.mimeType ?? vid.originalSource?.mimeType ?? 'video/mp4',\n width: source?.width,\n height: source?.height,\n createdAt: vid.createdAt,\n };\n }\n\n return null;\n }\n\n private extractFilename(url: string): string {\n try {\n const pathname = new URL(url).pathname;\n return pathname.split('/').pop() ?? 'unknown';\n } catch {\n return 'unknown';\n }\n }\n}\n","import {\n Component,\n ChangeDetectionStrategy,\n input,\n output,\n signal,\n inject,\n OnInit,\n OnDestroy,\n ElementRef,\n viewChild,\n} from '@angular/core';\nimport { Subject, takeUntil, debounceTime, switchMap, tap } from 'rxjs';\nimport { ShopifyFilesService, ShopifyFile } from '../../services/shopify-files.service';\n\n@Component({\n selector: 'lib-shopify-file-picker',\n template: `\n <div\n class=\"file-picker-overlay\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-label]=\"mediaType() === 'IMAGE' ? 'Select Image' : 'Select Video'\"\n (click)=\"onBackdropClick($event)\"\n (keydown.escape)=\"close()\"\n >\n <div class=\"file-picker\" (click)=\"$event.stopPropagation()\">\n <div class=\"picker-header\">\n <h3>{{ mediaType() === 'IMAGE' ? 'Select Image' : 'Select Video' }}</h3>\n <button class=\"close-btn\" (click)=\"close()\" aria-label=\"Close\">×</button>\n </div>\n\n <div class=\"picker-search\">\n <input\n #searchInput\n type=\"text\"\n class=\"picker-search-input\"\n placeholder=\"Search files...\"\n [value]=\"searchTerm()\"\n (input)=\"onSearchInput($event)\"\n aria-label=\"Search files\"\n />\n </div>\n\n <div\n class=\"picker-content\"\n role=\"listbox\"\n [attr.aria-label]=\"mediaType() === 'IMAGE' ? 'Images' : 'Videos'\"\n #scrollContainer\n (scroll)=\"onScroll()\"\n >\n @if (isLoading() && files().length === 0) {\n <div class=\"picker-loading\">Loading...</div>\n } @else if (error()) {\n <div class=\"picker-error\" role=\"alert\">\n <p>Failed to load files</p>\n <button class=\"retry-btn\" (click)=\"loadFiles()\">Retry</button>\n </div>\n } @else if (files().length === 0 && !isLoading()) {\n <div class=\"picker-empty\">No files found</div>\n } @else {\n <div class=\"file-grid\">\n @for (file of files(); track file.id) {\n <button\n class=\"file-card\"\n role=\"option\"\n [attr.aria-selected]=\"selectedFile()?.id === file.id\"\n [class.selected]=\"selectedFile()?.id === file.id\"\n [class.current]=\"file.url === currentValue()\"\n (click)=\"selectFile(file)\"\n (dblclick)=\"confirmSelection()\"\n (keydown.enter)=\"selectAndConfirm(file)\"\n >\n @if (mediaType() === 'IMAGE') {\n <img\n class=\"file-thumbnail\"\n [src]=\"getThumbnailUrl(file.url)\"\n [alt]=\"file.alt || file.filename\"\n loading=\"lazy\"\n />\n } @else {\n <div class=\"video-thumbnail\">\n <svg class=\"video-icon\" width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M8 5v14l11-7z\"/>\n </svg>\n </div>\n }\n <span class=\"file-name\">{{ file.filename }}</span>\n @if (file.url === currentValue()) {\n <span class=\"current-badge\">Current</span>\n }\n </button>\n }\n </div>\n @if (isLoading() && files().length > 0) {\n <div class=\"picker-loading\">Loading more...</div>\n }\n }\n </div>\n\n <div class=\"picker-footer\">\n <button class=\"cancel-btn\" (click)=\"close()\">Cancel</button>\n <button\n class=\"select-btn\"\n [disabled]=\"!selectedFile()\"\n (click)=\"confirmSelection()\"\n >\n Select\n </button>\n </div>\n </div>\n </div>\n `,\n styles: `\n .file-picker-overlay {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1100;\n font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n }\n\n .file-picker {\n background: #fff;\n border-radius: 12px;\n width: 720px;\n max-width: 95vw;\n height: 80vh;\n max-height: 80vh;\n display: flex;\n flex-direction: column;\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.2);\n }\n\n .picker-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 1rem 1.25rem;\n border-bottom: 1px solid #e3e3e3;\n }\n\n .picker-header h3 {\n margin: 0;\n font-size: 0.9375rem;\n font-weight: 600;\n color: #303030;\n }\n\n .close-btn {\n border: none;\n background: none;\n font-size: 1.25rem;\n cursor: pointer;\n color: #8c9196;\n line-height: 1;\n padding: 0.25rem;\n border-radius: 8px;\n transition: all 0.15s;\n }\n\n .close-btn:hover {\n background: #f6f6f7;\n color: #303030;\n }\n\n .picker-search {\n padding: 0.75rem 1.25rem;\n border-bottom: 1px solid #e3e3e3;\n }\n\n .picker-search-input {\n width: 100%;\n padding: 0.5rem 0.75rem;\n border: 1px solid #c9cccf;\n border-radius: 8px;\n font-size: 0.8125rem;\n font-family: inherit;\n color: #303030;\n outline: none;\n transition: border-color 0.15s, box-shadow 0.15s;\n box-sizing: border-box;\n }\n\n .picker-search-input:focus {\n border-color: #005bd3;\n box-shadow: 0 0 0 1px #005bd3;\n }\n\n .picker-search-input::placeholder {\n color: #8c9196;\n }\n\n .picker-content {\n flex: 1;\n overflow-y: auto;\n padding: 1rem 1.25rem;\n min-height: 0;\n }\n\n .file-grid {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 0.75rem;\n align-content: start;\n }\n\n .file-card {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 0.375rem;\n border: 2px solid #e3e3e3;\n border-radius: 8px;\n background: #fff;\n cursor: pointer;\n transition: all 0.15s;\n position: relative;\n text-align: center;\n font-family: inherit;\n overflow: hidden;\n }\n\n .file-card:hover {\n border-color: #005bd3;\n background: #f8fafe;\n }\n\n .file-card:focus-visible {\n outline: 2px solid #005bd3;\n outline-offset: 2px;\n }\n\n .file-card.selected {\n border-color: #005bd3;\n background: #f0f5ff;\n box-shadow: 0 0 0 1px #005bd3;\n }\n\n .file-card.current {\n border-color: #008060;\n }\n\n .file-thumbnail {\n width: 100%;\n height: 80px;\n object-fit: cover;\n border-radius: 6px;\n background: #f6f6f7;\n }\n\n .video-thumbnail {\n width: 100%;\n height: 80px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: #1a1a1a;\n border-radius: 6px;\n color: #fff;\n }\n\n .video-icon {\n opacity: 0.8;\n }\n\n .file-name {\n display: block;\n margin-top: 0.375rem;\n font-size: 0.6875rem;\n color: #8c9196;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 100%;\n }\n\n .current-badge {\n position: absolute;\n top: 0.375rem;\n right: 0.375rem;\n padding: 0.125rem 0.375rem;\n background: #008060;\n color: #fff;\n font-size: 0.625rem;\n font-weight: 600;\n border-radius: 6px;\n }\n\n .picker-loading {\n padding: 2rem;\n text-align: center;\n color: #8c9196;\n font-size: 0.8125rem;\n }\n\n .picker-error {\n padding: 2rem;\n text-align: center;\n color: #d72c0d;\n }\n\n .picker-error p {\n margin: 0 0 0.75rem;\n font-size: 0.8125rem;\n }\n\n .retry-btn {\n padding: 0.375rem 0.75rem;\n border: 1px solid #d72c0d;\n border-radius: 8px;\n background: #fff;\n color: #d72c0d;\n cursor: pointer;\n font-size: 0.8125rem;\n font-family: inherit;\n transition: background 0.15s;\n }\n\n .retry-btn:hover {\n background: #fef2f0;\n }\n\n .picker-empty {\n padding: 2rem;\n text-align: center;\n color: #8c9196;\n font-size: 0.8125rem;\n }\n\n .picker-footer {\n display: flex;\n justify-content: flex-end;\n gap: 0.5rem;\n padding: 0.75rem 1.25rem;\n border-top: 1px solid #e3e3e3;\n }\n\n .cancel-btn {\n padding: 0.5rem 1rem;\n border: 1px solid #c9cccf;\n border-radius: 8px;\n background: #fff;\n cursor: pointer;\n font-size: 0.8125rem;\n font-family: inherit;\n color: #303030;\n transition: all 0.15s;\n }\n\n .cancel-btn:hover {\n background: #f6f6f7;\n }\n\n .select-btn {\n padding: 0.5rem 1rem;\n border: none;\n border-radius: 8px;\n background: #005bd3;\n color: #fff;\n cursor: pointer;\n font-size: 0.8125rem;\n font-weight: 500;\n font-family: inherit;\n transition: background 0.15s;\n }\n\n .select-btn:hover:not(:disabled) {\n background: #004299;\n }\n\n .select-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ShopifyFilePickerComponent implements OnInit, OnDestroy {\n readonly mediaType = input.required<'IMAGE' | 'VIDEO'>();\n readonly currentValue = input<string>('');\n readonly fileSelected = output<string>();\n readonly closed = output<void>();\n\n private readonly filesService = inject(ShopifyFilesService);\n private readonly destroy$ = new Subject<void>();\n private readonly searchSubject = new Subject<string>();\n private readonly searchInput = viewChild<ElementRef<HTMLInputElement>>('searchInput');\n private readonly scrollContainer = viewChild<ElementRef<HTMLElement>>('scrollContainer');\n\n readonly files = signal<ShopifyFile[]>([]);\n readonly selectedFile = signal<ShopifyFile | null>(null);\n readonly isLoading = signal(false);\n readonly error = signal<string | null>(null);\n readonly searchTerm = signal('');\n\n private endCursor: string | null = null;\n private hasNextPage = false;\n\n ngOnInit(): void {\n this.searchSubject.pipe(\n debounceTime(300),\n tap(() => {\n this.files.set([]);\n this.endCursor = null;\n this.hasNextPage = false;\n this.selectedFile.set(null);\n }),\n switchMap(term => {\n this.searchTerm.set(term);\n this.isLoading.set(true);\n this.error.set(null);\n return this.filesService.getFiles(this.mediaType(), term || undefined);\n }),\n takeUntil(this.destroy$)\n ).subscribe({\n next: page => {\n this.files.set(page.files);\n this.endCursor = page.pageInfo.endCursor;\n this.hasNextPage = page.pageInfo.hasNextPage;\n this.isLoading.set(false);\n },\n error: () => {\n this.error.set('Failed to load files');\n this.isLoading.set(false);\n },\n });\n\n this.loadFiles();\n\n // Focus search input on open\n requestAnimationFrame(() => {\n this.searchInput()?.nativeElement.focus();\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n loadFiles(): void {\n this.isLoading.set(true);\n this.error.set(null);\n\n this.filesService\n .getFiles(this.mediaType(), this.searchTerm() || undefined)\n .pipe(takeUntil(this.destroy$))\n .subscribe({\n next: page => {\n this.files.set(page.files);\n this.endCursor = page.pageInfo.endCursor;\n this.hasNextPage = page.pageInfo.hasNextPage;\n this.isLoading.set(false);\n },\n error: () => {\n this.error.set('Failed to load files');\n this.isLoading.set(false);\n },\n });\n }\n\n onSearchInput(event: Event): void {\n const value = (event.target as HTMLInputElement).value;\n this.searchSubject.next(value);\n }\n\n onScroll(): void {\n if (!this.hasNextPage || this.isLoading()) return;\n\n const el = this.scrollContainer()?.nativeElement;\n if (!el) return;\n\n const nearBottom = el.scrollHeight - el.scrollTop - el.clientHeight < 100;\n if (nearBottom) {\n this.loadMore();\n }\n }\n\n selectFile(file: ShopifyFile): void {\n this.selectedFile.set(file);\n }\n\n selectAndConfirm(file: ShopifyFile): void {\n this.selectedFile.set(file);\n this.confirmSelection();\n }\n\n confirmSelection(): void {\n const file = this.selectedFile();\n if (file) {\n this.fileSelected.emit(file.url);\n }\n }\n\n close(): void {\n this.closed.emit();\n }\n\n onBackdropClick(event: Event): void {\n if (event.target === event.currentTarget) {\n this.close();\n }\n }\n\n getThumbnailUrl(url: string): string {\n // Shopify CDN supports image transforms via URL params\n if (url.includes('cdn.shopify.com')) {\n return url + (url.includes('?') ? '&' : '?') + 'width=300';\n }\n return url;\n }\n\n private loadMore(): void {\n if (!this.endCursor || this.isLoading()) return;\n\n this.isLoading.set(true);\n\n this.filesService\n .getFiles(this.mediaType(), this.searchTerm() || undefined, 24, this.endCursor)\n .pipe(takeUntil(this.destroy$))\n .subscribe({\n next: page => {\n this.files.update(current => [...current, ...page.files]);\n this.endCursor = page.pageInfo.endCursor;\n this.hasNextPage = page.pageInfo.hasNextPage;\n this.isLoading.set(false);\n },\n error: () => {\n this.isLoading.set(false);\n },\n });\n }\n}\n","import { Component, ChangeDetectionStrategy, inject, signal, computed, OnInit, OnDestroy, ElementRef, viewChild } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { Subject, takeUntil, switchMap, filter } from 'rxjs';\nimport { VisualEditorFacade } from '../../services/visual-editor-facade.service';\nimport { ComponentRegistryService } from '../../registry/component-registry.service';\nimport { ComponentDefinition } from '../../registry/component-definition.types';\nimport { ResolvedPreset } from '../../registry/component-registry.service';\nimport { SlotDefinition } from '../../registry/slot.types';\nimport { EditorSection, EditorElement } from '../../store/visual-editor.state';\nimport { DynamicRendererComponent } from '../dynamic-renderer.component';\nimport { VisualEditorNavigation } from '../../navigation/visual-editor-navigation.types';\nimport { PageLoadingStrategy } from '../../page-loading/page-loading-strategy.types';\nimport { VISUAL_EDITOR_CONFIG, VisualEditorConfig } from '../../config/visual-editor-config.types';\nimport { BlockTreeItemComponent, BlockTreeContext, BlockPickerTarget } from './block-tree-item.component';\nimport { ShopifyFilePickerComponent } from './shopify-file-picker.component';\nimport { DragDropService } from '../../dnd/drag-drop.service';\nimport type { DragItem, DropZone } from '../../dnd/drag-drop.types';\n\n/**\n * Main Visual Editor component\n * Provides a complete editing interface with:\n * - Sidebar with hierarchical tree view\n * - Canvas with live preview\n * - Properties panel for editing section/block properties\n */\n@Component({\n selector: 'lib-visual-editor',\n imports: [DynamicRendererComponent, BlockTreeItemComponent, ShopifyFilePickerComponent],\n template: `\n <div class=\"editor-layout\">\n <!-- Sidebar: Hierarchical Tree -->\n <aside class=\"sidebar\">\n <div class=\"sidebar-header\">\n <h2>Page Structure</h2>\n <div class=\"search-box\">\n <span class=\"search-icon\"><svg width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path d=\"M8 16a8 8 0 116.32-3.1l5.39 5.38a1 1 0 01-1.42 1.42l-5.38-5.39A8 8 0 018 16zm0-2A6 6 0 108 2a6 6 0 000 12z\"/></svg></span>\n <input\n type=\"text\"\n class=\"search-input\"\n placeholder=\"Search sections & blocks...\"\n [value]=\"searchQuery()\"\n (input)=\"onSearchInput($event)\"\n aria-label=\"Search sections and blocks\"\n />\n @if (searchQuery()) {\n <button class=\"search-clear\" (click)=\"clearSearch()\" aria-label=\"Clear search\">×</button>\n }\n </div>\n </div>\n <div class=\"section-tree\">\n @if (searchQuery() && filteredSections().length === 0) {\n <div class=\"search-no-results\">\n <p>No results for \"{{ searchQuery() }}\"</p>\n </div>\n }\n @for (section of filteredSections(); track section.id; let idx = $index) {\n <div\n class=\"tree-section\"\n [class.selected]=\"facade.selectedSection()?.id === section.id && !facade.selectedBlock()\"\n [class.drag-over-before]=\"sectionDropZone() === section.id + ':before'\"\n [class.drag-over-after]=\"sectionDropZone() === section.id + ':after'\"\n [class.is-section-dragging]=\"isSectionDragSource(section.id)\"\n >\n <div\n class=\"tree-section-header\"\n draggable=\"true\"\n (click)=\"selectSection(section, $event)\"\n (dragstart)=\"onSectionDragStart(section, idx, $event)\"\n (dragend)=\"onSectionDragEnd($event)\"\n (dragover)=\"onSectionDragOver(section, idx, $event)\"\n (dragleave)=\"onSectionDragLeave($event)\"\n (drop)=\"onSectionDrop($event)\"\n >\n <button\n class=\"expand-btn\"\n [class.expanded]=\"isSectionExpanded(section.id)\"\n (click)=\"toggleSectionExpand(section.id, $event)\"\n [attr.aria-expanded]=\"isSectionExpanded(section.id)\"\n [attr.aria-label]=\"isSectionExpanded(section.id) ? 'Collapse' : 'Expand'\"\n >\n <span class=\"expand-icon\">&#9654;</span>\n </button>\n <span class=\"icon-drag-wrapper\">\n <span class=\"section-icon\" [innerHTML]=\"getSectionIcon(section.type)\"></span>\n <span\n class=\"drag-handle section-drag-handle\"\n role=\"button\"\n [attr.aria-label]=\"'Drag ' + getSectionName(section) + ' to reorder'\"\n [attr.aria-roledescription]=\"'draggable'\"\n tabindex=\"0\"\n (keydown)=\"onSectionDragHandleKeydown(section.id, idx, $event)\"\n >\n <svg width=\"10\" height=\"16\" viewBox=\"0 0 10 16\" fill=\"currentColor\" aria-hidden=\"true\">\n <circle cx=\"3\" cy=\"2\" r=\"1.5\"/>\n <circle cx=\"7\" cy=\"2\" r=\"1.5\"/>\n <circle cx=\"3\" cy=\"8\" r=\"1.5\"/>\n <circle cx=\"7\" cy=\"8\" r=\"1.5\"/>\n <circle cx=\"3\" cy=\"14\" r=\"1.5\"/>\n <circle cx=\"7\" cy=\"14\" r=\"1.5\"/>\n </svg>\n </span>\n </span>\n <span class=\"section-name\">{{ getSectionName(section) }}</span>\n <div class=\"tree-actions\">\n @if (idx > 0) {\n<!-- <button class=\"tree-btn\" (click)=\"moveUp(section.id, idx, $event)\" title=\"Move up\">&#8593;</button>-->\n }\n @if (idx < facade.sections().length - 1) {\n<!-- <button class=\"tree-btn\" (click)=\"moveDown(section.id, idx, $event)\" title=\"Move down\">&#8595;</button>-->\n }\n @if (facade.isSectionDuplicable(section.type)) {\n <button class=\"tree-btn\" (click)=\"duplicateSection(section.id, $event)\" title=\"Duplicate\">\n <span class=\"material-icon\">content_copy</span>\n </button>\n }\n <button class=\"tree-btn delete\" (click)=\"deleteSection(section.id, $event)\" title=\"Delete\">&times;</button>\n </div>\n </div>\n @if (isSectionExpanded(section.id)) {\n <div\n class=\"tree-section-content\"\n (dragover)=\"onSectionContentDragOver(section, $event)\"\n (dragleave)=\"onSectionContentDragLeave($event)\"\n (drop)=\"onSectionContentDrop($event)\"\n >\n @let sectionBlocks = getSectionBlocks(section);\n @for (block of sectionBlocks; track block.id; let blockIdx = $index) {\n <lib-block-tree-item\n [block]=\"block\"\n [context]=\"getRootBlockContext(section.id)\"\n [index]=\"blockIdx\"\n [totalSiblings]=\"sectionBlocks.length\"\n [expandAll]=\"isAllBlocksExpanded(section.id)\"\n (selectBlock)=\"onBlockSelect($event)\"\n (deleteBlock)=\"onBlockDelete($event)\"\n (duplicateBlock)=\"onBlockDuplicate($event)\"\n (moveBlock)=\"onBlockMove($event)\"\n (openBlockPicker)=\"onOpenNestedBlockPicker($event)\"\n />\n }\n <button class=\"add-block-btn\" (click)=\"openBlockPicker(section, $event)\">\n <span class=\"add-icon-circle\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" aria-hidden=\"true\">\n <circle cx=\"10\" cy=\"10\" r=\"9\"/>\n <line x1=\"10\" y1=\"6\" x2=\"10\" y2=\"14\"/>\n <line x1=\"6\" y1=\"10\" x2=\"14\" y2=\"10\"/>\n </svg>\n </span> Add block\n </button>\n </div>\n }\n </div>\n }\n <div class=\"sr-only\" aria-live=\"polite\" role=\"status\">{{ dndAnnouncement() }}</div>\n </div>\n <!-- Add Section Button -->\n <div class=\"add-section-area\">\n <button class=\"add-section-btn\" (click)=\"toggleSectionPicker()\">\n <span class=\"add-icon-circle\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" aria-hidden=\"true\">\n <circle cx=\"10\" cy=\"10\" r=\"9\"/>\n <line x1=\"10\" y1=\"6\" x2=\"10\" y2=\"14\"/>\n <line x1=\"6\" y1=\"10\" x2=\"14\" y2=\"10\"/>\n </svg>\n </span> Add section\n </button>\n @if (showSectionPicker()) {\n <div class=\"section-picker\">\n <div class=\"picker-search\">\n <input\n type=\"text\"\n class=\"picker-search-input\"\n placeholder=\"Search sections...\"\n [value]=\"sectionPickerSearch()\"\n (input)=\"onSectionPickerSearch($event)\"\n aria-label=\"Search available sections\"\n />\n </div>\n @for (group of groupedSectionPresets(); track group.category) {\n <div class=\"picker-category\">\n @if (groupedSectionPresets().length > 1) {\n <div class=\"picker-category-label\">{{ group.category }}</div>\n }\n @for (rp of group.presets; track rp.displayName + '-' + rp.definition.type) {\n <button class=\"picker-item\" (click)=\"addSectionFromPreset(rp)\">\n <span class=\"picker-icon\" [innerHTML]=\"getSectionPresetIcon(rp)\"></span>\n <div class=\"picker-info\">\n <span class=\"picker-name\">{{ rp.displayName }}</span>\n @if (rp.displayDescription) {\n <span class=\"picker-desc\">{{ rp.displayDescription }}</span>\n }\n </div>\n </button>\n }\n </div>\n }\n @if (filteredAvailableSectionPresets().length === 0) {\n <div class=\"picker-empty\">No sections match your search</div>\n }\n </div>\n }\n </div>\n <!-- Block Picker Modal (for sections) -->\n @if (blockPickerSection()) {\n <div class=\"block-picker-overlay\" (click)=\"closeBlockPicker()\">\n <div class=\"block-picker\" (click)=\"$event.stopPropagation()\">\n <div class=\"picker-header\">\n <h3>Add block to {{ getSectionName(blockPickerSection()!) }}</h3>\n <button class=\"close-btn\" (click)=\"closeBlockPicker()\">×</button>\n </div>\n <div class=\"picker-search\">\n <input\n type=\"text\"\n class=\"picker-search-input\"\n placeholder=\"Search blocks...\"\n [value]=\"blockPickerSearch()\"\n (input)=\"onBlockPickerSearch($event)\"\n aria-label=\"Search available blocks\"\n />\n </div>\n <div class=\"picker-content\">\n @for (rp of filteredBlockPresetsForSection(); track rp.displayName + '-' + rp.definition.type) {\n <button class=\"picker-item\" (click)=\"addBlockToSectionFromPreset(blockPickerSection()!, rp)\">\n <span class=\"picker-icon\" [innerHTML]=\"getBlockPresetIcon(rp)\"></span>\n <div class=\"picker-info\">\n <span class=\"picker-name\">{{ rp.displayName }}</span>\n @if (rp.displayDescription) {\n <span class=\"picker-desc\">{{ rp.displayDescription }}</span>\n }\n </div>\n </button>\n }\n @if (filteredBlockPresetsForSection().length === 0) {\n <div class=\"picker-empty\">\n @if (blockPickerSearch()) {\n No blocks match \"{{ blockPickerSearch() }}\"\n } @else {\n No blocks available for this section\n }\n </div>\n }\n </div>\n </div>\n </div>\n }\n <!-- Nested Block Picker Modal (for blocks with slots) -->\n @if (nestedBlockPickerTarget()) {\n <div class=\"block-picker-overlay\" (click)=\"closeNestedBlockPicker()\">\n <div class=\"block-picker\" (click)=\"$event.stopPropagation()\">\n <div class=\"picker-header\">\n <h3>Add nested block</h3>\n <button class=\"close-btn\" (click)=\"closeNestedBlockPicker()\">×</button>\n </div>\n <div class=\"picker-search\">\n <input\n type=\"text\"\n class=\"picker-search-input\"\n placeholder=\"Search blocks...\"\n [value]=\"nestedBlockPickerSearch()\"\n (input)=\"onNestedBlockPickerSearch($event)\"\n aria-label=\"Search available blocks\"\n />\n </div>\n <div class=\"picker-content\">\n @for (rp of filteredBlockPresetsForNestedSlot(); track rp.displayName + '-' + rp.definition.type) {\n <button class=\"picker-item\" (click)=\"addNestedBlockFromPreset(rp)\">\n <span class=\"picker-icon\" [innerHTML]=\"getBlockPresetIcon(rp)\"></span>\n <div class=\"picker-info\">\n <span class=\"picker-name\">{{ rp.displayName }}</span>\n @if (rp.displayDescription) {\n <span class=\"picker-desc\">{{ rp.displayDescription }}</span>\n }\n </div>\n </button>\n }\n @if (filteredBlockPresetsForNestedSlot().length === 0) {\n <div class=\"picker-empty\">\n @if (nestedBlockPickerSearch()) {\n No blocks match \"{{ nestedBlockPickerSearch() }}\"\n } @else {\n No blocks available\n }\n </div>\n }\n </div>\n </div>\n </div>\n }\n </aside>\n\n <!-- Main: Canvas -->\n <main class=\"canvas-area\">\n <!-- Toolbar -->\n <div class=\"toolbar\">\n <div class=\"toolbar-left\">\n <button class=\"toolbar-btn back-btn\" (click)=\"goBack()\" title=\"Back to pages\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"currentColor\" style=\"vertical-align: middle\"><path d=\"M17 9H5.414l3.293-3.293a1 1 0 00-1.414-1.414l-5 5a1 1 0 000 1.414l5 5a1 1 0 001.414-1.414L5.414 11H17a1 1 0 100-2z\"/></svg> Back\n </button>\n <button\n class=\"toolbar-btn\"\n [disabled]=\"!facade.canUndo()\"\n (click)=\"facade.undo()\"\n title=\"Undo\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"currentColor\" style=\"vertical-align: middle\"><path d=\"M7.5 4.5a1 1 0 00-1.7-.7l-4 4a1 1 0 000 1.4l4 4a1 1 0 001.7-.7V11h5a4 4 0 010 8H9a1 1 0 110-2h3.5a2 2 0 000-4h-5v1.5a1 1 0 01-1.7.7l-4-4a1 1 0 010-1.4l4-4a1 1 0 011.7.7V6h5a6 6 0 010 12H9a3 3 0 010-6h-1.5V4.5z\"/></svg> Undo\n </button>\n <button\n class=\"toolbar-btn\"\n [disabled]=\"!facade.canRedo()\"\n (click)=\"facade.redo()\"\n title=\"Redo\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"currentColor\" style=\"vertical-align: middle; transform: scaleX(-1)\"><path d=\"M7.5 4.5a1 1 0 00-1.7-.7l-4 4a1 1 0 000 1.4l4 4a1 1 0 001.7-.7V11h5a4 4 0 010 8H9a1 1 0 110-2h3.5a2 2 0 000-4h-5v1.5a1 1 0 01-1.7.7l-4-4a1 1 0 010-1.4l4-4a1 1 0 011.7.7V6h5a6 6 0 010 12H9a3 3 0 010-6h-1.5V4.5z\"/></svg> Redo\n </button>\n </div>\n <div class=\"toolbar-center\">\n @if (facade.currentPage(); as page) {\n @if (page.status === 'published') {\n <a\n class=\"page-title page-title-link\"\n [href]=\"'/pages/' + page.slug\"\n target=\"_blank\"\n rel=\"noopener\"\n >{{ page.title }}</a>\n } @else {\n <span class=\"page-title\">{{ page.title }}</span>\n }\n <span class=\"status-badge\" [class.published]=\"page.status === 'published'\">\n {{ page.status }}\n </span>\n @if (facade.isDirty()) {\n <span class=\"dirty-indicator\">• Unsaved changes</span>\n }\n } @else {\n <span class=\"section-count\">{{ facade.sections().length }} sections</span>\n }\n </div>\n <div class=\"toolbar-right\">\n @if (facade.currentPage() && showSaveButton()) {\n <button\n class=\"toolbar-btn\"\n [disabled]=\"!facade.isDirty() || isSaving()\"\n (click)=\"savePage()\"\n title=\"Save changes\"\n >\n {{ isSaving() ? 'Saving...' : 'Save' }}\n </button>\n }\n @if (facade.currentPage() && showPublishButtons()) {\n @if (facade.currentPage()?.status === 'draft') {\n <button\n class=\"toolbar-btn publish-btn\"\n [disabled]=\"facade.isDirty() || isPublishing()\"\n (click)=\"publishPage()\"\n title=\"Publish page\"\n >\n {{ isPublishing() ? 'Publishing...' : 'Publish' }}\n </button>\n } @else {\n <button\n class=\"toolbar-btn\"\n [disabled]=\"isPublishing()\"\n (click)=\"unpublishPage()\"\n title=\"Unpublish page\"\n >\n {{ isPublishing() ? 'Unpublishing...' : 'Unpublish' }}\n </button>\n }\n }\n <button class=\"toolbar-btn preview-btn\" (click)=\"togglePreview()\">\n {{ isPreviewMode() ? 'Edit' : 'Preview' }}\n </button>\n </div>\n </div>\n\n <!-- Canvas Content -->\n <div class=\"canvas\" #canvasEl [class.preview-mode]=\"isPreviewMode()\">\n @if (facade.sections().length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\"><svg width=\"48\" height=\"48\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path d=\"M6 2a2 2 0 00-2 2v12a2 2 0 002 2h8a2 2 0 002-2V7.414a2 2 0 00-.586-1.414l-3.414-3.414A2 2 0 0010.586 2H6zm0 2h4v3a1 1 0 001 1h3v8H6V4z\"/></svg></div>\n <h3>Start Building</h3>\n <p>Click on a component from the sidebar to add it to your page</p>\n </div>\n } @else {\n @for (section of facade.sections(); track section.id; let idx = $index) {\n <div\n class=\"section-outer\"\n [class.selected]=\"facade.selectedSection()?.id === section.id\"\n >\n @if (!isPreviewMode()) {\n <div class=\"section-controls\">\n <span class=\"section-label\">{{ getSectionName(section) }}</span>\n <div class=\"section-actions\">\n @if (idx > 0) {\n <button class=\"action-btn\" (click)=\"moveUp(section.id, idx, $event)\" title=\"Move up\">↑</button>\n }\n @if (idx < facade.sections().length - 1) {\n <button class=\"action-btn\" (click)=\"moveDown(section.id, idx, $event)\" title=\"Move down\">↓</button>\n }\n @if (facade.isSectionDuplicable(section.type)) {\n <button class=\"action-btn\" (click)=\"duplicateSection(section.id, $event)\" title=\"Duplicate\">\n <span class=\"material-icon\">content_copy</span>\n </button>\n }\n <button class=\"action-btn delete\" (click)=\"deleteSection(section.id, $event)\" title=\"Delete\">×</button>\n </div>\n </div>\n }\n <div\n class=\"section-wrapper\"\n [attr.data-section-id]=\"section.id\"\n (click)=\"selectSection(section, $event)\"\n >\n <lib-dynamic-renderer [element]=\"section\" [context]=\"editorContext()\" />\n </div>\n </div>\n }\n }\n </div>\n </main>\n\n <!-- Right Panel: Properties -->\n @if (!isPreviewMode()) {\n <aside class=\"properties-panel\" [class.has-selection]=\"facade.selectedSection()\">\n @if (facade.selectedSectionDefinition(); as def) {\n <!-- Tabs for Section Props / Blocks -->\n <div class=\"panel-tabs\">\n <button\n class=\"panel-tab\"\n [class.active]=\"propertiesTab() === 'props'\"\n (click)=\"propertiesTab.set('props')\"\n >\n Properties\n </button>\n <button\n class=\"panel-tab\"\n [class.active]=\"propertiesTab() === 'blocks'\"\n (click)=\"propertiesTab.set('blocks')\"\n >\n Blocks ({{ getBlockCount() }})\n </button>\n </div>\n\n @if (propertiesTab() === 'props') {\n <!-- Section Properties -->\n <div class=\"properties-header\">\n @if (isEditingName()) {\n <input\n #nameInput\n type=\"text\"\n class=\"name-edit-input\"\n [value]=\"editingNameValue()\"\n [placeholder]=\"getSelectedDefaultName(def)\"\n (keydown.enter)=\"saveEditingName($event)\"\n (keydown.escape)=\"cancelEditingName()\"\n (blur)=\"saveEditingName($event)\"\n aria-label=\"Rename\"\n />\n } @else {\n <h3\n class=\"editable-name\"\n (click)=\"startEditingName()\"\n title=\"Click to rename\"\n >\n {{ getSelectedDisplayName(def) }}\n <span class=\"edit-icon\" aria-hidden=\"true\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"currentColor\">\n <path d=\"M9.1 1.2L10.8 2.9 3.6 10.1 1.2 10.8 1.9 8.4z\"/>\n </svg>\n </span>\n </h3>\n }\n <button class=\"more-menu-btn\" (click)=\"facade.clearSelection()\" aria-label=\"Close\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n <circle cx=\"4\" cy=\"8\" r=\"1.5\"/>\n <circle cx=\"8\" cy=\"8\" r=\"1.5\"/>\n <circle cx=\"12\" cy=\"8\" r=\"1.5\"/>\n </svg>\n </button>\n </div>\n <div class=\"properties-content\">\n @if (facade.selectedBlock(); as block) {\n <!-- Block Properties -->\n @for (group of getBlockPropertyGroups(); track group) {\n <div class=\"property-group\">\n <button\n class=\"group-title\"\n type=\"button\"\n [attr.aria-expanded]=\"!isGroupCollapsed(block.id, group)\"\n (click)=\"toggleGroup(block.id, group)\"\n >\n <span class=\"group-title-text\">{{ group }}</span>\n <span class=\"group-toggle-icon\" [class.collapsed]=\"isGroupCollapsed(block.id, group)\">&#9660;</span>\n </button>\n @if (!isGroupCollapsed(block.id, group)) {\n @for (prop of getBlockPropsForGroup(group); track prop.key) {\n <div class=\"property-field\">\n <label class=\"property-label\">{{ prop.schema.label }}</label>\n @switch (prop.schema.type) {\n @case ('string') {\n <input\n type=\"text\"\n class=\"property-input\"\n [value]=\"getBlockPropertyValue(prop.key)\"\n [placeholder]=\"prop.schema.placeholder ?? ''\"\n (input)=\"updateBlockProperty(prop.key, $event)\"\n />\n }\n @case ('textarea') {\n <textarea\n class=\"property-textarea\"\n [value]=\"getBlockPropertyValue(prop.key)\"\n [placeholder]=\"prop.schema.placeholder ?? ''\"\n (input)=\"updateBlockProperty(prop.key, $event)\"\n rows=\"3\"\n ></textarea>\n }\n @case ('number') {\n <input\n type=\"number\"\n class=\"property-input\"\n [value]=\"getBlockPropertyValue(prop.key)\"\n (input)=\"updateBlockProperty(prop.key, $event)\"\n />\n }\n @case ('boolean') {\n <div class=\"toggle-field\">\n <span class=\"toggle-label\">{{ prop.schema.label }}</span>\n <label class=\"toggle-switch\">\n <input\n type=\"checkbox\"\n class=\"toggle-input\"\n [checked]=\"getBlockPropertyValue(prop.key) === 'true'\"\n (change)=\"updateBlockBooleanProperty(prop.key, $event)\"\n />\n <span class=\"toggle-track\">\n <span class=\"toggle-thumb\"></span>\n </span>\n </label>\n </div>\n @if (prop.schema.description) {\n <span class=\"toggle-description\">{{ prop.schema.description }}</span>\n }\n }\n @case ('color') {\n <div class=\"color-field\">\n <input\n type=\"color\"\n class=\"color-picker\"\n [value]=\"getBlockPropertyValue(prop.key)\"\n (input)=\"updateBlockProperty(prop.key, $event)\"\n />\n <input\n type=\"text\"\n class=\"property-input color-text\"\n [value]=\"getBlockPropertyValue(prop.key)\"\n (input)=\"updateBlockProperty(prop.key, $event)\"\n />\n </div>\n }\n @case ('image') {\n <div class=\"media-field\">\n @if (getBlockPropertyValue(prop.key)) {\n <div class=\"media-preview\">\n <img\n class=\"media-thumbnail\"\n [src]=\"getBlockPropertyValue(prop.key)\"\n [alt]=\"prop.schema.label\"\n />\n <button\n class=\"media-remove-btn\"\n (click)=\"clearBlockProperty(prop.key)\"\n aria-label=\"Remove image\"\n >×</button>\n </div>\n }\n <button class=\"media-browse-btn\" (click)=\"openFilePicker('IMAGE', prop.key, 'block')\">\n Browse images\n </button>\n <input\n type=\"text\"\n class=\"property-input media-url-input\"\n [value]=\"getBlockPropertyValue(prop.key)\"\n [placeholder]=\"prop.schema.placeholder ?? 'Paste image URL...'\"\n (input)=\"updateBlockProperty(prop.key, $event)\"\n />\n </div>\n }\n @case ('video') {\n <div class=\"media-field\">\n @if (getBlockPropertyValue(prop.key)) {\n <div class=\"media-preview video-preview\">\n <div class=\"video-indicator\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M8 5v14l11-7z\"/>\n </svg>\n </div>\n <span class=\"video-url-text\">{{ getBlockPropertyValue(prop.key) }}</span>\n <button\n class=\"media-remove-btn\"\n (click)=\"clearBlockProperty(prop.key)\"\n aria-label=\"Remove video\"\n >×</button>\n </div>\n }\n <button class=\"media-browse-btn\" (click)=\"openFilePicker('VIDEO', prop.key, 'block')\">\n Browse videos\n </button>\n <input\n type=\"text\"\n class=\"property-input media-url-input\"\n [value]=\"getBlockPropertyValue(prop.key)\"\n [placeholder]=\"prop.schema.placeholder ?? 'Paste video URL...'\"\n (input)=\"updateBlockProperty(prop.key, $event)\"\n />\n </div>\n }\n @case ('select') {\n <select\n class=\"property-select\"\n [value]=\"getBlockPropertyValue(prop.key)\"\n (change)=\"updateBlockProperty(prop.key, $event)\"\n >\n @for (option of prop.schema.options ?? []; track option.value) {\n <option [value]=\"option.value\">{{ option.label }}</option>\n }\n </select>\n }\n @default {\n <input\n type=\"text\"\n class=\"property-input\"\n [value]=\"getBlockPropertyValue(prop.key)\"\n (input)=\"updateBlockProperty(prop.key, $event)\"\n />\n }\n }\n </div>\n }\n }\n </div>\n }\n <button class=\"delete-block-btn\" (click)=\"deleteSelectedBlock()\">\n Remove block\n </button>\n } @else {\n <!-- Section Properties -->\n @let sectionId = facade.selectedSection()?.id ?? '';\n @for (group of getPropertyGroups(def); track group) {\n <div class=\"property-group\">\n <button\n class=\"group-title\"\n type=\"button\"\n [attr.aria-expanded]=\"!isGroupCollapsed(sectionId, group)\"\n (click)=\"toggleGroup(sectionId, group)\"\n >\n <span class=\"group-title-text\">{{ group }}</span>\n <span class=\"group-toggle-icon\" [class.collapsed]=\"isGroupCollapsed(sectionId, group)\">&#9660;</span>\n </button>\n @if (!isGroupCollapsed(sectionId, group)) {\n @for (prop of getPropsForGroup(def, group); track prop.key) {\n <div class=\"property-field\">\n <label class=\"property-label\">{{ prop.schema.label }}</label>\n @switch (prop.schema.type) {\n @case ('string') {\n <input\n type=\"text\"\n class=\"property-input\"\n [value]=\"getPropertyValue(prop.key)\"\n [placeholder]=\"prop.schema.placeholder ?? ''\"\n (input)=\"updateProperty(prop.key, $event)\"\n />\n }\n @case ('url') {\n <input\n type=\"url\"\n class=\"property-input\"\n [value]=\"getPropertyValue(prop.key)\"\n [placeholder]=\"prop.schema.placeholder ?? ''\"\n (input)=\"updateProperty(prop.key, $event)\"\n />\n }\n @case ('image') {\n <div class=\"media-field\">\n @if (getPropertyValue(prop.key)) {\n <div class=\"media-preview\">\n <img\n class=\"media-thumbnail\"\n [src]=\"getPropertyValue(prop.key)\"\n [alt]=\"prop.schema.label\"\n />\n <button\n class=\"media-remove-btn\"\n (click)=\"clearSectionProperty(prop.key)\"\n aria-label=\"Remove image\"\n >×</button>\n </div>\n }\n <button class=\"media-browse-btn\" (click)=\"openFilePicker('IMAGE', prop.key, 'section')\">\n Browse images\n </button>\n <input\n type=\"text\"\n class=\"property-input media-url-input\"\n [value]=\"getPropertyValue(prop.key)\"\n [placeholder]=\"prop.schema.placeholder ?? 'Paste image URL...'\"\n (input)=\"updateProperty(prop.key, $event)\"\n />\n </div>\n }\n @case ('video') {\n <div class=\"media-field\">\n @if (getPropertyValue(prop.key)) {\n <div class=\"media-preview video-preview\">\n <div class=\"video-indicator\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M8 5v14l11-7z\"/>\n </svg>\n </div>\n <span class=\"video-url-text\">{{ getPropertyValue(prop.key) }}</span>\n <button\n class=\"media-remove-btn\"\n (click)=\"clearSectionProperty(prop.key)\"\n aria-label=\"Remove video\"\n >×</button>\n </div>\n }\n <button class=\"media-browse-btn\" (click)=\"openFilePicker('VIDEO', prop.key, 'section')\">\n Browse videos\n </button>\n <input\n type=\"text\"\n class=\"property-input media-url-input\"\n [value]=\"getPropertyValue(prop.key)\"\n [placeholder]=\"prop.schema.placeholder ?? 'Paste video URL...'\"\n (input)=\"updateProperty(prop.key, $event)\"\n />\n </div>\n }\n @case ('color') {\n <div class=\"color-field\">\n <input\n type=\"color\"\n class=\"color-picker\"\n [value]=\"getPropertyValue(prop.key)\"\n (input)=\"updateProperty(prop.key, $event)\"\n />\n <input\n type=\"text\"\n class=\"property-input color-text\"\n [value]=\"getPropertyValue(prop.key)\"\n (input)=\"updateProperty(prop.key, $event)\"\n />\n </div>\n }\n @case ('select') {\n <select\n class=\"property-select\"\n [value]=\"getPropertyValue(prop.key)\"\n (change)=\"updateProperty(prop.key, $event)\"\n >\n @for (option of prop.schema.options ?? []; track option.value) {\n <option [value]=\"option.value\">{{ option.label }}</option>\n }\n </select>\n }\n @case ('json') {\n <textarea\n class=\"property-textarea\"\n [value]=\"getPropertyValue(prop.key)\"\n (input)=\"updateProperty(prop.key, $event)\"\n rows=\"4\"\n ></textarea>\n }\n @default {\n <input\n type=\"text\"\n class=\"property-input\"\n [value]=\"getPropertyValue(prop.key)\"\n (input)=\"updateProperty(prop.key, $event)\"\n />\n }\n }\n </div>\n }\n }\n </div>\n }\n }\n </div>\n } @else {\n <!-- Blocks List -->\n <div class=\"properties-header\">\n <h3>Blocks in Section</h3>\n </div>\n <div class=\"blocks-list\">\n @for (slot of getSectionSlots(); track slot.name) {\n <div class=\"slot-group\">\n <h4 class=\"slot-title\">{{ slot.label }}</h4>\n @for (block of getBlocksForSlot(slot.name); track block.id; let idx = $index) {\n <div\n class=\"block-item\"\n [class.selected]=\"facade.selectedBlock()?.id === block.id\"\n (click)=\"selectBlock(block)\"\n >\n <span class=\"block-icon\" [innerHTML]=\"getBlockIconByType(block.type)\"></span>\n <span class=\"block-name\">{{ getBlockName(block) }}</span>\n <div class=\"block-actions\">\n @if (idx > 0) {\n<!-- <button class=\"mini-btn\" (click)=\"moveBlockUp(block, slot.name, idx, $event)\">↑</button>-->\n }\n @if (idx < getBlocksForSlot(slot.name).length - 1) {\n<!-- <button class=\"mini-btn\" (click)=\"moveBlockDown(block, slot.name, idx, $event)\">↓</button>-->\n }\n @if (facade.isBlockDuplicable(block.type)) {\n <button class=\"mini-btn\" (click)=\"duplicateBlock(block, $event)\" title=\"Duplicate\">\n <span class=\"material-icon\">content_copy</span>\n </button>\n }\n <button class=\"mini-btn delete\" (click)=\"deleteBlock(block, $event)\">×</button>\n </div>\n </div>\n }\n @if (getBlocksForSlot(slot.name).length === 0) {\n <div class=\"empty-slot\">{{ slot.emptyPlaceholder ?? 'No blocks' }}</div>\n }\n </div>\n }\n @if (getSectionSlots().length === 0) {\n <div class=\"no-slots\">\n <p>This section doesn't have any slots for blocks</p>\n </div>\n }\n </div>\n }\n } @else {\n <div class=\"no-selection\">\n <p>Select a section to edit its properties</p>\n </div>\n }\n </aside>\n }\n\n @if (filePickerOpen()) {\n <lib-shopify-file-picker\n [mediaType]=\"filePickerMediaType()\"\n [currentValue]=\"filePickerCurrentValue()\"\n (fileSelected)=\"onFileSelected($event)\"\n (closed)=\"closeFilePicker()\"\n />\n }\n </div>\n `,\n styles: `\n :host {\n display: block;\n height: calc(100vh - 56px);\n overflow: hidden;\n font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n }\n\n .editor-layout {\n display: grid;\n grid-template-columns: 280px 1fr 300px;\n height: 100%;\n background: #f6f6f7;\n }\n\n /* Sidebar */\n .sidebar {\n background: #fff;\n border-right: 1px solid #e3e3e3;\n display: flex;\n flex-direction: column;\n }\n\n .sidebar-header {\n padding: 1rem;\n border-bottom: 1px solid #e3e3e3;\n }\n\n .sidebar-header h2 {\n margin: 0;\n font-size: 0.8125rem;\n font-weight: 600;\n color: #303030;\n }\n\n /* Search Box */\n .search-box {\n display: none;\n }\n\n .search-box:focus-within {\n border-color: #005bd3;\n background: #fff;\n }\n\n .search-icon {\n font-size: 0.8125rem;\n opacity: 0.6;\n }\n\n .search-input {\n flex: 1;\n border: none;\n background: transparent;\n font-size: 0.8125rem;\n color: #303030;\n font-family: inherit;\n outline: none;\n }\n\n .search-input::placeholder {\n color: #8c9196;\n }\n\n .search-clear {\n padding: 0.125rem 0.375rem;\n border: none;\n background: #e3e3e3;\n border-radius: 4px;\n cursor: pointer;\n font-size: 0.75rem;\n color: #616161;\n line-height: 1;\n }\n\n .search-clear:hover {\n background: #c9cccf;\n }\n\n .search-no-results {\n padding: 2rem 1rem;\n text-align: center;\n color: #8c9196;\n }\n\n .search-no-results p {\n margin: 0;\n font-size: 0.8125rem;\n }\n\n /* Picker Search */\n .picker-search {\n padding: 0.5rem 0.75rem;\n border-bottom: 1px solid #e3e3e3;\n }\n\n .picker-search-input {\n width: 100%;\n padding: 0.5rem 0.75rem;\n border: 1px solid #c9cccf;\n border-radius: 8px;\n font-size: 0.8125rem;\n font-family: inherit;\n outline: none;\n box-sizing: border-box;\n transition: border-color 0.2s, box-shadow 0.2s;\n }\n\n .picker-search-input:focus {\n border-color: #005bd3;\n box-shadow: 0 0 0 1px #005bd3;\n }\n\n .picker-search-input::placeholder {\n color: #8c9196;\n }\n\n /* Section Tree */\n .section-tree {\n flex: 1;\n overflow-y: auto;\n padding: 0.25rem 0;\n }\n\n .tree-section {\n border-bottom: none;\n }\n\n .tree-section.selected > .tree-section-header {\n background: #005bd3;\n color: #fff;\n border-radius: 8px;\n margin: 0 0.375rem;\n }\n\n .tree-section.selected > .tree-section-header .section-name,\n .tree-section.selected > .tree-section-header .expand-btn,\n .tree-section.selected > .tree-section-header .section-icon,\n .tree-section.selected > .tree-section-header .drag-handle,\n .tree-section.selected > .tree-section-header .tree-btn {\n color: inherit;\n }\n\n .tree-section-header {\n display: flex;\n align-items: center;\n gap: 0.375rem;\n padding: 0.375rem 0.5rem;\n cursor: pointer;\n transition: background 0.15s;\n }\n\n .tree-section-header:hover {\n background: #f6f6f7;\n border-radius: 8px;\n margin: 0 0.375rem;\n }\n\n .expand-btn {\n width: 16px;\n height: 16px;\n padding: 0;\n border: none;\n background: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #8c9196;\n transition: transform 0.15s;\n flex-shrink: 0;\n }\n\n .expand-btn.expanded .expand-icon {\n transform: rotate(90deg);\n }\n\n .expand-icon {\n font-size: 0.5rem;\n transition: transform 0.15s;\n }\n\n .icon-drag-wrapper {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n }\n\n .icon-drag-wrapper .drag-handle {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .tree-section-header:hover .icon-drag-wrapper .section-icon,\n .icon-drag-wrapper:has(.drag-handle:focus-visible) .section-icon {\n visibility: hidden;\n }\n\n .section-icon {\n font-size: 0.875rem;\n color: #8c9196;\n display: flex;\n align-items: center;\n }\n\n .section-name {\n flex: 1;\n font-size: 0.8125rem;\n font-weight: 500;\n color: #303030;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .tree-actions {\n display: flex;\n gap: 0.125rem;\n opacity: 0;\n transition: opacity 0.15s;\n }\n\n .tree-section-header:hover .tree-actions,\n .tree-block:hover .tree-actions {\n opacity: 1;\n }\n\n .tree-btn {\n padding: 0.125rem 0.375rem;\n border: none;\n border-radius: 4px;\n background: transparent;\n cursor: pointer;\n font-size: 0.6875rem;\n color: #8c9196;\n transition: all 0.15s;\n }\n\n .tree-btn:hover {\n background: #e3e3e3;\n color: #303030;\n }\n\n .tree-btn.delete:hover {\n background: #fef2f0;\n color: #d72c0d;\n }\n\n .tree-section.drag-over-before > .tree-section-header {\n box-shadow: inset 0 2px 0 0 #005bd3;\n }\n\n .tree-section.drag-over-after > .tree-section-header {\n box-shadow: inset 0 -2px 0 0 #005bd3;\n }\n\n .tree-section.is-section-dragging {\n opacity: 0.4;\n }\n\n .tree-section.is-section-dragging > .tree-section-header {\n cursor: grabbing;\n }\n\n .drag-handle {\n cursor: grab;\n color: #8c9196;\n opacity: 0;\n transition: opacity 0.15s;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n padding: 0.125rem;\n border: none;\n background: none;\n border-radius: 4px;\n }\n\n .drag-handle:hover {\n color: #303030;\n background: #e3e3e3;\n }\n\n .drag-handle:focus-visible {\n opacity: 1;\n outline: 2px solid #005bd3;\n outline-offset: 1px;\n }\n\n .tree-section-header:hover .drag-handle {\n opacity: 1;\n }\n\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n\n @media (prefers-reduced-motion: reduce) {\n .tree-section,\n .drag-handle,\n .tree-actions {\n transition: none;\n }\n }\n\n .tree-section-content {\n padding-left: 0.5rem;\n }\n\n .tree-block {\n display: flex;\n align-items: center;\n gap: 0.375rem;\n padding: 0.375rem 0.75rem;\n cursor: pointer;\n transition: background 0.15s;\n }\n\n .tree-block:hover {\n background: #f6f6f7;\n border-radius: 8px;\n margin: 0 0.375rem;\n }\n\n .tree-block.selected {\n background: #005bd3;\n color: #fff;\n border-radius: 8px;\n margin: 0 0.375rem;\n }\n\n .tree-block.selected .block-icon,\n .tree-block.selected .block-name {\n color: inherit;\n }\n\n .block-indent {\n width: 18px;\n height: 1px;\n background: #e3e3e3;\n margin-left: 10px;\n }\n\n .block-icon {\n font-size: 0.875rem;\n color: #8c9196;\n display: flex;\n align-items: center;\n }\n\n .block-name {\n flex: 1;\n font-size: 0.8125rem;\n color: #303030;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .add-block-btn {\n display: flex;\n align-items: center;\n gap: 0.375rem;\n width: calc(100% - 1.5rem);\n margin: 0.25rem 0.75rem 0.375rem 2rem;\n padding: 0.375rem 0.5rem;\n border: none;\n border-radius: 8px;\n background: transparent;\n cursor: pointer;\n font-size: 0.8125rem;\n font-family: inherit;\n color: #005bd3;\n transition: all 0.15s;\n }\n\n .add-block-btn:hover {\n background: #f0f5ff;\n color: #004299;\n }\n\n .add-icon {\n font-size: 0.8125rem;\n font-weight: 600;\n }\n\n .add-icon-circle {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n /* Add Section Area */\n .add-section-area {\n padding: 0.75rem;\n border-top: 1px solid #e3e3e3;\n position: relative;\n }\n\n .add-section-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 0.375rem;\n width: 100%;\n padding: 0.625rem;\n border: none;\n border-radius: 8px;\n background: transparent;\n cursor: pointer;\n font-size: 0.8125rem;\n font-weight: 500;\n font-family: inherit;\n color: #005bd3;\n transition: all 0.15s;\n }\n\n .add-section-btn:hover {\n background: #f0f5ff;\n }\n\n .section-picker {\n position: absolute;\n bottom: 100%;\n left: 0.75rem;\n right: 0.75rem;\n background: #fff;\n border: 1px solid #e3e3e3;\n border-radius: 12px;\n box-shadow: 0 -4px 12px rgba(0, 0, 0, 0.1);\n max-height: 300px;\n overflow-y: auto;\n z-index: 100;\n }\n\n .picker-item {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n width: 100%;\n padding: 0.625rem 0.75rem;\n border: none;\n border-bottom: 1px solid #f6f6f7;\n background: #fff;\n cursor: pointer;\n text-align: left;\n font-family: inherit;\n transition: background 0.15s;\n }\n\n .picker-item:last-child {\n border-bottom: none;\n }\n\n .picker-item:hover {\n background: #f6f6f7;\n }\n\n .picker-icon {\n font-size: 1.25rem;\n color: #8c9196;\n display: flex;\n align-items: center;\n flex-shrink: 0;\n }\n\n .picker-info {\n display: flex;\n flex-direction: column;\n gap: 0.125rem;\n }\n\n .picker-name {\n font-size: 0.8125rem;\n font-weight: 500;\n color: #303030;\n }\n\n .picker-desc {\n font-size: 0.75rem;\n color: #8c9196;\n }\n\n /* Block Picker Modal */\n .block-picker-overlay {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n }\n\n .block-picker {\n background: #fff;\n border-radius: 12px;\n width: 340px;\n max-height: 420px;\n display: flex;\n flex-direction: column;\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.2);\n }\n\n .picker-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 1rem 1.25rem;\n border-bottom: 1px solid #e3e3e3;\n }\n\n .picker-header h3 {\n margin: 0;\n font-size: 0.9375rem;\n font-weight: 600;\n color: #303030;\n }\n\n .picker-content {\n flex: 1;\n overflow-y: auto;\n padding: 0.5rem;\n }\n\n .picker-content .picker-item {\n border: 1px solid #e3e3e3;\n border-radius: 8px;\n margin-bottom: 0.5rem;\n }\n\n .picker-content .picker-item:hover {\n border-color: #005bd3;\n background: #f8fafe;\n }\n\n .picker-category {\n border-bottom: 1px solid #f6f6f7;\n }\n\n .picker-category:last-child {\n border-bottom: none;\n }\n\n .picker-category-label {\n padding: 0.5rem 0.75rem 0.25rem;\n font-size: 0.6875rem;\n font-weight: 600;\n color: #8c9196;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n }\n\n .picker-empty {\n padding: 2rem;\n text-align: center;\n color: #8c9196;\n font-size: 0.8125rem;\n }\n\n /* Canvas Area */\n .canvas-area {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n .toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 1rem;\n height: 56px;\n background: #fff;\n border-bottom: 1px solid #e3e3e3;\n }\n\n .toolbar-left, .toolbar-right {\n display: flex;\n gap: 0.5rem;\n align-items: center;\n }\n\n .toolbar-center {\n display: flex;\n align-items: center;\n }\n\n .toolbar-btn {\n padding: 0.375rem 0.75rem;\n border: 1px solid #c9cccf;\n border-radius: 8px;\n background: #fff;\n cursor: pointer;\n font-size: 0.8125rem;\n font-family: inherit;\n font-weight: 500;\n color: #303030;\n transition: all 0.15s;\n }\n\n .toolbar-btn:hover:not(:disabled) {\n background: #f6f6f7;\n }\n\n .toolbar-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .preview-btn,\n .publish-btn {\n background: #303030;\n color: #fff;\n border-color: #303030;\n border-radius: 8px;\n }\n\n .preview-btn:hover,\n .publish-btn:hover:not(:disabled) {\n background: #1a1a1a !important;\n }\n\n .back-btn {\n border-color: transparent;\n background: transparent;\n color: #303030;\n }\n\n .back-btn:hover:not(:disabled) {\n background: #f6f6f7;\n }\n\n .section-count {\n font-size: 0.8125rem;\n color: #616161;\n }\n\n .page-title {\n font-size: 0.875rem;\n font-weight: 600;\n color: #303030;\n margin-right: 0.75rem;\n }\n\n .page-title-link {\n text-decoration: none;\n color: inherit;\n }\n\n .page-title-link:hover {\n text-decoration: underline;\n }\n\n .status-badge {\n display: inline-block;\n padding: 0.125rem 0.5rem;\n border-radius: 10px;\n font-size: 0.6875rem;\n font-weight: 500;\n text-transform: capitalize;\n background: #ffd6a4;\n color: #b98900;\n }\n\n .status-badge.published {\n background: #aee9d1;\n color: #0d542b;\n }\n\n .dirty-indicator {\n margin-left: 0.75rem;\n font-size: 0.75rem;\n color: #b98900;\n font-weight: 500;\n }\n\n .canvas {\n flex: 1;\n overflow-y: auto;\n padding: 2rem;\n background: #e8e8e8;\n }\n\n .canvas.preview-mode {\n padding: 0;\n background: #fff;\n }\n\n .canvas.preview-mode .section-outer {\n margin: 0;\n }\n\n .canvas.preview-mode .section-wrapper {\n border: none;\n border-radius: 0;\n }\n\n .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n color: #616161;\n text-align: center;\n }\n\n .empty-icon {\n font-size: 3rem;\n margin-bottom: 1rem;\n color: #8c9196;\n }\n\n .empty-state h3 {\n margin: 0 0 0.5rem;\n color: #303030;\n font-size: 1rem;\n }\n\n .empty-state p {\n margin: 0;\n font-size: 0.8125rem;\n color: #8c9196;\n }\n\n .section-outer {\n position: relative;\n margin-bottom: 0;\n }\n\n .section-wrapper {\n border: 1px solid transparent;\n border-radius: 0;\n overflow: hidden;\n transition: border-color 0.15s;\n background: #fff;\n }\n\n .section-outer:hover .section-wrapper {\n border-color: rgba(0, 91, 211, 0.3);\n }\n\n .section-outer.selected .section-wrapper {\n border-color: rgba(0, 91, 211, 0.4);\n }\n\n .section-controls {\n position: absolute;\n top: -22px;\n left: 0;\n right: 0;\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 0.1875rem 0.75rem;\n background: #005bd3;\n color: #fff;\n font-size: 0.75rem;\n border-radius: 8px 8px 0 0;\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.15s;\n z-index: 10;\n }\n\n .section-outer:hover .section-controls,\n .section-outer.selected .section-controls {\n opacity: 1;\n pointer-events: auto;\n }\n\n .section-outer:hover .section-wrapper,\n .section-outer.selected .section-wrapper {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n }\n\n .section-label {\n font-weight: 500;\n }\n\n .section-actions {\n display: flex;\n gap: 0.25rem;\n }\n\n .action-btn {\n padding: 0.1875rem 0.5rem;\n border: none;\n border-radius: 4px;\n background: rgba(255, 255, 255, 0.15);\n color: #fff;\n cursor: pointer;\n font-size: 0.625rem;\n font-family: inherit;\n transition: background 0.15s;\n }\n\n .action-btn:hover {\n background: rgba(255, 255, 255, 0.3);\n }\n\n .action-btn.delete:hover {\n background: #d72c0d;\n }\n\n .material-icon {\n font-family: 'Material Icons', sans-serif;\n font-size: inherit;\n font-weight: normal;\n font-style: normal;\n line-height: 1;\n letter-spacing: normal;\n text-transform: none;\n white-space: nowrap;\n word-wrap: normal;\n direction: ltr;\n -webkit-font-smoothing: antialiased;\n text-rendering: optimizeLegibility;\n }\n\n /* Properties Panel */\n .properties-panel {\n background: #fff;\n border-left: 1px solid #e3e3e3;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n .properties-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 1rem;\n border-bottom: 1px solid #e3e3e3;\n }\n\n .properties-header h3 {\n margin: 0;\n font-size: 0.9375rem;\n font-weight: 600;\n color: #303030;\n }\n\n .editable-name {\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 0.375rem;\n border-radius: 8px;\n padding: 0.25rem 0.375rem;\n margin: -0.25rem -0.375rem;\n transition: background 0.15s;\n }\n\n .editable-name:hover {\n background: #f6f6f7;\n }\n\n .edit-icon {\n opacity: 0;\n color: #8c9196;\n transition: opacity 0.15s;\n display: flex;\n flex-shrink: 0;\n }\n\n .editable-name:hover .edit-icon {\n opacity: 1;\n }\n\n .name-edit-input {\n flex: 1;\n padding: 0.375rem 0.5rem;\n border: 1px solid #005bd3;\n border-radius: 8px;\n font-size: 0.9375rem;\n font-weight: 600;\n font-family: inherit;\n color: #303030;\n outline: none;\n box-shadow: 0 0 0 1px #005bd3;\n }\n\n .close-btn {\n border: none;\n background: none;\n font-size: 1.25rem;\n cursor: pointer;\n color: #8c9196;\n transition: color 0.15s;\n }\n\n .close-btn:hover {\n color: #303030;\n }\n\n .more-menu-btn {\n border: none;\n background: none;\n cursor: pointer;\n color: #8c9196;\n padding: 0.25rem;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.15s;\n }\n\n .more-menu-btn:hover {\n background: #f6f6f7;\n color: #303030;\n }\n\n .properties-content {\n flex: 1;\n overflow-y: auto;\n padding: 1rem;\n }\n\n .property-group {\n margin-bottom: 0;\n padding: 1rem 0;\n border-top: 1px solid #e3e3e3;\n }\n\n .property-group:first-child {\n border-top: none;\n }\n\n .group-title {\n display: flex;\n align-items: center;\n gap: 0.375rem;\n width: 100%;\n padding: 0;\n margin: 0 0 0.75rem;\n border: none;\n background: none;\n font-size: 0.8125rem;\n font-weight: 600;\n font-family: inherit;\n color: #303030;\n cursor: pointer;\n }\n\n .group-title:hover {\n color: #1a1a1a;\n }\n\n .group-title:focus-visible {\n outline: 2px solid #005bd3;\n outline-offset: 2px;\n border-radius: 4px;\n }\n\n .group-title-text {\n flex: 1;\n text-align: left;\n }\n\n .group-toggle-icon {\n font-size: 0.5rem;\n color: #8c9196;\n transition: transform 0.15s;\n display: inline-block;\n }\n\n .group-toggle-icon.collapsed {\n transform: rotate(-90deg);\n }\n\n .property-field {\n margin-bottom: 1rem;\n }\n\n .property-label {\n display: block;\n font-size: 0.8125rem;\n font-weight: 500;\n margin-bottom: 0.375rem;\n color: #303030;\n }\n\n .property-input,\n .property-select,\n .property-textarea {\n width: 100%;\n padding: 0.5rem 0.75rem;\n border: 1px solid #c9cccf;\n border-radius: 8px;\n font-size: 0.8125rem;\n font-family: inherit;\n color: #303030;\n box-sizing: border-box;\n transition: border-color 0.15s, box-shadow 0.15s;\n }\n\n .property-input:focus,\n .property-select:focus,\n .property-textarea:focus {\n outline: none;\n border-color: #005bd3;\n box-shadow: 0 0 0 1px #005bd3;\n }\n\n .property-input::placeholder,\n .property-textarea::placeholder {\n color: #8c9196;\n }\n\n .property-textarea {\n resize: vertical;\n font-family: 'SF Mono', SFMono-Regular, Consolas, 'Liberation Mono', Menlo, monospace;\n font-size: 0.75rem;\n }\n\n .color-field {\n display: flex;\n gap: 0.5rem;\n align-items: center;\n }\n\n .color-picker {\n width: 36px;\n height: 36px;\n padding: 2px;\n border: 1px solid #e3e3e3;\n border-radius: 6px;\n cursor: pointer;\n }\n\n .color-text {\n flex: 1;\n }\n\n .no-selection {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n color: #8c9196;\n text-align: center;\n padding: 2rem;\n }\n\n .no-selection p {\n margin: 0;\n font-size: 0.8125rem;\n }\n\n /* Panel Tabs */\n .panel-tabs {\n display: flex;\n border-bottom: 1px solid #e3e3e3;\n }\n\n .panel-tab {\n flex: 1;\n padding: 0.75rem;\n border: none;\n border-bottom: 2px solid transparent;\n background: #fff;\n cursor: pointer;\n font-size: 0.8125rem;\n font-weight: 500;\n font-family: inherit;\n color: #616161;\n transition: all 0.15s;\n }\n\n .panel-tab:hover {\n background: #f6f6f7;\n color: #303030;\n }\n\n .panel-tab.active {\n background: #fff;\n color: #303030;\n font-weight: 600;\n border-bottom: 2px solid #005bd3;\n }\n\n /* Blocks List */\n .blocks-list {\n flex: 1;\n overflow-y: auto;\n padding: 1rem;\n }\n\n .slot-group {\n margin-bottom: 1.5rem;\n }\n\n .slot-title {\n font-size: 0.75rem;\n font-weight: 600;\n color: #8c9196;\n margin: 0 0 0.5rem;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n }\n\n .block-item {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.5rem 0.625rem;\n border: 1px solid #e3e3e3;\n border-radius: 8px;\n margin-bottom: 0.375rem;\n cursor: pointer;\n transition: all 0.15s;\n }\n\n .block-item:hover {\n border-color: #005bd3;\n background: #f8fafe;\n }\n\n .block-item.selected {\n border-color: #005bd3;\n background: #005bd3;\n color: #fff;\n }\n\n .block-item.selected .block-icon,\n .block-item.selected .block-name {\n color: inherit;\n }\n\n .block-icon {\n font-size: 0.875rem;\n color: #8c9196;\n display: flex;\n align-items: center;\n }\n\n .block-name {\n flex: 1;\n font-size: 0.8125rem;\n font-weight: 500;\n color: #303030;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .block-actions {\n display: flex;\n gap: 0.125rem;\n opacity: 0;\n transition: opacity 0.15s;\n }\n\n .block-item:hover .block-actions {\n opacity: 1;\n }\n\n .mini-btn {\n padding: 0.125rem 0.375rem;\n border: none;\n border-radius: 4px;\n background: transparent;\n cursor: pointer;\n font-size: 0.75rem;\n color: #8c9196;\n transition: all 0.15s;\n }\n\n .mini-btn:hover {\n background: #e3e3e3;\n color: #303030;\n }\n\n .mini-btn.delete:hover {\n background: #fef2f0;\n color: #d72c0d;\n }\n\n .empty-slot {\n padding: 0.75rem;\n text-align: center;\n color: #8c9196;\n font-size: 0.8125rem;\n background: #f6f6f7;\n border: 1px dashed #e3e3e3;\n border-radius: 8px;\n }\n\n .no-slots {\n padding: 2rem;\n text-align: center;\n color: #8c9196;\n }\n\n .no-slots p {\n margin: 0;\n font-size: 0.8125rem;\n }\n\n .delete-block-btn {\n width: auto;\n padding: 0;\n margin-top: 1rem;\n border: none;\n border-radius: 0;\n background: transparent;\n color: #d72c0d;\n cursor: pointer;\n font-size: 0.8125rem;\n font-weight: 500;\n font-family: inherit;\n transition: color 0.15s;\n }\n\n .delete-block-btn:hover {\n background: transparent;\n color: #bc2200;\n text-decoration: underline;\n }\n\n .toggle-field {\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n\n .toggle-label {\n font-size: 0.8125rem;\n color: #303030;\n }\n\n .toggle-switch {\n position: relative;\n display: inline-flex;\n cursor: pointer;\n }\n\n .toggle-input {\n position: absolute;\n opacity: 0;\n width: 0;\n height: 0;\n }\n\n .toggle-track {\n width: 36px;\n height: 20px;\n background: #8c9196;\n border-radius: 10px;\n position: relative;\n transition: background 0.2s;\n }\n\n .toggle-thumb {\n position: absolute;\n top: 2px;\n left: 2px;\n width: 16px;\n height: 16px;\n background: #fff;\n border-radius: 50%;\n transition: transform 0.2s;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\n }\n\n .toggle-input:checked + .toggle-track {\n background: #008060;\n }\n\n .toggle-input:checked + .toggle-track .toggle-thumb {\n transform: translateX(16px);\n }\n\n .toggle-input:focus-visible + .toggle-track {\n outline: 2px solid #005bd3;\n outline-offset: 2px;\n }\n\n .toggle-description {\n display: block;\n font-size: 0.75rem;\n color: #8c9196;\n margin-top: 0.25rem;\n }\n\n /* Media Field (image/video picker) */\n .media-field {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n }\n\n .media-preview {\n position: relative;\n border: 1px solid #e3e3e3;\n border-radius: 8px;\n overflow: hidden;\n }\n\n .media-thumbnail {\n display: block;\n width: 100%;\n max-height: 160px;\n object-fit: cover;\n background: #f6f6f7;\n }\n\n .media-remove-btn {\n position: absolute;\n top: 0.375rem;\n right: 0.375rem;\n width: 22px;\n height: 22px;\n border: none;\n border-radius: 50%;\n background: rgba(0, 0, 0, 0.6);\n color: #fff;\n cursor: pointer;\n font-size: 0.875rem;\n line-height: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background 0.15s;\n }\n\n .media-remove-btn:hover {\n background: #d72c0d;\n }\n\n .media-browse-btn {\n padding: 0.5rem 0.75rem;\n border: 1px solid #c9cccf;\n border-radius: 8px;\n background: #fff;\n cursor: pointer;\n font-size: 0.8125rem;\n font-family: inherit;\n color: #303030;\n transition: all 0.15s;\n }\n\n .media-browse-btn:hover {\n background: #f6f6f7;\n border-color: #8c9196;\n }\n\n .media-url-input {\n font-size: 0.75rem;\n color: #616161;\n }\n\n .video-preview {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.5rem 0.75rem;\n background: #1a1a1a;\n }\n\n .video-indicator {\n color: #fff;\n display: flex;\n align-items: center;\n flex-shrink: 0;\n }\n\n .video-url-text {\n flex: 1;\n color: #8c9196;\n font-size: 0.6875rem;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .video-preview .media-remove-btn {\n position: static;\n flex-shrink: 0;\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class VisualEditorComponent implements OnInit, OnDestroy {\n readonly facade = inject(VisualEditorFacade);\n private readonly registry = inject(ComponentRegistryService);\n private readonly navigation = inject(VisualEditorNavigation);\n private readonly loadingStrategy = inject(PageLoadingStrategy);\n private readonly config = inject(VISUAL_EDITOR_CONFIG);\n private readonly dndService = inject(DragDropService);\n private readonly sanitizer = inject(DomSanitizer);\n private readonly destroy$ = new Subject<void>();\n\n // Configuration-driven UI options\n readonly showBackButton = computed(() => this.config.ui?.showBackButton ?? true);\n readonly showPublishButtons = computed(() => this.config.ui?.showPublishButtons ?? true);\n readonly showSaveButton = computed(() => this.config.ui?.showSaveButton ?? true);\n\n readonly isPreviewMode = signal(false);\n readonly editorContext = computed(() => ({ isEditor: !this.isPreviewMode() }));\n private readonly canvasEl = viewChild<ElementRef<HTMLElement>>('canvasEl');\n readonly propertiesTab = signal<'props' | 'blocks'>('props');\n readonly expandedGroups = signal(new Set<string>());\n readonly expandedSections = signal<Set<string>>(new Set());\n readonly allBlocksExpanded = signal(new Set<string>());\n readonly showSectionPicker = signal(false);\n readonly blockPickerSection = signal<EditorSection | null>(null);\n readonly nestedBlockPickerTarget = signal<BlockPickerTarget | null>(null);\n\n // File picker state\n readonly filePickerOpen = signal(false);\n readonly filePickerMediaType = signal<'IMAGE' | 'VIDEO'>('IMAGE');\n readonly filePickerTargetKey = signal('');\n readonly filePickerContext = signal<'block' | 'section'>('block');\n readonly filePickerCurrentValue = computed(() => {\n const key = this.filePickerTargetKey();\n if (!key) return '';\n return this.filePickerContext() === 'block'\n ? this.getBlockPropertyValue(key)\n : this.getPropertyValue(key);\n });\n\n // Page state\n readonly isSaving = signal(false);\n readonly isPublishing = signal(false);\n readonly isLoading = signal(false);\n\n // Search signals\n readonly searchQuery = signal('');\n readonly sectionPickerSearch = signal('');\n readonly blockPickerSearch = signal('');\n readonly nestedBlockPickerSearch = signal('');\n\n // DnD signals\n readonly sectionDropZone = signal<string | null>(null);\n readonly dndAnnouncement = signal('');\n private sectionAutoExpandTimer: ReturnType<typeof setTimeout> | null = null;\n\n // Filtered lists\n readonly filteredSections = computed(() => {\n const query = this.searchQuery().toLowerCase().trim();\n const sections = this.facade.sections();\n\n if (!query) return sections;\n\n return sections.filter((section) => {\n const sectionName = this.getSectionName(section).toLowerCase();\n const sectionType = section.type.toLowerCase();\n\n // Match section name or type\n if (sectionName.includes(query) || sectionType.includes(query)) {\n return true;\n }\n\n // Match any block inside the section\n const blocks = section.elements ?? [];\n return blocks.some((block) => {\n const blockName = this.getBlockName(block).toLowerCase();\n const blockType = block.type.toLowerCase();\n return blockName.includes(query) || blockType.includes(query);\n });\n });\n });\n\n readonly filteredAvailableSectionPresets = computed(() => {\n const query = this.sectionPickerSearch().toLowerCase().trim();\n const presets = this.facade.availableSectionPresets();\n\n if (!query) return presets;\n\n return presets.filter((rp) => {\n const name = rp.displayName.toLowerCase();\n const type = rp.definition.type.toLowerCase();\n const desc = (rp.displayDescription ?? '').toLowerCase();\n const tags = (rp.definition.tags ?? []).join(' ').toLowerCase();\n\n return name.includes(query) || type.includes(query) || desc.includes(query) || tags.includes(query);\n });\n });\n\n readonly groupedSectionPresets = computed(() => {\n const presets = this.filteredAvailableSectionPresets();\n const groups = new Map<string, ResolvedPreset[]>();\n\n for (const rp of presets) {\n const category = rp.displayCategory;\n const list = groups.get(category);\n if (list) {\n list.push(rp);\n } else {\n groups.set(category, [rp]);\n }\n }\n\n return Array.from(groups.entries()).map(([category, items]) => ({\n category,\n presets: items,\n }));\n });\n\n readonly filteredBlockPresetsForSection = computed(() => {\n const section = this.blockPickerSection();\n if (!section) return [];\n\n const query = this.blockPickerSearch().toLowerCase().trim();\n const presets = this.registry.getBlockPresetsForSectionType(section.type);\n\n if (!query) return presets;\n\n return presets.filter((rp) => {\n const name = rp.displayName.toLowerCase();\n const type = rp.definition.type.toLowerCase();\n const desc = (rp.displayDescription ?? '').toLowerCase();\n const tags = (rp.definition.tags ?? []).join(' ').toLowerCase();\n\n return name.includes(query) || type.includes(query) || desc.includes(query) || tags.includes(query);\n });\n });\n\n readonly filteredBlockPresetsForNestedSlot = computed(() => {\n const target = this.nestedBlockPickerTarget();\n if (!target) return [];\n\n const query = this.nestedBlockPickerSearch().toLowerCase().trim();\n const firstSlot = target.slots[0];\n\n // Get allowed block definitions, then resolve presets\n const blockDefs = firstSlot\n ? this.facade.getAllowedBlocksForNestedSlot(target.parentType, firstSlot.name)\n : this.facade.availableBlocks();\n\n const presets = blockDefs.flatMap((def) => this.registry.resolvePresets(def));\n\n if (!query) return presets;\n\n return presets.filter((rp) => {\n const name = rp.displayName.toLowerCase();\n const type = rp.definition.type.toLowerCase();\n const desc = (rp.displayDescription ?? '').toLowerCase();\n const tags = (rp.definition.tags ?? []).join(' ').toLowerCase();\n\n return name.includes(query) || type.includes(query) || desc.includes(query) || tags.includes(query);\n });\n });\n\n private readonly sectionIconMap: Record<string, string> = {\n 'hero-section': '<svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path d=\"M2 4a2 2 0 012-2h12a2 2 0 012 2v4H2V4zm0 6h16v6a2 2 0 01-2 2H4a2 2 0 01-2-2v-6z\"/></svg>',\n 'features-grid': '<svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path d=\"M3 3h6v6H3V3zm8 0h6v6h-6V3zm-8 8h6v6H3v-6zm8 0h6v6h-6v-6z\"/></svg>',\n 'testimonials': '<svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path d=\"M2 5a2 2 0 012-2h12a2 2 0 012 2v7a2 2 0 01-2 2H6l-4 4V5z\"/></svg>',\n 'cta-section': '<svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path d=\"M10 2a8 8 0 100 16 8 8 0 000-16zm1 11H9v-2h2v2zm0-4H9V5h2v4z\"/></svg>',\n 'footer-section': '<svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path d=\"M2 4a2 2 0 012-2h12a2 2 0 012 2v12a2 2 0 01-2 2H4a2 2 0 01-2-2V4zm2 10v2h12v-2H4z\"/></svg>',\n 'layout-section': '<svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path d=\"M3 3h14a1 1 0 011 1v12a1 1 0 01-1 1H3a1 1 0 01-1-1V4a1 1 0 011-1zm1 2v10h5V5H4zm7 0v10h5V5h-5z\"/></svg>',\n };\n\n private readonly blockIconMap: Record<string, string> = {\n 'text-block': '<svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path d=\"M4 3h12a1 1 0 011 1v1a1 1 0 01-1 1h-5v10a1 1 0 01-2 0V6H4a1 1 0 01-1-1V4a1 1 0 011-1z\"/></svg>',\n 'button-block': '<svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path d=\"M3 6a2 2 0 012-2h10a2 2 0 012 2v8a2 2 0 01-2 2H5a2 2 0 01-2-2V6zm4 4a1 1 0 100 2h6a1 1 0 100-2H7z\"/></svg>',\n 'image-block': '<svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path d=\"M4 3a2 2 0 00-2 2v10a2 2 0 002 2h12a2 2 0 002-2V5a2 2 0 00-2-2H4zm12 12H4l4-8 3 6 2-4 3 6zM6 7a1 1 0 110-2 1 1 0 010 2z\"/></svg>',\n 'icon-block': '<svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path d=\"M10 2l2.39 4.84L18 7.77l-4 3.9.94 5.5L10 14.27l-4.94 2.9.94-5.5-4-3.9 5.61-.93L10 2z\"/></svg>',\n 'feature-item': '<svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path d=\"M10 2l2.39 4.84L18 7.77l-4 3.9.94 5.5L10 14.27l-4.94 2.9.94-5.5-4-3.9 5.61-.93L10 2z\"/></svg>',\n 'card-block': '<svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path d=\"M4 3a2 2 0 00-2 2v10a2 2 0 002 2h12a2 2 0 002-2V5a2 2 0 00-2-2H4zm0 2h12v4H4V5zm0 6h8v4H4v-4z\"/></svg>',\n 'video-block': '<svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path d=\"M4 3a2 2 0 00-2 2v10a2 2 0 002 2h12a2 2 0 002-2V5a2 2 0 00-2-2H4zm4 3.5l5 3.5-5 3.5v-7z\"/></svg>',\n 'picture-block': '<svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path d=\"M4 3a2 2 0 00-2 2v10a2 2 0 002 2h12a2 2 0 002-2V5a2 2 0 00-2-2H4zm12 12H4l4-8 3 6 2-4 3 6zM6 7a1 1 0 110-2 1 1 0 010 2z\"/></svg>',\n 'flex-layout-block': '<svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path d=\"M3 3h4v14H3V3zm5 0h4v14H8V3zm5 0h4v14h-4V3z\"/></svg>',\n };\n\n readonly selectedBlockDefinition = computed(() => this.facade.selectedBlockDefinition());\n\n // Inline name editing\n private readonly nameInput = viewChild<ElementRef<HTMLInputElement>>('nameInput');\n readonly isEditingName = signal(false);\n readonly editingNameValue = signal('');\n\n getSelectedDisplayName(def: ComponentDefinition): string {\n const block = this.facade.selectedBlock();\n if (block) {\n return block.adminLabel || this.facade.selectedBlockDefinition()?.name || block.type;\n }\n const section = this.facade.selectedSection();\n return section?.adminLabel || def.name;\n }\n\n getSelectedDefaultName(def: ComponentDefinition): string {\n const block = this.facade.selectedBlock();\n if (block) {\n return this.facade.selectedBlockDefinition()?.name || block.type;\n }\n return def.name;\n }\n\n startEditingName(): void {\n const block = this.facade.selectedBlock();\n if (block) {\n this.editingNameValue.set(block.adminLabel ?? '');\n } else {\n const section = this.facade.selectedSection();\n this.editingNameValue.set(section?.adminLabel ?? '');\n }\n this.isEditingName.set(true);\n requestAnimationFrame(() => {\n const input = this.nameInput()?.nativeElement;\n if (input) {\n input.focus();\n input.select();\n }\n });\n }\n\n saveEditingName(event: Event): void {\n if (!this.isEditingName()) return;\n const input = event.target as HTMLInputElement;\n const value = input.value.trim();\n const section = this.facade.selectedSection();\n if (!section) return;\n\n const block = this.facade.selectedBlock();\n if (block) {\n this.facade.renameBlock(section.id, block.id, value);\n } else {\n this.facade.renameSection(section.id, value);\n }\n this.isEditingName.set(false);\n }\n\n cancelEditingName(): void {\n this.isEditingName.set(false);\n }\n\n ngOnInit(): void {\n // Load page using the configured loading strategy\n this.loadingStrategy\n .getPageIdToLoad()\n .pipe(\n takeUntil(this.destroy$),\n filter((pageId): pageId is string => pageId !== null),\n switchMap((pageId) => {\n this.isLoading.set(true);\n return this.loadingStrategy.loadPage(pageId);\n })\n )\n .subscribe({\n next: (page) => {\n this.facade.loadPage(page);\n this.isLoading.set(false);\n },\n error: (err) => {\n console.error('Failed to load page:', err);\n this.isLoading.set(false);\n this.navigation.navigate({ type: 'page-list' });\n },\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n // Clear page from store when leaving editor\n this.facade.clearPage();\n }\n\n goBack(): void {\n if (this.facade.isDirty()) {\n this.navigation\n .confirm({\n title: 'Unsaved Changes',\n message: 'You have unsaved changes. Are you sure you want to leave?',\n confirmText: 'Leave',\n cancelText: 'Stay',\n })\n .subscribe((confirmed) => {\n if (confirmed) {\n this.navigation.navigate({ type: 'page-list' });\n }\n });\n } else {\n this.navigation.navigate({ type: 'page-list' });\n }\n }\n\n savePage(): void {\n const pageId = this.facade.currentPageId();\n if (!pageId) return;\n\n this.isSaving.set(true);\n this.facade.savePage(pageId).subscribe({\n next: () => {\n this.isSaving.set(false);\n },\n error: (err) => {\n console.error('Failed to save page:', err);\n this.isSaving.set(false);\n },\n });\n }\n\n publishPage(): void {\n const pageId = this.facade.currentPageId();\n if (!pageId) return;\n\n this.isPublishing.set(true);\n this.facade.publishPage(pageId).subscribe({\n next: () => {\n this.isPublishing.set(false);\n },\n error: (err) => {\n console.error('Failed to publish page:', err);\n this.isPublishing.set(false);\n },\n });\n }\n\n unpublishPage(): void {\n const pageId = this.facade.currentPageId();\n if (!pageId) return;\n\n this.isPublishing.set(true);\n this.facade.unpublishPage(pageId).subscribe({\n next: () => {\n this.isPublishing.set(false);\n },\n error: (err) => {\n console.error('Failed to unpublish page:', err);\n this.isPublishing.set(false);\n },\n });\n }\n\n private readonly defaultSectionIcon = '<svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path d=\"M3 3h14a1 1 0 011 1v12a1 1 0 01-1 1H3a1 1 0 01-1-1V4a1 1 0 011-1zm1 2v10h12V5H4z\"/></svg>';\n private readonly defaultBlockIcon = '<svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path d=\"M10 2l1.5 3h3.5l-2.5 2.5 1 3.5-3.5-2-3.5 2 1-3.5L4 5h3.5L10 2zm-6 10h12v2H4v-2zm2 4h8v2H6v-2z\"/></svg>';\n\n private toSafeIcon(icon: string): SafeHtml {\n if (icon.trim().startsWith('<')) {\n return this.sanitizer.bypassSecurityTrustHtml(icon);\n }\n return this.sanitizer.bypassSecurityTrustHtml(\n `<span style=\"font-family:'Material Icons',sans-serif;font-weight:normal;font-style:normal;line-height:1;letter-spacing:normal;text-transform:none;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility\">${icon}</span>`\n );\n }\n\n getIcon(def: ComponentDefinition): SafeHtml {\n return this.toSafeIcon(this.sectionIconMap[def.type] ?? def.icon ?? this.defaultSectionIcon);\n }\n\n getBlockIcon(def: ComponentDefinition): SafeHtml {\n return this.toSafeIcon(this.blockIconMap[def.type] ?? def.icon ?? this.defaultBlockIcon);\n }\n\n getBlockIconByType(type: string): SafeHtml {\n return this.toSafeIcon(this.blockIconMap[type] ?? this.defaultBlockIcon);\n }\n\n getSectionIcon(type: string): SafeHtml {\n return this.toSafeIcon(this.sectionIconMap[type] ?? this.defaultSectionIcon);\n }\n\n // Tree expansion\n isSectionExpanded(sectionId: string): boolean {\n return this.expandedSections().has(sectionId);\n }\n\n isAllBlocksExpanded(sectionId: string): boolean {\n return this.allBlocksExpanded().has(sectionId);\n }\n\n toggleSectionExpand(sectionId: string, event: Event): void {\n event.stopPropagation();\n const wasExpanded = this.expandedSections().has(sectionId);\n this.expandedSections.update((set) => {\n const newSet = new Set(set);\n if (wasExpanded) {\n newSet.delete(sectionId);\n } else {\n newSet.add(sectionId);\n }\n return newSet;\n });\n if (wasExpanded) {\n this.allBlocksExpanded.update((set) => {\n const newSet = new Set(set);\n newSet.delete(sectionId);\n return newSet;\n });\n }\n }\n\n toggleGroup(entityId: string, group: string): void {\n const key = `${entityId}:${group}`;\n this.expandedGroups.update((set) => {\n const newSet = new Set(set);\n if (newSet.has(key)) {\n newSet.delete(key);\n } else {\n newSet.add(key);\n }\n return newSet;\n });\n }\n\n isGroupCollapsed(entityId: string, group: string): boolean {\n return !this.expandedGroups().has(`${entityId}:${group}`);\n }\n\n getSectionBlocks(section: EditorSection): EditorElement[] {\n return section.elements ?? [];\n }\n\n private readonly rootBlockContextCache = new Map<string, BlockTreeContext>();\n private readonly emptyPath: string[] = [];\n\n getRootBlockContext(sectionId: string): BlockTreeContext {\n let ctx = this.rootBlockContextCache.get(sectionId);\n if (!ctx) {\n ctx = { sectionId, parentPath: this.emptyPath, depth: 0 };\n this.rootBlockContextCache.set(sectionId, ctx);\n }\n return ctx;\n }\n\n // Search handlers\n onSearchInput(event: Event): void {\n const input = event.target as HTMLInputElement;\n this.searchQuery.set(input.value);\n\n // Auto-expand sections that match when searching\n if (input.value.trim()) {\n const matchingSectionIds = this.filteredSections().map((s) => s.id);\n this.expandedSections.update((set) => {\n const newSet = new Set(set);\n matchingSectionIds.forEach((id) => newSet.add(id));\n return newSet;\n });\n }\n }\n\n clearSearch(): void {\n this.searchQuery.set('');\n }\n\n // ========== Section Drag & Drop ==========\n\n isSectionDragSource(sectionId: string): boolean {\n const dragItem = this.dndService.dragItem();\n return dragItem !== null && dragItem.kind === 'section' && dragItem.elementId === sectionId;\n }\n\n onSectionDragStart(section: EditorSection, index: number, event: DragEvent): void {\n event.stopPropagation();\n const item: DragItem = {\n kind: 'section',\n elementId: section.id,\n elementType: section.type,\n sectionId: section.id,\n parentPath: [],\n sourceIndex: index,\n };\n this.dndService.startDrag(item, event);\n this.dndAnnouncement.set(`Grabbed ${this.getSectionName(section)}, position ${index + 1} of ${this.facade.sections().length}`);\n }\n\n onSectionDragEnd(event: DragEvent): void {\n event.stopPropagation();\n this.dndService.endDrag();\n this.sectionDropZone.set(null);\n this.clearAutoExpandTimer();\n this.dndAnnouncement.set('');\n }\n\n onSectionDragOver(section: EditorSection, index: number, event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n\n const dragItem = this.dndService.dragItem();\n if (!dragItem) return;\n\n if (dragItem.kind === 'section') {\n // Section reordering\n const el = event.currentTarget as HTMLElement;\n const rect = el.getBoundingClientRect();\n const y = event.clientY - rect.top;\n const zone: DropZone = y / rect.height < 0.5 ? 'before' : 'after';\n\n const targetIndex = zone === 'before' ? index : index + 1;\n const target = {\n kind: 'section' as const,\n sectionId: section.id,\n parentPath: [] as string[],\n slotName: 'default',\n index: targetIndex,\n depth: 0,\n zone,\n };\n\n if (this.dndService.validateDrop(dragItem, target)) {\n event.dataTransfer!.dropEffect = 'move';\n this.sectionDropZone.set(`${section.id}:${zone}`);\n this.dndService.updateDropTarget(target);\n } else {\n event.dataTransfer!.dropEffect = 'none';\n this.sectionDropZone.set(null);\n }\n } else if (dragItem.kind === 'block') {\n // Block dragged over collapsed section - auto-expand\n if (!this.isSectionExpanded(section.id)) {\n this.startAutoExpandTimer(section.id);\n }\n }\n }\n\n onSectionDragLeave(event: DragEvent): void {\n const el = event.currentTarget as HTMLElement;\n const relatedTarget = event.relatedTarget as Node | null;\n if (relatedTarget && el.contains(relatedTarget)) return;\n\n this.sectionDropZone.set(null);\n this.clearAutoExpandTimer();\n }\n\n onSectionDrop(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.sectionDropZone.set(null);\n this.clearAutoExpandTimer();\n\n const dragItem = this.dndService.dragItem();\n if (dragItem?.kind === 'section') {\n this.dndService.executeDrop();\n this.dndAnnouncement.set('Section dropped');\n }\n }\n\n onSectionDragHandleKeydown(sectionId: string, index: number, event: KeyboardEvent): void {\n if (event.key === 'ArrowUp' && index > 0) {\n event.preventDefault();\n this.facade.moveSection(sectionId, index - 1);\n } else if (event.key === 'ArrowDown' && index < this.facade.sections().length - 1) {\n event.preventDefault();\n this.facade.moveSection(sectionId, index + 1);\n }\n }\n\n onSectionContentDragOver(section: EditorSection, event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n\n const dragItem = this.dndService.dragItem();\n if (!dragItem || dragItem.kind !== 'block') return;\n\n // Allow dropping blocks into section content area (appends to end)\n const sectionDef = this.facade.getDefinition(section.type);\n const slotName = sectionDef?.slots?.[0]?.name ?? 'default';\n const blocks = this.getSectionBlocks(section);\n\n const target = {\n kind: 'block' as const,\n sectionId: section.id,\n parentPath: [] as string[],\n slotName,\n index: blocks.length,\n depth: 0,\n zone: 'after' as DropZone,\n };\n\n if (this.dndService.validateDrop(dragItem, target)) {\n event.dataTransfer!.dropEffect = 'move';\n this.dndService.updateDropTarget(target);\n } else {\n event.dataTransfer!.dropEffect = 'none';\n }\n }\n\n onSectionContentDragLeave(event: DragEvent): void {\n const el = event.currentTarget as HTMLElement;\n const relatedTarget = event.relatedTarget as Node | null;\n if (relatedTarget && el.contains(relatedTarget)) return;\n }\n\n onSectionContentDrop(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n\n const dragItem = this.dndService.dragItem();\n if (dragItem?.kind === 'block') {\n this.dndService.executeDrop();\n this.dndAnnouncement.set('Block moved');\n }\n }\n\n private startAutoExpandTimer(sectionId: string): void {\n this.clearAutoExpandTimer();\n this.sectionAutoExpandTimer = setTimeout(() => {\n this.expandedSections.update((set) => {\n const newSet = new Set(set);\n newSet.add(sectionId);\n return newSet;\n });\n }, 500);\n }\n\n private clearAutoExpandTimer(): void {\n if (this.sectionAutoExpandTimer !== null) {\n clearTimeout(this.sectionAutoExpandTimer);\n this.sectionAutoExpandTimer = null;\n }\n }\n\n // ========== Scroll to Element ==========\n\n private scrollToCanvasElement(elementId: string, fallbackSectionId?: string): void {\n const canvas = this.canvasEl()?.nativeElement;\n if (!canvas) return;\n\n requestAnimationFrame(() => {\n const el = canvas.querySelector<HTMLElement>(`[data-element-id=\"${elementId}\"]`);\n // Block component hosts use `display: contents` so they have no bounding box.\n // Resolve the first child that generates a CSS box for scrollIntoView to work.\n const target = this.resolveScrollTarget(el)\n ?? this.resolveScrollTarget(\n fallbackSectionId ? canvas.querySelector<HTMLElement>(`[data-section-id=\"${fallbackSectionId}\"]`) : null\n );\n target?.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n });\n }\n\n /** Return the element itself if it has a box, otherwise its first laid-out child. */\n private resolveScrollTarget(el: HTMLElement | null): HTMLElement | null {\n if (!el) return null;\n // Elements with `display: contents` report a zero-area bounding rect.\n const rect = el.getBoundingClientRect();\n if (rect.width > 0 && rect.height > 0) return el;\n // Walk into children to find one that paints.\n return (el.firstElementChild as HTMLElement) ?? el;\n }\n\n private scrollToCanvasSection(sectionId: string): void {\n const canvas = this.canvasEl()?.nativeElement;\n if (!canvas) return;\n\n requestAnimationFrame(() => {\n const target = canvas.querySelector<HTMLElement>(`[data-section-id=\"${sectionId}\"]`);\n target?.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n });\n }\n\n onSectionPickerSearch(event: Event): void {\n const input = event.target as HTMLInputElement;\n this.sectionPickerSearch.set(input.value);\n }\n\n onBlockPickerSearch(event: Event): void {\n const input = event.target as HTMLInputElement;\n this.blockPickerSearch.set(input.value);\n }\n\n // Section picker\n toggleSectionPicker(): void {\n this.showSectionPicker.update((v) => !v);\n // Clear search when toggling\n if (!this.showSectionPicker()) {\n this.sectionPickerSearch.set('');\n }\n }\n\n // Block picker\n openBlockPicker(section: EditorSection, event: Event): void {\n event.stopPropagation();\n this.blockPickerSection.set(section);\n this.blockPickerSearch.set(''); // Clear search when opening\n }\n\n closeBlockPicker(): void {\n this.blockPickerSection.set(null);\n this.blockPickerSearch.set('');\n }\n\n // Nested block picker (for blocks with slots)\n onOpenNestedBlockPicker(target: BlockPickerTarget): void {\n this.nestedBlockPickerTarget.set(target);\n this.nestedBlockPickerSearch.set('');\n }\n\n closeNestedBlockPicker(): void {\n this.nestedBlockPickerTarget.set(null);\n this.nestedBlockPickerSearch.set('');\n }\n\n onNestedBlockPickerSearch(event: Event): void {\n const input = event.target as HTMLInputElement;\n this.nestedBlockPickerSearch.set(input.value);\n }\n\n addNestedBlock(blockType: string): void {\n const target = this.nestedBlockPickerTarget();\n if (!target) return;\n\n const slotName = target.slots[0]?.name ?? 'default';\n this.facade.addNestedBlock(target.sectionId, target.parentPath, slotName, blockType);\n this.closeNestedBlockPicker();\n }\n\n // Block tree item handlers\n onBlockSelect(event: { block: EditorElement; context: BlockTreeContext }): void {\n this.isEditingName.set(false);\n this.facade.selectElement(event.context.sectionId, event.block.id);\n this.propertiesTab.set('props');\n this.scrollToCanvasElement(event.block.id, event.context.sectionId);\n }\n\n onBlockDelete(event: { block: EditorElement; context: BlockTreeContext }): void {\n if (event.context.parentPath.length === 0) {\n // Direct child of section\n this.facade.removeBlock(event.context.sectionId, event.block.id);\n } else {\n // Nested block\n this.facade.removeNestedBlock(event.context.sectionId, event.context.parentPath, event.block.id);\n }\n }\n\n onBlockMove(event: { block: EditorElement; context: BlockTreeContext; newIndex: number }): void {\n const slotName = event.block.slotName ?? 'default';\n if (event.context.parentPath.length === 0) {\n // Direct child of section\n this.facade.moveBlock(event.context.sectionId, event.block.id, slotName, event.newIndex);\n } else {\n // Nested block\n this.facade.moveNestedBlock(\n event.context.sectionId,\n event.context.parentPath,\n event.block.id,\n slotName,\n event.newIndex\n );\n }\n }\n\n onBlockDuplicate(event: { block: EditorElement; context: BlockTreeContext }): void {\n if (event.context.parentPath.length === 0) {\n this.facade.duplicateBlock(event.context.sectionId, event.block.id);\n } else {\n this.facade.duplicateNestedBlock(event.context.sectionId, event.context.parentPath, event.block.id);\n }\n }\n\n duplicateSection(sectionId: string, event: Event): void {\n event.stopPropagation();\n this.facade.duplicateSection(sectionId);\n }\n\n duplicateBlock(block: EditorElement, event: Event): void {\n event.stopPropagation();\n const section = this.facade.selectedSection();\n if (!section) return;\n this.facade.duplicateBlock(section.id, block.id);\n }\n\n addBlockToSection(section: EditorSection, blockType: string): void {\n const sectionDef = this.facade.getDefinition(section.type);\n const slotName = sectionDef?.slots?.[0]?.name ?? 'default';\n this.facade.addBlock(section.id, slotName, blockType);\n this.closeBlockPicker();\n // Ensure section is expanded to show new block\n this.expandedSections.update((set) => {\n const newSet = new Set(set);\n newSet.add(section.id);\n return newSet;\n });\n }\n\n getSectionName(section: EditorSection): string {\n return section.adminLabel || this.facade.getDefinition(section.type)?.name || section.type;\n }\n\n getBlockName(block: EditorElement): string {\n if (block.adminLabel) return block.adminLabel;\n const def = this.facade.getDefinition(block.type);\n const preview = String(block.props['content'] ?? block.props['label'] ?? block.props['text'] ?? '');\n if (preview && preview.length > 20) {\n return preview.substring(0, 20) + '...';\n }\n return preview || def?.name || block.type;\n }\n\n addSection(type: string): void {\n this.facade.addSection(type);\n this.showSectionPicker.set(false);\n }\n\n addSectionFromPreset(rp: ResolvedPreset): void {\n this.facade.addSectionFromPreset(rp);\n this.showSectionPicker.set(false);\n this.sectionPickerSearch.set('');\n }\n\n addBlockToSectionFromPreset(section: EditorSection, rp: ResolvedPreset): void {\n const sectionDef = this.facade.getDefinition(section.type);\n const slotName = sectionDef?.slots?.[0]?.name ?? 'default';\n this.facade.addBlockFromPreset(section.id, slotName, rp);\n this.closeBlockPicker();\n this.expandedSections.update((set) => {\n const newSet = new Set(set);\n newSet.add(section.id);\n return newSet;\n });\n }\n\n addNestedBlockFromPreset(rp: ResolvedPreset): void {\n const target = this.nestedBlockPickerTarget();\n if (!target) return;\n\n const slotName = target.slots[0]?.name ?? 'default';\n\n // For nested blocks without preset settings, use existing method\n if (!rp.preset?.settings) {\n this.facade.addNestedBlock(target.sectionId, target.parentPath, slotName, rp.definition.type);\n } else {\n // Create the block element with preset props, then dispatch via addNestedBlock\n this.facade.addNestedBlock(target.sectionId, target.parentPath, slotName, rp.definition.type);\n\n // Apply preset settings to the newly added block\n const section = this.facade.sections().find((s) => s.id === target.sectionId);\n if (section) {\n // Find the last element in the slot — it's the one just added\n const children = section.elements.filter((e) => e.slotName === slotName);\n const lastChild = children[children.length - 1];\n if (lastChild) {\n this.facade.updateBlockProps(target.sectionId, lastChild.id, rp.preset.settings);\n }\n }\n }\n\n this.closeNestedBlockPicker();\n }\n\n getSectionPresetIcon(rp: ResolvedPreset): SafeHtml {\n return this.toSafeIcon(rp.displayIcon ?? this.sectionIconMap[rp.definition.type] ?? this.defaultSectionIcon);\n }\n\n getBlockPresetIcon(rp: ResolvedPreset): SafeHtml {\n return this.toSafeIcon(rp.displayIcon ?? this.blockIconMap[rp.definition.type] ?? this.defaultBlockIcon);\n }\n\n selectSection(section: EditorSection, event: Event): void {\n event.stopPropagation();\n this.isEditingName.set(false);\n\n const isAlreadySelected = this.facade.selectedSection()?.id === section.id && !this.facade.selectedBlock();\n\n if (isAlreadySelected) {\n const wasExpanded = this.expandedSections().has(section.id);\n this.expandedSections.update((set) => {\n const newSet = new Set(set);\n if (wasExpanded) {\n newSet.delete(section.id);\n } else {\n newSet.add(section.id);\n }\n return newSet;\n });\n this.allBlocksExpanded.update((set) => {\n const newSet = new Set(set);\n if (wasExpanded) {\n newSet.delete(section.id);\n } else {\n newSet.add(section.id);\n }\n return newSet;\n });\n } else {\n this.facade.selectElement(section.id, null);\n this.expandedSections.update((set) => {\n const newSet = new Set(set);\n newSet.add(section.id);\n return newSet;\n });\n this.allBlocksExpanded.update((set) => {\n const newSet = new Set(set);\n newSet.add(section.id);\n return newSet;\n });\n this.scrollToCanvasSection(section.id);\n }\n }\n\n selectBlock(block: EditorElement): void {\n const section = this.facade.selectedSection();\n if (!section) return;\n this.isEditingName.set(false);\n this.facade.selectElement(section.id, block.id);\n this.propertiesTab.set('props');\n }\n\n deleteSection(sectionId: string, event: Event): void {\n event.stopPropagation();\n this.facade.removeSection(sectionId);\n }\n\n deleteBlock(block: EditorElement, event: Event): void {\n event.stopPropagation();\n const section = this.facade.selectedSection();\n if (!section) return;\n this.facade.removeBlock(section.id, block.id);\n }\n\n deleteSelectedBlock(): void {\n const section = this.facade.selectedSection();\n const block = this.facade.selectedBlock();\n if (!section || !block) return;\n this.facade.removeBlock(section.id, block.id);\n }\n\n moveUp(sectionId: string, currentIndex: number, event: Event): void {\n event.stopPropagation();\n this.facade.moveSection(sectionId, currentIndex - 1);\n }\n\n moveDown(sectionId: string, currentIndex: number, event: Event): void {\n event.stopPropagation();\n this.facade.moveSection(sectionId, currentIndex + 1);\n }\n\n moveBlockUp(block: EditorElement, slotName: string, currentIndex: number, event: Event): void {\n event.stopPropagation();\n const section = this.facade.selectedSection();\n if (!section) return;\n this.facade.moveBlock(section.id, block.id, slotName, currentIndex - 1);\n }\n\n moveBlockDown(block: EditorElement, slotName: string, currentIndex: number, event: Event): void {\n event.stopPropagation();\n const section = this.facade.selectedSection();\n if (!section) return;\n this.facade.moveBlock(section.id, block.id, slotName, currentIndex + 1);\n }\n\n togglePreview(): void {\n this.isPreviewMode.update((v) => !v);\n if (this.isPreviewMode()) {\n this.facade.clearSelection();\n }\n }\n\n // Section slots and blocks\n getSectionSlots() {\n const section = this.facade.selectedSection();\n if (!section) return [];\n const def = this.facade.getDefinition(section.type);\n return def?.slots ?? [];\n }\n\n getBlocksForSlot(slotName: string): EditorElement[] {\n const section = this.facade.selectedSection();\n if (!section) return [];\n return this.facade.getBlocksForSlot(section.id, slotName);\n }\n\n getBlockCount(): number {\n const section = this.facade.selectedSection();\n if (!section) return 0;\n return section.elements.length;\n }\n\n // Section property methods\n getPropertyGroups(def: ComponentDefinition): string[] {\n const groups = new Set<string>();\n Object.values(def.props).forEach((prop) => {\n groups.add(prop.group ?? 'General');\n });\n return Array.from(groups);\n }\n\n getPropsForGroup(\n def: ComponentDefinition,\n group: string\n ): Array<{ key: string; schema: (typeof def.props)[string] }> {\n return Object.entries(def.props)\n .filter(([, schema]) => (schema.group ?? 'General') === group)\n .sort((a, b) => (a[1].order ?? 999) - (b[1].order ?? 999))\n .map(([key, schema]) => ({ key, schema }));\n }\n\n getPropertyValue(key: string): string {\n const section = this.facade.selectedSection();\n if (!section) return '';\n const value = section.props[key];\n if (value === undefined || value === null) {\n const def = this.facade.selectedSectionDefinition();\n return String(def?.props[key]?.defaultValue ?? '');\n }\n return String(value);\n }\n\n updateProperty(key: string, event: Event): void {\n const section = this.facade.selectedSection();\n if (!section) return;\n\n const target = event.target as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n this.facade.updateSectionProps(section.id, { [key]: target.value });\n }\n\n // Block property methods\n getBlockPropertyGroups(): string[] {\n const def = this.selectedBlockDefinition();\n if (!def) return [];\n const groups = new Set<string>();\n Object.values(def.props).forEach((prop) => {\n groups.add(prop.group ?? 'General');\n });\n return Array.from(groups);\n }\n\n getBlockPropsForGroup(group: string): Array<{ key: string; schema: ComponentDefinition['props'][string] }> {\n const def = this.selectedBlockDefinition();\n if (!def) return [];\n return Object.entries(def.props)\n .filter(([, schema]) => (schema.group ?? 'General') === group)\n .sort((a, b) => (a[1].order ?? 999) - (b[1].order ?? 999))\n .map(([key, schema]) => ({ key, schema }));\n }\n\n getBlockPropertyValue(key: string): string {\n const block = this.facade.selectedBlock();\n if (!block) return '';\n const value = block.props[key];\n if (value === undefined || value === null) {\n const def = this.selectedBlockDefinition();\n return String(def?.props[key]?.defaultValue ?? '');\n }\n return String(value);\n }\n\n updateBlockProperty(key: string, event: Event): void {\n const section = this.facade.selectedSection();\n const block = this.facade.selectedBlock();\n if (!section || !block) return;\n\n const target = event.target as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n let value: unknown = target.value;\n\n const def = this.selectedBlockDefinition();\n if (def?.props[key]?.type === 'number') {\n value = parseFloat(target.value) || 0;\n }\n\n this.facade.updateBlockProps(section.id, block.id, { [key]: value });\n }\n\n updateBlockBooleanProperty(key: string, event: Event): void {\n const section = this.facade.selectedSection();\n const block = this.facade.selectedBlock();\n if (!section || !block) return;\n\n const target = event.target as HTMLInputElement;\n this.facade.updateBlockProps(section.id, block.id, { [key]: target.checked });\n }\n\n // File picker methods\n openFilePicker(mediaType: 'IMAGE' | 'VIDEO', key: string, context: 'block' | 'section'): void {\n this.filePickerMediaType.set(mediaType);\n this.filePickerTargetKey.set(key);\n this.filePickerContext.set(context);\n this.filePickerOpen.set(true);\n }\n\n closeFilePicker(): void {\n this.filePickerOpen.set(false);\n }\n\n onFileSelected(url: string): void {\n const key = this.filePickerTargetKey();\n if (!key) return;\n\n if (this.filePickerContext() === 'block') {\n const section = this.facade.selectedSection();\n const block = this.facade.selectedBlock();\n if (section && block) {\n this.facade.updateBlockProps(section.id, block.id, { [key]: url });\n }\n } else {\n const section = this.facade.selectedSection();\n if (section) {\n this.facade.updateSectionProps(section.id, { [key]: url });\n }\n }\n\n this.closeFilePicker();\n }\n\n clearBlockProperty(key: string): void {\n const section = this.facade.selectedSection();\n const block = this.facade.selectedBlock();\n if (!section || !block) return;\n this.facade.updateBlockProps(section.id, block.id, { [key]: '' });\n }\n\n clearSectionProperty(key: string): void {\n const section = this.facade.selectedSection();\n if (!section) return;\n this.facade.updateSectionProps(section.id, { [key]: '' });\n }\n}\n","import {\n Component,\n ChangeDetectionStrategy,\n inject,\n signal,\n OnInit,\n} from '@angular/core';\nimport { VisualEditorFacade } from '../../services/visual-editor-facade.service';\nimport { PageSummary } from '../../models/page.model';\nimport { VisualEditorNavigation } from '../../navigation/visual-editor-navigation.types';\n\n/**\n * Page manager component for listing, creating, and managing pages\n */\n@Component({\n selector: 'lib-page-manager',\n template: `\n <div class=\"page-manager\">\n <header class=\"manager-header\">\n <h1>Pages</h1>\n <button class=\"btn-primary\" (click)=\"openCreateDialog()\">\n + New Page\n </button>\n </header>\n\n @if (isLoading()) {\n <div class=\"loading-state\">\n <p>Loading pages...</p>\n </div>\n } @else if (error()) {\n <div class=\"error-state\">\n <p>{{ error() }}</p>\n <button class=\"btn-secondary\" (click)=\"loadPages()\">Retry</button>\n </div>\n } @else if (pages().length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\"><svg width=\"40\" height=\"40\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path d=\"M6 2a2 2 0 00-2 2v12a2 2 0 002 2h8a2 2 0 002-2V7.414A2 2 0 0015.414 6L12 2.586A2 2 0 0010.586 2H6zm0 2h4v3a1 1 0 001 1h3v8H6V4zm6 .414L14.586 7H12V4.414z\"/></svg></div>\n <h2>No pages yet</h2>\n <p>Create your first page to get started</p>\n <button class=\"btn-primary\" (click)=\"openCreateDialog()\">\n Create Page\n </button>\n </div>\n } @else {\n <div class=\"pages-table\">\n <div class=\"table-header\">\n <span class=\"col-title\">Title</span>\n <span class=\"col-slug\">Slug</span>\n <span class=\"col-status\">Status</span>\n <span class=\"col-updated\">Updated</span>\n <span class=\"col-actions\">Actions</span>\n </div>\n @for (page of pages(); track page.id) {\n <div class=\"table-row\" (click)=\"editPage(page.id)\">\n <span class=\"col-title\">{{ page.title }}</span>\n <span class=\"col-slug\">/pages/{{ page.slug }}</span>\n <span class=\"col-status\">\n <span class=\"status-badge\" [class.published]=\"page.status === 'published'\">\n {{ page.status }}\n </span>\n </span>\n <span class=\"col-updated\">{{ formatDate(page.updatedAt) }}</span>\n <span class=\"col-actions\">\n <button\n class=\"action-btn\"\n (click)=\"editPage(page.id); $event.stopPropagation()\"\n title=\"Edit\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path d=\"M14.846 1.403a2.45 2.45 0 013.464 3.464l-1.241 1.24-3.464-3.463 1.241-1.241zm-2.654 2.654L2 14.25V17.5h3.464L15.656 7.308l-3.464-3.25z\"/></svg>\n </button>\n <button\n class=\"action-btn\"\n (click)=\"duplicatePage(page.id, $event)\"\n title=\"Duplicate\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path d=\"M8 2a2 2 0 00-2 2v10a2 2 0 002 2h6a2 2 0 002-2V4a2 2 0 00-2-2H8zm0 2h6v10H8V4zM4 6a2 2 0 00-2 2v8a2 2 0 002 2h6a2 2 0 002-2h-2a4 4 0 01-4-4V6H4z\"/></svg>\n </button>\n <button\n class=\"action-btn delete\"\n (click)=\"confirmDelete(page, $event)\"\n title=\"Delete\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path d=\"M8 3a1 1 0 00-1 1H5a1 1 0 000 2h10a1 1 0 100-2h-2a1 1 0 00-1-1H8zm-2 4h8l-.5 8.5a1 1 0 01-1 .5h-5a1 1 0 01-1-.5L6 7z\"/></svg>\n </button>\n </span>\n </div>\n }\n </div>\n }\n\n <!-- Create Page Dialog -->\n @if (showCreateDialog()) {\n <div class=\"dialog-overlay\" (click)=\"closeCreateDialog()\">\n <div class=\"dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"dialog-header\">\n <h2>Create New Page</h2>\n <button class=\"close-btn\" (click)=\"closeCreateDialog()\">×</button>\n </div>\n <form class=\"dialog-content\" (submit)=\"createPage($event)\">\n <div class=\"form-field\">\n <label for=\"pageTitle\">Title</label>\n <input\n id=\"pageTitle\"\n type=\"text\"\n [value]=\"newPageTitle()\"\n (input)=\"onTitleInput($event)\"\n placeholder=\"My New Page\"\n required\n />\n </div>\n <div class=\"form-field\">\n <label for=\"pageSlug\">Slug</label>\n <div class=\"slug-field\">\n <span class=\"slug-prefix\">/pages/</span>\n <input\n id=\"pageSlug\"\n type=\"text\"\n [value]=\"newPageSlug()\"\n (input)=\"onSlugInput($event)\"\n placeholder=\"my-new-page\"\n required\n pattern=\"[-a-z0-9]+\"\n />\n </div>\n </div>\n @if (createError()) {\n <div class=\"form-error\">{{ createError() }}</div>\n }\n <div class=\"dialog-actions\">\n <button type=\"button\" class=\"btn-secondary\" (click)=\"closeCreateDialog()\">\n Cancel\n </button>\n <button type=\"submit\" class=\"btn-primary\" [disabled]=\"isCreating()\">\n {{ isCreating() ? 'Creating...' : 'Create Page' }}\n </button>\n </div>\n </form>\n </div>\n </div>\n }\n\n <!-- Delete Confirmation Dialog -->\n @if (pageToDelete()) {\n <div class=\"dialog-overlay\" (click)=\"cancelDelete()\">\n <div class=\"dialog dialog-small\" (click)=\"$event.stopPropagation()\">\n <div class=\"dialog-header\">\n <h2>Delete Page</h2>\n <button class=\"close-btn\" (click)=\"cancelDelete()\">×</button>\n </div>\n <div class=\"dialog-content\">\n <p>Are you sure you want to delete \"{{ pageToDelete()!.title }}\"?</p>\n <p class=\"warning\">This action cannot be undone.</p>\n </div>\n <div class=\"dialog-actions\">\n <button class=\"btn-secondary\" (click)=\"cancelDelete()\">Cancel</button>\n <button class=\"btn-danger\" (click)=\"deletePage()\" [disabled]=\"isDeleting()\">\n {{ isDeleting() ? 'Deleting...' : 'Delete' }}\n </button>\n </div>\n </div>\n </div>\n }\n </div>\n `,\n styles: `\n :host {\n display: block;\n min-height: 100vh;\n background: #f6f6f7;\n font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n }\n\n .page-manager {\n max-width: 1200px;\n margin: 0 auto;\n padding: 2rem;\n }\n\n .manager-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 2rem;\n }\n\n .manager-header h1 {\n margin: 0;\n font-size: 1.5rem;\n font-weight: 600;\n color: #303030;\n }\n\n .btn-primary {\n padding: 0.625rem 1.25rem;\n border: none;\n border-radius: 8px;\n background: #303030;\n color: #fff;\n font-size: 0.8125rem;\n font-weight: 500;\n font-family: inherit;\n cursor: pointer;\n transition: background 0.15s;\n }\n\n .btn-primary:hover {\n background: #1a1a1a;\n }\n\n .btn-primary:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .btn-secondary {\n padding: 0.625rem 1.25rem;\n border: 1px solid #c9cccf;\n border-radius: 8px;\n background: #fff;\n color: #303030;\n font-size: 0.8125rem;\n font-weight: 500;\n font-family: inherit;\n cursor: pointer;\n transition: all 0.15s;\n }\n\n .btn-secondary:hover {\n background: #f6f6f7;\n }\n\n .btn-danger {\n padding: 0.625rem 1.25rem;\n border: none;\n border-radius: 8px;\n background: #d72c0d;\n color: #fff;\n font-size: 0.8125rem;\n font-weight: 500;\n font-family: inherit;\n cursor: pointer;\n transition: background 0.15s;\n }\n\n .btn-danger:hover {\n background: #bc2200;\n }\n\n .btn-danger:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n /* States */\n .loading-state,\n .error-state,\n .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 4rem 2rem;\n background: #fff;\n border-radius: 12px;\n text-align: center;\n box-shadow: 0 1px 0 rgba(0, 0, 0, 0.05);\n border: 1px solid #e3e3e3;\n }\n\n .empty-icon {\n margin-bottom: 1rem;\n color: #8c9196;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .empty-state h2 {\n margin: 0 0 0.5rem;\n color: #303030;\n font-size: 1.125rem;\n }\n\n .empty-state p {\n margin: 0 0 1.5rem;\n color: #8c9196;\n font-size: 0.8125rem;\n }\n\n .error-state {\n color: #d72c0d;\n }\n\n\n /* Table */\n .pages-table {\n background: #fff;\n border-radius: 12px;\n overflow: hidden;\n box-shadow: 0 1px 0 rgba(0, 0, 0, 0.05);\n border: 1px solid #e3e3e3;\n }\n\n .table-header,\n .table-row {\n display: grid;\n grid-template-columns: 1fr 150px 100px 150px 120px;\n gap: 1rem;\n padding: 0.875rem 1.5rem;\n align-items: center;\n }\n\n .table-header {\n background: #f6f6f7;\n font-size: 0.75rem;\n font-weight: 600;\n text-transform: uppercase;\n color: #8c9196;\n letter-spacing: 0.3px;\n border-bottom: 1px solid #e3e3e3;\n }\n\n .table-row {\n border-top: 1px solid #f6f6f7;\n cursor: pointer;\n transition: background 0.15s;\n }\n\n .table-row:first-of-type {\n border-top: none;\n }\n\n .table-row:hover {\n background: #f6f6f7;\n }\n\n .col-title {\n font-weight: 500;\n color: #303030;\n font-size: 0.8125rem;\n }\n\n .col-slug {\n font-size: 0.75rem;\n color: #8c9196;\n font-family: 'SF Mono', SFMono-Regular, Consolas, 'Liberation Mono', Menlo, monospace;\n }\n\n .status-badge {\n display: inline-block;\n padding: 0.125rem 0.5rem;\n border-radius: 10px;\n font-size: 0.75rem;\n font-weight: 500;\n text-transform: capitalize;\n background: #ffd6a4;\n color: #b98900;\n }\n\n .status-badge.published {\n background: #aee9d1;\n color: #0d542b;\n }\n\n .col-updated {\n font-size: 0.8125rem;\n color: #8c9196;\n }\n\n .col-actions {\n display: flex;\n gap: 0.375rem;\n }\n\n .action-btn {\n padding: 0.375rem;\n border: none;\n border-radius: 8px;\n background: transparent;\n cursor: pointer;\n color: #8c9196;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n transition: all 0.15s;\n }\n\n .action-btn:hover {\n background: #f6f6f7;\n color: #303030;\n }\n\n .action-btn.delete:hover {\n background: #fef2f0;\n color: #d72c0d;\n }\n\n /* Dialog */\n .dialog-overlay {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n }\n\n .dialog {\n background: #fff;\n border-radius: 12px;\n width: 100%;\n max-width: 480px;\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.2);\n }\n\n .dialog-small {\n max-width: 400px;\n }\n\n .dialog-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 1.25rem 1.5rem;\n border-bottom: 1px solid #e3e3e3;\n }\n\n .dialog-header h2 {\n margin: 0;\n font-size: 1.125rem;\n font-weight: 600;\n color: #303030;\n }\n\n .close-btn {\n border: none;\n background: none;\n font-size: 1.25rem;\n cursor: pointer;\n color: #8c9196;\n padding: 0.25rem;\n line-height: 1;\n border-radius: 8px;\n transition: all 0.15s;\n }\n\n .close-btn:hover {\n color: #303030;\n background: #f6f6f7;\n }\n\n .dialog-content {\n padding: 1.5rem;\n }\n\n .dialog-content p {\n margin: 0 0 0.5rem;\n color: #303030;\n font-size: 0.8125rem;\n }\n\n .dialog-content .warning {\n color: #d72c0d;\n font-size: 0.8125rem;\n }\n\n .form-field {\n margin-bottom: 1.25rem;\n }\n\n .form-field label {\n display: block;\n margin-bottom: 0.375rem;\n font-size: 0.8125rem;\n font-weight: 500;\n color: #303030;\n }\n\n .form-field input {\n width: 100%;\n padding: 0.5rem 0.75rem;\n border: 1px solid #c9cccf;\n border-radius: 8px;\n font-size: 0.8125rem;\n font-family: inherit;\n color: #303030;\n box-sizing: border-box;\n transition: border-color 0.15s, box-shadow 0.15s;\n }\n\n .form-field input:focus {\n outline: none;\n border-color: #005bd3;\n box-shadow: 0 0 0 1px #005bd3;\n }\n\n .form-field input::placeholder {\n color: #8c9196;\n }\n\n .slug-field {\n display: flex;\n align-items: center;\n border: 1px solid #c9cccf;\n border-radius: 8px;\n overflow: hidden;\n transition: border-color 0.15s, box-shadow 0.15s;\n }\n\n .slug-field:focus-within {\n border-color: #005bd3;\n box-shadow: 0 0 0 1px #005bd3;\n }\n\n .slug-prefix {\n padding: 0.5rem 0.75rem;\n background: #f6f6f7;\n color: #8c9196;\n font-size: 0.8125rem;\n font-family: 'SF Mono', SFMono-Regular, Consolas, 'Liberation Mono', Menlo, monospace;\n border-right: 1px solid #e3e3e3;\n }\n\n .slug-field input {\n border: none;\n border-radius: 0;\n }\n\n .slug-field input:focus {\n border-color: transparent;\n box-shadow: none;\n }\n\n .form-error {\n margin-bottom: 1rem;\n padding: 0.75rem;\n background: #fef2f0;\n border-radius: 8px;\n color: #d72c0d;\n font-size: 0.8125rem;\n }\n\n .dialog-actions {\n display: flex;\n justify-content: flex-end;\n gap: 0.75rem;\n padding: 1.25rem 1.5rem;\n border-top: 1px solid #e3e3e3;\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PageManagerComponent implements OnInit {\n private readonly facade = inject(VisualEditorFacade);\n private readonly navigation = inject(VisualEditorNavigation);\n\n // State\n readonly pages = signal<PageSummary[]>([]);\n readonly isLoading = signal(false);\n readonly error = signal<string | null>(null);\n\n // Create dialog\n readonly showCreateDialog = signal(false);\n readonly newPageTitle = signal('');\n readonly newPageSlug = signal('');\n readonly isCreating = signal(false);\n readonly createError = signal<string | null>(null);\n\n // Delete dialog\n readonly pageToDelete = signal<PageSummary | null>(null);\n readonly isDeleting = signal(false);\n\n ngOnInit(): void {\n this.loadPages();\n }\n\n loadPages(): void {\n this.isLoading.set(true);\n this.error.set(null);\n\n this.facade.getPages().subscribe({\n next: (pages) => {\n this.pages.set(pages);\n this.isLoading.set(false);\n },\n error: (err) => {\n this.error.set(err.message || 'Failed to load pages');\n this.isLoading.set(false);\n },\n });\n }\n\n openCreateDialog(): void {\n this.showCreateDialog.set(true);\n this.newPageTitle.set('');\n this.newPageSlug.set('');\n this.createError.set(null);\n }\n\n closeCreateDialog(): void {\n this.showCreateDialog.set(false);\n }\n\n onTitleInput(event: Event): void {\n const input = event.target as HTMLInputElement;\n this.newPageTitle.set(input.value);\n\n // Auto-generate slug from title\n const slug = input.value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '');\n this.newPageSlug.set(slug);\n }\n\n onSlugInput(event: Event): void {\n const input = event.target as HTMLInputElement;\n this.newPageSlug.set(input.value);\n }\n\n createPage(event: Event): void {\n event.preventDefault();\n\n const title = this.newPageTitle().trim();\n const slug = this.newPageSlug().trim();\n\n if (!title || !slug) {\n this.createError.set('Title and slug are required');\n return;\n }\n\n this.isCreating.set(true);\n this.createError.set(null);\n\n this.facade.createPage({ title, slug }).subscribe({\n next: (page) => {\n this.isCreating.set(false);\n this.closeCreateDialog();\n this.navigation.navigate({ type: 'page-edit', pageId: page.id });\n },\n error: (err) => {\n this.createError.set(err.message || 'Failed to create page');\n this.isCreating.set(false);\n },\n });\n }\n\n editPage(pageId: string): void {\n this.navigation.navigate({ type: 'page-edit', pageId });\n }\n\n duplicatePage(pageId: string, event: Event): void {\n event.stopPropagation();\n\n this.facade.duplicatePage(pageId).subscribe({\n next: () => {\n this.loadPages();\n },\n error: (err) => {\n console.error('Failed to duplicate page:', err);\n },\n });\n }\n\n confirmDelete(page: PageSummary, event: Event): void {\n event.stopPropagation();\n this.pageToDelete.set(page);\n }\n\n cancelDelete(): void {\n this.pageToDelete.set(null);\n }\n\n deletePage(): void {\n const page = this.pageToDelete();\n if (!page) return;\n\n this.isDeleting.set(true);\n\n this.facade.deletePage(page.id).subscribe({\n next: () => {\n this.isDeleting.set(false);\n this.pageToDelete.set(null);\n this.loadPages();\n },\n error: (err) => {\n console.error('Failed to delete page:', err);\n this.isDeleting.set(false);\n },\n });\n }\n\n formatDate(dateString: string): string {\n const date = new Date(dateString);\n return date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n });\n }\n}\n","import { Component, inject, input, output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ShopAuthService } from '../../services/shop-auth.service';\n\n@Component({\n selector: 'lib-license-guard',\n standalone: true,\n imports: [CommonModule],\n template: `\n @if (shopAuthService.loading()) {\n <div class=\"license-loading\">\n <div class=\"spinner\"></div>\n <span>Verificando acceso...</span>\n </div>\n } @else if (!shopAuthService.hasAccess()) {\n <div class=\"license-paywall\">\n <div class=\"paywall-content\">\n <h2>Acceso restringido</h2>\n\n @switch (shopAuthService.error()?.code) {\n @case ('LICENSE_EXPIRED') {\n <p>Tu licencia ha expirado.</p>\n <button class=\"btn-primary\" (click)=\"onRenew()\">Renovar licencia</button>\n }\n @case ('NO_ACCESS') {\n <p>No tienes una licencia activa.</p>\n <button class=\"btn-primary\" (click)=\"onSubscribe()\">Obtener licencia</button>\n }\n @case ('SHOP_NOT_FOUND') {\n <p>Tienda no encontrada.</p>\n <button class=\"btn-secondary\" (click)=\"onRetry()\">Reintentar</button>\n }\n @case ('USER_INACTIVE') {\n <p>No tienes permisos para acceder.</p>\n }\n @case ('NOT_AUTHENTICATED') {\n <p>Sesion no valida.</p>\n <button class=\"btn-primary\" (click)=\"onReauth()\">Iniciar sesion</button>\n }\n @case ('UNKNOWN_ERROR') {\n <p>Error de conexion.</p>\n <button class=\"btn-secondary\" (click)=\"onRetry()\">Reintentar</button>\n }\n @default {\n <p>No tienes acceso a esta funcionalidad.</p>\n <button class=\"btn-primary\" (click)=\"onSubscribe()\">Ver planes</button>\n }\n }\n </div>\n </div>\n } @else {\n <ng-content></ng-content>\n\n @if (shopAuthService.isLicenseExpiringSoon() && showExpirationWarning()) {\n <div class=\"expiration-warning\">\n <span class=\"warning-icon\">!</span>\n <span>Tu licencia expira en {{ shopAuthService.daysRemaining() }} dias.</span>\n <button class=\"btn-small\" (click)=\"onRenew()\">Renovar</button>\n </div>\n }\n }\n `,\n styles: [`\n .license-loading {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px;\n gap: 16px;\n }\n\n .spinner {\n width: 32px;\n height: 32px;\n border: 3px solid #e5e7eb;\n border-top-color: #3b82f6;\n border-radius: 50%;\n animation: spin 0.8s linear infinite;\n }\n\n @keyframes spin {\n to { transform: rotate(360deg); }\n }\n\n .license-paywall {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 300px;\n padding: 24px;\n background: #f9fafb;\n border-radius: 8px;\n }\n\n .paywall-content {\n text-align: center;\n max-width: 400px;\n }\n\n .paywall-content h2 {\n margin: 0 0 12px;\n font-size: 24px;\n font-weight: 600;\n color: #111827;\n }\n\n .paywall-content p {\n margin: 0 0 24px;\n color: #6b7280;\n }\n\n .btn-primary {\n padding: 12px 24px;\n background: #3b82f6;\n color: white;\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-primary:hover {\n background: #2563eb;\n }\n\n .btn-secondary {\n padding: 12px 24px;\n background: #6b7280;\n color: white;\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-secondary:hover {\n background: #4b5563;\n }\n\n .btn-small {\n padding: 6px 12px;\n background: transparent;\n color: inherit;\n border: 1px solid currentColor;\n border-radius: 4px;\n font-size: 12px;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-small:hover {\n background: rgba(0, 0, 0, 0.05);\n }\n\n .expiration-warning {\n position: fixed;\n bottom: 0;\n left: 0;\n right: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12px;\n padding: 12px 24px;\n background: #fef3c7;\n color: #92400e;\n font-size: 14px;\n z-index: 1000;\n }\n\n .warning-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n background: #f59e0b;\n color: white;\n border-radius: 50%;\n font-size: 12px;\n font-weight: bold;\n }\n `]\n})\nexport class LicenseGuardComponent {\n shopAuthService = inject(ShopAuthService);\n\n showExpirationWarning = input(true);\n\n subscribe = output<void>();\n renew = output<void>();\n reauth = output<void>();\n retry = output<void>();\n\n onSubscribe() {\n this.subscribe.emit();\n }\n\n onRenew() {\n this.renew.emit();\n }\n\n onReauth() {\n this.reauth.emit();\n }\n\n onRetry() {\n this.retry.emit();\n }\n}\n","import { Component, inject, signal, output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport { SupabaseAuthService } from '../../services/supabase-auth.service';\n\n@Component({\n selector: 'lib-login',\n standalone: true,\n imports: [CommonModule, FormsModule],\n template: `\n <div class=\"login-page\">\n <div class=\"login-bg\">\n <div class=\"login-gradient\"></div>\n <div class=\"login-pattern\"></div>\n <div class=\"login-glow login-glow--1\"></div>\n <div class=\"login-glow login-glow--2\"></div>\n </div>\n\n <div class=\"login-container\">\n <div class=\"login-card\">\n <header class=\"login-header\">\n <div class=\"login-logo-wrap\">\n <img src=\"/img/kustomizerlogo.png\" alt=\"Kustomizer\" class=\"login-logo\" />\n </div>\n <h1 class=\"login-title\">{{ isSignUp() ? 'Create account' : 'Sign in' }}</h1>\n <p class=\"login-subtitle\">{{ isSignUp() ? 'Create your account to get started' : 'Sign in to your Kustomizer account' }}</p>\n </header>\n\n @if (error()) {\n <div class=\"login-alert\">\n <svg viewBox=\"0 0 20 20\" fill=\"currentColor\" class=\"login-alert-icon\">\n <path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.28 7.22a.75.75 0 00-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 101.06 1.06L10 11.06l1.72 1.72a.75.75 0 101.06-1.06L11.06 10l1.72-1.72a.75.75 0 00-1.06-1.06L10 8.94 8.28 7.22z\" clip-rule=\"evenodd\" />\n </svg>\n <span>{{ error() }}</span>\n </div>\n }\n\n <form (ngSubmit)=\"onSubmit()\" class=\"login-form\">\n <div class=\"login-field\">\n <label for=\"email\" class=\"login-label\">Email</label>\n <input\n id=\"email\"\n type=\"email\"\n [(ngModel)]=\"email\"\n name=\"email\"\n placeholder=\"\"\n class=\"login-input\"\n required\n [disabled]=\"loading()\"\n />\n </div>\n\n <div class=\"login-field\">\n <label for=\"password\" class=\"login-label\">Password</label>\n <div class=\"login-input-wrap\">\n <input\n id=\"password\"\n [type]=\"showPassword() ? 'text' : 'password'\"\n [(ngModel)]=\"password\"\n name=\"password\"\n placeholder=\"••••••••\"\n class=\"login-input\"\n required\n [disabled]=\"loading()\"\n />\n <button type=\"button\" class=\"login-password-toggle\" (click)=\"togglePassword()\" tabindex=\"-1\">\n @if (showPassword()) {\n <svg viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fill-rule=\"evenodd\" d=\"M3.28 2.22a.75.75 0 00-1.06 1.06l14.5 14.5a.75.75 0 101.06-1.06l-1.745-1.745a10.029 10.029 0 003.3-4.38 1.651 1.651 0 000-1.185A10.004 10.004 0 009.999 3a9.956 9.956 0 00-4.744 1.194L3.28 2.22zM7.752 6.69l1.092 1.092a2.5 2.5 0 013.374 3.373l1.091 1.092a4 4 0 00-5.557-5.557z\" clip-rule=\"evenodd\" />\n <path d=\"M10.748 13.93l2.523 2.523a9.987 9.987 0 01-3.27.547c-4.258 0-7.894-2.66-9.337-6.41a1.651 1.651 0 010-1.186A10.007 10.007 0 012.839 6.02L6.07 9.252a4 4 0 004.678 4.678z\" />\n </svg>\n } @else {\n <svg viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path d=\"M10 12.5a2.5 2.5 0 100-5 2.5 2.5 0 000 5z\" />\n <path fill-rule=\"evenodd\" d=\"M.664 10.59a1.651 1.651 0 010-1.186A10.004 10.004 0 0110 3c4.257 0 7.893 2.66 9.336 6.41.147.381.146.804 0 1.186A10.004 10.004 0 0110 17c-4.257 0-7.893-2.66-9.336-6.41zM14 10a4 4 0 11-8 0 4 4 0 018 0z\" clip-rule=\"evenodd\" />\n </svg>\n }\n </button>\n </div>\n </div>\n\n <button type=\"submit\" class=\"login-submit\" [disabled]=\"loading()\">\n @if (loading()) {\n <span class=\"login-spinner\"></span>\n {{ isSignUp() ? 'Creating...' : 'Signing in...' }}\n } @else {\n {{ isSignUp() ? 'Create account' : 'Sign in' }}\n }\n </button>\n </form>\n\n <div class=\"login-divider\"><span>or</span></div>\n\n <button type=\"button\" class=\"login-switch\" (click)=\"toggleMode()\">\n {{ isSignUp() ? 'Already have an account? Sign in' : \"Don't have an account? Sign up\" }}\n </button>\n </div>\n\n <footer class=\"login-footer\">\n <span class=\"login-footer-text\">Kustomizer</span>\n <span class=\"login-footer-dot\">·</span>\n <a href=\"https://kustomizer.net\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"login-footer-link\">kustomizer.net</a>\n </footer>\n </div>\n </div>\n `,\n styles: [`\n :host {\n display: block;\n }\n\n .login-page {\n --k-primary: #bdf366;\n --k-primary-hover: #a8e050;\n --k-primary-text: #1a1f0e;\n --k-bg: #0c0f08;\n --k-card: #ffffff;\n --k-border: #e5e7eb;\n --k-border-focus: #bdf366;\n --k-text: #1f2937;\n --k-text-secondary: #6b7280;\n --k-text-muted: #9ca3af;\n --k-error: #dc2626;\n --k-error-bg: #fef2f2;\n --k-error-border: #fecaca;\n\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', sans-serif;\n min-height: 100vh;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--k-bg);\n color: var(--k-text);\n padding: 20px;\n position: relative;\n overflow: hidden;\n }\n\n .login-bg {\n position: fixed;\n inset: 0;\n pointer-events: none;\n z-index: 0;\n }\n\n .login-gradient {\n position: absolute;\n inset: 0;\n background:\n radial-gradient(ellipse 80% 50% at 50% -20%, rgba(189, 243, 102, 0.15), transparent),\n radial-gradient(ellipse 60% 40% at 100% 100%, rgba(189, 243, 102, 0.08), transparent),\n linear-gradient(180deg, #0c0f08 0%, #111a0a 100%);\n }\n\n .login-pattern {\n position: absolute;\n inset: 0;\n background-image:\n radial-gradient(rgba(189, 243, 102, 0.07) 1px, transparent 1px);\n background-size: 32px 32px;\n mask-image: radial-gradient(ellipse 100% 80% at 50% 20%, black, transparent);\n -webkit-mask-image: radial-gradient(ellipse 100% 80% at 50% 20%, black, transparent);\n }\n\n .login-glow {\n position: absolute;\n border-radius: 50%;\n filter: blur(80px);\n opacity: 0.6;\n }\n\n .login-glow--1 {\n width: 400px;\n height: 400px;\n background: rgba(189, 243, 102, 0.12);\n top: -150px;\n left: 50%;\n transform: translateX(-50%);\n animation: glowPulse 8s ease-in-out infinite;\n }\n\n .login-glow--2 {\n width: 300px;\n height: 300px;\n background: rgba(189, 243, 102, 0.06);\n bottom: -100px;\n right: -50px;\n animation: glowPulse2 10s ease-in-out infinite;\n }\n\n @keyframes glowPulse {\n 0%, 100% { opacity: 0.4; transform: translateX(-50%) scale(1); }\n 50% { opacity: 0.7; transform: translateX(-50%) scale(1.1); }\n }\n\n @keyframes glowPulse2 {\n 0%, 100% { opacity: 0.3; transform: scale(1); }\n 50% { opacity: 0.5; transform: scale(1.15); }\n }\n\n .login-container {\n position: relative;\n z-index: 1;\n width: 100%;\n max-width: 400px;\n animation: fadeIn 0.5s ease;\n }\n\n @keyframes fadeIn {\n from { opacity: 0; transform: translateY(20px); }\n to { opacity: 1; transform: translateY(0); }\n }\n\n .login-card {\n background: var(--k-card);\n border-radius: 20px;\n padding: 40px 32px;\n box-shadow:\n 0 0 0 1px rgba(255, 255, 255, 0.1),\n 0 25px 50px -12px rgba(0, 0, 0, 0.5),\n 0 0 100px -20px rgba(189, 243, 102, 0.2);\n }\n\n .login-header {\n text-align: center;\n margin-bottom: 32px;\n }\n\n .login-logo-wrap {\n margin-bottom: 20px;\n }\n\n .login-logo {\n width: 56px;\n height: 56px;\n border-radius: 12px;\n }\n\n .login-title {\n font-size: 24px;\n font-weight: 600;\n color: var(--k-text);\n margin: 0 0 8px 0;\n letter-spacing: -0.3px;\n }\n\n .login-subtitle {\n font-size: 14px;\n color: var(--k-text-secondary);\n margin: 0;\n font-weight: 400;\n }\n\n .login-alert {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n padding: 12px 14px;\n border-radius: 10px;\n font-size: 14px;\n margin-bottom: 20px;\n background: var(--k-error-bg);\n border: 1px solid var(--k-error-border);\n color: var(--k-error);\n }\n\n .login-alert-icon {\n width: 18px;\n height: 18px;\n flex-shrink: 0;\n margin-top: 1px;\n }\n\n .login-form {\n display: flex;\n flex-direction: column;\n gap: 20px;\n }\n\n .login-field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .login-label {\n font-size: 14px;\n font-weight: 500;\n color: var(--k-text);\n }\n\n .login-input-wrap {\n position: relative;\n display: flex;\n align-items: center;\n }\n\n .login-input {\n width: 100%;\n background: var(--k-card);\n border: 1px solid var(--k-border);\n border-radius: 10px;\n padding: 12px 14px;\n font-size: 15px;\n font-family: inherit;\n color: var(--k-text);\n outline: none;\n transition: border-color 0.2s ease, box-shadow 0.2s ease;\n box-sizing: border-box;\n }\n\n .login-input-wrap .login-input {\n padding-right: 44px;\n }\n\n .login-input::placeholder {\n color: var(--k-text-muted);\n }\n\n .login-input:hover {\n border-color: #d1d5db;\n }\n\n .login-input:focus {\n border-color: var(--k-border-focus);\n box-shadow: 0 0 0 3px rgba(189, 243, 102, 0.15);\n }\n\n .login-input:disabled {\n background: #f3f4f6;\n cursor: not-allowed;\n opacity: 0.7;\n }\n\n .login-password-toggle {\n position: absolute;\n right: 10px;\n background: none;\n border: none;\n padding: 6px;\n cursor: pointer;\n color: var(--k-text-muted);\n transition: color 0.2s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 6px;\n }\n\n .login-password-toggle:hover {\n color: var(--k-primary-text);\n background: rgba(189, 243, 102, 0.15);\n }\n\n .login-password-toggle svg {\n width: 18px;\n height: 18px;\n }\n\n .login-submit {\n width: 100%;\n background: var(--k-primary);\n color: var(--k-primary-text);\n border: none;\n border-radius: 10px;\n padding: 14px 20px;\n font-size: 15px;\n font-weight: 600;\n font-family: inherit;\n cursor: pointer;\n transition: background 0.2s ease, transform 0.1s ease;\n margin-top: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n\n .login-submit:hover:not(:disabled) {\n background: var(--k-primary-hover);\n }\n\n .login-submit:active:not(:disabled) {\n transform: scale(0.98);\n }\n\n .login-submit:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .login-spinner {\n width: 16px;\n height: 16px;\n border: 2px solid transparent;\n border-top-color: var(--k-primary-text);\n border-radius: 50%;\n animation: spin 0.7s linear infinite;\n }\n\n @keyframes spin {\n to { transform: rotate(360deg); }\n }\n\n .login-divider {\n display: flex;\n align-items: center;\n gap: 14px;\n margin: 24px 0;\n }\n\n .login-divider::before,\n .login-divider::after {\n content: '';\n flex: 1;\n height: 1px;\n background: var(--k-border);\n }\n\n .login-divider span {\n font-size: 13px;\n color: var(--k-text-muted);\n text-transform: lowercase;\n }\n\n .login-switch {\n width: 100%;\n background: transparent;\n border: 1px solid var(--k-border);\n border-radius: 10px;\n padding: 12px 16px;\n font-size: 14px;\n font-weight: 500;\n font-family: inherit;\n color: var(--k-text-secondary);\n cursor: pointer;\n transition: all 0.2s ease;\n }\n\n .login-switch:hover {\n background: rgba(189, 243, 102, 0.08);\n border-color: rgba(189, 243, 102, 0.3);\n color: var(--k-primary-text);\n }\n\n .login-footer {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n margin-top: 24px;\n }\n\n .login-footer-text {\n font-size: 13px;\n color: rgba(255, 255, 255, 0.4);\n font-weight: 500;\n }\n\n .login-footer-link {\n font-size: 13px;\n color: rgba(255, 255, 255, 0.5);\n text-decoration: none;\n transition: color 0.2s ease;\n }\n\n .login-footer-link:hover {\n color: var(--k-primary);\n }\n\n .login-footer-dot {\n color: rgba(255, 255, 255, 0.3);\n font-size: 12px;\n }\n\n @media (max-width: 440px) {\n .login-page {\n padding: 16px;\n }\n\n .login-card {\n padding: 32px 24px;\n }\n\n .login-title {\n font-size: 22px;\n }\n }\n `]\n})\nexport class LoginComponent {\n private authService = inject(SupabaseAuthService);\n private router = inject(Router);\n\n loginSuccess = output<void>();\n\n email = signal('');\n password = signal('');\n error = signal<string | null>(null);\n loading = signal(false);\n isSignUp = signal(false);\n showPassword = signal(false);\n\n toggleMode() {\n this.isSignUp.update(v => !v);\n this.error.set(null);\n }\n\n togglePassword() {\n this.showPassword.update(v => !v);\n }\n\n async onSubmit() {\n if (!this.email() || !this.password()) {\n this.error.set('Please fill in all fields');\n return;\n }\n\n this.loading.set(true);\n this.error.set(null);\n\n try {\n let result;\n\n if (this.isSignUp()) {\n result = await this.authService.signUp(this.email(), this.password());\n if (result.success) {\n this.loginSuccess.emit();\n return;\n }\n } else {\n result = await this.authService.signInWithPassword(this.email(), this.password());\n if (result.success) {\n this.loginSuccess.emit();\n return;\n }\n }\n\n this.error.set(result.error ?? 'Authentication error');\n } finally {\n this.loading.set(false);\n }\n }\n}\n","import { Component, inject, computed, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ShopAuthService } from '../../services/shop-auth.service';\n\ntype ViewState = 'loading' | 'no-store' | 'license-expired';\n\n@Component({\n selector: 'lib-activate-license',\n standalone: true,\n imports: [CommonModule],\n template: `\n <div class=\"activate-page\">\n <div class=\"activate-bg\">\n <div class=\"activate-glow\"></div>\n <div class=\"activate-grid\"></div>\n </div>\n\n <div class=\"activate-card\">\n @switch (viewState()) {\n @case ('loading') {\n <div class=\"activate-loading\">\n <span class=\"pulse-dot\"></span>\n <p>Verificando cuenta...</p>\n </div>\n }\n\n @case ('no-store') {\n <div class=\"activate-content\">\n <p class=\"store-name\">Tienda no encontrada</p>\n <p class=\"license-status\">Licencia expirada</p>\n <a class=\"renew-button\" href=\"https://kustomizer.net\" target=\"_blank\" rel=\"noopener noreferrer\">\n Renovar en kustomizer.net\n </a>\n </div>\n }\n\n @case ('license-expired') {\n <div class=\"activate-content\">\n <p class=\"store-name\">{{ shopAuthService.shopName() }}</p>\n <p class=\"license-status\">Licencia expirada</p>\n <a class=\"renew-button\" href=\"https://kustomizer.net\" target=\"_blank\" rel=\"noopener noreferrer\">\n Renovar en kustomizer.net\n </a>\n </div>\n }\n }\n </div>\n </div>\n `,\n styles: [`\n @import url('https://fonts.googleapis.com/css2?family=Newsreader:wght@400;500;600&family=Spline+Sans:wght@400;500;600&display=swap');\n\n :host {\n display: block;\n }\n\n .activate-page {\n --k-accent: #bdf366;\n --k-accent-strong: #a8e050;\n --k-ink: #11140c;\n --k-ink-muted: rgba(17, 20, 12, 0.6);\n --k-ink-faint: rgba(17, 20, 12, 0.45);\n --k-ink-ghost: rgba(17, 20, 12, 0.3);\n --k-surface: #f7f8f1;\n --k-surface-strong: #ffffff;\n --k-outline: rgba(17, 20, 12, 0.12);\n --k-shadow: 0 40px 100px -60px rgba(12, 15, 8, 0.6);\n\n min-height: 100vh;\n display: flex;\n align-items: center;\n justify-content: center;\n background: #0c0f08;\n padding: 24px;\n position: relative;\n overflow: hidden;\n font-family: 'Spline Sans', 'Segoe UI', sans-serif;\n color: var(--k-ink);\n }\n\n .activate-bg {\n position: absolute;\n inset: 0;\n pointer-events: none;\n }\n\n .activate-glow {\n position: absolute;\n width: 520px;\n height: 520px;\n left: 50%;\n top: -200px;\n transform: translateX(-50%);\n background: radial-gradient(circle, rgba(189, 243, 102, 0.22), transparent 70%);\n filter: blur(10px);\n opacity: 0.8;\n }\n\n .activate-grid {\n position: absolute;\n inset: 0;\n background-image: linear-gradient(rgba(189, 243, 102, 0.08) 1px, transparent 1px),\n linear-gradient(90deg, rgba(189, 243, 102, 0.08) 1px, transparent 1px);\n background-size: 40px 40px;\n mask-image: radial-gradient(circle at 50% 10%, black, transparent 70%);\n -webkit-mask-image: radial-gradient(circle at 50% 10%, black, transparent 70%);\n opacity: 0.4;\n }\n\n .activate-card {\n position: relative;\n z-index: 1;\n width: min(480px, 92vw);\n background: var(--k-surface-strong);\n border-radius: 24px;\n padding: 48px 40px;\n box-shadow: var(--k-shadow);\n border: 1px solid rgba(255, 255, 255, 0.2);\n animation: rise 0.5s ease both;\n }\n\n @keyframes rise {\n from { opacity: 0; transform: translateY(18px); }\n to { opacity: 1; transform: translateY(0); }\n }\n\n .activate-loading {\n text-align: center;\n color: rgba(255, 255, 255, 0.7);\n font-size: 0.9rem;\n }\n\n .activate-loading p {\n margin: 12px 0 0;\n }\n\n .pulse-dot {\n width: 10px;\n height: 10px;\n border-radius: 999px;\n background: var(--k-accent);\n display: inline-block;\n animation: pulse 1.4s ease-in-out infinite;\n }\n\n @keyframes pulse {\n 0%, 100% { transform: scale(1); opacity: 0.6; }\n 50% { transform: scale(1.5); opacity: 1; }\n }\n\n .activate-content {\n display: flex;\n flex-direction: column;\n gap: 16px;\n align-items: center;\n text-align: center;\n }\n\n .store-name {\n margin: 0;\n font-family: 'Newsreader', 'Times New Roman', serif;\n font-size: 1.6rem;\n letter-spacing: -0.4px;\n color: var(--k-ink);\n }\n\n .license-status {\n margin: 0;\n font-size: 0.95rem;\n text-transform: uppercase;\n letter-spacing: 0.2em;\n color: var(--k-ink-ghost);\n }\n\n .renew-button {\n margin-top: 16px;\n padding: 12px 22px;\n border-radius: 999px;\n border: 1px solid var(--k-outline);\n color: var(--k-ink);\n text-decoration: none;\n font-size: 0.9rem;\n font-weight: 600;\n letter-spacing: 0.02em;\n background: var(--k-surface);\n transition: all 0.2s ease;\n }\n\n .renew-button:hover {\n border-color: rgba(17, 20, 12, 0.28);\n background: #ffffff;\n transform: translateY(-1px);\n }\n\n @media (max-width: 480px) {\n .activate-card {\n padding: 36px 26px;\n }\n\n .store-name {\n font-size: 1.4rem;\n }\n }\n `]\n})\nexport class ActivateLicenseComponent implements OnInit {\n shopAuthService = inject(ShopAuthService);\n\n viewState = computed<ViewState>(() => {\n if (this.shopAuthService.loading()) {\n return 'loading';\n }\n\n if (!this.shopAuthService.shop()) {\n return 'no-store';\n }\n\n return 'license-expired';\n });\n\n ngOnInit() {\n this.shopAuthService.authenticate();\n }\n}\n","import { Component, inject, output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { SupabaseAuthService } from '../../services/supabase-auth.service';\nimport { ShopAuthService } from '../../services/shop-auth.service';\n\n@Component({\n selector: 'lib-app-shell',\n standalone: true,\n imports: [CommonModule],\n template: `\n <div class=\"app-shell\">\n <header class=\"app-header\">\n <div class=\"header-left\">\n <span class=\"logo\">Kustomizer</span>\n @if (shopAuthService.shopName()) {\n <span class=\"store-name\">{{ shopAuthService.shopName() }}</span>\n }\n </div>\n <div class=\"header-right\">\n @if (shopAuthService.licenseTier()) {\n <span class=\"license-badge\" [class.expiring]=\"shopAuthService.daysRemaining() !== null && shopAuthService.daysRemaining()! <= 7\">\n {{ shopAuthService.licenseTier() | uppercase }}\n @if (shopAuthService.daysRemaining() !== null && shopAuthService.daysRemaining()! <= 7) {\n <span class=\"days-left\">({{ shopAuthService.daysRemaining() }}d)</span>\n }\n </span>\n }\n <div class=\"user-menu\">\n <span class=\"user-email\">{{ authService.userEmail() }}</span>\n <button class=\"btn-logout\" (click)=\"logout()\">Salir</button>\n </div>\n </div>\n </header>\n <main class=\"app-content\">\n <ng-content></ng-content>\n </main>\n </div>\n `,\n styles: [`\n .app-shell {\n min-height: 100vh;\n display: flex;\n flex-direction: column;\n background: #f6f6f7;\n font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n }\n\n .app-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 0 1rem;\n height: 56px;\n background: #1a1a1a;\n color: #e3e3e3;\n box-shadow: 0 1px 0 rgba(0, 0, 0, 0.08);\n }\n\n .header-left {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n }\n\n .logo {\n font-size: 0.9375rem;\n font-weight: 600;\n letter-spacing: -0.3px;\n color: #fff;\n }\n\n .store-name {\n font-size: 0.8125rem;\n color: #8c9196;\n padding-left: 0.75rem;\n border-left: 1px solid rgba(255, 255, 255, 0.15);\n }\n\n .header-right {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n }\n\n .license-badge {\n padding: 0.1875rem 0.5rem;\n background: rgba(255, 255, 255, 0.12);\n border-radius: 10px;\n font-size: 0.6875rem;\n font-weight: 500;\n letter-spacing: 0.3px;\n color: #b5b5b5;\n }\n\n .license-badge.expiring {\n background: #ffd6a4;\n color: #b98900;\n }\n\n .days-left {\n font-weight: 400;\n opacity: 0.8;\n }\n\n .user-menu {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n }\n\n .user-email {\n font-size: 0.8125rem;\n color: #8c9196;\n }\n\n .btn-logout {\n padding: 0.375rem 0.75rem;\n background: transparent;\n border: 1px solid rgba(255, 255, 255, 0.15);\n border-radius: 8px;\n color: #e3e3e3;\n font-size: 0.8125rem;\n font-family: inherit;\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .btn-logout:hover {\n background: rgba(255, 255, 255, 0.1);\n border-color: rgba(255, 255, 255, 0.25);\n }\n\n .app-content {\n flex: 1;\n }\n `]\n})\nexport class AppShellComponent {\n authService = inject(SupabaseAuthService);\n shopAuthService = inject(ShopAuthService);\n\n loggedOut = output();\n\n async logout() {\n await this.authService.signOut();\n this.shopAuthService.clear();\n this.loggedOut.emit();\n }\n}\n","import { Component, output } from '@angular/core';\n\n@Component({\n selector: 'ke-no-access',\n standalone: true,\n template: `\n <div class=\"noaccess-page\">\n <div class=\"noaccess-bg\">\n <div class=\"noaccess-gradient\"></div>\n <div class=\"noaccess-pattern\"></div>\n <div class=\"noaccess-glow noaccess-glow--1\"></div>\n <div class=\"noaccess-glow noaccess-glow--2\"></div>\n </div>\n\n <div class=\"noaccess-container\">\n <div class=\"noaccess-card\">\n <header class=\"noaccess-header\">\n <div class=\"noaccess-logo-wrap\">\n <img src=\"/img/kustomizerlogo.png\" alt=\"Kustomizer\" class=\"noaccess-logo\" />\n </div>\n\n <div class=\"noaccess-icon-wrap\">\n <div class=\"noaccess-icon-ring\"></div>\n <svg class=\"noaccess-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\" />\n <path d=\"M7 11V7a5 5 0 0 1 10 0v4\" />\n </svg>\n </div>\n\n <h1 class=\"noaccess-title\">No access</h1>\n <p class=\"noaccess-subtitle\">You don't have permissions to access this store. Contact the store owner to request an invitation.</p>\n </header>\n\n <div class=\"noaccess-info\">\n <div class=\"noaccess-info-row\">\n <svg viewBox=\"0 0 20 20\" fill=\"currentColor\" class=\"noaccess-info-icon\">\n <path fill-rule=\"evenodd\" d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a.75.75 0 000 1.5h.253a.25.25 0 01.244.304l-.459 2.066A1.75 1.75 0 0010.747 15H11a.75.75 0 000-1.5h-.253a.25.25 0 01-.244-.304l.459-2.066A1.75 1.75 0 009.253 9H9z\" clip-rule=\"evenodd\" />\n </svg>\n <span>If you believe this is an error, try signing in with a different account.</span>\n </div>\n </div>\n\n <button type=\"button\" class=\"noaccess-btn\" (click)=\"backToLogin.emit()\">\n <svg viewBox=\"0 0 20 20\" fill=\"currentColor\" class=\"noaccess-btn-icon\">\n <path fill-rule=\"evenodd\" d=\"M17 10a.75.75 0 01-.75.75H5.612l4.158 3.96a.75.75 0 11-1.04 1.08l-5.5-5.25a.75.75 0 010-1.08l5.5-5.25a.75.75 0 111.04 1.08L5.612 9.25H16.25A.75.75 0 0117 10z\" clip-rule=\"evenodd\" />\n </svg>\n Back to sign in\n </button>\n </div>\n\n <footer class=\"noaccess-footer\">\n <span class=\"noaccess-footer-text\">Kustomizer</span>\n <span class=\"noaccess-footer-dot\">&middot;</span>\n <a href=\"https://kustomizer.net\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"noaccess-footer-link\">kustomizer.net</a>\n </footer>\n </div>\n </div>\n `,\n styles: [`\n :host {\n display: block;\n }\n\n .noaccess-page {\n --k-primary: #bdf366;\n --k-primary-hover: #a8e050;\n --k-primary-text: #1a1f0e;\n --k-bg: #0c0f08;\n --k-card: #ffffff;\n --k-border: #e5e7eb;\n --k-text: #1f2937;\n --k-text-secondary: #6b7280;\n --k-text-muted: #9ca3af;\n --k-red: #dc2626;\n --k-red-light: #fef2f2;\n --k-red-border: #fecaca;\n\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', sans-serif;\n min-height: 100vh;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--k-bg);\n color: var(--k-text);\n padding: 20px;\n position: relative;\n overflow: hidden;\n }\n\n .noaccess-bg {\n position: fixed;\n inset: 0;\n pointer-events: none;\n z-index: 0;\n }\n\n .noaccess-gradient {\n position: absolute;\n inset: 0;\n background:\n radial-gradient(ellipse 80% 50% at 50% -20%, rgba(220, 38, 38, 0.1), transparent),\n radial-gradient(ellipse 60% 40% at 100% 100%, rgba(189, 243, 102, 0.06), transparent),\n linear-gradient(180deg, #0c0f08 0%, #111a0a 100%);\n }\n\n .noaccess-pattern {\n position: absolute;\n inset: 0;\n background-image:\n radial-gradient(rgba(189, 243, 102, 0.07) 1px, transparent 1px);\n background-size: 32px 32px;\n mask-image: radial-gradient(ellipse 100% 80% at 50% 20%, black, transparent);\n -webkit-mask-image: radial-gradient(ellipse 100% 80% at 50% 20%, black, transparent);\n }\n\n .noaccess-glow {\n position: absolute;\n border-radius: 50%;\n filter: blur(80px);\n opacity: 0.6;\n }\n\n .noaccess-glow--1 {\n width: 400px;\n height: 400px;\n background: rgba(220, 38, 38, 0.08);\n top: -150px;\n left: 50%;\n transform: translateX(-50%);\n animation: glowPulse 8s ease-in-out infinite;\n }\n\n .noaccess-glow--2 {\n width: 300px;\n height: 300px;\n background: rgba(189, 243, 102, 0.06);\n bottom: -100px;\n right: -50px;\n animation: glowPulse2 10s ease-in-out infinite;\n }\n\n @keyframes glowPulse {\n 0%, 100% { opacity: 0.4; transform: translateX(-50%) scale(1); }\n 50% { opacity: 0.7; transform: translateX(-50%) scale(1.1); }\n }\n\n @keyframes glowPulse2 {\n 0%, 100% { opacity: 0.3; transform: scale(1); }\n 50% { opacity: 0.5; transform: scale(1.15); }\n }\n\n .noaccess-container {\n position: relative;\n z-index: 1;\n width: 100%;\n max-width: 400px;\n animation: fadeIn 0.5s ease;\n }\n\n @keyframes fadeIn {\n from { opacity: 0; transform: translateY(20px); }\n to { opacity: 1; transform: translateY(0); }\n }\n\n .noaccess-card {\n background: var(--k-card);\n border-radius: 20px;\n padding: 40px 32px;\n box-shadow:\n 0 0 0 1px rgba(255, 255, 255, 0.1),\n 0 25px 50px -12px rgba(0, 0, 0, 0.5),\n 0 0 100px -20px rgba(220, 38, 38, 0.12);\n }\n\n .noaccess-header {\n text-align: center;\n margin-bottom: 24px;\n }\n\n .noaccess-logo-wrap {\n margin-bottom: 24px;\n }\n\n .noaccess-logo {\n width: 56px;\n height: 56px;\n border-radius: 12px;\n }\n\n .noaccess-icon-wrap {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 56px;\n height: 56px;\n margin-bottom: 20px;\n }\n\n .noaccess-icon-ring {\n position: absolute;\n inset: 0;\n border-radius: 50%;\n background: var(--k-red-light);\n border: 1px solid var(--k-red-border);\n }\n\n .noaccess-icon {\n position: relative;\n width: 28px;\n height: 28px;\n color: var(--k-red);\n }\n\n .noaccess-title {\n font-size: 24px;\n font-weight: 600;\n color: var(--k-text);\n margin: 0 0 8px 0;\n letter-spacing: -0.3px;\n }\n\n .noaccess-subtitle {\n font-size: 14px;\n color: var(--k-text-secondary);\n margin: 0;\n font-weight: 400;\n line-height: 1.5;\n }\n\n .noaccess-info {\n background: var(--k-red-light);\n border: 1px solid var(--k-red-border);\n border-radius: 10px;\n padding: 12px 14px;\n margin-bottom: 24px;\n }\n\n .noaccess-info-row {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n font-size: 13px;\n color: #991b1b;\n line-height: 1.4;\n }\n\n .noaccess-info-icon {\n width: 16px;\n height: 16px;\n flex-shrink: 0;\n margin-top: 1px;\n color: var(--k-red);\n }\n\n .noaccess-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n width: 100%;\n background: var(--k-primary);\n color: var(--k-primary-text);\n border: none;\n border-radius: 10px;\n padding: 14px 20px;\n font-size: 15px;\n font-weight: 600;\n font-family: inherit;\n cursor: pointer;\n transition: background 0.2s ease, transform 0.1s ease;\n text-decoration: none;\n box-sizing: border-box;\n }\n\n .noaccess-btn:hover {\n background: var(--k-primary-hover);\n }\n\n .noaccess-btn:active {\n transform: scale(0.98);\n }\n\n .noaccess-btn-icon {\n width: 16px;\n height: 16px;\n }\n\n .noaccess-footer {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n margin-top: 24px;\n }\n\n .noaccess-footer-text {\n font-size: 13px;\n color: rgba(255, 255, 255, 0.4);\n font-weight: 500;\n }\n\n .noaccess-footer-link {\n font-size: 13px;\n color: rgba(255, 255, 255, 0.5);\n text-decoration: none;\n transition: color 0.2s ease;\n }\n\n .noaccess-footer-link:hover {\n color: var(--k-primary);\n }\n\n .noaccess-footer-dot {\n color: rgba(255, 255, 255, 0.3);\n font-size: 12px;\n }\n\n @media (max-width: 440px) {\n .noaccess-page {\n padding: 16px;\n }\n\n .noaccess-card {\n padding: 32px 24px;\n }\n\n .noaccess-title {\n font-size: 22px;\n }\n }\n `]\n})\nexport class NoAccessComponent {\n backToLogin = output<void>();\n}\n","import { Component, output } from '@angular/core';\n\n@Component({\n selector: 'ke-license-expired',\n standalone: true,\n template: `\n <div class=\"expired-page\">\n <div class=\"expired-bg\">\n <div class=\"expired-gradient\"></div>\n <div class=\"expired-pattern\"></div>\n <div class=\"expired-glow expired-glow--1\"></div>\n <div class=\"expired-glow expired-glow--2\"></div>\n </div>\n\n <div class=\"expired-container\">\n <div class=\"expired-card\">\n <header class=\"expired-header\">\n <div class=\"expired-logo-wrap\">\n <img src=\"/img/kustomizerlogo.png\" alt=\"Kustomizer\" class=\"expired-logo\" />\n </div>\n\n <div class=\"expired-icon-wrap\">\n <div class=\"expired-icon-ring\"></div>\n <svg class=\"expired-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <polyline points=\"12 6 12 12 16 14\" />\n </svg>\n </div>\n\n <h1 class=\"expired-title\">License expired</h1>\n <p class=\"expired-subtitle\">The license for this store's owner has expired. Contact the owner to renew the subscription.</p>\n </header>\n\n <div class=\"expired-info\">\n <div class=\"expired-info-row\">\n <svg viewBox=\"0 0 20 20\" fill=\"currentColor\" class=\"expired-info-icon\">\n <path fill-rule=\"evenodd\" d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a.75.75 0 000 1.5h.253a.25.25 0 01.244.304l-.459 2.066A1.75 1.75 0 0010.747 15H11a.75.75 0 000-1.5h-.253a.25.25 0 01-.244-.304l.459-2.066A1.75 1.75 0 009.253 9H9z\" clip-rule=\"evenodd\" />\n </svg>\n <span>All editing features are disabled until the license is renewed.</span>\n </div>\n </div>\n\n <button type=\"button\" class=\"expired-btn\" (click)=\"backToLogin.emit()\">\n <svg viewBox=\"0 0 20 20\" fill=\"currentColor\" class=\"expired-btn-icon\">\n <path fill-rule=\"evenodd\" d=\"M17 10a.75.75 0 01-.75.75H5.612l4.158 3.96a.75.75 0 11-1.04 1.08l-5.5-5.25a.75.75 0 010-1.08l5.5-5.25a.75.75 0 111.04 1.08L5.612 9.25H16.25A.75.75 0 0117 10z\" clip-rule=\"evenodd\" />\n </svg>\n Back to sign in\n </button>\n </div>\n\n <footer class=\"expired-footer\">\n <span class=\"expired-footer-text\">Kustomizer</span>\n <span class=\"expired-footer-dot\">&middot;</span>\n <a href=\"https://kustomizer.net\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"expired-footer-link\">kustomizer.net</a>\n </footer>\n </div>\n </div>\n `,\n styles: [`\n :host {\n display: block;\n }\n\n .expired-page {\n --k-primary: #bdf366;\n --k-primary-hover: #a8e050;\n --k-primary-text: #1a1f0e;\n --k-bg: #0c0f08;\n --k-card: #ffffff;\n --k-border: #e5e7eb;\n --k-text: #1f2937;\n --k-text-secondary: #6b7280;\n --k-text-muted: #9ca3af;\n --k-amber: #f59e0b;\n --k-amber-light: #fef3c7;\n --k-amber-border: #fde68a;\n\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', sans-serif;\n min-height: 100vh;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--k-bg);\n color: var(--k-text);\n padding: 20px;\n position: relative;\n overflow: hidden;\n }\n\n .expired-bg {\n position: fixed;\n inset: 0;\n pointer-events: none;\n z-index: 0;\n }\n\n .expired-gradient {\n position: absolute;\n inset: 0;\n background:\n radial-gradient(ellipse 80% 50% at 50% -20%, rgba(245, 158, 11, 0.12), transparent),\n radial-gradient(ellipse 60% 40% at 100% 100%, rgba(189, 243, 102, 0.06), transparent),\n linear-gradient(180deg, #0c0f08 0%, #111a0a 100%);\n }\n\n .expired-pattern {\n position: absolute;\n inset: 0;\n background-image:\n radial-gradient(rgba(189, 243, 102, 0.07) 1px, transparent 1px);\n background-size: 32px 32px;\n mask-image: radial-gradient(ellipse 100% 80% at 50% 20%, black, transparent);\n -webkit-mask-image: radial-gradient(ellipse 100% 80% at 50% 20%, black, transparent);\n }\n\n .expired-glow {\n position: absolute;\n border-radius: 50%;\n filter: blur(80px);\n opacity: 0.6;\n }\n\n .expired-glow--1 {\n width: 400px;\n height: 400px;\n background: rgba(245, 158, 11, 0.1);\n top: -150px;\n left: 50%;\n transform: translateX(-50%);\n animation: glowPulse 8s ease-in-out infinite;\n }\n\n .expired-glow--2 {\n width: 300px;\n height: 300px;\n background: rgba(189, 243, 102, 0.06);\n bottom: -100px;\n right: -50px;\n animation: glowPulse2 10s ease-in-out infinite;\n }\n\n @keyframes glowPulse {\n 0%, 100% { opacity: 0.4; transform: translateX(-50%) scale(1); }\n 50% { opacity: 0.7; transform: translateX(-50%) scale(1.1); }\n }\n\n @keyframes glowPulse2 {\n 0%, 100% { opacity: 0.3; transform: scale(1); }\n 50% { opacity: 0.5; transform: scale(1.15); }\n }\n\n .expired-container {\n position: relative;\n z-index: 1;\n width: 100%;\n max-width: 400px;\n animation: fadeIn 0.5s ease;\n }\n\n @keyframes fadeIn {\n from { opacity: 0; transform: translateY(20px); }\n to { opacity: 1; transform: translateY(0); }\n }\n\n .expired-card {\n background: var(--k-card);\n border-radius: 20px;\n padding: 40px 32px;\n box-shadow:\n 0 0 0 1px rgba(255, 255, 255, 0.1),\n 0 25px 50px -12px rgba(0, 0, 0, 0.5),\n 0 0 100px -20px rgba(245, 158, 11, 0.15);\n }\n\n .expired-header {\n text-align: center;\n margin-bottom: 24px;\n }\n\n .expired-logo-wrap {\n margin-bottom: 24px;\n }\n\n .expired-logo {\n width: 56px;\n height: 56px;\n border-radius: 12px;\n }\n\n .expired-icon-wrap {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 56px;\n height: 56px;\n margin-bottom: 20px;\n }\n\n .expired-icon-ring {\n position: absolute;\n inset: 0;\n border-radius: 50%;\n background: var(--k-amber-light);\n border: 1px solid var(--k-amber-border);\n animation: ringPulse 3s ease-in-out infinite;\n }\n\n @keyframes ringPulse {\n 0%, 100% { transform: scale(1); opacity: 1; }\n 50% { transform: scale(1.08); opacity: 0.8; }\n }\n\n .expired-icon {\n position: relative;\n width: 28px;\n height: 28px;\n color: var(--k-amber);\n }\n\n .expired-title {\n font-size: 24px;\n font-weight: 600;\n color: var(--k-text);\n margin: 0 0 8px 0;\n letter-spacing: -0.3px;\n }\n\n .expired-subtitle {\n font-size: 14px;\n color: var(--k-text-secondary);\n margin: 0;\n font-weight: 400;\n line-height: 1.5;\n }\n\n .expired-info {\n background: var(--k-amber-light);\n border: 1px solid var(--k-amber-border);\n border-radius: 10px;\n padding: 12px 14px;\n margin-bottom: 24px;\n }\n\n .expired-info-row {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n font-size: 13px;\n color: #92400e;\n line-height: 1.4;\n }\n\n .expired-info-icon {\n width: 16px;\n height: 16px;\n flex-shrink: 0;\n margin-top: 1px;\n color: var(--k-amber);\n }\n\n .expired-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n width: 100%;\n background: var(--k-primary);\n color: var(--k-primary-text);\n border: none;\n border-radius: 10px;\n padding: 14px 20px;\n font-size: 15px;\n font-weight: 600;\n font-family: inherit;\n cursor: pointer;\n transition: background 0.2s ease, transform 0.1s ease;\n text-decoration: none;\n box-sizing: border-box;\n }\n\n .expired-btn:hover {\n background: var(--k-primary-hover);\n }\n\n .expired-btn:active {\n transform: scale(0.98);\n }\n\n .expired-btn-icon {\n width: 16px;\n height: 16px;\n }\n\n .expired-footer {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n margin-top: 24px;\n }\n\n .expired-footer-text {\n font-size: 13px;\n color: rgba(255, 255, 255, 0.4);\n font-weight: 500;\n }\n\n .expired-footer-link {\n font-size: 13px;\n color: rgba(255, 255, 255, 0.5);\n text-decoration: none;\n transition: color 0.2s ease;\n }\n\n .expired-footer-link:hover {\n color: var(--k-primary);\n }\n\n .expired-footer-dot {\n color: rgba(255, 255, 255, 0.3);\n font-size: 12px;\n }\n\n @media (max-width: 440px) {\n .expired-page {\n padding: 16px;\n }\n\n .expired-card {\n padding: 32px 24px;\n }\n\n .expired-title {\n font-size: 22px;\n }\n }\n `]\n})\nexport class LicenseExpiredComponent {\n backToLogin = output<void>();\n}\n","import { Injectable, inject, signal, computed } from '@angular/core';\nimport { HttpClient, HttpErrorResponse } from '@angular/common/http';\nimport { SupabaseAuthService, SUPABASE_CONFIG } from './supabase-auth.service';\nimport { ShopAuthService } from './shop-auth.service';\nimport { firstValueFrom } from 'rxjs';\n\nexport interface TeamMember {\n email: string;\n role: 'owner' | 'admin' | 'reader';\n status: 'active' | 'inactive' | 'suspended';\n invited_by: string | null;\n joined_at: string;\n is_current_user: boolean;\n}\n\nexport interface PendingInvitation {\n id: string;\n email: string;\n role: 'admin' | 'reader';\n invited_by: string;\n created_at: string;\n expires_at: string;\n is_expired: boolean;\n}\n\nexport interface CurrentUser {\n email: string;\n role: string;\n can_invite: boolean;\n can_remove_members: boolean;\n}\n\nexport interface TeamData {\n shop: {\n id: string;\n name: string;\n shopify_domain: string;\n allowed_domains: string[];\n };\n members: TeamMember[];\n invitations: PendingInvitation[];\n current_user: CurrentUser;\n summary: {\n total_members: number;\n pending_invitations: number;\n };\n}\n\nexport interface InviteResult {\n invitation_id: string;\n token: string;\n expires_at: string;\n email: string;\n role: string;\n}\n\nexport interface AcceptInvitationResult {\n success: boolean;\n shop: {\n id: string;\n name: string;\n shopify_domain: string;\n };\n role: string;\n message: string;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class ShopTeamService {\n private http = inject(HttpClient);\n private config = inject(SUPABASE_CONFIG, { optional: true });\n private authService = inject(SupabaseAuthService);\n private shopAuthService = inject(ShopAuthService);\n\n // Estado\n private _team = signal<TeamData | null>(null);\n private _loading = signal(false);\n private _error = signal<string | null>(null);\n\n readonly team = this._team.asReadonly();\n readonly loading = this._loading.asReadonly();\n readonly error = this._error.asReadonly();\n\n // Computed\n readonly members = computed(() => this._team()?.members ?? []);\n readonly invitations = computed(() => this._team()?.invitations ?? []);\n readonly currentUser = computed(() => this._team()?.current_user ?? null);\n\n readonly activeMembers = computed(() =>\n this.members().filter((m) => m.status === 'active')\n );\n\n readonly pendingInvitations = computed(() =>\n this.invitations().filter((i) => !i.is_expired)\n );\n\n readonly canInvite = computed(() => this._team()?.current_user?.can_invite ?? false);\n\n /**\n * Carga el equipo de la shop actual\n */\n async loadTeam(): Promise<TeamData | null> {\n const shopId = this.shopAuthService.shopId();\n\n if (!shopId) {\n this._error.set('No shop selected');\n return null;\n }\n\n const token = this.authService.accessToken();\n if (!token) {\n this._error.set('Not authenticated');\n return null;\n }\n\n this._loading.set(true);\n this._error.set(null);\n\n try {\n const url = this.config\n ? `${this.config.supabaseUrl}/functions/v1/shop_team`\n : '/functions/v1/shop_team';\n\n const response = await firstValueFrom(\n this.http.post<TeamData>(url, { shop_id: shopId }, {\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n })\n );\n\n this._team.set(response);\n this._loading.set(false);\n return response;\n } catch (err) {\n console.error('[ShopTeamService] Load team failed:', err);\n const httpError = err as HttpErrorResponse;\n this._error.set(httpError.error?.error || 'Failed to load team');\n this._loading.set(false);\n return null;\n }\n }\n\n /**\n * Invita a un usuario a la shop\n */\n async inviteUser(\n email: string,\n role: 'admin' | 'reader',\n message?: string\n ): Promise<InviteResult | null> {\n const shopId = this.shopAuthService.shopId();\n\n if (!shopId) {\n this._error.set('No shop selected');\n return null;\n }\n\n const token = this.authService.accessToken();\n if (!token) {\n this._error.set('Not authenticated');\n return null;\n }\n\n this._loading.set(true);\n this._error.set(null);\n\n try {\n const url = this.config\n ? `${this.config.supabaseUrl}/functions/v1/invite_user`\n : '/functions/v1/invite_user';\n\n const response = await firstValueFrom(\n this.http.post<InviteResult>(url, {\n shop_id: shopId,\n email: email.toLowerCase().trim(),\n role,\n message: message?.trim() || undefined,\n }, {\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n })\n );\n\n // Recargar equipo para mostrar la invitación\n await this.loadTeam();\n\n this._loading.set(false);\n return response;\n } catch (err) {\n console.error('[ShopTeamService] Invite user failed:', err);\n const httpError = err as HttpErrorResponse;\n this._error.set(httpError.error?.error || 'Failed to invite user');\n this._loading.set(false);\n return null;\n }\n }\n\n /**\n * Acepta una invitación (usado cuando un usuario hace click en el link de invitación)\n */\n async acceptInvitation(invitationToken: string): Promise<AcceptInvitationResult | null> {\n const authToken = this.authService.accessToken();\n if (!authToken) {\n this._error.set('Not authenticated');\n return null;\n }\n\n this._loading.set(true);\n this._error.set(null);\n\n try {\n const url = this.config\n ? `${this.config.supabaseUrl}/functions/v1/accept_invitation`\n : '/functions/v1/accept_invitation';\n\n const response = await firstValueFrom(\n this.http.post<AcceptInvitationResult>(url, {\n token: invitationToken,\n }, {\n headers: {\n 'Authorization': `Bearer ${authToken}`,\n 'Content-Type': 'application/json',\n },\n })\n );\n\n this._loading.set(false);\n return response;\n } catch (err) {\n console.error('[ShopTeamService] Accept invitation failed:', err);\n const httpError = err as HttpErrorResponse;\n this._error.set(httpError.error?.error || 'Failed to accept invitation');\n this._loading.set(false);\n return null;\n }\n }\n\n /**\n * Genera el URL de invitación (para copiar/compartir)\n */\n getInvitationUrl(token: string, baseUrl?: string): string {\n const base = baseUrl || (typeof window !== 'undefined' ? window.location.origin : '');\n return `${base}/accept-invitation?token=${token}`;\n }\n\n /**\n * Limpia el estado\n */\n clear(): void {\n this._team.set(null);\n this._error.set(null);\n }\n}\n","import { InjectionToken } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { EditorSection } from '../store/visual-editor.state';\n\nexport const SHOPIFY_API_VERSION = '2026-01';\n\nexport interface ShopifyConfig {\n shopDomain: string;\n accessToken: string;\n apiVersion: string;\n}\n\nexport const SHOPIFY_CONFIG = new InjectionToken<ShopifyConfig | Observable<ShopifyConfig>>('SHOPIFY_CONFIG');\n\n/**\n * Metafield representation from Shopify\n */\nexport interface Metafield {\n id: string;\n namespace: string;\n key: string;\n value: string;\n type: string;\n createdAt?: string;\n updatedAt?: string;\n}\n\n/**\n * Page status - draft pages are only visible in admin, published pages are public\n */\nexport type PageStatus = 'draft' | 'published';\n\n/**\n * Entry in the pages index (lightweight reference)\n */\nexport interface PageIndexEntry {\n id: string;\n slug: string;\n title: string;\n status: PageStatus;\n updatedAt: string;\n publishedAt?: string;\n size: number;\n}\n\n/**\n * Index of all pages stored in a single metafield\n */\nexport interface PagesIndex {\n version: number;\n lastUpdated: string;\n pages: PageIndexEntry[];\n}\n\n/**\n * Full page model with all content\n */\nexport interface Page {\n id: string;\n slug: string;\n title: string;\n description?: string;\n sections: EditorSection[];\n status: PageStatus;\n createdAt: string;\n updatedAt: string;\n publishedAt?: string;\n version: number;\n}\n\n/**\n * Lightweight page summary for listing\n */\nexport interface PageSummary {\n id: string;\n slug: string;\n title: string;\n status: PageStatus;\n updatedAt: string;\n publishedAt?: string;\n}\n\n/**\n * Page context stored in editor state (minimal info needed while editing)\n */\nexport interface PageContext {\n id: string;\n slug: string;\n title: string;\n status: PageStatus;\n version: number;\n}\n\n/**\n * Request payload for creating a new page\n */\nexport interface CreatePageRequest {\n title: string;\n slug: string;\n description?: string;\n}\n\n/**\n * Request payload for updating an existing page\n */\nexport interface UpdatePageRequest {\n title?: string;\n slug?: string;\n description?: string;\n sections?: EditorSection[];\n version: number;\n}\n\n/**\n * Request payload for publishing/unpublishing\n */\nexport interface PublishPageRequest {\n version: number;\n}\n","import { inject } from '@angular/core';\nimport { Router, CanActivateFn } from '@angular/router';\nimport { SupabaseAuthService } from '../services/supabase-auth.service';\n\nexport const authGuard: CanActivateFn = async () => {\n const authService = inject(SupabaseAuthService);\n const router = inject(Router);\n\n await authService.ensureInitialized();\n\n if (authService.isAuthenticated()) {\n return true;\n }\n\n router.navigate(['/login']);\n return false;\n};\n\nexport const noAuthGuard: CanActivateFn = async () => {\n const authService = inject(SupabaseAuthService);\n const router = inject(Router);\n\n await authService.ensureInitialized();\n\n if (!authService.isAuthenticated()) {\n return true;\n }\n\n router.navigate(['/admin']);\n return false;\n};\n","import { inject } from '@angular/core';\nimport { Router, CanActivateFn } from '@angular/router';\nimport { ShopAuthService } from '../services/shop-auth.service';\n\nexport const licenseGuard: CanActivateFn = async () => {\n const shopAuthService = inject(ShopAuthService);\n const router = inject(Router);\n\n await shopAuthService.authenticate();\n\n if (shopAuthService.hasAccess()) {\n return true;\n }\n\n router.navigate(['/activate']);\n return false;\n};\n\nexport const noLicenseGuard: CanActivateFn = async () => {\n const shopAuthService = inject(ShopAuthService);\n const router = inject(Router);\n\n await shopAuthService.authenticate();\n\n if (!shopAuthService.hasAccess()) {\n return true;\n }\n\n router.navigate(['/admin']);\n return false;\n};\n","import { inject } from '@angular/core';\nimport { Router, CanActivateFn } from '@angular/router';\nimport { SupabaseAuthService } from '../services/supabase-auth.service';\nimport { ShopAuthService } from '../services/shop-auth.service';\n\n/**\n * Guard que verifica:\n * 1. Usuario autenticado\n * 2. Usuario tiene acceso a la shop del dominio actual\n * 3. Licencia activa\n *\n * Redirige a:\n * - /login si no está autenticado\n * - /no-access si no tiene acceso a la shop\n * - /license-expired si la licencia expiró\n */\nexport const shopAuthGuard: CanActivateFn = async () => {\n const authService = inject(SupabaseAuthService);\n const shopAuthService = inject(ShopAuthService);\n const router = inject(Router);\n\n // Esperar inicialización del auth\n await authService.ensureInitialized();\n\n // Verificar autenticación básica\n if (!authService.isAuthenticated()) {\n router.navigate(['/login']);\n return false;\n }\n\n // Autenticar contra la shop\n await shopAuthService.authenticate();\n\n // Verificar acceso\n if (shopAuthService.hasAccess()) {\n return true;\n }\n\n // Manejar diferentes tipos de error\n const error = shopAuthService.error();\n\n if (error?.code === 'NOT_AUTHENTICATED') {\n router.navigate(['/login']);\n return false;\n }\n\n if (error?.code === 'LICENSE_EXPIRED') {\n router.navigate(['/license-expired']);\n return false;\n }\n\n if (error?.code === 'NO_ACCESS' || error?.code === 'SHOP_NOT_FOUND') {\n router.navigate(['/no-access']);\n return false;\n }\n\n if (error?.code === 'LOCALHOST_NO_SHOP') {\n alert('Add ?shop=your-store.myshopify.com to the URL');\n return false;\n }\n\n if (error?.code === 'USER_INACTIVE') {\n router.navigate(['/account-inactive']);\n return false;\n }\n\n // Error desconocido, redirigir a no-access\n router.navigate(['/no-access']);\n return false;\n};\n\n/**\n * Guard que solo permite acceso si el usuario NO tiene acceso a una shop.\n * Útil para páginas como /login que no deberían ser accesibles si ya tienes acceso.\n */\nexport const noShopAuthGuard: CanActivateFn = async () => {\n const authService = inject(SupabaseAuthService);\n const shopAuthService = inject(ShopAuthService);\n const router = inject(Router);\n\n await authService.ensureInitialized();\n\n // Si no está autenticado, permitir (puede ver login)\n if (!authService.isAuthenticated()) {\n return true;\n }\n\n // Verificar acceso a shop\n await shopAuthService.authenticate();\n\n // Si tiene acceso completo, redirigir al admin\n if (shopAuthService.hasAccess()) {\n router.navigate(['/admin']);\n return false;\n }\n\n // No tiene acceso completo, permitir ver la página\n return true;\n};\n\n/**\n * Guard que verifica que el usuario tenga rol de admin o owner.\n * Requiere que shopAuthGuard se haya ejecutado primero.\n */\nexport const shopAdminGuard: CanActivateFn = async () => {\n const shopAuthService = inject(ShopAuthService);\n const router = inject(Router);\n\n // Asegurar que ya se autenticó\n if (!shopAuthService.initialized()) {\n await shopAuthService.authenticate();\n }\n\n if (shopAuthService.isAdmin()) {\n return true;\n }\n\n // No es admin, redirigir a admin (sin permisos de gestión)\n router.navigate(['/admin']);\n return false;\n};\n\n/**\n * Guard que verifica que el usuario pueda editar (owner o admin).\n * Los readers solo pueden ver, no editar.\n */\nexport const shopEditorGuard: CanActivateFn = async () => {\n const shopAuthService = inject(ShopAuthService);\n const router = inject(Router);\n\n if (!shopAuthService.initialized()) {\n await shopAuthService.authenticate();\n }\n\n if (shopAuthService.canEdit()) {\n return true;\n }\n\n // Es reader, mostrar página de solo lectura o redirigir\n router.navigate(['/admin']);\n return false;\n};\n","import { Component } from '@angular/core';\n\n@Component({\n selector: 'lib-visual-editor',\n imports: [],\n template: `\n <p>\n visual-editor works!\n </p>\n `,\n styles: ``,\n})\nexport class VisualEditor {\n\n}\n","/*\n * Public API Surface of visual-editor\n */\n\n// Main provider function\nexport { provideVisualEditor } from './lib/provide-visual-editor';\n\n// Store (state, actions, reducer, selectors)\nexport * from './lib/store';\n\n// Registry (component definitions, providers)\nexport * from './lib/registry';\n\n// Components (VisualEditor, PageManager, DynamicRenderer, etc.)\nexport * from './lib/components';\n\n// Services (VisualEditorFacade, PageService)\nexport * from './lib/services';\n\n// Models (Page types, injection tokens)\nexport * from './lib/models';\n\n// Navigation (abstract service, default implementation)\nexport * from './lib/navigation';\n\n// Page Loading (strategies for loading pages)\nexport * from './lib/page-loading';\n\n// Configuration (types, injection tokens)\nexport * from './lib/config';\n\n// Guards (auth, license)\nexport * from './lib/guards';\n\n// Drag & Drop (service, types)\nexport * from './lib/dnd';\n\n// Legacy export for backwards compatibility\nexport * from './lib/visual-editor';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["map","findElementRecursive","tap","switchMap","i1"],"mappings":"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"}