{"version":3,"file":"ditpsoftware-bq-lens.mjs","sources":["../../src/lib/bq-lens.config.ts","../../src/lib/services/dev-cache-storage.service.ts","../../src/lib/services/dev-capture.service.ts","../../src/lib/services/dev-base-url.service.ts","../../src/lib/services/dev-interceptor.ts","../../src/lib/services/dev-picker.service.ts","../../src/lib/dev-animations.utils.ts","../../src/lib/dev-http.utils.ts","../../src/lib/dev-url.utils.ts","../../src/lib/dev-json.utils.ts","../../src/lib/components/bq-icon.component.ts","../../src/lib/components/dev-insights-panel.component.ts","../../src/lib/components/dev-insights-panel.component.html","../../src/lib/dev-clipboard.utils.ts","../../src/lib/components/dev-code-viewer.component.ts","../../src/lib/components/dev-viewer-container.component.ts","../../src/lib/components/dev-viewer-container.component.html","../../src/lib/components/dev-capture-list.component.ts","../../src/lib/components/dev-capture-list.component.html","../../src/lib/services/dev-element-cache.service.ts","../../src/lib/services/dev-treemap-layout.service.ts","../../src/lib/components/dev-element-graph.component.ts","../../src/lib/components/dev-element-graph.component.html","../../src/lib/components/dev-element-tree.component.ts","../../src/lib/components/dev-element-tree.component.html","../../src/lib/dev-drag.utils.ts","../../src/lib/dev-platform.utils.ts","../../src/lib/dev-why-blocked.utils.ts","../../src/lib/services/selector-parser.ts","../../src/lib/components/dev-selector-tree.component.ts","../../src/lib/components/dev-selector-tree.component.html","../../src/lib/components/dev-inspector-popup.component.ts","../../src/lib/components/dev-inspector-popup.component.html","../../src/lib/components/dev-large-view.component.ts","../../src/lib/components/dev-large-view.component.html","../../src/lib/bq-lens.header.ts","../../src/lib/bq-lens.help.ts","../../src/lib/json-to-templates/PageModelToElementTemplate.ts","../../src/lib/json-to-templates/json-to-templates.component.ts","../../src/lib/json-to-templates/json-to-templates.component.html","../../src/lib/dev-analysis.utils.ts","../../src/lib/dev-body-kind.utils.ts","../../src/lib/dev-diff.utils.ts","../../src/lib/dev-element-serialization.utils.ts","../../src/lib/dev-storage.utils.ts","../../src/lib/dev-csf-generator.utils.ts","../../src/lib/services/dev-format.service.ts","../../src/lib/services/dev-template-cache.service.ts","../../src/lib/services/dev-inspector.service.ts","../../src/lib/services/dev-tour.service.ts","../../src/lib/services/dev-structure-audit.service.ts","../../src/lib/services/dev-colors.service.ts","../../src/lib/components/dev-session-panel.component.ts","../../src/lib/components/dev-session-panel.component.html","../../src/lib/components/dev-cache-internals-panel.component.ts","../../src/lib/components/dev-cache-internals-panel.component.html","../../src/lib/dev-tooltip.directive.ts","../../src/lib/components/dev-capture-diff.component.ts","../../src/lib/components/dev-capture-diff.component.html","../../src/lib/services/dev-search.service.ts","../../src/lib/components/dev-element-search.component.ts","../../src/lib/components/dev-element-search.component.html","../../src/lib/components/dev-tour.component.ts","../../src/lib/components/dev-tour.component.html","../../src/lib/bq-lens.component.ts","../../src/lib/bq-lens.component.html","../../src/lib/bq-lens.module.ts","../../src/ditpsoftware-bq-lens.ts"],"sourcesContent":["import { InjectionToken, Type } from '@angular/core';\n\nexport interface BqLensSectionConfig {\n  /** Header label and uniqueness key for open/close state. */\n  label: string;\n  /** Icon name from the bundled bq-icon registry (e.g. 'cog', 'crosshairs'). */\n  icon?: string;\n  /** Component rendered inside the section body. Standalone or declared. */\n  component: Type<unknown>;\n  /** If true, section starts open. Default false. */\n  initiallyOpen?: boolean;\n}\n\nexport interface BqLensConfig {\n  /** Defaults to `!isDevMode()` from @angular/core. Override for non-standard build setups. */\n  production?: boolean;\n  /** Defaults to the active Blueriq runtime's base URL via SessionRegistry. Override for multi-runtime setups. */\n  blueriqBaseUrl?: string;\n  title?: string;\n  /** Floating tab label. Trimmed to 4 characters. */\n  tabLabel?: string;\n  /** Host-defined collapsible sections rendered above the main tab switcher. */\n  extraSections?: BqLensSectionConfig[];\n  /** Initial panel primary color (any CSS color). Mutable later via DevColorsService. */\n  primaryColor?: string;\n  /** Initial panel secondary color (any CSS color). Mutable later via DevColorsService. */\n  secondaryColor?: string;\n  /** When true, every element inside the panel renders with `border-radius: 0` — useful for hosts whose design language is square/flat. */\n  flatCorners?: boolean;\n}\n\nexport const BQ_LENS_CONFIG = new InjectionToken<BqLensConfig>('BQ_LENS_CONFIG');\n","import { Injectable } from '@angular/core';\nimport { Observable, ReplaySubject } from 'rxjs';\nimport { CaptureEntry } from '../bq-lens.types';\n\n/**\n * IndexedDB-backed persistence for the bq-lens capture log and dismissed-error\n * set. Replaces the prior sessionStorage path:\n *\n *  - **No 5MB cap.** A single Blueriq /load body can be 100KB+; 50 of them\n *    stringified pushed past sessionStorage limits regularly, silently\n *    downgrading to \"last 10\". IDB has tens-of-MB headroom per origin.\n *  - **Off the hot path.** Saves are debounced 250ms — `logCapture` returns\n *    sync, persistence happens later. Today's `JSON.stringify(50)` cost on\n *    every capture is gone.\n *  - **Schema-versioned envelopes.** Each persisted record carries `v` and\n *    `tabId` so a future schema bump can run a real migration instead of\n *    silently wiping the user's history.\n *  - **Per-tab isolation.** `tabId` (from sessionStorage) scopes loads so\n *    sibling tabs don't see each other's traffic. Cross-tab fan-in is a\n *    later opt-in (BroadcastChannel) that filters differently on read.\n *\n * If IndexedDB is unavailable (SSR, private mode in some browsers, tests),\n * the service fails closed: `ready$` emits `false`, every save is a no-op,\n * loads resolve to empty. Callers should treat this as \"ephemeral session\"\n * and not block UX on it.\n */\n\nconst DB_NAME = 'bq-lens-storage';\nconst DB_VERSION = 2;\nconst STORE_CAPTURES = 'captures';\nconst STORE_META = 'meta';\nconst STORE_BODIES = 'bodies';\nconst META_KEY_DISMISSED = 'dismissed';\nconst TAB_ID_STORAGE_KEY = 'bq-lens-tab-id';\nconst SAVE_DEBOUNCE_MS = 250;\nconst MAX_STORAGE_EVENTS = 100;\n// Bodies above this size get split into the dedicated `bodies` store so\n// the main captures-store deserialize stays snappy. Threshold sits below\n// the typical Blueriq /load response (50-100KB) but above the page-event\n// payloads (~5-20KB), so most captures stay inline and only the genuinely\n// heavy /load and /start responses get split off.\nconst REDACTION_THRESHOLD = 256 * 1024;\n// First N bytes (UTF-16 code units, conservatively budgeted) of the\n// stringified body kept inline so the inspector can render a preview\n// without paying the bodies-store fetch.\nconst HEAD_BYTES = 4 * 1024;\nexport const STORAGE_SCHEMA_VERSION = 1;\nexport const REDACTION_MARKER = '__bqLensRedacted';\n\nexport interface PersistedCaptureEnvelope {\n  v: number;\n  ts: number;\n  tabId: string;\n  provenance: 'live' | 'replay' | 'fixture';\n  capture: CaptureEntry;\n  /**\n   * When true, `capture.responseBody` holds a redaction stub (see\n   * `RedactionStub`) and the actual body lives in the `bodies` store\n   * keyed by `bodyKey(tabId, capture.id)`. Eager-joined on load so\n   * consumers don't see the stub.\n   */\n  bodyRedacted?: boolean;\n}\n\nexport interface RedactionStub {\n  /** Sentinel so consumers can detect a stub even before join. */\n  [REDACTION_MARKER]: true;\n  /** Length of the stringified original, for UI sizing hints. */\n  size: number;\n  /** First HEAD_BYTES of the stringified original, raw — preview only. */\n  head: string;\n  /** Cheap content fingerprint (FNV-1a over the stringified body). */\n  fingerprint: string;\n}\n\ninterface PersistedBodyEnvelope {\n  /** `${tabId}:${captureId}` so a clear() can scope to its tab. */\n  key: string;\n  ts: number;\n  tabId: string;\n  captureId: string;\n  body: unknown;\n}\n\nexport interface StorageEvent {\n  type: 'open-error' | 'open-blocked' | 'load-error' | 'save-error' | 'disabled' | 'ready' | 'cleared';\n  ts: number;\n  detail?: unknown;\n}\n\nfunction deriveTabId(): string {\n  if (typeof sessionStorage === 'undefined') {\n    return `tab-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n  }\n  const existing = sessionStorage.getItem(TAB_ID_STORAGE_KEY);\n  if (existing) return existing;\n  const id =\n    typeof crypto !== 'undefined' && typeof (crypto as any).randomUUID === 'function'\n      ? (crypto as any).randomUUID()\n      : `tab-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n  try {\n    sessionStorage.setItem(TAB_ID_STORAGE_KEY, id);\n  } catch {\n    // sessionStorage write quota / privacy mode — fall back to in-memory id.\n  }\n  return id;\n}\n\nfunction errorString(e: unknown): string {\n  return e instanceof Error ? `${e.name}: ${e.message}` : String(e);\n}\n\nfunction bodyKey(tabId: string, captureId: string): string {\n  return `${tabId}:${captureId}`;\n}\n\n/**\n * 32-bit FNV-1a fingerprint, hex-encoded. Not cryptographic — used only\n * to detect \"same body re-persisted\" so the inspector can show a stable\n * id for redacted entries. Cheap (one O(n) walk, no allocation).\n */\nfunction fingerprintString(s: string): string {\n  let h = 0x811c9dc5;\n  for (let i = 0; i < s.length; i++) {\n    h ^= s.charCodeAt(i);\n    h = (h + ((h << 1) + (h << 4) + (h << 7) + (h << 8) + (h << 24))) >>> 0;\n  }\n  return h.toString(16).padStart(8, '0');\n}\n\n/**\n * Returns either the original body (small enough to inline) or a\n * `{ stub, full }` pair where `stub` is what goes into the captures\n * envelope and `full` is what goes into the bodies store. JSON.stringify\n * runs once and is reused for size + head + fingerprint.\n */\nfunction maybeRedact(body: unknown): { redacted: false } | { redacted: true; stub: RedactionStub; full: unknown } {\n  if (body === undefined || body === null) return { redacted: false };\n  let stringified: string;\n  try {\n    stringified = JSON.stringify(body);\n  } catch {\n    return { redacted: false };\n  }\n  if (!stringified || stringified.length <= REDACTION_THRESHOLD) {\n    return { redacted: false };\n  }\n  return {\n    redacted: true,\n    stub: {\n      [REDACTION_MARKER]: true,\n      size: stringified.length,\n      head: stringified.slice(0, HEAD_BYTES),\n      fingerprint: fingerprintString(stringified),\n    },\n    full: body,\n  };\n}\n\nfunction isRedactionStub(value: unknown): value is RedactionStub {\n  return !!value && typeof value === 'object' && (value as Record<string, unknown>)[REDACTION_MARKER] === true;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class DevCacheStorageService {\n  private readonly tabId = deriveTabId();\n  private db: IDBDatabase | null = null;\n  private dbAvailable = false;\n  private _ready$ = new ReplaySubject<boolean>(1);\n  readonly ready$: Observable<boolean> = this._ready$.asObservable();\n\n  private pendingCaptures: CaptureEntry[] | null = null;\n  private debounceHandle: ReturnType<typeof setTimeout> | null = null;\n  private storageEvents: StorageEvent[] = [];\n\n  constructor() {\n    void this.openDb();\n  }\n\n  getStorageEvents(): readonly StorageEvent[] {\n    return this.storageEvents;\n  }\n\n  getTabId(): string {\n    return this.tabId;\n  }\n\n  private record(type: StorageEvent['type'], detail?: unknown): void {\n    this.storageEvents.push({ type, ts: Date.now(), detail });\n    if (this.storageEvents.length > MAX_STORAGE_EVENTS) {\n      this.storageEvents.shift();\n    }\n  }\n\n  private async openDb(): Promise<void> {\n    if (typeof indexedDB === 'undefined') {\n      this.record('disabled', { reason: 'no-indexeddb' });\n      this._ready$.next(false);\n      return;\n    }\n    try {\n      this.db = await new Promise<IDBDatabase>((resolve, reject) => {\n        const req = indexedDB.open(DB_NAME, DB_VERSION);\n        req.onerror = () => reject(req.error ?? new Error('IDB open failed'));\n        req.onblocked = () => this.record('open-blocked');\n        req.onupgradeneeded = (ev) => {\n          const db = req.result;\n          if (ev.oldVersion < 1) {\n            // keyPath uses the capture's own id so writes are upserts and\n            // reads stay stable across rewrites.\n            db.createObjectStore(STORE_CAPTURES, { keyPath: 'capture.id' });\n            db.createObjectStore(STORE_META);\n          }\n          if (ev.oldVersion < 2) {\n            // Bodies store holds the full payload for redacted captures.\n            // Composite key `tabId:captureId` lets a clear() scope its\n            // delete to one tab while keeping siblings' bodies intact.\n            db.createObjectStore(STORE_BODIES, { keyPath: 'key' });\n          }\n        };\n        req.onsuccess = () => resolve(req.result);\n      });\n      this.dbAvailable = true;\n      this.record('ready');\n      this._ready$.next(true);\n    } catch (e) {\n      this.record('open-error', { error: errorString(e) });\n      this._ready$.next(false);\n    }\n  }\n\n  /**\n   * Returns this tab's persisted captures, newest-first. Filters by tabId so\n   * sibling tabs' histories don't bleed in. Schema mismatches are dropped\n   * (and surfaced in storage events) so a future schema bump can recover.\n   */\n  async loadCaptures(): Promise<CaptureEntry[]> {\n    if (!this.dbAvailable || !this.db) return [];\n    return new Promise<CaptureEntry[]>((resolve) => {\n      try {\n        const tx = this.db!.transaction([STORE_CAPTURES, STORE_BODIES], 'readonly');\n        const captureStore = tx.objectStore(STORE_CAPTURES);\n        const bodyStore = tx.objectStore(STORE_BODIES);\n        const captureReq = captureStore.getAll();\n        const bodyReq = bodyStore.getAll();\n        let captureRes: PersistedCaptureEnvelope[] | null = null;\n        let bodyRes: PersistedBodyEnvelope[] | null = null;\n        const tryFinalize = () => {\n          if (!captureRes || !bodyRes) return;\n          // Body store is keyed by `${tabId}:${captureId}` — index by\n          // captureId after filtering by tab so a redacted entry can\n          // re-attach its body in O(1).\n          const bodyByCaptureId = new Map<string, unknown>();\n          for (const b of bodyRes) {\n            if (b?.tabId === this.tabId && typeof b.captureId === 'string') {\n              bodyByCaptureId.set(b.captureId, b.body);\n            }\n          }\n          const valid: CaptureEntry[] = [];\n          let schemaSkips = 0;\n          let missingBodies = 0;\n          for (const env of captureRes) {\n            if (env?.v !== STORAGE_SCHEMA_VERSION || !env.capture) {\n              schemaSkips++;\n              continue;\n            }\n            if (env.tabId !== this.tabId) continue;\n            if (env.bodyRedacted || isRedactionStub(env.capture.responseBody)) {\n              const full = bodyByCaptureId.get(env.capture.id);\n              if (full !== undefined) {\n                valid.push({ ...env.capture, responseBody: full });\n              } else {\n                // Bodies-store entry was evicted or never wrote — keep\n                // the stub so the inspector can still render a preview\n                // and consumers can detect the redaction.\n                missingBodies++;\n                valid.push(env.capture);\n              }\n            } else {\n              valid.push(env.capture);\n            }\n          }\n          if (schemaSkips > 0) {\n            this.record('load-error', { reason: 'schema-mismatch', count: schemaSkips });\n          }\n          if (missingBodies > 0) {\n            this.record('load-error', { reason: 'redacted-body-missing', count: missingBodies });\n          }\n          valid.sort((a, b) => (b.timestamp || '').localeCompare(a.timestamp || ''));\n          resolve(valid);\n        };\n        captureReq.onerror = () => {\n          this.record('load-error', { error: errorString(captureReq.error), context: 'captures' });\n          resolve([]);\n        };\n        bodyReq.onerror = () => {\n          this.record('load-error', { error: errorString(bodyReq.error), context: 'bodies' });\n          captureRes = captureRes ?? [];\n          bodyRes = [];\n          tryFinalize();\n        };\n        captureReq.onsuccess = () => {\n          captureRes = (captureReq.result as PersistedCaptureEnvelope[]) ?? [];\n          tryFinalize();\n        };\n        bodyReq.onsuccess = () => {\n          bodyRes = (bodyReq.result as PersistedBodyEnvelope[]) ?? [];\n          tryFinalize();\n        };\n      } catch (e) {\n        this.record('load-error', { error: errorString(e), context: 'captures' });\n        resolve([]);\n      }\n    });\n  }\n\n  /**\n   * Schedules a debounced rewrite of this tab's captures. Repeated calls\n   * within the debounce window collapse into a single IDB transaction —\n   * the live capture path can fire 5 times in 200ms and we still only\n   * pay one persistence cost.\n   */\n  saveCaptures(entries: CaptureEntry[]): void {\n    if (!this.dbAvailable) return;\n    this.pendingCaptures = entries;\n    if (this.debounceHandle) return;\n    this.debounceHandle = setTimeout(() => {\n      const pending = this.pendingCaptures;\n      this.pendingCaptures = null;\n      this.debounceHandle = null;\n      if (pending) this.flushCaptures(pending);\n    }, SAVE_DEBOUNCE_MS);\n  }\n\n  private flushCaptures(entries: CaptureEntry[]): void {\n    if (!this.dbAvailable || !this.db) return;\n    try {\n      const tx = this.db.transaction([STORE_CAPTURES, STORE_BODIES], 'readwrite');\n      const captureStore = tx.objectStore(STORE_CAPTURES);\n      const bodyStore = tx.objectStore(STORE_BODIES);\n      // Clear-and-rewrite is correct here: `entries` is the authoritative\n      // current FIFO. Diff-and-merge would race with the in-memory subject.\n      // Scope the clear to *this* tab's records — other tabs may be\n      // writing concurrently.\n      const captureIndexReq = captureStore.getAll();\n      const bodyIndexReq = bodyStore.getAll();\n      const liveIds = new Set(entries.map(e => e.id));\n      let capturesRead = false;\n      let bodiesRead = false;\n      const tryWrite = () => {\n        if (!capturesRead || !bodiesRead) return;\n        const ts = Date.now();\n        let redactedCount = 0;\n        for (const entry of entries) {\n          const decision = maybeRedact(entry.responseBody);\n          let envelope: PersistedCaptureEnvelope;\n          if (decision.redacted) {\n            envelope = {\n              v: STORAGE_SCHEMA_VERSION,\n              ts,\n              tabId: this.tabId,\n              provenance: 'live',\n              capture: { ...entry, responseBody: decision.stub },\n              bodyRedacted: true,\n            };\n            const bodyEnvelope: PersistedBodyEnvelope = {\n              key: bodyKey(this.tabId, entry.id),\n              ts,\n              tabId: this.tabId,\n              captureId: entry.id,\n              body: decision.full,\n            };\n            bodyStore.put(bodyEnvelope);\n            redactedCount++;\n          } else {\n            envelope = {\n              v: STORAGE_SCHEMA_VERSION,\n              ts,\n              tabId: this.tabId,\n              provenance: 'live',\n              capture: entry,\n            };\n            // No-longer-large body: drop any stale bodies-store entry.\n            bodyStore.delete(bodyKey(this.tabId, entry.id));\n          }\n          captureStore.put(envelope);\n        }\n        if (redactedCount > 0) {\n          this.record('ready', { redacted: redactedCount });\n        }\n      };\n      captureIndexReq.onsuccess = () => {\n        const existing = (captureIndexReq.result as PersistedCaptureEnvelope[]) ?? [];\n        for (const env of existing) {\n          if (env?.tabId === this.tabId && env.capture?.id && !liveIds.has(env.capture.id)) {\n            captureStore.delete(env.capture.id);\n          }\n        }\n        capturesRead = true;\n        tryWrite();\n      };\n      bodyIndexReq.onsuccess = () => {\n        const existing = (bodyIndexReq.result as PersistedBodyEnvelope[]) ?? [];\n        for (const env of existing) {\n          if (env?.tabId === this.tabId && env.captureId && !liveIds.has(env.captureId)) {\n            // Body for a capture that's no longer in the FIFO — drop it\n            // so the bodies store stays bounded by FIFO size.\n            bodyStore.delete(env.key);\n          }\n        }\n        bodiesRead = true;\n        tryWrite();\n      };\n      tx.onerror = () => {\n        this.record('save-error', { error: errorString(tx.error), context: 'captures' });\n      };\n    } catch (e) {\n      this.record('save-error', { error: errorString(e), context: 'captures' });\n    }\n  }\n\n  /**\n   * Lazy fetch of a single capture's full body, for the inspector's\n   * \"view raw body\" affordance when callers want to deal with a stub\n   * rather than pay the eager-join cost.\n   */\n  async getFullBody(captureId: string): Promise<unknown | null> {\n    if (!this.dbAvailable || !this.db) return null;\n    return new Promise<unknown | null>((resolve) => {\n      try {\n        const tx = this.db!.transaction(STORE_BODIES, 'readonly');\n        const store = tx.objectStore(STORE_BODIES);\n        const req = store.get(bodyKey(this.tabId, captureId));\n        req.onerror = () => {\n          this.record('load-error', { error: errorString(req.error), context: 'bodies' });\n          resolve(null);\n        };\n        req.onsuccess = () => {\n          const env = req.result as PersistedBodyEnvelope | undefined;\n          resolve(env?.body ?? null);\n        };\n      } catch (e) {\n        this.record('load-error', { error: errorString(e), context: 'bodies' });\n        resolve(null);\n      }\n    });\n  }\n\n  async loadDismissed(): Promise<Set<string>> {\n    if (!this.dbAvailable || !this.db) return new Set();\n    return new Promise<Set<string>>((resolve) => {\n      try {\n        const tx = this.db!.transaction(STORE_META, 'readonly');\n        const store = tx.objectStore(STORE_META);\n        const req = store.get(this.metaKey(META_KEY_DISMISSED));\n        req.onerror = () => {\n          this.record('load-error', { error: errorString(req.error), context: 'dismissed' });\n          resolve(new Set());\n        };\n        req.onsuccess = () => {\n          const raw = req.result as unknown;\n          if (Array.isArray(raw)) {\n            resolve(new Set(raw.filter((id: unknown): id is string => typeof id === 'string')));\n          } else {\n            resolve(new Set());\n          }\n        };\n      } catch (e) {\n        this.record('load-error', { error: errorString(e), context: 'dismissed' });\n        resolve(new Set());\n      }\n    });\n  }\n\n  saveDismissed(ids: Set<string>): void {\n    if (!this.dbAvailable || !this.db) return;\n    try {\n      const tx = this.db.transaction(STORE_META, 'readwrite');\n      tx.objectStore(STORE_META).put(Array.from(ids), this.metaKey(META_KEY_DISMISSED));\n      tx.onerror = () => {\n        this.record('save-error', { error: errorString(tx.error), context: 'dismissed' });\n      };\n    } catch (e) {\n      this.record('save-error', { error: errorString(e), context: 'dismissed' });\n    }\n  }\n\n  /**\n   * Clears this tab's captures and dismissed set. Other tabs' state is\n   * untouched — a \"Clear\" in tab A must not nuke tab B's history.\n   */\n  async clear(): Promise<void> {\n    if (!this.dbAvailable || !this.db) return;\n    if (this.debounceHandle) {\n      clearTimeout(this.debounceHandle);\n      this.debounceHandle = null;\n      this.pendingCaptures = null;\n    }\n    return new Promise<void>((resolve) => {\n      try {\n        const tx = this.db!.transaction([STORE_CAPTURES, STORE_META, STORE_BODIES], 'readwrite');\n        const captureStore = tx.objectStore(STORE_CAPTURES);\n        const metaStore = tx.objectStore(STORE_META);\n        const bodyStore = tx.objectStore(STORE_BODIES);\n\n        const indexReq = captureStore.getAll();\n        indexReq.onsuccess = () => {\n          const existing = (indexReq.result as PersistedCaptureEnvelope[]) ?? [];\n          for (const env of existing) {\n            if (env?.tabId === this.tabId && env.capture?.id) {\n              captureStore.delete(env.capture.id);\n            }\n          }\n        };\n        const bodyIndexReq = bodyStore.getAll();\n        bodyIndexReq.onsuccess = () => {\n          const existing = (bodyIndexReq.result as PersistedBodyEnvelope[]) ?? [];\n          for (const env of existing) {\n            if (env?.tabId === this.tabId && env.key) {\n              bodyStore.delete(env.key);\n            }\n          }\n        };\n        metaStore.delete(this.metaKey(META_KEY_DISMISSED));\n\n        tx.oncomplete = () => {\n          this.record('cleared');\n          resolve();\n        };\n        tx.onerror = () => {\n          this.record('save-error', { error: errorString(tx.error), context: 'clear' });\n          resolve();\n        };\n      } catch (e) {\n        this.record('save-error', { error: errorString(e), context: 'clear' });\n        resolve();\n      }\n    });\n  }\n\n  private metaKey(key: string): string {\n    // Per-tab namespace so dismissed sets stay isolated alongside captures.\n    return `${this.tabId}:${key}`;\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, combineLatest, Observable } from 'rxjs';\nimport { distinctUntilChanged, map } from 'rxjs/operators';\nimport { CaptureEntry } from '../bq-lens.types';\nimport { DevCacheStorageService } from './dev-cache-storage.service';\n\nexport type BqRequestKind = 'start project' | 'start task' | 'start flow' | 'load session' | 'refresh' | 'end session' | 'request';\n\nexport function classifyBqUrl(url: string): BqRequestKind {\n  if (/\\/start_flow\\b/.test(url)) return 'start flow';\n  if (/\\/start_task\\b/.test(url)) return 'start task';\n  if (/\\/start\\b/.test(url)) return 'start project';\n  if (/\\/load\\b/.test(url)) return 'load session';\n  if (/\\/refresh\\b/.test(url)) return 'refresh';\n  if (/\\/end\\b/.test(url)) return 'end session';\n  return 'request';\n}\n\nfunction isStartKind(kind: BqRequestKind): boolean {\n  return kind === 'start project' || kind === 'start flow' || kind === 'start task';\n}\n\nexport function isFatalStartFailure(entry: CaptureEntry): boolean {\n  if (!isStartKind(classifyBqUrl(entry.url))) return false;\n  return entry.status === 0 || entry.status >= 400;\n}\n\nexport function isSuccessfulStart(entry: CaptureEntry): boolean {\n  if (!isStartKind(classifyBqUrl(entry.url))) return false;\n  return entry.status >= 200 && entry.status < 300;\n}\n\nexport function isInflightCriticalError(entry: CaptureEntry): boolean {\n  // Transient critical errors that happen *after* the project has started.\n  // Excludes start_* failures — those are surfaced by fatalError$ and stay\n  // sticky until the project starts successfully or the user dismisses them.\n  if (isFatalStartFailure(entry)) return false;\n  if (entry.status === 0) return true;\n  if (entry.status >= 500) return true;\n  if (entry.status >= 400 && classifyBqUrl(entry.url) !== 'request') return true;\n  return false;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class DevCaptureService {\n  // Starts empty; hydrate$ fires once IDB load resolves and merges any\n  // pre-hydration in-memory captures with the persisted set.\n  private _captures$ = new BehaviorSubject<CaptureEntry[]>([]);\n  readonly captures$: Observable<CaptureEntry[]> = this._captures$.asObservable();\n\n  private _lastKeepalive$ = new BehaviorSubject<Date | null>(null);\n  readonly lastKeepalive$: Observable<Date | null> = this._lastKeepalive$.asObservable();\n\n  private _dismissedErrorIds$ = new BehaviorSubject<Set<string>>(new Set());\n\n  // Sticky: the failed start that has not yet been followed by a successful\n  // start. Lives outside the 50-entry FIFO so it stays visible as long as the\n  // app hasn't actually started.\n  private _lastFatalError$ = new BehaviorSubject<CaptureEntry | null>(null);\n\n  readonly fatalError$: Observable<CaptureEntry | null> = combineLatest([\n    this._lastFatalError$,\n    this._dismissedErrorIds$,\n  ]).pipe(\n    map(([entry, dismissed]) => (entry && !dismissed.has(entry.id) ? entry : null)),\n    distinctUntilChanged((a, b) => a?.id === b?.id),\n  );\n\n  readonly inflightError$: Observable<CaptureEntry | null> = combineLatest([\n    this._captures$,\n    this._dismissedErrorIds$,\n  ]).pipe(\n    map(([entries, dismissed]) =>\n      entries.find(e => isInflightCriticalError(e) && !dismissed.has(e.id)) ?? null,\n    ),\n    distinctUntilChanged((a, b) => a?.id === b?.id),\n  );\n\n  // Resolves true once IDB hydration has finished (or fast-failed). Consumers\n  // that want to delay one-shot work — e.g. cache rehydration from persisted\n  // captures — should await this instead of subscribing to captures$ blind.\n  readonly hydrated$: Observable<boolean>;\n\n  captureActive = true;\n\n  constructor(private readonly storage: DevCacheStorageService) {\n    this.hydrated$ = this.hydrate();\n  }\n\n  private hydrate(): Observable<boolean> {\n    const result = new BehaviorSubject<boolean>(false);\n    Promise.all([this.storage.loadCaptures(), this.storage.loadDismissed()])\n      .then(([loaded, dismissed]) => {\n        // Merge by id: in-memory wins (live captures may have arrived during\n        // hydration). Cap at 50 to match the FIFO ceiling.\n        const inMem = this._captures$.value;\n        const seenIds = new Set(inMem.map(e => e.id));\n        const merged = [...inMem];\n        for (const entry of loaded) {\n          if (!seenIds.has(entry.id)) merged.push(entry);\n        }\n        merged.sort((a, b) => (b.timestamp || '').localeCompare(a.timestamp || ''));\n        const next = merged.slice(0, 50);\n        if (next.length || inMem.length === 0) {\n          this._captures$.next(next);\n          this._lastFatalError$.next(this.deriveFatalFromCaptures(next));\n        }\n        if (dismissed.size) {\n          // Union with any in-memory dismissals (a user could click \"dismiss\"\n          // before hydration completes).\n          const union = new Set(this._dismissedErrorIds$.value);\n          for (const id of dismissed) union.add(id);\n          this._dismissedErrorIds$.next(union);\n        }\n        result.next(true);\n      })\n      .catch(() => result.next(true));\n    return result.asObservable().pipe(distinctUntilChanged());\n  }\n\n  recordKeepalive(): void {\n    this._lastKeepalive$.next(new Date());\n  }\n\n  /**\n   * Most recent capture in the rolling FIFO whose responseBody contains the\n   * given element key — either as a top-level `elements[].key` (load /\n   * refresh / start_*) or as an `events[].changes.changes[]` add with a\n   * matching `model.key`. Used to backlink the inspector to its sourcing\n   * capture. Returns null if the capture has rolled off or never existed.\n   */\n  findCaptureForElement(elementKey: string): CaptureEntry | null {\n    if (!elementKey) return null;\n    for (const entry of this._captures$.value) {\n      const body = entry.responseBody;\n      if (!body) continue;\n      if (Array.isArray(body.elements) && body.elements.some((e: any) => e?.key === elementKey)) {\n        return entry;\n      }\n      if (Array.isArray(body.events)) {\n        for (const ev of body.events) {\n          // A malformed `changes` envelope (object present, but inner array\n          // missing or wrong type) used to be treated as \"no match\" — same\n          // silent drop the cache layer's extractChanges now logs against.\n          // Keep this read-only path tolerant (we don't have the cache event\n          // ring here), but prefer the *strict* shape so we don't accept\n          // arbitrary truthy values as valid changes.\n          const envelope = (ev as any)?.changes;\n          const changes = envelope && Array.isArray(envelope.changes) ? envelope.changes : null;\n          if (changes && changes.some((c: any) => c?.type === 'add' && c?.model?.key === elementKey)) {\n            return entry;\n          }\n        }\n      }\n    }\n    return null;\n  }\n\n  get captures(): CaptureEntry[] {\n    return this._captures$.value;\n  }\n\n  /**\n   * Dismiss every active error notification at once. Clears the sticky fatal\n   * slot outright (so even a future re-emission with the same id stays gone),\n   * and marks every currently-known critical capture as dismissed so the\n   * inflight banner doesn't pop back up for failures the user already saw.\n   * One dismiss = silence everything until something genuinely new fails.\n   */\n  dismissAllErrors(): void {\n    this._lastFatalError$.next(null);\n    const dismissed = new Set(this._dismissedErrorIds$.value);\n    for (const entry of this._captures$.value) {\n      if (isFatalStartFailure(entry) || isInflightCriticalError(entry)) {\n        dismissed.add(entry.id);\n      }\n    }\n    this._dismissedErrorIds$.next(dismissed);\n    this.storage.saveDismissed(dismissed);\n  }\n\n  logCapture(entry: CaptureEntry): void {\n    if (!this.captureActive) return;\n    const next = [entry, ...this._captures$.value].slice(0, 50);\n    this._captures$.next(next);\n    this.storage.saveCaptures(next);\n\n    // Update the sticky fatal slot. A successful start clears any prior\n    // failure (the app is alive again); a fresh start failure replaces it.\n    if (isSuccessfulStart(entry)) {\n      this._lastFatalError$.next(null);\n    } else if (isFatalStartFailure(entry)) {\n      this._lastFatalError$.next(entry);\n    }\n  }\n\n  toggleCapture(): void {\n    this.captureActive = !this.captureActive;\n  }\n\n  clearCaptures(): void {\n    this._captures$.next([]);\n    this._dismissedErrorIds$.next(new Set());\n    this._lastFatalError$.next(null);\n    void this.storage.clear();\n  }\n\n  /**\n   * Walk captures newest-first; return the first fatal start failure unless\n   * a successful start appears later (i.e. earlier in the list, since list\n   * is newest-first). Used to seed the sticky slot from persisted state.\n   */\n  private deriveFatalFromCaptures(entries: CaptureEntry[]): CaptureEntry | null {\n    for (const entry of entries) {\n      if (isSuccessfulStart(entry)) return null;\n      if (isFatalStartFailure(entry)) return entry;\n    }\n    return null;\n  }\n}\n","import { Inject, Injectable, Optional } from '@angular/core';\nimport { Backend } from '@blueriq/angular/backend/common';\nimport { Observable, Subject } from 'rxjs';\nimport { BqLensConfig, BQ_LENS_CONFIG } from '../bq-lens.config';\n\n/**\n * Resolve the Blueriq runtime base URL the interceptor should watch.\n *\n * Resolution chain:\n *   1. `BqLensConfig.blueriqBaseUrl` (explicit override).\n *   2. `Backend.toUrl('')` — public Blueriq API. When the host registers\n *      `V2BackendModule.forRoot({ baseUrl })` the `Backend` token resolves to\n *      a `V2Backend` configured with that URL. `toUrl('')` returns it.\n *   3. URL sniffing — the interceptor calls `observe(url)` on every outgoing\n *      request; the first URL matching a known Blueriq endpoint shape\n *      yields the base prefix. Fallback for hosts without a `Backend` provider.\n *\n * Sniffing emits on `learned$` so the interceptor can replay any requests\n * it buffered before learning settled.\n */\n/**\n * Specific-shape patterns checked in order. Each captures the prefix before a\n * known Blueriq endpoint signature. Reuses the same surface as `classifyBqUrl`\n * (start, start_flow, start_task, load, refresh, end) so any URL the panel\n * already classifies also serves as a teaching request.\n */\nconst BLUERIQ_URL_PATTERNS: readonly RegExp[] = [\n  /^(.+?)\\/api\\/v\\d+\\/session\\b/,\n  /^(.+?)\\/api\\/v\\d+\\/(?:start_flow|start_task|start|load|refresh|end)\\b/,\n  /^(.+)\\/keepalive\\b/,\n  // Generic /api/v\\d+/ — broader catch-all, kept last so the specific shapes win first.\n  /^(.+?)\\/api\\/v\\d+\\b/,\n];\n\n@Injectable({ providedIn: 'root' })\nexport class DevBaseUrlService {\n  private learned: string | null = null;\n  private readonly _learned$ = new Subject<string>();\n  /** Fires once when sniffing locks in a base URL. Lets the interceptor replay any requests it buffered before learning. */\n  readonly learned$: Observable<string> = this._learned$.asObservable();\n\n  constructor(\n    @Inject(BQ_LENS_CONFIG) private config: BqLensConfig,\n    @Optional() private backend: Backend | null,\n  ) {}\n\n  /** Resolved base URL, or '' when no source is available yet. */\n  get(): string {\n    if (this.config.blueriqBaseUrl) return this.config.blueriqBaseUrl;\n    const fromBackend = this.backend?.toUrl('') ?? '';\n    if (fromBackend) return fromBackend;\n    return this.learned ?? '';\n  }\n\n  /** Inspect an outgoing URL; if it matches a Blueriq shape, lock in the prefix. */\n  observe(url: string): void {\n    if (this.get()) return; // already resolved (config / Backend / prior sniff)\n    for (const pattern of BLUERIQ_URL_PATTERNS) {\n      const match = pattern.exec(url);\n      if (match) { this.lockIn(match[1]); return; }\n    }\n  }\n\n  private lockIn(baseUrl: string): void {\n    this.learned = baseUrl;\n    this._learned$.next(baseUrl);\n    this._learned$.complete();\n  }\n}\n","import { Injectable } from '@angular/core';\nimport {\n  HttpErrorResponse,\n  HttpEvent,\n  HttpHandler,\n  HttpInterceptor,\n  HttpRequest,\n  HttpResponse,\n} from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { tap } from 'rxjs/operators';\nimport { CaptureEntry } from '../bq-lens.types';\nimport { DevBaseUrlService } from './dev-base-url.service';\nimport { DevCaptureService } from './dev-capture.service';\n\n/** Cap on entries held while the base URL is being learned — bounds memory if learning never happens. */\nconst PENDING_BUFFER_LIMIT = 100;\n\n@Injectable()\nexport class DevInterceptor implements HttpInterceptor {\n  /** Captures collected before the base URL was known. Replayed once the resolver locks one in. */\n  private pending: CaptureEntry[] = [];\n\n  constructor(\n    private captureService: DevCaptureService,\n    private baseUrlService: DevBaseUrlService,\n  ) {\n    this.baseUrlService.learned$.subscribe((baseUrl) => this.flushPending(baseUrl));\n  }\n\n  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n    this.baseUrlService.observe(req.url);\n\n    if (req.url.endsWith('/keepalive')) {\n      this.captureService.recordKeepalive();\n      return next.handle(req);\n    }\n\n    if (!this.captureService.captureActive) {\n      return next.handle(req);\n    }\n\n    const startTime = Date.now();\n    const timestamp = new Date().toISOString();\n\n    const buildEntry = (status: number, responseBody: unknown): CaptureEntry => ({\n      id: Math.random().toString(36).slice(2, 9),\n      method: req.method,\n      url: req.urlWithParams,\n      status,\n      timestamp,\n      duration_ms: Date.now() - startTime,\n      requestBody: req.body ?? undefined,\n      responseBody: responseBody ?? undefined,\n    });\n\n    const route = (entry: CaptureEntry): void => {\n      const baseUrl = this.baseUrlService.get();\n      if (baseUrl) {\n        if (entry.url.includes(baseUrl)) this.captureService.logCapture(entry);\n      } else {\n        this.pending.push(entry);\n        if (this.pending.length > PENDING_BUFFER_LIMIT) this.pending.shift();\n      }\n    };\n\n    return next.handle(req).pipe(\n      tap({\n        next: (event) => {\n          if (event instanceof HttpResponse) route(buildEntry(event.status, event.body));\n        },\n        error: (error: HttpErrorResponse) => {\n          route(buildEntry(error.status || 0, error.error));\n        },\n      }),\n    );\n  }\n\n  /** Replay pre-learning entries that turn out to belong to the now-known base URL. */\n  private flushPending(baseUrl: string): void {\n    const matched = this.pending.filter((e) => e.url.includes(baseUrl));\n    this.pending = [];\n    for (const entry of matched) this.captureService.logCapture(entry);\n  }\n}\n","import { Injectable, NgZone, ɵgetLContext } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { Element as BlueriqElement } from '@blueriq/core';\n\nconst BLUERIQ_TYPES = new Set([\n  'field', 'container', 'page', 'button', 'link',\n  'textitem', 'asset', 'image', 'contentitem', 'failedelement',\n]);\n\n// Built up by intercepting Blueriq's dev-mode `console.table` dump in\n// `provideCompiledComponentResolver`. Keyed on `componentType` (class name).\n// `selector` is the matcher string from `matcher.toString()` (e.g.\n// `[contentStyle=hint]`) or undefined when the component matches purely by\n// element type. `elementType` is the Blueriq class name (e.g. `Field`) — kept\n// so we can compose a fully-qualified selector like `field[contentStyle=hint]`\n// even when the matcher omits the type prefix.\ninterface BlueriqRegistryEntry { elementType: string; selector: string | undefined; priority: number | undefined; }\nconst blueriqSelectorMap = new Map<string, BlueriqRegistryEntry>();\nlet consoleTableInterceptorInstalled = false;\n\n/**\n * Wrap `console.table` so we can capture Blueriq's dev-mode component dump.\n * Always passes through to the original — the developer's console output is\n * unchanged. The dump fires once per `provideCompiledComponentResolver` call\n * (one per Blueriq feature module); we merge each into the same map so\n * lazy-loaded modules are picked up too.\n *\n * Installed at file evaluation time so it's in place before any Blueriq view\n * renders (the resolver factory only fires on first injection during view\n * resolution).\n *\n * **Host-app prerequisites for the dump to fire** (and thus for the inspector\n * popup's \"Blueriq selector\" + \"Angular class\" rows to populate):\n *\n * 1. Blueriq must be configured with `logComponents: true` (the default).\n *    Toggling it off at config time silences the dump entirely.\n * 2. The host app must run with Angular dev mode active — i.e. no\n *    `enableProdMode()` call AND the Angular CLI build must NOT have\n *    `optimization`, `buildOptimizer`, or `aot` enabled. Those flags\n *    statically fold `if (isDevMode())` to `false` and dead-code-eliminate\n *    the dump even when `environment.production === false`. If `typeof\n *    ngDevMode !== 'undefined' && ngDevMode` is falsy in the running app's\n *    console, the dump has been stripped at build time.\n *\n * Class names also rely on Angular dev mode being active: minified production\n * builds mangle `cls.name`, breaking the lookup key. bq-lens is a dev-only\n * overlay so this is acceptable, but it is the reason the \"Angular class\" row\n * may show garbage characters in misconfigured builds.\n */\nexport function installBlueriqConsoleTableInterceptor(): void {\n  if (consoleTableInterceptorInstalled) return;\n  consoleTableInterceptorInstalled = true;\n  const original = console.table?.bind(console);\n  if (!original) return;\n  console.table = function patched(this: unknown, data?: unknown, ...rest: unknown[]): void {\n    try {\n      if (Array.isArray(data) && data.length > 0) {\n        const sample = data[0] as Record<string, unknown>;\n        if (sample && typeof sample === 'object'\n          && 'elementType' in sample\n          && 'componentType' in sample\n          && 'selector' in sample\n          && 'priority' in sample) {\n          for (const row of data as Array<Record<string, unknown>>) {\n            const name = row['componentType'];\n            const elementType = row['elementType'];\n            if (typeof name !== 'string' || typeof elementType !== 'string') continue;\n            const sel = row['selector'];\n            const pri = row['priority'];\n            blueriqSelectorMap.set(name, {\n              elementType,\n              selector: typeof sel === 'string' ? sel : undefined,\n              priority: typeof pri === 'number' ? pri : undefined,\n            });\n          }\n        }\n      }\n    } catch { /* never let the interceptor break console.table */ }\n    return original(data as never, ...rest);\n  };\n}\n\ninstallBlueriqConsoleTableInterceptor();\n\nexport interface PickedElement {\n  element: BlueriqElement;\n  host: HTMLElement;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class DevPickerService {\n  readonly picked$ = new Subject<PickedElement>();\n\n  isActive = false;\n  private hoverNode: HTMLElement | null = null;\n  private overlay: HTMLDivElement | null = null;\n\n  constructor(private zone: NgZone) {}\n\n  activate(): void {\n    this.isActive = true;\n    document.body.style.cursor = 'crosshair';\n    document.addEventListener('click', this.onPickerClick, { capture: true });\n    document.addEventListener('mousemove', this.onPickerMove);\n  }\n\n  deactivate(): void {\n    this.isActive = false;\n    document.body.style.cursor = '';\n    document.removeEventListener('click', this.onPickerClick, true);\n    document.removeEventListener('mousemove', this.onPickerMove);\n    this.hoverNode = null;\n  }\n\n  showOverlay(el: HTMLElement, mode: 'hover' | 'selected' = 'selected'): void {\n    if (!this.overlay) {\n      this.overlay = document.createElement('div');\n      Object.assign(this.overlay.style, {\n        position: 'fixed',\n        pointerEvents: 'none',\n        boxSizing: 'border-box',\n        zIndex: '9999',\n        borderRadius: '2px',\n      });\n      document.body.appendChild(this.overlay);\n    }\n    const r = el.getBoundingClientRect();\n    if (r.width === 0 && r.height === 0) {\n      this.overlay.style.display = 'none';\n      return;\n    }\n    Object.assign(this.overlay.style, {\n      display: '',\n      left: r.left + 'px',\n      top: r.top + 'px',\n      width: r.width + 'px',\n      height: r.height + 'px',\n      background: mode === 'hover' ? 'rgba(180,180,180,0.15)' : 'rgba(180,180,180,0.25)',\n      border: mode === 'hover' ? '2px dashed rgba(255,255,255,0.9)' : '2px solid rgba(255,255,255,0.95)',\n      boxShadow: mode === 'hover'\n        ? '0 0 0 1px rgba(0,0,0,0.25)'\n        : '0 0 0 1px rgba(0,0,0,0.4)',\n    });\n  }\n\n  animateOverlay(): void {\n    if (!this.overlay) return;\n    this.overlay.style.transition =\n      'left 220ms ease-out, top 220ms ease-out, width 220ms ease-out, height 220ms ease-out';\n    setTimeout(() => { if (this.overlay) this.overlay.style.transition = ''; }, 280);\n  }\n\n  removeOverlay(): void {\n    this.overlay?.remove();\n    this.overlay = null;\n  }\n\n  flashOverlay(): void {\n    if (!this.overlay) return;\n    this.overlay.classList.add('dev-picker-overlay--flash');\n    setTimeout(() => this.overlay?.classList.remove('dev-picker-overlay--flash'), 450);\n  }\n\n  updateOverlayRect(el: HTMLElement): void {\n    if (!this.overlay) return;\n    const r = el.getBoundingClientRect();\n    Object.assign(this.overlay.style, {\n      left: r.left + 'px',\n      top: r.top + 'px',\n      width: r.width + 'px',\n      height: r.height + 'px',\n    });\n  }\n\n  positionPopup(\n    hostEl: HTMLElement,\n    popupW = 440,\n    popupH = 480,\n    preferredSide: 'left' | 'right' | null = null,\n    excludeRect: { left: number; right: number } | null = null,\n  ): { left: number; top: number; side: 'left' | 'right' } {\n    const rect = hostEl.getBoundingClientRect();\n    // Trim usable horizontal range by the dev panel when it's docked and\n    // visible — otherwise wide hosts pin the popup against the viewport\n    // edge and it ends up under the panel.\n    let minX = 8;\n    let maxX = window.innerWidth - 8;\n    if (excludeRect && excludeRect.right > 0 && excludeRect.left < window.innerWidth) {\n      const dockedLeft = excludeRect.left <= 0;\n      const dockedRight = excludeRect.right >= window.innerWidth;\n      if (dockedLeft) minX = Math.max(minX, excludeRect.right + 8);\n      else if (dockedRight) maxX = Math.min(maxX, excludeRect.left - 8);\n    }\n    const fitsRight = rect.right + 10 + popupW <= maxX;\n    const fitsLeft = rect.left - popupW - 10 >= minX;\n    // Sticky side: keep the previously chosen side if it still fits, so a\n    // sub-pixel scroll wobble around the boundary doesn't flip the popup.\n    let side: 'left' | 'right';\n    if (preferredSide === 'right' && fitsRight) side = 'right';\n    else if (preferredSide === 'left' && fitsLeft) side = 'left';\n    else if (fitsRight) side = 'right';\n    else if (fitsLeft) side = 'left';\n    else side = 'right';\n    let left = side === 'right' ? rect.right + 10 : rect.left - popupW - 10;\n    left = Math.max(minX, Math.min(left, maxX - popupW));\n    let top = rect.top;\n    top = Math.max(8, Math.min(top, window.innerHeight - popupH - 8));\n    return { left, top, side };\n  }\n\n  scrollToHostIfNeeded(host: HTMLElement): void {\n    const r = host.getBoundingClientRect();\n    const inView = r.top >= 0 && r.bottom <= window.innerHeight\n      && r.left >= 0 && r.right <= window.innerWidth;\n    if (!inView) host.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'nearest' });\n  }\n\n  getComponentClass(el: HTMLElement): Function | null {\n    try {\n      const lctx: any = ɵgetLContext(el);\n      const instance = lctx?.component ?? lctx?.lView?.[8] ?? null;\n      return instance?.constructor ?? null;\n    } catch { return null; }\n  }\n\n  getAngularSelector(cls: Function): string | null {\n    try {\n      const cmp = (cls as any).ɵcmp;\n      if (!cmp) return null;\n      const sel = cmp.selectors?.[0]?.[0];\n      return typeof sel === 'string' ? sel : null;\n    } catch { return null; }\n  }\n\n  private readonly _loggedClasses = new WeakSet<Function>();\n\n  /**\n   * Returns the fully-qualified Blueriq selector for the picked class —\n   * `<type><matcher>`, e.g. `field[contentStyle=hint]`. Composed from the two\n   * columns of Blueriq's component registry dump:\n   *\n   *   - `elementType` (lowercased) — always present, gives the element-type\n   *     prefix even when the registered matcher omitted it.\n   *   - `selector` — the `matcher.toString()` value, or undefined when the\n   *     component matches purely by element type.\n   *\n   * If the matcher already starts with the type prefix, the prefix is not\n   * doubled. If there's no matcher, the bare lowercased element type is\n   * returned (e.g. `textitem`) — that *is* the selector for that registration.\n   *\n   * Returns null only when the class isn't in the registry (non-Blueriq\n   * component, or the dump hasn't fired — typically because Blueriq's\n   * `logComponents` is off or Angular dev mode was stripped at build time).\n   * Each distinct miss is logged once per class for diagnostics.\n   */\n  getBlueriqSelector(_host: HTMLElement, cls: Function): string | null {\n    const name = cls.name;\n    if (!name) return null;\n    const entry = blueriqSelectorMap.get(name);\n    if (!entry) {\n      this._logSelectorMiss(cls);\n      return null;\n    }\n    const typePrefix = entry.elementType.toLowerCase();\n    if (!entry.selector) return typePrefix;\n    return entry.selector.startsWith(typePrefix)\n      ? entry.selector\n      : typePrefix + entry.selector;\n  }\n\n  /** The Blueriq registry priority for `cls`, or null if not registered or\n   *  the priority column was missing from the dump. */\n  getBlueriqSelectorPriority(cls: Function): number | null {\n    const entry = blueriqSelectorMap.get(cls.name);\n    return entry?.priority ?? null;\n  }\n\n  private _logSelectorMiss(cls: Function): void {\n    if (this._loggedClasses.has(cls)) return;\n    this._loggedClasses.add(cls);\n    const name = cls.name || '<anonymous component>';\n    console.info(\n      `[bq-lens] No Blueriq selector for ${name}: not in the captured component registry. ` +\n      'Either it is a non-Blueriq Angular component, or Blueriq dev-mode logging (logComponents) is off.',\n    );\n  }\n\n\n  getBlueriqTypeOf(el: HTMLElement): string | null {\n    try {\n      const lctx: any = ɵgetLContext(el);\n      const instance = lctx?.component ?? lctx?.lView?.[8] ?? null;\n      const bqEl = instance ? this.blueriqElementOf(instance) : null;\n      return bqEl?.type ?? null;\n    } catch { return null; }\n  }\n\n  findElementAndHost(target: HTMLElement): { element: BlueriqElement | null; host: HTMLElement } {\n    let node: HTMLElement | null = target;\n    while (node && node !== document.body) {\n      try {\n        const lctx: any = ɵgetLContext(node);\n        if (lctx) {\n          const comp = lctx.component ?? lctx.lView?.[8] ?? null;\n          if (comp && typeof comp === 'object') {\n            const el = this.blueriqElementOf(comp);\n            if (el) return { element: el, host: node };\n          }\n        }\n      } catch { /* non-Angular node */ }\n      node = node.parentElement;\n    }\n    return { element: null, host: target };\n  }\n\n  findHostByKey(key: string, root: HTMLElement): HTMLElement | null {\n    const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT);\n    let firstMatch: HTMLElement | null = null;\n    let node = walker.nextNode();\n    while (node) {\n      try {\n        const lctx: any = ɵgetLContext(node as HTMLElement);\n        if (lctx) {\n          const comp = lctx.component ?? lctx.lView?.[8] ?? null;\n          if (comp && typeof comp === 'object') {\n            const el = this.blueriqElementOf(comp);\n            if (el?.key === key) {\n              const el = node as HTMLElement;\n              const r = el.getBoundingClientRect();\n              if (r.width > 0 || r.height > 0) return el; // prefer visible\n              if (!firstMatch) firstMatch = el;            // remember first as fallback\n            }\n          }\n        }\n      } catch { /* non-Angular node */ }\n      node = walker.nextNode();\n    }\n    return firstMatch;\n  }\n\n  /**\n   * Walks `root`'s DOM descendants and yields the immediate Blueriq\n   * children — the first Blueriq element encountered along each\n   * downward path. Used by the inspector's background warm to seed\n   * the template memo for likely next-navigations. Bounded so a\n   * pathologically-deep host doesn't camp the idle tick.\n   */\n  findImmediateBlueriqChildren(root: HTMLElement, limit = 16): Array<{ element: BlueriqElement; host: HTMLElement }> {\n    const out: Array<{ element: BlueriqElement; host: HTMLElement }> = [];\n    const seenKeys = new Set<string>();\n    // BFS — first hit per branch is the immediate Blueriq child.\n    const queue: HTMLElement[] = [];\n    for (const child of Array.from(root.children) as HTMLElement[]) queue.push(child);\n    let visited = 0;\n    while (queue.length && out.length < limit) {\n      const node = queue.shift()!;\n      if (++visited > 500) break;\n      try {\n        const lctx: any = ɵgetLContext(node);\n        const comp = lctx?.component ?? lctx?.lView?.[8] ?? null;\n        if (comp && typeof comp === 'object') {\n          const el = this.blueriqElementOf(comp);\n          if (el && !seenKeys.has(el.key)) {\n            seenKeys.add(el.key);\n            out.push({ element: el, host: node });\n            // Don't descend past a Blueriq element — it's a different\n            // subtree and its own descendants aren't *our* children.\n            continue;\n          }\n        }\n      } catch { /* non-Angular node */ }\n      for (const child of Array.from(node.children) as HTMLElement[]) queue.push(child);\n    }\n    return out;\n  }\n\n  findCurrentPageWithHost(): { element: BlueriqElement; host: HTMLElement } | null {\n    for (const el of Array.from(document.body.querySelectorAll('*'))) {\n      if ((el as any).__ngContext__ === undefined) continue;\n      try {\n        const lctx: any = ɵgetLContext(el as HTMLElement);\n        if (!lctx) continue;\n        const comp = lctx.component ?? lctx.lView?.[8] ?? null;\n        if (!comp || typeof comp !== 'object') continue;\n        const bqEl = this.blueriqElementOf(comp);\n        if (bqEl?.type === 'page') return { element: bqEl, host: el as HTMLElement };\n      } catch { /* non-Angular node */ }\n    }\n    return null;\n  }\n\n  private blueriqElementOf(instance: any): BlueriqElement | null {\n    if (!instance || typeof instance !== 'object') return null;\n    for (const key of Object.keys(instance)) {\n      try {\n        const val = instance[key];\n        if (val && typeof val === 'object'\n          && typeof val.key === 'string'\n          && typeof val.type === 'string'\n          && BLUERIQ_TYPES.has(val.type)) {\n          return val as BlueriqElement;\n        }\n      } catch { /* skip getters that throw */ }\n    }\n    return null;\n  }\n\n  private readonly onPickerClick = (e: MouseEvent): void => {\n    const target = e.target as HTMLElement;\n    // Let clicks inside the bq-lens panel through — otherwise the picker\n    // toggle button can't be reached to deactivate the mode.\n    if (target.closest('bq-lens-panel')) return;\n    e.preventDefault();\n    e.stopPropagation();\n    const { element, host } = this.findElementAndHost(target);\n    if (!element) return; // no Blueriq element here — stay active\n    this.zone.run(() => {\n      this.deactivate();\n      this.picked$.next({ element, host });\n    });\n  };\n\n  private readonly onPickerMove = (e: MouseEvent): void => {\n    const target = e.target as HTMLElement;\n    if (target.closest('bq-lens-panel')) {\n      if (this.overlay) this.overlay.style.display = 'none';\n      this.hoverNode = null;\n      return;\n    }\n    const { element, host } = this.findElementAndHost(target);\n    if (!element) {\n      if (this.overlay) this.overlay.style.display = 'none';\n      this.hoverNode = null;\n      return;\n    }\n    if (this.overlay) this.overlay.style.display = '';\n    if (host !== this.hoverNode) {\n      this.hoverNode = host;\n      this.showOverlay(host, 'hover');\n    }\n  };\n}\n","// Centralised animation timings so the panel's motion language stays\n// cohesive. Strings are passed verbatim to Angular's `animate()` and follow\n// the `<duration> <easing>` format. Tuning a value here updates every\n// trigger that references it.\n\nexport const ANIMATION_TIMING = {\n  /** Banner enter — small overshoot for emphasis on error/info banners. */\n  bannerEnter: '240ms cubic-bezier(.34, 1.56, .64, 1)',\n  /** Banner leave — plain ease-in so dismiss feels decisive, not springy. */\n  bannerLeave: '160ms ease-in',\n  /** Section / capture-detail expand. Paired with `collapse` below. */\n  expand: '180ms ease-out',\n  /** Section / capture-detail collapse. Paired with `expand` above. */\n  collapse: '150ms ease-in',\n  /** Tour overlay fade in. */\n  tourFadeIn: '200ms ease-out',\n  /** Tour overlay fade out. */\n  tourFadeOut: '150ms ease-in',\n} as const;\n\nexport type AnimationTimingKey = keyof typeof ANIMATION_TIMING;\n","export function httpStatusClass(status: number): 'ok' | 'warn' | 'error' {\n  if (status >= 500) return 'error';\n  if (status >= 300) return 'warn';\n  return 'ok';\n}\n\nexport function isErrorStatus(status: number): boolean {\n  return status >= 400;\n}\n","interface SessionLookup {\n  getByIdOptionally(id: string): { sessionName: string } | null | undefined;\n}\n\nexport function extractSessionId(url: string): string | null {\n  const m = url.match(/\\/session\\/([^/]+)\\//);\n  return m ? m[1] : null;\n}\n\nexport function shortUrl(url: string, registry: SessionLookup): string {\n  const match = url.match(/\\/session\\/([0-9a-f-]+)/i);\n  if (!match) return url.replace(/^https?:\\/\\/[^/]+/, '');\n  const session = registry.getByIdOptionally(match[1]);\n  return session ? session.sessionName : match[1].slice(0, 8);\n}\n\nexport function urlTooltip(url: string, registry: SessionLookup): string {\n  const match = url.match(/\\/session\\/([0-9a-f-]+)/i);\n  if (!match) return url;\n  const session = registry.getByIdOptionally(match[1]);\n  return session ? `Session: ${session.sessionName}\\n${url}` : url;\n}\n\nexport function urlType(url: string): string | null {\n  const seg = url.split('?')[0].split('/').filter(Boolean).pop() ?? '';\n  const known = ['event', 'load', 'shortcut', 'session'];\n  return known.includes(seg) ? seg : null;\n}\n\nexport function parseRoute(url: string): Record<string, string> | null {\n  const flowMatch = url.match(/\\/flow\\/([^/?]+)\\/([^/?]+)(?:\\/([^/?]+))?/);\n  if (flowMatch) return { project: flowMatch[1], flow: flowMatch[2], version: flowMatch[3] || '—' };\n  const sessionMatch = url.match(/\\/session\\/([^/?]+)/);\n  if (sessionMatch) return { sessionId: sessionMatch[1] };\n  const shortcutMatch = url.match(/\\/shortcut\\/([^/?]+)/);\n  if (shortcutMatch) return { shortcut: shortcutMatch[1] };\n  return null;\n}\n","/**\n * Parses JSON, returning `fallback` on null/undefined/empty input or parse error.\n * Replaces the `try { JSON.parse(x) } catch { return fallback }` pattern at sites\n * that don't need to distinguish between \"missing\" and \"malformed\".\n *\n * Pass `onError` if the call site cares about parse failures vs. missing input\n * — empty/null input is *not* a parse error and won't fire it. Used by the\n * element cache to surface corrupt persisted state in the Internals event\n * log instead of silently swallowing it.\n */\nexport function safeJsonParse<T>(\n  raw: string | null | undefined,\n  fallback: T,\n  onError?: (error: unknown, raw: string) => void,\n): T {\n  if (!raw) return fallback;\n  try {\n    return JSON.parse(raw) as T;\n  } catch (e) {\n    onError?.(e, raw);\n    return fallback;\n  }\n}\n\n/**\n * Stringifies a value with a fallback for non-serialisable input (circular\n * refs, BigInt, etc.). `JSON.stringify(undefined)` returns `undefined` (not\n * a string), so the `?? fallback` path also handles \"the value can't even\n * round-trip through JSON\" without throwing.\n *\n * Pass `indent` (e.g. `2`) for pretty-printed output; omit for compact.\n */\nexport function safeStringify(\n  value: unknown,\n  fallback = '',\n  indent?: number,\n): string {\n  try {\n    return JSON.stringify(value, null, indent) ?? fallback;\n  } catch {\n    return fallback;\n  }\n}\n\n/**\n * Deep clone helper — used on writes to sessionLoadJsons so a mutation of\n * the source object (live `responseBody` shared with the captures$ list)\n * doesn't corrupt the stored snapshot. Prefers `structuredClone` (cheap,\n * native) and falls back to JSON-roundtrip when it isn't available or\n * trips on a non-cloneable value.\n */\nexport function cloneForStorage<T>(value: T): T {\n  if (typeof structuredClone === 'function') {\n    try {\n      return structuredClone(value);\n    } catch {\n      // Fall through to JSON-roundtrip on non-cloneable inputs.\n    }\n  }\n  try {\n    return JSON.parse(JSON.stringify(value)) as T;\n  } catch {\n    return value;\n  }\n}\n\n/**\n * Cheap value equality for the history ring's \"did the value actually\n * change?\" gate. Identity-equal primitives short-circuit; structured\n * values fall back to JSON-string comparison (acceptable because Blueriq\n * field values are small and the alternative — a deep-equal walk — is\n * more expensive than the JSON round-trip on the typical workload).\n */\nexport function valuesEqual(a: unknown, b: unknown): boolean {\n  if (Object.is(a, b)) return true;\n  if (a === undefined || b === undefined) return false;\n  if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) return false;\n  try {\n    return JSON.stringify(a) === JSON.stringify(b);\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Deduped FIFO append used by `__sources` and `__capturedIn`. If the value\n * is already present we move it to the front so the ring tracks\n * \"most-recent first\" without growing — this matters when a single source\n * dominates traffic but we still want to remember a rarely-seen earlier one.\n */\nexport function appendBoundedSet(\n  prev: unknown,\n  value: string | undefined | null,\n  max: number,\n): string[] {\n  const base = Array.isArray(prev)\n    ? prev.filter((v): v is string => typeof v === 'string' && v.length > 0)\n    : [];\n  if (!value) return base;\n  const filtered = base.filter(v => v !== value);\n  filtered.push(value);\n  if (filtered.length > max) filtered.splice(0, filtered.length - max);\n  return filtered;\n}\n","import { ChangeDetectionStrategy, Component, Input, ViewEncapsulation } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\n\nconst ICONS: Record<string, string> = {\n  'arrow-left': '<path d=\"m12 19-7-7 7-7\"/><path d=\"M19 12H5\"/>',\n  'arrow-right': '<path d=\"M5 12h14\"/><path d=\"m12 5 7 7-7 7\"/>',\n  ban: '<circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"m4.9 4.9 14.2 14.2\"/>',\n  check: '<path d=\"M20 6 9 17l-5-5\"/>',\n  'check-circle': '<path d=\"M21.8 10A10 10 0 1 1 17 3.3\"/><path d=\"m9 11 3 3L22 4\"/>',\n  clock: '<circle cx=\"12\" cy=\"12\" r=\"10\"/><polyline points=\"12 6 12 12 16 14\"/>',\n  'chevron-down': '<path d=\"m6 9 6 6 6-6\"/>',\n  'chevron-left': '<path d=\"m15 18-6-6 6-6\"/>',\n  'chevron-right': '<path d=\"m9 18 6-6-6-6\"/>',\n  'chevron-up': '<path d=\"m18 15-6-6-6 6\"/>',\n  'circle-notch': '<path d=\"M21 12a9 9 0 1 1-6.2-8.55\"/>',\n  cog: '<path d=\"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/>',\n  'comment-alt': '<path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"/>',\n  compass: '<circle cx=\"12\" cy=\"12\" r=\"10\"/><polygon points=\"16.24 7.76 14.12 14.12 7.76 16.24 9.88 9.88 16.24 7.76\"/>',\n  copy: '<rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/>',\n  crosshairs: '<circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"22\" x2=\"18\" y1=\"12\" y2=\"12\"/><line x1=\"6\" x2=\"2\" y1=\"12\" y2=\"12\"/><line x1=\"12\" x2=\"12\" y1=\"6\" y2=\"2\"/><line x1=\"12\" x2=\"12\" y1=\"22\" y2=\"18\"/>',\n  download: '<path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"/><polyline points=\"7 10 12 15 17 10\"/><line x1=\"12\" x2=\"12\" y1=\"15\" y2=\"3\"/>',\n  'exchange-alt': '<path d=\"M8 3 4 7l4 4\"/><path d=\"M4 7h16\"/><path d=\"m16 21 4-4-4-4\"/><path d=\"M20 17H4\"/>',\n  'exclamation-circle': '<circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"12\" x2=\"12\" y1=\"8\" y2=\"12\"/><line x1=\"12\" x2=\"12.01\" y1=\"16\" y2=\"16\"/>',\n  'exclamation-triangle': '<path d=\"m21.73 18-8-14a2 2 0 0 0-3.46 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\"/><line x1=\"12\" x2=\"12\" y1=\"9\" y2=\"13\"/><line x1=\"12\" x2=\"12.01\" y1=\"17\" y2=\"17\"/>',\n  'expand-alt': '<polyline points=\"15 3 21 3 21 9\"/><polyline points=\"9 21 3 21 3 15\"/><line x1=\"21\" x2=\"14\" y1=\"3\" y2=\"10\"/><line x1=\"3\" x2=\"10\" y1=\"21\" y2=\"14\"/>',\n  'file-alt': '<path d=\"M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z\"/><polyline points=\"14 2 14 8 20 8\"/><line x1=\"16\" x2=\"8\" y1=\"13\" y2=\"13\"/><line x1=\"16\" x2=\"8\" y1=\"17\" y2=\"17\"/><line x1=\"10\" x2=\"8\" y1=\"9\" y2=\"9\"/>',\n  'folder-open': '<path d=\"M6 14l1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.55 6a2 2 0 0 1-1.94 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.93a2 2 0 0 1 1.66.9l.82 1.2a2 2 0 0 0 1.66.9H18a2 2 0 0 1 2 2v2\"/>',\n  'grip-lines': '<line x1=\"3\" x2=\"21\" y1=\"9\" y2=\"9\"/><line x1=\"3\" x2=\"21\" y1=\"15\" y2=\"15\"/>',\n  'level-up-alt': '<polyline points=\"9 14 4 9 9 4\"/><path d=\"M20 20v-7a4 4 0 0 0-4-4H4\"/>',\n  'mouse-pointer': '<path d=\"M3 3l7.07 16.97 2.51-7.39 7.39-2.51L3 3z\"/><path d=\"m13 13 6 6\"/>',\n  palette: '<circle cx=\"13.5\" cy=\"6.5\" r=\".5\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"17.5\" cy=\"10.5\" r=\".5\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"8.5\" cy=\"7.5\" r=\".5\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"6.5\" cy=\"12.5\" r=\".5\" fill=\"currentColor\" stroke=\"none\"/><path d=\"M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10a1.7 1.7 0 0 0 1.7-1.7c0-.45-.17-.85-.45-1.15-.27-.3-.45-.7-.45-1.15A1.7 1.7 0 0 1 14.5 16.3H17a5 5 0 0 0 5-5C22 6 17.5 2 12 2z\"/>',\n  'pause-circle': '<circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"10\" x2=\"10\" y1=\"15\" y2=\"9\"/><line x1=\"14\" x2=\"14\" y1=\"15\" y2=\"9\"/>',\n  'play-circle': '<circle cx=\"12\" cy=\"12\" r=\"10\"/><polygon points=\"10 8 16 12 10 16 10 8\"/>',\n  'puzzle-piece': '<path d=\"M19.4 7.85a1 1 0 0 0 .29.88l1.57 1.57a2.4 2.4 0 0 1 0 3.4l-1.61 1.61a1 1 0 0 1-.84.28c-.47-.07-.8-.48-.97-.93a2.5 2.5 0 1 0-3.21 3.22c.45.16.85.5.93.96a1 1 0 0 1-.28.84l-1.61 1.61a2.4 2.4 0 0 1-3.4 0l-1.57-1.57a1 1 0 0 0-.88-.29c-.49.08-.84.5-1.02.97a2.5 2.5 0 1 1-3.24-3.24c.46-.18.9-.53.97-1.02a1 1 0 0 0-.29-.88L1.7 13.7a2.4 2.4 0 0 1 0-3.4L4.23 8.77a1 1 0 0 1 .92-.3c.51.07.87.52 1.07 1A2.5 2.5 0 1 0 9.48 6.2c-.48-.2-.93-.56-1-1.07a1 1 0 0 1 .3-.92l1.52-1.52a2.4 2.4 0 0 1 3.4 0l1.57 1.57a1 1 0 0 0 .88.29c.49-.07.84-.5 1.02-.97a2.5 2.5 0 1 1 3.24 3.24c-.46.18-.9.53-.97 1.02z\"/>',\n  'question-circle': '<circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\"/><line x1=\"12\" x2=\"12.01\" y1=\"17\" y2=\"17\"/>',\n  route: '<circle cx=\"6\" cy=\"19\" r=\"3\"/><path d=\"M9 19h8.5a3.5 3.5 0 0 0 0-7h-11a3.5 3.5 0 0 1 0-7H15\"/><circle cx=\"18\" cy=\"5\" r=\"3\"/>',\n  search: '<circle cx=\"11\" cy=\"11\" r=\"8\"/><path d=\"m21 21-4.35-4.35\"/>',\n  'shield-alt': '<path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"/>',\n  'sync-alt': '<path d=\"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\"/><path d=\"M21 3v5h-5\"/><path d=\"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\"/><path d=\"M3 21v-5h5\"/>',\n  thumbtack: '<line x1=\"12\" x2=\"12\" y1=\"17\" y2=\"22\"/><path d=\"M5 17h14v-1.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V6h1a2 2 0 0 0 0-4H8a2 2 0 0 0 0 4h1v4.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V17z\"/>',\n  times: '<path d=\"M18 6 6 18\"/><path d=\"m6 6 12 12\"/>',\n  'times-circle': '<circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"m15 9-6 6\"/><path d=\"m9 9 6 6\"/>',\n  trash: '<path d=\"M3 6h18\"/><path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\"/><path d=\"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\"/>',\n};\n\n// Multi-color logo SVGs. Rendered verbatim (not wrapped in the 24x24 viewBox)\n// and styled with `.bq-icon--logo` to opt out of the stroke/fill defaults.\n// Gradient IDs are suffixed `__bqicon` so they don't collide with host-app SVGs.\nconst LOGOS: Record<string, string> = {\n  angular: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-8 0 272 272\" preserveAspectRatio=\"xMidYMid\" aria-hidden=\"true\">'\n    + '<g><path d=\"M0.0996 45.522 L125.908 0.697 L255.103 44.725 L234.185 211.175 L125.908 271.141 L19.324 211.972 Z\" fill=\"#E23237\"/>'\n    + '<path d=\"M255.103 44.725 L125.908 0.697 L125.908 271.141 L234.185 211.275 L255.103 44.725 Z\" fill=\"#B52E31\"/>'\n    + '<path d=\"M126.107 32.274 L47.713 206.693 L76.999 206.195 L92.737 166.848 L126.207 166.848 L126.306 166.848 L163.063 166.848 L180.295 206.693 L208.286 207.191 L126.107 32.274 Z M126.306 88.156 L152.803 143.539 L127.402 143.539 L126.107 143.539 L102.997 143.539 L126.306 88.156 Z\" fill=\"#FFFFFF\"/>'\n    + '</g></svg>',\n  blueriq: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 50 50\" aria-hidden=\"true\">'\n    + '<defs>'\n    + '<linearGradient x1=\"-24.682%\" y1=\"41.9%\" x2=\"565.911%\" y2=\"179.825%\" id=\"bq__bqicon\">'\n    + '<stop stop-color=\"#0077E5\" offset=\"0%\"/><stop stop-color=\"#2563E1\" offset=\"38.39%\"/>'\n    + '<stop stop-color=\"#7837D7\" offset=\"70%\"/><stop stop-color=\"#783B95\" offset=\"100%\"/>'\n    + '</linearGradient>'\n    + '<linearGradient x1=\"-464.264%\" y1=\"-78.764%\" x2=\"126.329%\" y2=\"58.536%\" id=\"dq__bqicon\">'\n    + '<stop stop-color=\"#0077E5\" offset=\"0%\"/><stop stop-color=\"#2563E1\" offset=\"38.39%\"/>'\n    + '<stop stop-color=\"#7837D7\" offset=\"70%\"/><stop stop-color=\"#783B95\" offset=\"100%\"/>'\n    + '</linearGradient>'\n    + '</defs>'\n    + '<g fill=\"none\" fill-rule=\"evenodd\">'\n    + '<path d=\"M4.587 34.008a11.338 11.338 0 0 0 6.86 2.314c6.28 0 11.404-5.124 11.404-11.405 0-6.28-5.124-11.405-11.405-11.405-2.562 0-4.958.868-6.86 2.314V.041H0v36.281h4.587v-2.314zm0-9.132c0-3.76 3.058-6.86 6.86-6.86 3.76 0 6.859 3.058 6.859 6.86 0 3.76-3.058 6.86-6.86 6.86a6.843 6.843 0 0 1-6.86-6.86z\" fill=\"url(#bq__bqicon)\" fill-rule=\"nonzero\"/>'\n    + '<g transform=\"translate(-85.579 0)\">'\n    + '<path d=\"M130 34.008v15.91h4.587V13.47H130v2.314a11.338 11.338 0 0 0-6.86-2.314c-6.28 0-11.404 5.124-11.404 11.405s5.124 11.405 11.404 11.405c2.562.041 4.918-.826 6.86-2.273zm-13.719-9.09c0-3.761 3.058-6.86 6.86-6.86 3.76 0 6.859 3.058 6.859 6.86 0 3.76-3.058 6.859-6.86 6.859-3.76-.041-6.859-3.1-6.859-6.86z\" fill=\"url(#dq__bqicon)\" fill-rule=\"nonzero\"/>'\n    + '</g>'\n    + '</g></svg>',\n};\n\n@Component({\n  selector: 'bq-icon',\n  standalone: false,\n  encapsulation: ViewEncapsulation.None,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `<span class=\"bq-icon\" [class.bq-icon--spin]=\"spin\" [class.bq-icon--logo]=\"isLogo\" [innerHTML]=\"svg\"></span>`,\n  styles: [`\n    .bq-icon {\n      display: inline-flex;\n      width: 1em;\n      height: 1em;\n      line-height: 1;\n      vertical-align: -0.125em;\n    }\n    .bq-icon svg {\n      width: 100%;\n      height: 100%;\n      stroke: currentColor;\n      stroke-width: 2;\n      stroke-linecap: round;\n      stroke-linejoin: round;\n      fill: none;\n    }\n    .bq-icon--logo svg {\n      stroke: none;\n      fill: initial;\n    }\n    .bq-icon--spin svg {\n      animation: bq-icon-spin 1s linear infinite;\n    }\n    @keyframes bq-icon-spin {\n      to { transform: rotate(360deg); }\n    }\n  `],\n})\nexport class BqIconComponent {\n  @Input() spin = false;\n\n  private _name = '';\n  private _safeSvg: SafeHtml = '';\n  private _isLogo = false;\n\n  constructor(private sanitizer: DomSanitizer) {}\n\n  @Input()\n  set name(value: string) {\n    this._name = value;\n    const logo = LOGOS[value];\n    if (logo) {\n      this._isLogo = true;\n      this._safeSvg = this.sanitizer.bypassSecurityTrustHtml(logo);\n      return;\n    }\n    this._isLogo = false;\n    const inner = ICONS[value] ?? '';\n    this._safeSvg = this.sanitizer.bypassSecurityTrustHtml(\n      `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">${inner}</svg>`,\n    );\n  }\n  get name(): string { return this._name; }\n\n  get svg(): SafeHtml { return this._safeSvg; }\n  get isLogo(): boolean { return this._isLogo; }\n}\n","import { Component, Input, ViewEncapsulation } from '@angular/core';\nimport { CaptureAnalysis, PageAnomaly } from '../bq-lens.types';\nimport { safeStringify } from '../dev-json.utils';\n\ntype FieldEntry = CaptureAnalysis['fields'][0];\n\n@Component({\n  selector: 'app-dev-insights-panel',\n  templateUrl: './dev-insights-panel.component.html',\n  standalone: false,\n  encapsulation: ViewEncapsulation.None,\n})\nexport class DevInsightsPanelComponent {\n  @Input() analysis: CaptureAnalysis | null = null;\n\n  get overallHealth(): 'ok' | 'warn' | 'error' {\n    if (!this.analysis) return 'ok';\n    const { withErrors, withWarnings, emptyRequired } = this.processedFields;\n    if (withErrors.length > 0) return 'error';\n    if (emptyRequired.length > 0 || this.analysis.messages.length > 0 || withWarnings.length > 0) return 'warn';\n    return 'ok';\n  }\n\n  private get processedFields(): {\n    withErrors: FieldEntry[];\n    withWarnings: FieldEntry[];\n    withBlockingRules: FieldEntry[];\n    emptyRequired: FieldEntry[];\n    refresh: FieldEntry[];\n  } {\n    const fields = this.analysis?.fields ?? [];\n    const withErrors: FieldEntry[] = [];\n    const withWarnings: FieldEntry[] = [];\n    const withBlockingRules: FieldEntry[] = [];\n    const emptyRequired: FieldEntry[] = [];\n    const refresh: FieldEntry[] = [];\n\n    for (const f of fields) {\n      const hasError = f.fieldMessages.some(m => m.type === 'ERROR');\n      const hasWarning = f.fieldMessages.some(m => m.type === 'WARNING');\n      if (hasError && !this.isJustRequiredEmpty(f)) withErrors.push(f);\n      if (hasWarning && !hasError) withWarnings.push(f);\n      if (f.fieldMessages.length === 0 && f.validations.some(v => v.blocking)) withBlockingRules.push(f);\n      if (f.required && f.editable && f.values.length === 0) emptyRequired.push(f);\n      if (f.refresh) refresh.push(f);\n    }\n\n    return { withErrors, withWarnings, withBlockingRules, emptyRequired, refresh };\n  }\n\n  private isJustRequiredEmpty(field: FieldEntry): boolean {\n    if (field.values.length > 0) return false;\n    const requiredMsgs = new Set(\n      field.validations.filter(v => v.type === 'Required').map(v => v.message)\n    );\n    return field.fieldMessages\n      .filter(m => m.type === 'ERROR')\n      .every(m => requiredMsgs.has(m.text));\n  }\n\n  get fieldsWithErrors(): FieldEntry[] { return this.processedFields.withErrors; }\n  get fieldsWithWarnings(): FieldEntry[] { return this.processedFields.withWarnings; }\n  get fieldsWithBlockingRules(): FieldEntry[] { return this.processedFields.withBlockingRules; }\n  get emptyRequiredFields(): FieldEntry[] { return this.processedFields.emptyRequired; }\n  get refreshFields(): FieldEntry[] { return this.processedFields.refresh; }\n\n  get pageContext() { return this.analysis?.pageContext ?? null; }\n  get sections()    { return this.analysis?.sections ?? []; }\n  get tables()      { return this.analysis?.tables ?? []; }\n  get triggeredBy() { return this.analysis?.triggeredBy ?? null; }\n\n  get allActionRows() {\n    return this.analysis?.buttons ?? [];\n  }\n\n  get allActionsBlocked(): boolean {\n    const a = this.analysis;\n    return !!a && a.buttons.length > 0 && a.buttons.every(b => b.disabled);\n  }\n\n  get filledCount(): number {\n    return this.analysis?.fields.filter(f => f.values.length > 0).length ?? 0;\n  }\n\n  get filledPercent(): number {\n    const total = this.analysis?.fields.length ?? 0;\n    if (!total) return 0;\n    return Math.round((this.filledCount / total) * 100);\n  }\n\n  messagesOf(field: FieldEntry, type: string): string[] {\n    return field.fieldMessages.filter(m => m.type === type).map(m => m.text);\n  }\n\n  blockingValidations(field: FieldEntry) {\n    return field.validations.filter(v => v.blocking);\n  }\n\n  fieldLabel(field: FieldEntry): string {\n    return field.questionText ?? field.name ?? field.functionalKey;\n  }\n\n  chipClass(chipStyle: string): string {\n    if (chipStyle.includes('Red'))    return 'red';\n    if (chipStyle.includes('Green'))  return 'green';\n    if (chipStyle.includes('Orange')) return 'orange';\n    if (chipStyle.includes('Blue'))   return 'blue';\n    return 'neutral';\n  }\n\n  private static readonly STYLE_LABELS: Record<string, string> = {\n    primary:      'Main / primary action',\n    secondary:    'Alternative / secondary',\n    danger:       'Destructive — irreversible',\n    destructive:  'Destructive — irreversible',\n    warning:      'Caution — needs attention',\n    warn:         'Caution — needs attention',\n    success:      'Positive / confirmation',\n    ok:           'Positive / confirmation',\n    info:         'Informational',\n    muted:        'Reduced emphasis',\n    disabled:     'Inactive',\n    readonly:     'Read-only',\n    hidden:       'Hidden from the user',\n    highlight:    'Highlighted / accented',\n    accent:       'Highlighted / accented',\n    required:     'Required input',\n  };\n\n  /** Human-readable description of a Blueriq presentation style name. */\n  styleLabel(style: string): string {\n    return DevInsightsPanelComponent.STYLE_LABELS[style.toLowerCase()] ?? style;\n  }\n\n  /** Tooltip text: \"primary — Main / primary action\" */\n  styleTooltip(style: string): string {\n    const label = DevInsightsPanelComponent.STYLE_LABELS[style.toLowerCase()];\n    return label ? `${style} — ${label}` : style;\n  }\n\n  formatParams(params: any): string {\n    return safeStringify(params);\n  }\n\n  /**\n   * \"Looks wrong\" finder. Each rule fires on a clear authoring smell or\n   * contradiction in the page model — empty captions, required-but-readonly,\n   * duplicated labels, etc. Narrow on purpose: the panel is only useful if\n   * a fired rule is almost certainly a real problem.\n   */\n  get anomalies(): PageAnomaly[] {\n    const a = this.analysis;\n    if (!a) return [];\n    const out: PageAnomaly[] = [];\n\n    const emptyButtons = a.buttons.filter(b => !b.caption || !b.caption.trim());\n    if (emptyButtons.length > 0) {\n      out.push({\n        severity: 'warn',\n        category: 'empty-caption',\n        message: `${emptyButtons.length} button${emptyButtons.length > 1 ? 's have' : ' has'} no caption`,\n        detail: 'A button without a caption is invisible to screen readers and confusing to users. Set a caption on the Blueriq button element.',\n      });\n    }\n\n    const emptyLinks = a.links.filter(l => !l.caption || !l.caption.trim());\n    if (emptyLinks.length > 0) {\n      out.push({\n        severity: 'warn',\n        category: 'empty-caption',\n        message: `${emptyLinks.length} link${emptyLinks.length > 1 ? 's have' : ' has'} no caption`,\n        detail: 'A link without text is unreachable by keyboard and unclear to readers. Add caption text on the Blueriq link.',\n      });\n    }\n\n    const requiredReadonly = a.fields.filter(f => f.required && !f.editable);\n    if (requiredReadonly.length > 0) {\n      out.push({\n        severity: 'warn',\n        category: 'contradiction',\n        message: `${requiredReadonly.length} field${requiredReadonly.length > 1 ? 's are' : ' is'} required but read-only`,\n        detail: 'A read-only field can never be filled by the user, so the required flag will block the form forever. Either drop required, or make the field editable.',\n        refs: requiredReadonly.slice(0, 6).map(f => this.fieldLabel(f)),\n      });\n    }\n\n    const refreshReadonly = a.fields.filter(f => f.refresh && !f.editable);\n    if (refreshReadonly.length > 0) {\n      out.push({\n        severity: 'info',\n        category: 'contradiction',\n        message: `${refreshReadonly.length} field${refreshReadonly.length > 1 ? 's are' : ' is'} read-only but flagged refresh`,\n        detail: 'Refresh re-fires the form when the user changes a field — but a read-only field has no user change to react to. The flag is a no-op here.',\n        refs: refreshReadonly.slice(0, 6).map(f => this.fieldLabel(f)),\n      });\n    }\n\n    const emptySections = this.sections.filter(s => s.fieldCount === 0 && s.buttonCount === 0);\n    if (emptySections.length > 0) {\n      out.push({\n        severity: 'info',\n        category: 'empty-section',\n        message: `${emptySections.length} section${emptySections.length > 1 ? 's have' : ' has'} no fields or actions`,\n        detail: 'An empty section renders as a heading with no content — usually a leftover after a refactor or a hidden child the dev tool can\\'t see.',\n        refs: emptySections.slice(0, 6).map(s => s.displayName),\n      });\n    }\n\n    const dupButtonCaptions = this.findDuplicates(\n      a.buttons.map(b => (b.caption || '').trim()).filter(c => c.length > 0)\n    );\n    if (dupButtonCaptions.length > 0) {\n      out.push({\n        severity: 'warn',\n        category: 'duplicate',\n        message: `${dupButtonCaptions.length} button caption${dupButtonCaptions.length > 1 ? 's appear' : ' appears'} more than once`,\n        detail: 'Two buttons sharing a caption are indistinguishable to the user. Verify they really do the same thing — if not, rename one.',\n        refs: dupButtonCaptions,\n      });\n    }\n\n    const dupFieldLabels = this.findDuplicates(\n      a.fields.map(f => (f.questionText || '').trim()).filter(c => c.length > 0)\n    );\n    if (dupFieldLabels.length > 0) {\n      out.push({\n        severity: 'info',\n        category: 'duplicate',\n        message: `${dupFieldLabels.length} field label${dupFieldLabels.length > 1 ? 's appear' : ' appears'} more than once`,\n        detail: 'Identical labels are common on intentional repeats (address line 1 / 2) but worth confirming the right field receives the user\\'s input.',\n        refs: dupFieldLabels,\n      });\n    }\n\n    const emptyValidations: string[] = [];\n    for (const f of a.fields) {\n      for (const v of f.validations) {\n        if (!v.message || !v.message.trim()) {\n          emptyValidations.push(`${this.fieldLabel(f)} (${v.type})`);\n        }\n      }\n    }\n    if (emptyValidations.length > 0) {\n      out.push({\n        severity: 'info',\n        category: 'empty-message',\n        message: `${emptyValidations.length} validation rule${emptyValidations.length > 1 ? 's have' : ' has'} no message`,\n        detail: 'When a rule fires without a message, the user sees no explanation of what to fix. Add a human-readable message to the validation.',\n        refs: emptyValidations.slice(0, 6),\n      });\n    }\n\n    return out;\n  }\n\n  private findDuplicates(values: string[]): string[] {\n    const counts = new Map<string, number>();\n    for (const v of values) counts.set(v, (counts.get(v) ?? 0) + 1);\n    return [...counts.entries()].filter(([_, n]) => n > 1).map(([v]) => v);\n  }\n}\n","<div *ngIf=\"!analysis\" class=\"dev-muted dev-insights__empty\">No analysis available.</div>\n<div *ngIf=\"analysis\" class=\"dev-insights\">\n\n  <!-- Session start -->\n  <ng-container *ngIf=\"analysis.responseType === 'start'\">\n    <div class=\"dev-insights__health dev-insights__health--ok\">\n      <bq-icon name=\"play-circle\"></bq-icon> Flow started\n    </div>\n    <div class=\"dev-insights__section\">\n      <span class=\"dev-insights__label\">Session ID</span>\n      <span class=\"dev-insights__mono\">{{ analysis.sessionId }}</span>\n    </div>\n  </ng-container>\n\n  <!-- Session response -->\n  <ng-container *ngIf=\"analysis.responseType === 'session'\">\n\n    <!-- Health bar -->\n    <div class=\"dev-insights__health\"\n         [class.dev-insights__health--ok]=\"overallHealth === 'ok'\"\n         [class.dev-insights__health--warn]=\"overallHealth === 'warn'\"\n         [class.dev-insights__health--error]=\"overallHealth === 'error'\">\n      <ng-container *ngIf=\"overallHealth === 'ok'\"><bq-icon name=\"check-circle\"></bq-icon> Looks good</ng-container>\n      <ng-container *ngIf=\"overallHealth === 'warn'\"><bq-icon name=\"exclamation-circle\"></bq-icon> Needs attention</ng-container>\n      <ng-container *ngIf=\"overallHealth === 'error'\"><bq-icon name=\"times-circle\"></bq-icon> Has errors</ng-container>\n      <span class=\"dev-insights__health-page\" *ngIf=\"analysis.page\">\n        {{ analysis.page.displayName || analysis.page.name || analysis.page.key }}\n      </span>\n    </div>\n\n    <!-- Anomalies — high-confidence \"looks wrong\" callouts -->\n    <div class=\"dev-insights__section dev-insights__anomalies\" *ngIf=\"anomalies.length > 0\">\n      <span class=\"dev-insights__label\">\n        <bq-icon name=\"exclamation-triangle\"></bq-icon> Looks wrong\n        <span class=\"dev-insights__anomaly-count\">{{ anomalies.length }}</span>\n      </span>\n      <div *ngFor=\"let an of anomalies\"\n           class=\"dev-insights__anomaly\"\n           [class.dev-insights__anomaly--warn]=\"an.severity === 'warn'\"\n           [class.dev-insights__anomaly--info]=\"an.severity === 'info'\"\n           [attr.data-tooltip]=\"an.detail || null\">\n        <div class=\"dev-insights__anomaly-message\">{{ an.message }}</div>\n        <div *ngIf=\"an.refs && an.refs.length > 0\" class=\"dev-insights__anomaly-refs\">\n          <span *ngFor=\"let r of an.refs\" class=\"dev-insights__anomaly-ref\">{{ r }}</span>\n        </div>\n      </div>\n    </div>\n\n    <!-- Page context -->\n    <div class=\"dev-insights__section dev-insights__section--context\" *ngIf=\"pageContext\">\n      <div class=\"dev-insights__breadcrumb\" *ngIf=\"pageContext.breadcrumb.length > 0\">\n        <ng-container *ngFor=\"let crumb of pageContext.breadcrumb; let last = last\">\n          <span class=\"dev-insights__crumb\">{{ crumb }}</span>\n          <bq-icon *ngIf=\"!last\" name=\"chevron-right\"></bq-icon>\n        </ng-container>\n      </div>\n      <div class=\"dev-insights__page-header\" *ngIf=\"pageContext.title || pageContext.statusChips.length > 0\">\n        <span class=\"dev-insights__page-title\" *ngIf=\"pageContext.title\">{{ pageContext.title }}</span>\n        <span *ngFor=\"let chip of pageContext.statusChips\"\n              class=\"dev-insights__status-chip dev-insights__status-chip--{{ chipClass(chip.chipStyle) }}\">\n          {{ chip.text }}\n        </span>\n      </div>\n      <div class=\"dev-insights__active-tab\" *ngIf=\"pageContext.activeTab\">\n        <bq-icon name=\"folder-open\"></bq-icon> Active tab: <strong>{{ pageContext.activeTab }}</strong>\n      </div>\n      <div class=\"dev-insights__triggered-by\" *ngIf=\"triggeredBy\">\n        <bq-icon name=\"mouse-pointer\"></bq-icon> Triggered by: <strong>{{ triggeredBy }}</strong>\n      </div>\n    </div>\n\n    <!-- Signals -->\n    <div class=\"dev-insights__signals\">\n      <div *ngIf=\"fieldsWithErrors.length > 0\" class=\"dev-insights__signal dev-insights__signal--error\">\n        <bq-icon name=\"times-circle\"></bq-icon>\n        {{ fieldsWithErrors.length }} field{{ fieldsWithErrors.length > 1 ? 's have' : ' has' }} errors\n      </div>\n      <div *ngIf=\"fieldsWithWarnings.length > 0\" class=\"dev-insights__signal dev-insights__signal--warn\">\n        <bq-icon name=\"exclamation-triangle\"></bq-icon>\n        {{ fieldsWithWarnings.length }} field{{ fieldsWithWarnings.length > 1 ? 's have' : ' has' }} warnings\n      </div>\n      <div *ngIf=\"emptyRequiredFields.length > 0\" class=\"dev-insights__signal dev-insights__signal--warn\">\n        <bq-icon name=\"exclamation-circle\"></bq-icon>\n        {{ emptyRequiredFields.length }} required field{{ emptyRequiredFields.length > 1 ? 's' : '' }} not yet filled\n      </div>\n      <div *ngIf=\"analysis.messages.length > 0\" class=\"dev-insights__signal dev-insights__signal--warn\">\n        <bq-icon name=\"comment-alt\"></bq-icon>\n        {{ analysis.messages.length }} page message{{ analysis.messages.length > 1 ? 's' : '' }}\n      </div>\n      <div *ngIf=\"allActionsBlocked\" class=\"dev-insights__signal dev-insights__signal--warn\">\n        <bq-icon name=\"ban\"></bq-icon> All actions are disabled\n      </div>\n      <div *ngIf=\"refreshFields.length > 0\" class=\"dev-insights__signal\">\n        <bq-icon name=\"sync-alt\"></bq-icon>\n        {{ refreshFields.length }} field{{ refreshFields.length > 1 ? 's trigger' : ' triggers' }} a refresh\n      </div>\n      <div *ngIf=\"analysis.fields.length > 0\" class=\"dev-insights__signal\" [class.dev-insights__signal--ok]=\"overallHealth === 'ok'\">\n        <bq-icon name=\"check-circle\"></bq-icon>\n        <div class=\"dev-insights__progress\">\n          <div class=\"dev-insights__progress-bar\" [style.width.%]=\"filledPercent\"></div>\n        </div>\n        <span class=\"dev-insights__progress-label\">{{ filledCount }}/{{ analysis.fields.length }}</span>\n      </div>\n    </div>\n\n    <!-- Named sections (Card containers with displayName) -->\n    <div class=\"dev-insights__section\" *ngIf=\"sections.length > 0\">\n      <span class=\"dev-insights__label\">Page sections</span>\n      <div *ngFor=\"let sec of sections\" class=\"dev-insights__section-row\">\n        <span class=\"dev-insights__section-name\">{{ sec.displayName }}</span>\n        <span class=\"dev-insights__section-meta\">\n          <span *ngIf=\"sec.fieldCount > 0\">{{ sec.fieldCount }} field{{ sec.fieldCount > 1 ? 's' : '' }}</span>\n          <span *ngIf=\"sec.buttonCount > 0\">{{ sec.buttonCount }} action{{ sec.buttonCount > 1 ? 's' : '' }}</span>\n          <span class=\"dev-insights__style-chip\">{{ sec.contentStyle }}</span>\n        </span>\n      </div>\n    </div>\n\n    <!-- Lists and tables -->\n    <div class=\"dev-insights__section\" *ngIf=\"tables.length > 0\">\n      <span class=\"dev-insights__label\">Lists &amp; tables</span>\n      <div *ngFor=\"let tbl of tables\" class=\"dev-insights__section-row\">\n        <span class=\"dev-insights__section-name\">{{ tbl.displayName || tbl.name || tbl.contentStyle }}</span>\n        <span class=\"dev-insights__section-meta\">\n          <span *ngIf=\"tbl.rowCount > 0\" class=\"dev-insights__meta-badge dev-insights__meta-badge--info\">\n            {{ tbl.rowCount }} row{{ tbl.rowCount > 1 ? 's' : '' }}\n          </span>\n          <span *ngIf=\"tbl.rowCount === 0\" class=\"dev-insights__meta-badge dev-insights__meta-badge--muted\">empty</span>\n          <span class=\"dev-insights__style-chip\">{{ tbl.contentStyle }}</span>\n        </span>\n      </div>\n    </div>\n\n    <!-- Page messages -->\n    <div class=\"dev-insights__section\" *ngIf=\"analysis.messages.length > 0\">\n      <span class=\"dev-insights__label\">Page messages</span>\n      <div *ngFor=\"let msg of analysis.messages\" class=\"dev-insights__message\">\n        <bq-icon name=\"comment-alt\"></bq-icon> {{ msg.message }}\n      </div>\n    </div>\n\n    <!-- Field errors -->\n    <div class=\"dev-insights__section\" *ngIf=\"fieldsWithErrors.length > 0\">\n      <span class=\"dev-insights__label\">Field errors</span>\n      <div *ngFor=\"let f of fieldsWithErrors\" class=\"dev-insights__field-error\">\n        <div class=\"dev-insights__field-error-header\">\n          <span class=\"dev-insights__field-error-name\">{{ fieldLabel(f) }}</span>\n          <ng-container *ngIf=\"f.contentStyle\">\n            <span class=\"dev-insights__style-chip dev-insights__style-chip--{{ f.contentStyle }}\"\n                  [attr.data-tooltip]=\"styleTooltip(f.contentStyle)\">{{ f.contentStyle }}</span>\n          </ng-container>\n          <span *ngFor=\"let s of f.styles\"\n                class=\"dev-insights__style-chip dev-insights__style-chip--{{ s }}\"\n                [attr.data-tooltip]=\"styleTooltip(s)\">{{ s }}</span>\n        </div>\n        <span *ngFor=\"let msg of messagesOf(f, 'ERROR')\" class=\"dev-insights__field-error-msg\">\n          <bq-icon name=\"arrow-right\"></bq-icon> {{ msg }}\n        </span>\n      </div>\n    </div>\n\n    <!-- Field warnings -->\n    <div class=\"dev-insights__section\" *ngIf=\"fieldsWithWarnings.length > 0\">\n      <span class=\"dev-insights__label\">Field warnings</span>\n      <div *ngFor=\"let f of fieldsWithWarnings\" class=\"dev-insights__field-error\">\n        <div class=\"dev-insights__field-error-header\">\n          <span class=\"dev-insights__field-error-name\">{{ fieldLabel(f) }}</span>\n          <ng-container *ngIf=\"f.contentStyle\">\n            <span class=\"dev-insights__style-chip dev-insights__style-chip--{{ f.contentStyle }}\"\n                  [attr.data-tooltip]=\"styleTooltip(f.contentStyle)\">{{ f.contentStyle }}</span>\n          </ng-container>\n          <span *ngFor=\"let s of f.styles\"\n                class=\"dev-insights__style-chip dev-insights__style-chip--{{ s }}\"\n                [attr.data-tooltip]=\"styleTooltip(s)\">{{ s }}</span>\n        </div>\n        <span *ngFor=\"let msg of messagesOf(f, 'WARNING')\" class=\"dev-insights__field-error-msg dev-insights__field-error-msg--neutral\">\n          <bq-icon name=\"arrow-right\"></bq-icon> {{ msg }}\n        </span>\n      </div>\n    </div>\n\n    <!-- Fields with blocking validation rules but no active error yet -->\n    <div class=\"dev-insights__section\" *ngIf=\"fieldsWithBlockingRules.length > 0\">\n      <span class=\"dev-insights__label\">Blocking rules</span>\n      <div *ngFor=\"let f of fieldsWithBlockingRules\" class=\"dev-insights__field-error\">\n        <div class=\"dev-insights__field-error-header\">\n          <span class=\"dev-insights__field-error-name\">{{ fieldLabel(f) }}</span>\n          <ng-container *ngIf=\"f.contentStyle\">\n            <span class=\"dev-insights__style-chip dev-insights__style-chip--{{ f.contentStyle }}\"\n                  [attr.data-tooltip]=\"styleTooltip(f.contentStyle)\">{{ f.contentStyle }}</span>\n          </ng-container>\n          <span *ngFor=\"let s of f.styles\"\n                class=\"dev-insights__style-chip dev-insights__style-chip--{{ s }}\"\n                [attr.data-tooltip]=\"styleTooltip(s)\">{{ s }}</span>\n        </div>\n        <span *ngFor=\"let v of blockingValidations(f)\" class=\"dev-insights__validation-rule\">\n          <bq-icon name=\"shield-alt\"></bq-icon>\n          {{ v.type }}<ng-container *ngIf=\"v.message\"> — {{ v.message }}</ng-container>\n          <span *ngIf=\"v.parameters\" class=\"dev-insights__validation-params\">{{ formatParams(v.parameters) }}</span>\n        </span>\n      </div>\n    </div>\n\n    <!-- Required but empty -->\n    <div class=\"dev-insights__section\" *ngIf=\"emptyRequiredFields.length > 0\">\n      <span class=\"dev-insights__label\">Still required</span>\n      <div class=\"dev-insights__tag-cloud\">\n        <ng-container *ngFor=\"let f of emptyRequiredFields\">\n          <span class=\"dev-insights__tag dev-insights__tag--required\">{{ fieldLabel(f) }}</span>\n          <ng-container *ngIf=\"f.contentStyle\">\n            <span class=\"dev-insights__style-chip dev-insights__style-chip--{{ f.contentStyle }}\"\n                  [attr.data-tooltip]=\"styleTooltip(f.contentStyle)\">{{ f.contentStyle }}</span>\n          </ng-container>\n          <span *ngFor=\"let s of f.styles\"\n                class=\"dev-insights__style-chip dev-insights__style-chip--{{ s }}\"\n                [attr.data-tooltip]=\"styleTooltip(s)\">{{ s }}</span>\n        </ng-container>\n      </div>\n    </div>\n\n    <!-- Actions -->\n    <div class=\"dev-insights__section\" *ngIf=\"analysis.buttons.length > 0\">\n      <span class=\"dev-insights__label\">Actions</span>\n      <div class=\"dev-insights__action-list\">\n\n        <div *ngFor=\"let btn of allActionRows\"\n             class=\"dev-insights__action-row\"\n             [class.dev-insights__action-row--disabled]=\"btn.disabled\">\n          <span class=\"dev-insights__action-caption\">{{ btn.caption }}</span>\n          <ng-container *ngIf=\"btn.contentStyle\">\n            <span class=\"dev-insights__style-chip dev-insights__style-chip--{{ btn.contentStyle }}\"\n                  [attr.data-tooltip]=\"btn.caption + ': ' + styleTooltip(btn.contentStyle)\">{{ btn.contentStyle }}</span>\n            <span class=\"dev-insights__style-desc\">{{ styleLabel(btn.contentStyle) }}</span>\n          </ng-container>\n          <ng-container *ngFor=\"let s of btn.styles\">\n            <span class=\"dev-insights__style-chip dev-insights__style-chip--{{ s }}\"\n                  [attr.data-tooltip]=\"btn.caption + ': ' + styleTooltip(s)\">{{ s }}</span>\n            <span class=\"dev-insights__style-desc\">{{ styleLabel(s) }}</span>\n          </ng-container>\n          <span *ngIf=\"btn.validate\" class=\"dev-insights__meta-badge dev-insights__meta-badge--ok\"\n                data-tooltip=\"Runs form validation before the action is processed\">validates</span>\n          <span *ngIf=\"btn.disabled\" class=\"dev-insights__meta-badge dev-insights__meta-badge--muted\"\n                data-tooltip=\"This action is currently blocked — conditions are not met\">disabled</span>\n        </div>\n\n      </div>\n    </div>\n\n    <!-- Refresh fields -->\n    <div class=\"dev-insights__section\" *ngIf=\"refreshFields.length > 0\">\n      <span class=\"dev-insights__label\">Triggers refresh</span>\n      <div class=\"dev-insights__tag-cloud\">\n        <ng-container *ngFor=\"let f of refreshFields\">\n          <span class=\"dev-insights__tag\">\n            <bq-icon name=\"sync-alt\" style=\"font-size:9px;opacity:0.6;margin-right:3px;\"></bq-icon>{{ fieldLabel(f) }}\n          </span>\n          <ng-container *ngIf=\"f.contentStyle\">\n            <span class=\"dev-insights__style-chip dev-insights__style-chip--{{ f.contentStyle }}\"\n                  [attr.data-tooltip]=\"styleTooltip(f.contentStyle)\">{{ f.contentStyle }}</span>\n          </ng-container>\n          <span *ngFor=\"let s of f.styles\"\n                class=\"dev-insights__style-chip dev-insights__style-chip--{{ s }}\"\n                [attr.data-tooltip]=\"styleTooltip(s)\">{{ s }}</span>\n        </ng-container>\n      </div>\n    </div>\n\n    <!-- Links -->\n    <div class=\"dev-insights__section\" *ngIf=\"analysis.links.length > 0\">\n      <span class=\"dev-insights__label\">Links</span>\n      <div class=\"dev-insights__btn-list\">\n        <span *ngFor=\"let lnk of analysis.links\"\n              class=\"dev-insights__btn-chip dev-insights__btn-chip--link\"\n              [title]=\"lnk.url || ''\">\n          {{ lnk.caption }}\n        </span>\n      </div>\n    </div>\n\n  </ng-container>\n</div>\n","/**\n * Writes text to the clipboard, swallowing the rejection when the clipboard\n * API is unavailable (e.g., insecure context). Returns whether the write succeeded\n * so callers can drive their own \"copied!\" feedback flag.\n */\nexport async function copyText(text: string | null | undefined): Promise<boolean> {\n  if (!text) return false;\n  try {\n    await navigator.clipboard.writeText(text);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Copies text and toggles a boolean flag on `host` for `ms` milliseconds.\n * Used by the various \"copied!\" affordances throughout the panel.\n */\nexport async function copyWithFeedback<T extends object>(\n  host: T, flagKey: keyof T, text: string | null | undefined, ms = 1500,\n): Promise<void> {\n  if (await copyText(text)) {\n    (host as any)[flagKey] = true;\n    setTimeout(() => { (host as any)[flagKey] = false; }, ms);\n  }\n}\n\n/** Triggers a browser download of the given string content. */\nexport function downloadBlob(content: string, filename: string, mime: string): void {\n  const blob = new Blob([content], { type: mime });\n  const url = URL.createObjectURL(blob);\n  const a = document.createElement('a');\n  a.href = url;\n  a.download = filename;\n  a.click();\n  URL.revokeObjectURL(url);\n}\n","import { Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core';\nimport { SafeHtml } from '@angular/platform-browser';\nimport { copyText, downloadBlob } from '../dev-clipboard.utils';\n\nconst MIME_BY_KIND = {\n  json: 'application/json',\n  template: 'text/plain',\n} as const;\n\n@Component({\n  selector: 'app-dev-code-viewer',\n  template: `\n    <div *ngIf=\"error\" class=\"dev-muted dev-template-error\">{{ error }}</div>\n    <div *ngIf=\"!content && !error && emptyMsg\" class=\"dev-muted\" style=\"padding: 10px;\">{{ emptyMsg }}</div>\n    <div *ngIf=\"content || highlighted\" class=\"dev-code-block\">\n      <div class=\"dev-code-block__sticky\">\n        <div class=\"dev-code-block__actions\">\n          <button class=\"dev-btn dev-btn--sm\" (click)=\"copy()\" [title]=\"copied ? 'Copied!' : 'Copy'\">{{ copied ? '✓' : 'Copy' }}</button>\n          <button class=\"dev-btn dev-btn--sm\" (click)=\"download()\" title=\"Download\"><bq-icon name=\"download\"></bq-icon></button>\n          <button *ngIf=\"canExpand\" class=\"dev-btn dev-btn--sm\" (click)=\"expandRequested.emit()\" title=\"Open in large view\"><bq-icon name=\"expand-alt\"></bq-icon></button>\n        </div>\n      </div>\n      <pre *ngIf=\"highlighted\" [class.dev-template]=\"kind === 'template'\" [innerHTML]=\"highlighted\"></pre>\n      <pre *ngIf=\"!highlighted && content\" [class.dev-template]=\"kind === 'template'\">{{ content }}</pre>\n    </div>\n  `,\n  standalone: false,\n  encapsulation: ViewEncapsulation.None,\n})\nexport class DevCodeViewerComponent {\n  @Input() kind: 'json' | 'template' = 'json';\n  @Input() content: string | null = null;\n  @Input() highlighted: SafeHtml | null = null;\n  @Input() filename = 'output.txt';\n  @Input() error: string | null = null;\n  @Input() emptyMsg: string | null = null;\n  @Input() canExpand = false;\n\n  @Output() expandRequested = new EventEmitter<void>();\n\n  copied = false;\n\n  async copy(): Promise<void> {\n    if (await copyText(this.content)) {\n      this.copied = true;\n      setTimeout(() => { this.copied = false; }, 1500);\n    }\n  }\n\n  download(): void {\n    if (!this.content) return;\n    downloadBlob(this.content, this.filename, MIME_BY_KIND[this.kind]);\n  }\n}\n","import { Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core';\nimport { SafeHtml } from '@angular/platform-browser';\nimport { CaptureAnalysis } from '../bq-lens.types';\n\n@Component({\n  selector: 'app-dev-viewer-container',\n  templateUrl: './dev-viewer-container.component.html',\n  standalone: false,\n  encapsulation: ViewEncapsulation.None,\n})\nexport class DevViewerContainerComponent {\n  @Input() viewMode: 'json' | 'template' | 'insights' | 'request' = 'json';\n  @Input() highlightedJson: SafeHtml | null = null;\n  @Input() selectedJson: string | null = null;\n  @Input() highlightedRequestBody: SafeHtml | null = null;\n  @Input() selectedRequestBody: string | null = null;\n  @Input() templateError: string | null = null;\n  @Input() highlightedTemplate: SafeHtml | null = null;\n  @Input() generatedTemplate: string | null = null;\n  @Input() captureAnalysis: CaptureAnalysis | null = null;\n  @Input() canExpand = false;\n\n  @Output() expandRequested = new EventEmitter<void>();\n}\n","<app-dev-code-viewer\n  *ngIf=\"viewMode === 'json'\"\n  [highlighted]=\"highlightedJson\"\n  [content]=\"selectedJson\"\n  [canExpand]=\"canExpand\"\n  (expandRequested)=\"expandRequested.emit()\">\n</app-dev-code-viewer>\n\n<app-dev-code-viewer\n  *ngIf=\"viewMode === 'request'\"\n  [highlighted]=\"highlightedRequestBody\"\n  [content]=\"selectedRequestBody\"\n  emptyMsg=\"No request body captured.\"\n  [canExpand]=\"canExpand\"\n  (expandRequested)=\"expandRequested.emit()\">\n</app-dev-code-viewer>\n\n<app-dev-code-viewer\n  *ngIf=\"viewMode === 'template'\"\n  kind=\"template\"\n  [error]=\"templateError\"\n  [highlighted]=\"highlightedTemplate\"\n  [content]=\"generatedTemplate\"\n  [canExpand]=\"canExpand\"\n  (expandRequested)=\"expandRequested.emit()\">\n</app-dev-code-viewer>\n\n<app-dev-insights-panel\n  *ngIf=\"viewMode === 'insights'\"\n  [analysis]=\"captureAnalysis\">\n</app-dev-insights-panel>\n","import { animate, style, transition, trigger } from '@angular/animations';\nimport { Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core';\nimport { SafeHtml } from '@angular/platform-browser';\nimport { SessionRegistry } from '@blueriq/angular';\nimport { CaptureAnalysis, CaptureEntry } from '../bq-lens.types';\nimport { ANIMATION_TIMING } from '../dev-animations.utils';\nimport { BodyKind } from '../dev-body-kind.utils';\nimport { httpStatusClass, isErrorStatus } from '../dev-http.utils';\nimport { shortUrl, urlTooltip, urlType } from '../dev-url.utils';\n\n@Component({\n  selector: 'app-dev-capture-list',\n  templateUrl: './dev-capture-list.component.html',\n  standalone: false,\n  encapsulation: ViewEncapsulation.None,\n  animations: [\n    trigger('expandCollapse', [\n      transition(':enter', [\n        style({ height: 0, opacity: 0 }),\n        animate(ANIMATION_TIMING.expand, style({ height: '*', opacity: 1 })),\n      ]),\n      transition(':leave', [\n        animate(ANIMATION_TIMING.collapse, style({ height: 0, opacity: 0 })),\n      ]),\n    ]),\n  ],\n})\nexport class DevCaptureListComponent {\n  constructor(private sessionRegistry: SessionRegistry) {}\n  @Input() captures: CaptureEntry[] = [];\n  @Input() filteredCaptures: CaptureEntry[] = [];\n  @Input() selectedCapture: CaptureEntry | null = null;\n  @Input() filterText = '';\n  @Input() captureActive = false;\n  @Input() viewMode: 'json' | 'template' | 'insights' | 'request' = 'json';\n  @Input() statusFilter: 'all' | '2xx' | '4xx' | '5xx' = 'all';\n  @Input() loadingJson = false;\n  @Input() highlightedJson: SafeHtml | null = null;\n  @Input() selectedJson: string | null = null;\n  @Input() bodyKind: BodyKind = 'empty';\n  @Input() highlightedTemplate: SafeHtml | null = null;\n  @Input() generatedTemplate: string | null = null;\n  @Input() templateError: string | null = null;\n  @Input() captureAnalysis: CaptureAnalysis | null = null;\n  @Input() selectedRequestBody: string | null = null;\n  @Input() highlightedRequestBody: SafeHtml | null = null;\n  @Input() curlCopied = false;\n  @Input() pinnedCaptures: Set<string> = new Set();\n  @Input() isDiffMode = false;\n  @Input() diffBaseCapture: CaptureEntry | null = null;\n\n  @Output() filterTextChange = new EventEmitter<string>();\n  @Output() statusFilterChange = new EventEmitter<'all' | '2xx' | '4xx' | '5xx'>();\n  @Output() captureToggled = new EventEmitter<void>();\n  @Output() capturesCleared = new EventEmitter<void>();\n  @Output() captureSelected = new EventEmitter<CaptureEntry>();\n  @Output() viewModeChange = new EventEmitter<'json' | 'template' | 'insights' | 'request'>();\n  @Output() templateRequested = new EventEmitter<void>();\n  @Output() expandRequested = new EventEmitter<void>();\n  @Output() curlCopyRequested = new EventEmitter<void>();\n  @Output() pinToggled = new EventEmitter<string>();\n  @Output() diffRequested = new EventEmitter<void>();\n  @Output() diffCancelled = new EventEmitter<void>();\n  @Output() showPageRequested = new EventEmitter<void>();\n\n  methodClass(method: string): string {\n    return `dev-method--${method.toLowerCase()}`;\n  }\n\n  statusClass(status: number): string {\n    return `dev-status-code--${httpStatusClass(status)}`;\n  }\n\n  isError(c: CaptureEntry): boolean {\n    return isErrorStatus(c.status);\n  }\n\n  shortUrl(url: string): string {\n    return shortUrl(url, this.sessionRegistry);\n  }\n\n  urlTooltip(url: string): string {\n    return urlTooltip(url, this.sessionRegistry);\n  }\n\n  urlType(url: string): string | null {\n    return urlType(url);\n  }\n\n  tickClass(c: CaptureEntry): string {\n    return httpStatusClass(c.status);\n  }\n\n  setMode(mode: 'json' | 'template' | 'insights' | 'request'): void {\n    if (mode === 'template') {\n      this.templateRequested.emit();\n    } else {\n      this.viewModeChange.emit(mode);\n    }\n  }\n\n  get bodyKindLabel(): string {\n    switch (this.bodyKind) {\n      case 'json': return 'JSON';\n      case 'html': return 'HTML';\n      case 'text': return 'Text';\n      default:     return 'Body';\n    }\n  }\n}\n","<section class=\"dev-section dev-section--list\">\n  <div class=\"dev-section__label\">\n    Captures\n    <span class=\"dev-section__count\" *ngIf=\"filterText\">\n      {{ filteredCaptures.length }} / {{ captures.length }}\n    </span>\n    <div class=\"dev-row\">\n      <button\n        class=\"dev-btn dev-btn--sm dev-btn--toggle\"\n        [class.active]=\"captureActive\"\n        (click)=\"captureToggled.emit()\"\n        [title]=\"captureActive ? 'Pause capturing' : 'Start capturing'\">\n        {{ captureActive ? 'ON' : 'OFF' }}\n      </button>\n      <button class=\"dev-btn dev-btn--sm\" (click)=\"capturesCleared.emit()\" title=\"Clear all captures\">\n        <bq-icon name=\"trash\"></bq-icon> Clear ({{ captures.length }})\n      </button>\n    </div>\n  </div>\n  <!-- Timeline bar — one tick per capture, coloured by status -->\n  <div class=\"dev-timeline\" *ngIf=\"captures.length > 1\">\n    <div *ngFor=\"let c of captures\"\n         class=\"dev-timeline__tick dev-timeline__tick--{{ tickClass(c) }}\"\n         [class.dev-timeline__tick--selected]=\"selectedCapture === c\"\n         [class.dev-timeline__tick--pinned]=\"pinnedCaptures.has(c.id)\"\n         (click)=\"captureSelected.emit(c)\"\n         [title]=\"c.method + ' ' + c.status + ' ' + c.url\">\n    </div>\n  </div>\n\n  <div class=\"dev-filter\">\n    <input\n      class=\"dev-filter__input\"\n      type=\"text\"\n      placeholder=\"Filter by URL or method…\"\n      [ngModel]=\"filterText\"\n      (ngModelChange)=\"filterTextChange.emit($event)\" />\n    <button\n      class=\"dev-filter__clear\"\n      *ngIf=\"filterText\"\n      (click)=\"filterTextChange.emit('')\"\n      title=\"Clear filter\"><bq-icon name=\"times\"></bq-icon></button>\n  </div>\n  <!-- Diff mode banner -->\n  <div class=\"dev-diff-banner\" *ngIf=\"isDiffMode\">\n    <bq-icon name=\"exchange-alt\"></bq-icon>\n    <span class=\"dev-diff-banner__text\">\n      Select a capture to compare with\n      <strong *ngIf=\"diffBaseCapture\">{{ shortUrl(diffBaseCapture.url) }}</strong>\n    </span>\n    <button class=\"dev-icon-btn dev-diff-banner__cancel\" (click)=\"diffCancelled.emit()\" title=\"Cancel diff\">\n      <bq-icon name=\"times\"></bq-icon>\n    </button>\n  </div>\n\n  <!-- Status filter chips -->\n  <div class=\"dev-status-chips\">\n    <button class=\"dev-chip\" [class.active]=\"statusFilter === 'all'\" (click)=\"statusFilterChange.emit('all')\">All</button>\n    <button class=\"dev-chip dev-chip--ok\" [class.active]=\"statusFilter === '2xx'\" (click)=\"statusFilterChange.emit('2xx')\">2xx</button>\n    <button class=\"dev-chip dev-chip--warn\" [class.active]=\"statusFilter === '4xx'\" (click)=\"statusFilterChange.emit('4xx')\">4xx</button>\n    <button class=\"dev-chip dev-chip--error\" [class.active]=\"statusFilter === '5xx'\" (click)=\"statusFilterChange.emit('5xx')\">5xx</button>\n  </div>\n  <div class=\"dev-list-empty\" *ngIf=\"!captures.length\">\n    <bq-icon [name]=\"captureActive ? 'circle-notch' : 'pause-circle'\" [spin]=\"captureActive\"></bq-icon>\n    <span class=\"dev-list-empty__hint\">{{ captureActive ? 'Waiting for requests…' : 'Capturing is off' }}</span>\n  </div>\n  <div class=\"dev-list\" *ngIf=\"captures.length\">\n    <div *ngFor=\"let c of filteredCaptures\" class=\"dev-list__entry\" [class.dev-list__entry--diffable]=\"isDiffMode && selectedCapture !== c\" [class.dev-list__entry--error]=\"isError(c)\" [class.dev-list__entry--pinned]=\"pinnedCaptures.has(c.id)\">\n\n      <!-- Row header -->\n      <div class=\"dev-list__item-row\">\n        <button\n          class=\"dev-list__item\"\n          [class.selected]=\"selectedCapture === c\"\n          (click)=\"captureSelected.emit(c)\">\n          <span class=\"dev-method\" [ngClass]=\"methodClass(c.method)\">{{ c.method }}</span>\n          <span class=\"dev-status-code\" [ngClass]=\"statusClass(c.status)\">{{ c.status }}</span>\n          <span *ngIf=\"urlType(c.url) as t\" class=\"dev-url-type dev-url-type--{{t}}\">{{ t }}</span>\n          <span class=\"dev-url\" [attr.data-tooltip]=\"urlTooltip(c.url)\">{{ shortUrl(c.url) }}</span>\n          <span class=\"dev-duration\" *ngIf=\"c.duration_ms != null\">{{ c.duration_ms }}ms</span>\n          <span class=\"dev-time\">{{ c.timestamp | date:'HH:mm:ss' }}</span>\n        </button>\n        <button\n          class=\"dev-icon-btn dev-list__pin\"\n          (click)=\"pinToggled.emit(c.id)\"\n          [class.pinned]=\"pinnedCaptures.has(c.id)\"\n          [title]=\"pinnedCaptures.has(c.id) ? 'Unpin' : 'Pin'\">\n          <bq-icon name=\"thumbtack\"></bq-icon>\n        </button>\n      </div>\n\n      <!-- Inline detail -->\n      <div class=\"dev-list__detail\" *ngIf=\"selectedCapture === c\" @expandCollapse>\n        <div class=\"dev-list__detail-actions\">\n          <div class=\"dev-view-switch\">\n            <button class=\"dev-view-switch__opt\" [class.active]=\"viewMode === 'json'\" (click)=\"setMode('json')\" [title]=\"bodyKindLabel + ' body'\">{{ bodyKindLabel }}</button>\n            <button *ngIf=\"bodyKind === 'json'\" class=\"dev-view-switch__opt\" [class.active]=\"viewMode === 'template'\" (click)=\"setMode('template')\" title=\"Generate template\">Template</button>\n          </div>\n          <button class=\"dev-btn dev-btn--sm\" [class.active]=\"viewMode === 'request' && !!selectedRequestBody\" (click)=\"setMode('request')\" title=\"Request body\" [disabled]=\"!selectedRequestBody\">Request</button>\n          <button *ngIf=\"bodyKind === 'json'\" class=\"dev-btn dev-btn--sm\" [class.active]=\"viewMode === 'insights' && !!captureAnalysis\" (click)=\"setMode('insights')\" title=\"Analyse response\" [disabled]=\"!captureAnalysis\">Insights</button>\n          <button class=\"dev-btn dev-btn--sm\" [class.dev-btn--copied]=\"curlCopied\" (click)=\"curlCopyRequested.emit()\" title=\"Copy as cURL\">{{ curlCopied ? '✓ cURL' : 'cURL' }}</button>\n          <button class=\"dev-btn dev-btn--sm\" (click)=\"diffRequested.emit()\" title=\"Compare with another capture\"><bq-icon name=\"exchange-alt\"></bq-icon> Diff</button>\n          <button *ngIf=\"bodyKind === 'json'\" class=\"dev-btn dev-btn--sm\" (click)=\"showPageRequested.emit()\" title=\"Show the rendered page from this response\"><bq-icon name=\"file-alt\"></bq-icon> Page</button>\n        </div>\n        <div class=\"dev-json\">\n          <span *ngIf=\"loadingJson\" class=\"dev-muted\">Loading…</span>\n          <app-dev-viewer-container\n            *ngIf=\"!loadingJson\"\n            [viewMode]=\"viewMode\"\n            [highlightedJson]=\"highlightedJson\"\n            [selectedJson]=\"selectedJson\"\n            [highlightedRequestBody]=\"highlightedRequestBody\"\n            [selectedRequestBody]=\"selectedRequestBody\"\n            [templateError]=\"templateError\"\n            [highlightedTemplate]=\"highlightedTemplate\"\n            [generatedTemplate]=\"generatedTemplate\"\n            [captureAnalysis]=\"captureAnalysis\"\n            [canExpand]=\"viewMode === 'json' || viewMode === 'template' || viewMode === 'request'\"\n            (expandRequested)=\"expandRequested.emit()\">\n          </app-dev-viewer-container>\n        </div>\n      </div>\n\n    </div>\n    <div class=\"dev-muted dev-filter__empty\" *ngIf=\"filterText && !filteredCaptures.length\">\n      No matches\n    </div>\n  </div>\n</section>\n","import { Injectable } from '@angular/core';\nimport { CacheEvent, CacheEventType, CaptureEntry, CaptureMeta, ElementTreeNode, Tombstone } from '../bq-lens.types';\nimport { appendBoundedSet, cloneForStorage, safeJsonParse, valuesEqual } from '../dev-json.utils';\nimport { extractSessionId } from '../dev-url.utils';\n\n/**\n * Shape of the snapshot we hold per session — synthesized loads, real /load\n * responses, or partial mixes. Kept open so future Blueriq fields don't\n * require a type bump just to round-trip through the cache.\n */\nexport interface ParsedLoad {\n  elements?: any[];\n  language?: any;\n  csrfToken?: string;\n  messages?: any[];\n  [key: string]: any;\n}\n\n/**\n * Snapshot held by the transactional merge path so a post-merge audit\n * failure can be rolled back. `undefined` markers preserve \"key absent\"\n * so a key that the merge created can be deleted on rollback (rather\n * than turning back into a stale entry). Versions are restored verbatim\n * — they're monotonic during normal operation, but a rollback is the\n * one legitimate case where the prior value comes back.\n */\ninterface TransactionSnapshot {\n  cache: Map<string, any>;\n  parentOf: Map<string, string | undefined>;\n  childrenOf: Map<string, Set<string> | undefined>;\n  tombstones: Map<string, Tombstone | undefined>;\n  versions: Map<string, number>;\n}\n\n/**\n * Recursively strips internal `__*` keys from any cache-derived value so the\n * developer-facing JSON (clipboard / template / story / page-view export)\n * stays clean. The cache and inspector internals lean on these keys\n * (`__truncated`, `__sources`, `__history`, `__capturedIn`) — none of them\n * should leak into anything a developer copies.\n *\n * The `seen` set is **path-scoped**, not permanent: a node is added before\n * recursing into its children and removed after. That way a DAG where the\n * same subtree is referenced from two siblings strips correctly on both\n * visits — a permanent WeakSet would short-circuit the second visit and\n * return the un-stripped original value, leaking `__*` fields downstream.\n * A genuine cycle (the same ref reachable as its own ancestor) still\n * returns the original ref to break the recursion.\n */\nexport function stripInternalFields<T>(value: T, seen: WeakSet<object> = new WeakSet()): T {\n  if (Array.isArray(value)) {\n    if (seen.has(value)) return value;\n    seen.add(value);\n    const arr = value.map(v => stripInternalFields(v, seen)) as unknown as T;\n    seen.delete(value);\n    return arr;\n  }\n  if (value && typeof value === 'object') {\n    const obj = value as Record<string, unknown>;\n    if (seen.has(obj)) return value;\n    seen.add(obj);\n    const out: Record<string, unknown> = {};\n    for (const key of Object.keys(obj)) {\n      if (key.startsWith('__')) continue;\n      out[key] = stripInternalFields(obj[key], seen);\n    }\n    seen.delete(obj);\n    return out as unknown as T;\n  }\n  return value;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class DevElementCacheService {\n  private static readonly MAX_CACHE_EVENTS = 200;\n  // Depth ceiling for buildTree / buildEnrichedJson. Real cycle defense\n  // lives in the per-call `visited` Set inside both methods — that fires\n  // on the first revisit, well before any depth count would. This ceiling\n  // is just a stack-overflow safety net for pathologically-deep trees;\n  // the UI surfaces a `truncated` / `__truncated` flag so the developer\n  // knows the ceiling fired here (instead of confusing the trim with a\n  // real leaf). 30 comfortably exceeds the deepest real Blueriq page\n  // observed (~9) while staying two orders of magnitude under V8's\n  // ~10K-frame call stack.\n  private static readonly MAX_TREE_DEPTH = 30;\n  // Tombstones grow on every delete event. Long-lived sessions with heavy\n  // page churn would balloon them otherwise. Cap is generous — eviction\n  // emits a `quota` cache event so the loss is observable.\n  private static readonly MAX_TOMBSTONES = 500;\n  // sessionLoadJsons accumulates one synthesized/real /load per session id.\n  // Long-running tabs that restart flows repeatedly used to grow this\n  // unbounded; cap at the 10 most-recent sessions, evicting oldest.\n  private static readonly MAX_SESSION_LOADS = 10;\n\n  // Slow-merge threshold (ms) — warmCache calls exceeding this emit a\n  // `slow-merge` event so a degraded live feel is observable from the\n  // internals log instead of just being \"things feel laggy today\".\n  private static readonly SLOW_MERGE_MS = 5;\n  // Per-element bounded history ring (last N value transitions). Each entry\n  // is { ts, value, captureId? } recording what the value was *before* the\n  // most recent change. Bounded so the cache stays small on long sessions\n  // with heavy field traffic; oldest entries fall off the front.\n  private static readonly MAX_HISTORY = 10;\n  // Per-element provenance rings — last N capture URLs and capture ids that\n  // touched the element. Deduped FIFO so repeat traffic from the same source\n  // doesn't push out genuinely-different older sources. Strictly informational;\n  // stripped from any export the developer copies.\n  private static readonly MAX_PROVENANCE = 8;\n\n  private elementCache: Record<string, any> = {};\n  // Held as parsed objects (not stringified) so the export-side readers —\n  // buildTemplateJson, enrichedLoadJson — can use them directly instead of\n  // re-parsing on every read. We deep-clone on write (`cloneForStorage`)\n  // so a writer's mutation of the source `data` doesn't corrupt the\n  // snapshot we hand to consumers.\n  private sessionLoadJsons: Record<string, ParsedLoad> = {};\n  private cacheEvents: CacheEvent[] = [];\n  // Parent links maintained on every cache write so breadcrumb walks are\n  // O(depth) instead of O(n)-rebuilding-the-whole-map per navigation. Kept\n  // as a pair of indexes — `parentOf` gives quick child → parent lookups\n  // (the breadcrumb hot path) and `childrenOf` lets us diff old vs. new\n  // children sets in updateParentLinks without re-scanning parentOf.\n  private parentOf: Map<string, string> = new Map();\n  private childrenOf: Map<string, Set<string>> = new Map();\n  // Deleted elements move here instead of being dropped, so the inspector\n  // can still surface their last-known state (with a \"deleted in capture N\"\n  // affordance) and search/structure can still find them on demand.\n  private tombstones: Map<string, Tombstone> = new Map();\n  // Per-key monotonic counter, bumped on every absorb / tombstone. Lets\n  // downstream memoizers (template cache, inspector) cheaply tell whether\n  // their derived state for a key is stale: cached at vN, current is vN+1\n  // → recompute. O(1) on the hot path; no deep equality needed.\n  private versions: Map<string, number> = new Map();\n  // One-shot guard: rehydrateFromCaptures replays warmCache for every\n  // persisted capture. A second pass would re-absorb already-tombstoned\n  // elements (absorbElement's tombstone-merge logic resurrects them), so\n  // we only rehydrate once between clears. Reset by clearCache.\n  private hasRehydrated = false;\n  // Cheap shape-sketch of the last absorbed capture, used to skip an\n  // immediately-following identical body. Catches rapid retransmits\n  // (polling, double-clicks, retries on transient network blips) without\n  // a full hash. Cleared by clearCache.\n  private lastCaptureSketch: string | null = null;\n\n  clearCache(): void {\n    this.elementCache = {};\n    this.sessionLoadJsons = {};\n    this.parentOf.clear();\n    this.childrenOf.clear();\n    this.tombstones.clear();\n    this.versions.clear();\n    this.hasRehydrated = false;\n    this.lastCaptureSketch = null;\n    this.cacheEvent('clear');\n  }\n\n  /**\n   * Monotonic per-key revision counter. Bumped on every absorb / tombstone,\n   * never decreases. Returns 0 for keys that have never been written. Pair\n   * with `${key}:${version}` to memoize anything derived from an element\n   * (template generation, structural rollups, inspector summaries).\n   */\n  getCacheVersion(key: string): number {\n    return this.versions.get(key) ?? 0;\n  }\n\n  private bumpVersion(key: string): void {\n    this.versions.set(key, (this.versions.get(key) ?? 0) + 1);\n  }\n\n  getCacheEvents(): readonly CacheEvent[] {\n    return this.cacheEvents;\n  }\n\n  clearCacheEvents(): void {\n    this.cacheEvents = [];\n  }\n\n  private cacheEvent(type: CacheEventType, detail?: unknown): void {\n    this.cacheEvents.push({ type, ts: Date.now(), detail });\n    if (this.cacheEvents.length > DevElementCacheService.MAX_CACHE_EVENTS) {\n      this.cacheEvents.shift();\n    }\n  }\n\n  // Bound version of safeJsonParse that surfaces parse failures via\n  // cacheEvent. Use this whenever the input string came from persisted state\n  // (sessionLoadJsons, captureService snapshots, IndexedDB on rehydrate) —\n  // silent failure there means we lose elements without anyone noticing.\n  private parseLogged<T>(raw: string | null | undefined, fallback: T, context: string): T {\n    return safeJsonParse(raw, fallback, (err, str) => {\n      this.cacheEvent('parse-error', {\n        context,\n        rawLength: str.length,\n        error: err instanceof Error ? { name: err.name, message: err.message } : String(err),\n      });\n    });\n  }\n\n  getElement(key: string, options?: { includeTombstoned?: boolean }): any {\n    const live = this.elementCache[key];\n    if (live !== undefined) return live;\n    if (options?.includeTombstoned) return this.tombstones.get(key)?.element;\n    return undefined;\n  }\n\n  getTombstone(key: string): Tombstone | undefined {\n    return this.tombstones.get(key);\n  }\n\n  allTombstones(): readonly Tombstone[] {\n    return Array.from(this.tombstones.values());\n  }\n\n  /**\n   * Snapshot of the parent/child topology, ready for graph rendering.\n   *\n   * - With a `rootKey`, walks descendants starting from that key (BFS).\n   *   Use this for the inspector-popup graph view scoped to a single subtree.\n   * - Without a `rootKey`, returns the full topology (every element with a\n   *   parent link). Use this for the top-level page graph.\n   *\n   * Returns plain arrays — the graph component doesn't need Map semantics, and\n   * arrays serialize cleanly if we ever export the graph.\n   *\n   * Tombstones are off by default; pass `{ includeTombstoned: true }` when\n   * investigating \"what got deleted\".\n   */\n  getGraphSnapshot(\n    rootKey?: string,\n    options?: { includeTombstoned?: boolean },\n  ): {\n    nodes: { key: string; type: string; label: string; styles: string[]; tombstoned: boolean }[];\n    edges: { from: string; to: string }[];\n  } {\n    const includeTombstoned = !!options?.includeTombstoned;\n    const seen = new Set<string>();\n    const queue: string[] = [];\n    if (rootKey) {\n      queue.push(rootKey);\n    } else {\n      for (const key of Object.keys(this.elementCache)) queue.push(key);\n      if (includeTombstoned) for (const key of this.tombstones.keys()) queue.push(key);\n    }\n\n    const nodes: { key: string; type: string; label: string; styles: string[]; tombstoned: boolean }[] = [];\n    const edges: { from: string; to: string }[] = [];\n\n    while (queue.length) {\n      const key = queue.shift()!;\n      if (seen.has(key)) continue;\n      seen.add(key);\n\n      const live = this.elementCache[key];\n      const tomb = this.tombstones.get(key);\n      const el = live ?? (includeTombstoned ? tomb?.element : undefined);\n      if (!el) continue;\n\n      nodes.push({\n        key,\n        type: el.type ?? 'unknown',\n        label: el.displayName || el.name || el.functionalKey || el.key || key,\n        styles: Array.isArray(el.styles) ? el.styles : [],\n        tombstoned: !live && !!tomb,\n      });\n\n      const children = this.childrenOf.get(key);\n      if (children) {\n        for (const childKey of children) {\n          edges.push({ from: key, to: childKey });\n          if (!seen.has(childKey)) queue.push(childKey);\n        }\n      }\n    }\n\n    return { nodes, edges };\n  }\n\n  // Replays a (newest-first) capture log through warmCache in chronological\n  // order, restoring the in-memory cache after a tab reload. Without this,\n  // the BehaviorSubject's first emission on resubscribe only warmed the\n  // most-recent capture and silently dropped the other 49 — exactly the\n  // forgetting we're hardening against.\n  //\n  // Idempotent across calls: a second invocation (e.g. dev-mode toggle off\n  // then on) is a no-op because absorbElement's tombstone-merge logic\n  // would resurrect tombstoned elements on a replay. Cleared by clearCache.\n  rehydrateFromCaptures(captures: readonly CaptureEntry[]): void {\n    if (this.hasRehydrated) return;\n    if (!captures.length) {\n      this.hasRehydrated = true;\n      return;\n    }\n    this.hasRehydrated = true;\n    // captures are newest-first; replay in chronological order so deletes\n    // and adds resolve in the same sequence the runtime emitted them.\n    for (let i = captures.length - 1; i >= 0; i--) {\n      this.warmCache(captures[i]);\n    }\n  }\n\n  warmCache(entry: CaptureEntry): void {\n    const data = entry.responseBody;\n    if (!data) return;\n\n    // Cheap shape-sketch dedup: identical (url, status, body shape) as the\n    // last absorbed capture is almost always a retransmit. Skip the merge\n    // (saves the O(m) walk over elements/events) and surface the skip so\n    // the dev knows it happened. False positives are rare and recoverable\n    // — the next genuinely-new capture will absorb fresh data.\n    const sketch = this.computeBodySketch(entry);\n    if (sketch && sketch === this.lastCaptureSketch) {\n      this.cacheEvent('skip', { reason: 'duplicate', url: entry.url });\n      return;\n    }\n    this.lastCaptureSketch = sketch;\n\n    const t0 = typeof performance !== 'undefined' ? performance.now() : Date.now();\n\n    // Always try to absorb element-shaped data — a 4xx/5xx Blueriq response\n    // can still carry valid elements, and silently dropping them is exactly\n    // the \"forgetting\" we're hardening against.\n    const captureTs = entry.timestamp ? Date.parse(entry.timestamp) : Date.now();\n    this.mergeElements(data, {\n      captureMeta: {\n        captureId: entry.id,\n        url: entry.url,\n        ts: Number.isFinite(captureTs) ? captureTs : Date.now(),\n      },\n    });\n\n    // The full /load response and any synthesized-load fallback both feed\n    // template generation downstream — only treat *successful* responses as\n    // authoritative for that path. A failing /load (CSRF refused, session\n    // expired) must not clobber an earlier healthy load response.\n    const isSuccessful = entry.status >= 200 && entry.status < 300;\n    if (isSuccessful) {\n      if (entry.url?.includes('/load')) {\n        const sessionId = extractSessionId(entry.url);\n        if (sessionId) {\n          this.sessionLoadJsons[sessionId] = cloneForStorage(data) as ParsedLoad;\n          this.evictExcessSessionLoads();\n        }\n      }\n      this.maybeSynthesizeLoad(data, entry.url ?? '');\n    }\n\n    const ms = (typeof performance !== 'undefined' ? performance.now() : Date.now()) - t0;\n    if (ms > DevElementCacheService.SLOW_MERGE_MS) {\n      this.cacheEvent('slow-merge', {\n        ms: Math.round(ms * 100) / 100,\n        url: entry.url,\n        status: entry.status,\n      });\n    }\n  }\n\n  mergeElements(parsed: any, options?: { transactional?: boolean; captureMeta?: CaptureMeta }): void {\n    if (!options?.transactional) {\n      this.applyMerge(parsed, options?.captureMeta);\n      return;\n    }\n    // Transactional path: snapshot the keys this merge will touch (plus\n    // their immediate neighbors), apply, then audit. If the audit reports\n    // structural damage, restore from snapshot and surface the rollback.\n    // Default off because the snapshot/audit pair adds 2-5x to the merge\n    // cost; opt-in for fixture replay and fuzz tests.\n    const touched = this.collectTouchedKeys(parsed);\n    if (!touched.size) {\n      this.applyMerge(parsed, options?.captureMeta);\n      return;\n    }\n    const snapshot = this.snapshotKeys(touched);\n    this.applyMerge(parsed, options?.captureMeta);\n    const violations = this.auditTouchedKeys(touched);\n    if (violations.length) {\n      this.restoreSnapshot(snapshot);\n      this.cacheEvent('integrity-violation', {\n        reason: 'transactional-rollback',\n        violations: violations.slice(0, 10),\n        violationCount: violations.length,\n        touched: touched.size,\n      });\n    }\n  }\n\n  private applyMerge(parsed: any, captureMeta?: CaptureMeta): void {\n    if (Array.isArray(parsed?.elements)) {\n      for (const el of parsed.elements) {\n        if (!el?.key) continue;\n        this.absorbElement(el, captureMeta);\n      }\n      return;\n    }\n    if (Array.isArray(parsed?.events)) {\n      for (const event of parsed.events) {\n        for (const change of this.extractChanges(event, 'mergeElements')) {\n          if (change?.type === 'add' && change?.model?.key) {\n            this.absorbElement(change.model, captureMeta);\n          } else if (change?.type === 'delete' && change?.key) {\n            this.tombstoneFromCache(change.key);\n          }\n        }\n      }\n    }\n  }\n\n  /**\n   * Walks the parsed payload to enumerate every element key it would write,\n   * plus the keys of any children it references — those are the cells the\n   * snapshot has to capture so a rollback can reconstruct prior state.\n   * Cheap (no merge), runs once before the apply.\n   */\n  private collectTouchedKeys(parsed: any): Set<string> {\n    const keys = new Set<string>();\n    if (Array.isArray(parsed?.elements)) {\n      for (const el of parsed.elements) {\n        if (el?.key) keys.add(el.key);\n        if (Array.isArray(el?.children)) {\n          for (const c of el.children) if (typeof c === 'string') keys.add(c);\n        }\n      }\n    }\n    if (Array.isArray(parsed?.events)) {\n      for (const ev of parsed.events) {\n        const env = (ev as any)?.changes;\n        if (!Array.isArray(env?.changes)) continue;\n        for (const c of env.changes) {\n          if (c?.type === 'add' && c.model?.key) {\n            keys.add(c.model.key);\n            if (Array.isArray(c.model.children)) {\n              for (const child of c.model.children) if (typeof child === 'string') keys.add(child);\n            }\n          } else if (c?.type === 'delete' && typeof c?.key === 'string') {\n            keys.add(c.key);\n          }\n        }\n      }\n    }\n    return keys;\n  }\n\n  private snapshotKeys(keys: Set<string>): TransactionSnapshot {\n    const snap: TransactionSnapshot = {\n      cache: new Map(),\n      parentOf: new Map(),\n      childrenOf: new Map(),\n      tombstones: new Map(),\n      versions: new Map(),\n    };\n    for (const key of keys) {\n      // `undefined` markers preserve \"key absent\" so restoreSnapshot can\n      // delete a key that the merge created and the audit then rejected.\n      snap.cache.set(key, key in this.elementCache ? this.elementCache[key] : undefined);\n      snap.parentOf.set(key, this.parentOf.get(key));\n      const ch = this.childrenOf.get(key);\n      snap.childrenOf.set(key, ch ? new Set(ch) : undefined);\n      snap.tombstones.set(key, this.tombstones.get(key));\n      snap.versions.set(key, this.versions.get(key) ?? 0);\n    }\n    return snap;\n  }\n\n  private restoreSnapshot(snap: TransactionSnapshot): void {\n    for (const [key, val] of snap.cache) {\n      if (val === undefined) delete this.elementCache[key];\n      else this.elementCache[key] = val;\n    }\n    for (const [key, val] of snap.parentOf) {\n      if (val === undefined) this.parentOf.delete(key);\n      else this.parentOf.set(key, val);\n    }\n    for (const [key, val] of snap.childrenOf) {\n      if (val === undefined) this.childrenOf.delete(key);\n      else this.childrenOf.set(key, val);\n    }\n    for (const [key, val] of snap.tombstones) {\n      if (val === undefined) this.tombstones.delete(key);\n      else this.tombstones.set(key, val);\n    }\n    for (const [key, val] of snap.versions) {\n      // Versions can never decrease in production; on rollback we still\n      // restore the prior value so memoizers downstream aren't poisoned\n      // with the rolled-back element under a fresh version number.\n      this.versions.set(key, val);\n    }\n  }\n\n  /**\n   * Post-merge audit limited to the touched-keys set. Detects orphans\n   * (child reference with no element + no tombstone) and cycles via\n   * parentOf chain. Multi-parent is auto-healed in updateParentLinks\n   * already and reported there, so we don't double-flag it.\n   */\n  private auditTouchedKeys(keys: Set<string>): Array<{ key: string; reason: string; detail?: string }> {\n    const violations: Array<{ key: string; reason: string; detail?: string }> = [];\n    for (const key of keys) {\n      const el = this.elementCache[key];\n      if (el && Array.isArray(el.children)) {\n        for (const childKey of el.children) {\n          if (typeof childKey !== 'string') continue;\n          if (this.elementCache[childKey] === undefined && !this.tombstones.has(childKey)) {\n            violations.push({ key, reason: 'orphan-child', detail: childKey });\n          }\n        }\n      }\n      // Cycle check via parentOf chain — bounded by visited set.\n      const visited = new Set<string>([key]);\n      let cur = this.parentOf.get(key);\n      while (cur) {\n        if (visited.has(cur)) {\n          violations.push({ key, reason: 'cycle', detail: cur });\n          break;\n        }\n        visited.add(cur);\n        cur = this.parentOf.get(cur);\n      }\n    }\n    return violations;\n  }\n\n  // O(1) shape-sketch used by the warmCache dedup guard. Cheap enough to\n  // run on every capture (no body iteration, no stringify) yet specific\n  // enough that two genuinely-different captures rarely collide. Returns\n  // null on shapes we can't characterize, which disables dedup for that\n  // capture (safer than a coarse fallback that could falsely-dedup).\n  private computeBodySketch(entry: CaptureEntry): string | null {\n    const body = entry.responseBody;\n    if (!body || typeof body !== 'object') return null;\n    let elementsLen = -1;\n    let eventsLen = -1;\n    let firstKey = '';\n    if (Array.isArray((body as any).elements)) {\n      elementsLen = (body as any).elements.length;\n      firstKey = (body as any).elements[0]?.key ?? '';\n    }\n    if (Array.isArray((body as any).events)) {\n      eventsLen = (body as any).events.length;\n      if (!firstKey) {\n        const ev0 = (body as any).events[0];\n        const change0 = ev0?.changes?.changes?.[0];\n        firstKey = change0?.model?.key ?? change0?.key ?? '';\n      }\n    }\n    if (elementsLen === -1 && eventsLen === -1) return null;\n    return `${entry.url}|${entry.status}|e:${elementsLen}|v:${eventsLen}|k:${firstKey}`;\n  }\n\n  // Pulls `event.changes.changes` out as an array, flagging malformed shapes\n  // (a `changes` envelope present but `changes.changes` not an array) so they\n  // surface in the internals log instead of silently no-op'ing via the old\n  // `event?.changes?.changes ?? []` default. A genuinely-absent envelope (no\n  // `event.changes` at all) is a legitimate non-mutating event — don't flag.\n  private extractChanges(event: any, context: string): any[] {\n    if (!event || typeof event !== 'object') return [];\n    const envelope = event.changes;\n    if (envelope === undefined || envelope === null) return [];\n    if (!Array.isArray(envelope.changes)) {\n      this.cacheEvent('skip', {\n        reason: 'malformed-changes',\n        context,\n        eventType: event.type,\n        envelopeKeys: typeof envelope === 'object' ? Object.keys(envelope) : null,\n      });\n      return [];\n    }\n    return envelope.changes;\n  }\n\n  // Inserts/merges an element into the live cache. If the key matches a\n  // tombstone, that's a re-add — pull the tombstoned snapshot forward as\n  // the merge base so previously-known fields aren't lost when only a\n  // partial element shape is re-emitted.\n  private absorbElement(el: any, captureMeta?: CaptureMeta): void {\n    if (!el?.key) return;\n    const tomb = this.tombstones.get(el.key);\n    const prev = tomb ? tomb.element : this.elementCache[el.key];\n\n    // History ring: record the *prior* value when this absorb actually\n    // changes it. Skipped on first sight (prev undefined) and on no-op\n    // overwrites (Blueriq sometimes re-sends the same value verbatim).\n    let history: Array<{ ts: number; value: unknown; captureId?: string }> | undefined;\n    if (\n      prev &&\n      el.value !== undefined &&\n      prev.value !== undefined &&\n      !valuesEqual(prev.value, el.value)\n    ) {\n      const base = Array.isArray(prev.__history) ? [...prev.__history] : [];\n      base.push({\n        ts: captureMeta?.ts ?? Date.now(),\n        value: prev.value,\n        ...(captureMeta?.captureId ? { captureId: captureMeta.captureId } : {}),\n      });\n      if (base.length > DevElementCacheService.MAX_HISTORY) {\n        base.splice(0, base.length - DevElementCacheService.MAX_HISTORY);\n      }\n      history = base;\n    } else if (prev && Array.isArray(prev.__history)) {\n      history = prev.__history;\n    }\n\n    // Provenance rings — append regardless of value change so a developer\n    // can trace which captures contributed to an element even when the\n    // value remained constant (parent-only updates, structural moves).\n    const sources = appendBoundedSet(\n      prev?.__sources,\n      captureMeta?.url,\n      DevElementCacheService.MAX_PROVENANCE,\n    );\n    const capturedIn = appendBoundedSet(\n      prev?.__capturedIn,\n      captureMeta?.captureId,\n      DevElementCacheService.MAX_PROVENANCE,\n    );\n\n    const merged: any = tomb\n      ? { ...tomb.element, ...el }\n      : { ...prev, ...el };\n\n    // Re-attach internal trackers AFTER the spread so an upstream payload\n    // that happens to carry a `__history`/`__sources`/`__capturedIn` field\n    // (it shouldn't, but defensive) can't poison the cache's view.\n    if (history && history.length) merged.__history = history;\n    if (sources.length) merged.__sources = sources;\n    if (capturedIn.length) merged.__capturedIn = capturedIn;\n\n    this.elementCache[el.key] = merged;\n    if (tomb) this.tombstones.delete(el.key);\n    this.updateParentLinks(el.key, el.children);\n    this.bumpVersion(el.key);\n  }\n\n  // Updates parentOf / childrenOf to reflect a parent's current children.\n  // No-op when newChildren is not an array — the merge kept the previous\n  // children array (or there never was one), so parent links shouldn't move.\n  private updateParentLinks(parentKey: string, newChildren: unknown): void {\n    if (!Array.isArray(newChildren)) return;\n    const newSet = new Set<string>();\n    for (const child of newChildren) {\n      if (typeof child === 'string') newSet.add(child);\n    }\n    // Multi-parent reassignment: if a child in the new set already points\n    // at a different parent, the old parent's cached children array may\n    // still include it. Self-heal by pruning the stale reference and\n    // detaching the child from the old childrenOf set; surface the move\n    // so the internals panel can flag genuinely-bad runtime payloads.\n    for (const child of newSet) {\n      const existingParent = this.parentOf.get(child);\n      if (existingParent && existingParent !== parentKey) {\n        const oldParentEl = this.elementCache[existingParent];\n        if (oldParentEl && Array.isArray(oldParentEl.children) && oldParentEl.children.includes(child)) {\n          this.elementCache[existingParent] = {\n            ...oldParentEl,\n            children: oldParentEl.children.filter((c: string) => c !== child),\n          };\n          this.bumpVersion(existingParent);\n          this.cacheEvent('integrity-violation', {\n            reason: 'multi-parent',\n            child,\n            oldParent: existingParent,\n            newParent: parentKey,\n          });\n        }\n        this.childrenOf.get(existingParent)?.delete(child);\n      }\n    }\n    const oldSet = this.childrenOf.get(parentKey);\n    if (oldSet) {\n      for (const removed of oldSet) {\n        // Only drop parent-link entries that still point at *this* parent —\n        // a child reassigned to a different parent has already overwritten\n        // its entry (last write wins), and we mustn't clobber that.\n        if (!newSet.has(removed) && this.parentOf.get(removed) === parentKey) {\n          this.parentOf.delete(removed);\n        }\n      }\n    }\n    for (const child of newSet) {\n      this.parentOf.set(child, parentKey);\n    }\n    this.childrenOf.set(parentKey, newSet);\n  }\n\n  // Moves a key out of the live cache into tombstones, prunes the dangling\n  // child reference from its parent's `children` array, and detaches it from\n  // both parent indexes. The tombstone preserves the last-known element so\n  // the inspector / search can still surface it with a \"deleted\" affordance.\n  private tombstoneFromCache(removedKey: string): void {\n    const element = this.elementCache[removedKey];\n    if (element === undefined) {\n      // Already gone (or never seen). Idempotent — don't tombstone an\n      // unknown key, but also don't throw.\n      return;\n    }\n\n    // Prune the dangling reference from the parent's children array so\n    // buildTree never produces a \"?\" stub for a child we know is deleted.\n    // Reassigns rather than mutates in place, matching the {...old, ...new}\n    // convention used elsewhere in mergeElements.\n    const parentKey = this.parentOf.get(removedKey);\n    if (parentKey) {\n      const parent = this.elementCache[parentKey];\n      if (parent && Array.isArray(parent.children)) {\n        this.elementCache[parentKey] = {\n          ...parent,\n          children: parent.children.filter((c: string) => c !== removedKey),\n        };\n      }\n      this.childrenOf.get(parentKey)?.delete(removedKey);\n    }\n\n    // Detach removedKey from indexes — both as a child and as a parent.\n    this.parentOf.delete(removedKey);\n    const formerChildren = this.childrenOf.get(removedKey);\n    if (formerChildren) {\n      for (const child of formerChildren) {\n        if (this.parentOf.get(child) === removedKey) {\n          this.parentOf.delete(child);\n        }\n      }\n      this.childrenOf.delete(removedKey);\n    }\n\n    delete this.elementCache[removedKey];\n    this.tombstones.set(removedKey, {\n      key: removedKey,\n      element,\n      deletedAt: Date.now(),\n    });\n    this.bumpVersion(removedKey);\n    this.evictExcessTombstones();\n  }\n\n  // Maps are insertion-ordered, so the oldest tombstone is the first key\n  // returned by Map#keys(). Drop oldest until we're back under the cap and\n  // record one `quota` event per pruning batch (not per evicted key) so the\n  // cache log doesn't spam.\n  private evictExcessTombstones(): void {\n    const overflow = this.tombstones.size - DevElementCacheService.MAX_TOMBSTONES;\n    if (overflow <= 0) return;\n    const keys = Array.from(this.tombstones.keys()).slice(0, overflow);\n    for (const key of keys) this.tombstones.delete(key);\n    this.cacheEvent('quota', {\n      reason: 'tombstone-overflow',\n      evicted: keys.length,\n      cap: DevElementCacheService.MAX_TOMBSTONES,\n    });\n  }\n\n  maybeSynthesizeLoad(parsed: any, url: string): void {\n    if (!Array.isArray(parsed?.events)) return;\n    const sessionId = extractSessionId(url);\n    if (!sessionId) return;\n\n    for (const event of parsed.events) {\n      if (event?.type !== 'page') continue;\n      const added = this.extractChanges(event, 'maybeSynthesizeLoad')\n        .filter((c: any) => c?.type === 'add' && c?.model?.key)\n        .map((c: any) => c.model as Record<string, unknown>);\n      if (!added.some(el => el['type'] === 'page')) continue;\n\n      // Preserve language and prior elements from any earlier synthesized\n      // (or real) load for this session. Outright overwrite drops elements\n      // that were emitted by previous page events but aren't part of this\n      // event's `add` set — e.g. shared header/footer elements that the\n      // server only includes on the first page transition. We merge by key\n      // (new wins on conflict) so the synthesized snapshot stays a complete\n      // picture of what the developer can navigate back to.\n      let language: unknown = { patterns: { date: 'dd-MM-yyyy', datetime: 'dd-MM-yyyy HH:mm:ss' }, languageCode: 'nl-NL' };\n      const merged: Record<string, Record<string, unknown>> = {};\n      const prior = this.sessionLoadJsons[sessionId];\n      if (prior) {\n        if (prior.language) language = prior.language;\n        if (Array.isArray(prior.elements)) {\n          for (const el of prior.elements) {\n            // Skip prior elements that have since been tombstoned. Without\n            // this filter, the accumulating merge would resurrect zombies\n            // into the synthesized load — they'd reappear in\n            // `enrichedLoadJson`/templates even though the runtime told us\n            // they'd been deleted.\n            if (el?.key && !this.tombstones.has(el.key)) merged[el.key] = el;\n          }\n        }\n      }\n      for (const el of added) {\n        const k = el['key'];\n        if (typeof k === 'string') merged[k] = { ...(merged[k] ?? {}), ...el };\n      }\n      this.sessionLoadJsons[sessionId] = {\n        csrfToken: '',\n        elements: Object.values(merged),\n        language,\n        messages: [],\n      };\n      this.evictExcessSessionLoads();\n      break;\n    }\n  }\n\n  // Insertion-ordered eviction: oldest session id leaves first when we\n  // exceed MAX_SESSION_LOADS. Object.keys preserves insertion order for\n  // string keys; rewriting an existing key doesn't promote it (intentional\n  // — we want first-in-first-out, not LRU, so a long-running session\n  // doesn't hold the slot forever).\n  private evictExcessSessionLoads(): void {\n    const keys = Object.keys(this.sessionLoadJsons);\n    const overflow = keys.length - DevElementCacheService.MAX_SESSION_LOADS;\n    if (overflow <= 0) return;\n    for (let i = 0; i < overflow; i++) {\n      delete this.sessionLoadJsons[keys[i]];\n    }\n    this.cacheEvent('quota', {\n      reason: 'session-ring-overflow',\n      evicted: overflow,\n      cap: DevElementCacheService.MAX_SESSION_LOADS,\n    });\n  }\n\n  buildTemplateJson(selectedJson: string, selectedCaptureUrl: string | null): string {\n    const sessionId = selectedCaptureUrl ? extractSessionId(selectedCaptureUrl) : null;\n    const loadParsed = sessionId ? this.sessionLoadJsons[sessionId] : null;\n\n    if (loadParsed) {\n      try {\n        const eventParsed = JSON.parse(selectedJson);\n        if (!Array.isArray(loadParsed.elements)) return this.withMergedElements(selectedJson);\n        let merged = this.mergeIntoMap({}, loadParsed.elements);\n        if (Array.isArray(eventParsed?.elements)) {\n          merged = this.mergeIntoMap(merged, eventParsed.elements);\n        }\n        return JSON.stringify(stripInternalFields({ ...loadParsed, elements: Object.values(merged) }));\n      } catch (e) {\n        // Only the per-capture event JSON is parsed here now (the load-side\n        // is held as a pre-parsed object), so any throw is from the\n        // selectedJson string. Surface it instead of falling back silently.\n        this.cacheEvent('parse-error', {\n          method: 'buildTemplateJson',\n          error: e instanceof Error ? { name: e.name, message: e.message } : String(e),\n        });\n      }\n    }\n\n    return this.withMergedElements(selectedJson);\n  }\n\n  withMergedElements(json: string): string {\n    const parsed = safeJsonParse<any>(json, null);\n    if (!parsed || !Array.isArray(parsed.elements)) return json;\n    const merged = this.mergeIntoMap({ ...this.elementCache }, parsed.elements);\n    return JSON.stringify(stripInternalFields({ ...parsed, elements: Object.values(merged) }));\n  }\n\n  /**\n   * Enriched JSON rooted at a *specific* capture's response — same shape\n   * `_showFromLoadJson` consumes. The capture's elements drive the root set;\n   * the global cache fills in descendants. For event-shaped responses, only\n   * freshly-added elements are surfaced. Returns null if the capture has no\n   * usable element data.\n   */\n  enrichedJsonForCapture(entry: CaptureEntry): string | null {\n    const body = entry.responseBody;\n    if (!body) return null;\n\n    let rootElements: any[] | null = null;\n    if (Array.isArray(body.elements)) {\n      rootElements = body.elements;\n    } else if (Array.isArray(body.events)) {\n      const adds: any[] = [];\n      for (const ev of body.events) {\n        for (const c of this.extractChanges(ev, 'enrichedJsonForCapture')) {\n          if (c?.type === 'add' && c?.model?.key) adds.push(c.model);\n        }\n      }\n      rootElements = adds.length ? adds : null;\n    }\n    if (!rootElements) return null;\n\n    const merged = this.mergeIntoMap({ ...this.elementCache }, rootElements);\n    return JSON.stringify(stripInternalFields({ ...body, elements: Object.values(merged) }));\n  }\n\n  enrichedLoadJson(): string | null {\n    const entries = Object.entries(this.sessionLoadJsons);\n    if (!entries.length) return null;\n    const [, parsed] = entries[entries.length - 1];\n    if (!parsed || !Array.isArray(parsed.elements)) return null;\n    const merged = this.mergeIntoMap(\n      this.mergeIntoMap({}, parsed.elements),\n      Object.values(this.elementCache),\n    );\n    return JSON.stringify(stripInternalFields({ ...parsed, elements: Object.values(merged) }));\n  }\n\n  buildTree(key: string, depth = 0, visited: Set<string> = new Set()): ElementTreeNode {\n    if (visited.has(key)) {\n      // Cycle within the tree walk — depth ceiling alone would silently\n      // exhaust the budget; flag the cycle explicitly and stop here so\n      // the surrounding tree still renders.\n      this.cacheEvent('integrity-violation', { method: 'buildTree', cycleAt: key });\n      const el = this.elementCache[key];\n      return {\n        key,\n        type: el?.type ?? '?',\n        label: el?.displayName || el?.name || el?.functionalKey || key,\n        styles: Array.isArray(el?.styles) ? el.styles : [],\n        children: [],\n        totalDescendants: 0,\n        truncated: true,\n      };\n    }\n    const el = this.elementCache[key];\n    if (!el) {\n      // Tombstoned: surface last-known type/label so the tree reads as\n      // \"this element existed and was deleted\" rather than as a \"?\" stub.\n      const tomb = this.tombstones.get(key);\n      if (tomb) {\n        const t = tomb.element ?? {};\n        return {\n          key,\n          type: t.type ?? 'unknown',\n          label: t.displayName || t.name || t.functionalKey || key,\n          styles: Array.isArray(t.styles) ? t.styles : [],\n          children: [],\n          totalDescendants: 0,\n        };\n      }\n      // Truly unknown — after tombstone-pruning runs, a \"?\" stub means the\n      // parent's `children` referenced a key the cache has never seen and\n      // also never tombstoned. That's a real integrity violation; record it\n      // so the internals panel can flag the gap.\n      this.cacheEvent('integrity-violation', { method: 'buildTree', missingKey: key });\n      return { key, type: '?', label: key, styles: [], children: [], totalDescendants: 0 };\n    }\n    const hasChildren = Array.isArray(el.children) && el.children.length > 0;\n    const truncated = depth >= DevElementCacheService.MAX_TREE_DEPTH && hasChildren;\n    visited.add(key);\n    const children: ElementTreeNode[] = !truncated && hasChildren\n      ? el.children.map((k: string) => this.buildTree(k, depth + 1, visited))\n      : [];\n    visited.delete(key);\n    const totalDescendants = children.reduce((sum, c) => sum + 1 + c.totalDescendants, 0);\n    return {\n      key: el.key ?? key,\n      type: el.type ?? 'unknown',\n      label: el.displayName || el.name || el.functionalKey || el.key || key,\n      styles: Array.isArray(el.styles) ? el.styles : [],\n      children,\n      totalDescendants,\n      ...(truncated ? { truncated: true } : {}),\n    };\n  }\n\n  buildEnrichedJson(key: string, depth = 0, visited: Set<string> = new Set()): any {\n    if (visited.has(key)) {\n      // A cycle within the recursion ceiling — the depth guard would catch\n      // the runaway, but flagging it explicitly tells the developer the\n      // tree shape is malformed (parent-of-self or sibling cross-link)\n      // rather than just deep.\n      this.cacheEvent('integrity-violation', { method: 'buildEnrichedJson', cycleAt: key });\n      return { key, __cycle: true };\n    }\n    const el = this.elementCache[key];\n    if (!el) {\n      const tomb = this.tombstones.get(key);\n      if (tomb) return tomb.element;\n      this.cacheEvent('integrity-violation', { method: 'buildEnrichedJson', missingKey: key });\n      return { key };\n    }\n    if (!Array.isArray(el.children)) return el;\n    if (depth >= DevElementCacheService.MAX_TREE_DEPTH) {\n      // Stop recursing — but flag it so consumers can tell the difference\n      // between \"this element genuinely has unresolved-key children\" and\n      // \"we hit the recursion ceiling here\". `__truncated` is stripped on\n      // export paths so user-facing JSON stays clean.\n      return el.children.length > 0 ? { ...el, __truncated: true } : el;\n    }\n    visited.add(key);\n    const childNodes = el.children.map((k: string) => this.buildEnrichedJson(k, depth + 1, visited));\n    visited.delete(key);\n    return { ...el, children: childNodes };\n  }\n\n  collectElementWithDescendants(key: string, visited = new Set<string>()): any[] {\n    if (visited.has(key)) {\n      // Cycle: not the only caller's problem, but worth flagging so the\n      // internals panel can correlate it with other integrity events\n      // for the same key. Returning [] keeps the caller well-behaved.\n      this.cacheEvent('integrity-violation', { method: 'collectElementWithDescendants', cycleAt: key });\n      return [];\n    }\n    visited.add(key);\n    const el = this.elementCache[key];\n    if (!el) return [];\n    const result: any[] = [el];\n    if (Array.isArray(el.children)) {\n      for (const childKey of el.children) {\n        result.push(...this.collectElementWithDescendants(childKey, visited));\n      }\n    }\n    return result;\n  }\n\n  allElements(): any[] {\n    return Object.values(this.elementCache);\n  }\n\n  /**\n   * Read-only snapshot of the structural state for off-thread auditing.\n   * Returns shallow copies so the audit pass can iterate without racing\n   * a concurrent merge. Cheap (one Map clone + one Object.keys) — meant\n   * to be called from `requestIdleCallback`, not the live capture path.\n   */\n  getStructureSnapshot(): {\n    elementKeys: ReadonlySet<string>;\n    parentOf: ReadonlyMap<string, string>;\n    childrenOf: ReadonlyMap<string, ReadonlySet<string>>;\n    tombstoneKeys: ReadonlySet<string>;\n  } {\n    const childrenCopy = new Map<string, ReadonlySet<string>>();\n    for (const [k, v] of this.childrenOf) childrenCopy.set(k, new Set(v));\n    return {\n      elementKeys: new Set(Object.keys(this.elementCache)),\n      parentOf: new Map(this.parentOf),\n      childrenOf: childrenCopy,\n      tombstoneKeys: new Set(this.tombstones.keys()),\n    };\n  }\n\n  /**\n   * Surface a structure-audit finding through the regular cacheEvent ring.\n   * The audit service runs out-of-band, but we want one merged event log\n   * so the internals panel doesn't have to subscribe to two sources.\n   */\n  reportIntegrityViolation(detail: unknown): void {\n    this.cacheEvent('integrity-violation', detail);\n  }\n\n  buildBreadcrumbsFromKey(key: string): Array<{ key: string; type: string; name: string }> {\n    const crumbs: Array<{ key: string; type: string; name: string }> = [];\n    // Cycle guard — parent chains shouldn't loop, but a malformed payload\n    // could create one and we don't want the breadcrumb walk to spin.\n    const visited = new Set<string>();\n    let current = this.parentOf.get(key);\n    while (current && !visited.has(current)) {\n      visited.add(current);\n      const el = this.elementCache[current];\n      if (!el) break;\n      crumbs.unshift({\n        key: current,\n        type: (el as any).type ?? 'unknown',\n        name: (el as any).displayName || (el as any).name || (el as any).functionalKey || current,\n      });\n      current = this.parentOf.get(current);\n    }\n    return crumbs;\n  }\n\n  private mergeIntoMap(base: Record<string, any>, additions: any[]): Record<string, any> {\n    const result = { ...base };\n    for (const el of additions) {\n      if (el?.key) result[el.key] = { ...result[el.key], ...el };\n    }\n    return result;\n  }\n}\n","import { Injectable } from '@angular/core';\n\n/** Hierarchical input. `weight` is computed bottom-up by the caller (1 + sum of child weights). */\nexport interface TreemapNode {\n  key: string;\n  type: string;\n  label: string;\n  weight: number;\n  children: TreemapNode[];\n  tombstoned: boolean;\n}\n\n/** Flat layout output — one entry per visible node. Coordinates are in viewport pixels. */\nexport interface LayoutRect {\n  node: TreemapNode;\n  x: number;\n  y: number;\n  w: number;\n  h: number;\n  depth: number;\n}\n\nconst OUTER_PADDING = 2;\nconst HEADER_HEIGHT = 14;\nconst MIN_RECT_PX = 4;\n\n/**\n * Squarified treemap (Bruls / Huijsen / van Wijk 2000).\n *\n * Recursively packs children into their parent rect using rows oriented along\n * the rect's shorter side. Greedily extends a row while doing so improves the\n * worst aspect ratio in that row; commits the row and recurses on the\n * remaining free space when adding the next child would degrade it.\n */\n@Injectable({ providedIn: 'root' })\nexport class DevTreemapLayoutService {\n  layout(root: TreemapNode, viewW: number, viewH: number): LayoutRect[] {\n    const out: LayoutRect[] = [];\n    this.place(root, { x: 0, y: 0, w: viewW, h: viewH }, 0, out);\n    return out;\n  }\n\n  private place(\n    node: TreemapNode,\n    rect: { x: number; y: number; w: number; h: number },\n    depth: number,\n    out: LayoutRect[],\n  ): void {\n    if (rect.w < MIN_RECT_PX || rect.h < MIN_RECT_PX) return;\n    out.push({ node, ...rect, depth });\n\n    if (!node.children.length) return;\n\n    // Reserve a header strip when the rect is tall enough to read the parent's label.\n    const headerH = rect.h > 30 ? HEADER_HEIGHT : 0;\n    const inner = {\n      x: rect.x + OUTER_PADDING,\n      y: rect.y + headerH,\n      w: rect.w - 2 * OUTER_PADDING,\n      h: rect.h - headerH - OUTER_PADDING,\n    };\n    if (inner.w < MIN_RECT_PX || inner.h < MIN_RECT_PX) return;\n\n    const totalWeight = node.children.reduce((s, c) => s + c.weight, 0);\n    if (totalWeight <= 0) return;\n    const scale = (inner.w * inner.h) / totalWeight;\n\n    // Sort descending — larger rects fill the more flexible row first.\n    const sorted = [...node.children].sort((a, b) => b.weight - a.weight);\n\n    let free = { ...inner };\n    let i = 0;\n    while (i < sorted.length) {\n      const shortSide = Math.min(free.w, free.h);\n      if (shortSide < MIN_RECT_PX) break;\n\n      const row: TreemapNode[] = [];\n      let rowArea = 0;\n      while (i < sorted.length) {\n        const cand = sorted[i];\n        const candArea = cand.weight * scale;\n        const currWorst = row.length === 0\n          ? Number.POSITIVE_INFINITY\n          : this.worstAspect(row, rowArea, shortSide, scale);\n        const nextWorst = this.worstAspect([...row, cand], rowArea + candArea, shortSide, scale);\n        if (row.length === 0 || nextWorst <= currWorst) {\n          row.push(cand);\n          rowArea += candArea;\n          i++;\n        } else {\n          break;\n        }\n      }\n\n      // Commit the row as a strip on the short side.\n      const stripDepth = rowArea / shortSide;\n      if (free.w <= free.h) {\n        // Horizontal strip across the top.\n        let cursor = 0;\n        for (const item of row) {\n          const itemW = (item.weight * scale) / stripDepth;\n          this.place(\n            item,\n            { x: free.x + cursor, y: free.y, w: itemW, h: stripDepth },\n            depth + 1,\n            out,\n          );\n          cursor += itemW;\n        }\n        free = { x: free.x, y: free.y + stripDepth, w: free.w, h: free.h - stripDepth };\n      } else {\n        // Vertical strip down the left.\n        let cursor = 0;\n        for (const item of row) {\n          const itemH = (item.weight * scale) / stripDepth;\n          this.place(\n            item,\n            { x: free.x, y: free.y + cursor, w: stripDepth, h: itemH },\n            depth + 1,\n            out,\n          );\n          cursor += itemH;\n        }\n        free = { x: free.x + stripDepth, y: free.y, w: free.w - stripDepth, h: free.h };\n      }\n    }\n  }\n\n  /**\n   * Worst aspect ratio in the row if it were committed now. The cheaper of\n   * `(w²·max)/sum²` (tall rects) and `sum²/(w²·min)` (wide rects) is the\n   * standard formulation — see Bruls et al. for the derivation.\n   */\n  private worstAspect(\n    row: TreemapNode[],\n    rowArea: number,\n    shortSide: number,\n    scale: number,\n  ): number {\n    let max = -Infinity;\n    let min = Infinity;\n    for (const item of row) {\n      const a = item.weight * scale;\n      if (a > max) max = a;\n      if (a < min) min = a;\n    }\n    const w2 = shortSide * shortSide;\n    return Math.max((w2 * max) / (rowArea * rowArea), (rowArea * rowArea) / (w2 * min));\n  }\n}\n","import {\n  AfterViewInit,\n  Component,\n  ElementRef,\n  EventEmitter,\n  Input,\n  NgZone,\n  OnChanges,\n  OnDestroy,\n  Output,\n  SimpleChanges,\n  ViewChild,\n  ViewEncapsulation,\n} from '@angular/core';\nimport { DevElementCacheService } from '../services/dev-element-cache.service';\nimport {\n  DevTreemapLayoutService,\n  LayoutRect,\n  TreemapNode,\n} from '../services/dev-treemap-layout.service';\n\ninterface RawNode {\n  key: string;\n  type: string;\n  label: string;\n  tombstoned: boolean;\n}\n\n@Component({\n  selector: 'app-dev-element-graph',\n  templateUrl: './dev-element-graph.component.html',\n  styleUrls: ['../_element-graph.scss'],\n  standalone: false,\n  encapsulation: ViewEncapsulation.None,\n})\nexport class DevElementGraphComponent implements AfterViewInit, OnChanges, OnDestroy {\n  /** 'subtree' walks descendants from rootKey; 'page' renders the whole topology. */\n  @Input() scope: 'subtree' | 'page' = 'page';\n  @Input() rootKey: string | null = null;\n  /** Highlights the matching rect; lets the host drive a \"current selection\" in the treemap. */\n  @Input() selectedKey: string | null = null;\n\n  @Output() nodeSelected = new EventEmitter<string>();\n\n  @ViewChild('host', { static: true }) hostRef!: ElementRef<HTMLElement>;\n\n  rects: LayoutRect[] = [];\n  hoveredKey: string | null = null;\n\n  /** Drill-in stack: keys of containers we've zoomed into. Top = current root. */\n  drillStack: string[] = [];\n  drillLabels = new Map<string, string>();\n\n  showErrors = false;\n  showTombstones = false;\n  hiddenTypes = new Set<string>();\n  knownTypes: string[] = [];\n\n  viewW = 600;\n  viewH = 400;\n\n  // Pan / zoom state. Applied as a single `translate(panX,panY) scale(zoom)`\n  // transform on the rect-rendering group. Layout itself is not re-squarified\n  // on zoom — we want zoom-in-place, not relayout-at-higher-density.\n  zoom = 1;\n  panX = 0;\n  panY = 0;\n  isPanning = false;\n  private readonly minZoom = 0.5;\n  private readonly maxZoom = 32;\n  private readonly dragThreshold = 3;\n  private dragStart: { vbX: number; vbY: number; panX: number; panY: number; pointerId: number } | null = null;\n  private dragMoved = false;\n  private suppressClick = false;\n\n  private resizeObserver?: ResizeObserver;\n  private rebuildScheduled = false;\n  // Contrast colour per type. Three slots — `container` and `leaf` differ\n  // because container rects render at `fill-opacity: 0.75` (so brightness is\n  // measured against the blended colour); `hover` covers both because\n  // hover/selected rects paint at `fill-opacity: 1` with the raw source\n  // colour for both container and leaf. Cleared on rebuild so theme swaps\n  // and CSS-variable changes propagate.\n  private labelFgCache = new Map<string, {\n    container: string;\n    leaf: string;\n    hover: string;\n  }>();\n\n  constructor(\n    private cache: DevElementCacheService,\n    private treemap: DevTreemapLayoutService,\n    private zone: NgZone,\n  ) {}\n\n  ngAfterViewInit(): void {\n    this.measure();\n    this.rebuild();\n    // Re-squarify when the panel resizes — treemap layout depends on viewport dims.\n    this.resizeObserver = new ResizeObserver(() => {\n      this.zone.run(() => this.scheduleRebuild());\n    });\n    this.resizeObserver.observe(this.hostRef.nativeElement);\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['scope'] || changes['rootKey']) {\n      this.drillStack = [];\n      this.drillLabels.clear();\n      if (this.hostRef) this.rebuild();\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.resizeObserver?.disconnect();\n  }\n\n  /** Pull a fresh snapshot, build the tree, squarify. */\n  rebuild(): void {\n    this.labelFgCache.clear();\n    this.measure();\n    const snap = this.cache.getGraphSnapshot(this.activeRootKey() ?? undefined, {\n      includeTombstoned: this.showTombstones,\n    });\n    if (!snap.nodes.length) {\n      this.rects = [];\n      this.knownTypes = [];\n      return;\n    }\n    this.knownTypes = Array.from(new Set(snap.nodes.map((n) => n.type))).sort();\n\n    const root = this.buildTree(snap.nodes, snap.edges, this.activeRootKey());\n    if (!root) {\n      this.rects = [];\n      return;\n    }\n    this.rects = this.treemap.layout(root, this.viewW, this.viewH);\n  }\n\n  private scheduleRebuild(): void {\n    if (this.rebuildScheduled) return;\n    this.rebuildScheduled = true;\n    requestAnimationFrame(() => {\n      this.rebuildScheduled = false;\n      this.rebuild();\n    });\n  }\n\n  private measure(): void {\n    const el = this.hostRef.nativeElement;\n    const w = Math.max(80, el.clientWidth || 600);\n    // Reserve space for the toolbar (~40 px) and breadcrumb if present.\n    const overhead = 40 + (this.drillStack.length ? 28 : 0);\n    const h = Math.max(80, (el.clientHeight || 400) - overhead);\n    // Squarify the layout coord space so top-level rects come out close\n    // to 1:1 instead of inheriting whatever wider-than-tall aspect the\n    // host happens to be — chrome (toolbar wrap, crumbs) eats predictably\n    // from the height, so the host is reliably wider than tall.\n    const side = Math.min(w, h);\n    this.viewW = side;\n    this.viewH = side;\n  }\n\n  /** The key the treemap should root at: top of drill stack overrides the input rootKey. */\n  private activeRootKey(): string | null {\n    if (this.drillStack.length) return this.drillStack[this.drillStack.length - 1];\n    return this.rootKey;\n  }\n\n  /** Convert flat snapshot to a TreemapNode tree. Returns null if root not found. */\n  private buildTree(nodes: RawNode[], edges: { from: string; to: string }[], rootKey: string | null): TreemapNode | null {\n    const byKey = new Map<string, TreemapNode>();\n    for (const n of nodes) {\n      if (this.hiddenTypes.has(n.type)) continue;\n      byKey.set(n.key, {\n        key: n.key,\n        type: n.type,\n        label: n.label,\n        weight: 0,\n        children: [],\n        tombstoned: n.tombstoned,\n      });\n    }\n    const childOf = new Set<string>();\n    for (const e of edges) {\n      const parent = byKey.get(e.from);\n      const child = byKey.get(e.to);\n      if (parent && child) {\n        parent.children.push(child);\n        childOf.add(child.key);\n      }\n    }\n\n    let root: TreemapNode | null = null;\n    if (rootKey && byKey.has(rootKey)) {\n      root = byKey.get(rootKey)!;\n    } else {\n      // First node with no incoming edge; if multiple roots, synthesize a wrapper.\n      const roots: TreemapNode[] = [];\n      for (const n of byKey.values()) if (!childOf.has(n.key)) roots.push(n);\n      if (roots.length === 1) root = roots[0];\n      else if (roots.length > 1) {\n        root = {\n          key: '__synthetic_root__',\n          type: 'page',\n          label: 'all',\n          weight: 0,\n          children: roots,\n          tombstoned: false,\n        };\n      }\n    }\n    if (!root) return null;\n\n    // Cache the label so the breadcrumb can show readable names without re-querying.\n    this.drillLabels.set(root.key, root.label);\n\n    // Compute weights bottom-up. Leaves get weight 1; parents accumulate.\n    this.computeWeights(root);\n    return root;\n  }\n\n  private computeWeights(node: TreemapNode): number {\n    if (!node.children.length) {\n      node.weight = 1;\n      return 1;\n    }\n    let sum = 1; // count the parent itself so single-child chains don't degenerate\n    for (const c of node.children) sum += this.computeWeights(c);\n    node.weight = sum;\n    return sum;\n  }\n\n  // ── Filters ──────────────────────────────────────────────────────────────\n\n  resetLayout(): void {\n    this.drillStack = [];\n    this.drillLabels.clear();\n    this.resetView();\n    this.rebuild();\n  }\n\n  toggleType(t: string): void {\n    if (this.hiddenTypes.has(t)) this.hiddenTypes.delete(t);\n    else this.hiddenTypes.add(t);\n    this.hiddenTypes = new Set(this.hiddenTypes);\n    this.rebuild();\n  }\n\n  toggleTombstones(): void {\n    this.showTombstones = !this.showTombstones;\n    this.rebuild();\n  }\n\n  // ── Hover details ────────────────────────────────────────────────────────\n\n  /** Resolved metadata for the currently hovered rect — pulled lazily from\n   * the cache so the tooltip can show fields the layout snapshot doesn't\n   * carry (functionalKey, contentStyle, full styles list, type-specific\n   * preview value). Returns null when nothing is hovered. */\n  get hoveredDetails(): {\n    rect: LayoutRect;\n    functionalKey: string | null;\n    contentStyle: string | null;\n    styles: string[];\n    preview: string | null;\n    descendants: number;\n    directChildren: number;\n  } | null {\n    if (!this.hoveredKey) return null;\n    const rect = this.rects.find((r) => r.node.key === this.hoveredKey);\n    if (!rect) return null;\n    const el = this.cache.getElement(rect.node.key, { includeTombstoned: true }) ?? null;\n    return {\n      rect,\n      functionalKey: el?.functionalKey ?? null,\n      contentStyle: el?.contentStyle ?? null,\n      styles: Array.isArray(el?.styles) ? el.styles : [],\n      preview: this.previewFor(el),\n      // node.weight counts the node itself + all descendants; node.children\n      // is direct children only. Both are useful — descendants for \"size of\n      // this subtree\", direct children for \"how branchy is this level\".\n      descendants: Math.max(0, (rect.node.weight ?? 0) - 1),\n      directChildren: rect.node.children.length,\n    };\n  }\n\n  /** First non-empty type-specific value: button caption, textitem text,\n   * field question / values. Trimmed and length-capped so a long value\n   * doesn't blow out the tooltip. */\n  private previewFor(el: any): string | null {\n    if (!el) return null;\n    const candidates: unknown[] = [\n      el.caption,\n      el.plainText,\n      el.questionText,\n      Array.isArray(el.values) ? el.values.filter((v: unknown) => v != null && v !== '').join(', ') : null,\n    ];\n    for (const c of candidates) {\n      if (typeof c === 'string' && c.trim()) {\n        const s = c.trim().replace(/\\s+/g, ' ');\n        return s.length > 140 ? s.slice(0, 139) + '…' : s;\n      }\n    }\n    return null;\n  }\n\n  // ── Interactions ─────────────────────────────────────────────────────────\n\n  onMouseEnter(key: string): void {\n    this.hoveredKey = key;\n  }\n\n  onMouseLeave(): void {\n    this.hoveredKey = null;\n  }\n\n  onClick(key: string, event: MouseEvent): void {\n    event.stopPropagation();\n    // Swallow the trailing click after a pan-drag so dragging doesn't also\n    // select the rect under the pointer.\n    if (this.suppressClick) {\n      this.suppressClick = false;\n      return;\n    }\n    if (key === '__synthetic_root__') return;\n    this.nodeSelected.emit(key);\n  }\n\n  onDoubleClick(key: string, event: MouseEvent): void {\n    event.stopPropagation();\n    event.preventDefault();\n    if (key === '__synthetic_root__') return;\n    if (this.drillStack[this.drillStack.length - 1] === key) return;\n    this.drillStack = [...this.drillStack, key];\n    this.resetView();\n    this.rebuild();\n  }\n\n  drillTo(key: string): void {\n    const idx = this.drillStack.indexOf(key);\n    if (idx < 0) return;\n    this.drillStack = this.drillStack.slice(0, idx + 1);\n    this.resetView();\n    this.rebuild();\n  }\n\n  drillToRoot(): void {\n    this.drillStack = [];\n    this.resetView();\n    this.rebuild();\n  }\n\n  // ── Pan / Zoom ────────────────────────────────────────────────────────────\n\n  get viewportTransform(): string {\n    return `translate(${this.panX}, ${this.panY}) scale(${this.zoom})`;\n  }\n\n  resetView(): void {\n    this.zoom = 1;\n    this.panX = 0;\n    this.panY = 0;\n  }\n\n  onWheel(event: WheelEvent): void {\n    event.preventDefault();\n    const svg = event.currentTarget as SVGSVGElement;\n    const cursor = this.toViewBox(event.clientX, event.clientY, svg);\n    const factor = event.deltaY < 0 ? 1.15 : 1 / 1.15;\n    this.zoomAt(this.zoom * factor, cursor.x, cursor.y);\n  }\n\n  // Slider position is log-mapped across [minZoom..maxZoom] so each tick\n  // represents a constant ratio (perceptually uniform), not a constant delta.\n  get zoomSliderValue(): number {\n    return (100 * Math.log(this.zoom / this.minZoom)) / Math.log(this.maxZoom / this.minZoom);\n  }\n\n  get zoomPct(): number {\n    return Math.round(this.zoom * 100);\n  }\n\n  onZoomSlider(event: Event): void {\n    const v = +(event.target as HTMLInputElement).value;\n    const newZoom = this.minZoom * Math.pow(this.maxZoom / this.minZoom, v / 100);\n    this.zoomAt(newZoom, this.viewW / 2, this.viewH / 2);\n  }\n\n  private zoomAt(newZoom: number, anchorX: number, anchorY: number): void {\n    newZoom = Math.min(this.maxZoom, Math.max(this.minZoom, newZoom));\n    if (newZoom === this.zoom) return;\n    // Pin the point at (anchorX, anchorY) in viewBox coords so it stays at\n    // the same screen position after the scale change.\n    this.panX = anchorX - ((anchorX - this.panX) / this.zoom) * newZoom;\n    this.panY = anchorY - ((anchorY - this.panY) / this.zoom) * newZoom;\n    this.zoom = newZoom;\n  }\n\n  onPointerDown(event: PointerEvent): void {\n    if (event.button !== 0) return;\n    const svg = event.currentTarget as SVGSVGElement;\n    const start = this.toViewBox(event.clientX, event.clientY, svg);\n    this.dragStart = {\n      vbX: start.x,\n      vbY: start.y,\n      panX: this.panX,\n      panY: this.panY,\n      pointerId: event.pointerId,\n    };\n    this.dragMoved = false;\n    svg.setPointerCapture(event.pointerId);\n  }\n\n  onPointerMove(event: PointerEvent): void {\n    if (!this.dragStart || event.pointerId !== this.dragStart.pointerId) return;\n    const svg = event.currentTarget as SVGSVGElement;\n    const cursor = this.toViewBox(event.clientX, event.clientY, svg);\n    const dx = cursor.x - this.dragStart.vbX;\n    const dy = cursor.y - this.dragStart.vbY;\n    if (!this.dragMoved && Math.hypot(dx, dy) > this.dragThreshold) {\n      this.dragMoved = true;\n      this.isPanning = true;\n    }\n    if (this.dragMoved) {\n      this.panX = this.dragStart.panX + dx;\n      this.panY = this.dragStart.panY + dy;\n    }\n  }\n\n  onPointerUp(event: PointerEvent): void {\n    if (!this.dragStart || event.pointerId !== this.dragStart.pointerId) return;\n    const svg = event.currentTarget as SVGSVGElement;\n    if (svg.hasPointerCapture(event.pointerId)) svg.releasePointerCapture(event.pointerId);\n    this.suppressClick = this.dragMoved;\n    this.dragStart = null;\n    this.dragMoved = false;\n    this.isPanning = false;\n  }\n\n  onPointerCancel(_event: PointerEvent): void {\n    this.dragStart = null;\n    this.dragMoved = false;\n    this.isPanning = false;\n  }\n\n  private toViewBox(clientX: number, clientY: number, svg: SVGSVGElement): { x: number; y: number } {\n    const pt = svg.createSVGPoint();\n    pt.x = clientX;\n    pt.y = clientY;\n    const ctm = svg.getScreenCTM();\n    if (!ctm) return { x: 0, y: 0 };\n    const local = pt.matrixTransform(ctm.inverse());\n    return { x: local.x, y: local.y };\n  }\n\n  // ── Render helpers ───────────────────────────────────────────────────────\n\n  fillFor(node: TreemapNode): string {\n    if (node.tombstoned) return '#cdd1d6';\n    if (node.key === '__synthetic_root__') return 'transparent';\n    // Hover / selected bypass the pastel mix and paint the raw type colour\n    // at full opacity (the SCSS rule for `&--hovered/--selected rect`\n    // forces fill-opacity to 1) — a stronger emphasis than the previous\n    // primary-coloured stroke and consistent with the modernized palette.\n    if (this.isEmphasised(node)) {\n      return `var(--bq-lens-graph-${node.type}, currentColor)`;\n    }\n    // Pastelize via color-mix — `--bq-lens-graph-pastel` controls the mix\n    // ratio (lower = more washed) and `--bq-lens-graph-surface` controls\n    // what the colour mixes toward (section bg by default for a softer\n    // tint that sits on the panel surface).\n    return this.pastelExpr(node.type);\n  }\n\n  private isEmphasised(node: TreemapNode): boolean {\n    return this.hoveredKey === node.key || this.selectedKey === node.key;\n  }\n\n  private pastelExpr(type: string): string {\n    return `color-mix(in srgb, var(--bq-lens-graph-${type}, currentColor) var(--bq-lens-graph-pastel, 45%), var(--bq-lens-graph-surface, #f3f3f3))`;\n  }\n\n  /** Foreground colour for a rect's label, picked for contrast against the\n   * rect's effective fill. */\n  labelFillFor(node: TreemapNode): string {\n    if (node.tombstoned) return 'rgba(0, 0, 0, 0.85)';\n    if (node.key === '__synthetic_root__') return 'transparent';\n    let cached = this.labelFgCache.get(node.type);\n    if (!cached) {\n      cached = this.computeLabelFg(node.type);\n      this.labelFgCache.set(node.type, cached);\n    }\n    if (this.isEmphasised(node)) return cached.hover;\n    return node.children.length > 0 ? cached.container : cached.leaf;\n  }\n\n  private computeLabelFg(type: string): { container: string; leaf: string; hover: string } {\n    // Default state — pastel-mixed fill, container at fill-opacity: 0.75\n    // over the section bg.\n    const fillPastel = this.resolveColor(this.pastelExpr(type));\n    const bg = this.parseRgb(getComputedStyle(this.hostRef.nativeElement).backgroundColor)\n      ?? { r: 243, g: 243, b: 243 };\n    // Hover / selected — raw type colour at fill-opacity: 1, identical for\n    // container and leaf.\n    const fillSrc = this.resolveColor(`var(--bq-lens-graph-${type})`);\n    return {\n      container: this.fgForBg(this.blend(fillPastel, bg, 0.75)),\n      leaf: this.fgForBg(fillPastel),\n      hover: this.fgForBg(fillSrc),\n    };\n  }\n\n  private resolveColor(spec: string): { r: number; g: number; b: number } {\n    // Forces the browser to resolve nested var() chains — `--bq-lens-graph-container`\n    // is `var(--bq-lens-primary, ...)` which `getPropertyValue` returns un-resolved.\n    const probe = document.createElement('span');\n    probe.style.color = spec;\n    probe.style.display = 'none';\n    this.hostRef.nativeElement.appendChild(probe);\n    const computed = getComputedStyle(probe).color;\n    probe.remove();\n    return this.parseRgb(computed) ?? { r: 0, g: 0, b: 0 };\n  }\n\n  private parseRgb(s: string): { r: number; g: number; b: number } | null {\n    const m = s.match(/rgba?\\(\\s*(\\d+)\\s*,?\\s*(\\d+)\\s*,?\\s*(\\d+)/);\n    return m ? { r: +m[1], g: +m[2], b: +m[3] } : null;\n  }\n\n  private blend(\n    fg: { r: number; g: number; b: number },\n    bg: { r: number; g: number; b: number },\n    alpha: number,\n  ): { r: number; g: number; b: number } {\n    return {\n      r: Math.round(alpha * fg.r + (1 - alpha) * bg.r),\n      g: Math.round(alpha * fg.g + (1 - alpha) * bg.g),\n      b: Math.round(alpha * fg.b + (1 - alpha) * bg.b),\n    };\n  }\n\n  private fgForBg(c: { r: number; g: number; b: number }): string {\n    // Perceived brightness via YIQ — quick and reliable for a binary\n    // black-vs-white text choice. Threshold 140 (slightly above the 128\n    // midpoint) biases toward black text on borderline mid-tones, which\n    // tends to read better than white on the same swatches.\n    const brightness = (c.r * 299 + c.g * 587 + c.b * 114) / 1000;\n    return brightness > 140 ? 'rgba(0, 0, 0, 0.88)' : 'rgba(255, 255, 255, 0.95)';\n  }\n\n  /** Crude character-count truncation; fine until the rect is very narrow. */\n  truncate(label: string, rectW: number): string {\n    const maxChars = Math.max(0, Math.floor((rectW - 8) / 6));\n    if (maxChars <= 1) return '';\n    if (label.length <= maxChars) return label;\n    return label.slice(0, maxChars - 1) + '…';\n  }\n\n  showLabel(r: LayoutRect): boolean {\n    if (r.node.key === '__synthetic_root__') return false;\n    return r.w > 40 && r.h > 16;\n  }\n\n  trackByKey(_idx: number, r: LayoutRect): string {\n    return `${r.node.key}-${r.depth}`;\n  }\n}\n","<div class=\"dev-graph\" #host>\n  <header class=\"dev-graph__toolbar\">\n    <button class=\"dev-btn dev-btn--sm dev-graph__tool\" (click)=\"resetLayout()\" title=\"Reset filters and drill stack\">\n      <bq-icon name=\"sync-alt\"></bq-icon> Reset\n    </button>\n    <button class=\"dev-btn dev-btn--sm dev-graph__tool\"\n            *ngIf=\"zoom !== 1 || panX !== 0 || panY !== 0\"\n            (click)=\"resetView()\"\n            title=\"Fit view (clear zoom and pan)\">\n      <bq-icon name=\"expand-alt\"></bq-icon> Fit\n    </button>\n    <label class=\"dev-graph__zoom\" [title]=\"'Zoom: ' + zoomPct + '%'\">\n      <span class=\"dev-graph__zoom-tick\" aria-hidden=\"true\">−</span>\n      <input type=\"range\" min=\"0\" max=\"100\" step=\"0.5\"\n             [value]=\"zoomSliderValue\"\n             (input)=\"onZoomSlider($event)\"\n             class=\"dev-graph__zoom-slider\"\n             aria-label=\"Zoom\" />\n      <span class=\"dev-graph__zoom-tick\" aria-hidden=\"true\">+</span>\n      <span class=\"dev-graph__zoom-value\">{{ zoomPct }}%</span>\n    </label>\n    <button class=\"dev-btn dev-btn--sm dev-graph__tool dev-graph__toggle\"\n            [class.active]=\"showErrors\"\n            (click)=\"showErrors = !showErrors\"\n            title=\"Highlight rects with validation errors\">\n      <bq-icon name=\"exclamation-triangle\"></bq-icon> Errors\n    </button>\n    <button class=\"dev-btn dev-btn--sm dev-graph__tool dev-graph__toggle\"\n            [class.active]=\"showTombstones\"\n            (click)=\"toggleTombstones()\"\n            title=\"Show tombstoned (deleted) rects\">\n      <bq-icon name=\"trash\"></bq-icon> Tombstones\n    </button>\n    <span class=\"dev-graph__type-chips\">\n      <button *ngFor=\"let t of knownTypes\"\n              class=\"dev-graph__type-chip\"\n              [class.dev-graph__type-chip--off]=\"hiddenTypes.has(t)\"\n              [style.--chip-color]=\"'var(--bq-lens-graph-' + t + ', currentColor)'\"\n              (click)=\"toggleType(t)\"\n              [title]=\"hiddenTypes.has(t) ? 'Show ' + t : 'Hide ' + t\">\n        {{ t }}\n      </button>\n    </span>\n  </header>\n\n  <nav class=\"dev-graph__crumbs\" *ngIf=\"drillStack.length\">\n    <button class=\"dev-graph__crumb\" (click)=\"drillToRoot()\" title=\"Back to top\">⌂</button>\n    <ng-container *ngFor=\"let k of drillStack; let last = last\">\n      <span class=\"dev-graph__crumb-sep\">›</span>\n      <button class=\"dev-graph__crumb\"\n              [disabled]=\"last\"\n              (click)=\"drillTo(k)\"\n              [title]=\"last ? 'Current view' : 'Pop back to here'\">\n        {{ drillLabels.get(k) ?? k }}\n      </button>\n    </ng-container>\n  </nav>\n\n  <svg class=\"dev-graph__svg\"\n       [class.dev-graph__svg--panning]=\"isPanning\"\n       [attr.viewBox]=\"'0 0 ' + viewW + ' ' + viewH\"\n       preserveAspectRatio=\"xMidYMid meet\"\n       (wheel)=\"onWheel($event)\"\n       (pointerdown)=\"onPointerDown($event)\"\n       (pointermove)=\"onPointerMove($event)\"\n       (pointerup)=\"onPointerUp($event)\"\n       (pointercancel)=\"onPointerCancel($event)\">\n    <g class=\"dev-graph__viewport\" [attr.transform]=\"viewportTransform\">\n      <g *ngFor=\"let r of rects; trackBy: trackByKey\"\n         class=\"dev-graph__rect\"\n         [class.dev-graph__rect--hovered]=\"hoveredKey === r.node.key\"\n         [class.dev-graph__rect--selected]=\"selectedKey === r.node.key\"\n         [class.dev-graph__rect--tombstoned]=\"r.node.tombstoned\"\n         [class.dev-graph__rect--container]=\"r.node.children.length > 0\"\n         [class.dev-graph__rect--synthetic]=\"r.node.key === '__synthetic_root__'\"\n         (mouseenter)=\"onMouseEnter(r.node.key)\"\n         (mouseleave)=\"onMouseLeave()\"\n         (click)=\"onClick(r.node.key, $event)\"\n         (dblclick)=\"onDoubleClick(r.node.key, $event)\">\n        <rect [attr.x]=\"r.x\" [attr.y]=\"r.y\" [attr.width]=\"r.w\" [attr.height]=\"r.h\"\n              [attr.fill]=\"fillFor(r.node)\"></rect>\n        <text *ngIf=\"showLabel(r)\"\n              class=\"dev-graph__rect-label\"\n              [style.fill]=\"labelFillFor(r.node)\"\n              [attr.x]=\"r.x + 4\"\n              [attr.y]=\"r.y + 11\">{{ truncate(r.node.label, r.w) }}</text>\n      </g>\n    </g>\n  </svg>\n\n  <div *ngIf=\"hoveredDetails as d\" class=\"dev-graph__tooltip\">\n    <header class=\"dev-graph__tooltip-head\">\n      <span class=\"dev-graph__tooltip-type\">{{ d.rect.node.type }}</span>\n      <span class=\"dev-graph__tooltip-label\">{{ d.rect.node.label }}</span>\n      <span class=\"dev-graph__tooltip-key\">{{ d.rect.node.key }}</span>\n    </header>\n    <div class=\"dev-graph__tooltip-preview\" *ngIf=\"d.preview\">{{ d.preview }}</div>\n    <div class=\"dev-graph__tooltip-meta\">\n      <span *ngIf=\"d.functionalKey && d.functionalKey !== d.rect.node.key\"\n            class=\"dev-graph__tooltip-fkey\"\n            [title]=\"'functionalKey'\">{{ d.functionalKey }}</span>\n      <span *ngIf=\"d.contentStyle\"\n            class=\"dev-graph__tooltip-cstyle\"\n            [title]=\"'contentStyle'\">CS · {{ d.contentStyle }}</span>\n      <span class=\"dev-graph__tooltip-pip\">depth {{ d.rect.depth }}</span>\n      <span class=\"dev-graph__tooltip-pip\" *ngIf=\"d.descendants\">\n        {{ d.descendants }} descendant{{ d.descendants === 1 ? '' : 's' }}\n      </span>\n      <span class=\"dev-graph__tooltip-pip\" *ngIf=\"d.directChildren\">\n        {{ d.directChildren }} child{{ d.directChildren === 1 ? '' : 'ren' }}\n      </span>\n      <span class=\"dev-graph__tooltip-pip dev-graph__tooltip-pip--warn\" *ngIf=\"d.rect.node.tombstoned\">\n        tombstoned\n      </span>\n    </div>\n    <div class=\"dev-graph__tooltip-styles\" *ngIf=\"d.styles.length\">\n      <span *ngFor=\"let s of d.styles\" class=\"dev-graph__tooltip-style\">{{ s }}</span>\n    </div>\n  </div>\n</div>\n","import { Component, Input, ViewEncapsulation } from '@angular/core';\nimport { ElementTreeNode } from '../bq-lens.types';\n\n@Component({\n  selector: 'app-dev-element-tree',\n  templateUrl: './dev-element-tree.component.html',\n  standalone: false,\n  encapsulation: ViewEncapsulation.None,\n})\nexport class DevElementTreeComponent {\n  @Input() nodes: ElementTreeNode[] = [];\n  @Input() depth = 0;\n  @Input() onSelect: ((key: string) => void) | null = null;\n  @Input() collapsedKeys: Set<string> = new Set();\n  @Input() onToggle: ((key: string) => void) | null = null;\n  @Input() selectedKey: string | null = null;\n\n  handleRowClick(key: string): void {\n    if (this.onSelect) this.onSelect(key);\n  }\n}\n","<ul class=\"dev-tree__list\">\n  <li *ngFor=\"let node of nodes\" class=\"dev-tree__item\">\n    <div class=\"dev-tree__row\"\n         [class.dev-tree__row--selectable]=\"onSelect\"\n         [class.dev-tree__row--selected]=\"node.key === selectedKey\"\n         (click)=\"handleRowClick(node.key)\">\n      <button *ngIf=\"node.children.length && onToggle\"\n              class=\"dev-tree__toggle\"\n              (click)=\"onToggle(node.key); $event.stopPropagation()\"\n              [title]=\"collapsedKeys.has(node.key) ? 'Expand' : 'Collapse'\">\n        <bq-icon [name]=\"collapsedKeys.has(node.key) ? 'chevron-right' : 'chevron-down'\"></bq-icon>\n      </button>\n      <span *ngIf=\"!node.children.length || !onToggle\" class=\"dev-tree__toggle-placeholder\"></span>\n      <span class=\"dev-tree__type dev-tree__type--{{ node.type }}\" [title]=\"node.type\">{{ node.type[0] }}</span>\n      <span class=\"dev-tree__type-label\">{{ node.type }}</span>\n      <span class=\"dev-tree__label\">{{ node.label }}</span>\n      <span *ngIf=\"node.totalDescendants > 0\" class=\"dev-tree__count\">{{ node.totalDescendants }}</span>\n      <span *ngIf=\"node.styles.length\" class=\"dev-tree__styles\">{{ node.styles.join(' ') }}</span>\n    </div>\n    <app-dev-element-tree\n      *ngIf=\"node.children.length && !collapsedKeys.has(node.key)\"\n      [nodes]=\"node.children\"\n      [depth]=\"depth + 1\"\n      [onSelect]=\"onSelect\"\n      [collapsedKeys]=\"collapsedKeys\"\n      [onToggle]=\"onToggle\"\n      [selectedKey]=\"selectedKey\">\n    </app-dev-element-tree>\n  </li>\n</ul>\n","import { NgZone } from '@angular/core';\n\nexport interface DragGestureOptions {\n  startEvent: MouseEvent;\n  zone: NgZone;\n  /** Movement (in px) past the start point before drag mode flips on. Default 4. */\n  threshold?: number;\n  /** Fired once when the cursor first crosses `threshold`. Runs inside the zone. */\n  onStart?: () => void;\n  /** Fired on every mousemove past threshold with deltas from the start point. Runs inside the zone. */\n  onMove: (dx: number, dy: number, event: MouseEvent) => void;\n  /** Fired on mouseup. `dragged` is true iff threshold was ever crossed. Runs inside the zone. */\n  onEnd?: (dragged: boolean) => void;\n}\n\n/**\n * Wires document-level mousemove/mouseup listeners with a movement threshold\n * — the standard \"press, then drag past N px\" pattern used by the panel tab\n * and the inspector-popup header.\n */\nexport function attachDragGesture(opts: DragGestureOptions): void {\n  opts.startEvent.preventDefault();\n  const startX = opts.startEvent.clientX;\n  const startY = opts.startEvent.clientY;\n  const threshold = opts.threshold ?? 4;\n  let dragging = false;\n\n  const onMove = (e: MouseEvent): void => {\n    if (!dragging && (Math.abs(e.clientX - startX) > threshold || Math.abs(e.clientY - startY) > threshold)) {\n      dragging = true;\n      if (opts.onStart) opts.zone.run(opts.onStart);\n    }\n    if (dragging) {\n      opts.zone.run(() => opts.onMove(e.clientX - startX, e.clientY - startY, e));\n    }\n  };\n\n  const onUp = (): void => {\n    document.removeEventListener('mousemove', onMove);\n    document.removeEventListener('mouseup', onUp);\n    if (opts.onEnd) opts.zone.run(() => opts.onEnd!(dragging));\n  };\n\n  document.addEventListener('mousemove', onMove);\n  document.addEventListener('mouseup', onUp);\n}\n","// Platform-aware modifier key label. Mac uses Option (⌥) where Windows/Linux\n// use Alt — the keypress is the same, but the visible name differs.\nexport function isMacPlatform(): boolean {\n  if (typeof navigator === 'undefined') return false;\n  const platform = (navigator as any).userAgentData?.platform ?? navigator.platform ?? navigator.userAgent;\n  return /mac|iphone|ipad|ipod/i.test(platform);\n}\n\nexport function modKeyLabel(): string {\n  return isMacPlatform() ? '⌥' : 'Alt';\n}\n","import { BlockerReason, CaptureAnalysis } from './bq-lens.types';\n\n/**\n * Plain-English reasons the inspected element is in its current state.\n *\n * Runs against the raw cached element (not the analysis-shaped one) because\n * the cache carries `precondition`, `disabled`, raw `validations`, etc. that\n * the analysis layer normalizes away. The `pageAnalysis` argument lets a\n * button's reason mention page-level blockers (\"blocked by 2 invalid fields\")\n * even though the button itself has no validation array.\n *\n * Returns an empty array when nothing's wrong — the calling UI is responsible\n * for the \"no blockers detected\" empty state, since \"we looked, nothing fired\"\n * is itself useful information.\n */\nexport function whyBlocked(\n  rawElement: any,\n  pageAnalysis: CaptureAnalysis | null = null,\n): BlockerReason[] {\n  if (!rawElement) return [];\n  const reasons: BlockerReason[] = [];\n  const type = rawElement.type;\n\n  if (rawElement.disabled === true) {\n    reasons.push({\n      severity: 'error',\n      icon: 'ban',\n      text: 'Disabled by the model',\n      hint: 'The element ships with `disabled: true`. A condition or rule on the server marked it inactive.',\n    });\n  }\n\n  // Read-only: only meaningful for fields. Buttons use `disabled`.\n  if (type === 'field') {\n    const editable = rawElement.editable != null ? !!rawElement.editable : !rawElement.readonly;\n    if (!editable) {\n      reasons.push({\n        severity: 'info',\n        icon: 'lock',\n        text: 'Read-only — user cannot type into this field',\n        hint: rawElement.readonly === true\n          ? 'The element has `readonly: true`. Drop the flag, or make the upstream condition that controls editability fire.'\n          : 'The element has `editable: false`. Check the rule that derives editability for this field.',\n      });\n    }\n\n    const values = Array.isArray(rawElement.values)\n      ? rawElement.values\n      : (rawElement.value != null ? [rawElement.value] : []);\n    if (rawElement.required === true && values.length === 0) {\n      reasons.push({\n        severity: 'warn',\n        icon: 'asterisk',\n        text: 'Required but empty',\n        hint: 'The user must supply a value before the form can submit. If the field is also read-only, the form will block forever.',\n      });\n    }\n\n    if (rawElement.refresh === true && editable === false) {\n      reasons.push({\n        severity: 'info',\n        icon: 'sync',\n        text: 'Refresh flag is a no-op on a read-only field',\n        hint: 'Refresh re-fires the form when the user changes a field — but a read-only field has no user change to react to.',\n      });\n    }\n  }\n\n  // Blocking validations: surface them with their type + message so the dev\n  // doesn't have to dig into the JSON.\n  const validations = Array.isArray(rawElement.validations) ? rawElement.validations : [];\n  const fieldMessages = Array.isArray(rawElement.messages)\n    ? rawElement.messages\n    : (Array.isArray(rawElement.fieldMessages) ? rawElement.fieldMessages : []);\n  const errorMessages = new Set(\n    fieldMessages.filter((m: any) => m?.type === 'ERROR').map((m: any) => m.text),\n  );\n\n  for (const v of validations) {\n    if (!v?.blocking) continue;\n    const matched = v.message && errorMessages.has(v.message);\n    reasons.push({\n      severity: matched ? 'error' : 'warn',\n      icon: 'shield-alt',\n      text: matched\n        ? `Failing validation: ${v.type}${v.message ? ' — ' + v.message : ''}`\n        : `Blocking rule defined: ${v.type}${v.message ? ' — ' + v.message : ''}`,\n      hint: matched\n        ? 'This rule has fired and is currently blocking submission.'\n        : 'This rule will fire if its condition becomes true.',\n    });\n  }\n\n  // Precondition: if a falsy precondition is attached we can flag it as\n  // \"this element only renders when X\". We can't evaluate it ourselves —\n  // the model's expression engine isn't in our hands — but flagging that\n  // it exists is already a useful breadcrumb.\n  if (rawElement.precondition && typeof rawElement.precondition === 'string') {\n    reasons.push({\n      severity: 'info',\n      icon: 'code-branch',\n      text: 'Has a precondition',\n      hint: `Visibility / activation depends on: ${rawElement.precondition}`,\n    });\n  }\n\n  // Buttons: validate-on-click + page-level errors mean clicking won't fire.\n  if (type === 'button' && rawElement.validate === true && pageAnalysis) {\n    const invalidFields = pageAnalysis.fields.filter(f =>\n      f.fieldMessages.some(m => m.type === 'ERROR') ||\n      (f.required === true && f.values.length === 0),\n    );\n    if (invalidFields.length > 0) {\n      reasons.push({\n        severity: 'error',\n        icon: 'shield-alt',\n        text: `Validate-on-click; blocked by ${invalidFields.length} field${invalidFields.length === 1 ? '' : 's'}`,\n        hint: 'This button validates the form before firing. Submission is blocked until every error is cleared and every required field is filled.',\n      });\n    }\n  }\n\n  return reasons;\n}\n","// Parses Blueriq's CSS-like @BlueriqComponent selector strings into a tree\n// the inspector popup can render as a logical AND/OR breakdown.\n//\n// What it handles:\n//   - Top-level OR: `field, container`\n//   - Combinators: descendant (` `), child (`>`), adjacent sibling (`+`),\n//     general sibling (`~`)\n//   - Compound facets: type, wildcard (`*`), class (`.foo`), id (`#bar`),\n//     attribute (`[name]`, `[name=value]`, `[name~=value]`, `[name|=value]`,\n//     `[name^=value]`, `[name$=value]`, `[name*=value]`, `[name!=value]`),\n//     pseudo (`:first-child`, `:has(...)`, `:not(...)`)\n//   - Quoted attribute values, including ones containing combinator chars\n//     (`[contentStyle=\"hello world\"]`)\n//   - Recursive selectors inside `:has(...)` / `:not(...)`\n//\n// What it doesn't:\n//   - Backslash-escaped class/id chars (`.foo\\.bar`) — extremely rare.\n//   - Functional pseudos other than `:has` / `:not` are kept as raw arg\n//     strings (they aren't re-parsed); displays still render usefully.\n//\n// On any parse failure, returns `{ kind: 'invalid', source }` so the\n// caller can fall back to displaying the raw string.\n\nexport type SelectorNode =\n  | { kind: 'union'; branches: SelectorNode[] }\n  | { kind: 'chain'; steps: ChainStep[] }\n  | { kind: 'compound'; facets: Facet[] }\n  | { kind: 'invalid'; source: string };\n\nexport type Combinator = 'descendant' | 'child' | 'adjacent-sibling' | 'general-sibling';\n\nexport interface ChainStep {\n  // null on the first step (no preceding operator); a combinator on subsequent steps.\n  combinator: Combinator | null;\n  node: SelectorNode;\n}\n\nexport type Facet =\n  | { kind: 'type'; value: string }\n  | { kind: 'wildcard' }\n  | { kind: 'class'; value: string }\n  | { kind: 'id'; value: string }\n  | { kind: 'attr'; name: string; op?: AttrOp; value?: string }\n  | { kind: 'pseudo'; name: string; arg?: SelectorNode; rawArg?: string };\n\nexport type AttrOp = '=' | '~=' | '|=' | '^=' | '$=' | '*=' | '!=';\n\nconst TWO_CHAR_OPS: AttrOp[] = ['~=', '|=', '^=', '$=', '*=', '!='];\nconst PSEUDOS_WITH_NESTED_SELECTOR = new Set(['has', 'not']);\n\nexport function parseBlueriqSelector(input: string): SelectorNode {\n  const s = (input ?? '').trim();\n  if (!s) return { kind: 'invalid', source: input ?? '' };\n  try {\n    return parseSelectorList(s);\n  } catch {\n    return { kind: 'invalid', source: input };\n  }\n}\n\nfunction parseSelectorList(s: string): SelectorNode {\n  const parts = splitTopLevel(s, ',').map(p => p.trim()).filter(Boolean);\n  if (parts.length === 0) return { kind: 'invalid', source: s };\n  if (parts.length === 1) return parseChain(parts[0]);\n  return { kind: 'union', branches: parts.map(parseChain) };\n}\n\nfunction parseChain(s: string): SelectorNode {\n  const tokens = tokenizeChain(s);\n  if (tokens.length === 0) return { kind: 'invalid', source: s };\n  const onlyOne = tokens.length === 1 && tokens[0].kind === 'compound';\n  if (onlyOne) {\n    return parseCompound((tokens[0] as { kind: 'compound'; value: string }).value);\n  }\n  const steps: ChainStep[] = [];\n  let pending: Combinator | null = null;\n  for (const tok of tokens) {\n    if (tok.kind === 'combinator') {\n      pending = tok.value;\n    } else {\n      steps.push({ combinator: steps.length === 0 ? null : pending, node: parseCompound(tok.value) });\n      pending = null;\n    }\n  }\n  if (steps.length === 0) return { kind: 'invalid', source: s };\n  if (steps.length === 1) return steps[0].node;\n  return { kind: 'chain', steps };\n}\n\ntype ChainTok =\n  | { kind: 'compound'; value: string }\n  | { kind: 'combinator'; value: Combinator };\n\nfunction tokenizeChain(s: string): ChainTok[] {\n  const tokens: ChainTok[] = [];\n  let buf = '';\n  let pending: Combinator | null = null;\n  let bracketDepth = 0;\n  let parenDepth = 0;\n  let inQuote: string | null = null;\n\n  const flushCompound = () => {\n    const trimmed = buf.trim();\n    if (!trimmed) return;\n    if (tokens.length > 0 && pending !== null) {\n      tokens.push({ kind: 'combinator', value: pending });\n    }\n    tokens.push({ kind: 'compound', value: trimmed });\n    buf = '';\n    pending = null;\n  };\n\n  for (let i = 0; i < s.length; i++) {\n    const c = s[i];\n    if (inQuote) {\n      buf += c;\n      if (c === '\\\\' && i + 1 < s.length) { buf += s[++i]; continue; }\n      if (c === inQuote) inQuote = null;\n      continue;\n    }\n    if (c === '\"' || c === \"'\") { inQuote = c; buf += c; continue; }\n    if (c === '[') { bracketDepth++; buf += c; continue; }\n    if (c === ']') { bracketDepth--; buf += c; continue; }\n    if (c === '(') { parenDepth++; buf += c; continue; }\n    if (c === ')') { parenDepth--; buf += c; continue; }\n    if (bracketDepth > 0 || parenDepth > 0) { buf += c; continue; }\n\n    if (c === ' ' || c === '\\t' || c === '\\n') {\n      if (buf.trim()) {\n        flushCompound();\n        if (pending === null) pending = 'descendant';\n      }\n      continue;\n    }\n    if (c === '>' || c === '+' || c === '~') {\n      // Don't confuse `~=` inside an attribute (handled above by bracketDepth > 0)\n      // or unary form at start. Whitespace-tilde and tilde-whitespace both work.\n      if (buf.trim()) flushCompound();\n      pending = c === '>' ? 'child' : c === '+' ? 'adjacent-sibling' : 'general-sibling';\n      continue;\n    }\n    buf += c;\n  }\n  flushCompound();\n  return tokens;\n}\n\nfunction parseCompound(s: string): SelectorNode {\n  const facets: Facet[] = [];\n  let i = 0;\n\n  // Optional leading type or wildcard.\n  if (i < s.length && /[a-zA-Z*_-]/.test(s[i])) {\n    let type = '';\n    while (i < s.length && /[a-zA-Z0-9*_-]/.test(s[i])) {\n      type += s[i++];\n    }\n    if (type === '*') facets.push({ kind: 'wildcard' });\n    else if (type) facets.push({ kind: 'type', value: type });\n  }\n\n  while (i < s.length) {\n    const c = s[i];\n    if (c === '.') {\n      i++;\n      let cls = '';\n      while (i < s.length && /[a-zA-Z0-9_-]/.test(s[i])) cls += s[i++];\n      if (cls) facets.push({ kind: 'class', value: cls });\n    } else if (c === '#') {\n      i++;\n      let id = '';\n      while (i < s.length && /[a-zA-Z0-9_-]/.test(s[i])) id += s[i++];\n      if (id) facets.push({ kind: 'id', value: id });\n    } else if (c === '[') {\n      i++;\n      const { body, end } = readBalanced(s, i, '[', ']');\n      i = end;\n      facets.push(parseAttribute(body));\n    } else if (c === ':') {\n      i++;\n      let name = '';\n      while (i < s.length && /[a-zA-Z0-9_-]/.test(s[i])) name += s[i++];\n      if (!name) continue;\n      let arg: SelectorNode | undefined;\n      let rawArg: string | undefined;\n      if (s[i] === '(') {\n        i++;\n        const { body, end } = readBalanced(s, i, '(', ')');\n        i = end;\n        rawArg = body;\n        if (PSEUDOS_WITH_NESTED_SELECTOR.has(name)) {\n          arg = parseBlueriqSelector(body);\n        }\n      }\n      facets.push({ kind: 'pseudo', name, arg, rawArg });\n    } else {\n      // Unknown character — skip to keep parsing instead of aborting.\n      i++;\n    }\n  }\n\n  if (facets.length === 0) return { kind: 'invalid', source: s };\n  return { kind: 'compound', facets };\n}\n\n// Reads characters up to the matching closing delimiter, respecting quotes\n// and same-kind nesting. `i` points just past the opening delimiter.\n// Returns the inner body (without the closing delimiter) and the index just\n// past the closing delimiter.\nfunction readBalanced(s: string, i: number, open: string, close: string): { body: string; end: number } {\n  let depth = 1;\n  let body = '';\n  let inQuote: string | null = null;\n  while (i < s.length && depth > 0) {\n    const c = s[i];\n    if (inQuote) {\n      if (c === '\\\\' && i + 1 < s.length) {\n        body += c;\n        body += s[i + 1];\n        i += 2;\n        continue;\n      }\n      if (c === inQuote) inQuote = null;\n      body += c;\n      i++;\n      continue;\n    }\n    if (c === '\"' || c === \"'\") { inQuote = c; body += c; i++; continue; }\n    if (c === open) { depth++; body += c; i++; continue; }\n    if (c === close) {\n      depth--;\n      if (depth === 0) { i++; break; }\n      body += c;\n      i++;\n      continue;\n    }\n    body += c;\n    i++;\n  }\n  return { body, end: i };\n}\n\nfunction parseAttribute(body: string): Facet {\n  let inQuote: string | null = null;\n  for (let i = 0; i < body.length; i++) {\n    const c = body[i];\n    if (inQuote) {\n      if (c === '\\\\' && i + 1 < body.length) { i++; continue; }\n      if (c === inQuote) inQuote = null;\n      continue;\n    }\n    if (c === '\"' || c === \"'\") { inQuote = c; continue; }\n\n    // Two-char ops first so we don't match the trailing `=` alone.\n    const two = body.slice(i, i + 2);\n    if ((TWO_CHAR_OPS as string[]).includes(two)) {\n      const name = body.slice(0, i).trim();\n      const value = stripQuotes(body.slice(i + 2).trim());\n      return { kind: 'attr', name, op: two as AttrOp, value };\n    }\n    if (c === '=') {\n      const name = body.slice(0, i).trim();\n      const value = stripQuotes(body.slice(i + 1).trim());\n      return { kind: 'attr', name, op: '=', value };\n    }\n  }\n  return { kind: 'attr', name: body.trim() };\n}\n\nfunction stripQuotes(s: string): string {\n  if (s.length >= 2) {\n    const first = s[0];\n    const last = s[s.length - 1];\n    if ((first === '\"' || first === \"'\") && first === last) {\n      return s.slice(1, -1);\n    }\n  }\n  return s;\n}\n\nfunction splitTopLevel(s: string, sep: string): string[] {\n  const parts: string[] = [];\n  let buf = '';\n  let bracketDepth = 0;\n  let parenDepth = 0;\n  let inQuote: string | null = null;\n  for (let i = 0; i < s.length; i++) {\n    const c = s[i];\n    if (inQuote) {\n      buf += c;\n      if (c === '\\\\' && i + 1 < s.length) buf += s[++i];\n      else if (c === inQuote) inQuote = null;\n      continue;\n    }\n    if (c === '\"' || c === \"'\") { inQuote = c; buf += c; continue; }\n    if (c === '[') { bracketDepth++; buf += c; continue; }\n    if (c === ']') { bracketDepth--; buf += c; continue; }\n    if (c === '(') { parenDepth++; buf += c; continue; }\n    if (c === ')') { parenDepth--; buf += c; continue; }\n    if (c === sep && bracketDepth === 0 && parenDepth === 0) {\n      parts.push(buf);\n      buf = '';\n      continue;\n    }\n    buf += c;\n  }\n  parts.push(buf);\n  return parts;\n}\n\n// Human-readable label for a combinator, used by the tree renderer.\nexport function combinatorLabel(c: Combinator): string {\n  switch (c) {\n    case 'descendant':       return 'descendant of';\n    case 'child':            return 'direct child of';\n    case 'adjacent-sibling': return 'adjacent sibling after';\n    case 'general-sibling':  return 'sibling after';\n  }\n}\n\n// Compact label for a facet, displayed inline in a tree row.\nexport function facetSummary(f: Facet): string {\n  switch (f.kind) {\n    case 'type':     return f.value;\n    case 'wildcard': return 'any element';\n    case 'class':    return '.' + f.value;\n    case 'id':       return '#' + f.value;\n    case 'attr':\n      if (f.op == null) return `[${f.name}]`;\n      return `[${f.name}${f.op}${f.value ?? ''}]`;\n    case 'pseudo':\n      if (f.rawArg !== undefined) return `:${f.name}(…)`;\n      return ':' + f.name;\n  }\n}\n\n// Long-form label for a facet — what the tree row reads as in plain English.\nexport function facetExplanation(f: Facet): string {\n  switch (f.kind) {\n    case 'type':     return `element type is ${f.value}`;\n    case 'wildcard': return 'matches any element';\n    case 'class':    return `has style ${f.value}`;\n    case 'id':       return `has name ${f.value}`;\n    case 'attr':\n      if (f.op == null) return `has attribute ${f.name}`;\n      switch (f.op) {\n        case '=':  return `attribute ${f.name} equals \"${f.value ?? ''}\"`;\n        case '!=': return `attribute ${f.name} is not \"${f.value ?? ''}\"`;\n        case '~=': return `attribute ${f.name} contains word \"${f.value ?? ''}\"`;\n        case '|=': return `attribute ${f.name} starts with \"${f.value ?? ''}\" or \"${f.value ?? ''}-\"`;\n        case '^=': return `attribute ${f.name} starts with \"${f.value ?? ''}\"`;\n        case '$=': return `attribute ${f.name} ends with \"${f.value ?? ''}\"`;\n        case '*=': return `attribute ${f.name} contains \"${f.value ?? ''}\"`;\n      }\n      return `attribute ${f.name}`;\n    case 'pseudo':\n      switch (f.name) {\n        case 'has':         return 'has descendant matching:';\n        case 'not':         return 'does not match:';\n        case 'first-child': return 'is first child';\n        case 'last-child':  return 'is last child';\n      }\n      return f.rawArg !== undefined ? `pseudo :${f.name}(${f.rawArg})` : `pseudo :${f.name}`;\n  }\n}\n","import { Component, Input, ViewEncapsulation } from '@angular/core';\nimport {\n  Combinator,\n  Facet,\n  SelectorNode,\n  combinatorLabel,\n  facetExplanation,\n  facetSummary,\n} from '../services/selector-parser';\n\n// Recursive renderer for the parsed Blueriq selector tree shown when the\n// inspector popup's \"Blueriq selector\" row is expanded. Reuses the same\n// type-color palette as the element tree (`dev-tree__type--field`,\n// `--container`, …) so a `field` facet is the same shade as a `field` row in\n// the structure view above it.\n@Component({\n  selector: 'app-dev-selector-tree',\n  templateUrl: './dev-selector-tree.component.html',\n  standalone: false,\n  encapsulation: ViewEncapsulation.None,\n})\nexport class DevSelectorTreeComponent {\n  @Input() node: SelectorNode | null = null;\n\n  combinatorLabel = combinatorLabel;\n  facetExplanation = facetExplanation;\n  facetSummary = facetSummary;\n\n  // Narrowing helpers — Angular's *ngSwitchCase doesn't refine $any() values.\n  asUnion(n: SelectorNode | null) { return n as Extract<SelectorNode, { kind: 'union' }>; }\n  asChain(n: SelectorNode | null) { return n as Extract<SelectorNode, { kind: 'chain' }>; }\n  asCompound(n: SelectorNode | null) { return n as Extract<SelectorNode, { kind: 'compound' }>; }\n  asInvalid(n: SelectorNode | null) { return n as Extract<SelectorNode, { kind: 'invalid' }>; }\n\n  // Returns the existing `.dev-tree__type--<x>` modifier class so type facets\n  // pick up the inspector's palette colors automatically.\n  facetTypeClass(f: Facet): string {\n    if (f.kind === 'type') return 'dev-tree__type--' + f.value.toLowerCase();\n    if (f.kind === 'wildcard') return 'dev-tree__type--?';\n    return 'dev-selector-tree__badge--' + f.kind;\n  }\n\n  // Single-letter badge content. Type facets show the first letter of the\n  // type (uppercased) to mirror the element tree; other facets get a glyph.\n  facetBadge(f: Facet): string {\n    switch (f.kind) {\n      case 'type':     return f.value[0]?.toUpperCase() ?? '?';\n      case 'wildcard': return '*';\n      case 'class':    return '.';\n      case 'id':       return '#';\n      case 'attr':     return '[';\n      case 'pseudo':   return ':';\n    }\n  }\n\n  // Whether a facet renders a nested sub-tree below its row.\n  hasNested(f: Facet): boolean {\n    return f.kind === 'pseudo' && !!f.arg;\n  }\n\n  // Returns a Blueriq style name to render as a chip, or null. Class facets\n  // (`.Card`) are the canonical style match; attribute selectors targeting\n  // `contentStyle` or `styles` are also style matches when they pin a value.\n  styleChip(f: Facet): string | null {\n    if (f.kind === 'class') return f.value;\n    if (f.kind === 'attr' && (f.name === 'contentStyle' || f.name === 'styles') && f.value) {\n      return f.value;\n    }\n    return null;\n  }\n\n  nestedNode(f: Facet): SelectorNode | null {\n    return f.kind === 'pseudo' ? (f.arg ?? null) : null;\n  }\n}\n","<ng-container [ngSwitch]=\"node?.kind\">\n\n  <!-- Invalid — fall back to literal raw string. -->\n  <div *ngSwitchCase=\"'invalid'\" class=\"dev-selector-tree__invalid\">\n    <span class=\"dev-muted\">unparseable:</span>\n    <span class=\"dev-selector-tree__raw\">{{ asInvalid(node).source }}</span>\n  </div>\n\n  <!-- Union: top-level OR (comma-separated alternatives). -->\n  <div *ngSwitchCase=\"'union'\" class=\"dev-selector-tree__group dev-selector-tree__group--or\">\n    <div class=\"dev-selector-tree__op\">any of these matches</div>\n    <ul class=\"dev-selector-tree__list\">\n      <li *ngFor=\"let b of asUnion(node).branches\" class=\"dev-selector-tree__item\">\n        <app-dev-selector-tree [node]=\"b\"></app-dev-selector-tree>\n      </li>\n    </ul>\n  </div>\n\n  <!-- Chain: combinator sequence. The rightmost step is the matched element;\n       earlier steps are constraints on its ancestors / siblings. -->\n  <div *ngSwitchCase=\"'chain'\" class=\"dev-selector-tree__group dev-selector-tree__group--chain\">\n    <div class=\"dev-selector-tree__op\">matched element is rightmost; preceding steps constrain context</div>\n    <ul class=\"dev-selector-tree__list\">\n      <li *ngFor=\"let step of asChain(node).steps; let last = last\" class=\"dev-selector-tree__item\">\n        <span *ngIf=\"step.combinator\" class=\"dev-selector-tree__combinator\">{{ combinatorLabel(step.combinator) }}</span>\n        <app-dev-selector-tree [node]=\"step.node\"></app-dev-selector-tree>\n        <span *ngIf=\"last\" class=\"dev-selector-tree__tag\">← matched</span>\n      </li>\n    </ul>\n  </div>\n\n  <!-- Compound: AND of facets on a single element. -->\n  <ng-container *ngSwitchCase=\"'compound'\">\n\n    <!-- Single facet: render the row directly, no AND wrapper. -->\n    <ng-container *ngIf=\"asCompound(node).facets.length === 1; else multipleFacets\">\n      <ng-container *ngTemplateOutlet=\"facetRow; context: {$implicit: asCompound(node).facets[0]}\"></ng-container>\n    </ng-container>\n\n    <ng-template #multipleFacets>\n      <div class=\"dev-selector-tree__group dev-selector-tree__group--and\">\n        <div class=\"dev-selector-tree__op\">all of these:</div>\n        <ul class=\"dev-selector-tree__list\">\n          <li *ngFor=\"let f of asCompound(node).facets\" class=\"dev-selector-tree__item\">\n            <ng-container *ngTemplateOutlet=\"facetRow; context: {$implicit: f}\"></ng-container>\n          </li>\n        </ul>\n      </div>\n    </ng-template>\n\n  </ng-container>\n\n</ng-container>\n\n<!-- Shared facet row template. -->\n<ng-template #facetRow let-f>\n  <div class=\"dev-selector-tree__row\">\n    <span class=\"dev-tree__type\" [ngClass]=\"facetTypeClass(f)\" [title]=\"facetSummary(f)\">{{ facetBadge(f) }}</span>\n    <span class=\"dev-tree__label\">{{ facetExplanation(f) }}</span>\n    <span *ngIf=\"styleChip(f) as chip\"\n          class=\"dev-insights__style-chip\"\n          [ngClass]=\"'dev-insights__style-chip--' + chip\">{{ chip }}</span>\n    <span class=\"dev-selector-tree__source dev-muted\">{{ facetSummary(f) }}</span>\n  </div>\n  <div *ngIf=\"hasNested(f)\" class=\"dev-selector-tree__nested\">\n    <app-dev-selector-tree [node]=\"nestedNode(f)\"></app-dev-selector-tree>\n  </div>\n</ng-template>\n","import { animate, style, transition, trigger } from '@angular/animations';\nimport { Component, EventEmitter, Input, NgZone, OnChanges, Output, SimpleChanges, ViewEncapsulation } from '@angular/core';\nimport { SafeHtml } from '@angular/platform-browser';\nimport { Element as BlueriqElement } from '@blueriq/core';\nimport { BlockerReason, CaptureAnalysis, CaptureEntry, ElementTreeNode } from '../bq-lens.types';\nimport { copyWithFeedback } from '../dev-clipboard.utils';\nimport { attachDragGesture } from '../dev-drag.utils';\nimport { safeJsonParse, safeStringify } from '../dev-json.utils';\nimport { modKeyLabel } from '../dev-platform.utils';\nimport { whyBlocked } from '../dev-why-blocked.utils';\nimport { parseBlueriqSelector, SelectorNode } from '../services/selector-parser';\n\n/** One entry of an element's value-history ring, surfaced in the Structure tab. */\nexport interface InspectorHistoryEntry {\n  ts: number;\n  value: unknown;\n  captureId?: string;\n}\n\n@Component({\n  selector: 'app-dev-inspector-popup',\n  templateUrl: './dev-inspector-popup.component.html',\n  standalone: false,\n  encapsulation: ViewEncapsulation.None,\n  animations: [\n    trigger('navUp', [\n      transition('* => *', [\n        style({ opacity: 0.5, transform: 'translateY(-4px)' }),\n        animate('460ms ease-out', style({ opacity: 1, transform: 'translateY(0)' })),\n      ]),\n    ]),\n  ],\n})\nexport class DevInspectorPopupComponent implements OnChanges {\n  @Input() inspectedElement: BlueriqElement | null = null;\n  @Input() popupPos: { left: number; top: number } | null = null;\n  @Input() isPickerActive = false;\n  @Input() hasParent = false;\n  @Input() parentNavKey = 0;\n  @Input() elementViewMode: 'template' | 'json' | 'insights' | 'structure' | 'story' | 'graph' = 'template';\n  @Input() elementStoryCode: string | null = null;\n  @Input() highlightedElementStory: SafeHtml | null = null;\n  @Input() storyProvidersPath = '';\n\n  @Output() storyProvidersPathChange = new EventEmitter<string>();\n\n  storySettingsOpen = false;\n  readonly modKey = modKeyLabel();\n  @Input() highlightedElementTemplate: SafeHtml | null = null;\n  @Input() elementTemplate: string | null = null;\n  @Input() highlightedElementJson: SafeHtml | null = null;\n  @Input() elementJson: string | null = null;\n  @Input() elementInsightsData: CaptureAnalysis | null = null;\n  @Input() elementTree: ElementTreeNode | null = null;\n  @Input() elementCopied = false;\n  @Input() onTreeNodeSelect: ((key: string) => void) | null = null;\n  @Input() collapsedKeys: Set<string> = new Set();\n  @Input() onTreeNodeToggle: ((key: string) => void) | null = null;\n  @Input() selectedTreeKey: string | null = null;\n  @Input() canGoBack = false;\n  @Input() canGoForward = false;\n  @Input() breadcrumbs: Array<{key: string; type: string; name: string}> = [];\n  @Input() componentName: string | null = null;\n  @Input() componentClass: string | null = null;\n  @Input() blueriqSelector: string | null = null;\n  @Input() blueriqSelectorPriority: number | null = null;\n  @Input() sourceCapture: CaptureEntry | null = null;\n  @Input() elementHistory: InspectorHistoryEntry[] = [];\n  @Input() elementSources: string[] = [];\n  @Input() elementCapturedIn: string[] = [];\n\n  @Output() elementViewModeChange = new EventEmitter<'template' | 'json' | 'insights' | 'structure' | 'story' | 'graph'>();\n\n  @Output() copyRequested = new EventEmitter<void>();\n  @Output() pickerToggled = new EventEmitter<void>();\n  @Output() selectParentRequested = new EventEmitter<void>();\n  @Output() navigateBack = new EventEmitter<void>();\n  @Output() navigateForward = new EventEmitter<void>();\n  @Output() breadcrumbSelected = new EventEmitter<string>();\n  @Output() closed = new EventEmitter<void>();\n  @Output() sourceCaptureClicked = new EventEmitter<CaptureEntry>();\n  @Output() tourReplayRequested = new EventEmitter<void>();\n  /** Final position after the user drags the popup. Lets the host pin the\n   * position so scroll-follow / re-positioning doesn't snap it back. */\n  @Output() popupMoved = new EventEmitter<{ left: number; top: number }>();\n\n  private _localPos: { left: number; top: number } | null = null;\n  isDragging = false;\n\n  blueriqSelectorTreeOpen = false;\n  private _parsedSelectorCache: { src: string | null; tree: SelectorNode | null } = { src: null, tree: null };\n\n  constructor(private zone: NgZone) {}\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['popupPos'] && !this.isDragging) {\n      this._localPos = null;\n    }\n    if (changes['blueriqSelector']) {\n      // Parse on demand the next time the tree is requested.\n      this._parsedSelectorCache = { src: null, tree: null };\n    }\n  }\n\n  get parsedBlueriqSelector(): SelectorNode | null {\n    const src = this.blueriqSelector;\n    if (!src) return null;\n    if (this._parsedSelectorCache.src === src) return this._parsedSelectorCache.tree;\n    const tree = parseBlueriqSelector(src);\n    this._parsedSelectorCache = { src, tree };\n    return tree;\n  }\n\n  toggleBlueriqSelectorTree(): void {\n    this.blueriqSelectorTreeOpen = !this.blueriqSelectorTreeOpen;\n  }\n\n  get effectivePos(): { left: number; top: number } | null {\n    return this._localPos ?? this.popupPos;\n  }\n\n  onHeaderDragStart(event: MouseEvent): void {\n    if ((event.target as HTMLElement).closest('button')) return;\n    const base = this.effectivePos;\n    if (!base) return;\n    attachDragGesture({\n      startEvent: event,\n      zone: this.zone,\n      onStart: () => { this.isDragging = true; },\n      onMove: (dx, dy) => {\n        this._localPos = {\n          left: Math.max(0, Math.min(window.innerWidth - 100, base.left + dx)),\n          top: Math.max(0, Math.min(window.innerHeight - 40, base.top + dy)),\n        };\n      },\n      onEnd: () => {\n        this.isDragging = false;\n        // Promote the dragged position to the host so scroll-follow stops\n        // re-running positionPopup on the original element. Without this the\n        // first window scroll after a drag snaps the popup back.\n        if (this._localPos) this.popupMoved.emit(this._localPos);\n      },\n    });\n  }\n\n  componentNameCopied = false;\n  componentClassCopied = false;\n  blueriqSelectorCopied = false;\n\n  copyComponentName(name: string | null): Promise<void> {\n    return copyWithFeedback(this, 'componentNameCopied', name);\n  }\n\n  copyComponentClass(name: string | null): Promise<void> {\n    return copyWithFeedback(this, 'componentClassCopied', name);\n  }\n\n  copyBlueriqSelector(sel: string | null): Promise<void> {\n    return copyWithFeedback(this, 'blueriqSelectorCopied', sel);\n  }\n\n  /** Plain-English reasons the picked element is in its current state. Empty when nothing's wrong. */\n  get blockerReasons(): BlockerReason[] {\n    const el = safeJsonParse<any>(this.elementJson, null);\n    if (!el) return [];\n    return whyBlocked(el, this.elementInsightsData);\n  }\n\n  /** History ring entries, oldest first (matches the cache append order). */\n  get historyRows(): Array<{ time: string; value: string; captureId?: string }> {\n    if (!Array.isArray(this.elementHistory)) return [];\n    return this.elementHistory.map(e => ({\n      time: e.ts ? new Date(e.ts).toLocaleTimeString() : '—',\n      value: this._formatHistoryValue(e.value),\n      captureId: e.captureId,\n    }));\n  }\n\n  /** True when the element has any provenance data — gates the History section. */\n  get hasHistoryOrProvenance(): boolean {\n    return this.historyRows.length > 0\n        || (this.elementSources?.length ?? 0) > 0\n        || (this.elementCapturedIn?.length ?? 0) > 0;\n  }\n\n  private _formatHistoryValue(v: unknown): string {\n    if (v === undefined) return '∅';\n    if (v === null) return 'null';\n    if (typeof v === 'string') return v.length > 80 ? v.slice(0, 80) + '…' : v;\n    if (Array.isArray(v)) return `[${v.length}] ${v.slice(0, 3).map(x => this._formatHistoryValue(x)).join(', ')}${v.length > 3 ? '…' : ''}`;\n    if (typeof v === 'object') {\n      return safeStringify(v, '[object]');\n    }\n    return String(v);\n  }\n\n  get elementMeta(): Array<{ label: string; value?: string; mono?: boolean; muted?: boolean; tag?: string; chips?: string[] }> {\n    const el = safeJsonParse<any>(this.elementJson, null);\n    if (!el) return [];\n    const rows: Array<{ label: string; value?: string; mono?: boolean; muted?: boolean; tag?: string; chips?: string[] }> = [];\n\n    if (el.functionalKey && el.functionalKey !== el.key)\n      rows.push({ label: 'key', value: el.functionalKey, mono: true });\n\n    if (el.contentStyle)\n      rows.push({ label: 'style', chips: [el.contentStyle] });\n\n    if (el.type === 'field') {\n      if (el.dataType)\n        rows.push({ label: 'dataType', value: el.dataType, tag: 'type' });\n      const vals: string[] = Array.isArray(el.values) ? el.values : (el.value != null ? [el.value] : []);\n      rows.push(vals.length\n        ? { label: 'value', value: vals.join(', ') }\n        : { label: 'value', value: 'empty', muted: true });\n      if (el.required)\n        rows.push({ label: 'required', value: 'required', tag: 'warn' });\n      const editable = el.editable != null ? !!el.editable : !el.readonly;\n      if (!editable)\n        rows.push({ label: 'editable', value: 'read-only', tag: 'muted' });\n      if (el.multiValued)\n        rows.push({ label: 'multiValued', value: 'multi-valued', tag: 'info' });\n      if (el.refresh)\n        rows.push({ label: 'refresh', value: '↺ refreshes', tag: 'info' });\n    }\n\n    if (el.type === 'button') {\n      rows.push({ label: 'caption', value: el.caption ?? '—' });\n      if (el.disabled)\n        rows.push({ label: 'state', value: 'disabled', tag: 'muted' });\n      if (el.validate)\n        rows.push({ label: 'validate', value: 'triggers validation', tag: 'ok' });\n    }\n\n    if (el.type === 'textitem' && el.plainText)\n      rows.push({ label: 'text', value: el.plainText, muted: true });\n\n    if (Array.isArray(el.styles) && el.styles.length)\n      rows.push({ label: 'styles', chips: el.styles.map(String) });\n\n    return rows;\n  }\n}\n","<div class=\"dev-inspector-popup\"\n     [class.dev-inspector-popup--large]=\"inspectedElement?.type === 'page'\"\n     [class.dev-inspector-popup--dragging]=\"isDragging\"\n     *ngIf=\"effectivePos\"\n     [style.left.px]=\"effectivePos!.left\"\n     [style.top.px]=\"effectivePos!.top\"\n     (click)=\"$event.stopPropagation()\">\n\n  <!-- Header -->\n  <div class=\"dev-inspector-popup__header\" (mousedown)=\"onHeaderDragStart($event)\">\n    <ng-container *ngIf=\"inspectedElement; else noBlueriqHeader\">\n      <span class=\"dev-method dev-method--{{ inspectedElement.type }}\">{{ inspectedElement.type }}</span>\n      <span class=\"dev-inspector__key\">{{ inspectedElement.key }}</span>\n      <span class=\"dev-inspector__name\" [title]=\"inspectedElement.name\">{{ inspectedElement.name }}</span>\n    </ng-container>\n    <ng-template #noBlueriqHeader>\n      <span class=\"dev-inspector__name dev-muted\">No Blueriq component</span>\n    </ng-template>\n    <button class=\"dev-icon-btn\" (click)=\"navigateBack.emit()\" [disabled]=\"!canGoBack\" title=\"Back\"><bq-icon name=\"arrow-left\"></bq-icon></button>\n    <button class=\"dev-icon-btn\" (click)=\"navigateForward.emit()\" [disabled]=\"!canGoForward\" title=\"Forward\"><bq-icon name=\"arrow-right\"></bq-icon></button>\n    <button class=\"dev-icon-btn\" (click)=\"selectParentRequested.emit()\" [disabled]=\"!hasParent\" title=\"Select parent element\"><bq-icon name=\"level-up-alt\"></bq-icon></button>\n    <button class=\"dev-icon-btn\" (click)=\"pickerToggled.emit()\" [title]=\"'Pick element (' + modKey + '+P)'\"><bq-icon name=\"crosshairs\"></bq-icon></button>\n    <button class=\"dev-icon-btn\" (click)=\"tourReplayRequested.emit()\" title=\"Replay inspector tour\"><bq-icon name=\"compass\"></bq-icon></button>\n    <button class=\"dev-icon-btn\" (click)=\"closed.emit()\" title=\"Close\"><bq-icon name=\"times\"></bq-icon></button>\n  </div>\n\n  <!-- Breadcrumb trail -->\n  <div class=\"dev-inspector-popup__breadcrumbs\" *ngIf=\"breadcrumbs.length > 0\">\n    <ng-container *ngFor=\"let crumb of breadcrumbs; let last = last\">\n      <span class=\"dev-breadcrumb\" (click)=\"breadcrumbSelected.emit(crumb.key)\" [attr.data-tooltip]=\"crumb.name\">\n        <span class=\"dev-tree__type dev-tree__type--{{ crumb.type }}\" style=\"width:12px;height:12px;font-size:8px\">{{ crumb.type[0] }}</span>\n        {{ crumb.name }}\n      </span>\n      <span class=\"dev-breadcrumb__sep\" *ngIf=\"!last\">›</span>\n    </ng-container>\n  </div>\n\n  <!-- Angular component: selector + class name on one row, each independently copyable -->\n  <div class=\"dev-inspector-popup__renderer\" *ngIf=\"componentName || componentClass\">\n    <bq-icon name=\"angular\" class=\"dev-inspector-popup__renderer-logo\" title=\"Angular component\"></bq-icon>\n    <span class=\"dev-muted\">Angular</span>\n    <ng-container *ngIf=\"componentName\">\n      <span class=\"dev-inspector-popup__renderer-name\">{{ componentName }}</span>\n      <button class=\"dev-icon-btn\" (click)=\"copyComponentName(componentName)\" [title]=\"componentNameCopied ? 'Copied!' : 'Copy ' + componentName\"><bq-icon [name]=\"componentNameCopied ? 'check' : 'copy'\"></bq-icon></button>\n    </ng-container>\n    <span class=\"dev-muted\" *ngIf=\"componentName && componentClass && componentClass !== componentName\">·</span>\n    <ng-container *ngIf=\"componentClass && componentClass !== componentName\">\n      <span class=\"dev-inspector-popup__renderer-name\">{{ componentClass }}</span>\n      <button class=\"dev-icon-btn\" (click)=\"copyComponentClass(componentClass)\" [title]=\"componentClassCopied ? 'Copied!' : 'Copy ' + componentClass\"><bq-icon [name]=\"componentClassCopied ? 'check' : 'copy'\"></bq-icon></button>\n    </ng-container>\n  </div>\n\n  <!-- Blueriq selector — the @BlueriqComponent rule that matched this element -->\n  <div class=\"dev-inspector-popup__renderer\" *ngIf=\"blueriqSelector\">\n    <bq-icon name=\"blueriq\" class=\"dev-inspector-popup__renderer-logo\" title=\"Blueriq selector\"></bq-icon>\n    <span class=\"dev-muted\" title=\"The @BlueriqComponent selector that picked this Angular component for this element\">Blueriq selector</span>\n    <span class=\"dev-inspector-popup__renderer-name\">{{ blueriqSelector }}</span>\n    <span *ngIf=\"blueriqSelectorPriority != null\" class=\"dev-inspector-popup__priority\" [title]=\"'@BlueriqComponent priority — higher wins'\">P{{ blueriqSelectorPriority }}</span>\n    <button class=\"dev-icon-btn\" (click)=\"copyBlueriqSelector(blueriqSelector)\" [title]=\"blueriqSelectorCopied ? 'Copied!' : 'Copy ' + blueriqSelector\"><bq-icon [name]=\"blueriqSelectorCopied ? 'check' : 'copy'\"></bq-icon></button>\n    <button class=\"dev-icon-btn\" [class.dev-icon-btn--active]=\"blueriqSelectorTreeOpen\" (click)=\"toggleBlueriqSelectorTree()\" [title]=\"blueriqSelectorTreeOpen ? 'Collapse selector tree' : 'Expand selector tree'\"><bq-icon [name]=\"blueriqSelectorTreeOpen ? 'chevron-up' : 'chevron-down'\"></bq-icon></button>\n  </div>\n\n  <!-- Expanded selector tree: parsed structural view of the selector above. -->\n  <div class=\"dev-inspector-popup__selector-tree\" *ngIf=\"blueriqSelectorTreeOpen && parsedBlueriqSelector\">\n    <app-dev-selector-tree [node]=\"parsedBlueriqSelector\"></app-dev-selector-tree>\n  </div>\n\n  <!-- Cross-reference: which capture sourced this element -->\n  <div class=\"dev-inspector-popup__source\" *ngIf=\"sourceCapture\">\n    <span class=\"dev-muted\">From capture</span>\n    <button class=\"dev-inspector-popup__source-btn\" (click)=\"sourceCaptureClicked.emit(sourceCapture!)\" title=\"Open this capture in the captures tab\">\n      <span class=\"dev-method dev-method--{{ sourceCapture.method.toLowerCase() }}\">{{ sourceCapture.method }}</span>\n      <span class=\"dev-status-code\">{{ sourceCapture.status }}</span>\n      <span class=\"dev-inspector-popup__source-url\">{{ sourceCapture.url }}</span>\n    </button>\n  </div>\n\n  <!-- Body -->\n  <ng-container *ngIf=\"inspectedElement; else noBlueriqBody\">\n    <div class=\"dev-list__detail-actions dev-list__detail-actions--tabs\">\n      <div class=\"dev-view-switch dev-view-switch--full\">\n        <button class=\"dev-view-switch__opt\" [class.active]=\"elementViewMode === 'json'\"     (click)=\"elementViewModeChange.emit('json')\"     title=\"Raw JSON\">JSON</button>\n        <button class=\"dev-view-switch__opt\" [class.active]=\"elementViewMode === 'template'\" (click)=\"elementViewModeChange.emit('template')\" title=\"Template code\">Template</button>\n        <button class=\"dev-view-switch__opt\" [class.active]=\"elementViewMode === 'story'\"    (click)=\"elementViewModeChange.emit('story')\"    title=\"Storybook CSF3 story\" [disabled]=\"!elementStoryCode\">Story</button>\n        <button class=\"dev-view-switch__opt\" [class.active]=\"elementViewMode === 'insights'\" (click)=\"elementViewModeChange.emit('insights')\" title=\"Structured insights\"  [disabled]=\"!elementInsightsData\">Insights</button>\n        <button class=\"dev-view-switch__opt\" [class.active]=\"elementViewMode === 'structure'\"(click)=\"elementViewModeChange.emit('structure')\" title=\"Element structure\"   [disabled]=\"!elementTree\">Structure</button>\n        <button class=\"dev-view-switch__opt\" [class.active]=\"elementViewMode === 'graph'\"    (click)=\"elementViewModeChange.emit('graph')\"    title=\"Treemap of the element subtree\" [disabled]=\"!elementTree\">Treemap</button>\n      </div>\n      <button *ngIf=\"elementViewMode === 'story'\" class=\"dev-icon-btn\" [class.dev-icon-btn--active]=\"storySettingsOpen\" (click)=\"storySettingsOpen = !storySettingsOpen\" title=\"Story settings\"><bq-icon name=\"cog\"></bq-icon></button>\n    </div>\n    <div *ngIf=\"elementViewMode === 'story' && storySettingsOpen\" class=\"dev-story-settings\">\n      <label class=\"dev-setting__label\">Providers import path</label>\n      <input class=\"dev-setting__input\"\n             type=\"text\"\n             [value]=\"storyProvidersPath\"\n             (change)=\"storyProvidersPathChange.emit($any($event.target).value)\"\n             placeholder=\"../../../../stories/storybook-providers\" />\n    </div>\n    <div class=\"dev-json dev-inspector-popup__body\"\n         [class.dev-inspector-popup__body--insights]=\"elementViewMode === 'insights' || elementViewMode === 'structure'\"\n         [@navUp]=\"parentNavKey\">\n\n      <!-- Template -->\n      <app-dev-code-viewer\n        *ngIf=\"elementViewMode === 'template'\"\n        kind=\"template\"\n        [highlighted]=\"highlightedElementTemplate\"\n        [content]=\"elementTemplate\"\n        [filename]=\"(inspectedElement?.functionalKey || inspectedElement?.key || 'element') + '.component.ts'\">\n      </app-dev-code-viewer>\n\n      <!-- JSON -->\n      <app-dev-code-viewer\n        *ngIf=\"elementViewMode === 'json'\"\n        [highlighted]=\"highlightedElementJson\"\n        [content]=\"elementJson\"\n        [filename]=\"(inspectedElement?.functionalKey || inspectedElement?.key || 'element') + '.json'\">\n      </app-dev-code-viewer>\n\n      <!-- Insights: meta properties + runtime analysis -->\n      <ng-container *ngIf=\"elementViewMode === 'insights'\">\n        <ng-container *ngTemplateOutlet=\"metaSection\"></ng-container>\n        <ng-container *ngTemplateOutlet=\"whyBlockedSection\"></ng-container>\n        <app-dev-insights-panel [analysis]=\"elementInsightsData\"></app-dev-insights-panel>\n      </ng-container>\n\n      <!-- Story: Storybook CSF3 code -->\n      <app-dev-code-viewer\n        *ngIf=\"elementViewMode === 'story'\"\n        kind=\"template\"\n        [highlighted]=\"highlightedElementStory\"\n        [content]=\"elementStoryCode\"\n        [filename]=\"(inspectedElement?.functionalKey || inspectedElement?.key || 'element') + '.stories.ts'\">\n      </app-dev-code-viewer>\n\n      <!-- Structure: meta properties + element tree (root = current element) -->\n      <ng-container *ngIf=\"elementViewMode === 'structure'\">\n        <ng-container *ngTemplateOutlet=\"metaSection\"></ng-container>\n        <ng-container *ngTemplateOutlet=\"historySection\"></ng-container>\n        <div class=\"dev-insights__section\" *ngIf=\"elementTree\">\n          <span class=\"dev-insights__label\">Structure</span>\n          <span class=\"dev-insights__mono dev-muted\" style=\"font-size:10px;margin-bottom:4px\">\n            {{ elementTree.totalDescendants }} descendant{{ elementTree.totalDescendants === 1 ? '' : 's' }}\n          </span>\n          <div class=\"dev-tree\">\n            <!-- Root row rendered directly so children start at depth 0 -->\n            <div class=\"dev-tree__row dev-tree__row--root\" [class.dev-tree__row--selected]=\"selectedTreeKey === elementTree.key\">\n              <span class=\"dev-tree__type dev-tree__type--{{ elementTree.type }}\">{{ elementTree.type[0] }}</span>\n              <span class=\"dev-tree__type-label\">{{ elementTree.type }}</span>\n              <span class=\"dev-tree__label\">{{ elementTree.label }}</span>\n              <span *ngIf=\"elementTree.totalDescendants > 0\" class=\"dev-tree__count\">{{ elementTree.totalDescendants }}</span>\n              <span *ngIf=\"elementTree.styles.length\" class=\"dev-tree__styles\">{{ elementTree.styles.join(' ') }}</span>\n            </div>\n            <app-dev-element-tree *ngIf=\"elementTree.children.length\" [nodes]=\"elementTree.children\" [depth]=\"0\" [onSelect]=\"onTreeNodeSelect\" [collapsedKeys]=\"collapsedKeys\" [onToggle]=\"onTreeNodeToggle\" [selectedKey]=\"selectedTreeKey\"></app-dev-element-tree>\n            <span *ngIf=\"!elementTree.children.length\" class=\"dev-muted\" style=\"font-size:10px;padding:2px 0;display:block\">leaf — no children</span>\n          </div>\n        </div>\n      </ng-container>\n\n      <!-- Graph: force-directed view of the same parent/child topology -->\n      <ng-container *ngIf=\"elementViewMode === 'graph' && elementTree\">\n        <app-dev-element-graph\n          scope=\"subtree\"\n          [rootKey]=\"elementTree.key\"\n          [selectedKey]=\"selectedTreeKey\"\n          (nodeSelected)=\"onTreeNodeSelect($event)\">\n        </app-dev-element-graph>\n      </ng-container>\n\n    </div>\n\n    <!-- Shared meta section template -->\n    <ng-template #metaSection>\n      <div class=\"dev-insights__section dev-insights__section--meta\" *ngIf=\"elementMeta.length\">\n        <div *ngFor=\"let row of elementMeta\" class=\"dev-insights__meta-row\">\n          <span class=\"dev-insights__meta-label\">{{ row.label }}</span>\n          <ng-container *ngIf=\"row.chips; else metaValue\">\n            <div class=\"dev-insights__style-chips\">\n              <span *ngFor=\"let chip of row.chips\"\n                    class=\"dev-insights__style-chip dev-insights__style-chip--{{ chip }}\">{{ chip }}</span>\n            </div>\n          </ng-container>\n          <ng-template #metaValue>\n            <span *ngIf=\"!row.tag\"\n                  class=\"dev-insights__meta-value\"\n                  [class.dev-insights__mono]=\"row.mono\"\n                  [class.dev-muted]=\"row.muted\">{{ row.value }}</span>\n            <span *ngIf=\"row.tag\"\n                  class=\"dev-insights__meta-badge dev-insights__meta-badge--{{ row.tag }}\">{{ row.value }}</span>\n          </ng-template>\n        </div>\n      </div>\n    </ng-template>\n\n    <!-- \"Why is this disabled?\" — plain-English reasons the picked element is in its current state. -->\n    <ng-template #whyBlockedSection>\n      <div class=\"dev-insights__section dev-why-blocked\">\n        <span class=\"dev-insights__label\">\n          <bq-icon name=\"shield-alt\"></bq-icon> Why blocked?\n        </span>\n        <ng-container *ngIf=\"blockerReasons.length; else noBlockers\">\n          <div *ngFor=\"let r of blockerReasons\"\n               class=\"dev-why-blocked__row dev-why-blocked__row--{{ r.severity }}\"\n               [attr.data-tooltip]=\"r.hint\">\n            <bq-icon [name]=\"r.icon\"></bq-icon>\n            <span class=\"dev-why-blocked__text\">{{ r.text }}</span>\n          </div>\n        </ng-container>\n        <ng-template #noBlockers>\n          <span class=\"dev-muted dev-why-blocked__empty\">No blockers detected.</span>\n        </ng-template>\n      </div>\n    </ng-template>\n\n    <!-- History — value transitions + provenance from the cache rings. -->\n    <ng-template #historySection>\n      <div class=\"dev-insights__section dev-history\" *ngIf=\"hasHistoryOrProvenance\">\n        <span class=\"dev-insights__label\">\n          <bq-icon name=\"clock\"></bq-icon> History\n        </span>\n        <ng-container *ngIf=\"historyRows.length; else noHistory\">\n          <div *ngFor=\"let h of historyRows\" class=\"dev-history__row\">\n            <span class=\"dev-history__time\">{{ h.time }}</span>\n            <span class=\"dev-history__value\">{{ h.value }}</span>\n            <span *ngIf=\"h.captureId\" class=\"dev-history__capture\"\n                  [attr.data-tooltip]=\"'Originating capture id'\">{{ h.captureId }}</span>\n          </div>\n        </ng-container>\n        <ng-template #noHistory>\n          <span class=\"dev-muted\">No prior values recorded — this element has only been seen once.</span>\n        </ng-template>\n        <div *ngIf=\"elementSources?.length\" class=\"dev-history__provenance\">\n          <span class=\"dev-history__provenance-label\">URLs</span>\n          <span *ngFor=\"let u of elementSources\" class=\"dev-insights__anomaly-ref\">{{ u }}</span>\n        </div>\n        <div *ngIf=\"elementCapturedIn?.length\" class=\"dev-history__provenance\">\n          <span class=\"dev-history__provenance-label\">Captures</span>\n          <span *ngFor=\"let c of elementCapturedIn\" class=\"dev-insights__anomaly-ref\">{{ c }}</span>\n        </div>\n      </div>\n    </ng-template>\n  </ng-container>\n  <ng-template #noBlueriqBody>\n    <div class=\"dev-inspector-popup__empty dev-muted\">Not a Blueriq element.</div>\n  </ng-template>\n\n</div>\n","import { Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core';\nimport { SafeHtml } from '@angular/platform-browser';\nimport { CaptureAnalysis, CaptureEntry, ElementTreeNode } from '../bq-lens.types';\n\n@Component({\n  selector: 'app-dev-large-view',\n  templateUrl: './dev-large-view.component.html',\n  standalone: false,\n  encapsulation: ViewEncapsulation.None,\n})\nexport class DevLargeViewComponent {\n  @Input() selectedCapture: CaptureEntry | null = null;\n  @Input() pageViewTitle: string | null = null;\n  @Input() viewMode: 'json' | 'template' | 'insights' | 'request' | 'structure' = 'json';\n  @Input() highlightedJson: SafeHtml | null = null;\n  @Input() selectedJson: string | null = null;\n  @Input() highlightedTemplate: SafeHtml | null = null;\n  @Input() generatedTemplate: string | null = null;\n  @Input() templateError: string | null = null;\n  @Input() captureAnalysis: CaptureAnalysis | null = null;\n  @Input() selectedRequestBody: string | null = null;\n  @Input() highlightedRequestBody: SafeHtml | null = null;\n  @Input() elementTree: ElementTreeNode | null = null;\n\n  @Output() viewModeChange = new EventEmitter<'json' | 'template' | 'insights' | 'request' | 'structure'>();\n  @Output() templateRequested = new EventEmitter<void>();\n  @Output() closed = new EventEmitter<void>();\n\n  collapsedKeys = new Set<string>();\n\n  setMode(mode: 'json' | 'template' | 'insights' | 'request' | 'structure'): void {\n    if (mode === 'template') {\n      this.templateRequested.emit();\n    } else {\n      this.viewModeChange.emit(mode);\n    }\n  }\n\n  toggleTreeKey(key: string): void {\n    if (this.collapsedKeys.has(key)) {\n      this.collapsedKeys.delete(key);\n    } else {\n      this.collapsedKeys.add(key);\n    }\n    this.collapsedKeys = new Set(this.collapsedKeys);\n  }\n}\n","<div class=\"dev-large-view\" (click)=\"closed.emit()\">\n  <div class=\"dev-large-view__panel\" (click)=\"$event.stopPropagation()\">\n    <div class=\"dev-large-view__header\">\n      <span class=\"dev-url\">{{ selectedCapture ? selectedCapture.url : pageViewTitle }}</span>\n      <button class=\"dev-icon-btn\" (click)=\"closed.emit()\" title=\"Close (Esc)\"><bq-icon name=\"times\"></bq-icon></button>\n    </div>\n    <div class=\"dev-large-view__tabs\">\n      <div class=\"dev-view-switch dev-view-switch--full\">\n        <button class=\"dev-view-switch__opt\" [class.active]=\"viewMode === 'json'\"      (click)=\"setMode('json')\"      title=\"Raw JSON\">JSON</button>\n        <button class=\"dev-view-switch__opt\" [class.active]=\"viewMode === 'template'\"  (click)=\"setMode('template')\"  title=\"Generate template\">Template</button>\n        <button class=\"dev-view-switch__opt\" [class.active]=\"viewMode === 'request'\"   (click)=\"setMode('request')\"   title=\"Request body\" [disabled]=\"!selectedRequestBody\">Request</button>\n        <button class=\"dev-view-switch__opt\" [class.active]=\"viewMode === 'insights'\"  (click)=\"setMode('insights')\"  title=\"Analyse response\">Insights</button>\n        <button class=\"dev-view-switch__opt\" [class.active]=\"viewMode === 'structure'\" (click)=\"setMode('structure')\" title=\"Element tree\" [disabled]=\"!elementTree\">Structure</button>\n      </div>\n    </div>\n    <div class=\"dev-json dev-large-view__body\" [class.dev-large-view__body--structure]=\"viewMode === 'structure'\">\n      <ng-container *ngIf=\"viewMode !== 'structure'\">\n        <app-dev-viewer-container\n          [viewMode]=\"viewMode\"\n          [highlightedJson]=\"highlightedJson\"\n          [selectedJson]=\"selectedJson\"\n          [highlightedRequestBody]=\"highlightedRequestBody\"\n          [selectedRequestBody]=\"selectedRequestBody\"\n          [templateError]=\"templateError\"\n          [highlightedTemplate]=\"highlightedTemplate\"\n          [generatedTemplate]=\"generatedTemplate\"\n          [captureAnalysis]=\"captureAnalysis\">\n        </app-dev-viewer-container>\n      </ng-container>\n      <ng-container *ngIf=\"viewMode === 'structure' && elementTree\">\n        <div class=\"dev-insights__section\">\n          <span class=\"dev-insights__label\">Structure</span>\n          <span class=\"dev-insights__mono dev-muted\" style=\"font-size:10px;margin-bottom:4px\">\n            {{ elementTree.totalDescendants }} descendant{{ elementTree.totalDescendants === 1 ? '' : 's' }}\n          </span>\n          <div class=\"dev-tree\">\n            <div class=\"dev-tree__row dev-tree__row--root\">\n              <span class=\"dev-tree__type dev-tree__type--{{ elementTree.type }}\">{{ elementTree.type[0] }}</span>\n              <span class=\"dev-tree__type-label\">{{ elementTree.type }}</span>\n              <span class=\"dev-tree__label\">{{ elementTree.label }}</span>\n              <span *ngIf=\"elementTree.totalDescendants > 0\" class=\"dev-tree__count\">{{ elementTree.totalDescendants }}</span>\n              <span *ngIf=\"elementTree.styles.length\" class=\"dev-tree__styles\">{{ elementTree.styles.join(' ') }}</span>\n            </div>\n            <app-dev-element-tree\n              *ngIf=\"elementTree.children.length\"\n              [nodes]=\"elementTree.children\"\n              [depth]=\"0\"\n              [collapsedKeys]=\"collapsedKeys\"\n              [onToggle]=\"toggleTreeKey.bind(this)\">\n            </app-dev-element-tree>\n            <span *ngIf=\"!elementTree.children.length\" class=\"dev-muted\" style=\"font-size:10px;padding:2px 0;display:block\">leaf — no children</span>\n          </div>\n        </div>\n      </ng-container>\n    </div>\n  </div>\n</div>\n","export const BQ_LENS_HEADER_DATA_URI =\n  'data:image/png;base64,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';\n","// Inlined copy of README.md, exposed as a string so the in-app help popup\n// can render it without needing an asset entry in angular.json. Keep in sync.\nimport { BQ_LENS_HEADER_DATA_URI } from './bq-lens.header';\n\nexport const BQ_LENS_HELP_MARKDOWN = `<p align=\"center\">\n  <img src=\"${BQ_LENS_HEADER_DATA_URI}\" alt=\"BqLens\" />\n</p>\n\n# BqLens\n\nA developer overlay for Angular applications driven by [Blueriq](https://my.blueriq.com/) — the kind where the UI is not authored in Angular templates, but composed at runtime from JSON the runtime sends down.\n\n<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 720 340\" role=\"img\" aria-label=\"BqLens taps the HTTP wire, matches Angular components to Blueriq elements, and overlays the rendered DOM.\" style=\"max-width:100%;height:auto;display:block;margin:8px 0 16px;\">\n  <defs>\n    <marker id=\"bq-arr\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"6\" markerHeight=\"6\" orient=\"auto\"><path d=\"M0,0 L10,5 L0,10 z\" fill=\"#475569\"/></marker>\n    <marker id=\"bq-arr-blue\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"6\" markerHeight=\"6\" orient=\"auto\"><path d=\"M0,0 L10,5 L0,10 z\" fill=\"#1e6fb8\"/></marker>\n  </defs>\n  <style>\n    .bq-box{fill:#f8fafc;stroke:#94a3b8;stroke-width:1.5}\n    .bq-lens-box{fill:#1e6fb8;stroke:#1e6fb8}\n    .bq-title{font:600 14px -apple-system,Segoe UI,sans-serif;fill:#0f172a;text-anchor:middle}\n    .bq-title-w{fill:#fff}\n    .bq-sub{font:11px -apple-system,Segoe UI,sans-serif;fill:#64748b;text-anchor:middle}\n    .bq-sub-w{fill:#cbd5e1}\n    .bq-elabel{font:11px -apple-system,Segoe UI,sans-serif;fill:#475569;text-anchor:middle}\n    .bq-edge{stroke:#475569;stroke-width:1.5;fill:none}\n    .bq-tap{stroke:#1e6fb8;stroke-width:1.5;stroke-dasharray:5 4;fill:none}\n    .bq-bg{fill:#fff}\n  </style>\n  <rect class=\"bq-box\" x=\"20\" y=\"50\" width=\"160\" height=\"80\" rx=\"8\"/>\n  <text class=\"bq-title\" x=\"100\" y=\"85\">Blueriq backend</text>\n  <text class=\"bq-sub\" x=\"100\" y=\"105\">load / refresh / flow</text>\n  <rect class=\"bq-box\" x=\"280\" y=\"50\" width=\"160\" height=\"80\" rx=\"8\"/>\n  <text class=\"bq-title\" x=\"360\" y=\"85\">Angular app</text>\n  <text class=\"bq-sub\" x=\"360\" y=\"105\">components from JSON</text>\n  <rect class=\"bq-box\" x=\"540\" y=\"50\" width=\"160\" height=\"80\" rx=\"8\"/>\n  <text class=\"bq-title\" x=\"620\" y=\"85\">Rendered DOM</text>\n  <text class=\"bq-sub\" x=\"620\" y=\"105\">what users see</text>\n  <path class=\"bq-edge\" d=\"M182,90 L278,90\" marker-end=\"url(#bq-arr)\"/>\n  <text class=\"bq-elabel\" x=\"230\" y=\"80\">JSON</text>\n  <path class=\"bq-edge\" d=\"M442,90 L538,90\" marker-end=\"url(#bq-arr)\"/>\n  <text class=\"bq-elabel\" x=\"490\" y=\"80\">renders</text>\n  <rect class=\"bq-box bq-lens-box\" x=\"120\" y=\"230\" width=\"480\" height=\"70\" rx=\"10\"/>\n  <text class=\"bq-title bq-title-w\" x=\"360\" y=\"262\">BqLens</text>\n  <text class=\"bq-sub bq-sub-w\" x=\"360\" y=\"282\">capture · inspect · search · diff</text>\n  <path class=\"bq-tap\" d=\"M210,230 L210,98\" marker-end=\"url(#bq-arr-blue)\"/>\n  <path class=\"bq-tap\" d=\"M360,230 L360,132\" marker-end=\"url(#bq-arr-blue)\"/>\n  <path class=\"bq-tap\" d=\"M510,230 L510,98\" marker-end=\"url(#bq-arr-blue)\"/>\n  <rect class=\"bq-bg\" x=\"166\" y=\"160\" width=\"88\" height=\"14\"/>\n  <text class=\"bq-elabel\" x=\"210\" y=\"171\">captures HTTP</text>\n  <rect class=\"bq-bg\" x=\"294\" y=\"160\" width=\"132\" height=\"14\"/>\n  <text class=\"bq-elabel\" x=\"360\" y=\"171\">matches components</text>\n  <rect class=\"bq-bg\" x=\"468\" y=\"160\" width=\"84\" height=\"14\"/>\n  <text class=\"bq-elabel\" x=\"510\" y=\"171\">overlays DOM</text>\n</svg>\n\nMade by **Roel Berends** — [r.berends@ditpsoftware.nl](mailto:r.berends@ditpsoftware.nl)\nRepository — [bitbucket.org/ditpsoftware/bq-lens](https://bitbucket.org/ditpsoftware/bq-lens)\n\n**Contents**\n\n- [The problem](#the-problem)\n- [How BqLens solves it](#how-bqlens-solves-it)\n- [Installation](#installation)\n- [Configuration](#configuration)\n- [Why a single panel](#why-a-single-panel)\n- [Contributing](#contributing)\n\n## The problem\n\nBlueriq-driven apps invert the usual Angular relationship between code and UI:\n\n- **The rendered DOM doesn't match anything you can \\`Cmd+Click\\` to.** Components are picked from a registry against incoming \\`Element\\` types. What's on screen is the result of a JSON tree the server emitted, not a template you can grep for.\n- **Angular DevTools shows the host components, not the Blueriq elements.** You can see *which Angular component rendered a node*, but not *which Blueriq element it was rendering*, what its \\`key\\` is, what \\`contentStyle\\` drove the styling decision, or what the server actually sent.\n- **The HTTP traffic is the source of truth, but it's opaque.** Every \\`/load\\`, \\`/refresh\\`, \\`/start_flow\\` carries a Blueriq response shaping the next render. To understand a bug you usually need to read those responses — and the browser's network tab gives you raw JSON with no context.\n- **Reproducing a state in Storybook is a chore.** You see a buggy element on the page, you want it isolated in a story, and there's no shortcut between \"this element on screen\" and \"a CSF3 story I can paste into the Storybook tree.\"\n- **Nothing connects an element to its surroundings.** Walking ancestors, finding all fields inside a section, listing every button on the page — these are common questions with no good answer in the standard tooling.\n\nIn short: the gap between the *DOM you see*, the *Blueriq element that produced it*, and the *server payload that produced that* is wide, and bridging it manually slows everything down.\n\n## How BqLens solves it\n\nBqLens is a single floating panel injected into the app at runtime (dev only). It threads three views together — **DOM**, **Blueriq element model**, and **HTTP traffic** — so a developer can move between them in one or two clicks.\n\n### Element inspector (the picker)\n\nPress \\`Alt+P\\` and click anywhere. BqLens walks up the DOM, finds the nearest Angular host that renders a Blueriq element, and shows you:\n\n- The element's \\`key\\`, \\`type\\`, \\`functionalKey\\`, and the **Angular component name** that rendered it (so \\`Cmd+Click\\` *does* work — on the right thing).\n- Five views on that element, switchable via tabs:\n  - **Template** — the Angular component template generated from this element via \\`JsonToTemplatesComponent\\` (paste-ready into a real component).\n  - **JSON** — the cache-enriched server payload for this element and its descendants, fully resolved.\n  - **Story** — a Storybook CSF3 story for this element, with a configurable providers import path. Drop straight into the Storybook tree.\n  - **Insights** — typed analysis: fields with their data types and values, buttons with their actions, validation messages, table summaries. Picking a disabled or read-only element surfaces a **Why blocked?** section with a plain-English row per blocker (read-only flag set, required-empty, blocking validation, precondition gate, validate-on-click). A **Looks-wrong** section flags high-confidence authoring smells (empty captions, required-but-readonly, refresh on a read-only field, duplicate labels, validations without messages).\n  - **Structure** — the Blueriq element tree rooted at the inspected element, with type icons, descendant counts, and click-to-navigate. A **History** subsection lists each cached element's last value transitions (timestamp, before → after, originating capture id) plus its source URLs and the captures that touched it — surfacing the bounded provenance rings the cache already collects.\n- A **breadcrumb trail** of ancestor Blueriq elements (not Angular components — Blueriq elements), each clickable.\n- **Back / forward navigation history** (20-deep ring buffer), so jumping into a child and back is a key away.\n- A **scroll-following overlay** so the highlight stays anchored as the user scrolls the page underneath.\n\nWhen the live DOM doesn't have the element anymore (e.g. it scrolled out, was unmounted, or you got there via search), BqLens falls back to the cached server payload and synthesizes enough of an element to keep the inspector working.\n\n### HTTP capture & diff\n\nA \\`DevInterceptor\\` sits in front of every Blueriq request. The capture list shows method, URL, status, request body, response body, and a status-class filter (2xx / 4xx / 5xx). For every \\`POST /load\\` (and similar), the response is **warmed into an in-memory element cache** — a flat map from \\`key\\` to enriched element JSON, with children resolved into nested objects.\n\nThat cache is what makes everything else fast: the inspector reads from it, the search reads from it, the structure tree reads from it. If it's not in the cache, BqLens falls back to live DOM serialization and merges the result back in.\n\nA **diff mode** lets the developer pick two captures and answer \"what changed between this refresh and the last one?\" in three views, available as a tab strip at the top of the diff modal:\n\n- **Structure** (default) — field-level diff built on the typed analysis: \\`field <name> · editable: true → false\\`, \\`table <name> · rowCount: 5 → 0\\`, sections appearing or disappearing, page-context attribute changes. Match keys are functional: \\`functionalKey\\` for fields, \\`caption\\` for buttons and links, \\`displayName\\` for sections, \\`name\\` for tables.\n- **Semantic** — cache-key-level: which elements appeared, disappeared, or had attribute changes, regardless of how their identity reads to a human. Useful when the structural view shows nothing but you can see something moved.\n- **Text** — raw JSON line-by-line diff with hunks. Last-resort view for whitespace, ordering, or metadata changes the structural views deliberately skip.\n\n### Element search\n\n\\`Alt+S\\` opens a fuzzy search across every cached element. Each element contributes a weighted set of search fields — display name, name, caption, question text, functional key, type, content style, plain text, styles, values — so typing \\`\"voornaam\"\\` finds every field whose label, name, or value contains that word, ranked by field weight. Selecting a result jumps the inspector to that element, regardless of whether it's still on screen.\n\n### Page view\n\n\\`Alt+G\\` builds a full page snapshot: the entire current page's template (via \\`JsonToTemplatesComponent\\`), its JSON, its element tree, and its captured analysis — opened in a large modal view. Useful when \"show me what the runtime thinks is on screen right now\" is the question.\n\n### Internals (self-diagnostics)\n\nA separate **Internals** view, opened from the action bar next to Pick / Page / Search, is bq-lens looking at itself. It surfaces live counters (cached elements, tombstones, parent links, slow merges, integrity violations, template memo size and hit rate, evictions), a filterable cache-event log, a storage-layer event log, and on-demand **Run audit** / **Force rehydrate** actions. Every counter, button, and filter carries a plain-language tooltip so the panel explains itself without external docs.\n\nThe same view exposes **Export bug bundle** — one click downloads a single JSON file with the captures, the (internals-stripped) cache snapshot, the structure graph, the counters, the cache-event ring, and the current page tree. Hand it to a teammate and they can reproduce what you're seeing without sharing your screen. The bundle inherits the captures' sensitivity (response bodies are included verbatim), so treat it the same way you'd treat the captures themselves.\n\n### Activation\n\n- \\`Alt+D\\` — toggle the panel\n- \\`Alt+P\\` — element picker\n- \\`Alt+G\\` — page view\n- \\`Alt+S\\` — element search\n- \\`Alt+E\\` — jump to last error capture\n- \\`Esc\\` — cancel the picker, or close the active overlay (inspector / search / diff / large view)\n- \\`ddddd\\` (five \\`d\\` presses outside an input, in production) — toggle the dev-mode session flag\n\nThe floating tab is draggable; the side it docks on is persisted to \\`localStorage\\`, as is the picker's story-providers import path.\n\n## Installation\n\n\\`\\`\\`bash\nnpm install @ditpsoftware/bq-lens\n\\`\\`\\`\n\nThen register the module in your app's root module — see [Configuration](#configuration) for the full options:\n\n\\`\\`\\`ts\nimport { BqLensModule } from '@ditpsoftware/bq-lens';\n\n@NgModule({\n  imports: [\n    BqLensModule.forRoot(),  // production flag and Blueriq base URL auto-detected\n  ],\n})\nexport class AppModule {}\n\\`\\`\\`\n\nBoth \\`production\\` and \\`blueriqBaseUrl\\` are auto-detected: \\`production\\` defaults to \\`!isDevMode()\\`, and \\`blueriqBaseUrl\\` is read from \\`Backend.toUrl('')\\` in \\`@blueriq/angular/backend/common\\` (with URL-pattern sniffing as a last-resort fallback). Pass them explicitly only for unusual setups — multi-runtime hosts, non-standard build configs, or test harnesses without a \\`Backend\\` provider.\n\nOnce Angular reaches its first stable tick BqLens auto-bootstraps and appends a floating tab to \\`document.body\\`. Press \\`Alt+D\\` (or click the tab) to open the panel.\n\n### Prerequisites\n\n- **Angular 20+** runtime (peer-declared in \\`package.json\\`).\n- **\\`@blueriq/angular\\`** and **\\`@blueriq/core\\`** — from the Blueriq Artifactory; consumers need their \\`.npmrc\\` configured for the \\`@blueriq\\` scope.\n- **\\`legacy-peer-deps\\`** — \\`@blueriq/angular@0.18.x\\` declares Angular 15-19 peers while bq-lens targets Angular 20. Add \\`legacy-peer-deps=true\\` to your project's \\`.npmrc\\` once so every \\`npm install\\` resolves cleanly without flags.\n\nIcons are bundled inline as SVG — no Font Awesome required. The \\`extraSections.icon\\` field accepts a name from the bundled icon registry; see \\`bq-icon.component.ts\\` for the available names.\n\n### Recommended dev-mode build config\n\nThe inspector popup surfaces the **Blueriq selector** (e.g. \\`field[contentStyle=hint]\\`) and the **Angular component class name** for each picked element. Both are captured at runtime from a \\`console.table\\` dump that \\`@blueriq/angular\\` emits inside \\`provideCompiledComponentResolver\\`. The dump is gated by \\`isDevMode() && config.logComponents\\` and only fires once Angular dev mode is fully active.\n\nFor these rows to appear, the host app's dev configuration must satisfy:\n\n- **Blueriq config** — leave \\`logComponents\\` at its default (\\`true\\`). Setting it to \\`false\\` silences the dump and bq-lens has no way to recover the data.\n- **No \\`enableProdMode()\\`** — typically gated behind \\`if (environment.production)\\`, but worth double-checking.\n- **Angular CLI build flags** — \\`optimization\\`, \\`buildOptimizer\\`, and \\`aot\\` must all be \\`false\\` for the dev build configuration. The Angular build optimizer statically folds \\`if (isDevMode())\\` blocks in third-party libraries, dead-code-eliminating the dump *at build time* — even when \\`environment.production\\` is \\`false\\` and \\`enableProdMode()\\` is never called. The runtime check and the build-time strip are independent; both must be satisfied.\n\nTo verify dev mode is active in the running app, open the browser console and evaluate:\n\n\\`\\`\\`js\ntypeof ngDevMode !== 'undefined' && ngDevMode\n\\`\\`\\`\n\nIf that returns falsy, the build optimizer has stripped the dump and the bq-lens \"Blueriq selector\" / \"Angular class\" rows will stay empty. Fix by overriding the offending flags for the dev configuration in \\`angular.json\\`:\n\n\\`\\`\\`json\n{\n  \"configurations\": {\n    \"development\": {\n      \"optimization\":    false,\n      \"buildOptimizer\":  false,\n      \"aot\":             false\n    }\n  }\n}\n\\`\\`\\`\n\nClass names rely on the same dev-mode guarantee: minified builds mangle \\`cls.name\\`, which is what bq-lens uses as the lookup key. bq-lens is a dev-only overlay, so this is acceptable — but it is the reason a misconfigured build can show garbage characters in the \"Angular class\" row.\n\n### Offline / vendored install\n\nFor air-gapped environments where the npm registry isn't reachable, every release is also packed as a \\`.tgz\\` and committed under [\\`releases/\\`](https://bitbucket.org/ditpsoftware/bq-lens/src/main/releases/) in this repo. Drop the tarball into the host app's \\`vendor/\\` folder and reference it via npm's \\`file:\\` protocol:\n\n\\`\\`\\`bash\nmkdir -p vendor\ncurl -L -o vendor/ditpsoftware-bq-lens-0.0.1.tgz \\\\\n  https://bitbucket.org/ditpsoftware/bq-lens/raw/main/releases/ditpsoftware-bq-lens-0.0.1.tgz\n\\`\\`\\`\n\n\\`\\`\\`json\n{\n  \"dependencies\": {\n    \"@ditpsoftware/bq-lens\": \"file:./vendor/ditpsoftware-bq-lens-0.0.1.tgz\"\n  }\n}\n\\`\\`\\`\n\nThen \\`npm install\\`. Commit the \\`.tgz\\` so CI and other developers don't depend on the download being available at install time. To upgrade, download the new version's \\`.tgz\\`, replace the file in \\`vendor/\\`, bump the version in \\`package.json\\`, then run \\`npm install file:./vendor/ditpsoftware-bq-lens-<new-version>.tgz\\` (the explicit path forces npm to refresh the lockfile integrity hash even if the version string is unchanged).\n\n## Configuration\n\nThe minimum to mount the panel — no arguments, all fields auto-detected:\n\n\\`\\`\\`ts\nBqLensModule.forRoot(),\n\\`\\`\\`\n\nThat's enough — the panel auto-bootstraps once Angular reaches its first stable tick and appends itself to \\`document.body\\`. No template change is required in the host app. \\`production\\` defaults to \\`!isDevMode()\\` and \\`blueriqBaseUrl\\` resolves from \\`Backend.toUrl('')\\` (or, failing that, from sniffed traffic).\n\nIf you'd rather control the mount point yourself (e.g. to put the panel inside a specific layout container, or to keep it next to a sibling overlay), drop the tag once into the host's root template (typically \\`app.component.html\\`):\n\n\\`\\`\\`html\n<bq-lens-panel></bq-lens-panel>\n\\`\\`\\`\n\nWhen the tag is present, bq-lens uses it; when it's absent, the auto-bootstrap kicks in. The panel uses \\`position: fixed\\`, so the parent doesn't matter for layout — keep it at the root level rather than inside a routed view so the panel survives navigation.\n\nAdd fields as you need them. A fully populated call looks like this:\n\n\\`\\`\\`ts\nimport { NgModule } from '@angular/core';\nimport { environment } from '../environments/environment';\nimport { BqLensModule } from '@ditpsoftware/bq-lens';\nimport { MyThemeSectionComponent } from './app/my-theme-section.component';\n\n@NgModule({\n  imports: [\n    // …\n    BqLensModule.forRoot({\n      // production and blueriqBaseUrl auto-detect; uncomment only if you need to override:\n      // production:     environment.production,\n      // blueriqBaseUrl: environment.blueriqBaseUrl,\n      title:          'My BqLens',\n      tabLabel:       'LENS',\n      primaryColor:   '#01689b',\n      secondaryColor: '#cce0f1',\n      flatCorners:    false,\n      extraSections: [\n        { label: 'Theme', icon: 'palette', component: MyThemeSectionComponent, initiallyOpen: false },\n      ],\n    }),\n  ],\n})\nexport class AppModule {}\n\\`\\`\\`\n\n\\`BqLensConfig\\` accepts the following fields:\n\n| Field | Type | Purpose |\n|---|---|---|\n| \\`production\\` | \\`boolean?\\` | When true, the panel is gated behind a session-storage flag and a five-\\`d\\` keystroke escape hatch. When false, always on. **Defaults to \\`!isDevMode()\\`** from \\`@angular/core\\`. |\n| \\`blueriqBaseUrl\\` | \\`string?\\` | Root URL the interceptor watches — captures only fire for requests under this prefix. **Defaults to** \\`Backend.toUrl('')\\` from \\`@blueriq/angular/backend/common\\`, with URL-pattern sniffing as a last resort. Override for multi-runtime hosts. |\n| \\`title\\` | \\`string?\\` | Header text. Defaults to \\`'BqLens'\\`. |\n| \\`tabLabel\\` | \\`string?\\` | Floating tab label, trimmed to 4 characters. Defaults to \\`'DEV'\\`. |\n| \\`primaryColor\\` | \\`string?\\` | Initial primary color (any CSS color). Mutable at runtime via \\`DevColorsService\\`. |\n| \\`secondaryColor\\` | \\`string?\\` | Initial secondary color (any CSS color). Mutable at runtime via \\`DevColorsService\\`. |\n| \\`flatCorners\\` | \\`boolean?\\` | When true, every element inside the panel renders with \\`border-radius: 0\\`. Useful for hosts whose design language is square/flat. Defaults to false. |\n| \\`extraSections\\` | \\`BqLensSectionConfig[]?\\` | Host-defined collapsible sections rendered above the main tab switcher. See below. |\n\n### Extension slots\n\n\\`extraSections\\` lets a host app inject arbitrary collapsible sections into the panel — theme switchers, feature-flag toggles, environment selectors, mock-data switchers, anything app-specific. Each entry is \\`{ label, icon?, component, initiallyOpen? }\\`; BqLens owns the section frame (header, chevron, open/close state) and renders the host's component inside via \\`*ngComponentOutlet\\`. The component is fully Angular and can inject any service from the host's DI tree — BqLens itself stays domain-agnostic.\n\n### Colors\n\nBqLens exposes exactly two color knobs: **primary** and **secondary**. Everything else — hover tints, focus rings, scrollbars, chip surfaces, the pulse animation on the picker — is derived from these two via CSS \\`color-mix()\\` so a single setter recolors the whole panel coherently. Default fallbacks match the inspect theme: primary \\`#01689b\\`, secondary \\`#cce0f1\\`.\n\n#### Plumbing\n\n| Layer | Name | Purpose |\n|---|---|---|\n| CSS custom property | \\`--bq-lens-primary\\` | Runtime primary color. Written to \\`:root\\`. |\n| CSS custom property | \\`--bq-lens-secondary\\` | Runtime secondary color. Written to \\`:root\\`. |\n| SCSS alias | \\`v.\\$primary\\` | \\`var(--bq-lens-primary, <fallback>)\\` — use this in component SCSS. |\n| SCSS alias | \\`v.\\$secondary\\` | \\`var(--bq-lens-secondary, <fallback>)\\`. |\n| SCSS derived | \\`v.\\$primary-light\\` | \\`color-mix(in srgb, \\$primary 12%, white)\\` — pale hover/highlight bg. |\n| SCSS derived | \\`v.\\$primary-tint-sm/md/lg\\` | \\`color-mix(... transparent)\\` at 15% / 35% / 60% — focus ring, scrollbar tints. |\n| SCSS derived | \\`v.\\$primary-dark\\` | \\`color-mix(... black 5%)\\` — chip border. |\n| SCSS derived | \\`v.\\$secondary-dark\\` | \\`color-mix(... black 10%)\\` — chip border. |\n\n#### Setting colors\n\n**At module setup** — pass them to \\`forRoot(...)\\`:\n\n\\`\\`\\`ts\nBqLensModule.forRoot({\n  ...environment,\n  primaryColor:   '#01689b',\n  secondaryColor: '#cce0f1',\n}),\n\\`\\`\\`\n\n\\`DevColorsService\\` reads the config at construction and writes both CSS custom properties to \\`document.documentElement\\` immediately.\n\n**Per-environment** — declare the colors on each environment object and spread them in. Each build target ships pre-colored — no flash of inspect-blue at boot:\n\n\\`\\`\\`ts\n// src/environments/environment.ts\nexport const environment = {\n  // …\n  bqLensPrimary:   '#01689b',  // inspect blue\n  bqLensSecondary: '#cce0f1',\n};\n\n// src/environments/environment.bvm.ts\nexport const environment = {\n  // …\n  bqLensPrimary:   '#e17000',  // BVM orange\n  bqLensSecondary: '#f6d4b2',\n};\n\\`\\`\\`\n\n\\`\\`\\`ts\n// app.module.ts\nBqLensModule.forRoot({\n  ...environment,\n  primaryColor:   environment.bqLensPrimary,\n  secondaryColor: environment.bqLensSecondary,\n}),\n\\`\\`\\`\n\n**At runtime** — inject \\`DevColorsService\\` and call any setter:\n\n\\`\\`\\`ts\nconstructor(private colors: DevColorsService) {}\n\nthis.colors.setPrimary('#42145f');\nthis.colors.setSecondary('#c6b8cf');\nthis.colors.setColors('#42145f', '#c6b8cf');  // either arg is optional\n\\`\\`\\`\n\nEvery consumer of the CSS variables (and every \\`color-mix()\\` derived from them) repaints in the same frame.\n\n#### Limits\n\nThis is *not* a theming engine — no named themes, no presets, no palettes, just two colors. If the host has its own \\`ThemeService\\`, the host wires up its theme switches to call \\`DevColorsService.setColors(...)\\` itself. For one-off tinted variants, derive them via \\`color-mix()\\` in SCSS rather than expanding the API.\n\n\\`color-mix()\\` is Baseline 2023 (Chrome 111+, Firefox 113+, Safari 16.2+) — fine for a dev-only target.\n\n### Storage keys\n\nBqLens persists a small amount of UI state to \\`localStorage\\` / \\`sessionStorage\\` under the \\`bq-lens-*\\` namespace, plus the rolling capture log (and dismissed-error set) to an IndexedDB database named \\`bq-lens-storage\\`. To reset, clear these in DevTools → Application → Storage:\n\n| Key / DB | Storage | Purpose |\n|---|---|---|\n| \\`bq-lens-panel\\` | session | Whether the panel is enabled in this tab (production gate; set by the \\`ddddd\\` escape hatch). |\n| \\`bq-lens-panel-side\\` | local | Which edge (\\`left\\` / \\`right\\`) the floating tab docks on. |\n| \\`bq-lens-panel-tab-top\\` | local | Vertical position (px) of the floating tab. |\n| \\`bq-lens-sections\\` | session | Open/closed state of \\`extraSections\\` per tab. |\n| \\`bq-lens-tab-id\\` | session | Per-tab UUID used to scope the IDB capture log so sibling tabs stay isolated. |\n| \\`bq-lens-storage\\` | IndexedDB | Schema-versioned capture log (up to 50 per tab) and dismissed-error set. Replaces the prior \\`bq-lens-captures\\` sessionStorage entry. |\n| \\`bq-lens-story-providers\\` | local | Last-used providers import path for generated CSF stories. |\n\n## Why a single panel\n\nEach piece of the above could exist as a separate Chrome extension, or a separate dev tool, or a separate npm package. The reason they're one panel:\n\n- **The element cache is shared.** Capturing once feeds the inspector, the search, the structure tree, and the diff. Splitting it across tools would mean re-warming for every consumer.\n- **Navigation is shared.** Picker → child → breadcrumb → search result → cached element are all the same operation against the same state, with the same back/forward history.\n- **The panel is dev-only.** Tree-shaken out of production builds (gated by \\`environment.production\\` plus the session flag), so size is not a primary concern; coherence is.\n\nThe internal architecture mirrors that:\n\n- A \\`DevInspectorService\\` (component-scoped) owns inspector state — selected element, view mode, history, breadcrumbs, scroll-follow lifecycle.\n- A \\`DevElementCacheService\\` (root-scoped) owns the element cache and its enrichment.\n- A \\`DevPickerService\\` owns DOM ↔ Blueriq element resolution, the visual overlay, and ancestor walks.\n- A \\`DevCaptureService\\` owns the HTTP capture log and persistence.\n- A \\`DevFormatService\\` owns syntax highlighting and template formatting.\n- A \\`DevSearchService\\` owns weighted fuzzy search.\n- A \\`DevColorsService\\` owns the two runtime CSS custom properties (\\`--bq-lens-primary\\`, \\`--bq-lens-secondary\\`).\n\nThe component is the orchestrator; the services are independent enough to test alone but kept together because they share a single user-facing surface.\n\n## Contributing\n\nFor working on bq-lens itself — editing source, watching changes flow into a host app, and cutting a release. Consumers don't need any of this: see [Installation](#installation).\n\n### Local setup\n\n\\`\\`\\`bash\nnvm use 24                              # ng-packagr 20+ requires Node ^20.19 / ^22.12 / >=24\nnpm install                             # @blueriq/* peers come from the Artifactory; .npmrc needs @blueriq scope auth\n\\`\\`\\`\n\nThere is no \\`ng serve\\` for the library itself — it's not an app, it's a package. Iteration happens by building into \\`dist/\\` and consuming \\`dist/\\` from a host app that *does* run \\`ng serve\\`.\n\n### Live-development loop\n\nThe fastest inner loop: ng-packagr in watch mode + a host app pointed at \\`dist/\\` via a sibling-repo symlink. Edits in \\`src/lib/\\` rebuild in 1–2s and the host's dev server picks them up on the next change-detection tick.\n\nThis setup is **for development only** — never commit the symlinked dependency reference into the host's \\`package.json\\`. Distribution to consumers always goes through the npm-published package.\n\n**1. In \\`bq-lens/\\`** — start the watcher:\n\n\\`\\`\\`bash\nnpm run watch                            # rebuilds dist/ on every save\n\\`\\`\\`\n\n**2. In the host app** (sibling directory, e.g. \\`../my-app/\\`) — point \\`@ditpsoftware/bq-lens\\` at \\`dist/\\`:\n\n\\`\\`\\`bash\nnpm install file:../bq-lens/dist\n\\`\\`\\`\n\nThis rewrites the host's \\`package.json\\` to \\`\"@ditpsoftware/bq-lens\": \"file:../bq-lens/dist\"\\` and symlinks \\`node_modules/@ditpsoftware/bq-lens → ../bq-lens/dist\\`.\n\n**3. In the host's \\`angular.json\\`** — add \\`preserveSymlinks: true\\` to the build target's options. Webpack would otherwise resolve bq-lens's peer deps from \\`bq-lens/node_modules/\\`; with this flag, it resolves them from the host's own \\`node_modules\\` like any normal package. The flag is a no-op for non-symlinked installs, so it's safe to leave on permanently:\n\n\\`\\`\\`json\n{\n  \"projects\": {\n    \"<your-app>\": {\n      \"architect\": {\n        \"build\": {\n          \"options\": {\n            \"preserveSymlinks\": true\n          }\n        }\n      }\n    }\n  }\n}\n\\`\\`\\`\n\n**4. Run the host's dev server.** Saves in \\`bq-lens/src/lib/\\` rebuild \\`dist/\\`; the host's HMR picks them up.\n\n**To return to the published package:**\n\n\\`\\`\\`bash\nnpm install @ditpsoftware/bq-lens\n\\`\\`\\`\n\n> **Tip:** wrap step 2 and the return-to-published command in two npm scripts on the host side (e.g. \\`bqlens:link\\` / \\`bqlens:unlink\\`) so switching is one command.\n\n### Cutting a release\n\n\\`\\`\\`bash\n# bq-lens/\n# 1. Bump version in package.json\n#    (semver — public-api.ts breakage = major; new exports = minor; fixes = patch)\nnpm run release                          # build → pack into releases/ditpsoftware-bq-lens-<version>.tgz\n\n# 2. Publish to npm\ncd dist\nnpm publish --access public\n\\`\\`\\`\n\nCommit the source changes, the version bump, and \\`releases/ditpsoftware-bq-lens-<version>.tgz\\`. Tag the commit \\`v<version>\\` and push — the Bitbucket pipeline verifies the package version matches the tag and rebuilds from source.\n\nThe committed tarball under \\`releases/\\` is the offline-install fallback (see [Offline / vendored install](#offline--vendored-install)); npm is the default distribution channel.\n`;\n","import {\n    Asset,\n    Button,\n    Container,\n    ContentItem,\n    ContentParameter,\n    DynamicNode,\n    Element,\n    ElementWithChildren,\n    FailedElement,\n    Field,\n    Image,\n    Link,\n    Page,\n    StaticNode,\n    StyleNode,\n    TextItem,\n    TextItemNode,\n} from '@blueriq/core'\nimport {\n    AssetTemplate,\n    ButtonTemplate,\n    ContainerTemplate,\n    ContentItemTemplate,\n    DynamicNodeTemplate,\n    ElementTemplate,\n    FailedElementTemplate,\n    FieldParameterTemplate,\n    FieldTemplate,\n    ImageTemplate,\n    LinkTemplate,\n    PageTemplate,\n    StaticNodeTemplate,\n    StyleNodeTemplate,\n    TextItemTemplate,\n} from '@blueriq/core/testing'\n\nconst addCommonProps = (\n    template: ElementTemplate,\n    element: Element,\n    copyNames = false,\n    ignoreProperties: string\n): ElementTemplate => {\n    if (copyNames && element.name) {\n        template.name(element.name)\n    }\n    return addProperties(\n        template.styles(...(element.styles ? element.styles.all() : [])),\n        element,\n        ignoreProperties\n    )\n}\n\nconst addCommonElementWithChildrenProps = (\n    template: ContainerTemplate | PageTemplate | ContentItemTemplate,\n    element: ElementWithChildren,\n    copyNames = false,\n    copyNodes = true,\n    copyValidations = false,\n    ignoreProperties: string,\n    showKeys = false,\n    inTable = false\n) => {\n    if (element.contentStyle) {\n        template.contentStyle(element.contentStyle)\n    }\n\n    if (element.children.length > 0) {\n        template.children(\n            ...(\n                element.children\n                    .filter(child =>\n                        [\n                            'asset',\n                            'button',\n                            'container',\n                            'contentitem',\n                            'failedelement',\n                            'field',\n                            'image',\n                            'link',\n                            'textitem',\n                        ].includes(child.type)\n                    )\n                    .map((child: Element) => {\n                        if (child.type === 'asset') {\n                            return toAssetTemplate(\n                                child as Asset,\n                                copyNames,\n                                ignoreProperties,\n                                showKeys\n                            )\n                        }\n                        if (child.type === 'button') {\n                            return toButtonTemplate(\n                                child as Button,\n                                copyNames,\n                                ignoreProperties,\n                                showKeys,\n                                inTable\n                            )\n                        }\n                        if (child.type === 'container') {\n                            return toContainerTemplate(\n                                child as Container,\n                                copyNames,\n                                copyNodes,\n                                copyValidations,\n                                ignoreProperties,\n                                showKeys,\n                                inTable\n                            )\n                        }\n                        if (child.type === 'contentitem') {\n                            return toContentItemTemplate(\n                                child as ContentItem,\n                                copyNames,\n                                copyNodes,\n                                copyValidations,\n                                ignoreProperties,\n                                showKeys,\n                                inTable\n                            )\n                        }\n                        if (child.type === 'failedelement') {\n                            return toFailedElementTemplate(\n                                child as FailedElement,\n                                copyNames,\n                                ignoreProperties,\n                                showKeys,\n                                inTable\n                            )\n                        }\n                        if (child.type === 'field') {\n                            return toFieldTemplate(\n                                child as Field,\n                                copyNames,\n                                copyNodes,\n                                copyValidations,\n                                ignoreProperties,\n                                showKeys,\n                                inTable\n                            )\n                        }\n                        if (child.type === 'link') {\n                            return toLinkTemplate(\n                                child as Link,\n                                copyNames,\n                                copyNodes,\n                                ignoreProperties,\n                                showKeys,\n                                inTable\n                            )\n                        }\n                        if (child.type === 'image') {\n                            return toImageTemplate(child as Image, copyNames, ignoreProperties)\n                        }\n                        if (child.type === 'textitem') {\n                            return toTextItemTemplate(\n                                child as TextItem,\n                                copyNames,\n                                copyNodes,\n                                ignoreProperties,\n                                showKeys,\n                                inTable\n                            )\n                        }\n                        return undefined\n                    }) as ElementTemplate[]\n            ).filter(template => !!template)\n        )\n    }\n\n    return addCommonProps(template, element, copyNames, ignoreProperties)\n}\n\nconst createNodeList = (\n    rootNode: TextItemNode,\n    textItem: TextItem,\n    showKeys = false,\n    keyAdded = { value: false }\n    // Type is literally any from rootNode.visit\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): any => {\n    const toText = (node: StaticNode | DynamicNode): string => {\n        if (!showKeys || keyAdded.value) {\n            return node.toPlainText()\n        } else {\n            keyAdded.value = true\n            return `${textItem.key} ${node.toPlainText()}`\n        }\n    }\n    return rootNode.visit(\n        {\n            // Add a static node\n            acceptStatic: (staticNode: StaticNode, context) => {\n                return StaticNodeTemplate.create(toText(staticNode))\n            },\n            // Add a dynamic node\n            acceptDynamic: (dynamicNode: DynamicNode, context) => {\n                // Typescript is kinda showing a strange message, as this is a developer tool only dont care too much..\n                // eslint-disable-next-line @typescript-eslint/no-explicit-any\n                return DynamicNodeTemplate.create(toText(dynamicNode)) as any\n            },\n            // Add a style node\n            acceptStyled: (styledNode: StyleNode) => {\n                if (styledNode.children.length === 0 && styledNode.styles.count === 0) {\n                    return StyleNodeTemplate.create('')\n                }\n                const styles = styledNode.styles.all().map(s => `'${s}'`)\n\n                const nodes = styledNode.children.map((node: TextItemNode) => {\n                    return createNodeList(node, textItem, showKeys, keyAdded)\n                })\n\n                const styleNode = StyleNodeTemplate.create(\n                    styles.length > 0 ? styles.toString() : \"''\"\n                )\n                if (nodes) {\n                    styleNode.nodes(...nodes)\n                }\n                return styleNode\n            },\n        },\n\n        undefined\n    )\n}\n\nconst addMessages = (\n    template: PageTemplate | FieldTemplate,\n    element: Page | Field\n): PageTemplate | FieldTemplate => {\n    element.messages?.errors.forEach(error => template.error(error.text))\n    element.messages?.warnings.forEach(warning => template.warning(warning.text))\n    return template\n}\n\nconst addProperties = (\n    template: ElementTemplate,\n    element: Element,\n    ignoreProperties: string\n): ElementTemplate => {\n    if (element.properties && Object.keys(element.properties).length) {\n        const properties = { ...element.properties }\n\n        if (ignoreProperties) {\n            ignoreProperties.split(',').map(p => p.trim()).forEach((property: string) =>\n                // eslint-disable-next-line no-prototype-builtins\n                properties.hasOwnProperty(property) ? delete properties[property] : ''\n            )\n        }\n\n        if (Object.keys(properties).length) {\n            return template.properties(properties)\n        }\n    }\n    return template\n}\n\nconst toPageTemplate = (\n    page: Page,\n    copyNames = false,\n    copyNodes = true,\n    copyValidations = false,\n    ignoreProperties: string,\n    showKeys = false\n) => {\n    return addCommonElementWithChildrenProps(\n        addMessages(\n            PageTemplate.create().displayName(\n                showKeys && page.key\n                    ? `${page.key} ${page.displayName && page.displayName}`\n                    : page.displayName\n            ),\n            page\n        ) as PageTemplate,\n        page,\n        copyNames,\n        copyNodes,\n        copyValidations,\n        ignoreProperties,\n        showKeys\n    )\n}\n\nconst toAssetTemplate = (\n    asset: Asset,\n    copyNames = false,\n    ignoreProperties: string,\n    showKeys = false,\n    // So far we don't have specific behaviour for assets in table.\n    inTable = false\n): AssetTemplate => {\n    return addCommonProps(\n        AssetTemplate.create()\n            .text(showKeys ? `${asset.key} ${asset.text}` : asset.text)\n            .format(asset.format),\n        asset,\n        copyNames,\n        ignoreProperties\n    ) as AssetTemplate\n}\n\nconst toButtonTemplate = (\n    button: Button,\n    copyNames = false,\n    ignoreProperties: string,\n    showKeys = false,\n    // So far we don't have specific behaviour for buttons in table.\n    inTable = false\n): ButtonTemplate => {\n    return addCommonProps(\n        ButtonTemplate.create()\n            .caption(showKeys ? `${button.key} ${button.caption}` : button.caption)\n            .disabled(button.disabled),\n        button,\n        copyNames,\n        ignoreProperties\n    ) as ButtonTemplate\n}\n\nconst toLinkTemplate = (\n    link: Link,\n    copyNames = false,\n    copyNodes = true,\n    ignoreProperties: string,\n    showKeys = false,\n    // So far we don't have specific behaviour for links in table.\n    inTable = false\n): LinkTemplate => {\n    const template = addCommonProps(\n        LinkTemplate.create(),\n        link,\n        copyNames,\n        ignoreProperties\n    ) as LinkTemplate\n    template.text(showKeys ? `${link.key} ${link.text}` : link.text)\n    if (link.textItem) {\n        template.textItem(\n            toTextItemTemplate(\n                link.textItem,\n                copyNames,\n                copyNodes,\n                ignoreProperties,\n                false,\n                inTable\n            )\n        )\n    }\n    if (link.documentName) {\n        template.document(link.documentName, link.documentType)\n    }\n    if (link.pageName) {\n        template.page(link.pageName, link.documentType)\n    }\n    if (link.downloadId) {\n        template.parameter('downloadid', link.downloadId)\n    }\n    if (link.configurationId) {\n        template.parameter('configuration-id', link.configurationId)\n    }\n    if (link.optionalParameters) {\n        template.parameter('optional-parameters', link.optionalParameters)\n    }\n    return template\n}\n\nconst toImageTemplate = (\n    image: Image,\n    copyNames = false,\n    ignoreProperties: string\n): ImageTemplate => {\n    const template = addCommonProps(\n        ImageTemplate.create(),\n        image,\n        copyNames,\n        ignoreProperties\n    ) as ImageTemplate\n    if (image.width) {\n        template.width(image.width)\n    }\n    if (image.height) {\n        template.height(image.height)\n    }\n    return template\n}\n\nconst toContainerTemplate = (\n    container: Container,\n    copyNames = false,\n    copyNodes = true,\n    copyValidations = false,\n    ignoreProperties: string,\n    showKeys = false,\n    inTable = false\n): ContainerTemplate => {\n    const result = addCommonElementWithChildrenProps(\n        ContainerTemplate.create().displayName(\n            showKeys\n                ? `${container.key} ${container.displayName ?? ''}`\n                : container.displayName ?? ''\n        ),\n        container,\n        copyNames,\n        copyNodes,\n        copyValidations,\n        ignoreProperties,\n        showKeys,\n        inTable || container.contentStyle === 'table'\n    ) as ContainerTemplate\n    return result\n}\n\nconst toContentItemTemplate = (\n    contentItem: ContentItem,\n    copyNames = false,\n    copyNodes = true,\n    copyValidations = false,\n    ignoreProperties: string,\n    showKeys = false,\n    inTable = false\n): ContentItemTemplate => {\n    return addCommonElementWithChildrenProps(\n        ContentItemTemplate.create(),\n        contentItem,\n        copyNames,\n        copyNodes,\n        copyValidations,\n        ignoreProperties,\n        showKeys,\n        inTable\n    ) as ContentItemTemplate\n}\n\nconst toFailedElementTemplate = (\n    failedElement: FailedElement,\n    copyNames = false,\n    ignoreProperties: string,\n    showKeys = false,\n    // So far we don't have specific behaviour for failedElement in table.\n    inTable = false\n): FailedElementTemplate => {\n    return addCommonProps(\n        FailedElementTemplate.create()\n            .message(\n                showKeys ? `${failedElement.key} ${failedElement.message}` : failedElement.message\n            )\n            .stacktrace(failedElement.stacktrace),\n        failedElement,\n        copyNames,\n        ignoreProperties\n    ) as FailedElementTemplate\n}\n\nconst toFieldTemplate = (\n    field: Field,\n    copyNames = false,\n    copyNodes = true,\n    copyValidations = false,\n    ignoreProperties: string,\n    showKeys = false,\n    inTable = false\n): FieldTemplate => {\n    const dataTypeFactories: Record<string, () => FieldTemplate> = {\n        currency: FieldTemplate.currency,\n        percentage: FieldTemplate.percentage,\n        date: FieldTemplate.date,\n        datetime: FieldTemplate.datetime,\n        boolean: FieldTemplate.boolean,\n        integer: FieldTemplate.integer,\n        number: FieldTemplate.number,\n    }\n    const template: FieldTemplate = (dataTypeFactories[field.dataType] ?? FieldTemplate.text)()\n\n    if (copyValidations && field.validations.length) {\n        field.validations.forEach(validation =>\n            template.validation(\n                // eslint-disable-next-line @typescript-eslint/no-explicit-any\n                (validation as unknown as { validation: any }).validation\n            )\n        )\n    }\n\n    if (field.displayLength && field.explainText !== null) {\n        template.displayLength(field.displayLength)\n    }\n\n    if (field.parameters) {\n        // Currently only ever seen contentparameters on field.\n        const parameters: Map<string, ContentParameter> = (\n            field.parameters as unknown as {\n                _parameters: Map<string, ContentParameter>\n            }\n        )._parameters\n\n        parameters.forEach(parameter => {\n            template.parameter(\n                FieldParameterTemplate.content(parameter.name).contentItem(\n                    toContentItemTemplate(\n                        parameter.contentItem,\n                        copyNames,\n                        copyNodes,\n                        copyValidations,\n                        ignoreProperties,\n                        showKeys,\n                        inTable\n                    )\n                )\n            )\n        })\n    }\n\n    if (field.explainText) {\n        template.explainText(field.explainText)\n    }\n    if (field.questionText) {\n        template.questionText(\n            showKeys && !inTable ? `${field.key} ${field.questionText}` : field.questionText\n        )\n    }\n    if (field.placeholder) {\n        template.placeholder(field.placeholder)\n    }\n\n    if (field.hasDomain) {\n        template.domain(\n            field.domain.options\n                .map(option => {\n                    return { [option.value as string]: option.displayValue }\n                })\n                .reduce((previous, current) => {\n                    return { ...previous, ...current }\n                })\n        )\n    }\n\n    if (field.required) template.required(true)\n    if (field.readonly) template.readonly(true)\n\n    let value: unknown = field.value.get()\n\n    if (field.dataType === 'date' || field.dataType === 'datetime') {\n        // Use stringify() so date/datetime values are formatted back to their original pattern\n        // (e.g. \"20-04-2026 09:26:28\") instead of JavaScript's Date.toString() which produces an\n        // unparseable string like \"Mon Apr 20 2026 09:26:28 GMT+0200...\".\n        value = field.value.stringify()\n    }\n    if (inTable && showKeys && field.dataType === 'text') {\n        value = `${field.key} ${field.value.get()}`\n    }\n\n    template.value(`${value}`)\n\n    return addCommonProps(\n        addMessages(template, field),\n        field,\n        copyNames,\n        ignoreProperties\n    ) as FieldTemplate\n}\n\nconst toTextItemTemplate = (\n    textItem: TextItem,\n    copyNames = false,\n    copyNodes = true,\n    ignoreProperties: string,\n    showKeys = false,\n    // Currently textitems don't have different implementation in table\n    inTable = false\n): TextItemTemplate => {\n    const template = TextItemTemplate.create().plainText(\n        showKeys && textItem.plainText !== null\n            ? `${textItem.key} ${textItem.plainText}`\n            : textItem.plainText\n    )\n\n    if (copyNodes) {\n        template.nodes(createNodeList(textItem.rootNode, textItem, showKeys))\n    }\n\n    return addCommonProps(template, textItem, copyNames, ignoreProperties) as TextItemTemplate\n}\n\nexport const pageToElementTemplate = (\n    page: Page,\n    ignoreProperties: string,\n    copyElementNames = false,\n    copyNodes = true,\n    copyValidations = false,\n    showKeys = false\n): ElementTemplate => {\n    return toPageTemplate(\n        page,\n        copyElementNames,\n        copyNodes,\n        copyValidations,\n        ignoreProperties,\n        showKeys\n    )\n}\n","import { Component, Input, OnChanges } from '@angular/core'\nimport {\n    Asset,\n    Button as BlueriqButton,\n    Page as BlueriqPage,\n    CompositeElementResolver,\n    Container,\n    ContentParameter,\n    DateFormats,\n    DateFormattingLibrary,\n    DefaultResolver,\n    DynamicNode,\n    Element,\n    ElementWithChildren,\n    FactoryValidationRuleResolver,\n    Field,\n    FieldResolver,\n    Link,\n    LoadSessionResponse,\n    PageModel,\n    PageModelService,\n    SessionContext,\n    StaticNode,\n    StyleNode,\n    TextItem,\n    TextItemNode,\n} from '@blueriq/core'\n\nconst DEFAULT_LANGUAGE_CODE = 'nl-NL'\n\nconst noopDateFormats = (): DateFormats =>\n    new DateFormats(\n        { format: () => '', parse: () => null } as DateFormattingLibrary,\n        { date: 'DD-MM-YYYY', time: 'HH:mm:ss', dateTime: 'DD-MM-YYYY HH:mm:ss' },\n        DEFAULT_LANGUAGE_CODE,\n    )\nimport { ElementTemplate } from '@blueriq/core/testing'\nimport { pageToElementTemplate } from './PageModelToElementTemplate'\n\ninterface Validation {\n    message: string\n    type: string\n    blocking?: boolean\n    parameters?: Record<string, any>\n}\n\nexport interface TemplateCancelToken {\n    cancelled: boolean;\n}\n\n/**\n * Recursion ceiling for template generation. Mirrors the cache's\n * MAX_TREE_DEPTH (30) so the inspector tree and template export\n * truncate at the same point — no more inspector-shows-more-than-\n * template inconsistency. The template reads from the already-\n * cycle-broken cache, so this ceiling is purely a stack-overflow\n * safety net; even the deepest observed real Blueriq page (~9\n * levels) leaves substantial headroom.\n */\nconst MAX_TEMPLATE_DEPTH = 30;\n\nconst TEMPLATE_DEPTH_MARKER = '/* depth limit reached */';\nconst TEMPLATE_CANCEL_MARKER = '/* cancelled */';\n\n@Component({\n    selector: 'blueriq-json-to-templates',\n    templateUrl: './json-to-templates.component.html',\n    styleUrls: ['./json-to-templates.component.scss'],\n    standalone: false\n})\nexport class JsonToTemplatesComponent implements OnChanges {\n    // Output\n    public template: string | undefined\n\n    /**\n     * Active cancel token for the current `generateTemplateFor` call,\n     * checked at every recursion boundary. Cleared when the call returns.\n     * The inspector replaces a pending generation by flipping\n     * `cancelled = true` on the prior token before launching a new one.\n     */\n    private currentCancelToken: TemplateCancelToken | null = null\n\n    // Renderable version should be comparable to output template\n    public renderTemplate: ElementTemplate | undefined\n\n    // View rendered template if true and view code if false\n    @Input()\n    public renderExampleOfTemplate: unknown\n\n    // Fake Controls\n    public loadSessionResponse: string | undefined\n    // Controls\n    @Input()\n    public keyToTemplate: string | undefined\n    // showKeys is only used in rendered result and has no impact on template string\n    @Input()\n    public showKeys: boolean | undefined\n    @Input()\n    public copyElementNames: boolean | undefined\n    @Input()\n    public copyValidationRules: boolean | undefined\n    @Input()\n    public copyTextItemNodes: boolean | undefined\n\n    @Input()\n    public ignoreProperties: string | undefined\n\n    // Validation messages\n    public copyError: string | undefined\n    public copySuccess: string | undefined\n    public parseJsonError: string | undefined\n\n    public composeElementTemplate(): void {\n        try {\n            this.copySuccess = undefined\n            this.copyError = undefined\n            if (this.loadSessionResponse && this.loadSessionResponse !== '') {\n                const json = JSON.parse(this.loadSessionResponse)\n                // eslint-disable-next-line no-prototype-builtins\n                if (!json.hasOwnProperty('elements')) {\n                    throw new Error()\n                }\n                const context = this.sessionContext(json)\n                let pageModel = this.defaultPageModelService().create(json.elements, context)\n                let page: BlueriqPage\n                if (\n                    this.keyToTemplate &&\n                    this.keyToTemplate !== '' &&\n                    this.keyToTemplate.includes('-') &&\n                    pageModel.getElementOptionally(this.keyToTemplate.toUpperCase())\n                ) {\n                    pageModel = this.defaultPageModelService().create(\n                        json.elements.filter((el: { key: string }) =>\n                            // @ts-ignore\n                            el.key.startsWith(this.keyToTemplate.toUpperCase())\n                        ),\n                        context\n                    )\n                    page = {\n                        type: 'page',\n                        children: [pageModel.getElement(this.keyToTemplate.toUpperCase())],\n                    } as unknown as BlueriqPage\n                    this.template = this.childAsTemplateString(\n                        pageModel.getElement(this.keyToTemplate.toUpperCase()),\n                        Boolean(this.copyElementNames),\n                        Boolean(this.copyValidationRules),\n                        Boolean(this.copyTextItemNodes),\n                        this.ignoreProperties\n                    )\n                } else {\n                    page = pageModel.page\n                    this.template = this.createTemplateStringFrom(\n                        pageModel,\n                        Boolean(this.copyElementNames),\n                        Boolean(this.copyValidationRules),\n                        Boolean(this.copyTextItemNodes),\n                        this.ignoreProperties\n                    )\n                }\n\n                this.renderTemplate = pageToElementTemplate(\n                    page,\n                    <string>this.ignoreProperties,\n                    Boolean(this.copyElementNames),\n                    Boolean(this.copyValidationRules),\n                    Boolean(this.copyTextItemNodes),\n                    this.showKeys\n                )\n            }\n        } catch (e) {\n            console.error(e)\n            this.parseJsonError =\n                'Failed to parse the input load response. Did you copy all the data? The data has to be a load session response.'\n        }\n    }\n\n    ngOnChanges(): void {\n        this.composeElementTemplate()\n    }\n\n    public generateTemplateFor(\n        element: Element,\n        renderNames = true,\n        copyValidationRules = false,\n        copyTextItemNodes = true,\n        ignoreProperties?: string,\n        cancelToken?: TemplateCancelToken\n    ): string {\n        const prior = this.currentCancelToken\n        this.currentCancelToken = cancelToken ?? null\n        try {\n            return this.childAsTemplateString(element, renderNames, copyValidationRules, copyTextItemNodes, ignoreProperties, 0)\n        } finally {\n            this.currentCancelToken = prior\n        }\n    }\n\n    public copyToClipBoard(): void {\n        if (this.template) {\n            navigator.clipboard.writeText(this.template).then(\n                () => {\n                    this.copySuccess = 'Copying to clipboard was successful!'\n                },\n                err => {\n                    this.copyError = err\n                }\n            )\n        }\n    }\n\n    private sessionContext(session: LoadSessionResponse): SessionContext {\n        return {\n            localization: {\n                ...session.language,\n                messages: {},\n                dateFormats: noopDateFormats(),\n                languageCode: DEFAULT_LANGUAGE_CODE,\n            },\n        }\n    }\n\n    private defaultPageModelService(): PageModelService {\n        return new PageModelService(\n            new CompositeElementResolver([\n                new DefaultResolver(),\n                new FieldResolver(new FactoryValidationRuleResolver([])),\n            ])\n        )\n    }\n\n    private escapeQuotes(text: string): string {\n        // The last 2 replaces are to prevent double escaping already escaped quotes from bq.\n        return text\n            .replaceAll(\"'\", \"\\\\'\")\n            .replaceAll('\"', '\\\\\"')\n            .replaceAll(\"\\\\\\\\'\", \"\\\\'\")\n            .replaceAll('\\\\\\\\\"', '\\\\\"')\n    }\n\n    private escapeBackticks(text: string): string {\n        return (text ?? '').replaceAll('`', '\\\\`')\n    }\n\n    private presentationStyleString(element: Element): string {\n        return element.styles?.count > 0\n            ? `.styles(${element.styles.all().map(style => `'${style}'`)})`\n            : ''\n    }\n\n    private contentStyleString(element: Element): string {\n        return element.contentStyle ? `.contentStyle('${element.contentStyle}')` : ''\n    }\n\n    private displayNameString(element: Element): string {\n        return (element as Container | BlueriqPage).displayName &&\n            (element as Container | BlueriqPage).displayName !== null\n            ? `.displayName(\\`${this.escapeBackticks(\n                  (element as Container | BlueriqPage).displayName\n              )}\\`)`\n            : ['container', 'page'].includes(element.type)\n              ? `.displayName('')`\n              : ''\n    }\n\n    private nameString(element: ElementWithChildren, renderNames: boolean): string {\n        return renderNames && element.name ? `'${element.name}'` : ''\n    }\n\n    private valueString(element: Element): string {\n        if (element.type !== 'field') {\n            return ''\n        }\n\n        const field = element as Field\n        if (field.value.get() !== null) {\n            let value: unknown\n\n            if (field.dataType === 'date' || field.dataType === 'datetime') {\n                // Use stringify() so date/datetime values are formatted back to their original\n                // pattern (e.g. \"20-04-2026 09:26:28\") instead of JavaScript's Date.toString()\n                // which produces an unparseable string like \"Mon Apr 20 2026 09:26:28 GMT+0200...\".\n                value = field.value.stringify()\n            } else {\n                value = field.value.get()\n            }\n            return `.value('${value}')`\n        }\n\n        return ''\n    }\n\n    private errorString(element: BlueriqPage | Field): string {\n        return element.messages?.hasErrors\n            ? (element.messages.errors as { text: string }[])\n                  .map(error => `.error(\\`${this.escapeBackticks(error.text)}\\`)`)\n                  .join('')\n            : ''\n    }\n\n    private warningString(element: BlueriqPage | Field): string {\n        return element.messages?.hasWarnings\n            ? (element.messages.warnings as { text: string }[])\n                  .map(warning => `.warning(\\`${this.escapeBackticks(warning.text)}\\`)`)\n                  .join('')\n            : ''\n    }\n\n    private readonlyString(field: Field): string {\n        return field.readonly ? `.readonly(true)` : ''\n    }\n\n    private domainString(field: Field): string {\n        if (!field.hasDomain || field.domain.options.length === 0) return ''\n        return `.domain(${JSON.stringify(\n            field.domain.options\n                .map(option => ({ [option.value as string]: option.displayValue }))\n                .reduce((previous, current) => ({ ...previous, ...current }), {})\n        )})`\n    }\n\n    private validationString(field: Field, copyValidationRules: boolean): string {\n        return !copyValidationRules\n            ? ''\n            : field.validations.length > 0\n              ? field.validations\n                    .map(\n                        validation =>\n                            `.validation(${JSON.stringify(\n                                (validation as unknown as { validation: Validation }).validation\n                            )})`\n                    )\n                    .join('')\n              : ''\n    }\n\n    private linkParameterString(element: Element): string {\n        if (element.type !== 'link') {\n            return ''\n        }\n        const link = element as Link\n\n        // textString function handles .text()\n        let result = link.documentName\n            ? `.document(\\`${this.escapeBackticks(link.documentName)}\\`, \\`${this.escapeBackticks(link.documentType)}\\`)`\n            : ''\n        result += link.pageName\n            ? `.page(\\`${this.escapeBackticks(link.pageName)}\\`, \\`${this.escapeBackticks(link.documentType)}\\`)`\n            : ''\n        result += link.downloadId\n            ? `.parameter('downloadid',\\`${this.escapeBackticks(link.downloadId)}\\`)`\n            : ``\n        result += link.configurationId\n            ? `.parameter('configuration-id',\\`${this.escapeBackticks(link.configurationId)}\\`)`\n            : ``\n        result += link.optionalParameters\n            ? `.parameter('optional-parameters',\\`${this.escapeBackticks(link.optionalParameters)}\\`)`\n            : ``\n        return result\n    }\n\n    /* Also handles field-specific things. */\n    private createString(\n        element: Element,\n        renderNames: boolean,\n        copyValidationRules: boolean,\n        copyTextItemNodes: boolean,\n        ignoreProperties?: string,\n        depth = 0\n    ): string {\n        const name =\n            renderNames && element.name !== null\n                ? `'${this.escapeQuotes(element.name as string)}'`\n                : ''\n        const toPascalCase = (value: string) => value.charAt(0).toUpperCase() + value.slice(1)\n        let result = toPascalCase(element.type)\n        result = result.replace(\n            /(.*)(item|element)/,\n            (_, group1, group2) => `${group1}${toPascalCase(group2)}`\n        )\n        result += 'Template'\n        result +=\n            element.type === 'field'\n                ? `.${(element as Field).dataType}(${name})${this.questionTextString(\n                      element as Field\n                  )}${this.readonlyString(element as Field)}${this.explainTextString(\n                      element as Field\n                  )}${this.valueString(element)}${this.fieldParameterString(\n                      element as Field,\n                      renderNames,\n                      copyValidationRules,\n                      copyTextItemNodes,\n                      ignoreProperties,\n                      depth\n                  )}${this.warningString(element as Field)}${this.errorString(\n                      element as Field\n                  )}${this.domainString(element as Field)}${this.validationString(\n                      element as Field,\n                      copyValidationRules\n                  )}`\n                : `.create(${name})`\n        return result\n    }\n\n    private fieldParameterString(\n        field: Field,\n        renderNames: boolean,\n        copyValidationRules: boolean,\n        copyTextItemNodes: boolean,\n        ignoreProperties?: string,\n        depth = 0\n    ): string {\n        if (field.parameters) {\n            const parameters: Map<string, ContentParameter> = (\n                field.parameters as unknown as {\n                    _parameters: Map<string, ContentParameter>\n                }\n            )._parameters\n\n            let parameterString = ''\n            parameters.forEach(parameter => {\n                parameterString += `.parameter(FieldParameterTemplate.content(\\`${this.escapeBackticks(\n                    parameter.name\n                )}\\`)`\n                if (parameter.plainText) {\n                    parameterString += `.plainText(\\`${this.escapeBackticks(\n                        parameter.plainText\n                    )}\\`)`\n                }\n                parameterString += `.contentItem(${this.childAsTemplateString(\n                    parameter.contentItem,\n                    renderNames,\n                    copyValidationRules,\n                    copyTextItemNodes,\n                    ignoreProperties,\n                    depth + 1\n                )})`\n                parameterString += ')'\n            })\n\n            return parameterString\n        }\n        return ''\n    }\n\n    private questionTextString(field: Field): string {\n        return field.questionText\n            ? `.questionText(\\`${this.escapeBackticks(field.questionText)}\\`)`\n            : ''\n    }\n\n    private explainTextString(field: Field): string {\n        return field.explainText\n            ? `.explainText(\\`${this.escapeBackticks(field.explainText)}\\`)`\n            : ''\n    }\n\n    private captionString(element: Element): string {\n        return element.type === 'button'\n            ? `.caption(\\`${\n                  (element as BlueriqButton).caption === null\n                      ? ''\n                      : this.escapeBackticks((element as BlueriqButton).caption as string)\n              }\\`)`\n            : ''\n    }\n\n    private disabledString(element: Element): string {\n        return element.type === 'button' && (element as BlueriqButton).disabled\n            ? `.disabled(true)`\n            : ''\n    }\n\n    private textString(element: Element): string {\n        return element.type === 'asset' || element.type === 'link'\n            ? `.text(\\`${this.escapeBackticks((element as Asset).text)}\\`)`\n            : ''\n    }\n\n    private plainTextString(element: Element): string {\n        return element.type === 'textitem' && (element as TextItem).plainText !== null\n            ? `.plainText(\\`${this.escapeBackticks((element as TextItem).plainText)}\\`)`\n            : ''\n    }\n\n    private createNodeList(rootNode: TextItemNode): string {\n        return rootNode.visit(\n            {\n                // Add a static node\n                acceptStatic: (staticNode: StaticNode) => {\n                    return staticNode.toPlainText() !== ''\n                        ? `StaticNodeTemplate.create(\\`${this.escapeBackticks(\n                              staticNode.toPlainText()\n                          )}\\`)`\n                        : ''\n                },\n                // Add a dynamic node\n                acceptDynamic: (dynamicNode: DynamicNode) => {\n                    return dynamicNode.toPlainText() !== ''\n                        ? `DynamicNodeTemplate.create(\\`${this.escapeBackticks(\n                              dynamicNode.toPlainText()\n                          )}\\`)`\n                        : ''\n                },\n                // Add a style node\n                acceptStyled: (styledNode: StyleNode) => {\n                    if (styledNode.children.length === 0 && (styledNode.styles?.count ?? 0) === 0) {\n                        return ''\n                    }\n                    const styles = styledNode.styles.all().map(s => `'${s}'`)\n                    const nodes = styledNode.children.map((node: TextItemNode) => {\n                        return this.createNodeList(node)\n                    })\n\n                    return `StyleNodeTemplate.create(${styles.length > 0 ? styles : \"''\"})${\n                        nodes.length > 0 ? `.nodes(${nodes})` : ''\n                    }`\n                },\n            },\n            undefined\n        )\n    }\n\n    private nodesString(element: Element, copyTextItemNodes: boolean): string {\n        if (!copyTextItemNodes || element.type !== 'textitem') return ''\n        const rootNode = (element as TextItem).rootNode\n        if (!rootNode) return ''\n        const nodes = this.createNodeList(rootNode)\n        return nodes ? `.nodes(${nodes})` : ''\n    }\n\n    private propertiesString(element: Element, ignoreProperties?: string): string {\n        if (element.properties && Object.keys(element.properties).length) {\n            const properties = { ...element.properties }\n\n            if (ignoreProperties) {\n                ignoreProperties.split(',').map(p => p.trim()).forEach((property: string) =>\n                    // eslint-disable-next-line no-prototype-builtins\n                    properties.hasOwnProperty(property) ? delete properties[property] : ''\n                )\n            }\n\n            return Object.keys(properties).length\n                ? `.properties(${JSON.stringify(properties)})`\n                : ''\n        }\n\n        return ''\n    }\n\n    private childAsTemplateString(\n        element: Element,\n        renderNames: boolean,\n        copyValidationRules: boolean,\n        copyTextItemNodes: boolean,\n        ignoreProperties?: string,\n        depth = 0\n    ): string {\n        if (this.currentCancelToken?.cancelled) return TEMPLATE_CANCEL_MARKER\n        if (depth >= MAX_TEMPLATE_DEPTH) return TEMPLATE_DEPTH_MARKER\n        return [\n            this.createString(element, renderNames, copyValidationRules, copyTextItemNodes, ignoreProperties, depth),\n            this.displayNameString(element),\n            this.contentStyleString(element),\n            this.presentationStyleString(element),\n            this.nodesString(element, copyTextItemNodes),\n            this.captionString(element),\n            this.disabledString(element),\n            this.textString(element),\n            this.plainTextString(element),\n            this.propertiesString(element, ignoreProperties),\n            this.linkParameterString(element),\n            this.childrenAsTemplateString(element, renderNames, copyValidationRules, copyTextItemNodes, ignoreProperties, depth),\n        ].join('')\n    }\n\n    private childrenAsTemplateString(\n        element: Element,\n        renderNames: boolean,\n        copyValidationRules: boolean,\n        copyTextItemNodes: boolean,\n        ignoreProperties?: string,\n        depth = 0\n    ): string {\n        return (element as ElementWithChildren).children &&\n            (element as ElementWithChildren).children.length > 0\n            ? `.children(${(element as ElementWithChildren).children.map(\n                  (child: Element) =>\n                      `${this.childAsTemplateString(\n                          child,\n                          renderNames,\n                          copyValidationRules,\n                          copyTextItemNodes,\n                          ignoreProperties,\n                          depth + 1\n                      )}`\n              )})`\n            : ''\n    }\n\n    private createTemplateStringFrom(\n        pageModel: PageModel,\n        renderNames: boolean,\n        copyValidationRules: boolean,\n        copyTextItemNodes: boolean,\n        ignoreProperties?: string\n    ): string {\n        const page = pageModel.page\n        return `PageTemplate.create(${this.nameString(page, renderNames)})${this.displayNameString(\n            page\n        )}${this.presentationStyleString(page)}${this.contentStyleString(page)}${this.errorString(\n            page\n        )}${this.warningString(page)}${this.propertiesString(\n            page,\n            ignoreProperties\n        )}${this.childrenAsTemplateString(\n            page,\n            renderNames,\n            copyValidationRules,\n            copyTextItemNodes,\n            ignoreProperties\n        )}`\n    }\n}\n","@if (renderTemplate && renderExampleOfTemplate) {\n<div class=\"render-session\">\n  <!-- Love this selector! -->\n  <blueriq-hallo [rootElement]=\"renderTemplate\"></blueriq-hallo>\n</div>\n}\n\n@if (template) {\n<div class=\"load-response\">\n  @if (!renderExampleOfTemplate) {\n<div class=\"template-code\">{{template}}</div>\n}\n\n  @if (copyError) {\n<div class=\"error-message\">{{copyError}}</div>\n}\n  @if (copySuccess) {\n<div class=\"success-message\">{{copySuccess}}</div>\n}\n\n  <button class=\"copy-to-clipboard\" (click)=\"copyToClipBoard()\">\n    {{renderExampleOfTemplate ? 'Copy template code to clipboard' : 'Copy to clipboard'}}\n  </button>\n</div>\n}\n\n@if (parseJsonError) {\n<div class=\"warning-message\">{{parseJsonError}}</div>\n}\n\n@if (!template && !copyError) {\n<div class=\"no-load-response\">\n  <h1>Developer Playground</h1>\n  <h2>Translate load response to ElementTemplates</h2>\n  <div class=\"steps\"></div>\n  <h3>Controls</h3>\n  <p>\n    Use the controls to get the exact element template code you need. See the docs tabs for controls\n    documentation.\n  </p>\n  <h3>How to get the load response:</h3>\n  <p>\n    When starting a blueriq session, open your element inspector (rightclick -> inspect element, or\n    F12 on edge, or CTRL + SHIFT + C). In the inspector open the network tab. If load is not visible\n    in this tab, refresh the page. Else click load. Go to response. Click it with your cursor and do\n    CTRL + A and CTRL + C (copy all) and paste it below.\n  </p>\n  <h3>Element templates</h3>\n  <p>\n    Blueriq Element templates are usefull for developers only. The element templates are currently\n    used within storybook, each page has a 'blueriq model' which is built through element templates\n    and then displayable in storybook. The element templates are also used in the unit tests in the\n    same way.\n  </p>\n  <h3>Use cases</h3>\n  <p>\n    If you want to recreate a suitcase page and the blueriq model has already been created, simply\n    paste the load response here and look for the container key from which you want to copy to\n    storybook. Paste a container key in the controls (keyToTemplate) and look at the element\n    template being created from only that container. Copy that template to a new storybook page and\n    it should work after you add all the imports. It can be used in the same way for unit tests.\n  </p>\n  <ul>\n    <li>(quickly) Expanding Storybook documentation with an existing blueriq model</li>\n    <li>Create a unit test based on a bug which occured with a specific blueriq model</li>\n  </ul>\n</div>\n}\n\n<div class=\"fake-controls\">\n  <div class=\"fake-control-group\">\n    <label id=\"load-session-response-label\"><b>Load session response</b></label>\n    <input\n      [(ngModel)]=\"loadSessionResponse\"\n      name=\"loadSessionReponse\"\n      (keyup)=\"composeElementTemplate()\"\n      type=\"text\"\n      aria-labelledby=\"load-session-response-label\"\n    />\n  </div>\n</div>\n","import { Session } from '@blueriq/angular';\nimport { Button } from '@blueriq/core';\nimport { CaptureAnalysis, PageContext, PageSection, TableSummary } from './bq-lens.types';\n\nexport function analyzeCapture(parsed: any, requestBody?: any): CaptureAnalysis {\n  // Session start response\n  if (parsed?.sessionId && !parsed?.elements) {\n    return {\n      responseType: 'start',\n      page: null,\n      counts: {},\n      totalElements: 0,\n      messages: [],\n      buttons: [],\n      links: [],\n      fields: [],\n      styles: [],\n      contentStyles: [],\n      sessionId: parsed.sessionId,\n      pageContext: null,\n      sections: [],\n      tables: [],\n      triggeredBy: null,\n    };\n  }\n\n  const elements: any[] = Array.isArray(parsed?.elements) ? parsed.elements : [];\n  const counts: Record<string, number> = {};\n  for (const el of elements) {\n    const t = el?.type ?? 'unknown';\n    counts[t] = (counts[t] ?? 0) + 1;\n  }\n\n  const byKey = new Map<string, any>();\n  for (const el of elements) byKey.set(el.key, el);\n\n  const page = elements.find(e => e?.type === 'page') ?? null;\n  const topMessages: Array<{ key: string; message: string }> = Array.isArray(parsed?.messages)\n    ? parsed.messages\n    : [];\n  const pageMessages: Array<{ key: string; message: string }> = Array.isArray(page?.messages)\n    ? page.messages\n    : [];\n  const messages = [...topMessages, ...pageMessages];\n\n  const buttons = elements\n    .filter(e => e?.type === 'button')\n    .map(e => ({\n      caption: e.caption ?? e.name ?? e.key,\n      disabled: !!e.disabled,\n      validate: !!e.validate,\n      styles: Array.isArray(e.styles) ? e.styles : [],\n      contentStyle: e.contentStyle ?? undefined,\n    }));\n\n  const links = elements\n    .filter(e => e?.type === 'link')\n    .map(e => ({\n      caption: e.caption ?? e.name ?? e.key,\n      url: e.url ?? undefined,\n      styles: Array.isArray(e.styles) ? e.styles : [],\n    }));\n\n  const fields = elements\n    .filter(e => e?.type === 'field')\n    .map(e => ({\n      name: e.name ?? null,\n      questionText: e.questionText ?? null,\n      functionalKey: e.functionalKey ?? e.key,\n      dataType: e.dataType,\n      values: Array.isArray(e.values) ? e.values : (e.value != null ? [e.value] : []),\n      editable: e.editable != null ? !!e.editable : !e.readonly,\n      required: e.required,\n      refresh: !!e.refresh,\n      styles: Array.isArray(e.styles) ? e.styles : [],\n      contentStyle: e.contentStyle ?? undefined,\n      validations: Array.isArray(e.validations) ? e.validations : [],\n      fieldMessages: Array.isArray(e.messages) ? e.messages : [],\n    }));\n\n  const stylesSet = new Set<string>();\n  const contentStylesSet = new Set<string>();\n  for (const el of elements) {\n    for (const s of (Array.isArray(el?.styles) ? el.styles : [])) stylesSet.add(s);\n    if (el?.contentStyle) contentStylesSet.add(el.contentStyle);\n  }\n\n  const pageContext = extractPageContext(elements, byKey, page);\n  const sections = extractSections(elements, byKey);\n  const tables = extractTables(elements, byKey);\n  const triggeredBy = extractTriggeredBy(requestBody, elements);\n\n  return {\n    responseType: elements.length > 0 ? 'session' : 'other',\n    page: page ? { key: page.key, name: page.name, displayName: page.displayName } : null,\n    counts,\n    totalElements: elements.length,\n    messages,\n    buttons,\n    links,\n    fields,\n    styles: [...stylesSet].sort(),\n    contentStyles: [...contentStylesSet].sort(),\n    pageContext,\n    sections,\n    tables,\n    triggeredBy,\n  };\n}\n\nfunction getStyles(el: any): string[] {\n  return Array.isArray(el?.styles) ? el.styles : [];\n}\n\nfunction getChildren(el: any, byKey: Map<string, any>): any[] {\n  if (!Array.isArray(el?.children)) return [];\n  return el.children.map((k: string) => byKey.get(k)).filter(Boolean);\n}\n\nfunction countDescendantsByType(key: string, type: string, byKey: Map<string, any>, depth = 0): number {\n  if (depth > 8) return 0;\n  const el = byKey.get(key);\n  if (!el || !Array.isArray(el.children)) return 0;\n  let count = 0;\n  for (const childKey of el.children) {\n    const child = byKey.get(childKey);\n    if (!child) continue;\n    if (child.type === type) count++;\n    count += countDescendantsByType(childKey, type, byKey, depth + 1);\n  }\n  return count;\n}\n\nfunction countDescendantsByContentStyle(key: string, contentStyle: string, byKey: Map<string, any>, depth = 0): number {\n  if (depth > 8) return 0;\n  const el = byKey.get(key);\n  if (!el || !Array.isArray(el.children)) return 0;\n  let count = 0;\n  for (const childKey of el.children) {\n    const child = byKey.get(childKey);\n    if (!child) continue;\n    if (child.contentStyle === contentStyle) count++;\n    count += countDescendantsByContentStyle(childKey, contentStyle, byKey, depth + 1);\n  }\n  return count;\n}\n\nfunction findDescendantTextitem(key: string, styleCheck: (s: string) => boolean, byKey: Map<string, any>, depth = 0): any | null {\n  if (depth > 8) return null;\n  const el = byKey.get(key);\n  if (!el || !Array.isArray(el.children)) return null;\n  for (const childKey of el.children) {\n    const child = byKey.get(childKey);\n    if (!child) continue;\n    if (child.type === 'textitem' && getStyles(child).some(styleCheck)) return child;\n    const found = findDescendantTextitem(childKey, styleCheck, byKey, depth + 1);\n    if (found) return found;\n  }\n  return null;\n}\n\nfunction extractPageContext(elements: any[], byKey: Map<string, any>, page: any): PageContext | null {\n  // Breadcrumb: container with 'Breadcrumb' in styles → button children captions\n  const breadcrumbContainer = elements.find(\n    el => el?.type === 'container' && getStyles(el).includes('Breadcrumb')\n  );\n  const breadcrumb: string[] = breadcrumbContainer\n    ? getChildren(breadcrumbContainer, byKey)\n        .filter(c => c.type === 'button' && c.caption)\n        .map(c => c.caption as string)\n    : [];\n\n  // Page title: textitem with 'Heading2' inside a 'PageHeader'-styled container\n  const pageHeaderContainer = elements.find(\n    el => el?.type === 'container' && getStyles(el).includes('PageHeader')\n  );\n  let title: string | null = null;\n  if (pageHeaderContainer) {\n    const heading = findDescendantTextitem(\n      pageHeaderContainer.key,\n      s => s === 'Heading2',\n      byKey\n    );\n    title = heading?.plainText ?? null;\n  }\n\n  // Status chips: all textitems with a style that starts with 'Chip'\n  const statusChips = elements\n    .filter(el => el?.type === 'textitem' && getStyles(el).some(s => s.startsWith('Chip')))\n    .map(el => ({\n      text: (el.plainText as string | null) ?? '',\n      chipStyle: getStyles(el).find(s => s.startsWith('Chip')) as string,\n    }))\n    .filter(c => c.text && c.text.trim().length > 0);\n\n  // Active tab: button with 'selected' in styles whose parent has contentStyle 'tabs'\n  const tabsContainers = elements.filter(\n    el => el?.type === 'container' && el?.contentStyle === 'tabs'\n  );\n  let activeTab: string | null = null;\n  for (const tc of tabsContainers) {\n    const selectedBtn = getChildren(tc, byKey).find(\n      c => c.type === 'button' && getStyles(c).includes('selected')\n    );\n    if (selectedBtn) {\n      activeTab = selectedBtn.caption ?? null;\n      break;\n    }\n  }\n\n  const pageFunctionalName: string | null = page?.name ?? null;\n\n  if (!breadcrumb.length && !title && !statusChips.length && !activeTab && !pageFunctionalName) {\n    return null;\n  }\n\n  return { breadcrumb, title, statusChips, activeTab, pageFunctionalName };\n}\n\nfunction extractSections(elements: any[], byKey: Map<string, any>): PageSection[] {\n  return elements\n    .filter(el =>\n      el?.type === 'container' &&\n      el.displayName &&\n      getStyles(el).includes('Card')\n    )\n    .map(el => ({\n      displayName: el.displayName as string,\n      contentStyle: el.contentStyle ?? '',\n      fieldCount: countDescendantsByType(el.key, 'field', byKey),\n      buttonCount: countDescendantsByType(el.key, 'button', byKey),\n    }));\n}\n\nconst TABLE_CONTENT_STYLES = new Set(['worklist', 'instancelist', 'commentlist', 'table']);\n\nfunction extractTables(elements: any[], byKey: Map<string, any>): TableSummary[] {\n  return elements\n    .filter(el => el?.type === 'container' && TABLE_CONTENT_STYLES.has(el.contentStyle))\n    .map(el => ({\n      name: el.name ?? null,\n      displayName: el.displayName ?? null,\n      contentStyle: el.contentStyle as string,\n      rowCount: countDescendantsByContentStyle(el.key, 'tablerow', byKey),\n    }));\n}\n\nfunction extractTriggeredBy(requestBody: any, elements: any[]): string | null {\n  if (!requestBody) return null;\n  const actionKey: string | null =\n    requestBody?.event?.elementKey ??\n    requestBody?.payload?.event?.elementKey ??\n    requestBody?.actionName ??\n    null;\n  if (!actionKey) return null;\n  const match = elements.find(e => e.functionalKey === actionKey || e.key === actionKey);\n  return match?.caption ?? actionKey;\n}\n\nexport function analyzeSession(session: Session): CaptureAnalysis {\n  const elements = session.pageModel.elements;\n  const page = session.pageModel.page;\n  const counts: Record<string, number> = {};\n  for (const el of elements) {\n    counts[el.type] = (counts[el.type] ?? 0) + 1;\n  }\n\n  const buttons = elements\n    .filter(e => e.type === 'button')\n    .map(e => {\n      const b = e as Button;\n      return {\n        caption: b.caption ?? b.name ?? b.key,\n        disabled: b.disabled,\n        validate: b.validate,\n        styles: Array.from<string>((b.styles as any)._styles ?? []),\n        contentStyle: b.contentStyle,\n      };\n    });\n\n  const links = elements\n    .filter(e => e.type === 'link')\n    .map(e => ({\n      caption: (e as any).text || e.name || e.key,\n      url: undefined as string | undefined,\n      styles: Array.from<string>((e.styles as any)._styles ?? []),\n    }));\n\n  const fields = session.form.fields.map(f => {\n    const fieldMessages: Array<{ type: string; text: string }> = [];\n    for (const msg of f.messages as any) {\n      fieldMessages.push({ type: msg.type ?? 'error', text: msg.text ?? String(msg) });\n    }\n    return {\n      name: f.name ?? null,\n      questionText: (f as any).questionText ?? null,\n      functionalKey: f.functionalKey,\n      dataType: f.dataType as string | undefined,\n      values: f.listValue,\n      editable: !f.readonly,\n      required: f.required,\n      refresh: f.refresh,\n      styles: Array.from<string>((f.styles as any)._styles ?? []),\n      contentStyle: f.contentStyle,\n      validations: [],\n      fieldMessages,\n    };\n  });\n\n  const stylesSet = new Set<string>();\n  const contentStylesSet = new Set<string>();\n  for (const el of elements) {\n    for (const s of Array.from<string>((el.styles as any)._styles ?? [])) stylesSet.add(s);\n    if (el.contentStyle) contentStylesSet.add(el.contentStyle);\n  }\n\n  return {\n    responseType: 'session',\n    page: { key: page.key, name: page.name ?? null, displayName: (page as any).displayName ?? null },\n    counts,\n    totalElements: elements.length,\n    messages: [...(page.messages?.errors ?? []).map((e: any) => ({ key: page.key, message: e.text ?? String(e) }))],\n    buttons,\n    links,\n    fields,\n    styles: [...stylesSet].sort(),\n    contentStyles: [...contentStylesSet].sort(),\n    sessionId: session.sessionId,\n    pageContext: null,\n    sections: [],\n    tables: [],\n    triggeredBy: null,\n  };\n}\n","import { safeStringify } from './dev-json.utils';\n\n/**\n * Best-effort classification of a captured response body. Detection is purely\n * shape-based — Angular's HttpClient hands us already-parsed objects for\n * Content-Type: application/json, and raw strings for everything else, so we\n * key off `typeof` plus a leading-`<` heuristic for HTML. Misses pathological\n * cases like JSON served as text/plain; for Blueriq those don't happen.\n */\nexport type BodyKind = 'json' | 'html' | 'text' | 'empty';\n\nexport function detectBodyKind(body: unknown): BodyKind {\n  if (body == null) return 'empty';\n  if (typeof body === 'object') return 'json';\n  if (typeof body !== 'string') return 'text';\n  const trimmed = body.trimStart();\n  if (!trimmed) return 'empty';\n  if (trimmed.startsWith('<')) return 'html';\n  return 'text';\n}\n\n/** Render any captured body as a string suitable for display / copy / diff. */\nexport function bodyToDisplayString(body: unknown): string {\n  if (body == null) return '';\n  if (typeof body === 'string') return body;\n  return safeStringify(body, String(body), 2);\n}\n","import { AnalysisDiffEntry, CaptureAnalysis } from './bq-lens.types';\nimport { analyzeCapture } from './dev-analysis.utils';\n\nexport interface DiffLine {\n  type: 'add' | 'remove' | 'same';\n  text: string;\n}\n\nexport interface FieldChange {\n  field: string;\n  before: any;\n  after: any;\n}\n\nexport interface SemanticChange {\n  kind: 'added' | 'removed' | 'modified';\n  key: string;\n  type: string;\n  label: string;\n  changes?: FieldChange[];\n}\n\nconst COMPARED_FIELDS = [\n  'displayName', 'name', 'caption', 'questionText', 'value', 'values',\n  'disabled', 'readonly', 'editable', 'required', 'refresh', 'validate',\n  'contentStyle', 'styles', 'children', 'plainText', 'dataType',\n];\n\nfunction elementsFromBody(body: any): any[] {\n  if (Array.isArray(body?.elements)) return body.elements;\n  if (Array.isArray(body?.events)) {\n    const adds: any[] = [];\n    for (const ev of body.events) {\n      for (const c of (ev?.changes?.changes ?? [])) {\n        if (c?.type === 'add' && c?.model?.key) adds.push(c.model);\n      }\n    }\n    return adds;\n  }\n  return [];\n}\n\nfunction labelOf(el: any): string {\n  return el?.displayName || el?.name || el?.caption || el?.questionText || el?.functionalKey || el?.key || '';\n}\n\nfunction shallowEqual(a: any, b: any): boolean {\n  if (a === b) return true;\n  if (Array.isArray(a) && Array.isArray(b)) {\n    if (a.length !== b.length) return false;\n    for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false;\n    return true;\n  }\n  return false;\n}\n\nexport function semanticDiff(bodyA: any, bodyB: any): SemanticChange[] {\n  const a = new Map<string, any>();\n  const b = new Map<string, any>();\n  for (const el of elementsFromBody(bodyA)) if (el?.key) a.set(el.key, el);\n  for (const el of elementsFromBody(bodyB)) if (el?.key) b.set(el.key, el);\n\n  const changes: SemanticChange[] = [];\n\n  for (const [key, el] of a) {\n    if (!b.has(key)) {\n      changes.push({ kind: 'removed', key, type: el.type ?? 'unknown', label: labelOf(el) });\n    }\n  }\n  for (const [key, el] of b) {\n    if (!a.has(key)) {\n      changes.push({ kind: 'added', key, type: el.type ?? 'unknown', label: labelOf(el) });\n    }\n  }\n  for (const [key, before] of a) {\n    const after = b.get(key);\n    if (!after) continue;\n    const fieldChanges: FieldChange[] = [];\n    for (const f of COMPARED_FIELDS) {\n      if (!shallowEqual(before[f], after[f])) {\n        fieldChanges.push({ field: f, before: before[f], after: after[f] });\n      }\n    }\n    if (fieldChanges.length) {\n      changes.push({\n        kind: 'modified',\n        key,\n        type: after.type ?? before.type ?? 'unknown',\n        label: labelOf(after) || labelOf(before),\n        changes: fieldChanges,\n      });\n    }\n  }\n\n  return changes.sort((x, y) => {\n    const order = { modified: 0, added: 1, removed: 2 };\n    if (order[x.kind] !== order[y.kind]) return order[x.kind] - order[y.kind];\n    return x.label.localeCompare(y.label);\n  });\n}\n\nexport interface DiffHunk {\n  lines: DiffLine[];\n  hiddenBefore: number;\n}\n\nexport function groupIntoHunks(lines: DiffLine[], context = 3): DiffHunk[] {\n  const changedIdx = lines.map((l, i) => l.type !== 'same' ? i : -1).filter(i => i >= 0);\n  if (!changedIdx.length) return [];\n\n  const ranges: Array<[number, number]> = [];\n  for (const idx of changedIdx) {\n    const start = Math.max(0, idx - context);\n    const end = Math.min(lines.length - 1, idx + context);\n    if (ranges.length && start <= ranges[ranges.length - 1][1] + 1) {\n      ranges[ranges.length - 1][1] = Math.max(ranges[ranges.length - 1][1], end);\n    } else {\n      ranges.push([start, end]);\n    }\n  }\n\n  const hunks: DiffHunk[] = [];\n  let prev = 0;\n  for (const [start, end] of ranges) {\n    hunks.push({ lines: lines.slice(start, end + 1), hiddenBefore: start - prev });\n    prev = end + 1;\n  }\n  return hunks;\n}\n\n/**\n * Structural diff over `CaptureAnalysis` rather than raw element JSON.\n * Compares fields by `functionalKey`, buttons / links by caption (with\n * index fallback to handle duplicates), sections by `displayName`,\n * tables by `name ?? displayName`, and the singleton `pageContext` key\n * by key. Emits one entry per added / removed / modified item.\n *\n * Only attributes a developer will recognise are surfaced. Values are\n * compared with `valuesEqualish` so array-vs-array and object-vs-object\n * don't inflate the result with reference-equality noise.\n */\nexport function analysisDiff(bodyA: any, bodyB: any, requestA?: any, requestB?: any): AnalysisDiffEntry[] {\n  const a = analyzeCapture(bodyA, requestA);\n  const b = analyzeCapture(bodyB, requestB);\n  const out: AnalysisDiffEntry[] = [];\n\n  const FIELD_ATTRS = ['questionText', 'dataType', 'editable', 'required', 'refresh', 'contentStyle', 'values', 'styles', 'validations', 'fieldMessages'] as const;\n  diffByKey(\n    a.fields, b.fields, f => f.functionalKey, FIELD_ATTRS,\n    'field', f => f.questionText || f.name || f.functionalKey, out,\n  );\n\n  const BUTTON_ATTRS = ['disabled', 'validate', 'styles', 'contentStyle'] as const;\n  diffByKey(\n    a.buttons, b.buttons, (btn, i) => `${btn.caption || '(empty)'}#${i}`, BUTTON_ATTRS,\n    'button', btn => btn.caption || '(empty caption)', out,\n  );\n\n  const LINK_ATTRS = ['url', 'styles'] as const;\n  diffByKey(\n    a.links, b.links, (l, i) => `${l.caption || '(empty)'}#${i}`, LINK_ATTRS,\n    'link', l => l.caption || '(empty caption)', out,\n  );\n\n  const SECTION_ATTRS = ['contentStyle', 'fieldCount', 'buttonCount'] as const;\n  diffByKey(\n    a.sections, b.sections, s => s.displayName, SECTION_ATTRS,\n    'section', s => s.displayName, out,\n  );\n\n  const TABLE_ATTRS = ['contentStyle', 'rowCount'] as const;\n  diffByKey(\n    a.tables, b.tables, t => (t.name ?? t.displayName ?? '(unnamed)'), TABLE_ATTRS,\n    'table', t => (t.displayName ?? t.name ?? '(unnamed table)'), out,\n  );\n\n  // Page context: singleton, diff key-by-key when both sides exist.\n  const ctxA = a.pageContext;\n  const ctxB = b.pageContext;\n  if (ctxA && ctxB) {\n    const changes: Array<{ attr: string; before: unknown; after: unknown }> = [];\n    for (const k of ['title', 'activeTab', 'pageFunctionalName', 'breadcrumb', 'statusChips'] as const) {\n      if (!valuesEqualish((ctxA as any)[k], (ctxB as any)[k])) {\n        changes.push({ attr: k, before: (ctxA as any)[k], after: (ctxB as any)[k] });\n      }\n    }\n    if (changes.length) {\n      out.push({ kind: 'modified', category: 'page-context', identity: ctxB.title || ctxB.pageFunctionalName || 'page', changes });\n    }\n  } else if (ctxA && !ctxB) {\n    out.push({ kind: 'removed', category: 'page-context', identity: ctxA.title || 'page' });\n  } else if (!ctxA && ctxB) {\n    out.push({ kind: 'added', category: 'page-context', identity: ctxB.title || 'page' });\n  }\n\n  return out.sort((x, y) => {\n    const order = { modified: 0, added: 1, removed: 2 };\n    if (order[x.kind] !== order[y.kind]) return order[x.kind] - order[y.kind];\n    if (x.category !== y.category) return x.category.localeCompare(y.category);\n    return x.identity.localeCompare(y.identity);\n  });\n}\n\nfunction diffByKey<T>(\n  before: T[],\n  after: T[],\n  keyOf: (item: T, index: number) => string,\n  attrs: readonly string[],\n  category: AnalysisDiffEntry['category'],\n  identityOf: (item: T) => string,\n  out: AnalysisDiffEntry[],\n): void {\n  const aMap = new Map<string, T>();\n  const bMap = new Map<string, T>();\n  before.forEach((it, i) => aMap.set(keyOf(it, i), it));\n  after.forEach((it, i) => bMap.set(keyOf(it, i), it));\n\n  for (const [k, item] of aMap) {\n    if (!bMap.has(k)) out.push({ kind: 'removed', category, identity: identityOf(item) });\n  }\n  for (const [k, item] of bMap) {\n    if (!aMap.has(k)) out.push({ kind: 'added', category, identity: identityOf(item) });\n  }\n  for (const [k, beforeItem] of aMap) {\n    const afterItem = bMap.get(k);\n    if (!afterItem) continue;\n    const changes: Array<{ attr: string; before: unknown; after: unknown }> = [];\n    for (const attr of attrs) {\n      const bv = (beforeItem as any)[attr];\n      const av = (afterItem as any)[attr];\n      if (!valuesEqualish(bv, av)) changes.push({ attr, before: bv, after: av });\n    }\n    if (changes.length) {\n      out.push({ kind: 'modified', category, identity: identityOf(afterItem), changes });\n    }\n  }\n}\n\n/**\n * Looser equality than `===`. Arrays are compared element-wise via JSON\n * round-trip, plain objects via JSON. Cheap enough for analysis-level diffs\n * where the values are small and bounded; precise enough that two arrays\n * of equal strings don't show up as a change.\n */\nfunction valuesEqualish(a: unknown, b: unknown): boolean {\n  if (a === b) return true;\n  if (a == null && b == null) return true;\n  if (typeof a !== typeof b) return false;\n  if (typeof a === 'object') {\n    try { return JSON.stringify(a) === JSON.stringify(b); } catch { return false; }\n  }\n  return false;\n}\n\n/** True when the analysis-level diff is meaningfully populated for a pair of captures. */\nexport function canRunAnalysisDiff(a: CaptureAnalysis | null, b: CaptureAnalysis | null): boolean {\n  if (!a || !b) return false;\n  return a.totalElements + b.totalElements > 0;\n}\n\nexport function diffJson(aJson: string, bJson: string): DiffLine[] {\n  const a = aJson.split('\\n');\n  const b = bJson.split('\\n');\n  if (a.length + b.length > 2000) {\n    return [\n      ...a.map(text => ({ type: 'remove' as const, text })),\n      ...b.map(text => ({ type: 'add' as const, text })),\n    ];\n  }\n  const m = a.length, n = b.length;\n  const dp: number[][] = Array.from({ length: m + 1 }, () => new Array(n + 1).fill(0));\n  for (let i = m - 1; i >= 0; i--)\n    for (let j = n - 1; j >= 0; j--)\n      dp[i][j] = a[i] === b[j] ? dp[i + 1][j + 1] + 1 : Math.max(dp[i + 1][j], dp[i][j + 1]);\n\n  const result: DiffLine[] = [];\n  let i = 0, j = 0;\n  while (i < m || j < n) {\n    if (i < m && j < n && a[i] === b[j]) {\n      result.push({ type: 'same', text: a[i++] }); j++;\n    } else if (i < m && (j >= n || dp[i + 1][j] >= dp[i][j + 1])) {\n      result.push({ type: 'remove', text: a[i++] });\n    } else {\n      result.push({ type: 'add', text: b[j++] });\n    }\n  }\n  return result;\n}\n","import {\n  Element as BlueriqElement,\n  Field,\n  Container,\n  Page,\n  Button,\n  Link,\n  TextItem,\n  Asset,\n  ElementWithChildren,\n} from '@blueriq/core';\nimport { SearchField } from './services/dev-search.service';\n\nexport function serializeElement(el: BlueriqElement): Record<string, unknown> {\n  const base: Record<string, unknown> = {\n    type: el.type,\n    key: el.key,\n    functionalKey: el.functionalKey,\n    name: el.name,\n  };\n\n  const styles = el.styles?.all() ?? [];\n  if (styles.length) base['styles'] = styles;\n  if (el.contentStyle) base['contentStyle'] = el.contentStyle;\n  if (el.properties && Object.keys(el.properties).length) base['properties'] = el.properties;\n\n  switch (el.type) {\n    case 'field': {\n      const f = el as Field;\n      base['dataType'] = f.dataType;\n      base['value'] = (f.dataType === 'date' || f.dataType === 'datetime')\n        ? f.value.stringify()\n        : f.value.get();\n      if (f.questionText) base['questionText'] = f.questionText;\n      if (f.explainText) base['explainText'] = f.explainText;\n      if (f.required) base['required'] = true;\n      if (f.readonly) base['readonly'] = true;\n      if (f.hasDomain) {\n        base['domain'] = f.domain.options.map(o => ({ value: o.value, displayValue: o.displayValue }));\n      }\n      const fe = f.messages?.errors?.map((e: any) => e.text) ?? [];\n      const fw = f.messages?.warnings?.map((w: any) => w.text) ?? [];\n      if (fe.length || fw.length) base['messages'] = { errors: fe, warnings: fw };\n      break;\n    }\n    case 'container': {\n      const c = el as Container;\n      if (c.displayName) base['displayName'] = c.displayName;\n      base['children'] = ((c as unknown as ElementWithChildren).children ?? []).map((ch: BlueriqElement) => ({\n        type: ch.type, key: ch.key, name: ch.name,\n      }));\n      break;\n    }\n    case 'page': {\n      const p = el as Page;\n      if (p.displayName) base['displayName'] = p.displayName;\n      base['children'] = ((p as unknown as ElementWithChildren).children ?? []).map((ch: BlueriqElement) => ({\n        type: ch.type, key: ch.key, name: ch.name,\n      }));\n      const pe = p.messages?.errors?.map((e: any) => e.text) ?? [];\n      const pw = p.messages?.warnings?.map((w: any) => w.text) ?? [];\n      if (pe.length || pw.length) base['messages'] = { errors: pe, warnings: pw };\n      break;\n    }\n    case 'button': {\n      const b = el as Button;\n      base['caption'] = b.caption;\n      if (b.disabled) base['disabled'] = true;\n      break;\n    }\n    case 'link': {\n      const l = el as Link;\n      base['text'] = l.text;\n      if (l.documentName) base['documentName'] = l.documentName;\n      if (l.documentType) base['documentType'] = l.documentType;\n      if (l.pageName) base['pageName'] = l.pageName;\n      if (l.downloadId) base['downloadId'] = l.downloadId;\n      if (l.configurationId) base['configurationId'] = l.configurationId;\n      if (l.optionalParameters) base['optionalParameters'] = l.optionalParameters;\n      break;\n    }\n    case 'textitem': {\n      const t = el as TextItem;\n      base['plainText'] = t.plainText;\n      break;\n    }\n    case 'asset': {\n      const a = el as Asset;\n      base['text'] = a.text;\n      base['format'] = a.format;\n      break;\n    }\n  }\n\n  return base;\n}\n\nexport function extractTextNodeFields(nodes: any[]): SearchField[] {\n  const fields: SearchField[] = [];\n  for (const node of nodes ?? []) {\n    if (node?.nodeType === 'text' && node.text) {\n      fields.push({ value: node.text, weight: 1.5 });\n    } else if (node?.nodeType === 'value') {\n      for (const v of node.values ?? []) {\n        if (v) fields.push({ value: String(v), weight: 0.5 });\n      }\n    } else if (node?.nodeType === 'style') {\n      if (node.presentationStyle) fields.push({ value: node.presentationStyle, weight: 0.5 });\n      fields.push(...extractTextNodeFields(node.nodes));\n    }\n  }\n  return fields;\n}\n","// Storage I/O can throw in Safari private mode and sandboxed iframes; treat\n// every read/write as best-effort so the panel still mounts when persistence\n// is unavailable.\n\nexport function safeRead(storage: Storage, key: string): string | null {\n  try { return storage.getItem(key); } catch { return null; }\n}\n\nexport function safeWrite(storage: Storage, key: string, value: string): void {\n  try { storage.setItem(key, value); } catch { /* private mode / quota */ }\n}\n\nexport function safeRemove(storage: Storage, key: string): void {\n  try { storage.removeItem(key); } catch { /* private mode */ }\n}\n\n// Single source of truth for every storage slot the panel writes to. Keep\n// the `bq-lens-` prefix on all values so a quick DevTools → Application →\n// Storage scan shows everything the panel persists.\n//\n// `tourDoneMain` keeps its legacy key (no `:main` suffix) so users who\n// completed the original tour before the inspector tour landed don't see it\n// replay on upgrade.\nexport const BQ_LENS_STORAGE_KEYS = {\n  /** sessionStorage. `'1'` while the panel is open. */\n  panel: 'bq-lens-panel',\n  /** sessionStorage. JSON map of section-label → open/closed boolean. */\n  sections: 'bq-lens-sections',\n  /** localStorage. `'left' | 'right'` — which screen edge the panel docks to. */\n  panelSide: 'bq-lens-panel-side',\n  /** localStorage. Pixel offset of the floating tab from the top. */\n  panelTabTop: 'bq-lens-panel-tab-top',\n  /** localStorage. `'1'` once the main tour has been finished or skipped. */\n  tourDoneMain: 'bq-lens-tour-done',\n  /** localStorage. `'1'` once the inspector tour has been finished or skipped. */\n  tourDoneInspector: 'bq-lens-tour-done:inspector',\n} as const;\n\nexport type BqLensStorageKey =\n  (typeof BQ_LENS_STORAGE_KEYS)[keyof typeof BQ_LENS_STORAGE_KEYS];\n","// Generates a Storybook CSF3 story file from a serialised Blueriq element.\n// Input matches the shape produced by serializeElement() and buildEnrichedJson().\n\nexport interface StoryConfig {\n  providersPath?: string;\n}\n\nconst STORY_DEFAULTS: Required<StoryConfig> = {\n  providersPath: '../../../../stories/storybook-providers',\n};\n\nconst FIELD_METHOD: Record<string, string> = {\n  text:     'text',\n  boolean:  'boolean',\n  integer:  'integer',\n  decimal:  'decimal',\n  date:     'date',\n  datetime: 'datetime',\n  currency: 'currency',\n  memo:     'memo',\n  postcode: 'text',  // no dedicated FieldTemplate builder — plain text renders it\n};\n\nfunction q(v: unknown): string {\n  return JSON.stringify(v);\n}\n\n// Add `spaces` spaces to every line of `code`.\nfunction shift(code: string, spaces: number): string {\n  const pad = ' '.repeat(spaces);\n  return code.split('\\n').map(line => pad + line).join('\\n');\n}\n\n// Indent continuation lines (lines 1+) by `spaces` spaces.\n// Used to embed a multi-line builder inline after a property key.\nfunction shiftContinuation(code: string, spaces: number): string {\n  const pad = ' '.repeat(spaces);\n  return code.split('\\n').map((line, i) => (i === 0 ? line : pad + line)).join('\\n');\n}\n\nfunction getStyles(el: Record<string, unknown>): string[] {\n  const s = el['styles'];\n  return Array.isArray(s) ? s.filter((x): x is string => typeof x === 'string') : [];\n}\n\n// Splits el.children into fully-expanded objects and unexpanded string keys.\n// String keys occur when buildEnrichedJson hits its depth limit (depth >= 30).\nfunction splitChildren(el: Record<string, unknown>): { objects: Record<string, unknown>[]; stubs: string[] } {\n  const ch = el['children'];\n  if (!Array.isArray(ch)) return { objects: [], stubs: [] };\n  const objects: Record<string, unknown>[] = [];\n  const stubs: string[] = [];\n  for (const c of ch) {\n    if (c !== null && typeof c === 'object') objects.push(c as Record<string, unknown>);\n    else if (typeof c === 'string') stubs.push(c);\n  }\n  return { objects, stubs };\n}\n\n// ── Per-type builders ─────────────────────────────────────────────────────────\n// Each function returns a 0-indented string; method chains use 2-space indent.\n\nfunction fieldBuilder(el: Record<string, unknown>): string {\n  const fk     = q(el['functionalKey'] ?? el['key'] ?? 'Example.Field');\n  const dt     = String(el['dataType'] ?? 'text');\n  const method = FIELD_METHOD[dt] ?? 'text';\n\n  const lines: string[] = [`FieldTemplate.${method}(${fk})`];\n\n  if (el['questionText']) lines.push(`  .questionText(${q(el['questionText'])})`);\n  if (el['explainText'])  lines.push(`  .explainText(${q(el['explainText'])})`);\n\n  const value = el['value'];\n  lines.push(`  .value(${q(value !== null && value !== undefined ? String(value) : '')})`);\n\n  const styles = getStyles(el);\n  if (styles.length) lines.push(`  .styles(${styles.map(q).join(', ')})`);\n\n  if (el['readonly']) lines.push(`  .readonly(true)`);\n\n  const domain = el['domain'] as Array<{ value: string; displayValue: string }> | undefined;\n  if (domain?.length) {\n    const entries = domain.map(o => `${q(o.value)}: ${q(o.displayValue)}`).join(', ');\n    lines.push(`  .domain({ ${entries} })`);\n  }\n\n  const msgs = el['messages'] as { errors?: string[] } | undefined;\n  if (msgs?.errors?.length) lines.push(`  .error(${q(msgs.errors[0])})`);\n\n  return lines.join('\\n');\n}\n\nfunction buttonBuilder(el: Record<string, unknown>): string {\n  const fk      = q(el['functionalKey'] ?? el['key'] ?? 'Button');\n  const caption = q(el['caption'] ?? el['name'] ?? '');\n  const lines: string[] = [`ButtonTemplate.create(${fk}, ${caption})`];\n  const styles = getStyles(el);\n  if (styles.length) lines.push(`  .styles(${styles.map(q).join(', ')})`);\n  if (el['disabled']) lines.push(`  .disabled(true)`);\n  return lines.join('\\n');\n}\n\nfunction textItemBuilder(el: Record<string, unknown>): string {\n  const plainText = String(el['plainText'] ?? '');\n  const lines: string[] = ['TextItemTemplate.create()'];\n  if (plainText) lines.push(`  .children(StaticNodeTemplate.of(${q(plainText)}))`);\n  return lines.join('\\n');\n}\n\nfunction linkBuilder(el: Record<string, unknown>): string {\n  const fk   = q(el['functionalKey'] ?? el['key'] ?? 'Link');\n  const text = q(el['text'] ?? el['name'] ?? '');\n  const lines: string[] = [`LinkTemplate.create(${fk}, ${text})`];\n  const styles = getStyles(el);\n  if (styles.length) lines.push(`  .styles(${styles.map(q).join(', ')})`);\n  return lines.join('\\n');\n}\n\nfunction assetBuilder(el: Record<string, unknown>): string {\n  const fk = q(el['functionalKey'] ?? el['key'] ?? 'Asset');\n  const lines: string[] = [`AssetTemplate.create(${fk})`];\n  if (el['text'])   lines.push(`  .text(${q(el['text'])})`);\n  if (el['format']) lines.push(`  .format(${q(el['format'])})`);\n  return lines.join('\\n');\n}\n\nfunction containerOrPageBuilder(el: Record<string, unknown>, isPage: boolean): string {\n  const ctor = isPage ? 'PageTemplate.create()' : 'ContainerTemplate.create()';\n  const lines: string[] = [ctor];\n\n  if (el['displayName']) lines.push(`  .displayName(${q(el['displayName'])})`);\n  if (el['contentStyle']) lines.push(`  .contentStyle(${q(el['contentStyle'])})`);\n\n  const styles = getStyles(el);\n  if (styles.length) lines.push(`  .styles(${styles.map(q).join(', ')})`);\n\n  const { objects, stubs } = splitChildren(el);\n  const hasChildren = objects.length > 0 || stubs.length > 0;\n\n  if (hasChildren) {\n    const childParts: string[] = [\n      ...objects.map(c => shift(elementToBuilder(c), 4)),\n      ...stubs.map(key => `    // TODO: '${key}'`),\n    ];\n    lines.push(`  .children(\\n${childParts.join(',\\n')},\\n  )`);\n  }\n\n  return lines.join('\\n');\n}\n\nfunction elementToBuilder(el: Record<string, unknown>): string {\n  switch (el['type']) {\n    case 'field':     return fieldBuilder(el);\n    case 'button':    return buttonBuilder(el);\n    case 'textitem':  return textItemBuilder(el);\n    case 'link':      return linkBuilder(el);\n    case 'asset':     return assetBuilder(el);\n    case 'container': return containerOrPageBuilder(el, false);\n    case 'page':      return containerOrPageBuilder(el, true);\n    default:\n      return `// TODO: ${el['type'] ?? 'unknown'} '${el['functionalKey'] ?? el['key'] ?? ''}'`;\n  }\n}\n\nfunction collectImports(el: Record<string, unknown>): string[] {\n  const needed = new Set<string>(['PageTemplate', 'ContainerTemplate']);\n\n  function scan(e: Record<string, unknown>): void {\n    switch (e['type']) {\n      case 'field':    needed.add('FieldTemplate'); break;\n      case 'button':   needed.add('ButtonTemplate'); break;\n      case 'textitem': needed.add('TextItemTemplate'); needed.add('StaticNodeTemplate'); break;\n      case 'link':     needed.add('LinkTemplate'); break;\n      case 'asset':    needed.add('AssetTemplate'); break;\n    }\n    splitChildren(e).objects.forEach(scan);\n  }\n\n  scan(el);\n  return [...needed].sort();\n}\n\n// ── Public API ────────────────────────────────────────────────────────────────\n\nexport function generateCsfStory(element: Record<string, unknown>, config: StoryConfig = {}): string {\n  const cfg        = { ...STORY_DEFAULTS, ...config };\n  const isPageRoot = element['type'] === 'page';\n  const imports    = collectImports(element);\n  const builder    = elementToBuilder(element);\n\n  // rootElement value: page elements go directly, others are wrapped in the page() helper.\n  // Method continuations are indented so they align nicely after \"rootElement: \".\n  const rootElement = isPageRoot\n    ? shiftContinuation(builder, 6)                                // inline after \"rootElement: \"\n    : `page(\\n${shift(builder, 6)},\\n    )`;                       // wrapped in page()\n\n  const lines: string[] = [\n    `import { applicationConfig, Meta, moduleMetadata, StoryObj } from '@storybook/angular';`,\n    `import { ${imports.join(', ')} } from '@blueriq/core/testing';`,\n    `import { MockRenderComponent, StorybookUtilsModule } from '@blueriq/test-utils';`,\n    `import { baseModuleProviders } from '${cfg.providersPath}';`,\n    ``,\n    `const meta: Meta<MockRenderComponent> = {`,\n    `  title: 'Components/...',`,\n    `  component: MockRenderComponent,`,\n    `  decorators: [`,\n    `    moduleMetadata({ imports: [StorybookUtilsModule] }),`,\n    `    applicationConfig({ providers: [...baseModuleProviders] }),`,\n    `  ],`,\n    `};`,\n    ``,\n    `export default meta;`,\n    `type Story = StoryObj<MockRenderComponent>;`,\n  ];\n\n  if (!isPageRoot) {\n    lines.push(\n      ``,\n      `const page = (...children: any[]) =>`,\n      `  PageTemplate.create().displayName('').contentStyle('page')`,\n      `    .children(ContainerTemplate.create().displayName('').contentStyle('container').children(...children));`,\n    );\n  }\n\n  lines.push(\n    ``,\n    `export const Default: Story = {`,\n    `  args: {`,\n    `    rootElement: ${rootElement},`,\n    `  },`,\n    `};`,\n  );\n\n  return lines.join('\\n');\n}\n","import { Injectable } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class DevFormatService {\n  constructor(private sanitizer: DomSanitizer) {}\n\n  formatTemplate(code: string): string {\n    const INDENT = '  ';\n    let result = '';\n    let depth = 0;\n    let i = 0;\n    const blockStack: boolean[] = [];\n    const indent = () => INDENT.repeat(depth);\n\n    while (i < code.length) {\n      const ch = code[i];\n      if (ch === '`' || ch === \"'\" || ch === '\"') {\n        const q = ch; result += ch; i++;\n        while (i < code.length) {\n          const c = code[i]; i++; result += c;\n          if (c === '\\\\' && i < code.length) { result += code[i]; i++; }\n          else if (c === q) break;\n        }\n        continue;\n      }\n      if (ch === '(') {\n        const trimmed = result.trimEnd();\n        const isBlock = (trimmed.endsWith('.children') || trimmed.endsWith('.nodes'))\n          && code[i + 1] !== ')';\n        blockStack.push(isBlock);\n        if (isBlock) { depth++; result += '(\\n' + indent(); }\n        else { result += '('; }\n        i++; continue;\n      }\n      if (ch === ')') {\n        const wasBlock = blockStack.pop() ?? false;\n        if (wasBlock) { depth--; result += '\\n' + indent() + ')'; }\n        else { result += ')'; }\n        i++; continue;\n      }\n      if (ch === ',') {\n        if (blockStack[blockStack.length - 1]) { result += ',\\n' + indent(); }\n        else { result += ', '; }\n        i++; continue;\n      }\n      if (ch === '.') {\n        const prev = result[result.length - 1] ?? '';\n        if (prev === ')') { result += '\\n' + indent() + '.'; }\n        else { result += '.'; }\n        i++; continue;\n      }\n      result += ch; i++;\n    }\n    return result;\n  }\n\n  highlightJson(json: string): SafeHtml {\n    const escaped = json\n      .replace(/&/g, '&amp;')\n      .replace(/</g, '&lt;')\n      .replace(/>/g, '&gt;');\n\n    const highlighted = escaped.replace(\n      /(\"(\\\\u[a-zA-Z0-9]{4}|\\\\[^u]|[^\\\\\"])*\"(\\s*:)?|\\b(true|false|null)\\b|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?)/g,\n      (match) => {\n        let cls: string;\n        if (/^\"/.test(match)) {\n          cls = /:$/.test(match) ? 'json-key' : 'json-string';\n        } else if (/true|false/.test(match)) {\n          cls = 'json-boolean';\n        } else if (match === 'null') {\n          cls = 'json-null';\n        } else {\n          cls = 'json-number';\n        }\n        return `<span class=\"${cls}\">${match}</span>`;\n      }\n    );\n    return this.sanitizer.bypassSecurityTrustHtml(highlighted);\n  }\n\n  highlightStory(code: string): SafeHtml {\n    // Tokenise TypeScript CSF story code left-to-right to avoid overlapping regex matches.\n    const TS_KEYWORDS = new Set(['import', 'from', 'export', 'default', 'const', 'type', 'let', 'return']);\n    const out: string[] = [];\n    let i = 0;\n\n    const esc = (s: string) => s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n    const push = (cls: string, s: string) => out.push(`<span class=\"${cls}\">${esc(s)}</span>`);\n\n    while (i < code.length) {\n      // Line comment\n      if (code[i] === '/' && code[i + 1] === '/') {\n        const end = code.indexOf('\\n', i);\n        const slice = end === -1 ? code.slice(i) : code.slice(i, end);\n        push('tmpl-comment', slice);\n        i += slice.length;\n        continue;\n      }\n      // String literals (single, double, backtick)\n      if (code[i] === \"'\" || code[i] === '\"' || code[i] === '`') {\n        const q = code[i];\n        let j = i + 1;\n        while (j < code.length) {\n          if (code[j] === '\\\\') { j += 2; continue; }\n          if (code[j] === q) { j++; break; }\n          j++;\n        }\n        push('tmpl-string', code.slice(i, j));\n        i = j;\n        continue;\n      }\n      // Identifiers / keywords\n      if (/[a-zA-Z_$]/.test(code[i])) {\n        let j = i + 1;\n        while (j < code.length && /[\\w$]/.test(code[j])) j++;\n        const word = code.slice(i, j);\n        if (TS_KEYWORDS.has(word)) {\n          push('tmpl-keyword', word);\n        } else if (word.endsWith('Template') || word.endsWith('Template')) {\n          push('tmpl-class', word);\n        } else if (word === 'true' || word === 'false' || word === 'null') {\n          push('json-boolean', word);\n        } else {\n          out.push(esc(word));\n        }\n        i = j;\n        continue;\n      }\n      // Method-call dot (followed by lowercase letter — excludes ellipsis and number decimals)\n      if (code[i] === '.' && i + 1 < code.length && /[a-z]/.test(code[i + 1])) {\n        let j = i + 1;\n        while (j < code.length && /[\\w$]/.test(code[j])) j++;\n        push('tmpl-method', code.slice(i, j));\n        i = j;\n        continue;\n      }\n      // Parens\n      if (code[i] === '(' || code[i] === ')') {\n        push('tmpl-paren', code[i]);\n        i++;\n        continue;\n      }\n      out.push(esc(code[i]));\n      i++;\n    }\n\n    return this.sanitizer.bypassSecurityTrustHtml(out.join(''));\n  }\n\n  renderMarkdown(md: string): SafeHtml {\n    const esc = (s: string) =>\n      s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n\n    const renderInline = (s: string) => {\n      // Tokenise inline `code` first so emphasis inside it isn't expanded.\n      const parts: string[] = [];\n      let i = 0;\n      while (i < s.length) {\n        const tick = s.indexOf('`', i);\n        if (tick === -1) { parts.push(formatNonCode(s.slice(i))); break; }\n        parts.push(formatNonCode(s.slice(i, tick)));\n        const close = s.indexOf('`', tick + 1);\n        if (close === -1) { parts.push(esc(s.slice(tick))); break; }\n        parts.push(`<code>${esc(s.slice(tick + 1, close))}</code>`);\n        i = close + 1;\n      }\n      return parts.join('');\n    };\n\n    const formatNonCode = (raw: string) => {\n      let s = esc(raw);\n      // [text](url) — escape attribute, allow http(s) and relative\n      s = s.replace(/\\[([^\\]]+)\\]\\(([^)]+)\\)/g, (_m, text, url) => {\n        const safeUrl = /^(https?:|mailto:|\\/|#)/.test(url) ? url : '#';\n        return `<a href=\"${safeUrl}\" target=\"_blank\" rel=\"noopener\">${text}</a>`;\n      });\n      s = s.replace(/\\*\\*([^*]+)\\*\\*/g, '<strong>$1</strong>');\n      s = s.replace(/(^|[^*])\\*([^*\\n]+)\\*(?!\\*)/g, '$1<em>$2</em>');\n      return s;\n    };\n\n    const lines = md.split('\\n');\n    const out: string[] = [];\n    let i = 0;\n    let inList = false;\n    let inPara: string[] = [];\n\n    const flushPara = () => {\n      if (inPara.length) {\n        out.push(`<p>${renderInline(inPara.join(' '))}</p>`);\n        inPara = [];\n      }\n    };\n    const closeList = () => { if (inList) { out.push('</ul>'); inList = false; } };\n\n    while (i < lines.length) {\n      const line = lines[i];\n\n      // Raw SVG block — pass through verbatim (DomSanitizer trusts the result).\n      if (/^<svg[\\s>]/.test(line)) {\n        flushPara(); closeList();\n        const buf: string[] = [line];\n        i++;\n        while (i < lines.length) {\n          buf.push(lines[i]);\n          if (/<\\/svg>/.test(lines[i])) { i++; break; }\n          i++;\n        }\n        out.push(buf.join('\\n'));\n        continue;\n      }\n\n      // Raw <p> block (e.g. centered logo banner) — pass through verbatim.\n      if (/^<p[\\s>]/.test(line)) {\n        flushPara(); closeList();\n        const buf: string[] = [line];\n        if (/<\\/p>/.test(line)) { out.push(buf.join('\\n')); i++; continue; }\n        i++;\n        while (i < lines.length) {\n          buf.push(lines[i]);\n          if (/<\\/p>/.test(lines[i])) { i++; break; }\n          i++;\n        }\n        out.push(buf.join('\\n'));\n        continue;\n      }\n\n      // Fenced code\n      if (/^```/.test(line)) {\n        flushPara(); closeList();\n        i++;\n        const buf: string[] = [];\n        while (i < lines.length && !/^```/.test(lines[i])) { buf.push(lines[i]); i++; }\n        i++; // skip closing fence\n        out.push(`<pre><code>${esc(buf.join('\\n'))}</code></pre>`);\n        continue;\n      }\n\n      // Tables: header | --- | rows\n      if (/^\\|.*\\|\\s*$/.test(line) && i + 1 < lines.length && /^\\|[\\s:|-]+\\|\\s*$/.test(lines[i + 1])) {\n        flushPara(); closeList();\n        const splitRow = (row: string) =>\n          row.replace(/^\\||\\|$/g, '').split('|').map(c => c.trim());\n        const headers = splitRow(line);\n        i += 2;\n        const rows: string[][] = [];\n        while (i < lines.length && /^\\|.*\\|\\s*$/.test(lines[i])) {\n          rows.push(splitRow(lines[i]));\n          i++;\n        }\n        const thead = `<thead><tr>${headers.map(h => `<th>${renderInline(h)}</th>`).join('')}</tr></thead>`;\n        const tbody = `<tbody>${rows.map(r => `<tr>${r.map(c => `<td>${renderInline(c)}</td>`).join('')}</tr>`).join('')}</tbody>`;\n        out.push(`<table>${thead}${tbody}</table>`);\n        continue;\n      }\n\n      // Headings — emit an id slug so intra-doc [link](#anchor) jumps work.\n      const heading = /^(#{1,6})\\s+(.*)$/.exec(line);\n      if (heading) {\n        flushPara(); closeList();\n        const level = heading[1].length;\n        const text = heading[2];\n        const id = text.toLowerCase().replace(/[^\\w\\s-]/g, '').trim().replace(/\\s+/g, '-');\n        out.push(`<h${level} id=\"${id}\">${renderInline(text)}</h${level}>`);\n        i++;\n        continue;\n      }\n\n      // List items\n      const li = /^[-*]\\s+(.*)$/.exec(line);\n      if (li) {\n        flushPara();\n        if (!inList) { out.push('<ul>'); inList = true; }\n        out.push(`<li>${renderInline(li[1])}</li>`);\n        i++;\n        continue;\n      }\n\n      // Horizontal rule\n      if (/^---+$/.test(line)) {\n        flushPara(); closeList();\n        out.push('<hr/>');\n        i++;\n        continue;\n      }\n\n      // Blank line breaks paragraphs/lists\n      if (/^\\s*$/.test(line)) {\n        flushPara(); closeList();\n        i++;\n        continue;\n      }\n\n      // Default: collect as paragraph text\n      closeList();\n      inPara.push(line.trim());\n      i++;\n    }\n    flushPara(); closeList();\n\n    return this.sanitizer.bypassSecurityTrustHtml(out.join('\\n'));\n  }\n\n  highlightHtml(html: string): SafeHtml {\n    const escaped = html\n      .replace(/&/g, '&amp;')\n      .replace(/</g, '&lt;')\n      .replace(/>/g, '&gt;');\n\n    let out = escaped.replace(\n      /(&lt;\\/?)([a-zA-Z][a-zA-Z0-9-]*)([^&]*?)(&gt;)/g,\n      (_m, lead, name, attrs, close) => {\n        const attrsHtml = attrs.replace(\n          /(\\s)([a-zA-Z\\-:_]+)(=)(\"[^\"]*\"|'[^']*')/g,\n          (_a: string, ws: string, attr: string, eq: string, val: string) =>\n            `${ws}<span class=\"html-attr\">${attr}</span>${eq}<span class=\"html-string\">${val}</span>`,\n        );\n        return `<span class=\"html-punct\">${lead}</span><span class=\"html-tag\">${name}</span>${attrsHtml}<span class=\"html-punct\">${close}</span>`;\n      },\n    );\n    out = out.replace(/(&lt;!--[\\s\\S]*?--&gt;)/g, '<span class=\"html-comment\">$1</span>');\n    return this.sanitizer.bypassSecurityTrustHtml(out);\n  }\n\n  highlightTemplate(code: string): SafeHtml {\n    const escaped = code\n      .replace(/&/g, '&amp;')\n      .replace(/</g, '&lt;')\n      .replace(/>/g, '&gt;');\n\n    const highlighted = escaped.replace(\n      /(`[\\s\\S]*?`|'[^']*'|\"[^\"]*\"|\\b\\w+Template\\b|\\.([a-z]\\w*)|[(),])/g,\n      (match) => {\n        const ch = match[0];\n        if (ch === '`' || ch === \"'\" || ch === '\"') return `<span class=\"tmpl-string\">${match}</span>`;\n        if (match.endsWith('Template'))             return `<span class=\"tmpl-class\">${match}</span>`;\n        if (ch === '.')                             return `<span class=\"tmpl-method\">${match}</span>`;\n        if (ch === '(' || ch === ')')               return `<span class=\"tmpl-paren\">${match}</span>`;\n        return match;\n      }\n    );\n    return this.sanitizer.bypassSecurityTrustHtml(highlighted);\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { DevElementCacheService } from './dev-element-cache.service';\n\n/**\n * LRU memoization for the inspector's template strings. Keyed on\n * `${elementKey}:${cacheVersion}` — the version counter is bumped by\n * `DevElementCacheService` on every absorb/tombstone, so a cached entry\n * is implicitly invalidated whenever the underlying element changes.\n *\n * Why a service instead of a plain Map: lifecycle (tied to root injector,\n * cleared via `clear()` on cache reset), eviction event reporting (emits\n * `quota` through the cache's event ring so the Internals panel sees\n * memo pressure), and an explicit hit-rate counter for the verification\n * step in the plan.\n */\n\nconst TEMPLATE_MEMO_LIMIT = 50;\n\n@Injectable({ providedIn: 'root' })\nexport class DevTemplateCacheService {\n  // Map iteration order is insertion order, so we re-insert on hit to\n  // keep the LRU ordering correct without a separate doubly-linked list.\n  private memo: Map<string, string> = new Map();\n  private hits = 0;\n  private misses = 0;\n  private evictions = 0;\n\n  constructor(private readonly cache: DevElementCacheService) {}\n\n  /**\n   * Returns the memoized template for `key`, or `null` if absent. Touch\n   * (re-insert) on hit so eviction lands on genuinely cold entries.\n   */\n  get(key: string): string | null {\n    const versionedKey = this.versionedKey(key);\n    if (!versionedKey) return null;\n    const hit = this.memo.get(versionedKey);\n    if (hit === undefined) {\n      this.misses++;\n      return null;\n    }\n    this.hits++;\n    // Re-insert so this entry moves to the most-recent end of the LRU.\n    this.memo.delete(versionedKey);\n    this.memo.set(versionedKey, hit);\n    return hit;\n  }\n\n  /**\n   * Memoize `value` for `key` at the current cache version. Evicts the\n   * oldest entry when the limit is reached and reports the quota event\n   * back through the cache's event ring.\n   */\n  set(key: string, value: string): void {\n    const versionedKey = this.versionedKey(key);\n    if (!versionedKey) return;\n    if (this.memo.has(versionedKey)) {\n      this.memo.delete(versionedKey);\n    }\n    this.memo.set(versionedKey, value);\n    while (this.memo.size > TEMPLATE_MEMO_LIMIT) {\n      const oldest = this.memo.keys().next().value;\n      if (oldest === undefined) break;\n      this.memo.delete(oldest);\n      this.evictions++;\n      this.cache.reportIntegrityViolation({\n        source: 'template-memo',\n        // Reuse the cacheEvent ring with a structured detail. We use\n        // `quota` semantics here but the existing event types route via\n        // reportIntegrityViolation; future split is fine.\n        reason: 'template-memo-overflow',\n        evicted: oldest,\n        cap: TEMPLATE_MEMO_LIMIT,\n      });\n    }\n  }\n\n  /**\n   * Invalidate every memoized template — invoked when the cache resets,\n   * since cacheVersion 0 → 0 wouldn't otherwise expire stale entries.\n   */\n  clear(): void {\n    this.memo.clear();\n    this.hits = 0;\n    this.misses = 0;\n    this.evictions = 0;\n  }\n\n  /**\n   * Diagnostic snapshot for the Internals panel — read-only.\n   */\n  stats(): { size: number; hits: number; misses: number; evictions: number; hitRate: number } {\n    const total = this.hits + this.misses;\n    const hitRate = total > 0 ? this.hits / total : 0;\n    return { size: this.memo.size, hits: this.hits, misses: this.misses, evictions: this.evictions, hitRate };\n  }\n\n  private versionedKey(key: string): string | null {\n    if (!key) return null;\n    return `${key}:${this.cache.getCacheVersion(key)}`;\n  }\n}\n","import { Injectable, NgZone, OnDestroy } from '@angular/core';\nimport { SafeHtml } from '@angular/platform-browser';\nimport { Element as BlueriqElement } from '@blueriq/core';\nimport { Observable, Subject } from 'rxjs';\nimport { JsonToTemplatesComponent, TemplateCancelToken } from '../json-to-templates/json-to-templates.component';\n\nimport { CaptureAnalysis, ElementTreeNode } from '../bq-lens.types';\nimport { analyzeCapture } from '../dev-analysis.utils';\nimport { copyWithFeedback } from '../dev-clipboard.utils';\nimport { generateCsfStory, StoryConfig } from '../dev-csf-generator.utils';\nimport { serializeElement } from '../dev-element-serialization.utils';\nimport { safeJsonParse } from '../dev-json.utils';\nimport { DevElementCacheService, stripInternalFields } from './dev-element-cache.service';\nimport { DevFormatService } from './dev-format.service';\nimport { DevPickerService } from './dev-picker.service';\nimport { DevTemplateCacheService } from './dev-template-cache.service';\n\nconst STORY_PROVIDERS_KEY = 'bq-lens-story-providers';\nconst DEFAULT_STORY_PROVIDERS_PATH = '../../../../stories/storybook-providers';\nconst NAV_HISTORY_LIMIT = 20;\n\ntype ElementViewMode = 'template' | 'json' | 'insights' | 'structure' | 'story';\ntype Breadcrumb = { key: string; type: string; name: string };\n\n/**\n * Owns all element-inspector state: the popup's currently inspected element,\n * its multiple view modes (template / json / insights / structure / story),\n * navigation history, breadcrumbs, picker overlay tracking, and scroll-follow.\n *\n * Provided at the BqLensComponent level so its lifecycle is bound to the\n * panel's lifetime — ngOnDestroy detaches the global scroll listener.\n */\n@Injectable()\nexport class DevInspectorService implements OnDestroy {\n  inspectedElement: BlueriqElement | null = null;\n  inspectedHostEl: HTMLElement | null = null;\n  hasParentElement = false;\n  parentNavKey = 0;\n  inspectedComponentName: string | null = null;\n  inspectedComponentClass: string | null = null;\n  inspectedBlueriqSelector: string | null = null;\n  inspectedBlueriqSelectorPriority: number | null = null;\n  treeCollapsedKeys = new Set<string>();\n\n  elementViewMode: ElementViewMode = 'template';\n  elementTemplate: string | null = null;\n  elementJson: string | null = null;\n  elementTree: ElementTreeNode | null = null;\n  elementStoryCode: string | null = null;\n  highlightedElementTemplate: SafeHtml | null = null;\n  highlightedElementJson: SafeHtml | null = null;\n  highlightedElementStory: SafeHtml | null = null;\n\n  popupPos: { left: number; top: number } | null = null;\n  /** When true, scroll-follow won't re-position the popup. Reset on next inspection. */\n  private _popupManuallyPositioned = false;\n  /** Cached side chosen at first placement. Scroll-follow reuses this so sub-pixel\n   * wobble around the fits-right/fits-left boundary doesn't flip the popup. */\n  private _popupSide: 'left' | 'right' | null = null;\n  breadcrumbs: Breadcrumb[] = [];\n  storyProvidersPath = DEFAULT_STORY_PROVIDERS_PATH;\n  elementCopied = false;\n\n  private _navHistory: Array<{ key: string }> = [];\n  private _historyPos = -1;\n  private _scrollRaf: number | null = null;\n  // Background-warm bookkeeping. The cancel token is flipped when the\n  // inspector navigates again before warming completes — the in-flight\n  // generateTemplateFor call sees `cancelled = true` at the next\n  // recursion boundary and bails out cheap.\n  private _warmIdleHandle: number | null = null;\n  private _warmTimeoutHandle: ReturnType<typeof setTimeout> | null = null;\n  private _warmCancelToken: TemplateCancelToken | null = null;\n\n  /** Emits each time the picker hands a fresh element to the inspector. */\n  private readonly _inspected$ = new Subject<void>();\n  readonly inspected$: Observable<void> = this._inspected$.asObservable();\n\n  readonly onTreeNodeSelect = (key: string): void => this.selectElementByKey(key);\n  readonly onTreeNodeToggle = (key: string): void => {\n    if (this.treeCollapsedKeys.has(key)) this.treeCollapsedKeys.delete(key);\n    else this.treeCollapsedKeys.add(key);\n    this.treeCollapsedKeys = new Set(this.treeCollapsedKeys);\n  };\n\n  constructor(\n    private zone: NgZone,\n    private pickerService: DevPickerService,\n    private cacheService: DevElementCacheService,\n    private formatService: DevFormatService,\n    private templateCache: DevTemplateCacheService,\n  ) {\n    const saved = localStorage.getItem(STORY_PROVIDERS_KEY);\n    if (saved) this.storyProvidersPath = saved;\n  }\n\n  ngOnDestroy(): void {\n    this._cancelWarm();\n    this.closeInspector();\n  }\n\n  get canGoBack(): boolean { return this._historyPos > 0; }\n  get canGoForward(): boolean { return this._historyPos < this._navHistory.length - 1; }\n\n  get elementInsightsData(): CaptureAnalysis | null {\n    const el = safeJsonParse<any>(this.elementJson, null);\n    if (!el?.key) return null;\n    const elements = this.cacheService.collectElementWithDescendants(el.key);\n    if (!elements.length) return null;\n    const analysis = analyzeCapture({ elements });\n    return (analysis.fields.length > 0 || analysis.buttons.length > 0 || analysis.messages.length > 0)\n      ? analysis : null;\n  }\n\n  /**\n   * Read the cached element's bounded `__history` ring directly (without the\n   * `stripInternalFields` pass that scrubs `elementJson`). Returns the entries\n   * verbatim — oldest first, capped at 10 by the cache. Empty array if the\n   * element isn't cached or has never changed value.\n   */\n  get elementHistory(): Array<{ ts: number; value: unknown; captureId?: string }> {\n    const key = this.inspectedElement?.key;\n    if (!key) return [];\n    const cached = this.cacheService.getElement(key);\n    return Array.isArray(cached?.__history) ? cached.__history : [];\n  }\n\n  /** URLs that touched this element. Empty when uncached or never observed. */\n  get elementSources(): string[] {\n    const key = this.inspectedElement?.key;\n    if (!key) return [];\n    const cached = this.cacheService.getElement(key);\n    return Array.isArray(cached?.__sources) ? cached.__sources : [];\n  }\n\n  /** Capture ids that touched this element. */\n  get elementCapturedIn(): string[] {\n    const key = this.inspectedElement?.key;\n    if (!key) return [];\n    const cached = this.cacheService.getElement(key);\n    return Array.isArray(cached?.__capturedIn) ? cached.__capturedIn : [];\n  }\n\n  /** Picker callback: apply the new element and record it in history + breadcrumbs. */\n  applyAndPushHistory(host: HTMLElement, element: BlueriqElement): void {\n    this._applyElement(host, element);\n    this.parentNavKey++;\n    this._pushHistory(element.key);\n    this._buildBreadcrumbs(host);\n    this._inspected$.next();\n  }\n\n  selectParentElement(): void {\n    if (!this.inspectedHostEl?.parentElement) return;\n    const { element, host } = this.pickerService.findElementAndHost(this.inspectedHostEl.parentElement);\n    if (!element) return;\n    this._applyElement(host, element);\n    this.parentNavKey++;\n    this._pushHistory(element.key);\n    this._buildBreadcrumbs(host);\n    this.pickerService.flashOverlay();\n  }\n\n  navigateBack(): void {\n    if (!this.canGoBack) return;\n    this._historyPos--;\n    this._navigateToKey(this._navHistory[this._historyPos].key);\n  }\n\n  navigateForward(): void {\n    if (!this.canGoForward) return;\n    this._historyPos++;\n    this._navigateToKey(this._navHistory[this._historyPos].key);\n  }\n\n  selectElementByKey(key: string): void {\n    const root = this.inspectedHostEl ?? document.body;\n    let host = this.pickerService.findHostByKey(key, root);\n    if (!host && root !== document.body) {\n      host = this.pickerService.findHostByKey(key, document.body);\n    }\n    if (!host) {\n      if (this.cacheService.getElement(key)) {\n        this._showElementFromCache(key);\n      } else {\n        console.warn('[DevPanel] selectElementByKey: no DOM host or cache entry for key', key);\n      }\n      return;\n    }\n    const { element } = this.pickerService.findElementAndHost(host);\n    if (!element) {\n      if (this.cacheService.getElement(key)) {\n        this._showElementFromCache(key);\n      } else {\n        console.warn('[DevPanel] selectElementByKey: host found but blueriqElementOf returned null', host);\n      }\n      return;\n    }\n    this._applyElement(host, element);\n    this.parentNavKey++;\n    this._pushHistory(element.key);\n    this._buildBreadcrumbs(host);\n  }\n\n  copyInspectedElement(): Promise<void> {\n    const text = this.elementViewMode === 'template' ? this.elementTemplate\n      : this.elementViewMode === 'story' ? this.elementStoryCode\n      : this.elementJson;\n    return copyWithFeedback(this, 'elementCopied', text);\n  }\n\n  closeInspector(): void {\n    this._detachScrollFollow();\n    this.pickerService.removeOverlay();\n    this.inspectedHostEl = null;\n    this.inspectedElement = null;\n    this.hasParentElement = false;\n    this.popupPos = null;\n    this._popupSide = null;\n    this.elementTemplate = null;\n    this.elementJson = null;\n    this.elementTree = null;\n    this.elementStoryCode = null;\n    this.highlightedElementStory = null;\n    this.highlightedElementTemplate = null;\n    this.highlightedElementJson = null;\n    this.breadcrumbs = [];\n    this._navHistory = [];\n    this._historyPos = -1;\n    this.treeCollapsedKeys = new Set();\n    this.inspectedComponentName = null;\n    this.inspectedComponentClass = null;\n    this.inspectedBlueriqSelector = null;\n    this.inspectedBlueriqSelectorPriority = null;\n  }\n\n  updateStoryProvidersPath(path: string): void {\n    this.storyProvidersPath = path;\n    localStorage.setItem(STORY_PROVIDERS_KEY, path);\n    const obj = safeJsonParse<any>(this.elementJson, null);\n    if (!obj) return;\n    this.elementStoryCode = generateCsfStory(obj, this._storyConfig());\n    if (this.elementStoryCode) {\n      this.highlightedElementStory = this.formatService.highlightStory(this.elementStoryCode);\n    }\n  }\n\n  /** Navigate to a key without pushing to history (used by back/forward). */\n  private _navigateToKey(key: string): void {\n    const host = this.pickerService.findHostByKey(key, document.body);\n    if (!host) {\n      console.warn('[DevPanel] _navigateToKey: no DOM host found for key', key);\n      return;\n    }\n    const { element } = this.pickerService.findElementAndHost(host);\n    if (!element) return;\n    this._applyElement(host, element);\n    this.parentNavKey++;\n    this._buildBreadcrumbs(host);\n  }\n\n  /**\n   * Core \"show this element in the inspector\" sequence used by all navigation\n   * paths (parent, back/forward, tree, breadcrumb, and picker). Callers are\n   * responsible for parentNavKey++, history push, and breadcrumb rebuild.\n   */\n  private _applyElement(host: HTMLElement, element: BlueriqElement): void {\n    this._cancelWarm();\n    this._detachScrollFollow();\n    this._popupManuallyPositioned = false;\n    this._popupSide = null;\n    this.pickerService.animateOverlay();\n    this.inspectedHostEl = host;\n    this.pickerService.showOverlay(host);\n    this.pickerService.scrollToHostIfNeeded(host);\n    this.inspectedElement = element;\n    this.elementTemplate = null;\n    this.elementJson = null;\n    this.elementTree = null;\n    this.highlightedElementTemplate = null;\n    this.highlightedElementJson = null;\n    this.generateElementInfo(element);\n    this._fixViewModeAfterNav();\n    const isPage = element.type === 'page';\n    this.positionPopup(host, isPage ? 600 : 440, isPage ? 700 : 480);\n    this._attachScrollFollow();\n    this.hasParentElement = host.parentElement\n      ? !!this.pickerService.findElementAndHost(host.parentElement).element\n      : false;\n    const cls = this.pickerService.getComponentClass(host);\n    this.inspectedComponentName = cls ? (this.pickerService.getAngularSelector(cls) ?? cls.name) : null;\n    this.inspectedComponentClass = cls ? cls.name : null;\n    this.inspectedBlueriqSelector = cls ? this.pickerService.getBlueriqSelector(host, cls) : null;\n    this.inspectedBlueriqSelectorPriority = cls ? this.pickerService.getBlueriqSelectorPriority(cls) : null;\n    this._scheduleWarm(host, element);\n  }\n\n  /**\n   * Schedule background generation of templates for likely next-navigations\n   * — the parent (back button) and immediate children (drill-down). Runs\n   * via `requestIdleCallback` so the active inspection's renderer has the\n   * main thread first; falls back to `setTimeout` where rIC isn't shipped.\n   * Cancellable: a new `_applyElement` call flips the token before the\n   * warm runs to completion, and the in-flight generation sees\n   * `cancelled = true` at its next recursion boundary.\n   */\n  private _scheduleWarm(host: HTMLElement, element: BlueriqElement): void {\n    const candidates: Array<{ element: BlueriqElement; host: HTMLElement }> = [];\n    if (host.parentElement) {\n      const parent = this.pickerService.findElementAndHost(host.parentElement);\n      if (parent.element && parent.element.key !== element.key) {\n        candidates.push({ element: parent.element, host: parent.host });\n      }\n    }\n    for (const child of this.pickerService.findImmediateBlueriqChildren(host)) {\n      if (child.element.key !== element.key) candidates.push(child);\n    }\n    if (!candidates.length) return;\n\n    const token: TemplateCancelToken = { cancelled: false };\n    this._warmCancelToken = token;\n    const runWarm = () => {\n      if (token.cancelled) return;\n      const converter = new JsonToTemplatesComponent();\n      for (const c of candidates) {\n        if (token.cancelled) return;\n        if (this.templateCache.get(c.element.key) !== null) continue;\n        try {\n          const raw = converter.generateTemplateFor(c.element, true, false, true, undefined, token);\n          if (token.cancelled) return;\n          this.templateCache.set(c.element.key, raw);\n        } catch {\n          // Background warm is best-effort — a generation failure here\n          // is fine; the foreground path will report the same error if\n          // the user navigates to this element.\n        }\n      }\n    };\n\n    const win = window as Window & {\n      requestIdleCallback?: (cb: () => void, opts?: { timeout: number }) => number;\n      cancelIdleCallback?: (h: number) => void;\n    };\n    if (typeof win.requestIdleCallback === 'function') {\n      this._warmIdleHandle = win.requestIdleCallback(runWarm, { timeout: 1000 });\n    } else {\n      this._warmTimeoutHandle = setTimeout(runWarm, 50);\n    }\n  }\n\n  private _cancelWarm(): void {\n    if (this._warmCancelToken) {\n      this._warmCancelToken.cancelled = true;\n      this._warmCancelToken = null;\n    }\n    if (this._warmIdleHandle !== null) {\n      const win = window as Window & { cancelIdleCallback?: (h: number) => void };\n      win.cancelIdleCallback?.(this._warmIdleHandle);\n      this._warmIdleHandle = null;\n    }\n    if (this._warmTimeoutHandle !== null) {\n      clearTimeout(this._warmTimeoutHandle);\n      this._warmTimeoutHandle = null;\n    }\n  }\n\n  private _pushHistory(key: string): void {\n    this._navHistory = this._navHistory.slice(0, this._historyPos + 1);\n    this._navHistory.push({ key });\n    if (this._navHistory.length > NAV_HISTORY_LIMIT) {\n      this._navHistory.shift();\n    } else {\n      this._historyPos++;\n    }\n  }\n\n  private _buildBreadcrumbs(hostEl: HTMLElement): void {\n    const crumbs: Breadcrumb[] = [];\n    let search: HTMLElement | null = hostEl.parentElement;\n    while (search && search !== document.body) {\n      const { element, host } = this.pickerService.findElementAndHost(search);\n      if (!element) break;\n      crumbs.unshift({\n        key: element.key,\n        type: element.type,\n        name: (element as any).displayName || (element as any).name || element.key,\n      });\n      search = host.parentElement;\n    }\n    this.breadcrumbs = crumbs;\n  }\n\n  /**\n   * Show element details from the cache when the live DOM host cannot be found.\n   * Works for JSON / insights / structure views; template requires a live element\n   * so we fall back to JSON when that mode is active.\n   */\n  private _showElementFromCache(key: string): void {\n    const cached = this.cacheService.getElement(key);\n    if (!cached) return;\n\n    // Strip internal `__*` keys before anything user-facing — JSON view,\n    // clipboard, story all read from `obj`. The structure tree consumes\n    // `__truncated` directly off `buildEnrichedJson`, so it goes through\n    // _recomputeElementTree which re-derives from cache without the strip.\n    const obj = stripInternalFields(this.cacheService.buildEnrichedJson(key));\n    const json = JSON.stringify(obj, null, 2);\n    this.elementJson = json;\n    this._recomputeElementTree();\n    this.highlightedElementJson = this.formatService.highlightJson(json);\n    this.elementStoryCode = generateCsfStory(obj);\n    this.highlightedElementStory = this.formatService.highlightStory(this.elementStoryCode);\n    this.elementTemplate = null;\n    this.highlightedElementTemplate = null;\n\n    this.inspectedElement = {\n      key: cached.key ?? key,\n      type: cached.type ?? 'unknown',\n      functionalKey: cached.functionalKey ?? key,\n      name: cached.name ?? cached.displayName ?? cached.functionalKey ?? key,\n    } as any;\n\n    if (this.elementViewMode === 'template') {\n      this.elementViewMode = 'json';\n    }\n\n    this._fixViewModeAfterNav();\n\n    this.hasParentElement = false;\n    this.parentNavKey++;\n    this._pushHistory(key);\n    this.breadcrumbs = this.cacheService.buildBreadcrumbsFromKey(key);\n  }\n\n  /** After navigating to a new element, fall back to JSON if the current view mode has no content. */\n  private _fixViewModeAfterNav(): void {\n    if (this.elementViewMode === 'insights' && !this.elementInsightsData) {\n      this.elementViewMode = 'json';\n    } else if (this.elementViewMode === 'structure' && !this.elementTree) {\n      this.elementViewMode = 'json';\n    } else if (this.elementViewMode === 'story' && !this.elementStoryCode) {\n      this.elementViewMode = 'json';\n    }\n  }\n\n  private generateElementInfo(el: BlueriqElement): void {\n    try {\n      // Memoized on `${key}:${cacheVersion}` — a view-mode flip or a\n      // back-and-forth navigation hits the memo instead of running the\n      // full ~1200 LOC template generator again. The version counter\n      // bumps on every cache write, so a stale memo can't escape an\n      // element-update boundary.\n      let raw = this.templateCache.get(el.key);\n      if (raw === null) {\n        const converter = new JsonToTemplatesComponent();\n        raw = converter.generateTemplateFor(el, true, false, true);\n        this.templateCache.set(el.key, raw);\n      }\n      this.elementTemplate = this.formatService.formatTemplate(raw);\n      this.highlightedElementTemplate = this.formatService.highlightTemplate(this.elementTemplate);\n    } catch (err) {\n      console.error('[DevPanel] generateElementInfo – template failed:', err);\n      this.elementTemplate = '// Could not generate template for this element.';\n      this.highlightedElementTemplate = null;\n    }\n\n    try {\n      let obj: Record<string, unknown>;\n      if (this.cacheService.getElement(el.key)) {\n        obj = stripInternalFields(this.cacheService.buildEnrichedJson(el.key));\n      } else {\n        obj = serializeElement(el);\n        const cacheEntry = {\n          ...obj,\n          children: Array.isArray(obj['children'])\n            ? (obj['children'] as any[]).map((c: any) => (typeof c === 'string' ? c : c.key))\n            : [],\n        };\n        this.cacheService.mergeElements({ elements: [cacheEntry] });\n      }\n      const json = JSON.stringify(obj, null, 2);\n      this.elementJson = json;\n      this._recomputeElementTree();\n      this.highlightedElementJson = this.formatService.highlightJson(json);\n      this.elementStoryCode = generateCsfStory(obj, this._storyConfig());\n      this.highlightedElementStory = this.formatService.highlightStory(this.elementStoryCode);\n    } catch (err) {\n      console.error('[DevPanel] generateElementInfo – JSON failed:', err);\n      this.elementJson = '{}';\n      this.elementTree = null;\n      this.highlightedElementJson = null;\n      this.elementStoryCode = null;\n      this.highlightedElementStory = null;\n    }\n  }\n\n  private _recomputeElementTree(): void {\n    const el = safeJsonParse<any>(this.elementJson, null);\n    this.elementTree = el?.key ? this.cacheService.buildTree(el.key) : null;\n  }\n\n  private _storyConfig(): StoryConfig {\n    return { providersPath: this.storyProvidersPath };\n  }\n\n  private positionPopup(hostEl: HTMLElement, popupW = 440, popupH = 480): void {\n    // Treat the docked dev panel as off-limits — getBoundingClientRect honors\n    // the slide-out transform, so a closed panel reports an off-screen rect\n    // and naturally drops out of the exclusion.\n    const panel = document.querySelector('.dev-panel') as HTMLElement | null;\n    const panelRect = panel?.getBoundingClientRect() ?? null;\n    const excludeRect = panelRect\n      ? { left: panelRect.left, right: panelRect.right }\n      : null;\n    const result = this.pickerService.positionPopup(hostEl, popupW, popupH, this._popupSide, excludeRect);\n    this.popupPos = { left: result.left, top: result.top };\n    this._popupSide = result.side;\n  }\n\n  /** External callers (e.g. cross-ref jumps) can pin the popup; scroll-follow respects this until next inspection. */\n  setManualPopupPos(pos: { left: number; top: number }): void {\n    this.popupPos = pos;\n    this._popupManuallyPositioned = true;\n  }\n\n  private readonly _onScroll = (): void => {\n    if (this._scrollRaf !== null) return;\n    this._scrollRaf = requestAnimationFrame(() => {\n      this._scrollRaf = null;\n      if (!this.inspectedHostEl) return;\n      this.pickerService.updateOverlayRect(this.inspectedHostEl);\n      if (this._popupManuallyPositioned) return;\n      const isPage = this.inspectedElement?.type === 'page';\n      this.zone.run(() => {\n        if (this.inspectedHostEl) {\n          this.positionPopup(this.inspectedHostEl, isPage ? 600 : 440, isPage ? 700 : 480);\n        }\n      });\n    });\n  };\n\n  private _attachScrollFollow(): void {\n    window.addEventListener('scroll', this._onScroll, { capture: true, passive: true });\n  }\n\n  private _detachScrollFollow(): void {\n    window.removeEventListener('scroll', this._onScroll, true);\n    if (this._scrollRaf !== null) {\n      cancelAnimationFrame(this._scrollRaf);\n      this._scrollRaf = null;\n    }\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { BQ_LENS_STORAGE_KEYS, safeRead, safeRemove, safeWrite } from '../dev-storage.utils';\n\nexport type TourId = 'main' | 'inspector';\n\nconst DONE_KEYS: Record<TourId, string> = {\n  main: BQ_LENS_STORAGE_KEYS.tourDoneMain,\n  inspector: BQ_LENS_STORAGE_KEYS.tourDoneInspector,\n};\n\nexport interface TourStep {\n  // CSS selector, queried against `document` at step-render time.\n  // null = center modal (no spotlight, no anchor).\n  target: string | null;\n  title: string;\n  body: string;\n  placement?: 'right' | 'left' | 'top' | 'bottom';\n  // Optional inline SVG wireframe rendered above the body. Use `currentColor`\n  // for stroke/fill so it picks up the surrounding text color.\n  wireframe?: string;\n}\n\n// Wireframes use viewBox 420×140 and `currentColor` strokes so they tint\n// with the surrounding text. Solid fill = primary chip; fill-opacity 0.18 =\n// muted chip; 0.10 = subtle section background.\nconst WF_WELCOME = `\n<svg viewBox=\"0 0 420 140\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n  <!-- Browser window -->\n  <rect x=\"14\" y=\"14\" width=\"280\" height=\"112\" rx=\"4\"/>\n  <line x1=\"14\" y1=\"30\" x2=\"294\" y2=\"30\"/>\n  <circle cx=\"22\" cy=\"22\" r=\"1.6\"/><circle cx=\"29\" cy=\"22\" r=\"1.6\"/><circle cx=\"36\" cy=\"22\" r=\"1.6\"/>\n  <rect x=\"48\" y=\"18\" width=\"120\" height=\"8\" rx=\"2\" fill=\"currentColor\" fill-opacity=\"0.10\" stroke=\"none\"/>\n  <!-- Page content lines -->\n  <line x1=\"28\" y1=\"46\" x2=\"180\" y2=\"46\"/>\n  <line x1=\"28\" y1=\"58\" x2=\"220\" y2=\"58\"/>\n  <line x1=\"28\" y1=\"70\" x2=\"160\" y2=\"70\"/>\n  <line x1=\"28\" y1=\"82\" x2=\"200\" y2=\"82\"/>\n  <line x1=\"28\" y1=\"94\" x2=\"140\" y2=\"94\"/>\n  <line x1=\"28\" y1=\"106\" x2=\"180\" y2=\"106\"/>\n  <!-- bq-lens panel docked right of the browser -->\n  <rect x=\"306\" y=\"14\" width=\"100\" height=\"112\" rx=\"4\" fill=\"currentColor\" fill-opacity=\"0.06\"/>\n  <rect x=\"306\" y=\"14\" width=\"100\" height=\"18\" rx=\"0\" fill=\"currentColor\" fill-opacity=\"0.85\" stroke=\"none\"/>\n  <!-- Action buttons inside panel -->\n  <rect x=\"314\" y=\"42\" width=\"84\" height=\"14\" rx=\"2\" fill=\"currentColor\" fill-opacity=\"0.18\" stroke=\"none\"/>\n  <rect x=\"314\" y=\"62\" width=\"84\" height=\"14\" rx=\"2\" fill=\"currentColor\" fill-opacity=\"0.18\" stroke=\"none\"/>\n  <!-- Capture rows -->\n  <rect x=\"314\" y=\"84\" width=\"84\" height=\"10\" rx=\"1.5\"/>\n  <rect x=\"316\" y=\"86.5\" width=\"14\" height=\"5\" rx=\"1\" fill=\"currentColor\" stroke=\"none\"/>\n  <rect x=\"314\" y=\"98\" width=\"84\" height=\"10\" rx=\"1.5\"/>\n  <rect x=\"316\" y=\"100.5\" width=\"14\" height=\"5\" rx=\"1\" fill=\"currentColor\" fill-opacity=\"0.5\" stroke=\"none\"/>\n  <rect x=\"314\" y=\"112\" width=\"84\" height=\"10\" rx=\"1.5\"/>\n  <rect x=\"316\" y=\"114.5\" width=\"14\" height=\"5\" rx=\"1\" fill=\"currentColor\" fill-opacity=\"0.5\" stroke=\"none\"/>\n</svg>`;\n\nconst WF_HANDLE = `\n<svg viewBox=\"0 0 420 140\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n  <!-- Browser viewport, slightly narrower so the floating tab pokes out at right -->\n  <rect x=\"14\" y=\"14\" width=\"370\" height=\"112\" rx=\"4\"/>\n  <line x1=\"14\" y1=\"30\" x2=\"384\" y2=\"30\"/>\n  <circle cx=\"22\" cy=\"22\" r=\"1.6\"/><circle cx=\"29\" cy=\"22\" r=\"1.6\"/><circle cx=\"36\" cy=\"22\" r=\"1.6\"/>\n  <!-- Faint page content -->\n  <line x1=\"28\" y1=\"46\" x2=\"280\" y2=\"46\" stroke-opacity=\"0.5\"/>\n  <line x1=\"28\" y1=\"58\" x2=\"320\" y2=\"58\" stroke-opacity=\"0.5\"/>\n  <line x1=\"28\" y1=\"70\" x2=\"240\" y2=\"70\" stroke-opacity=\"0.5\"/>\n  <line x1=\"28\" y1=\"82\" x2=\"300\" y2=\"82\" stroke-opacity=\"0.5\"/>\n  <line x1=\"28\" y1=\"94\" x2=\"200\" y2=\"94\" stroke-opacity=\"0.5\"/>\n  <line x1=\"28\" y1=\"106\" x2=\"260\" y2=\"106\" stroke-opacity=\"0.5\"/>\n  <!-- The floating LENS tab (right-docked, vertical text) -->\n  <rect x=\"368\" y=\"48\" width=\"22\" height=\"56\" rx=\"3\" fill=\"currentColor\" stroke=\"none\"/>\n  <text x=\"379\" y=\"86\" fill=\"#fff\" stroke=\"none\" font-family=\"monospace\" font-size=\"11\" font-weight=\"700\" text-anchor=\"middle\" transform=\"rotate(-90 379 86)\" letter-spacing=\"2\">LENS</text>\n  <!-- Drag affordance indicator (chevrons up & down) -->\n  <path d=\"M395 60 l-4 -4 l-4 4\" stroke-width=\"1.2\"/>\n  <path d=\"M395 92 l-4 4 l-4 -4\" stroke-width=\"1.2\"/>\n  <!-- Status dot on tab -->\n  <circle cx=\"379\" cy=\"58\" r=\"2.2\" fill=\"#fff\" stroke=\"none\"/>\n</svg>`;\n\nconst WF_CAPTURES = `\n<svg viewBox=\"0 0 420 140\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n  <!-- Panel surface -->\n  <rect x=\"60\" y=\"10\" width=\"300\" height=\"120\" rx=\"4\"/>\n  <!-- Header bar (primary fill) -->\n  <rect x=\"60\" y=\"10\" width=\"300\" height=\"20\" rx=\"0\" fill=\"currentColor\" stroke=\"none\"/>\n  <circle cx=\"72\" cy=\"20\" r=\"2.4\" fill=\"#fff\" stroke=\"none\"/>\n  <rect x=\"80\" y=\"16\" width=\"60\" height=\"8\" rx=\"1.5\" fill=\"#fff\" fill-opacity=\"0.6\" stroke=\"none\"/>\n  <!-- Tab switcher: Captures (active) / Sessions -->\n  <rect x=\"74\" y=\"40\" width=\"86\" height=\"16\" rx=\"2\" fill=\"currentColor\" stroke=\"none\"/>\n  <text x=\"117\" y=\"52\" fill=\"#fff\" stroke=\"none\" font-family=\"sans-serif\" font-size=\"9\" font-weight=\"700\" text-anchor=\"middle\">Captures</text>\n  <rect x=\"164\" y=\"40\" width=\"86\" height=\"16\" rx=\"2\" fill=\"currentColor\" fill-opacity=\"0.10\" stroke=\"none\"/>\n  <text x=\"207\" y=\"52\" fill=\"currentColor\" stroke=\"none\" font-family=\"sans-serif\" font-size=\"9\" font-weight=\"600\" text-anchor=\"middle\">Sessions</text>\n  <!-- Capture rows: method chip, status dot, URL -->\n  <g font-family=\"monospace\" font-size=\"7\" font-weight=\"700\">\n    <rect x=\"74\" y=\"64\" width=\"272\" height=\"14\" rx=\"2\"/>\n    <rect x=\"78\" y=\"67\" width=\"22\" height=\"8\" rx=\"1.5\" fill=\"currentColor\" stroke=\"none\"/>\n    <text x=\"89\" y=\"73\" fill=\"#fff\" stroke=\"none\" text-anchor=\"middle\">GET</text>\n    <text x=\"106\" y=\"73\" stroke=\"none\" fill=\"currentColor\" font-weight=\"600\">200</text>\n    <line x1=\"124\" y1=\"71\" x2=\"338\" y2=\"71\" stroke-opacity=\"0.45\"/>\n\n    <rect x=\"74\" y=\"82\" width=\"272\" height=\"14\" rx=\"2\"/>\n    <rect x=\"78\" y=\"85\" width=\"22\" height=\"8\" rx=\"1.5\" fill=\"currentColor\" fill-opacity=\"0.6\" stroke=\"none\"/>\n    <text x=\"89\" y=\"91\" fill=\"#fff\" stroke=\"none\" text-anchor=\"middle\">PUT</text>\n    <text x=\"106\" y=\"91\" stroke=\"none\" fill=\"currentColor\" font-weight=\"600\">200</text>\n    <line x1=\"124\" y1=\"89\" x2=\"320\" y2=\"89\" stroke-opacity=\"0.45\"/>\n\n    <rect x=\"74\" y=\"100\" width=\"272\" height=\"14\" rx=\"2\" fill=\"currentColor\" fill-opacity=\"0.06\"/>\n    <rect x=\"78\" y=\"103\" width=\"22\" height=\"8\" rx=\"1.5\" fill=\"currentColor\" fill-opacity=\"0.6\" stroke=\"none\"/>\n    <text x=\"89\" y=\"109\" fill=\"#fff\" stroke=\"none\" text-anchor=\"middle\">PUT</text>\n    <text x=\"106\" y=\"109\" stroke=\"none\" fill=\"currentColor\" font-weight=\"600\">200</text>\n    <line x1=\"124\" y1=\"107\" x2=\"332\" y2=\"107\" stroke-opacity=\"0.45\"/>\n\n    <rect x=\"74\" y=\"118\" width=\"272\" height=\"8\" rx=\"2\"/>\n  </g>\n</svg>`;\n\nconst WF_PICKER = `\n<svg viewBox=\"0 0 420 140\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n  <!-- Page on the left with three element rectangles -->\n  <rect x=\"14\" y=\"14\" width=\"200\" height=\"112\" rx=\"4\"/>\n  <line x1=\"14\" y1=\"30\" x2=\"214\" y2=\"30\"/>\n  <circle cx=\"22\" cy=\"22\" r=\"1.6\"/><circle cx=\"29\" cy=\"22\" r=\"1.6\"/><circle cx=\"36\" cy=\"22\" r=\"1.6\"/>\n  <rect x=\"28\" y=\"42\" width=\"80\" height=\"22\" rx=\"3\"/>\n  <rect x=\"116\" y=\"42\" width=\"80\" height=\"22\" rx=\"3\"/>\n  <!-- The targeted element: highlighted with primary fill -->\n  <rect x=\"28\" y=\"74\" width=\"168\" height=\"40\" rx=\"3\" fill=\"currentColor\" fill-opacity=\"0.18\" stroke=\"currentColor\" stroke-width=\"2\"/>\n  <line x1=\"42\" y1=\"86\" x2=\"140\" y2=\"86\" stroke-opacity=\"0.5\"/>\n  <line x1=\"42\" y1=\"96\" x2=\"120\" y2=\"96\" stroke-opacity=\"0.5\"/>\n  <line x1=\"42\" y1=\"106\" x2=\"160\" y2=\"106\" stroke-opacity=\"0.5\"/>\n  <!-- Crosshair on the highlighted element -->\n  <circle cx=\"112\" cy=\"94\" r=\"14\" stroke-width=\"1.8\"/>\n  <line x1=\"112\" y1=\"74\" x2=\"112\" y2=\"86\" stroke-width=\"1.8\"/>\n  <line x1=\"112\" y1=\"102\" x2=\"112\" y2=\"114\" stroke-width=\"1.8\"/>\n  <line x1=\"92\" y1=\"94\" x2=\"104\" y2=\"94\" stroke-width=\"1.8\"/>\n  <line x1=\"120\" y1=\"94\" x2=\"132\" y2=\"94\" stroke-width=\"1.8\"/>\n  <circle cx=\"112\" cy=\"94\" r=\"2\" fill=\"currentColor\" stroke=\"none\"/>\n  <!-- Connector line from element to inspector popup -->\n  <path d=\"M196 94 q14 -8 28 -10\" stroke-dasharray=\"3 3\" stroke-opacity=\"0.6\"/>\n  <!-- Inspector popup on the right -->\n  <rect x=\"226\" y=\"20\" width=\"180\" height=\"106\" rx=\"4\" fill=\"currentColor\" fill-opacity=\"0.04\"/>\n  <rect x=\"226\" y=\"20\" width=\"180\" height=\"18\" rx=\"0\" fill=\"currentColor\" stroke=\"none\"/>\n  <rect x=\"234\" y=\"26\" width=\"80\" height=\"6\" rx=\"1\" fill=\"#fff\" fill-opacity=\"0.55\" stroke=\"none\"/>\n  <!-- Tab strip -->\n  <rect x=\"234\" y=\"44\" width=\"30\" height=\"10\" rx=\"1.5\" fill=\"currentColor\" stroke=\"none\"/>\n  <rect x=\"266\" y=\"44\" width=\"30\" height=\"10\" rx=\"1.5\" fill=\"currentColor\" fill-opacity=\"0.18\" stroke=\"none\"/>\n  <rect x=\"298\" y=\"44\" width=\"30\" height=\"10\" rx=\"1.5\" fill=\"currentColor\" fill-opacity=\"0.18\" stroke=\"none\"/>\n  <rect x=\"330\" y=\"44\" width=\"30\" height=\"10\" rx=\"1.5\" fill=\"currentColor\" fill-opacity=\"0.18\" stroke=\"none\"/>\n  <rect x=\"362\" y=\"44\" width=\"30\" height=\"10\" rx=\"1.5\" fill=\"currentColor\" fill-opacity=\"0.18\" stroke=\"none\"/>\n  <!-- Body content -->\n  <line x1=\"234\" y1=\"66\" x2=\"394\" y2=\"66\" stroke-opacity=\"0.55\"/>\n  <line x1=\"234\" y1=\"76\" x2=\"380\" y2=\"76\" stroke-opacity=\"0.55\"/>\n  <line x1=\"234\" y1=\"86\" x2=\"366\" y2=\"86\" stroke-opacity=\"0.55\"/>\n  <line x1=\"234\" y1=\"96\" x2=\"386\" y2=\"96\" stroke-opacity=\"0.55\"/>\n  <line x1=\"234\" y1=\"106\" x2=\"370\" y2=\"106\" stroke-opacity=\"0.55\"/>\n  <line x1=\"234\" y1=\"116\" x2=\"350\" y2=\"116\" stroke-opacity=\"0.55\"/>\n</svg>`;\n\nconst WF_SEARCH = `\n<svg viewBox=\"0 0 420 140\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n  <!-- Search overlay frame -->\n  <rect x=\"40\" y=\"12\" width=\"340\" height=\"116\" rx=\"4\" fill=\"currentColor\" fill-opacity=\"0.04\"/>\n  <!-- Search input -->\n  <rect x=\"56\" y=\"22\" width=\"308\" height=\"22\" rx=\"3\"/>\n  <circle cx=\"68\" cy=\"33\" r=\"4\"/>\n  <line x1=\"71\" y1=\"36\" x2=\"76\" y2=\"41\"/>\n  <text x=\"84\" y=\"37\" stroke=\"none\" fill=\"currentColor\" font-family=\"sans-serif\" font-size=\"9\" fill-opacity=\"0.55\">Search elements…</text>\n  <!-- Result rows: type chip + name + value -->\n  <g font-family=\"monospace\" font-size=\"7\" font-weight=\"700\">\n    <rect x=\"56\" y=\"52\" width=\"308\" height=\"20\" rx=\"2\" fill=\"currentColor\" fill-opacity=\"0.10\"/>\n    <rect x=\"62\" y=\"58\" width=\"32\" height=\"8\" rx=\"1.5\" fill=\"currentColor\" stroke=\"none\"/>\n    <text x=\"78\" y=\"64.5\" fill=\"#fff\" stroke=\"none\" text-anchor=\"middle\">field</text>\n    <line x1=\"100\" y1=\"62\" x2=\"200\" y2=\"62\"/>\n    <line x1=\"208\" y1=\"62\" x2=\"356\" y2=\"62\" stroke-opacity=\"0.45\"/>\n\n    <rect x=\"56\" y=\"76\" width=\"308\" height=\"20\" rx=\"2\"/>\n    <rect x=\"62\" y=\"82\" width=\"32\" height=\"8\" rx=\"1.5\" fill=\"currentColor\" fill-opacity=\"0.6\" stroke=\"none\"/>\n    <text x=\"78\" y=\"88.5\" fill=\"#fff\" stroke=\"none\" text-anchor=\"middle\">link</text>\n    <line x1=\"100\" y1=\"86\" x2=\"180\" y2=\"86\"/>\n    <line x1=\"188\" y1=\"86\" x2=\"340\" y2=\"86\" stroke-opacity=\"0.45\"/>\n\n    <rect x=\"56\" y=\"100\" width=\"308\" height=\"20\" rx=\"2\"/>\n    <rect x=\"62\" y=\"106\" width=\"32\" height=\"8\" rx=\"1.5\" fill=\"currentColor\" fill-opacity=\"0.45\" stroke=\"none\"/>\n    <text x=\"78\" y=\"112.5\" fill=\"#fff\" stroke=\"none\" text-anchor=\"middle\">btn</text>\n    <line x1=\"100\" y1=\"110\" x2=\"220\" y2=\"110\"/>\n    <line x1=\"228\" y1=\"110\" x2=\"346\" y2=\"110\" stroke-opacity=\"0.45\"/>\n  </g>\n</svg>`;\n\nconst WF_PAGE = `\n<svg viewBox=\"0 0 420 140\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n  <!-- Large modal -->\n  <rect x=\"20\" y=\"10\" width=\"380\" height=\"120\" rx=\"4\"/>\n  <!-- Title bar -->\n  <rect x=\"20\" y=\"10\" width=\"380\" height=\"18\" rx=\"0\" fill=\"currentColor\" stroke=\"none\"/>\n  <rect x=\"28\" y=\"16\" width=\"100\" height=\"6\" rx=\"1\" fill=\"#fff\" fill-opacity=\"0.55\" stroke=\"none\"/>\n  <circle cx=\"390\" cy=\"19\" r=\"2\" fill=\"#fff\" stroke=\"none\"/>\n  <!-- Tab strip: 5 tabs, second active -->\n  <g font-family=\"sans-serif\" font-size=\"8\" font-weight=\"600\">\n    <rect x=\"28\" y=\"34\" width=\"50\" height=\"14\" rx=\"2\" fill=\"currentColor\" fill-opacity=\"0.10\" stroke=\"none\"/>\n    <text x=\"53\" y=\"44\" fill=\"currentColor\" stroke=\"none\" text-anchor=\"middle\">JSON</text>\n    <rect x=\"82\" y=\"34\" width=\"60\" height=\"14\" rx=\"2\" fill=\"currentColor\" stroke=\"none\"/>\n    <text x=\"112\" y=\"44\" fill=\"#fff\" stroke=\"none\" text-anchor=\"middle\">Template</text>\n    <rect x=\"146\" y=\"34\" width=\"50\" height=\"14\" rx=\"2\" fill=\"currentColor\" fill-opacity=\"0.10\" stroke=\"none\"/>\n    <text x=\"171\" y=\"44\" fill=\"currentColor\" stroke=\"none\" text-anchor=\"middle\">Tree</text>\n    <rect x=\"200\" y=\"34\" width=\"60\" height=\"14\" rx=\"2\" fill=\"currentColor\" fill-opacity=\"0.10\" stroke=\"none\"/>\n    <text x=\"230\" y=\"44\" fill=\"currentColor\" stroke=\"none\" text-anchor=\"middle\">Insights</text>\n    <rect x=\"264\" y=\"34\" width=\"60\" height=\"14\" rx=\"2\" fill=\"currentColor\" fill-opacity=\"0.10\" stroke=\"none\"/>\n    <text x=\"294\" y=\"44\" fill=\"currentColor\" stroke=\"none\" text-anchor=\"middle\">Story</text>\n  </g>\n  <!-- Content area: code on left, tree on right -->\n  <rect x=\"28\" y=\"54\" width=\"220\" height=\"68\" rx=\"2\" fill=\"currentColor\" fill-opacity=\"0.04\"/>\n  <line x1=\"36\" y1=\"64\" x2=\"180\" y2=\"64\" stroke-opacity=\"0.55\"/>\n  <line x1=\"44\" y1=\"74\" x2=\"200\" y2=\"74\" stroke-opacity=\"0.55\"/>\n  <line x1=\"44\" y1=\"84\" x2=\"160\" y2=\"84\" stroke-opacity=\"0.55\"/>\n  <line x1=\"52\" y1=\"94\" x2=\"180\" y2=\"94\" stroke-opacity=\"0.55\"/>\n  <line x1=\"52\" y1=\"104\" x2=\"140\" y2=\"104\" stroke-opacity=\"0.55\"/>\n  <line x1=\"36\" y1=\"114\" x2=\"220\" y2=\"114\" stroke-opacity=\"0.55\"/>\n  <!-- Tree on right -->\n  <rect x=\"256\" y=\"54\" width=\"136\" height=\"68\" rx=\"2\"/>\n  <g font-family=\"sans-serif\" font-size=\"7\" font-weight=\"700\">\n    <rect x=\"262\" y=\"60\" width=\"14\" height=\"8\" rx=\"1\" fill=\"currentColor\" stroke=\"none\"/>\n    <text x=\"269\" y=\"66.5\" fill=\"#fff\" stroke=\"none\" text-anchor=\"middle\">P</text>\n    <line x1=\"280\" y1=\"64\" x2=\"360\" y2=\"64\"/>\n    <rect x=\"270\" y=\"74\" width=\"14\" height=\"8\" rx=\"1\" fill=\"currentColor\" fill-opacity=\"0.55\" stroke=\"none\"/>\n    <text x=\"277\" y=\"80.5\" fill=\"#fff\" stroke=\"none\" text-anchor=\"middle\">C</text>\n    <line x1=\"288\" y1=\"78\" x2=\"350\" y2=\"78\" stroke-opacity=\"0.55\"/>\n    <rect x=\"278\" y=\"88\" width=\"14\" height=\"8\" rx=\"1\" fill=\"currentColor\" fill-opacity=\"0.55\" stroke=\"none\"/>\n    <text x=\"285\" y=\"94.5\" fill=\"#fff\" stroke=\"none\" text-anchor=\"middle\">F</text>\n    <line x1=\"296\" y1=\"92\" x2=\"340\" y2=\"92\" stroke-opacity=\"0.55\"/>\n    <rect x=\"278\" y=\"102\" width=\"14\" height=\"8\" rx=\"1\" fill=\"currentColor\" fill-opacity=\"0.55\" stroke=\"none\"/>\n    <text x=\"285\" y=\"108.5\" fill=\"#fff\" stroke=\"none\" text-anchor=\"middle\">F</text>\n    <line x1=\"296\" y1=\"106\" x2=\"346\" y2=\"106\" stroke-opacity=\"0.55\"/>\n    <rect x=\"270\" y=\"116\" width=\"14\" height=\"8\" rx=\"1\" fill=\"currentColor\" fill-opacity=\"0.55\" stroke=\"none\"/>\n    <text x=\"277\" y=\"122.5\" fill=\"#fff\" stroke=\"none\" text-anchor=\"middle\">B</text>\n    <line x1=\"288\" y1=\"120\" x2=\"334\" y2=\"120\" stroke-opacity=\"0.55\"/>\n  </g>\n</svg>`;\n\nconst WF_INSPECTOR = `\n<svg viewBox=\"0 0 420 140\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n  <!-- Inspector popup -->\n  <rect x=\"60\" y=\"10\" width=\"300\" height=\"120\" rx=\"4\"/>\n  <!-- Header (primary) -->\n  <rect x=\"60\" y=\"10\" width=\"300\" height=\"18\" rx=\"0\" fill=\"currentColor\" stroke=\"none\"/>\n  <rect x=\"68\" y=\"16\" width=\"40\" height=\"6\" rx=\"1\" fill=\"#fff\" fill-opacity=\"0.55\" stroke=\"none\"/>\n  <rect x=\"114\" y=\"16\" width=\"120\" height=\"6\" rx=\"1\" fill=\"#fff\" fill-opacity=\"0.85\" stroke=\"none\"/>\n  <circle cx=\"345\" cy=\"19\" r=\"2\" fill=\"#fff\" stroke=\"none\"/>\n  <circle cx=\"335\" cy=\"19\" r=\"2\" fill=\"#fff\" stroke=\"none\" fill-opacity=\"0.6\"/>\n  <!-- Tab strip: 5 tabs (JSON/Template/Story/Insights/Structure), JSON active -->\n  <g font-family=\"sans-serif\" font-size=\"8\" font-weight=\"600\">\n    <rect x=\"68\" y=\"34\" width=\"50\" height=\"14\" rx=\"2\" fill=\"currentColor\" stroke=\"none\"/>\n    <text x=\"93\" y=\"44\" fill=\"#fff\" stroke=\"none\" text-anchor=\"middle\">JSON</text>\n    <rect x=\"122\" y=\"34\" width=\"60\" height=\"14\" rx=\"2\" fill=\"currentColor\" fill-opacity=\"0.10\" stroke=\"none\"/>\n    <text x=\"152\" y=\"44\" fill=\"currentColor\" stroke=\"none\" text-anchor=\"middle\">Template</text>\n    <rect x=\"186\" y=\"34\" width=\"50\" height=\"14\" rx=\"2\" fill=\"currentColor\" fill-opacity=\"0.10\" stroke=\"none\"/>\n    <text x=\"211\" y=\"44\" fill=\"currentColor\" stroke=\"none\" text-anchor=\"middle\">Story</text>\n    <rect x=\"240\" y=\"34\" width=\"56\" height=\"14\" rx=\"2\" fill=\"currentColor\" fill-opacity=\"0.10\" stroke=\"none\"/>\n    <text x=\"268\" y=\"44\" fill=\"currentColor\" stroke=\"none\" text-anchor=\"middle\">Insights</text>\n    <rect x=\"300\" y=\"34\" width=\"56\" height=\"14\" rx=\"2\" fill=\"currentColor\" fill-opacity=\"0.10\" stroke=\"none\"/>\n    <text x=\"328\" y=\"44\" fill=\"currentColor\" stroke=\"none\" text-anchor=\"middle\">Struct</text>\n  </g>\n  <!-- Breadcrumbs -->\n  <g font-family=\"monospace\" font-size=\"6\">\n    <rect x=\"68\" y=\"54\" width=\"36\" height=\"10\" rx=\"1.5\" fill=\"currentColor\" fill-opacity=\"0.10\" stroke=\"none\"/>\n    <text x=\"86\" y=\"61\" fill=\"currentColor\" stroke=\"none\" text-anchor=\"middle\">page</text>\n    <text x=\"108\" y=\"61\" fill=\"currentColor\" stroke=\"none\" stroke-opacity=\"0.5\">›</text>\n    <rect x=\"114\" y=\"54\" width=\"42\" height=\"10\" rx=\"1.5\" fill=\"currentColor\" fill-opacity=\"0.10\" stroke=\"none\"/>\n    <text x=\"135\" y=\"61\" fill=\"currentColor\" stroke=\"none\" text-anchor=\"middle\">cont…</text>\n    <text x=\"160\" y=\"61\" fill=\"currentColor\" stroke=\"none\" stroke-opacity=\"0.5\">›</text>\n    <rect x=\"166\" y=\"54\" width=\"40\" height=\"10\" rx=\"1.5\" fill=\"currentColor\" stroke=\"none\"/>\n    <text x=\"186\" y=\"61\" fill=\"#fff\" stroke=\"none\" text-anchor=\"middle\">field</text>\n  </g>\n  <!-- Body content lines (faux JSON) -->\n  <g stroke-opacity=\"0.55\">\n    <line x1=\"76\" y1=\"76\" x2=\"120\" y2=\"76\"/>\n    <line x1=\"124\" y1=\"76\" x2=\"200\" y2=\"76\"/>\n    <line x1=\"86\" y1=\"86\" x2=\"130\" y2=\"86\"/>\n    <line x1=\"134\" y1=\"86\" x2=\"220\" y2=\"86\"/>\n    <line x1=\"86\" y1=\"96\" x2=\"120\" y2=\"96\"/>\n    <line x1=\"124\" y1=\"96\" x2=\"240\" y2=\"96\"/>\n    <line x1=\"86\" y1=\"106\" x2=\"118\" y2=\"106\"/>\n    <line x1=\"122\" y1=\"106\" x2=\"260\" y2=\"106\"/>\n    <line x1=\"76\" y1=\"116\" x2=\"100\" y2=\"116\"/>\n  </g>\n</svg>`;\n\nconst WF_DONE = `\n<svg viewBox=\"0 0 420 140\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n  <!-- Decorative compass marks around the checkmark -->\n  <g stroke-opacity=\"0.35\" stroke-width=\"1.2\">\n    <line x1=\"210\" y1=\"20\" x2=\"210\" y2=\"34\"/>\n    <line x1=\"210\" y1=\"106\" x2=\"210\" y2=\"120\"/>\n    <line x1=\"146\" y1=\"70\" x2=\"160\" y2=\"70\"/>\n    <line x1=\"260\" y1=\"70\" x2=\"274\" y2=\"70\"/>\n    <line x1=\"166\" y1=\"26\" x2=\"174\" y2=\"34\"/>\n    <line x1=\"246\" y1=\"106\" x2=\"254\" y2=\"114\"/>\n    <line x1=\"166\" y1=\"114\" x2=\"174\" y2=\"106\"/>\n    <line x1=\"246\" y1=\"34\" x2=\"254\" y2=\"26\"/>\n  </g>\n  <!-- Filled primary disc with white check -->\n  <circle cx=\"210\" cy=\"70\" r=\"32\" fill=\"currentColor\" stroke=\"none\"/>\n  <path d=\"M194 70 l10 10 l22 -22\" stroke=\"#fff\" stroke-width=\"2.4\"/>\n  <!-- Outer ring -->\n  <circle cx=\"210\" cy=\"70\" r=\"40\" stroke-opacity=\"0.45\" stroke-width=\"1.2\"/>\n</svg>`;\n\n// Inspector-tour wireframes — sketch the popup itself with the relevant\n// region tinted to call out what the step describes.\nconst WF_INS_WELCOME = `\n<svg viewBox=\"0 0 420 140\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n  <!-- Faint page background -->\n  <rect x=\"14\" y=\"14\" width=\"220\" height=\"112\" rx=\"4\" stroke-opacity=\"0.35\"/>\n  <line x1=\"28\" y1=\"34\" x2=\"180\" y2=\"34\" stroke-opacity=\"0.35\"/>\n  <line x1=\"28\" y1=\"46\" x2=\"160\" y2=\"46\" stroke-opacity=\"0.35\"/>\n  <line x1=\"28\" y1=\"58\" x2=\"200\" y2=\"58\" stroke-opacity=\"0.35\"/>\n  <line x1=\"28\" y1=\"70\" x2=\"140\" y2=\"70\" stroke-opacity=\"0.35\"/>\n  <!-- Targeted element rectangle -->\n  <rect x=\"60\" y=\"84\" width=\"120\" height=\"32\" rx=\"3\" fill=\"currentColor\" fill-opacity=\"0.18\" stroke=\"currentColor\" stroke-width=\"2\"/>\n  <!-- Connector to popup -->\n  <path d=\"M180 100 q14 -6 28 -10\" stroke-dasharray=\"3 3\" stroke-opacity=\"0.55\"/>\n  <!-- Inspector popup, floating right -->\n  <rect x=\"226\" y=\"14\" width=\"180\" height=\"112\" rx=\"4\" fill=\"currentColor\" fill-opacity=\"0.04\"/>\n  <rect x=\"226\" y=\"14\" width=\"180\" height=\"20\" rx=\"0\" fill=\"currentColor\" stroke=\"none\"/>\n  <rect x=\"234\" y=\"20\" width=\"34\" height=\"8\" rx=\"1\" fill=\"#fff\" fill-opacity=\"0.55\" stroke=\"none\"/>\n  <rect x=\"272\" y=\"20\" width=\"80\" height=\"8\" rx=\"1\" fill=\"#fff\" fill-opacity=\"0.85\" stroke=\"none\"/>\n  <!-- Tab strip -->\n  <g>\n    <rect x=\"234\" y=\"42\" width=\"30\" height=\"10\" rx=\"1.5\" fill=\"currentColor\" stroke=\"none\"/>\n    <rect x=\"266\" y=\"42\" width=\"30\" height=\"10\" rx=\"1.5\" fill=\"currentColor\" fill-opacity=\"0.18\" stroke=\"none\"/>\n    <rect x=\"298\" y=\"42\" width=\"30\" height=\"10\" rx=\"1.5\" fill=\"currentColor\" fill-opacity=\"0.18\" stroke=\"none\"/>\n    <rect x=\"330\" y=\"42\" width=\"30\" height=\"10\" rx=\"1.5\" fill=\"currentColor\" fill-opacity=\"0.18\" stroke=\"none\"/>\n    <rect x=\"362\" y=\"42\" width=\"30\" height=\"10\" rx=\"1.5\" fill=\"currentColor\" fill-opacity=\"0.18\" stroke=\"none\"/>\n  </g>\n  <g stroke-opacity=\"0.55\">\n    <line x1=\"234\" y1=\"64\" x2=\"394\" y2=\"64\"/>\n    <line x1=\"234\" y1=\"74\" x2=\"380\" y2=\"74\"/>\n    <line x1=\"234\" y1=\"84\" x2=\"386\" y2=\"84\"/>\n    <line x1=\"234\" y1=\"94\" x2=\"370\" y2=\"94\"/>\n    <line x1=\"234\" y1=\"104\" x2=\"380\" y2=\"104\"/>\n    <line x1=\"234\" y1=\"114\" x2=\"350\" y2=\"114\"/>\n  </g>\n</svg>`;\n\nconst WF_INS_HEADER = `\n<svg viewBox=\"0 0 420 140\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n  <!-- Popup -->\n  <rect x=\"40\" y=\"20\" width=\"340\" height=\"100\" rx=\"4\" fill=\"currentColor\" fill-opacity=\"0.04\"/>\n  <!-- Header (highlighted) -->\n  <rect x=\"40\" y=\"20\" width=\"340\" height=\"26\" rx=\"0\" fill=\"currentColor\" stroke=\"none\"/>\n  <!-- Element type chip -->\n  <rect x=\"50\" y=\"27\" width=\"40\" height=\"12\" rx=\"2\" fill=\"#fff\" fill-opacity=\"0.85\" stroke=\"none\"/>\n  <text x=\"70\" y=\"36\" fill=\"currentColor\" stroke=\"none\" font-family=\"monospace\" font-size=\"8\" font-weight=\"700\" text-anchor=\"middle\">field</text>\n  <!-- Element key -->\n  <rect x=\"96\" y=\"29\" width=\"36\" height=\"8\" rx=\"1\" fill=\"#fff\" fill-opacity=\"0.55\" stroke=\"none\"/>\n  <!-- Element name -->\n  <rect x=\"138\" y=\"29\" width=\"120\" height=\"8\" rx=\"1\" fill=\"#fff\" fill-opacity=\"0.85\" stroke=\"none\"/>\n  <!-- Header buttons (back / forward / parent / picker / close) -->\n  <g stroke=\"#fff\" stroke-width=\"1.4\" stroke-opacity=\"0.85\">\n    <circle cx=\"280\" cy=\"33\" r=\"6\" fill=\"none\"/>\n    <path d=\"M283 33 l-3 -3 m0 6 l3 -3 m-3 0 l5 0\"/>\n    <circle cx=\"298\" cy=\"33\" r=\"6\" fill=\"none\"/>\n    <path d=\"M295 33 l3 -3 m0 6 l-3 -3 m3 0 l-5 0\"/>\n    <circle cx=\"316\" cy=\"33\" r=\"6\" fill=\"none\"/>\n    <path d=\"M316 30 l-2 3 l4 0 z\"/>\n    <circle cx=\"334\" cy=\"33\" r=\"6\" fill=\"none\"/>\n    <line x1=\"334\" y1=\"30\" x2=\"334\" y2=\"36\"/>\n    <line x1=\"331\" y1=\"33\" x2=\"337\" y2=\"33\"/>\n    <circle cx=\"352\" cy=\"33\" r=\"6\" fill=\"none\"/>\n    <line x1=\"349\" y1=\"30\" x2=\"355\" y2=\"36\"/>\n    <line x1=\"355\" y1=\"30\" x2=\"349\" y2=\"36\"/>\n  </g>\n  <!-- Body content (faint) -->\n  <g stroke-opacity=\"0.4\">\n    <line x1=\"50\" y1=\"60\" x2=\"370\" y2=\"60\"/>\n    <line x1=\"50\" y1=\"72\" x2=\"350\" y2=\"72\"/>\n    <line x1=\"50\" y1=\"84\" x2=\"360\" y2=\"84\"/>\n    <line x1=\"50\" y1=\"96\" x2=\"340\" y2=\"96\"/>\n    <line x1=\"50\" y1=\"108\" x2=\"330\" y2=\"108\"/>\n  </g>\n</svg>`;\n\nconst WF_INS_BREADCRUMBS = `\n<svg viewBox=\"0 0 420 140\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n  <!-- Popup -->\n  <rect x=\"40\" y=\"20\" width=\"340\" height=\"100\" rx=\"4\"/>\n  <!-- Header (faint) -->\n  <rect x=\"40\" y=\"20\" width=\"340\" height=\"20\" rx=\"0\" fill=\"currentColor\" fill-opacity=\"0.55\" stroke=\"none\"/>\n  <rect x=\"50\" y=\"26\" width=\"60\" height=\"8\" rx=\"1\" fill=\"#fff\" fill-opacity=\"0.55\" stroke=\"none\"/>\n  <rect x=\"116\" y=\"26\" width=\"100\" height=\"8\" rx=\"1\" fill=\"#fff\" fill-opacity=\"0.85\" stroke=\"none\"/>\n  <!-- Breadcrumb strip (highlighted) -->\n  <rect x=\"40\" y=\"46\" width=\"340\" height=\"22\" rx=\"0\" fill=\"currentColor\" fill-opacity=\"0.10\" stroke=\"none\"/>\n  <g font-family=\"monospace\" font-size=\"8\" font-weight=\"700\">\n    <rect x=\"50\" y=\"51\" width=\"44\" height=\"12\" rx=\"1.5\" fill=\"currentColor\" fill-opacity=\"0.18\" stroke=\"none\"/>\n    <text x=\"72\" y=\"60\" fill=\"currentColor\" stroke=\"none\" text-anchor=\"middle\">page</text>\n    <text x=\"100\" y=\"60\" fill=\"currentColor\" stroke=\"none\" stroke-opacity=\"0.6\">›</text>\n    <rect x=\"108\" y=\"51\" width=\"60\" height=\"12\" rx=\"1.5\" fill=\"currentColor\" fill-opacity=\"0.18\" stroke=\"none\"/>\n    <text x=\"138\" y=\"60\" fill=\"currentColor\" stroke=\"none\" text-anchor=\"middle\">container</text>\n    <text x=\"174\" y=\"60\" fill=\"currentColor\" stroke=\"none\" stroke-opacity=\"0.6\">›</text>\n    <rect x=\"182\" y=\"51\" width=\"44\" height=\"12\" rx=\"1.5\" fill=\"currentColor\" fill-opacity=\"0.18\" stroke=\"none\"/>\n    <text x=\"204\" y=\"60\" fill=\"currentColor\" stroke=\"none\" text-anchor=\"middle\">form</text>\n    <text x=\"232\" y=\"60\" fill=\"currentColor\" stroke=\"none\" stroke-opacity=\"0.6\">›</text>\n    <rect x=\"240\" y=\"51\" width=\"48\" height=\"12\" rx=\"1.5\" fill=\"currentColor\" stroke=\"none\"/>\n    <text x=\"264\" y=\"60\" fill=\"#fff\" stroke=\"none\" text-anchor=\"middle\">field</text>\n  </g>\n  <!-- Body content (faint) -->\n  <g stroke-opacity=\"0.4\">\n    <line x1=\"50\" y1=\"80\" x2=\"370\" y2=\"80\"/>\n    <line x1=\"50\" y1=\"92\" x2=\"350\" y2=\"92\"/>\n    <line x1=\"50\" y1=\"104\" x2=\"360\" y2=\"104\"/>\n    <line x1=\"50\" y1=\"114\" x2=\"320\" y2=\"114\"/>\n  </g>\n</svg>`;\n\nconst WF_INS_RENDERER = `\n<svg viewBox=\"0 0 420 140\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n  <!-- Popup -->\n  <rect x=\"40\" y=\"14\" width=\"340\" height=\"112\" rx=\"4\"/>\n  <!-- Header (faint) -->\n  <rect x=\"40\" y=\"14\" width=\"340\" height=\"18\" rx=\"0\" fill=\"currentColor\" fill-opacity=\"0.55\" stroke=\"none\"/>\n  <rect x=\"50\" y=\"20\" width=\"180\" height=\"6\" rx=\"1\" fill=\"#fff\" fill-opacity=\"0.7\" stroke=\"none\"/>\n  <!-- Renderer rows (highlighted) -->\n  <rect x=\"40\" y=\"38\" width=\"340\" height=\"22\" rx=\"0\" fill=\"currentColor\" fill-opacity=\"0.10\" stroke=\"none\"/>\n  <!-- Angular shield icon -->\n  <path d=\"M52 41 l8 -2 l8 2 l-1.5 12 l-6.5 4 l-6.5 -4 z\" fill=\"currentColor\" stroke=\"none\"/>\n  <text x=\"76\" y=\"52\" fill=\"currentColor\" stroke=\"none\" font-family=\"sans-serif\" font-size=\"8\" font-weight=\"700\">Angular</text>\n  <text x=\"116\" y=\"52\" fill=\"currentColor\" stroke=\"none\" font-family=\"monospace\" font-size=\"9\" font-weight=\"600\">bq-field-input</text>\n  <text x=\"200\" y=\"52\" fill=\"currentColor\" stroke=\"none\" font-family=\"sans-serif\" font-size=\"8\" stroke-opacity=\"0.6\">·</text>\n  <text x=\"208\" y=\"52\" fill=\"currentColor\" stroke=\"none\" font-family=\"monospace\" font-size=\"9\" font-weight=\"600\">FieldInputComponent</text>\n  <!-- Blueriq selector row -->\n  <rect x=\"40\" y=\"62\" width=\"340\" height=\"22\" rx=\"0\" fill=\"currentColor\" fill-opacity=\"0.10\" stroke=\"none\"/>\n  <circle cx=\"58\" cy=\"73\" r=\"6\" fill=\"currentColor\" stroke=\"none\"/>\n  <text x=\"58\" y=\"76\" fill=\"#fff\" stroke=\"none\" font-family=\"sans-serif\" font-size=\"7\" font-weight=\"700\" text-anchor=\"middle\">Bq</text>\n  <text x=\"74\" y=\"76\" fill=\"currentColor\" stroke=\"none\" font-family=\"sans-serif\" font-size=\"8\" font-weight=\"700\">Selector</text>\n  <text x=\"116\" y=\"76\" fill=\"currentColor\" stroke=\"none\" font-family=\"monospace\" font-size=\"9\" font-weight=\"600\">field[contentStyle=text]</text>\n  <rect x=\"280\" y=\"68\" width=\"22\" height=\"10\" rx=\"2\" fill=\"currentColor\" stroke=\"none\"/>\n  <text x=\"291\" y=\"76\" fill=\"#fff\" stroke=\"none\" font-family=\"monospace\" font-size=\"8\" font-weight=\"700\" text-anchor=\"middle\">P5</text>\n  <!-- Body lines (faint) -->\n  <g stroke-opacity=\"0.4\">\n    <line x1=\"50\" y1=\"96\" x2=\"370\" y2=\"96\"/>\n    <line x1=\"50\" y1=\"106\" x2=\"350\" y2=\"106\"/>\n    <line x1=\"50\" y1=\"116\" x2=\"340\" y2=\"116\"/>\n  </g>\n</svg>`;\n\nconst WF_INS_TABS = `\n<svg viewBox=\"0 0 420 140\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n  <!-- Popup -->\n  <rect x=\"40\" y=\"14\" width=\"340\" height=\"112\" rx=\"4\"/>\n  <!-- Header (faint) -->\n  <rect x=\"40\" y=\"14\" width=\"340\" height=\"18\" rx=\"0\" fill=\"currentColor\" fill-opacity=\"0.55\" stroke=\"none\"/>\n  <rect x=\"50\" y=\"20\" width=\"180\" height=\"6\" rx=\"1\" fill=\"#fff\" fill-opacity=\"0.7\" stroke=\"none\"/>\n  <!-- Tabs row (highlighted background) -->\n  <rect x=\"40\" y=\"38\" width=\"340\" height=\"24\" rx=\"0\" fill=\"currentColor\" fill-opacity=\"0.10\" stroke=\"none\"/>\n  <g font-family=\"sans-serif\" font-size=\"9\" font-weight=\"700\">\n    <rect x=\"50\" y=\"44\" width=\"56\" height=\"14\" rx=\"2\" fill=\"currentColor\" stroke=\"none\"/>\n    <text x=\"78\" y=\"54\" fill=\"#fff\" stroke=\"none\" text-anchor=\"middle\">JSON</text>\n    <rect x=\"112\" y=\"44\" width=\"68\" height=\"14\" rx=\"2\" fill=\"currentColor\" fill-opacity=\"0.18\" stroke=\"none\"/>\n    <text x=\"146\" y=\"54\" fill=\"currentColor\" stroke=\"none\" text-anchor=\"middle\">Template</text>\n    <rect x=\"186\" y=\"44\" width=\"56\" height=\"14\" rx=\"2\" fill=\"currentColor\" fill-opacity=\"0.18\" stroke=\"none\"/>\n    <text x=\"214\" y=\"54\" fill=\"currentColor\" stroke=\"none\" text-anchor=\"middle\">Story</text>\n    <rect x=\"248\" y=\"44\" width=\"60\" height=\"14\" rx=\"2\" fill=\"currentColor\" fill-opacity=\"0.18\" stroke=\"none\"/>\n    <text x=\"278\" y=\"54\" fill=\"currentColor\" stroke=\"none\" text-anchor=\"middle\">Insights</text>\n    <rect x=\"314\" y=\"44\" width=\"60\" height=\"14\" rx=\"2\" fill=\"currentColor\" fill-opacity=\"0.18\" stroke=\"none\"/>\n    <text x=\"344\" y=\"54\" fill=\"currentColor\" stroke=\"none\" text-anchor=\"middle\">Structure</text>\n  </g>\n  <!-- Body: faux JSON -->\n  <g stroke-opacity=\"0.55\" font-family=\"monospace\" font-size=\"8\">\n    <text x=\"50\" y=\"78\" fill=\"currentColor\" stroke=\"none\">{</text>\n    <line x1=\"62\" y1=\"76\" x2=\"100\" y2=\"76\"/>\n    <line x1=\"106\" y1=\"76\" x2=\"180\" y2=\"76\"/>\n    <line x1=\"62\" y1=\"88\" x2=\"120\" y2=\"88\"/>\n    <line x1=\"126\" y1=\"88\" x2=\"220\" y2=\"88\"/>\n    <line x1=\"62\" y1=\"100\" x2=\"110\" y2=\"100\"/>\n    <line x1=\"116\" y1=\"100\" x2=\"240\" y2=\"100\"/>\n    <line x1=\"62\" y1=\"112\" x2=\"120\" y2=\"112\"/>\n    <line x1=\"126\" y1=\"112\" x2=\"200\" y2=\"112\"/>\n    <text x=\"50\" y=\"124\" fill=\"currentColor\" stroke=\"none\">}</text>\n  </g>\n</svg>`;\n\nconst WF_INS_SOURCE = `\n<svg viewBox=\"0 0 420 140\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n  <!-- Popup -->\n  <rect x=\"40\" y=\"14\" width=\"340\" height=\"112\" rx=\"4\"/>\n  <!-- Header (faint) -->\n  <rect x=\"40\" y=\"14\" width=\"340\" height=\"18\" rx=\"0\" fill=\"currentColor\" fill-opacity=\"0.55\" stroke=\"none\"/>\n  <rect x=\"50\" y=\"20\" width=\"180\" height=\"6\" rx=\"1\" fill=\"#fff\" fill-opacity=\"0.7\" stroke=\"none\"/>\n  <!-- Source-capture row (highlighted) -->\n  <rect x=\"40\" y=\"38\" width=\"340\" height=\"24\" rx=\"0\" fill=\"currentColor\" fill-opacity=\"0.10\" stroke=\"none\"/>\n  <text x=\"50\" y=\"54\" fill=\"currentColor\" stroke=\"none\" font-family=\"sans-serif\" font-size=\"8\" stroke-opacity=\"0.6\">From capture</text>\n  <rect x=\"100\" y=\"44\" width=\"270\" height=\"14\" rx=\"2\" stroke=\"currentColor\"/>\n  <rect x=\"104\" y=\"47\" width=\"22\" height=\"8\" rx=\"1.5\" fill=\"currentColor\" stroke=\"none\"/>\n  <text x=\"115\" y=\"53\" fill=\"#fff\" stroke=\"none\" font-family=\"monospace\" font-size=\"7\" font-weight=\"700\" text-anchor=\"middle\">PUT</text>\n  <text x=\"132\" y=\"53\" fill=\"currentColor\" stroke=\"none\" font-family=\"monospace\" font-size=\"7\" font-weight=\"600\">200</text>\n  <line x1=\"150\" y1=\"51\" x2=\"364\" y2=\"51\" stroke-opacity=\"0.5\"/>\n  <!-- Arrow indicating navigation -->\n  <path d=\"M362 50 l4 1 l-4 1\" stroke=\"currentColor\"/>\n  <!-- Body content (faint) -->\n  <g stroke-opacity=\"0.4\">\n    <line x1=\"50\" y1=\"74\" x2=\"370\" y2=\"74\"/>\n    <line x1=\"50\" y1=\"86\" x2=\"350\" y2=\"86\"/>\n    <line x1=\"50\" y1=\"98\" x2=\"360\" y2=\"98\"/>\n    <line x1=\"50\" y1=\"110\" x2=\"330\" y2=\"110\"/>\n    <line x1=\"50\" y1=\"120\" x2=\"280\" y2=\"120\"/>\n  </g>\n</svg>`;\n\nexport const INSPECTOR_TOUR_STEPS: ReadonlyArray<TourStep> = [\n  {\n    target: null,\n    title: 'Inspector overview',\n    body: \"You've picked an element — here's the popup. A 30-second tour of what each part does. Skip any time.\",\n    wireframe: WF_INS_WELCOME,\n  },\n  {\n    target: '.dev-inspector-popup__header',\n    title: 'Header & navigation',\n    body: 'The element type chip, key, and name sit on the left. On the right: back/forward through your inspection history, jump to parent, re-pick, and close. Drag the header to reposition.',\n    wireframe: WF_INS_HEADER,\n  },\n  {\n    target: '.dev-inspector-popup__breadcrumbs',\n    title: 'Breadcrumbs',\n    body: 'The trail from the root page down to the current element. Click any crumb to jump straight to it.',\n    wireframe: WF_INS_BREADCRUMBS,\n  },\n  {\n    target: '.dev-inspector-popup__renderer',\n    title: 'Angular & Blueriq selector',\n    body: 'The Angular component class that rendered this element, and the @BlueriqComponent selector that matched it (with priority). Both selectors are one-click copyable. Expand the selector to see the parsed structure tree.',\n    wireframe: WF_INS_RENDERER,\n  },\n  {\n    target: '.dev-inspector-popup .dev-view-switch--full',\n    title: 'Five views',\n    body: 'JSON · Template · Story (Storybook CSF3, paste-ready) · Insights (parsed metadata) · Structure (the element subtree). The Structure tab is interactive — click a node to navigate into it.',\n    wireframe: WF_INS_TABS,\n  },\n  {\n    target: '.dev-inspector-popup__source',\n    title: 'Source capture',\n    body: 'Cross-reference back to the HTTP capture this element came from. Clicking opens that capture in the captures tab — handy for diffing or copying as cURL.',\n    wireframe: WF_INS_SOURCE,\n  },\n  {\n    target: null,\n    title: \"You're set\",\n    body: 'Replay this inspector tour any time from the help (?) panel.',\n    wireframe: WF_DONE,\n  },\n];\n\nexport const TOUR_STEPS: ReadonlyArray<TourStep> = [\n  {\n    target: null,\n    title: 'Welcome to bq-lens',\n    body: 'Quick 60-second tour of the panel. Skip any time — replay from the help (?) icon in the panel header.',\n    wireframe: WF_WELCOME,\n  },\n  {\n    // No spotlight: the floating handle is occluded by the open panel.\n    // Describe it instead of highlighting an empty rectangle.\n    target: null,\n    title: 'The floating handle',\n    body: 'A vertical tab on the side of your screen toggles this panel. Drag it to reposition; the side persists across reloads. Press Alt+D any time to toggle.',\n    wireframe: WF_HANDLE,\n  },\n  {\n    target: '.dev-panel.open .dev-view-switch--full',\n    title: 'Captures & Sessions',\n    body: 'All Blueriq HTTP traffic lands here. Captures auto-warm an in-memory element cache, so the inspector, search, and diff are instant.',\n    wireframe: WF_CAPTURES,\n  },\n  {\n    target: '.dev-panel.open .dev-btn--picker',\n    title: 'Element picker (Alt+P)',\n    body: 'Click any rendered element to inspect it. bq-lens resolves the Blueriq element behind it, the Angular class that rendered it, and the @BlueriqComponent selector that picked it.',\n    wireframe: WF_PICKER,\n  },\n  {\n    target: '.dev-panel.open .dev-btn--search',\n    title: 'Element search (Alt+S)',\n    body: 'Fuzzy-find any cached element by name, value, content style, or functional key — even ones not currently on screen.',\n    wireframe: WF_SEARCH,\n  },\n  {\n    target: '.dev-panel.open .dev-btn--page',\n    title: 'Page view (Alt+G)',\n    body: 'Snapshot the entire current page — full template, full JSON, full element tree, full insights — in a large modal.',\n    wireframe: WF_PAGE,\n  },\n  {\n    target: null,\n    title: 'Inspector popup',\n    body: 'After you pick an element you get five tabs: JSON, Template, Story (Storybook CSF3, paste-ready), Insights, and Structure. Breadcrumbs and back/forward navigation are built in.',\n    wireframe: WF_INSPECTOR,\n  },\n  {\n    target: null,\n    title: \"You're set\",\n    body: 'Press the ? icon in the panel header to replay this tour any time.',\n    wireframe: WF_DONE,\n  },\n];\n\nconst TOURS: Record<TourId, ReadonlyArray<TourStep>> = {\n  main: TOUR_STEPS,\n  inspector: INSPECTOR_TOUR_STEPS,\n};\n\n@Injectable()\nexport class DevTourService {\n  // null when no tour is running. Components subscribe to render the\n  // backdrop / spotlight / card. Only one tour can be active at a time.\n  private readonly _currentIndex$ = new BehaviorSubject<number | null>(null);\n  readonly currentIndex$ = this._currentIndex$.asObservable();\n\n  private _activeTour: TourId | null = null;\n\n  /** Steps of the active tour, or the main tour as a fallback for callers\n   *  that read steps before any tour starts. */\n  get steps(): ReadonlyArray<TourStep> { return TOURS[this._activeTour ?? 'main']; }\n  get activeTour(): TourId | null { return this._activeTour; }\n\n  get currentIndex(): number | null { return this._currentIndex$.value; }\n  get currentStep(): TourStep | null {\n    const i = this._currentIndex$.value;\n    return i == null ? null : this.steps[i];\n  }\n  get isActive(): boolean { return this._currentIndex$.value != null; }\n  get totalSteps(): number { return this.steps.length; }\n\n  /** True when the developer has finished or skipped the given tour. */\n  isDone(id: TourId = 'main'): boolean {\n    return safeRead(localStorage, DONE_KEYS[id]) === '1';\n  }\n\n  /** Start the given tour at step 0. No-op if a tour is already running. */\n  start(id: TourId = 'main'): void {\n    if (this._currentIndex$.value != null) return;\n    this._activeTour = id;\n    this._currentIndex$.next(0);\n  }\n\n  next(): void {\n    const i = this._currentIndex$.value;\n    if (i == null) return;\n    if (i + 1 >= this.steps.length) { this.finish(); return; }\n    this._currentIndex$.next(i + 1);\n  }\n\n  back(): void {\n    const i = this._currentIndex$.value;\n    if (i == null || i <= 0) return;\n    this._currentIndex$.next(i - 1);\n  }\n\n  /** User dismissed before completion. Persist done flag so we don't pester. */\n  skip(): void {\n    if (this._activeTour) safeWrite(localStorage, DONE_KEYS[this._activeTour], '1');\n    this._activeTour = null;\n    this._currentIndex$.next(null);\n  }\n\n  /** User clicked through the last step. */\n  finish(): void {\n    if (this._activeTour) safeWrite(localStorage, DONE_KEYS[this._activeTour], '1');\n    this._activeTour = null;\n    this._currentIndex$.next(null);\n  }\n\n  /** Re-run the given tour from step 0, regardless of its done flag. */\n  replay(id: TourId = 'main'): void {\n    safeRemove(localStorage, DONE_KEYS[id]);\n    this._activeTour = id;\n    this._currentIndex$.next(0);\n  }\n}\n","import { Injectable, NgZone, OnDestroy } from '@angular/core';\nimport { DevElementCacheService } from './dev-element-cache.service';\n\n/**\n * Background invariant audit for the in-memory cache. Runs every ~30s via\n * `requestIdleCallback` (with a `setTimeout` fallback) and checks the\n * structural index for damage that the live merge path can't catch on its\n * own — orphans, dangling parent links, reciprocity gaps, shallow cycles.\n *\n * Findings are surfaced through the cache's existing `cacheEvent` ring\n * (via `reportIntegrityViolation`) so the Internals panel reads from\n * one source. The audit itself is read-only — it never mutates state, so\n * a race with a concurrent merge yields at worst a stale finding which is\n * recognizable from the snapshot version.\n *\n * Cycle complexity is bounded: each pass is O(n) over current cache size\n * (~few hundred elements typically), and a budgeted slice runs per idle\n * tick so we don't camp on the main thread when the cache is large.\n */\n\nconst AUDIT_INTERVAL_MS = 30_000;\nconst IDLE_TIMEOUT_MS = 5_000;\nconst BATCH_SIZE = 500;\n\ntype IdleHandle = number | ReturnType<typeof setTimeout>;\n\ninterface IdleCallbackLike {\n  (cb: () => void, opts?: { timeout: number }): number;\n}\n\ninterface CancelIdleLike {\n  (handle: number): void;\n}\n\nfunction getIdleScheduler(): { schedule: (cb: () => void) => IdleHandle; cancel: (h: IdleHandle) => void } {\n  const win = (typeof window !== 'undefined' ? window : null) as\n    | (Window & { requestIdleCallback?: IdleCallbackLike; cancelIdleCallback?: CancelIdleLike })\n    | null;\n  if (win?.requestIdleCallback && win.cancelIdleCallback) {\n    return {\n      schedule: cb => win.requestIdleCallback!(cb, { timeout: IDLE_TIMEOUT_MS }),\n      cancel: h => win.cancelIdleCallback!(h as number),\n    };\n  }\n  return {\n    schedule: cb => setTimeout(cb, 0),\n    cancel: h => clearTimeout(h as ReturnType<typeof setTimeout>),\n  };\n}\n\n@Injectable({ providedIn: 'root' })\nexport class DevStructureAuditService implements OnDestroy {\n  private intervalHandle: ReturnType<typeof setInterval> | null = null;\n  private idleHandle: IdleHandle | null = null;\n  private readonly idle = getIdleScheduler();\n  private running = false;\n  private lastSummary: { ts: number; violations: number; checked: number } | null = null;\n\n  constructor(private readonly cache: DevElementCacheService, private readonly zone: NgZone) {}\n\n  /**\n   * Start the periodic audit. Idempotent — calling twice keeps a single\n   * timer. Runs outside Angular's zone so the periodic tick doesn't kick\n   * change detection on every fire.\n   */\n  start(): void {\n    if (this.intervalHandle !== null) return;\n    this.zone.runOutsideAngular(() => {\n      this.intervalHandle = setInterval(() => this.scheduleAudit(), AUDIT_INTERVAL_MS);\n    });\n  }\n\n  stop(): void {\n    if (this.intervalHandle !== null) {\n      clearInterval(this.intervalHandle);\n      this.intervalHandle = null;\n    }\n    if (this.idleHandle !== null) {\n      this.idle.cancel(this.idleHandle);\n      this.idleHandle = null;\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.stop();\n  }\n\n  /**\n   * Run an audit pass synchronously. Exposed so the Internals panel can\n   * offer a \"force audit now\" button without waiting for the next interval.\n   * Returns the summary so the caller can render it inline.\n   */\n  runNow(): { violations: number; checked: number } {\n    return this.runAudit();\n  }\n\n  getLastSummary(): { ts: number; violations: number; checked: number } | null {\n    return this.lastSummary;\n  }\n\n  private scheduleAudit(): void {\n    if (this.running || this.idleHandle !== null) return;\n    this.idleHandle = this.idle.schedule(() => {\n      this.idleHandle = null;\n      this.runAudit();\n    });\n  }\n\n  private runAudit(): { violations: number; checked: number } {\n    if (this.running) return { violations: 0, checked: 0 };\n    this.running = true;\n    let violations = 0;\n    let checked = 0;\n    try {\n      const snap = this.cache.getStructureSnapshot();\n      const elementKeys = snap.elementKeys;\n      const tombstoneKeys = snap.tombstoneKeys;\n      const parentOf = snap.parentOf;\n      const childrenOf = snap.childrenOf;\n\n      // Orphans + reciprocity, walked in batches of BATCH_SIZE so a\n      // pathologically-large cache doesn't pin the audit on one tick.\n      let i = 0;\n      for (const key of elementKeys) {\n        if (i++ >= BATCH_SIZE) break;\n        checked++;\n        const children = childrenOf.get(key);\n        if (children) {\n          for (const childKey of children) {\n            if (!elementKeys.has(childKey) && !tombstoneKeys.has(childKey)) {\n              this.cache.reportIntegrityViolation({\n                source: 'audit',\n                reason: 'orphan-child',\n                parent: key,\n                child: childKey,\n              });\n              violations++;\n            }\n            const reciprocal = parentOf.get(childKey);\n            if (reciprocal !== undefined && reciprocal !== key) {\n              this.cache.reportIntegrityViolation({\n                source: 'audit',\n                reason: 'reciprocity-gap',\n                parent: key,\n                child: childKey,\n                claimedParent: reciprocal,\n              });\n              violations++;\n            }\n          }\n        }\n      }\n\n      // Dangling parentOf entries: a child claims a parent that's not in\n      // the live cache and not tombstoned either. Bounded by parentOf size.\n      let j = 0;\n      for (const [child, parent] of parentOf) {\n        if (j++ >= BATCH_SIZE) break;\n        if (!elementKeys.has(parent) && !tombstoneKeys.has(parent)) {\n          this.cache.reportIntegrityViolation({\n            source: 'audit',\n            reason: 'dangling-parent',\n            child,\n            parent,\n          });\n          violations++;\n        }\n      }\n\n      // Shallow cycle scan via parentOf chain. Depth-limited so a\n      // pathologically-deep but acyclic tree doesn't false-positive.\n      const cycleDepthCap = 32;\n      let k = 0;\n      for (const start of parentOf.keys()) {\n        if (k++ >= BATCH_SIZE) break;\n        const visited = new Set<string>([start]);\n        let cur = parentOf.get(start);\n        let steps = 0;\n        while (cur && steps < cycleDepthCap) {\n          if (visited.has(cur)) {\n            this.cache.reportIntegrityViolation({\n              source: 'audit',\n              reason: 'cycle',\n              startedAt: start,\n              cycledAt: cur,\n            });\n            violations++;\n            break;\n          }\n          visited.add(cur);\n          cur = parentOf.get(cur);\n          steps++;\n        }\n      }\n    } finally {\n      this.running = false;\n    }\n    this.lastSummary = { ts: Date.now(), violations, checked };\n    return { violations, checked };\n  }\n}\n","import { Inject, Injectable, Optional } from '@angular/core';\nimport { BQ_LENS_CONFIG, BqLensConfig } from '../bq-lens.config';\n\nconst PRIMARY_VAR = '--bq-lens-primary';\nconst SECONDARY_VAR = '--bq-lens-secondary';\n\n/**\n * Owns the BqLens panel's primary and secondary colors as runtime CSS custom\n * properties. Hosts call setters to recolor the panel — BqLens itself stays\n * domain-agnostic and knows nothing about themes.\n */\n@Injectable({ providedIn: 'root' })\nexport class DevColorsService {\n  constructor(@Optional() @Inject(BQ_LENS_CONFIG) config: BqLensConfig | null) {\n    if (config?.primaryColor) this.setPrimary(config.primaryColor);\n    if (config?.secondaryColor) this.setSecondary(config.secondaryColor);\n  }\n\n  setPrimary(color: string): void {\n    document.documentElement.style.setProperty(PRIMARY_VAR, color);\n  }\n\n  setSecondary(color: string): void {\n    document.documentElement.style.setProperty(SECONDARY_VAR, color);\n  }\n\n  setColors(primary?: string, secondary?: string): void {\n    if (primary) this.setPrimary(primary);\n    if (secondary) this.setSecondary(secondary);\n  }\n}\n","import { Component, NgZone, OnDestroy, ViewEncapsulation } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { Session, SessionRegistry } from '@blueriq/angular';\nimport { Element as BlueriqElement, ElementWithChildren } from '@blueriq/core';\nimport { CaptureAnalysis, ElementTreeNode } from '../bq-lens.types';\nimport { analyzeSession } from '../dev-analysis.utils';\n\n@Component({\n  selector: 'app-dev-session-panel',\n  templateUrl: './dev-session-panel.component.html',\n  standalone: false,\n  encapsulation: ViewEncapsulation.None,\n})\nexport class DevSessionPanelComponent implements OnDestroy {\n  selectedSessionName: string | null = null;\n  liveTree: ElementTreeNode | null = null;\n  liveAnalysis: CaptureAnalysis | null = null;\n  liveSelectedKey: string | null = null;\n  liveTreeCollapsedKeys = new Set<string>();\n  private liveSubscription?: Subscription;\n\n  readonly onLiveTreeSelect = (key: string): void => { this.liveSelectedKey = key; };\n  readonly onLiveTreeToggle = (key: string): void => {\n    if (this.liveTreeCollapsedKeys.has(key)) {\n      this.liveTreeCollapsedKeys.delete(key);\n    } else {\n      this.liveTreeCollapsedKeys.add(key);\n    }\n    this.liveTreeCollapsedKeys = new Set(this.liveTreeCollapsedKeys);\n  };\n\n  get liveSessions(): readonly Readonly<Session>[] {\n    return this.sessionRegistry.listSessions();\n  }\n\n  constructor(\n    private zone: NgZone,\n    private sessionRegistry: SessionRegistry,\n  ) {}\n\n  selectLiveSession(name: string): void {\n    this.liveSubscription?.unsubscribe();\n    if (!name) {\n      this.selectedSessionName = null;\n      this.liveTree = null;\n      this.liveAnalysis = null;\n      return;\n    }\n    this.selectedSessionName = name;\n    this.liveSubscription = this.sessionRegistry.observe(name).subscribe(session => {\n      this.zone.run(() => {\n        this.liveTree = this.buildTreeFromSession(session);\n        this.liveAnalysis = analyzeSession(session);\n        this.liveSelectedKey = null;\n      });\n    });\n  }\n\n  private buildTreeFromSession(session: Session): ElementTreeNode | null {\n    try {\n      return this.elementToNode(session.pageModel.page);\n    } catch {\n      return null;\n    }\n  }\n\n  private elementToNode(el: BlueriqElement): ElementTreeNode {\n    const withChildren = el as unknown as ElementWithChildren;\n    const children: ElementTreeNode[] = Array.isArray(withChildren.children)\n      ? withChildren.children.map(c => this.elementToNode(c))\n      : [];\n    const totalDescendants = children.reduce((n, c) => n + 1 + c.totalDescendants, 0);\n    return {\n      key: el.key,\n      type: el.type,\n      label: (el as any).displayName ?? el.name ?? el.type,\n      styles: Array.from<string>((el.styles as any)._styles ?? []),\n      children,\n      totalDescendants,\n    };\n  }\n\n  ngOnDestroy(): void {\n    this.liveSubscription?.unsubscribe();\n  }\n}\n","<div class=\"dev-session-bar\">\n  <select class=\"dev-session-select\" (change)=\"selectLiveSession($any($event.target).value)\">\n    <option value=\"\">— select session —</option>\n    <option *ngFor=\"let s of liveSessions\" [value]=\"s.sessionName\">\n      {{ s.sessionName }}\n    </option>\n  </select>\n</div>\n<span *ngIf=\"!liveSessions.length\" class=\"dev-muted dev-muted--padded\">No active sessions</span>\n<span *ngIf=\"liveSessions.length && !liveTree\" class=\"dev-muted dev-muted--padded\">Select a session to inspect</span>\n<ng-container *ngIf=\"liveTree\">\n  <div class=\"dev-session-tree\">\n    <app-dev-element-tree\n      [nodes]=\"[liveTree]\"\n      [collapsedKeys]=\"liveTreeCollapsedKeys\"\n      [selectedKey]=\"liveSelectedKey\"\n      [onSelect]=\"onLiveTreeSelect\"\n      [onToggle]=\"onLiveTreeToggle\">\n    </app-dev-element-tree>\n  </div>\n  <app-dev-insights-panel *ngIf=\"liveAnalysis\" [analysis]=\"liveAnalysis\"></app-dev-insights-panel>\n</ng-container>\n","import { Component, EventEmitter, OnDestroy, OnInit, Output, ViewEncapsulation } from '@angular/core';\nimport { CacheEvent, CacheEventType, HealthCounters } from '../bq-lens.types';\nimport { downloadBlob } from '../dev-clipboard.utils';\nimport { extractSessionId } from '../dev-url.utils';\nimport { DevCaptureService } from '../services/dev-capture.service';\nimport { DevCacheStorageService } from '../services/dev-cache-storage.service';\nimport { DevElementCacheService, stripInternalFields } from '../services/dev-element-cache.service';\nimport { DevStructureAuditService } from '../services/dev-structure-audit.service';\nimport { DevTemplateCacheService } from '../services/dev-template-cache.service';\n\nconst BQ_LENS_VERSION = '0.0.2';\n\n/** Convert the structure snapshot's Map/Set shape into JSON-friendly arrays/records. */\nfunction serializeStructure(snapshot: ReturnType<DevElementCacheService['getStructureSnapshot']>) {\n  const childrenOf: Record<string, string[]> = {};\n  for (const [k, v] of snapshot.childrenOf) childrenOf[k] = [...v];\n  const parentOf: Record<string, string> = {};\n  for (const [k, v] of snapshot.parentOf) parentOf[k] = v;\n  return {\n    elementKeys: [...snapshot.elementKeys],\n    parentOf,\n    childrenOf,\n    tombstoneKeys: [...snapshot.tombstoneKeys],\n  };\n}\n\n/**\n * Diagnostic surface for the bq-lens storage layers — counters, the\n * cacheEvent ring, audit trigger, and rehydrate trigger. Read-only by\n * default; the action buttons are explicit and confirm-on-click for\n * the destructive ones.\n *\n * Rendered as a header-toggled overlay inside the main bq-lens panel,\n * sibling to (not a tab of) Captures/Sessions. The host listens for\n * `closed` to flip the toggle back. No external CSS dependencies —\n * uses the `dev-*` utility classes already present in `_panel-shell.scss`\n * plus the dedicated `_cache-internals.scss` partial.\n */\n@Component({\n  selector: 'app-dev-cache-internals-panel',\n  templateUrl: './dev-cache-internals-panel.component.html',\n  standalone: false,\n  encapsulation: ViewEncapsulation.None,\n})\nexport class DevCacheInternalsPanelComponent implements OnInit, OnDestroy {\n  @Output() closed = new EventEmitter<void>();\n  counters: HealthCounters = {\n    cached: 0,\n    tombstoned: 0,\n    parentLinks: 0,\n    cacheEvents: 0,\n    slowMerges: 0,\n    integrityViolations: 0,\n    templateMemoSize: 0,\n    templateMemoHitRate: 0,\n    templateMemoEvictions: 0,\n  };\n\n  events: CacheEvent[] = [];\n  filterType: '' | CacheEventType = '';\n  filterText = '';\n  lastAuditSummary: { ts: number; violations: number; checked: number } | null = null;\n\n  private refreshHandle: ReturnType<typeof setInterval> | null = null;\n\n  constructor(\n    private readonly cache: DevElementCacheService,\n    private readonly captures: DevCaptureService,\n    private readonly storage: DevCacheStorageService,\n    private readonly audit: DevStructureAuditService,\n    private readonly templateCache: DevTemplateCacheService,\n  ) {}\n\n  ngOnInit(): void {\n    this.refresh();\n    this.refreshHandle = setInterval(() => this.refresh(), 2000);\n  }\n\n  ngOnDestroy(): void {\n    if (this.refreshHandle !== null) clearInterval(this.refreshHandle);\n  }\n\n  refresh(): void {\n    const events = this.cache.getCacheEvents();\n    this.events = [...events].reverse();\n    const memoStats = this.templateCache.stats();\n    this.counters = {\n      cached: this.cache.allElements().length,\n      tombstoned: this.cache.allTombstones().length,\n      parentLinks: this.cache.getStructureSnapshot().parentOf.size,\n      cacheEvents: events.length,\n      slowMerges: events.filter(e => e.type === 'slow-merge').length,\n      integrityViolations: events.filter(e => e.type === 'integrity-violation').length,\n      templateMemoSize: memoStats.size,\n      templateMemoHitRate: Math.round(memoStats.hitRate * 100),\n      templateMemoEvictions: memoStats.evictions,\n    };\n    this.lastAuditSummary = this.audit.getLastSummary();\n  }\n\n  filteredEvents(): CacheEvent[] {\n    const text = this.filterText.trim().toLowerCase();\n    return this.events.filter(e => {\n      if (this.filterType && e.type !== this.filterType) return false;\n      if (!text) return true;\n      try {\n        return JSON.stringify(e).toLowerCase().includes(text);\n      } catch {\n        return false;\n      }\n    });\n  }\n\n  forceAudit(): void {\n    const result = this.audit.runNow();\n    this.lastAuditSummary = { ts: Date.now(), ...result };\n    this.refresh();\n  }\n\n  forceRehydrate(): void {\n    // Clear the in-memory cache, then replay every persisted capture\n    // currently in the FIFO. The captures$ array hasn't moved, so the\n    // panel stays consistent — only the derived cache state is rebuilt.\n    this.cache.clearCache();\n    this.templateCache.clear();\n    this.cache.rehydrateFromCaptures(this.captures.captures);\n    this.refresh();\n  }\n\n  /**\n   * Pack everything a teammate needs to reproduce a bug — captures, cache\n   * snapshot (with internals stripped), structure graph, counters, the\n   * cache-event ring, and the page tree rooted at whichever capture\n   * sourced the most recent page render — into one downloadable JSON.\n   *\n   * Captures contain raw response bodies, so the bundle inherits whatever\n   * sensitivity the captures had. The Export button's tooltip warns about\n   * that explicitly.\n   */\n  exportBugBundle(): void {\n    const captures = this.captures.captures;\n    const firstUrl = captures[0]?.url ?? '';\n    const sessionId = firstUrl ? extractSessionId(firstUrl) : null;\n\n    const elements = this.cache.allElements();\n    // Walk every cached element looking for one with type 'page' so the\n    // bundle has a tree rooted at the latest page. If there are several,\n    // first match wins — bug-report bundles are point-in-time, not exhaustive.\n    const pageElement = elements.find((e: any) => e?.type === 'page');\n    const pageTree = pageElement?.key ? this.cache.buildTree(pageElement.key) : null;\n\n    const bundle = {\n      metadata: {\n        bqLensVersion: BQ_LENS_VERSION,\n        timestamp: new Date().toISOString(),\n        userAgent: navigator.userAgent,\n        sessionId,\n        tabId: this.tabId(),\n      },\n      captures,\n      cache: {\n        elements: stripInternalFields(elements),\n        tombstones: this.cache.allTombstones(),\n        structure: serializeStructure(this.cache.getStructureSnapshot()),\n        counters: this.counters,\n        cacheEvents: this.cache.getCacheEvents(),\n      },\n      pageTree,\n    };\n\n    downloadBlob(\n      JSON.stringify(bundle, null, 2),\n      `bq-lens-bundle-${Date.now()}.json`,\n      'application/json',\n    );\n  }\n\n  formatTime(ts: number): string {\n    return new Date(ts).toLocaleTimeString();\n  }\n\n  iconForEvent(type: string): string {\n    switch (type) {\n      case 'integrity-violation': return 'shield-alt';\n      case 'parse-error':         return 'exclamation-circle';\n      case 'slow-merge':          return 'exclamation-triangle';\n      case 'quota':               return 'exclamation-triangle';\n      case 'skip':                return 'ban';\n      case 'clear':               return 'trash';\n      default:                    return 'circle-notch';\n    }\n  }\n\n  formatDetail(detail: unknown): string {\n    if (detail === undefined || detail === null) return '';\n    if (typeof detail === 'string') return detail;\n    try {\n      return JSON.stringify(detail);\n    } catch {\n      return String(detail);\n    }\n  }\n\n  storageEvents(): readonly { type: string; ts: number; detail?: unknown }[] {\n    return this.storage.getStorageEvents();\n  }\n\n  tabId(): string {\n    return this.storage.getTabId();\n  }\n}\n","<div class=\"dev-cache-internals\">\n  <div class=\"dev-cache-internals__header\">\n    <h3 class=\"dev-cache-internals__title\">Internals</h3>\n    <span class=\"dev-cache-internals__tab\"\n      data-tooltip=\"A unique label for this browser tab. Each tab keeps its own captures and cache, so this number lets you tell two open tabs apart in logs.\">tab {{ tabId() }}</span>\n  </div>\n\n  <!-- Live counters -->\n  <div class=\"dev-cache-internals__counters\">\n    <div class=\"dev-cache-internals__counter\"\n      data-tooltip=\"How many UI elements bq-lens is currently tracking from the running app — pages, containers, fields, buttons, etc. Goes up as new screens are visited and down when elements are removed.\">\n      <span class=\"dev-cache-internals__counter-label\">\n        <bq-icon name=\"puzzle-piece\"></bq-icon>cached\n      </span>\n      <span class=\"dev-cache-internals__counter-value\">{{ counters.cached }}</span>\n    </div>\n    <div class=\"dev-cache-internals__counter\"\n      data-tooltip=\"Elements the app has deleted but bq-lens kept around briefly. We hold them so you can still inspect what just disappeared, undo, or notice when something gets re-created. Old tombstones expire on their own.\">\n      <span class=\"dev-cache-internals__counter-label\">\n        <bq-icon name=\"trash\"></bq-icon>tombstoned\n      </span>\n      <span class=\"dev-cache-internals__counter-value\">{{ counters.tombstoned }}</span>\n    </div>\n    <div class=\"dev-cache-internals__counter\"\n      data-tooltip=\"How many parent–child relationships are tracked, e.g. a field that lives inside a container. One link per nested element. A drop here without a matching drop in 'cached' usually means something fell out of its parent.\">\n      <span class=\"dev-cache-internals__counter-label\">\n        <bq-icon name=\"route\"></bq-icon>parent links\n      </span>\n      <span class=\"dev-cache-internals__counter-value\">{{ counters.parentLinks }}</span>\n    </div>\n    <div class=\"dev-cache-internals__counter\"\n      data-tooltip=\"Times a single capture took longer than 5ms to merge into the cache. Should normally stay at zero — anything above that is the live panel starting to feel sluggish, worth looking into.\">\n      <span class=\"dev-cache-internals__counter-label\">\n        <bq-icon name=\"exclamation-triangle\"></bq-icon>slow merges\n      </span>\n      <span class=\"dev-cache-internals__counter-value\">{{ counters.slowMerges }}</span>\n    </div>\n    <div class=\"dev-cache-internals__counter\"\n      data-tooltip=\"Structural problems caught in the element graph: orphans (a child whose parent is missing), cycles (A is inside B which is inside A), or one element claimed by two different parents. Should always be zero — anything above means the cache disagrees with itself.\">\n      <span class=\"dev-cache-internals__counter-label\">\n        <bq-icon name=\"shield-alt\"></bq-icon>integrity\n      </span>\n      <span class=\"dev-cache-internals__counter-value\">{{ counters.integrityViolations }}</span>\n    </div>\n    <div class=\"dev-cache-internals__counter\"\n      data-tooltip=\"Generated UI templates we've remembered so far, plus the percentage of inspector views that were served from memory instead of regenerated. Higher hit rate = snappier inspector.\">\n      <span class=\"dev-cache-internals__counter-label\">\n        <bq-icon name=\"file-alt\"></bq-icon>memo\n      </span>\n      <span class=\"dev-cache-internals__counter-value\">{{ counters.templateMemoSize }} ({{ counters.templateMemoHitRate }}%)</span>\n    </div>\n    <div class=\"dev-cache-internals__counter\"\n      data-tooltip=\"Templates the memo had to drop because it filled up. A small number is normal. A fast-rising number means the memo is too small and the inspector is regenerating views it could have remembered.\">\n      <span class=\"dev-cache-internals__counter-label\">\n        <bq-icon name=\"ban\"></bq-icon>memo evicted\n      </span>\n      <span class=\"dev-cache-internals__counter-value\">{{ counters.templateMemoEvictions }}</span>\n    </div>\n  </div>\n\n  <!-- Actions -->\n  <div class=\"dev-cache-internals__actions\">\n    <button type=\"button\" (click)=\"forceAudit()\"\n      data-tooltip=\"Walk the entire element graph right now and check it for problems — orphans, cycles, dangling links, mismatched parent/child references. Updates the integrity counter and the audit summary line.\">\n      <bq-icon name=\"shield-alt\"></bq-icon>Run audit\n    </button>\n    <button type=\"button\" (click)=\"forceRehydrate()\"\n      data-tooltip=\"Throw away the in-memory cache and rebuild it from durable storage (the captures saved in IndexedDB). Use this if numbers look wrong but reloading the whole app would be too disruptive.\">\n      <bq-icon name=\"sync-alt\"></bq-icon>Force rehydrate\n    </button>\n    <button type=\"button\" (click)=\"exportBugBundle()\"\n      data-tooltip=\"Download a single JSON file with captures, cache state, structure graph, counters, the event log, and the current page tree. Use it to share a reproducer with a teammate. The file contains response bodies — treat it as you would treat the captures themselves.\">\n      <bq-icon name=\"download\"></bq-icon>Export bug bundle\n    </button>\n  </div>\n\n  <!-- Last audit summary -->\n  <div class=\"dev-cache-internals__audit\" *ngIf=\"lastAuditSummary\"\n    data-tooltip=\"When the most recent integrity audit ran (manual or background), how many things it inspected, and how many problems it found. Audits run automatically every ~30 seconds when the panel is idle.\">\n    Last audit @ {{ formatTime(lastAuditSummary.ts) }}: {{ lastAuditSummary.violations }} violations / {{ lastAuditSummary.checked }} checked\n  </div>\n\n  <!-- Event log filter -->\n  <div class=\"dev-cache-internals__filter\">\n    <select [(ngModel)]=\"filterType\"\n      data-tooltip=\"Show only one kind of event. clear = the cache was wiped. skip = a duplicate or empty capture was ignored. parse-error = a response body was malformed. quota = a bounded ring or memo had to drop something. integrity-violation = the audit found a structural problem. slow-merge = a capture took >5ms to absorb.\">\n      <option value=\"\">all events</option>\n      <option value=\"clear\">clear</option>\n      <option value=\"skip\">skip</option>\n      <option value=\"parse-error\">parse-error</option>\n      <option value=\"quota\">quota</option>\n      <option value=\"integrity-violation\">integrity-violation</option>\n      <option value=\"slow-merge\">slow-merge</option>\n    </select>\n    <input type=\"text\" [(ngModel)]=\"filterText\" placeholder=\"search detail...\"\n      data-tooltip=\"Search inside event details — element keys, URLs, reasons, anything in the right-hand column. Case-insensitive substring match.\" />\n  </div>\n\n  <!-- Event log -->\n  <ul class=\"dev-cache-internals__events\"\n    data-tooltip=\"A rolling log of notable things that happened inside the cache: skips, errors, integrity findings, capacity overflows, slow merges. Newest at the bottom; bounded so it can't grow forever.\">\n    <li *ngFor=\"let e of filteredEvents()\" [attr.data-type]=\"e.type\">\n      <span class=\"dev-cache-internals__event-time\">{{ formatTime(e.ts) }}</span>\n      <span class=\"dev-cache-internals__event-type\">\n        <bq-icon [name]=\"iconForEvent(e.type)\"></bq-icon>{{ e.type }}\n      </span>\n      <span class=\"dev-cache-internals__event-detail\">{{ formatDetail(e.detail) }}</span>\n    </li>\n    <li *ngIf=\"!filteredEvents().length\" class=\"dev-cache-internals__empty\">no events</li>\n  </ul>\n\n  <!-- Storage layer event log -->\n  <details class=\"dev-cache-internals__storage\">\n    <summary\n      data-tooltip=\"Lower-level events from the durable storage layer (IndexedDB) — saves, loads, schema upgrades, redactions of large bodies, evictions when storage gets full. Mostly relevant when debugging persistence issues.\">Storage events ({{ storageEvents().length }})</summary>\n    <ul>\n      <li *ngFor=\"let e of storageEvents()\">\n        <span>{{ formatTime(e.ts) }}</span>\n        <span>{{ e.type }}</span>\n        <span>{{ formatDetail(e.detail) }}</span>\n      </li>\n    </ul>\n  </details>\n</div>\n","import { Directive, OnDestroy, OnInit } from '@angular/core';\n\n// Delay before a freshly-hovered tooltip appears. Long enough that brushing\n// the cursor over the panel doesn't trigger a flash of every label, short\n// enough that the dev still sees the tip when they actually want it.\nconst HOVER_SHOW_DELAY_MS = 400;\n\n@Directive({ selector: '[appDevTooltip]', standalone: false })\nexport class DevTooltipDirective implements OnInit, OnDestroy {\n  private tooltipEl: HTMLDivElement | null = null;\n  private tooltipTarget: HTMLElement | null = null;\n  private showTimer: ReturnType<typeof setTimeout> | null = null;\n  private lastPos: { x: number; y: number } = { x: 0, y: 0 };\n\n  ngOnInit(): void {\n    this.tooltipEl = document.createElement('div');\n    this.tooltipEl.className = 'dev-tooltip';\n    document.body.appendChild(this.tooltipEl);\n    document.addEventListener('mouseover', this.onOver);\n    document.addEventListener('mousemove', this.onMove);\n    document.addEventListener('mouseout', this.onOut);\n  }\n\n  ngOnDestroy(): void {\n    document.removeEventListener('mouseover', this.onOver);\n    document.removeEventListener('mousemove', this.onMove);\n    document.removeEventListener('mouseout', this.onOut);\n    this.cancelPendingShow();\n    this.tooltipEl?.remove();\n    this.tooltipEl = null;\n    this.tooltipTarget = null;\n  }\n\n  private readonly onOver = (e: MouseEvent): void => {\n    const el = (e.target as HTMLElement).closest('[data-tooltip]') as HTMLElement | null;\n    if (el === this.tooltipTarget) return;\n    this.tooltipTarget = el;\n    this.cancelPendingShow();\n    if (!el) { this.hide(); return; }\n    const text = el.dataset['tooltip'];\n    if (!text) { this.hide(); return; }\n    this.lastPos = { x: e.clientX, y: e.clientY };\n    // Already showing for the previous target → swap instantly so adjacent\n    // hovers don't each pay the full delay. Fresh hover → wait the delay.\n    const alreadyVisible = this.tooltipEl?.style.display === 'block';\n    if (alreadyVisible) {\n      this.show(el, text, this.lastPos.x, this.lastPos.y);\n      return;\n    }\n    this.showTimer = setTimeout(() => {\n      this.showTimer = null;\n      // Target may have changed or been cleared while we were waiting.\n      if (this.tooltipTarget !== el) return;\n      this.show(el, text, this.lastPos.x, this.lastPos.y);\n    }, HOVER_SHOW_DELAY_MS);\n  };\n\n  private readonly onMove = (e: MouseEvent): void => {\n    this.lastPos = { x: e.clientX, y: e.clientY };\n    if (!this.tooltipTarget || !this.tooltipEl || this.tooltipEl.style.display === 'none') return;\n    this.position(e.clientX, e.clientY);\n  };\n\n  private readonly onOut = (e: MouseEvent): void => {\n    const el = (e.target as HTMLElement).closest('[data-tooltip]') as HTMLElement | null;\n    if (el && el === this.tooltipTarget) {\n      this.cancelPendingShow();\n      this.hide();\n    }\n  };\n\n  private show(_el: HTMLElement, text: string, x: number, y: number): void {\n    if (!this.tooltipEl) return;\n    this.tooltipEl.textContent = text;\n    this.tooltipEl.style.display = 'block';\n    this.position(x, y);\n  }\n\n  private position(x: number, y: number): void {\n    if (!this.tooltipEl) return;\n    const w = this.tooltipEl.offsetWidth;\n    const left = Math.min(x + 14, window.innerWidth - w - 8);\n    const top = Math.max(4, y - 34);\n    this.tooltipEl.style.left = left + 'px';\n    this.tooltipEl.style.top = top + 'px';\n  }\n\n  private cancelPendingShow(): void {\n    if (this.showTimer !== null) {\n      clearTimeout(this.showTimer);\n      this.showTimer = null;\n    }\n  }\n\n  private hide(): void {\n    if (this.tooltipEl) this.tooltipEl.style.display = 'none';\n    this.tooltipTarget = null;\n  }\n}\n","import { Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core';\nimport { AnalysisDiffEntry, CaptureEntry } from '../bq-lens.types';\nimport {\n  DiffHunk,\n  DiffLine,\n  SemanticChange,\n  analysisDiff,\n  groupIntoHunks,\n  semanticDiff,\n} from '../dev-diff.utils';\n\nexport type DiffMode = 'structure' | 'semantic' | 'text';\n\n@Component({\n  selector: 'app-dev-capture-diff',\n  templateUrl: './dev-capture-diff.component.html',\n  standalone: false,\n  encapsulation: ViewEncapsulation.None,\n})\nexport class DevCaptureDiffComponent {\n  @Input() captureA: CaptureEntry | null = null;\n  @Input() captureB: CaptureEntry | null = null;\n  @Input() diffLines: DiffLine[] = [];\n  @Output() closed = new EventEmitter<void>();\n\n  mode: DiffMode = 'structure';\n\n  setMode(m: DiffMode): void { this.mode = m; }\n\n  get addedCount(): number {\n    if (this.mode === 'text') return this.diffLines.filter(l => l.type === 'add').length;\n    if (this.mode === 'semantic') return this.semanticChanges.filter(c => c.kind === 'added').length;\n    return this.structureChanges.filter(c => c.kind === 'added').length;\n  }\n\n  get removedCount(): number {\n    if (this.mode === 'text') return this.diffLines.filter(l => l.type === 'remove').length;\n    if (this.mode === 'semantic') return this.semanticChanges.filter(c => c.kind === 'removed').length;\n    return this.structureChanges.filter(c => c.kind === 'removed').length;\n  }\n\n  get modifiedCount(): number {\n    if (this.mode === 'semantic') return this.semanticChanges.filter(c => c.kind === 'modified').length;\n    if (this.mode === 'structure') return this.structureChanges.filter(c => c.kind === 'modified').length;\n    return 0;\n  }\n\n  get hunks(): DiffHunk[] { return groupIntoHunks(this.diffLines); }\n\n  get semanticChanges(): SemanticChange[] {\n    if (!this.captureA?.responseBody || !this.captureB?.responseBody) return [];\n    return semanticDiff(this.captureA.responseBody, this.captureB.responseBody);\n  }\n\n  get structureChanges(): AnalysisDiffEntry[] {\n    if (!this.captureA?.responseBody || !this.captureB?.responseBody) return [];\n    return analysisDiff(\n      this.captureA.responseBody,\n      this.captureB.responseBody,\n      this.captureA.requestBody,\n      this.captureB.requestBody,\n    );\n  }\n\n  formatValue(v: any): string {\n    if (v === undefined) return '∅';\n    if (v === null) return 'null';\n    if (typeof v === 'string') return v;\n    if (Array.isArray(v)) return `[${v.length}] ${v.slice(0, 3).map(x => this.formatValue(x)).join(', ')}${v.length > 3 ? '…' : ''}`;\n    if (typeof v === 'object') return JSON.stringify(v);\n    return String(v);\n  }\n}\n","<div class=\"dev-large-view\" (click)=\"closed.emit()\">\n  <div class=\"dev-large-view__panel dev-diff\" (click)=\"$event.stopPropagation()\">\n\n    <div class=\"dev-large-view__header\">\n      <div class=\"dev-diff__header-urls\">\n        <span class=\"dev-diff__url dev-diff__url--remove\">{{ captureA?.url }}</span>\n        <span class=\"dev-diff__url dev-diff__url--add\">{{ captureB?.url }}</span>\n      </div>\n      <div class=\"dev-json-actions\">\n        <div class=\"dev-diff__mode\">\n          <button class=\"dev-diff__mode-btn\"\n                  [class.dev-diff__mode-btn--active]=\"mode === 'structure'\"\n                  (click)=\"setMode('structure')\"\n                  data-tooltip=\"Field-level diff: which sections, fields, buttons, tables changed and how. Best place to start for 'what changed?'\">Structure</button>\n          <button class=\"dev-diff__mode-btn\"\n                  [class.dev-diff__mode-btn--active]=\"mode === 'semantic'\"\n                  (click)=\"setMode('semantic')\"\n                  data-tooltip=\"Element-level diff using raw cache keys. Useful when an element appeared or disappeared but you don't know its functional name yet.\">Semantic</button>\n          <button class=\"dev-diff__mode-btn\"\n                  [class.dev-diff__mode-btn--active]=\"mode === 'text'\"\n                  (click)=\"setMode('text')\"\n                  data-tooltip=\"Raw JSON line-by-line diff. Last resort when the structural views show nothing — usually means the change is metadata, ordering, or whitespace.\">Text</button>\n        </div>\n        <span class=\"dev-diff__stat dev-diff__stat--modify\" *ngIf=\"modifiedCount\">~{{ modifiedCount }}</span>\n        <span class=\"dev-diff__stat dev-diff__stat--add\" *ngIf=\"addedCount\">+{{ addedCount }}</span>\n        <span class=\"dev-diff__stat dev-diff__stat--remove\" *ngIf=\"removedCount\">-{{ removedCount }}</span>\n        <button class=\"dev-icon-btn\" (click)=\"closed.emit()\" title=\"Close (Esc)\"><bq-icon name=\"times\"></bq-icon></button>\n      </div>\n    </div>\n\n    <div class=\"dev-diff__body\" *ngIf=\"mode === 'text'\">\n      <ng-container *ngFor=\"let hunk of hunks\">\n        <div *ngIf=\"hunk.hiddenBefore > 0\" class=\"dev-diff__separator\">\n          ··· {{ hunk.hiddenBefore }} unchanged line{{ hunk.hiddenBefore === 1 ? '' : 's' }} ···\n        </div>\n        <div *ngFor=\"let line of hunk.lines\"\n             class=\"dev-diff__line dev-diff__line--{{ line.type }}\">\n          <span class=\"dev-diff__gutter\">{{ line.type === 'add' ? '+' : line.type === 'remove' ? '-' : ' ' }}</span>\n          <span class=\"dev-diff__text\">{{ line.text }}</span>\n        </div>\n      </ng-container>\n      <div *ngIf=\"!hunks.length\" class=\"dev-diff__separator\">No differences</div>\n    </div>\n\n    <div class=\"dev-diff__body dev-diff__body--semantic\" *ngIf=\"mode === 'semantic'\">\n      <div *ngIf=\"!semanticChanges.length\" class=\"dev-diff__separator\">No element-level differences</div>\n      <div *ngFor=\"let change of semanticChanges\"\n           class=\"dev-diff__change dev-diff__change--{{ change.kind }}\">\n        <div class=\"dev-diff__change-head\">\n          <span class=\"dev-diff__change-kind\">{{ change.kind === 'added' ? '+' : change.kind === 'removed' ? '−' : '~' }}</span>\n          <span class=\"dev-type-chip dev-type-chip--{{ change.type }}\">{{ change.type }}</span>\n          <span class=\"dev-diff__change-label\">{{ change.label }}</span>\n          <span class=\"dev-diff__change-key dev-muted\">{{ change.key }}</span>\n        </div>\n        <div class=\"dev-diff__change-fields\" *ngIf=\"change.changes?.length\">\n          <div *ngFor=\"let f of change.changes\" class=\"dev-diff__field\">\n            <span class=\"dev-diff__field-name\">{{ f.field }}</span>\n            <span class=\"dev-diff__field-before\">{{ formatValue(f.before) }}</span>\n            <span class=\"dev-diff__field-arrow\">→</span>\n            <span class=\"dev-diff__field-after\">{{ formatValue(f.after) }}</span>\n          </div>\n        </div>\n      </div>\n    </div>\n\n    <div class=\"dev-diff__body dev-diff__body--semantic\" *ngIf=\"mode === 'structure'\">\n      <div *ngIf=\"!structureChanges.length\" class=\"dev-diff__separator\">No structural differences — captures describe the same page.</div>\n      <div *ngFor=\"let change of structureChanges\"\n           class=\"dev-diff__change dev-diff__change--{{ change.kind }}\">\n        <div class=\"dev-diff__change-head\">\n          <span class=\"dev-diff__change-kind\">{{ change.kind === 'added' ? '+' : change.kind === 'removed' ? '−' : '~' }}</span>\n          <span class=\"dev-type-chip dev-type-chip--{{ change.category }}\">{{ change.category }}</span>\n          <span class=\"dev-diff__change-label\">{{ change.identity }}</span>\n        </div>\n        <div class=\"dev-diff__change-fields\" *ngIf=\"change.changes?.length\">\n          <div *ngFor=\"let f of change.changes\" class=\"dev-diff__field\">\n            <span class=\"dev-diff__field-name\">{{ f.attr }}</span>\n            <span class=\"dev-diff__field-before\">{{ formatValue(f.before) }}</span>\n            <span class=\"dev-diff__field-arrow\">→</span>\n            <span class=\"dev-diff__field-after\">{{ formatValue(f.after) }}</span>\n          </div>\n        </div>\n      </div>\n    </div>\n\n  </div>\n</div>\n","import { Injectable } from '@angular/core';\n\nexport interface SearchField {\n  value: string;\n  weight: number;\n}\n\nexport interface SearchFilters {\n  types?: string[];\n  styles?: string[];\n  hasErrors?: boolean;\n  required?: boolean;\n  readonly?: boolean;\n}\n\nexport interface FilterableElement {\n  type: string;\n  styles: string[];\n  hasErrors: boolean;\n  required: boolean;\n  readonly: boolean;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class DevSearchService {\n\n  score<T extends { searchFields: SearchField[] } & Partial<FilterableElement>>(\n    elements: T[],\n    query: string,\n    limit = 15,\n    filters: SearchFilters = {},\n  ): T[] {\n    const filtered = this.applyFilters(elements, filters);\n    const tokens = query.trim().toLowerCase().split(/\\s+/).filter(Boolean);\n\n    // No query but filters active → return filtered list (capped) sorted by name.\n    if (!tokens.length) {\n      if (!this.hasActiveFilters(filters)) return [];\n      return filtered.slice(0, limit);\n    }\n\n    const scored: Array<{ el: T; score: number }> = [];\n    for (const el of filtered) {\n      const s = this.scoreElement(el.searchFields, tokens);\n      if (s > 0) scored.push({ el, score: s });\n    }\n    return scored\n      .sort((a, b) => b.score - a.score)\n      .slice(0, limit)\n      .map(r => r.el);\n  }\n\n  hasActiveFilters(filters: SearchFilters): boolean {\n    return !!(\n      filters.types?.length ||\n      filters.styles?.length ||\n      filters.hasErrors ||\n      filters.required ||\n      filters.readonly\n    );\n  }\n\n  private applyFilters<T extends Partial<FilterableElement>>(elements: T[], filters: SearchFilters): T[] {\n    if (!this.hasActiveFilters(filters)) return elements;\n    return elements.filter(el => {\n      if (filters.types?.length && !filters.types.includes(el.type ?? '')) return false;\n      if (filters.styles?.length) {\n        const styles = el.styles ?? [];\n        if (!filters.styles.some(s => styles.includes(s))) return false;\n      }\n      if (filters.hasErrors && !el.hasErrors) return false;\n      if (filters.required && !el.required) return false;\n      if (filters.readonly && !el.readonly) return false;\n      return true;\n    });\n  }\n\n  private scoreElement(fields: SearchField[], tokens: string[]): number {\n    let total = 0;\n    for (const token of tokens) {\n      const best = this.bestTokenScore(fields, token);\n      if (best === 0) return 0; // all tokens must match (AND semantics)\n      total += best;\n    }\n    return total;\n  }\n\n  private bestTokenScore(fields: SearchField[], token: string): number {\n    let best = 0;\n    for (const { value, weight } of fields) {\n      const s = this.scoreToken(token, value, weight);\n      if (s > best) best = s;\n    }\n    return best;\n  }\n\n  private scoreToken(token: string, value: string, weight: number): number {\n    if (!value) return 0;\n    const v = value.toLowerCase();\n\n    if (v === token) return weight * 100;\n    if (v.startsWith(token)) return weight * 70;\n    if (this.matchesWordBoundary(token, v, value)) return weight * 55;\n    if (v.includes(token)) return weight * 40;\n\n    const fuzz = this.fuzzyScore(token, v);\n    return fuzz > 0 ? weight * fuzz * 20 : 0;\n  }\n\n  private matchesWordBoundary(token: string, lower: string, original: string): boolean {\n    // Split on explicit separators AND camelCase boundaries, then check word prefixes.\n    // e.g. \"ind\" matches \"KolomIndeling\" via the \"Indeling\" word part.\n    const words = original\n      .replace(/([a-z])([A-Z])/g, '$1 $2')\n      .split(/[\\s_\\-]+/);\n    return words.some(w => w.toLowerCase().startsWith(token));\n  }\n\n  private fuzzyScore(token: string, text: string): number {\n    // All chars of token must appear in order in text.\n    // Returns 0 (no match) or a 0–1 quality score weighted by consecutiveness and position.\n    let ti = 0;\n    let consecutive = 0;\n    let consecutiveBonus = 0;\n    let firstIdx = -1;\n\n    for (let i = 0; i < text.length && ti < token.length; i++) {\n      if (text[i] === token[ti]) {\n        if (firstIdx < 0) firstIdx = i;\n        consecutive++;\n        consecutiveBonus += consecutive * consecutive; // quadratic bonus for runs\n        ti++;\n      } else {\n        consecutive = 0;\n      }\n    }\n\n    if (ti < token.length) return 0;\n\n    const maxBonus = token.length * token.length;\n    const consRatio = Math.min(consecutiveBonus / maxBonus, 1);\n    const posRatio = 1 - (firstIdx / text.length) * 0.5;\n    return consRatio * 0.7 + posRatio * 0.3;\n  }\n}\n","import { AfterViewInit, Component, ElementRef, EventEmitter, Input, OnDestroy, Output, ViewChild, ViewEncapsulation } from '@angular/core';\nimport { DevSearchService, SearchField, SearchFilters } from '../services/dev-search.service';\n\nexport { SearchField };\n\nexport interface SearchableElement {\n  key: string;\n  type: string;\n  name: string;\n  styles: string[];\n  hasErrors: boolean;\n  required: boolean;\n  readonly: boolean;\n  searchFields: SearchField[];\n}\n\nconst TOGGLE_FILTERS: Array<{ id: 'hasErrors' | 'required' | 'readonly'; label: string }> = [\n  { id: 'hasErrors', label: 'Has errors' },\n  { id: 'required',  label: 'Required'   },\n  { id: 'readonly',  label: 'Readonly'   },\n];\n\nconst TYPE_LIMIT = 6;\n\n@Component({\n  selector: 'app-dev-element-search',\n  templateUrl: './dev-element-search.component.html',\n  standalone: false,\n  encapsulation: ViewEncapsulation.None,\n})\nexport class DevElementSearchComponent implements AfterViewInit, OnDestroy {\n  @ViewChild('searchInput') searchInput!: ElementRef<HTMLInputElement>;\n  @Input() elements: SearchableElement[] = [];\n  @Output() elementSelected = new EventEmitter<string>();\n  @Output() elementPreviewed = new EventEmitter<string>();\n  @Output() closed = new EventEmitter<void>();\n\n  query = '';\n  activeIndex = -1;\n  filters: SearchFilters = {};\n  readonly toggleFilters = TOGGLE_FILTERS;\n  private previewTimer: ReturnType<typeof setTimeout> | null = null;\n  private scrollTimer: ReturnType<typeof setTimeout> | null = null;\n\n  constructor(private searchService: DevSearchService) {}\n\n  previewAfterDelay(key: string): void {\n    if (this.previewTimer) clearTimeout(this.previewTimer);\n    this.previewTimer = setTimeout(() => this.elementPreviewed.emit(key), 180);\n  }\n\n  ngAfterViewInit(): void {\n    this.searchInput.nativeElement.focus();\n  }\n\n  get results(): SearchableElement[] {\n    return this.searchService.score(this.elements, this.query, 15, this.filters);\n  }\n\n  get availableTypes(): string[] {\n    const counts = new Map<string, number>();\n    for (const el of this.elements) {\n      const t = el.type || '?';\n      counts.set(t, (counts.get(t) ?? 0) + 1);\n    }\n    return [...counts.entries()]\n      .sort((a, b) => b[1] - a[1])\n      .slice(0, TYPE_LIMIT)\n      .map(([t]) => t);\n  }\n\n  isTypeActive(type: string): boolean {\n    return !!this.filters.types?.includes(type);\n  }\n\n  toggleType(type: string): void {\n    const current = this.filters.types ?? [];\n    const next = current.includes(type)\n      ? current.filter(t => t !== type)\n      : [...current, type];\n    this.filters = { ...this.filters, types: next.length ? next : undefined };\n    this.activeIndex = -1;\n  }\n\n  toggleFlag(id: 'hasErrors' | 'required' | 'readonly'): void {\n    this.filters = { ...this.filters, [id]: this.filters[id] ? undefined : true };\n    this.activeIndex = -1;\n  }\n\n  clearFilters(): void {\n    this.filters = {};\n    this.activeIndex = -1;\n  }\n\n  hasActiveFilters(): boolean {\n    return this.searchService.hasActiveFilters(this.filters);\n  }\n\n  onQueryChange(q: string): void {\n    this.query = q;\n    this.activeIndex = -1;\n  }\n\n  select(key: string): void {\n    this.elementSelected.emit(key);\n    this.closed.emit();\n  }\n\n  onKeydown(e: KeyboardEvent): void {\n    const len = this.results.length;\n    if (e.key === 'ArrowDown') {\n      e.preventDefault();\n      this.activeIndex = Math.min(this.activeIndex + 1, len - 1);\n      this.scrollActiveIntoView();\n      this.elementPreviewed.emit(this.results[this.activeIndex].key);\n    } else if (e.key === 'ArrowUp') {\n      e.preventDefault();\n      this.activeIndex = Math.max(this.activeIndex - 1, 0);\n      this.scrollActiveIntoView();\n      this.elementPreviewed.emit(this.results[this.activeIndex].key);\n    } else if (e.key === 'Enter' && this.activeIndex >= 0 && this.activeIndex < len) {\n      this.select(this.results[this.activeIndex].key);\n    } else if (e.key === 'Escape') {\n      this.closed.emit();\n    }\n  }\n\n  private scrollActiveIntoView(): void {\n    if (this.scrollTimer) clearTimeout(this.scrollTimer);\n    this.scrollTimer = setTimeout(() => {\n      const el = document.querySelector('.dev-search__result--active');\n      el?.scrollIntoView({ block: 'nearest' });\n    });\n  }\n\n  ngOnDestroy(): void {\n    if (this.previewTimer) clearTimeout(this.previewTimer);\n    if (this.scrollTimer) clearTimeout(this.scrollTimer);\n  }\n}\n","<div class=\"dev-search-backdrop\" (click)=\"closed.emit()\"></div>\n<div class=\"dev-search\" (keydown)=\"onKeydown($event)\">\n  <div class=\"dev-search__input-row\">\n    <bq-icon name=\"search\" class=\"dev-search__icon\"></bq-icon>\n    <input\n      #searchInput\n      class=\"dev-search__input\"\n      type=\"text\"\n      placeholder=\"Search elements by name, key or type…\"\n      [ngModel]=\"query\"\n      (ngModelChange)=\"onQueryChange($event)\" />\n    <button class=\"dev-icon-btn\" (click)=\"closed.emit()\" title=\"Close\"><bq-icon name=\"times\"></bq-icon></button>\n  </div>\n  <div class=\"dev-search__filters\" *ngIf=\"availableTypes.length || elements.length\">\n    <button\n      *ngFor=\"let type of availableTypes\"\n      class=\"dev-search__chip\"\n      [class.dev-search__chip--active]=\"isTypeActive(type)\"\n      (click)=\"toggleType(type)\">type:{{ type }}</button>\n    <span class=\"dev-search__chip-divider\" *ngIf=\"availableTypes.length\"></span>\n    <button\n      *ngFor=\"let f of toggleFilters\"\n      class=\"dev-search__chip\"\n      [class.dev-search__chip--active]=\"!!filters[f.id]\"\n      (click)=\"toggleFlag(f.id)\">{{ f.label }}</button>\n    <button\n      *ngIf=\"hasActiveFilters()\"\n      class=\"dev-search__chip dev-search__chip--clear\"\n      (click)=\"clearFilters()\">Clear</button>\n  </div>\n  <div class=\"dev-search__results\" *ngIf=\"results.length\">\n    <button\n      *ngFor=\"let el of results; let i = index\"\n      class=\"dev-search__result\"\n      [class.dev-search__result--active]=\"i === activeIndex\"\n      (click)=\"select(el.key)\"\n      (mouseenter)=\"activeIndex = i; previewAfterDelay(el.key)\">\n      <span class=\"dev-type-chip dev-type-chip--{{ el.type }}\">{{ el.type }}</span>\n      <span class=\"dev-search__result-name\">{{ el.name }}</span>\n      <span class=\"dev-search__result-key dev-muted\">{{ el.key }}</span>\n    </button>\n  </div>\n  <div class=\"dev-search__empty dev-muted\" *ngIf=\"(query.trim() || hasActiveFilters()) && !results.length\">\n    No elements match the current query and filters\n  </div>\n</div>\n","import { animate, style, transition, trigger } from '@angular/animations';\nimport { Component, NgZone, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { ANIMATION_TIMING } from '../dev-animations.utils';\nimport { DevTourService, TourStep } from '../services/dev-tour.service';\n\nconst SPOTLIGHT_PAD = 6;\nconst CARD_W = 480;\nconst CARD_H = 320;\nconst CARD_GAP = 12;\nconst VIEWPORT_INSET = 8;\n\ninterface Rect { left: number; top: number; width: number; height: number; }\n\n@Component({\n  selector: 'app-dev-tour',\n  templateUrl: './dev-tour.component.html',\n  standalone: false,\n  encapsulation: ViewEncapsulation.None,\n  animations: [\n    trigger('tourFade', [\n      transition(':enter', [\n        style({ opacity: 0 }),\n        animate(ANIMATION_TIMING.tourFadeIn, style({ opacity: 1 })),\n      ]),\n      transition(':leave', [\n        animate(ANIMATION_TIMING.tourFadeOut, style({ opacity: 0 })),\n      ]),\n    ]),\n  ],\n})\nexport class DevTourComponent implements OnInit, OnDestroy {\n  step: TourStep | null = null;\n  stepIndex = 0;\n  total = 0;\n  isLast = false;\n  safeWireframe: SafeHtml | null = null;\n\n  // null when the current step has no target (center-modal step) or when the\n  // selector doesn't match. Either way we render a center-modal layout.\n  targetRect: Rect | null = null;\n\n  cardStyle: Record<string, string> = {};\n  spotlightStyle: Record<string, string> = {};\n  bandTopStyle: Record<string, string> = {};\n  bandBottomStyle: Record<string, string> = {};\n  bandLeftStyle: Record<string, string> = {};\n  bandRightStyle: Record<string, string> = {};\n\n  private destroy$ = new Subject<void>();\n  private rafHandle: number | null = null;\n  private readonly onResizeOrScroll = (): void => this.scheduleRemeasure();\n\n  constructor(public tour: DevTourService, private zone: NgZone, private sanitizer: DomSanitizer) {}\n\n  ngOnInit(): void {\n    this.tour.currentIndex$\n      .pipe(takeUntil(this.destroy$))\n      .subscribe(idx => this.zone.run(() => this.applyIndex(idx)));\n\n    window.addEventListener('resize', this.onResizeOrScroll, { passive: true });\n    window.addEventListener('scroll', this.onResizeOrScroll, { passive: true, capture: true });\n  }\n\n  ngOnDestroy(): void {\n    this.destroy$.next();\n    this.destroy$.complete();\n    window.removeEventListener('resize', this.onResizeOrScroll);\n    window.removeEventListener('scroll', this.onResizeOrScroll, true);\n    if (this.rafHandle != null) cancelAnimationFrame(this.rafHandle);\n  }\n\n  next(): void { this.tour.next(); }\n  back(): void { this.tour.back(); }\n  skip(): void { this.tour.skip(); }\n\n  private applyIndex(idx: number | null): void {\n    if (idx == null) {\n      this.step = null;\n      this.safeWireframe = null;\n      return;\n    }\n    this.step = this.tour.steps[idx];\n    this.stepIndex = idx;\n    this.total = this.tour.totalSteps;\n    this.isLast = idx === this.total - 1;\n    this.safeWireframe = this.step.wireframe\n      ? this.sanitizer.bypassSecurityTrustHtml(this.step.wireframe)\n      : null;\n    this.measure();\n  }\n\n  private scheduleRemeasure(): void {\n    if (this.rafHandle != null) return;\n    this.rafHandle = requestAnimationFrame(() => {\n      this.rafHandle = null;\n      this.zone.run(() => this.measure());\n    });\n  }\n\n  private measure(): void {\n    const step = this.step;\n    if (!step) { this.targetRect = null; return; }\n    const targetEl = step.target ? document.querySelector<HTMLElement>(step.target) : null;\n    if (!targetEl) {\n      this.targetRect = null;\n      this.cardStyle = this.centerCardStyle();\n      return;\n    }\n    const r = targetEl.getBoundingClientRect();\n    if (r.width === 0 && r.height === 0) {\n      // Target is in the DOM but has no size (e.g. its parent is `display: none`).\n      // Treat as missing and fall back to the center modal so we don't strand a\n      // 0×0 spotlight at the corner of the screen.\n      this.targetRect = null;\n      this.cardStyle = this.centerCardStyle();\n      return;\n    }\n    // Round band/spotlight edges to integer pixels so adjacent bands meet flush.\n    // getBoundingClientRect() returns fractional values; otherwise the page bg\n    // can show through as a 1px hairline at the band seams.\n    const left   = Math.floor(r.left   - SPOTLIGHT_PAD);\n    const top    = Math.floor(r.top    - SPOTLIGHT_PAD);\n    const right  = Math.ceil (r.left + r.width  + SPOTLIGHT_PAD);\n    const bottom = Math.ceil (r.top  + r.height + SPOTLIGHT_PAD);\n    const rect: Rect = { left, top, width: right - left, height: bottom - top };\n    this.targetRect = rect;\n    this.spotlightStyle = {\n      left: rect.left + 'px',\n      top: rect.top + 'px',\n      width: rect.width + 'px',\n      height: rect.height + 'px',\n    };\n    const w = window.innerWidth;\n    const h = window.innerHeight;\n    this.bandTopStyle =    { left: '0', top: '0',          width: '100%',                          height: Math.max(0, top) + 'px' };\n    this.bandBottomStyle = { left: '0', top: bottom + 'px', width: '100%',                          height: Math.max(0, h - bottom) + 'px' };\n    this.bandLeftStyle =   { left: '0', top: top + 'px',   width: Math.max(0, left) + 'px',        height: Math.max(0, bottom - top) + 'px' };\n    this.bandRightStyle =  { left: right + 'px', top: top + 'px', width: Math.max(0, w - right) + 'px', height: Math.max(0, bottom - top) + 'px' };\n    this.cardStyle = this.placeCard(rect, step.placement);\n  }\n\n  private centerCardStyle(): Record<string, string> {\n    const w = window.innerWidth;\n    const h = window.innerHeight;\n    return {\n      left: Math.round((w - CARD_W) / 2) + 'px',\n      top:  Math.round((h - CARD_H) / 2) + 'px',\n      width: CARD_W + 'px',\n    };\n  }\n\n  private placeCard(rect: Rect, preferred?: TourStep['placement']): Record<string, string> {\n    const w = window.innerWidth;\n    const h = window.innerHeight;\n\n    type Placement = 'right' | 'left' | 'bottom' | 'top';\n    const candidates: Array<{ placement: Placement; left: number; top: number }> = [];\n    const pushCandidate = (p: Placement): void => {\n      switch (p) {\n        case 'right':  candidates.push({ placement: 'right',  left: rect.left + rect.width + CARD_GAP, top: rect.top }); break;\n        case 'left':   candidates.push({ placement: 'left',   left: rect.left - CARD_W - CARD_GAP,    top: rect.top }); break;\n        case 'bottom': candidates.push({ placement: 'bottom', left: rect.left,                        top: rect.top + rect.height + CARD_GAP }); break;\n        case 'top':    candidates.push({ placement: 'top',    left: rect.left,                        top: rect.top - CARD_H - CARD_GAP }); break;\n      }\n    };\n    const order: Placement[] = preferred\n      ? [preferred, ...(['right','left','bottom','top'] as Placement[]).filter(p => p !== preferred)]\n      : ['right', 'left', 'bottom', 'top'];\n    for (const p of order) pushCandidate(p);\n\n    const fits = (c: { left: number; top: number }): boolean =>\n      c.left >= VIEWPORT_INSET && c.left + CARD_W <= w - VIEWPORT_INSET\n        && c.top >= VIEWPORT_INSET && c.top + CARD_H <= h - VIEWPORT_INSET;\n\n    const chosen = candidates.find(fits) ?? candidates[0];\n    const left = Math.max(VIEWPORT_INSET, Math.min(chosen.left, w - CARD_W - VIEWPORT_INSET));\n    const top  = Math.max(VIEWPORT_INSET, Math.min(chosen.top,  h - CARD_H - VIEWPORT_INSET));\n    return { left: left + 'px', top: top + 'px', width: CARD_W + 'px' };\n  }\n}\n","<ng-container *ngIf=\"step as s\">\n  <div class=\"dev-tour\" [@tourFade]>\n\n    <!-- Backdrop: four bands when spotlight is active, single full overlay otherwise -->\n    <ng-container *ngIf=\"targetRect; else fullBackdrop\">\n      <div class=\"dev-tour__band\" [ngStyle]=\"bandTopStyle\"></div>\n      <div class=\"dev-tour__band\" [ngStyle]=\"bandBottomStyle\"></div>\n      <div class=\"dev-tour__band\" [ngStyle]=\"bandLeftStyle\"></div>\n      <div class=\"dev-tour__band\" [ngStyle]=\"bandRightStyle\"></div>\n      <div class=\"dev-tour__spotlight\" [ngStyle]=\"spotlightStyle\"></div>\n    </ng-container>\n    <ng-template #fullBackdrop>\n      <div class=\"dev-tour__backdrop\"></div>\n    </ng-template>\n\n    <!-- Card -->\n    <div class=\"dev-tour__card\" [ngStyle]=\"cardStyle\">\n      <header class=\"dev-tour__header\">\n        <bq-icon class=\"dev-tour__icon\" name=\"compass\"></bq-icon>\n        <span class=\"dev-tour__step\">{{ stepIndex + 1 }} / {{ total }}</span>\n        <span class=\"dev-tour__title\">{{ s.title }}</span>\n        <button class=\"dev-icon-btn\" (click)=\"skip()\" title=\"Skip tour (Esc)\">\n          <bq-icon name=\"times\"></bq-icon>\n        </button>\n      </header>\n\n      <div *ngIf=\"safeWireframe\" class=\"dev-tour__wireframe\" [innerHTML]=\"safeWireframe\"></div>\n\n      <div class=\"dev-tour__body\">{{ s.body }}</div>\n\n      <footer class=\"dev-tour__footer\">\n        <button class=\"dev-btn dev-btn--sm\" (click)=\"skip()\" title=\"Skip the rest of the tour\">Skip</button>\n        <span class=\"dev-tour__spacer\"></span>\n        <button class=\"dev-btn dev-btn--sm\" (click)=\"back()\" [disabled]=\"stepIndex === 0\" title=\"Previous step (←)\">\n          <bq-icon name=\"chevron-left\"></bq-icon> Back\n        </button>\n        <button class=\"dev-btn dev-btn--sm dev-btn--primary\" (click)=\"next()\" [title]=\"isLast ? 'Finish' : 'Next step (→ or Enter)'\">\n          {{ isLast ? 'Done' : 'Next' }}\n          <bq-icon *ngIf=\"!isLast\" name=\"chevron-right\"></bq-icon>\n        </button>\n      </footer>\n    </div>\n  </div>\n</ng-container>\n","import { animate, style, transition, trigger } from '@angular/animations';\nimport { Component, ElementRef, HostListener, Inject, isDevMode, NgZone, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core';\nimport { SafeHtml } from '@angular/platform-browser';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { interval, Subject } from 'rxjs';\nimport { filter, take, takeUntil } from 'rxjs/operators';\nimport { BqLensConfig, BqLensSectionConfig, BQ_LENS_CONFIG } from './bq-lens.config';\nimport { BQ_LENS_HELP_MARKDOWN } from './bq-lens.help';\nimport { JsonToTemplatesComponent } from './json-to-templates/json-to-templates.component';\n\nimport { CaptureAnalysis, CaptureEntry, ElementTreeNode } from './bq-lens.types';\nimport { analyzeCapture } from './dev-analysis.utils';\nimport { BodyKind, detectBodyKind } from './dev-body-kind.utils';\nimport { DiffLine, diffJson } from './dev-diff.utils';\nimport { extractTextNodeFields, serializeElement } from './dev-element-serialization.utils';\nimport { modKeyLabel } from './dev-platform.utils';\nimport { parseRoute } from './dev-url.utils';\nimport { copyWithFeedback } from './dev-clipboard.utils';\nimport { attachDragGesture } from './dev-drag.utils';\nimport { safeJsonParse } from './dev-json.utils';\nimport { BQ_LENS_STORAGE_KEYS, safeRead, safeRemove, safeWrite } from './dev-storage.utils';\nimport { ANIMATION_TIMING } from './dev-animations.utils';\nimport { SearchableElement } from './components/dev-element-search.component';\nimport { SearchField } from './services/dev-search.service';\nimport { DevBaseUrlService } from './services/dev-base-url.service';\nimport { BqRequestKind, classifyBqUrl, DevCaptureService } from './services/dev-capture.service';\nimport { DevColorsService } from './services/dev-colors.service';\nimport { DevElementCacheService } from './services/dev-element-cache.service';\nimport { DevStructureAuditService } from './services/dev-structure-audit.service';\nimport { DevTemplateCacheService } from './services/dev-template-cache.service';\nimport { DevFormatService } from './services/dev-format.service';\nimport { DevInspectorService } from './services/dev-inspector.service';\nimport { DevPickerService } from './services/dev-picker.service';\nimport { DevTourService } from './services/dev-tour.service';\n\n@Component({\n  selector: BQ_LENS_STORAGE_KEYS.panel,\n  templateUrl: './bq-lens.component.html',\n  styleUrls: ['./bq-lens.component.scss'],\n  standalone: false,\n  encapsulation: ViewEncapsulation.None,\n  providers: [DevInspectorService, DevTourService],\n  host: { '[class.bq-lens-flat]': 'flatCorners' },\n  animations: [\n    // Quick expand-with-overshoot for the error banners. Cubic-bezier\n    // 'back' curve (.34, 1.56, .64, 1) gives a small bounce on entry; exit\n    // is a plain ease-in collapse so dismiss feels decisive, not springy.\n    trigger('banner', [\n      transition(':enter', [\n        style({ height: 0, opacity: 0, overflow: 'hidden' }),\n        animate(ANIMATION_TIMING.bannerEnter, style({ height: '*', opacity: 1 })),\n      ]),\n      transition(':leave', [\n        style({ overflow: 'hidden' }),\n        animate(ANIMATION_TIMING.bannerLeave, style({ height: 0, opacity: 0 })),\n      ]),\n    ]),\n    // Section bodies (Route/Env, host-provided extraSections) — same height\n    // + opacity feel as the inline capture-detail trigger on\n    // DevCaptureListComponent, so panel-side and capture-side expand reads\n    // as one cohesive motion language.\n    trigger('expandCollapse', [\n      transition(':enter', [\n        style({ height: 0, opacity: 0 }),\n        animate(ANIMATION_TIMING.expand, style({ height: '*', opacity: 1 })),\n      ]),\n      transition(':leave', [\n        animate(ANIMATION_TIMING.collapse, style({ height: 0, opacity: 0 })),\n      ]),\n    ]),\n  ],\n})\nexport class BqLensComponent implements OnInit, OnDestroy {\n  readonly production: boolean;\n  readonly modKey = modKeyLabel();\n  readonly title: string;\n  readonly tabLabel: string;\n  readonly extraSections: BqLensSectionConfig[];\n  readonly flatCorners: boolean;\n\n  devEnabled = false;\n  isOpen = false;\n  newCaptureCount = 0;\n  largeView = false;\n  helpOpen = false;\n  pageTreemapOpen = false;\n  helpHtml: SafeHtml | null = null;\n\n  get isConnected(): boolean { return this.devEnabled; }\n  get captureActive(): boolean { return this.captureService.captureActive; }\n  get captures(): CaptureEntry[] { return this.captureService.captures; }\n  selectedCapture: CaptureEntry | null = null;\n  selectedJson: string | null = null;\n  highlightedJson: SafeHtml | null = null;\n  bodyKind: BodyKind = 'empty';\n  loadingJson = false;\n  copiedUrl = false;\n  filterText = '';\n  viewMode: 'json' | 'template' | 'insights' | 'request' | 'structure' = 'json';\n  statusFilter: 'all' | '2xx' | '4xx' | '5xx' = 'all';\n  selectedRequestBody: string | null = null;\n  highlightedRequestBody: SafeHtml | null = null;\n  curlCopied = false;\n  pinnedCaptures = new Set<string>();\n  captureAnalysis: CaptureAnalysis | null = null;\n  generatedTemplate: string | null = null;\n  highlightedTemplate: SafeHtml | null = null;\n  templateError: string | null = null;\n  pageViewTitle: string | null = null;\n  pageElementTree: ElementTreeNode | null = null;\n  routeInfo: Record<string, string> | null = null;\n  contextTab: 'route' | 'env' = 'route';\n  sectionOpen: Record<string, boolean> = { context: false };\n\n  // Live session tab — Captures and Sessions are inspector views of the\n  // Blueriq runtime. The \"internals\" view (bq-lens looking at itself —\n  // its own caches, audit, integrity) lives behind a header icon\n  // toggle (`internalsOpen`) instead, so the tab strip stays focused\n  // on Blueriq data.\n  mainTab: 'captures' | 'sessions' = 'captures';\n\n  // bq-lens self-diagnostics overlay. When true, the panel body\n  // replaces Captures/Sessions with the Internals view.\n  internalsOpen = false;\n\n  // Panel placement\n  panelSide: 'left' | 'right' = 'right';\n  tabTop = 130;\n  isDragging = false;\n\n  // Element search\n  isSearchOpen = false;\n  searchableElements: SearchableElement[] = [];\n\n  lastKeepaliveLabel: string | null = null;\n  private lastKeepaliveDate: Date | null = null;\n\n  // Sticky fatal banner — project/flow/task that never started. Stays until\n  // the app actually starts or the user dismisses it. Auto-opens the panel.\n  fatalError: CaptureEntry | null = null;\n  fatalErrorKind: BqRequestKind | null = null;\n  fatalErrorAgeLabel: string | null = null;\n\n  // Transient inflight banner — 5xx/network/lifecycle 4xx during a live\n  // session. Tied to the rolling capture list, dismissable.\n  inflightError: CaptureEntry | null = null;\n  inflightErrorKind: BqRequestKind | null = null;\n  inflightErrorAgeLabel: string | null = null;\n\n  private errorPulseTimer: ReturnType<typeof setTimeout> | null = null;\n  errorPulse = false;\n\n  // Cross-reference: which capture's response is currently being page-rendered\n  // (set by Direction A — \"Page\" button on a capture row). Reset by closeJson().\n  sourceCapture: CaptureEntry | null = null;\n\n  // Capture diff\n  isDiffMode = false;\n  diffBaseCapture: CaptureEntry | null = null;\n  diffResult: DiffLine[] | null = null;\n  diffCompareCapture: CaptureEntry | null = null;\n\n  private destroy$ = new Subject<void>();\n  private devKeyCount = 0;\n  private devKeyTimer: ReturnType<typeof setTimeout> | null = null;\n\n  constructor(\n    private zone: NgZone,\n    @Inject(BQ_LENS_CONFIG) private config: BqLensConfig,\n    private router: Router,\n    private el: ElementRef,\n    private formatService: DevFormatService,\n    private captureService: DevCaptureService,\n    private cacheService: DevElementCacheService,\n    private structureAudit: DevStructureAuditService,\n    private templateCache: DevTemplateCacheService,\n    private pickerService: DevPickerService,\n    public inspector: DevInspectorService,\n    public tour: DevTourService,\n    _colors: DevColorsService,\n    private baseUrlService: DevBaseUrlService,\n  ) {\n    this.production     = config.production ?? !isDevMode();\n    this.title          = config.title ?? 'Bq-Lens';\n    this.tabLabel       = (config.tabLabel ?? 'LENS').slice(0, 4);\n    this.extraSections  = config.extraSections ?? [];\n    this.flatCorners    = !!config.flatCorners;\n    for (const s of this.extraSections) {\n      this.sectionOpen[s.label] = !!s.initiallyOpen;\n    }\n  }\n\n  /** Resolved at template-evaluation time so the auto-detected URL appears once the interceptor learns it. */\n  get blueriqBaseUrl(): string {\n    return this.baseUrlService.get();\n  }\n\n  get isPickerActive(): boolean { return this.pickerService.isActive; }\n\n  ngOnInit(): void {\n    this.devEnabled = this.production\n      ? safeRead(sessionStorage, BQ_LENS_STORAGE_KEYS.panel) === '1'\n      : true;\n\n    if (this.devEnabled) {\n      this.subscribeToCaptures();\n      this.structureAudit.start();\n    }\n\n    this.pickerService.picked$\n      .pipe(takeUntil(this.destroy$))\n      .subscribe(({ element, host }) => this.inspector.applyAndPushHistory(host, element));\n\n    const savedSide = safeRead(localStorage, BQ_LENS_STORAGE_KEYS.panelSide) as 'left' | 'right' | null;\n    const savedTop = safeRead(localStorage, BQ_LENS_STORAGE_KEYS.panelTabTop);\n    if (savedSide === 'left' || savedSide === 'right') this.panelSide = savedSide;\n    if (savedTop) this.tabTop = Math.max(0, Math.min(window.innerHeight - 100, Number(savedTop)));\n\n    this.sectionOpen = { ...this.sectionOpen, ...safeJsonParse(safeRead(sessionStorage, BQ_LENS_STORAGE_KEYS.sections), {}) };\n\n    this.captureService.lastKeepalive$\n      .pipe(takeUntil(this.destroy$))\n      .subscribe(date => {\n        this.lastKeepaliveDate = date;\n        this.lastKeepaliveLabel = date ? this.formatKeepaliveAge(date) : null;\n      });\n    interval(5000)\n      .pipe(takeUntil(this.destroy$))\n      .subscribe(() => {\n        if (this.lastKeepaliveDate) {\n          this.lastKeepaliveLabel = this.formatKeepaliveAge(this.lastKeepaliveDate);\n        }\n        if (this.fatalError) {\n          this.fatalErrorAgeLabel = this.formatErrorAge(this.fatalError.timestamp);\n        }\n        if (this.inflightError) {\n          this.inflightErrorAgeLabel = this.formatErrorAge(this.inflightError.timestamp);\n        }\n      });\n\n    this.routeInfo = parseRoute(this.router.url);\n    if (!this.routeInfo) this.contextTab = 'env';\n    this.router.events\n      .pipe(filter(e => e instanceof NavigationEnd), takeUntil(this.destroy$))\n      .subscribe((e: NavigationEnd) => {\n        this.zone.run(() => {\n          this.routeInfo = parseRoute(e.urlAfterRedirects);\n          if (!this.routeInfo) this.contextTab = 'env';\n        });\n      });\n\n    // First-run guided tour: trigger the first time the developer opens the\n    // panel themselves. We don't auto-open the panel — the tour anchors on a\n    // panel they intentionally opened.\n    if (!this.tour.isDone('main')) this.tourArmedForFirstOpen = true;\n    if (!this.tour.isDone('inspector')) this.armInspectorTourOnNextPick();\n  }\n\n  private tourArmedForFirstOpen = false;\n\n  /**\n   * Subscribe-and-forget: fire the inspector tour the next time the picker\n   * hands an element to the inspector. `take(1)` self-disposes; the\n   * `tour.isActive` filter avoids colliding with an in-flight main tour.\n   */\n  private armInspectorTourOnNextPick(): void {\n    this.inspector.inspected$\n      .pipe(filter(() => !this.tour.isActive), take(1), takeUntil(this.destroy$))\n      .subscribe(() => requestAnimationFrame(() => this.tour.start('inspector')));\n  }\n\n  @HostListener('document:keydown', ['$event'])\n  onKeydown(e: KeyboardEvent): void {\n    // Five rapid 'd' presses (outside input fields) toggle the dev panel\n    if (e.key === 'd' && !e.ctrlKey && !e.altKey && !e.metaKey) {\n      const tag = (e.target as HTMLElement)?.tagName?.toLowerCase();\n      if (tag !== 'input' && tag !== 'textarea') {\n        clearTimeout(this.devKeyTimer!);\n        this.devKeyCount++;\n        if (this.devKeyCount >= 5) {\n          this.devKeyCount = 0;\n          this.devEnabled = !this.devEnabled;\n          if (this.devEnabled) {\n            safeWrite(sessionStorage, BQ_LENS_STORAGE_KEYS.panel, '1');\n            this.subscribeToCaptures();\n          } else {\n            safeRemove(sessionStorage, BQ_LENS_STORAGE_KEYS.panel);\n            this.isOpen = false;\n          }\n        } else {\n          this.devKeyTimer = setTimeout(() => { this.devKeyCount = 0; }, 1000);\n        }\n      }\n    }\n    // Use `e.code` (physical key) so Mac's Option key still matches —\n    // Option+letter produces special chars on macOS (Option+P → π, Option+D → ∂, …)\n    // which would never match `e.key === 'p'`.\n    if (e.altKey && e.code === 'KeyD') this.togglePanel();\n    if (e.altKey && e.code === 'KeyP' && this.isOpen) this.togglePicker();\n    if (e.altKey && e.code === 'KeyG' && this.isOpen) this.showCurrentPage();\n    if (e.altKey && e.code === 'KeyE') this.jumpToLastError();\n    if (e.altKey && e.code === 'KeyS' && this.isOpen) this.toggleSearch();\n    if (this.tour.isActive) {\n      if (e.key === 'Escape')                         { e.preventDefault(); this.tour.skip(); return; }\n      if (e.key === 'ArrowRight' || e.key === 'Enter'){ e.preventDefault(); this.tour.next(); return; }\n      if (e.key === 'ArrowLeft')                      { e.preventDefault(); this.tour.back(); return; }\n    }\n    if (e.key === 'Escape' && this.isPickerActive) { this.deactivatePicker(); return; }\n    if (e.key === 'Escape' && this.helpOpen) { this.helpOpen = false; return; }\n    if (e.key === 'Escape' && this.pageTreemapOpen) { this.pageTreemapOpen = false; return; }\n    if (e.key === 'Escape' && this.diffResult) { this.closeDiff(); return; }\n    if (e.key === 'Escape' && this.isDiffMode) { this.isDiffMode = false; this.diffBaseCapture = null; return; }\n    if (e.key === 'Escape' && this.isSearchOpen) { this.isSearchOpen = false; return; }\n    if (e.key === 'Escape' && this.largeView) this.largeView = false;\n    if (e.key === 'Escape' && this.inspector.inspectedElement) this.inspector.closeInspector();\n    if (this.isOpen && this.mainTab === 'captures' && this.selectedCapture && !this.largeView && !this.isDiffMode) {\n      if (e.key === 'ArrowDown') { e.preventDefault(); this.navigateCaptures(1); }\n      if (e.key === 'ArrowUp') { e.preventDefault(); this.navigateCaptures(-1); }\n    }\n  }\n\n  @HostListener('document:dblclick', ['$event'])\n  onDblClick(e: MouseEvent): void {\n    if (!this.isOpen) return;\n    const panel = this.el.nativeElement.querySelector('.dev-panel');\n    if (panel && !panel.contains(e.target as Node)) {\n      this.isOpen = false;\n    }\n  }\n\n  private subscribeToCaptures(): void {\n    // Wait for IDB hydration before seeding the cache. The capture service\n    // starts with an empty BehaviorSubject and merges in persisted captures\n    // once IDB resolves; rehydrating before then would warm an empty cache\n    // and the bulk-load that follows would only feed `entries[0]` into the\n    // cache (one capture per emission), silently dropping the rest.\n    this.captureService.hydrated$\n      .pipe(filter(Boolean), take(1), takeUntil(this.destroy$))\n      .subscribe(() => {\n        const seeded = this.captureService.captures;\n        this.cacheService.rehydrateFromCaptures(seeded);\n        let previousLength = seeded.length;\n        this.captureService.captures$\n          .pipe(takeUntil(this.destroy$))\n          .subscribe(entries => {\n            if (entries.length > previousLength) {\n              const newEntry = entries[0];\n              if (!this.isOpen) this.newCaptureCount += entries.length - previousLength;\n              // Hand every capture to the cache and let warmCache decide\n              // what to absorb based on payload shape. Previously this was\n              // gated on `POST && 200`, which silently dropped element data\n              // carried by 4xx/5xx Blueriq responses (still valid JSON, just sad).\n              this.cacheService.warmCache(newEntry);\n              this.markSearchIndexStale();\n            } else if (entries.length === 0) {\n              this.newCaptureCount = 0;\n              this.markSearchIndexStale();\n            }\n            previousLength = entries.length;\n          });\n      });\n\n    this.captureService.fatalError$\n      .pipe(takeUntil(this.destroy$))\n      .subscribe(error => {\n        const isNew = !!error && error.id !== this.fatalError?.id;\n        this.fatalError = error;\n        this.fatalErrorKind = error ? classifyBqUrl(error.url) : null;\n        this.fatalErrorAgeLabel = error ? this.formatErrorAge(error.timestamp) : null;\n        if (isNew) {\n          // Fatal failures (project/flow/task never started) leave the page\n          // in a non-functional state — force-open the panel so the developer\n          // sees what's wrong without having to find the floating tab first.\n          this.isOpen = true;\n          this.newCaptureCount = 0;\n        }\n      });\n\n    this.captureService.inflightError$\n      .pipe(takeUntil(this.destroy$))\n      .subscribe(error => {\n        const isNew = !!error && error.id !== this.inflightError?.id;\n        this.inflightError = error;\n        this.inflightErrorKind = error ? classifyBqUrl(error.url) : null;\n        this.inflightErrorAgeLabel = error ? this.formatErrorAge(error.timestamp) : null;\n        // Suppress the tab-pulse while a fatal error is showing — the\n        // fatal banner already has the user's attention.\n        if (isNew && !this.isOpen && !this.fatalError) this.triggerErrorPulse();\n      });\n  }\n\n  private triggerErrorPulse(): void {\n    this.errorPulse = true;\n    if (this.errorPulseTimer) clearTimeout(this.errorPulseTimer);\n    this.errorPulseTimer = setTimeout(() => this.zone.run(() => { this.errorPulse = false; }), 4000);\n  }\n\n  dismissAllErrors(): void {\n    this.captureService.dismissAllErrors();\n  }\n\n  viewFatalErrorCapture(): void {\n    if (!this.fatalError) return;\n    this.openCapture(this.fatalError);\n  }\n\n  viewInflightErrorCapture(): void {\n    if (!this.inflightError) return;\n    this.openCapture(this.inflightError);\n  }\n\n  private openCapture(entry: CaptureEntry): void {\n    this.isOpen = true;\n    this.mainTab = 'captures';\n    this.newCaptureCount = 0;\n    this.viewCapture(entry);\n  }\n\n  private formatErrorAge(timestamp: string): string {\n    const secs = Math.floor((Date.now() - new Date(timestamp).getTime()) / 1000);\n    if (secs < 60) return `${secs}s ago`;\n    if (secs < 3600) return `${Math.floor(secs / 60)}m ago`;\n    return `${Math.floor(secs / 3600)}h ago`;\n  }\n\n  get filteredCaptures(): CaptureEntry[] {\n    let result = this.captures;\n    if (this.filterText) {\n      const q = this.filterText.toLowerCase();\n      result = result.filter(c =>\n        c.url.toLowerCase().includes(q) || c.method.toLowerCase().includes(q)\n      );\n    }\n    if (this.statusFilter !== 'all') {\n      result = result.filter(c => {\n        if (this.statusFilter === '2xx') return c.status >= 200 && c.status < 300;\n        if (this.statusFilter === '4xx') return c.status >= 400 && c.status < 500;\n        if (this.statusFilter === '5xx') return c.status >= 500;\n        return true;\n      });\n    }\n    if (this.pinnedCaptures.size > 0) {\n      result = [...result].sort((a, b) => {\n        const ap = this.pinnedCaptures.has(a.id) ? 0 : 1;\n        const bp = this.pinnedCaptures.has(b.id) ? 0 : 1;\n        return ap - bp;\n      });\n    }\n    return result;\n  }\n\n  togglePin(id: string): void {\n    if (this.pinnedCaptures.has(id)) {\n      this.pinnedCaptures.delete(id);\n    } else {\n      this.pinnedCaptures.add(id);\n    }\n    this.pinnedCaptures = new Set(this.pinnedCaptures);\n  }\n\n  togglePanel(): void {\n    this.isOpen = !this.isOpen;\n    if (this.isOpen) {\n      this.newCaptureCount = 0;\n      if (this.tourArmedForFirstOpen) {\n        this.tourArmedForFirstOpen = false;\n        // Defer one frame so the panel has finished its open transition and\n        // the targeted buttons exist in the DOM.\n        requestAnimationFrame(() => this.tour.start());\n      }\n    }\n  }\n\n  openPageTreemap(): void {\n    this.pageTreemapOpen = true;\n  }\n\n  closePageTreemap(): void {\n    this.pageTreemapOpen = false;\n  }\n\n  toggleHelp(): void {\n    this.helpOpen = !this.helpOpen;\n    if (this.helpOpen && !this.helpHtml) {\n      this.helpHtml = this.formatService.renderMarkdown(BQ_LENS_HELP_MARKDOWN);\n    }\n  }\n\n  toggleInternals(): void {\n    this.internalsOpen = !this.internalsOpen;\n  }\n\n  replayTour(): void {\n    this.helpOpen = false;\n    this.tour.replay('main');\n  }\n\n  replayInspectorTour(): void {\n    this.helpOpen = false;\n    // The inspector tour anchors on the popup, which only exists after a pick.\n    // Replay immediately when it's on screen; otherwise re-arm so the next\n    // pick fires it.\n    if (this.inspector.inspectedHostEl) {\n      this.tour.replay('inspector');\n    } else {\n      this.armInspectorTourOnNextPick();\n    }\n  }\n\n  onTabDragStart(event: MouseEvent): void {\n    const offsetY = event.clientY - this.tabTop;\n    attachDragGesture({\n      startEvent: event,\n      zone: this.zone,\n      onStart: () => { this.isDragging = true; },\n      onMove: (_dx, _dy, e) => {\n        this.tabTop = Math.max(0, Math.min(window.innerHeight - 100, e.clientY - offsetY));\n      },\n      onEnd: (dragged) => {\n        if (!dragged) return;\n        this.isDragging = false;\n        safeWrite(localStorage, BQ_LENS_STORAGE_KEYS.panelTabTop, String(this.tabTop));\n      },\n    });\n  }\n\n  flipSide(): void {\n    // Disable the panel's transform transition for this one repaint so the\n    // closed panel doesn't animate through translateX(0) while switching sides.\n    const panel = this.el.nativeElement.querySelector('.dev-panel') as HTMLElement | null;\n    if (panel) panel.style.transition = 'none';\n    this.panelSide = this.panelSide === 'right' ? 'left' : 'right';\n    safeWrite(localStorage, BQ_LENS_STORAGE_KEYS.panelSide, this.panelSide);\n    if (panel) requestAnimationFrame(() => requestAnimationFrame(() => { panel.style.transition = ''; }));\n  }\n\n  toggleSection(key: string): void {\n    this.sectionOpen[key] = !this.sectionOpen[key];\n    safeWrite(sessionStorage, BQ_LENS_STORAGE_KEYS.sections, JSON.stringify(this.sectionOpen));\n  }\n\n  toggleCapture(): void {\n    this.captureService.toggleCapture();\n  }\n\n  clearCaptures(): void {\n    this.captureService.clearCaptures();\n    this.cacheService.clearCache();\n    this.templateCache.clear();\n    this.filterText = '';\n    this.newCaptureCount = 0;\n    this.closeJson();\n  }\n\n  viewCapture(entry: CaptureEntry): void {\n    this.isOpen = true;\n    this.newCaptureCount = 0;\n    if (this.isDiffMode && this.diffBaseCapture) {\n      this.runDiff(this.diffBaseCapture, entry);\n      return;\n    }\n    if (this.selectedCapture === entry) {\n      this.closeJson();\n      return;\n    }\n    this.selectedCapture = entry;\n    this.resetCaptureView();\n    this.viewMode = 'json';\n    this.loadingJson = false;\n\n    const blueriqData = entry.responseBody;\n    this.bodyKind = detectBodyKind(blueriqData);\n    if (this.bodyKind === 'empty') return;\n\n    if (this.bodyKind === 'json') {\n      this.cacheService.warmCache(entry);\n      this.selectedJson = JSON.stringify(blueriqData, null, 2);\n      const analysis = analyzeCapture(blueriqData, entry.requestBody);\n      this.captureAnalysis = analysis.responseType !== 'other' ? analysis : null;\n    } else {\n      this.selectedJson = typeof blueriqData === 'string' ? blueriqData : String(blueriqData);\n    }\n\n    if (entry.requestBody) {\n      this.selectedRequestBody = typeof entry.requestBody === 'string'\n        ? entry.requestBody\n        : JSON.stringify(entry.requestBody, null, 2);\n      setTimeout(() => {\n        if (this.selectedRequestBody) {\n          this.highlightedRequestBody = this.formatService.highlightJson(this.selectedRequestBody);\n        }\n      }, 0);\n    }\n\n    setTimeout(() => {\n      if (!this.selectedJson) return;\n      if (this.bodyKind === 'json') {\n        this.highlightedJson = this.formatService.highlightJson(this.selectedJson);\n      } else if (this.bodyKind === 'html') {\n        this.highlightedJson = this.formatService.highlightHtml(this.selectedJson);\n      }\n    }, 0);\n  }\n\n  closeJson(): void {\n    this.largeView = false;\n    this.selectedCapture = null;\n    this.pageViewTitle = null;\n    this.pageElementTree = null;\n    this.sourceCapture = null;\n    this.viewMode = 'json';\n    this.resetCaptureView();\n  }\n\n  showPageFromCapture(entry: CaptureEntry | null): void {\n    if (!entry) return;\n    const enriched = this.cacheService.enrichedJsonForCapture(entry);\n    if (!enriched) return;\n    this.sourceCapture = entry;\n    this._showFromLoadJson(enriched);\n  }\n\n  openSourcingCapture(entry: CaptureEntry): void {\n    this.mainTab = 'captures';\n    this.newCaptureCount = 0;\n    const elementKey = this.inspector.inspectedElement?.key ?? null;\n    if (this.selectedCapture !== entry) {\n      this.viewCapture(entry);\n    }\n    this.movePopupAwayFromPanel();\n    if (elementKey) {\n      // Wait for expand-collapse + highlight setTimeout(0) to settle.\n      setTimeout(() => this.scrollToElementInJsonViewer(elementKey), 280);\n    }\n  }\n\n  private movePopupAwayFromPanel(): void {\n    const host = this.el.nativeElement as HTMLElement;\n    const panel = host.querySelector('.dev-panel') as HTMLElement | null;\n    const popup = host.querySelector('.dev-inspector-popup') as HTMLElement | null;\n    if (!panel || !popup) return;\n    const panelRect = panel.getBoundingClientRect();\n    const popupRect = popup.getBoundingClientRect();\n    const overlaps =\n      popupRect.right > panelRect.left &&\n      popupRect.left < panelRect.right &&\n      popupRect.bottom > panelRect.top &&\n      popupRect.top < panelRect.bottom;\n    if (!overlaps) return;\n    const popupW = popupRect.width;\n    const popupH = popupRect.height;\n    const left = this.panelSide === 'left'\n      ? Math.min(window.innerWidth - popupW - 8, panelRect.right + 12)\n      : Math.max(8, panelRect.left - popupW - 12);\n    const top = Math.max(8, Math.min(popupRect.top, window.innerHeight - popupH - 8));\n    this.inspector.setManualPopupPos({ left, top });\n  }\n\n  private scrollToElementInJsonViewer(elementKey: string): void {\n    const root = (this.el.nativeElement as HTMLElement).querySelector('.dev-list__detail .dev-json') as HTMLElement | null;\n    if (!root) return;\n    const target = `\"${elementKey}\"`;\n    const spans = root.querySelectorAll<HTMLElement>('span.json-string');\n    for (const span of Array.from(spans)) {\n      if (span.textContent !== target) continue;\n      let prev: Node | null = span.previousSibling;\n      while (prev && prev.nodeType === Node.TEXT_NODE && /^[\\s:,]*$/.test(prev.textContent ?? '')) {\n        prev = prev.previousSibling;\n      }\n      const prevEl = prev as HTMLElement | null;\n      if (!prevEl?.classList?.contains('json-key') || !/\"key\"\\s*:/.test(prevEl.textContent ?? '')) continue;\n      this.scrollAndFlash(root, span);\n      return;\n    }\n  }\n\n  private scrollAndFlash(scroller: HTMLElement, target: HTMLElement): void {\n    const flash = () => {\n      target.classList.remove('dev-json-flash');\n      void target.offsetWidth;\n      target.classList.add('dev-json-flash');\n      setTimeout(() => target.classList.remove('dev-json-flash'), 1600);\n    };\n\n    let done = false;\n    const finish = () => {\n      if (done) return;\n      done = true;\n      scroller.removeEventListener('scrollend', finish);\n      flash();\n    };\n\n    if ('onscrollend' in scroller) {\n      scroller.addEventListener('scrollend', finish, { once: true });\n      // Safety net in case smooth scroll is interrupted or unsupported.\n      setTimeout(finish, 1200);\n    } else {\n      // Browsers without scrollend: fall back to a fixed delay matching typical smooth-scroll duration.\n      setTimeout(finish, 500);\n    }\n\n    target.scrollIntoView({ behavior: 'smooth', block: 'center' });\n  }\n\n  get sourceCaptureForInspectedElement(): CaptureEntry | null {\n    const el = this.inspector.inspectedElement;\n    if (!el) return null;\n    return this.captureService.findCaptureForElement(el.key);\n  }\n\n  openLargeView(): void {\n    this.largeView = true;\n  }\n\n  jumpToLastError(): void {\n    const error = this.captures.find(c => c.status >= 400);\n    if (error) this.openCapture(error);\n  }\n\n  copyCurl(): Promise<void> {\n    if (!this.selectedCapture) return Promise.resolve();\n    const { method, url } = this.selectedCapture;\n    const fullUrl = `${window.location.origin}${url}`;\n    let cmd = `curl -X ${method} \"${fullUrl}\" -H \"Accept: application/json\"`;\n    if (this.selectedRequestBody) {\n      const escaped = this.selectedRequestBody.replace(/'/g, \"'\\\\''\");\n      cmd += ` -H \"Content-Type: application/json\" -d '${escaped}'`;\n    }\n    return copyWithFeedback(this, 'curlCopied', cmd);\n  }\n\n  generateTemplate(): void {\n    // Page view: template already generated — just switch mode\n    if (this.pageViewTitle) {\n      this.viewMode = 'template';\n      return;\n    }\n    if (!this.selectedJson) return;\n\n    // Re-use the existing JsonToTemplatesComponent as a plain class — it\n    // creates its own PageModelService internally without Angular DI.\n    try {\n      const raw = this._runConverter(this.cacheService.buildTemplateJson(this.selectedJson!, this.selectedCapture?.url ?? null));\n      if (raw) {\n        this.generatedTemplate = this.formatService.formatTemplate(raw);\n        this.highlightedTemplate = this.formatService.highlightTemplate(this.generatedTemplate);\n      } else {\n        this.templateError = 'Not a valid Blueriq load response';\n      }\n    } catch {\n      this.templateError = 'Failed to generate template';\n    }\n    this.viewMode = 'template';\n  }\n\n  copyUrl(): Promise<void> {\n    return copyWithFeedback(this, 'copiedUrl', window.location.href, 2000);\n  }\n\n\n  get routeInfoEntries(): { key: string; value: string }[] {\n    if (!this.routeInfo) return [];\n    return Object.entries(this.routeInfo).map(([key, value]) => ({ key, value }));\n  }\n\n  togglePicker(): void {\n    if (this.isPickerActive) {\n      this.deactivatePicker();\n    } else {\n      this.inspector.closeInspector();\n      this.activatePicker();\n    }\n  }\n\n  showCurrentPage(): void {\n    const enriched = this.cacheService.enrichedLoadJson() ?? (() => {\n      // Cache is cold — try to warm it from any load capture already in the list.\n      const loadCapture = this.captures.find(\n        c => c.method === 'POST' && c.status === 200 && c.url?.includes('/load')\n      );\n      if (loadCapture) this.cacheService.warmCache(loadCapture);\n      return this.cacheService.enrichedLoadJson();\n    })();\n    if (enriched) {\n      this._showFromLoadJson(enriched);\n      return;\n    }\n\n    // Fallback: live DOM serialisation (no load response captured yet).\n    const result = this.pickerService.findCurrentPageWithHost();\n    if (!result) {\n      console.warn('[DevPanel] No page element found in the current DOM.');\n      return;\n    }\n    const page = result.element;\n    const title = (page as any).displayName || page.key;\n\n    this.selectedCapture = null;\n    this.resetCaptureView();\n\n    // Build analysis from elementCache (flat elements available from prior captures)\n    const cachedElements = this.cacheService.allElements();\n    if (cachedElements.length) {\n      this.captureAnalysis = analyzeCapture({ elements: cachedElements });\n    }\n\n    try {\n      const converter = new JsonToTemplatesComponent();\n      const raw = converter.generateTemplateFor(page, true, false, true);\n      this.generatedTemplate = this.formatService.formatTemplate(raw);\n      this.highlightedTemplate = this.formatService.highlightTemplate(this.generatedTemplate);\n      this.viewMode = 'template';\n    } catch (err) {\n      console.error('[DevPanel] showCurrentPage – template failed:', err);\n      this.templateError = 'Could not generate template';\n      this.viewMode = 'template';\n    }\n\n    try {\n      this.selectedJson = JSON.stringify(serializeElement(page), null, 2);\n      this.highlightedJson = this.formatService.highlightJson(this.selectedJson);\n    } catch (err) {\n      console.error('[DevPanel] showCurrentPage – JSON failed:', err);\n      this.selectedJson = '{}';\n    }\n\n    this.pageElementTree = this.cacheService.buildTree(page.key);\n    this.pageViewTitle = title;\n    this.largeView = true;\n  }\n\n  private _showFromLoadJson(enriched: string): void {\n    const parsed = safeJsonParse<any>(enriched, null);\n    const pageEl = parsed?.elements?.find((e: any) => e.type === 'page');\n    const title = pageEl?.displayName || pageEl?.name || pageEl?.key || 'Page';\n\n    this.selectedCapture = null;\n    this.resetCaptureView();\n\n    try {\n      const raw = this._runConverter(enriched);\n      if (raw) {\n        this.generatedTemplate = this.formatService.formatTemplate(raw);\n        this.highlightedTemplate = this.formatService.highlightTemplate(this.generatedTemplate);\n      } else {\n        this.templateError = 'Not a valid load response';\n      }\n      this.viewMode = 'template';\n    } catch (err) {\n      console.error('[DevPanel] showCurrentPage – template failed:', err);\n      this.templateError = 'Could not generate template';\n      this.viewMode = 'template';\n    }\n\n    if (parsed) {\n      this.selectedJson = JSON.stringify(parsed, null, 2);\n      this.highlightedJson = this.formatService.highlightJson(this.selectedJson);\n      this.captureAnalysis = analyzeCapture(parsed);\n      this.pageElementTree = pageEl?.key ? this.cacheService.buildTree(pageEl.key) : null;\n    } else {\n      this.selectedJson = enriched;\n      this.pageElementTree = null;\n    }\n\n    this.pageViewTitle = title;\n    this.largeView = true;\n  }\n\n  activatePicker(): void {\n    this.pickerService.activate();\n  }\n\n  deactivatePicker(): void {\n    this.pickerService.deactivate();\n  }\n\n  // ── Shared helpers ────────────────────────────────────────────────────────\n\n  private navigateCaptures(dir: 1 | -1): void {\n    const list = this.filteredCaptures;\n    if (!list.length) return;\n    const idx = this.selectedCapture ? list.indexOf(this.selectedCapture) : -1;\n    const next = list[Math.max(0, Math.min(list.length - 1, idx + dir))];\n    if (next !== this.selectedCapture) this.viewCapture(next);\n  }\n\n  startDiff(): void {\n    this.diffBaseCapture = this.selectedCapture;\n    this.isDiffMode = true;\n    this.closeJson();\n  }\n\n  private runDiff(a: CaptureEntry, b: CaptureEntry): void {\n    this.isDiffMode = false;\n    const aJson = a.responseBody ? JSON.stringify(a.responseBody, null, 2) : '{}';\n    const bJson = b.responseBody ? JSON.stringify(b.responseBody, null, 2) : '{}';\n    this.diffResult = diffJson(aJson, bJson);\n    this.diffCompareCapture = b;\n  }\n\n  closeDiff(): void {\n    this.diffResult = null;\n    this.diffBaseCapture = null;\n    this.diffCompareCapture = null;\n    this.isDiffMode = false;\n  }\n\n  // Search-index pre-warm bookkeeping. We don't build the index proactively\n  // before the user has ever opened search (cheap apps don't need to pay\n  // the cost), but once they have, we keep it warm in the background so\n  // the next open doesn't block on a fresh map over `allElements()`.\n  private _searchIndexStale = true;\n  private _searchIndexEverOpened = false;\n  private _searchIndexIdleHandle: number | null = null;\n  private _searchIndexTimeoutHandle: ReturnType<typeof setTimeout> | null = null;\n\n  /** Mark the index dirty and, if user has opened search before, schedule an idle rebuild. */\n  private markSearchIndexStale(): void {\n    this._searchIndexStale = true;\n    if (!this._searchIndexEverOpened) return;\n    if (this._searchIndexIdleHandle !== null || this._searchIndexTimeoutHandle !== null) return;\n    const win = window as Window & {\n      requestIdleCallback?: (cb: () => void, opts?: { timeout: number }) => number;\n      cancelIdleCallback?: (h: number) => void;\n    };\n    const run = () => {\n      this._searchIndexIdleHandle = null;\n      this._searchIndexTimeoutHandle = null;\n      this.zone.runOutsideAngular(() => {\n        if (this._searchIndexStale) this.rebuildSearchIndex();\n      });\n    };\n    if (typeof win.requestIdleCallback === 'function') {\n      this._searchIndexIdleHandle = win.requestIdleCallback(run, { timeout: 2000 });\n    } else {\n      this._searchIndexTimeoutHandle = setTimeout(run, 100);\n    }\n  }\n\n  private rebuildSearchIndex(): void {\n    this.searchableElements = this.cacheService.allElements()\n      .filter(e => e?.key)\n      .map(e => {\n        const name: string = e.displayName || e.name || e.caption || e.questionText || e.functionalKey || e.key;\n        const styles: string[] = Array.isArray(e.styles) ? e.styles : [];\n        const validations = Array.isArray(e.validations) ? e.validations : [];\n        const elMessages = Array.isArray(e.messages) ? e.messages : [];\n        const hasErrors = validations.some((v: any) => v?.blocking) || elMessages.length > 0;\n        const fields: SearchField[] = [\n          { value: name,            weight: 3   },\n          { value: e.displayName,   weight: 2.5 },\n          { value: e.name,          weight: 2   },\n          { value: e.caption,       weight: 2   },\n          { value: e.questionText,  weight: 1.5 },\n          { value: e.functionalKey, weight: 2   },\n          { value: e.key,           weight: 1.5 },\n          { value: e.type,          weight: 1   },\n          { value: e.contentStyle,  weight: 1   },\n          { value: e.explainText,   weight: 0.5 },\n          { value: e.plainText,     weight: 1.5 },\n          ...styles.map((s: string) => ({ value: s, weight: 0.5 })),\n          ...(Array.isArray(e.values)\n            ? e.values.map((v: any) => ({ value: String(v ?? ''), weight: 0.3 }))\n            : []),\n          ...(e.value != null ? [{ value: String(e.value), weight: 0.3 }] : []),\n          ...extractTextNodeFields(e.nodes),\n        ].filter((f): f is SearchField => !!f.value);\n        return {\n          key: e.key,\n          type: e.type ?? '?',\n          name,\n          styles,\n          hasErrors,\n          required: !!e.required,\n          readonly: !!e.readonly,\n          searchFields: fields,\n        };\n      });\n    this._searchIndexStale = false;\n  }\n\n  toggleSearch(): void {\n    if (this.isSearchOpen) {\n      this.isSearchOpen = false;\n      return;\n    }\n    this._searchIndexEverOpened = true;\n    if (this._searchIndexStale) {\n      // First-open or capture arrived between idle ticks — synchronously\n      // build so the user types into a fresh index. From here on, idle\n      // pre-warm keeps it warm without blocking.\n      this.rebuildSearchIndex();\n    }\n    this.isSearchOpen = true;\n  }\n\n  private resetCaptureView(): void {\n    this.selectedJson = null;\n    this.highlightedJson = null;\n    this.bodyKind = 'empty';\n    this.generatedTemplate = null;\n    this.highlightedTemplate = null;\n    this.templateError = null;\n    this.selectedRequestBody = null;\n    this.highlightedRequestBody = null;\n    this.captureAnalysis = null;\n  }\n\n  /**\n   * Run JsonToTemplatesComponent as a plain class against a load-response JSON string.\n   * Returns the raw template string, or null when conversion fails or produces no output.\n   */\n  private _runConverter(loadJson: string): string | null {\n    const c = new JsonToTemplatesComponent();\n    c.loadSessionResponse = loadJson;\n    c.copyElementNames = true;\n    c.copyTextItemNodes = true;\n    c.copyValidationRules = false;\n    c.composeElementTemplate();\n    return c.template ?? null;\n  }\n\n  private formatKeepaliveAge(date: Date): string {\n    const secs = Math.floor((Date.now() - date.getTime()) / 1000);\n    if (secs < 60) return `ping ${secs}s ago`;\n    return `ping ${Math.floor(secs / 60)}m ago`;\n  }\n\n\n  ngOnDestroy(): void {\n    clearTimeout(this.devKeyTimer!);\n    if (this.errorPulseTimer) clearTimeout(this.errorPulseTimer);\n    this.deactivatePicker();\n    this.structureAudit.stop();\n    this.destroy$.next();\n    this.destroy$.complete();\n  }\n\n}\n","<ng-container *ngIf=\"devEnabled\">\n\n  <!-- Floating tab group — always visible -->\n  <div class=\"dev-tab-group\"\n    [class.dev-tab-group--left]=\"panelSide === 'left'\"\n    [class.dev-tab-group--dragging]=\"isDragging\"\n    [style.top.px]=\"tabTop\">\n\n    <button class=\"dev-tab__flip\"\n      (click)=\"flipSide()\"\n      [attr.data-tooltip]=\"panelSide === 'right' ? 'Move panel to left side' : 'Move panel to right side'\">\n      <bq-icon name=\"exchange-alt\"></bq-icon>\n    </button>\n\n    <button class=\"dev-tab\"\n      [class.open]=\"isOpen\"\n      [class.dev-tab--dragging]=\"isDragging\"\n      [class.dev-tab--error]=\"errorPulse\"\n      (click)=\"togglePanel()\"\n      [attr.data-tooltip]=\"'Toggle dev panel (' + modKey + '+D)'\">\n      {{ tabLabel }}\n      <span class=\"dev-tab__dot\"\n        [class.connected]=\"isConnected\"\n        [class.dev-tab__dot--count]=\"newCaptureCount > 0\">{{ newCaptureCount > 0 ? newCaptureCount : '' }}</span>\n    </button>\n\n    <span class=\"dev-tab__drag\"\n      (mousedown)=\"onTabDragStart($event)\"\n      data-tooltip=\"Drag to reposition\">\n      <bq-icon name=\"grip-lines\"></bq-icon>\n    </span>\n\n  </div>\n\n  <!-- Help popup -->\n  <div *ngIf=\"helpOpen\" class=\"dev-help\" (click)=\"helpOpen = false\">\n    <div class=\"dev-help__panel\" (click)=\"$event.stopPropagation()\">\n      <header class=\"dev-help__header\">\n        <span class=\"dev-help__title\"><bq-icon name=\"question-circle\"></bq-icon> About BqLens</span>\n        <button class=\"dev-btn dev-btn--sm dev-help__replay\" (click)=\"replayTour()\" title=\"Replay the panel tour\">\n          <bq-icon name=\"compass\"></bq-icon> Panel tour\n        </button>\n        <button class=\"dev-btn dev-btn--sm dev-help__replay\" (click)=\"replayInspectorTour()\" title=\"Replay the inspector tour (re-pick an element to anchor it)\">\n          <bq-icon name=\"crosshairs\"></bq-icon> Inspector tour\n        </button>\n        <button class=\"dev-icon-btn\" (click)=\"helpOpen = false\" title=\"Close (Esc)\"><bq-icon name=\"times\"></bq-icon></button>\n      </header>\n      <div class=\"dev-help__body\" [innerHTML]=\"helpHtml\"></div>\n    </div>\n  </div>\n\n  <!-- Guided tour overlay -->\n  <app-dev-tour></app-dev-tour>\n\n  <!-- Capture diff modal -->\n  <app-dev-capture-diff\n    *ngIf=\"diffResult\"\n    [captureA]=\"diffBaseCapture\"\n    [captureB]=\"diffCompareCapture\"\n    [diffLines]=\"diffResult\"\n    (closed)=\"closeDiff()\">\n  </app-dev-capture-diff>\n\n  <!-- Element search overlay -->\n  <app-dev-element-search\n    *ngIf=\"isSearchOpen\"\n    [elements]=\"searchableElements\"\n    (elementSelected)=\"inspector.selectElementByKey($event)\"\n    (elementPreviewed)=\"inspector.selectElementByKey($event)\"\n    (closed)=\"isSearchOpen = false\">\n  </app-dev-element-search>\n\n  <!-- Large view modal -->\n  <app-dev-large-view\n    *ngIf=\"largeView && (selectedCapture || pageViewTitle)\"\n    [selectedCapture]=\"selectedCapture\"\n    [pageViewTitle]=\"pageViewTitle\"\n    [viewMode]=\"viewMode\"\n    [highlightedJson]=\"highlightedJson\"\n    [selectedJson]=\"selectedJson\"\n    [highlightedTemplate]=\"highlightedTemplate\"\n    [generatedTemplate]=\"generatedTemplate\"\n    [templateError]=\"templateError\"\n    [captureAnalysis]=\"captureAnalysis\"\n    [selectedRequestBody]=\"selectedRequestBody\"\n    [highlightedRequestBody]=\"highlightedRequestBody\"\n    [elementTree]=\"pageElementTree\"\n    (viewModeChange)=\"viewMode = $event\"\n    (templateRequested)=\"generateTemplate()\"\n    (closed)=\"closeJson()\">\n  </app-dev-large-view>\n\n  <!-- Element inspector popup -->\n  <app-dev-inspector-popup\n    *ngIf=\"inspector.inspectedHostEl\"\n    [inspectedElement]=\"inspector.inspectedElement\"\n    [popupPos]=\"inspector.popupPos\"\n    [isPickerActive]=\"isPickerActive\"\n    [hasParent]=\"inspector.hasParentElement\"\n    [parentNavKey]=\"inspector.parentNavKey\"\n    [elementViewMode]=\"inspector.elementViewMode\"\n    [highlightedElementTemplate]=\"inspector.highlightedElementTemplate\"\n    [elementTemplate]=\"inspector.elementTemplate\"\n    [highlightedElementJson]=\"inspector.highlightedElementJson\"\n    [elementJson]=\"inspector.elementJson\"\n    [elementInsightsData]=\"inspector.elementInsightsData\"\n    [elementTree]=\"inspector.elementTree\"\n    [elementStoryCode]=\"inspector.elementStoryCode\"\n    [highlightedElementStory]=\"inspector.highlightedElementStory\"\n    [elementCopied]=\"inspector.elementCopied\"\n    [onTreeNodeSelect]=\"inspector.onTreeNodeSelect\"\n    [collapsedKeys]=\"inspector.treeCollapsedKeys\"\n    [onTreeNodeToggle]=\"inspector.onTreeNodeToggle\"\n    [selectedTreeKey]=\"inspector.inspectedElement?.key\"\n    [canGoBack]=\"inspector.canGoBack\"\n    [canGoForward]=\"inspector.canGoForward\"\n    [breadcrumbs]=\"inspector.breadcrumbs\"\n    [componentName]=\"inspector.inspectedComponentName\"\n    [componentClass]=\"inspector.inspectedComponentClass\"\n    [blueriqSelector]=\"inspector.inspectedBlueriqSelector\"\n    [blueriqSelectorPriority]=\"inspector.inspectedBlueriqSelectorPriority\"\n    [sourceCapture]=\"sourceCaptureForInspectedElement\"\n    [elementHistory]=\"inspector.elementHistory\"\n    [elementSources]=\"inspector.elementSources\"\n    [elementCapturedIn]=\"inspector.elementCapturedIn\"\n    [storyProvidersPath]=\"inspector.storyProvidersPath\"\n    (elementViewModeChange)=\"inspector.elementViewMode = $event\"\n    (storyProvidersPathChange)=\"inspector.updateStoryProvidersPath($event)\"\n    (copyRequested)=\"inspector.copyInspectedElement()\"\n    (pickerToggled)=\"togglePicker()\"\n    (selectParentRequested)=\"inspector.selectParentElement()\"\n    (navigateBack)=\"inspector.navigateBack()\"\n    (navigateForward)=\"inspector.navigateForward()\"\n    (breadcrumbSelected)=\"inspector.selectElementByKey($event)\"\n    (sourceCaptureClicked)=\"openSourcingCapture($event)\"\n    (tourReplayRequested)=\"tour.replay('inspector')\"\n    (popupMoved)=\"inspector.setManualPopupPos($event)\"\n    (closed)=\"inspector.closeInspector()\">\n  </app-dev-inspector-popup>\n\n  <!-- Slide-out panel -->\n  <aside class=\"dev-panel\" [class.open]=\"isOpen\" [class.dev-panel--left]=\"panelSide === 'left'\" appDevTooltip>\n\n    <!-- Fatal error banner: project/flow/task never started — page is broken.\n         Sticks until app actually starts or user dismisses. -->\n    <div *ngIf=\"fatalError\" @banner class=\"dev-error-banner dev-error-banner--fatal\" role=\"alert\">\n      <bq-icon name=\"exclamation-triangle\"></bq-icon>\n      <div class=\"dev-error-banner__body\">\n        <div class=\"dev-error-banner__title\">{{ fatalErrorKind === 'start project' ? 'Project failed to start' : (fatalErrorKind === 'start flow' ? 'Flow failed to start' : 'Task failed to start') }}</div>\n        <div class=\"dev-error-banner__sub\">\n          <span class=\"dev-error-banner__status\">\n            {{ fatalError.status === 0 ? 'network error' : 'HTTP ' + fatalError.status }}\n          </span>\n          <span *ngIf=\"fatalErrorAgeLabel\">· {{ fatalErrorAgeLabel }}</span>\n          <span class=\"dev-error-banner__url\">{{ fatalError.url }}</span>\n        </div>\n      </div>\n      <button class=\"dev-error-banner__btn\" (click)=\"viewFatalErrorCapture()\" title=\"Open the failing request capture\">View request</button>\n      <button class=\"dev-icon-btn\" (click)=\"dismissAllErrors()\" title=\"Dismiss\"><bq-icon name=\"times\"></bq-icon></button>\n    </div>\n\n    <header class=\"dev-panel__header\">\n      <div class=\"dev-panel__header-left\">\n        <div class=\"dev-panel__header-title\">\n          <span class=\"dev-tab__dot\" [class.connected]=\"isConnected\"></span>\n          {{ title }}\n        </div>\n        <div class=\"dev-panel__header-sub\">\n          {{ blueriqBaseUrl }}\n          <span *ngIf=\"lastKeepaliveLabel\" class=\"dev-panel__keepalive\" data-tooltip=\"Last keepalive ping received from Blueriq — sent periodically to keep the session alive\">· {{ lastKeepaliveLabel }}</span>\n        </div>\n      </div>\n      <button class=\"dev-icon-btn dev-icon-btn--help\" (click)=\"toggleHelp()\" title=\"What is BqLens?\"><bq-icon name=\"question-circle\"></bq-icon></button>\n      <button class=\"dev-icon-btn dev-icon-btn--close\" (click)=\"isOpen = false\" [title]=\"'Sluiten (' + modKey + '+D)'\"><bq-icon [name]=\"panelSide === 'right' ? 'chevron-right' : 'chevron-left'\"></bq-icon></button>\n    </header>\n\n    <div class=\"dev-panel__body\">\n\n      <!-- Inflight critical error banner: 5xx / network / lifecycle 4xx\n           during a live session. Hidden while fatal is active — once the\n           project never started, downstream failures are just noise. -->\n      <div *ngIf=\"inflightError && !fatalError\" @banner class=\"dev-error-banner\" role=\"alert\">\n        <bq-icon name=\"exclamation-triangle\"></bq-icon>\n        <div class=\"dev-error-banner__body\">\n          <strong>{{ inflightErrorKind }} failed</strong>\n          <span class=\"dev-error-banner__status\">\n            ({{ inflightError.status === 0 ? 'network' : inflightError.status }})\n          </span>\n          <span class=\"dev-error-banner__age\" *ngIf=\"inflightErrorAgeLabel\">· {{ inflightErrorAgeLabel }}</span>\n        </div>\n        <button class=\"dev-error-banner__btn\" (click)=\"viewInflightErrorCapture()\" title=\"Open the failing request capture\">View</button>\n        <button class=\"dev-icon-btn\" (click)=\"dismissAllErrors()\" title=\"Dismiss\"><bq-icon name=\"times\"></bq-icon></button>\n      </div>\n\n      <!-- Action bar: primary dev actions -->\n      <div class=\"dev-actions-bar\">\n        <button\n          class=\"dev-btn dev-btn--action dev-btn--picker\"\n          [class.active]=\"isPickerActive\"\n          (click)=\"togglePicker()\"\n          [title]=\"'Inspecteer element (' + modKey + '+P)'\">\n          <bq-icon name=\"crosshairs\"></bq-icon> Pick <kbd class=\"dev-kbd\">{{ modKey }}+P</kbd>\n        </button>\n        <button\n          class=\"dev-btn dev-btn--action dev-btn--page\"\n          (click)=\"showCurrentPage()\"\n          [title]=\"'Huidige pagina tonen (' + modKey + '+G)'\">\n          <bq-icon name=\"file-alt\"></bq-icon> Page <kbd class=\"dev-kbd\">{{ modKey }}+G</kbd>\n        </button>\n        <button\n          class=\"dev-btn dev-btn--action dev-btn--treemap\"\n          (click)=\"openPageTreemap()\"\n          title=\"Page treemap — open the whole page tree in a fullscreen popup\">\n          <bq-icon name=\"expand-alt\"></bq-icon> Treemap\n        </button>\n        <button\n          class=\"dev-btn dev-btn--action dev-btn--search\"\n          [class.active]=\"isSearchOpen\"\n          (click)=\"toggleSearch()\"\n          [title]=\"'Zoek element (' + modKey + '+S)'\">\n          <bq-icon name=\"search\"></bq-icon> Search <kbd class=\"dev-kbd\">{{ modKey }}+S</kbd>\n        </button>\n        <button\n          class=\"dev-btn dev-btn--action dev-btn--internals\"\n          [class.active]=\"internalsOpen\"\n          (click)=\"toggleInternals()\"\n          data-tooltip=\"bq-lens internals — its own caches, integrity audit, and event log. Open this when the dev tools start showing stale or impossible state.\">\n          <span class=\"dev-btn__label\"><bq-icon name=\"cog\"></bq-icon> Internals</span>\n          <span class=\"dev-btn__close-marker\"><bq-icon name=\"times\"></bq-icon></span>\n        </button>\n      </div>\n\n      <!-- Route / Env (collapsible) -->\n      <section class=\"dev-section dev-section--slim\">\n        <div class=\"dev-section__label dev-section__label--toggle\" (click)=\"toggleSection('context')\">\n          <span><bq-icon name=\"route\"></bq-icon> Route / Env</span>\n          <span class=\"dev-section__chevron\" [class.open]=\"sectionOpen['context']\"><bq-icon name=\"chevron-right\"></bq-icon></span>\n        </div>\n        <div class=\"dev-section__body\" *ngIf=\"sectionOpen['context']\" [@expandCollapse]>\n          <div class=\"dev-row dev-context-tabs\">\n            <button class=\"dev-btn dev-btn--sm\" [class.active]=\"contextTab === 'route'\" (click)=\"contextTab = 'route'\" title=\"Toon huidige route\">Route</button>\n            <button class=\"dev-btn dev-btn--sm\" [class.active]=\"contextTab === 'env'\" (click)=\"contextTab = 'env'\" title=\"Toon omgevingsconfiguratie\">Env</button>\n          </div>\n          <ng-container *ngIf=\"contextTab === 'route'\">\n            <div class=\"dev-route\" *ngIf=\"routeInfo; else noRoute\">\n              <div class=\"dev-route__row\" *ngFor=\"let entry of routeInfoEntries\">\n                <span class=\"dev-route__key\">{{ entry.key }}</span>\n                <span class=\"dev-route__value\">{{ entry.value }}</span>\n              </div>\n            </div>\n            <button *ngIf=\"routeInfo\" class=\"dev-btn dev-btn--sm\" [class.dev-btn--copied]=\"copiedUrl\" (click)=\"copyUrl()\" title=\"Kopieer huidige URL\">\n              {{ copiedUrl ? '✓ Copied' : 'Copy URL' }}\n            </button>\n            <ng-template #noRoute><span class=\"dev-muted\">No route matched</span></ng-template>\n          </ng-container>\n          <ng-container *ngIf=\"contextTab === 'env'\">\n            <div class=\"dev-route__row\">\n              <span class=\"dev-route__key\">baseUrl</span>\n              <span class=\"dev-route__value dev-route__value--mono\">{{ blueriqBaseUrl }}</span>\n            </div>\n          </ng-container>\n        </div>\n      </section>\n\n      <!-- Host-provided extension sections -->\n      <section *ngFor=\"let s of extraSections\" class=\"dev-section dev-section--slim\">\n        <div class=\"dev-section__label dev-section__label--toggle\" (click)=\"toggleSection(s.label)\">\n          <span><bq-icon [name]=\"s.icon || 'puzzle-piece'\"></bq-icon> {{ s.label }}</span>\n          <span class=\"dev-section__chevron\" [class.open]=\"sectionOpen[s.label]\"><bq-icon name=\"chevron-right\"></bq-icon></span>\n        </div>\n        <div class=\"dev-section__body\" *ngIf=\"sectionOpen[s.label]\" [@expandCollapse]>\n          <ng-container *ngComponentOutlet=\"s.component\"></ng-container>\n        </div>\n      </section>\n\n      <!-- bq-lens internals overlay — replaces the Captures/Sessions surface\n           when the cog in the header is toggled on. -->\n      <app-dev-cache-internals-panel\n        *ngIf=\"internalsOpen\"\n        (closed)=\"internalsOpen = false\">\n      </app-dev-cache-internals-panel>\n\n      <!-- Main tab switcher — hidden while internals overlay is open -->\n      <ng-container *ngIf=\"!internalsOpen\">\n      <div class=\"dev-view-switch dev-view-switch--full\">\n        <button class=\"dev-view-switch__opt\" [class.active]=\"mainTab === 'captures'\" (click)=\"mainTab = 'captures'\">\n          Captures<span *ngIf=\"captures.length\" class=\"dev-tab-count\">{{ captures.length }}</span>\n        </button>\n        <button class=\"dev-view-switch__opt\" [class.active]=\"mainTab === 'sessions'\" (click)=\"mainTab = 'sessions'\">\n          Sessions\n        </button>\n      </div>\n\n      <!-- Sessions tab -->\n      <app-dev-session-panel *ngIf=\"mainTab === 'sessions'\"></app-dev-session-panel>\n\n      <!-- Capture list -->\n      <ng-container *ngIf=\"mainTab === 'captures'\">\n      <app-dev-capture-list\n        [captures]=\"captures\"\n        [filteredCaptures]=\"filteredCaptures\"\n        [selectedCapture]=\"selectedCapture\"\n        [filterText]=\"filterText\"\n        [captureActive]=\"captureActive\"\n        [viewMode]=\"viewMode\"\n        [statusFilter]=\"statusFilter\"\n        [loadingJson]=\"loadingJson\"\n        [highlightedJson]=\"highlightedJson\"\n        [selectedJson]=\"selectedJson\"\n        [bodyKind]=\"bodyKind\"\n        [highlightedTemplate]=\"highlightedTemplate\"\n        [generatedTemplate]=\"generatedTemplate\"\n        [templateError]=\"templateError\"\n        [captureAnalysis]=\"captureAnalysis\"\n        [selectedRequestBody]=\"selectedRequestBody\"\n        [highlightedRequestBody]=\"highlightedRequestBody\"\n        [curlCopied]=\"curlCopied\"\n        [pinnedCaptures]=\"pinnedCaptures\"\n        (filterTextChange)=\"filterText = $event\"\n        (statusFilterChange)=\"statusFilter = $event\"\n        (captureToggled)=\"toggleCapture()\"\n        (capturesCleared)=\"clearCaptures()\"\n        (captureSelected)=\"viewCapture($event)\"\n        (viewModeChange)=\"viewMode = $event\"\n        (templateRequested)=\"generateTemplate()\"\n        (expandRequested)=\"openLargeView()\"\n        (curlCopyRequested)=\"copyCurl()\"\n        (pinToggled)=\"togglePin($event)\"\n        [isDiffMode]=\"isDiffMode\"\n        [diffBaseCapture]=\"diffBaseCapture\"\n        (diffRequested)=\"startDiff()\"\n        (diffCancelled)=\"closeDiff()\"\n        (showPageRequested)=\"showPageFromCapture(selectedCapture)\">\n      </app-dev-capture-list>\n      </ng-container>\n      </ng-container>\n\n    </div>\n  </aside>\n\n  <!-- Page treemap fullscreen popup. Backdrop click + Esc + close button all dismiss. -->\n  <div *ngIf=\"pageTreemapOpen\"\n       class=\"dev-treemap-popup\"\n       (click)=\"closePageTreemap()\"\n       (keydown.escape)=\"closePageTreemap()\">\n    <div class=\"dev-treemap-popup__panel\" (click)=\"$event.stopPropagation()\">\n      <header class=\"dev-treemap-popup__header\">\n        <span class=\"dev-treemap-popup__title\"><bq-icon name=\"expand-alt\"></bq-icon> Page treemap</span>\n        <button class=\"dev-icon-btn\" (click)=\"closePageTreemap()\" title=\"Close (Esc)\"><bq-icon name=\"times\"></bq-icon></button>\n      </header>\n      <app-dev-element-graph\n        scope=\"page\"\n        [rootKey]=\"pageElementTree?.key ?? null\"\n        (nodeSelected)=\"inspector.selectElementByKey($event)\">\n      </app-dev-element-graph>\n    </div>\n  </div>\n\n</ng-container>\n","import { CommonModule, isPlatformBrowser } from '@angular/common';\nimport { HTTP_INTERCEPTORS } from '@angular/common/http';\nimport {\n  ApplicationRef,\n  createComponent,\n  EnvironmentInjector,\n  Inject,\n  ModuleWithProviders,\n  NgModule,\n  PLATFORM_ID,\n} from '@angular/core';\nimport { filter, take } from 'rxjs/operators';\nimport { BqLensConfig, BQ_LENS_CONFIG } from './bq-lens.config';\nimport { FormsModule } from '@angular/forms';\nimport { RouterModule } from '@angular/router';\nimport { DevInterceptor } from './services/dev-interceptor';\nimport { installBlueriqConsoleTableInterceptor } from './services/dev-picker.service';\n\ninstallBlueriqConsoleTableInterceptor();\nimport { DevCaptureListComponent } from './components/dev-capture-list.component';\nimport { DevElementGraphComponent } from './components/dev-element-graph.component';\nimport { DevElementTreeComponent } from './components/dev-element-tree.component';\nimport { DevInsightsPanelComponent } from './components/dev-insights-panel.component';\nimport { DevInspectorPopupComponent } from './components/dev-inspector-popup.component';\nimport { DevCodeViewerComponent } from './components/dev-code-viewer.component';\nimport { DevLargeViewComponent } from './components/dev-large-view.component';\nimport { BqLensComponent } from './bq-lens.component';\nimport { DevSessionPanelComponent } from './components/dev-session-panel.component';\nimport { DevCacheInternalsPanelComponent } from './components/dev-cache-internals-panel.component';\nimport { DevTooltipDirective } from './dev-tooltip.directive';\nimport { DevViewerContainerComponent } from './components/dev-viewer-container.component';\nimport { DevCaptureDiffComponent } from './components/dev-capture-diff.component';\nimport { DevElementSearchComponent } from './components/dev-element-search.component';\nimport { DevSelectorTreeComponent } from './components/dev-selector-tree.component';\nimport { JsonToTemplatesComponent } from './json-to-templates/json-to-templates.component';\nimport { BqIconComponent } from './components/bq-icon.component';\nimport { DevTourComponent } from './components/dev-tour.component';\n\n@NgModule({\n  declarations: [\n    BqLensComponent,\n    DevSessionPanelComponent,\n    DevCacheInternalsPanelComponent,\n    DevTooltipDirective,\n    DevElementTreeComponent,\n    DevElementGraphComponent,\n    DevInsightsPanelComponent,\n    DevCaptureListComponent,\n    DevLargeViewComponent,\n    DevInspectorPopupComponent,\n    DevCodeViewerComponent,\n    DevViewerContainerComponent,\n    DevCaptureDiffComponent,\n    DevElementSearchComponent,\n    DevSelectorTreeComponent,\n    JsonToTemplatesComponent,\n    BqIconComponent,\n    DevTourComponent,\n  ],\n  exports: [BqLensComponent],\n  imports: [CommonModule, FormsModule, RouterModule],\n  providers: [\n    { provide: HTTP_INTERCEPTORS, useClass: DevInterceptor, multi: true },\n  ],\n})\nexport class BqLensModule {\n  constructor(\n    appRef: ApplicationRef,\n    envInjector: EnvironmentInjector,\n    @Inject(PLATFORM_ID) platformId: object,\n  ) {\n    if (!isPlatformBrowser(platformId)) return;\n    appRef.isStable.pipe(filter(s => s), take(1)).subscribe(() => {\n      if (document.querySelector('bq-lens-panel')) return;\n      const compRef = createComponent(BqLensComponent, { environmentInjector: envInjector });\n      document.body.appendChild(compRef.location.nativeElement);\n      appRef.attachView(compRef.hostView);\n    });\n  }\n\n  static forRoot(config: BqLensConfig = {}): ModuleWithProviders<BqLensModule> {\n    return {\n      ngModule: BqLensModule,\n      providers: [{ provide: BQ_LENS_CONFIG, useValue: config }],\n    };\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.DevCacheStorageService","i1.DevCaptureService","i2.DevBaseUrlService","ɵgetLContext","i1","i2.BqIconComponent","i2.DevInsightsPanelComponent","i3.DevCodeViewerComponent","i2","i4.DevViewerContainerComponent","i5.BqIconComponent","i1.DevElementCacheService","i2.DevTreemapLayoutService","i3","i4.BqIconComponent","i2.DevElementTreeComponent","i3.DevElementGraphComponent","i4.DevInsightsPanelComponent","i5.DevCodeViewerComponent","i6.DevSelectorTreeComponent","i7.BqIconComponent","i3.DevViewerContainerComponent","getStyles","i1.DevPickerService","i2.DevElementCacheService","i3.DevFormatService","i4.DevTemplateCacheService","i4.DevElementTreeComponent","i5.DevInsightsPanelComponent","i2.DevCaptureService","i3.DevCacheStorageService","i4.DevStructureAuditService","i5.DevTemplateCacheService","i6","i7","i8.BqIconComponent","i1.DevSearchService","i1.DevTourService","i2.DevFormatService","i3.DevCaptureService","i4.DevElementCacheService","i5.DevStructureAuditService","i6.DevTemplateCacheService","i7.DevPickerService","i8.DevInspectorService","i9.DevTourService","i10.DevColorsService","i11.DevBaseUrlService","i12","i13.DevSessionPanelComponent","i14.DevCacheInternalsPanelComponent","i15.DevTooltipDirective","i16.DevElementGraphComponent","i17.DevCaptureListComponent","i18.DevLargeViewComponent","i19.DevInspectorPopupComponent","i20.DevCaptureDiffComponent","i21.DevElementSearchComponent","i22.BqIconComponent","i23.DevTourComponent"],"mappings":"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"}