{"version":3,"file":"angular-render-scan.mjs","sources":["../../src/infrastructure/ui/fps.ts","../../src/infrastructure/ui/cpu.ts","../../src/infrastructure/ui/angular-debug.ts","../../src/infrastructure/ui/runtime-telemetry.ts","../../src/infrastructure/ui/overlay.ts","../../src/domain/options.ts","../../src/application/onpush-analyzer.ts","../../src/application/referential-stability.ts","../../src/application/cd-graph.ts","../../src/application/stats.ts","../../src/application/interaction.ts","../../src/application/runtime.ts","../../src/infrastructure/angular/auto-instrumentation.ts","../../src/infrastructure/angular/zone-tracker.ts","../../src/infrastructure/angular/angular.ts","../../src/testing.ts","../../src/angular-render-scan.ts"],"sourcesContent":["export class FpsMeter {\n  private frames: number[] = [];\n\n  mark(now = performance.now()): number {\n    this.frames.push(now);\n    const cutoff = now - 1000;\n    while (this.frames.length > 0 && this.frames[0] < cutoff) {\n      this.frames.shift();\n    }\n    return this.value;\n  }\n\n  get value(): number {\n    return this.frames.length;\n  }\n\n  reset(): void {\n    this.frames = [];\n  }\n}\n","export class CpuMeter {\n  private observer: PerformanceObserver | null = null;\n  private tasks: Array<{ start: number; duration: number }> = [];\n  private frameTicks: Array<{ time: number; busy: number }> = [];\n  private lastFrameTime = performance.now();\n\n  constructor(private readonly onChange?: () => void) {\n    if (typeof PerformanceObserver !== 'undefined' && \n        PerformanceObserver.supportedEntryTypes && \n        PerformanceObserver.supportedEntryTypes.includes('longtask')) {\n      try {\n        this.observer = new PerformanceObserver((list) => {\n          const now = performance.now();\n          for (const entry of list.getEntries()) {\n            this.tasks.push({\n              start: entry.startTime,\n              duration: entry.duration\n            });\n          }\n          this.cleanOldTasks(now);\n          if (this.onChange) {\n            this.onChange();\n          }\n        });\n        this.observer.observe({ entryTypes: ['longtask'] });\n      } catch {\n        // Safe fallback if observer fails\n      }\n    }\n  }\n\n  markFrame(now = performance.now()): void {\n    const elapsed = now - this.lastFrameTime;\n    this.lastFrameTime = now;\n    \n    // Target frame duration is 16.67ms (60fps)\n    const busy = Math.max(0, elapsed - 16.67);\n    this.frameTicks.push({ time: now, busy });\n    \n    this.cleanOldTicks(now);\n\n    // If a frame was severely blocked, trigger onChange instantly to show live updates!\n    if (busy > 20 && this.onChange) {\n      this.onChange();\n    }\n  }\n\n  private cleanOldTicks(now: number): void {\n    const cutoff = now - 2000;\n    while (this.frameTicks.length > 0 && this.frameTicks[0].time < cutoff) {\n      this.frameTicks.shift();\n    }\n  }\n\n  private cleanOldTasks(now: number): void {\n    const cutoff = now - 2000; // 2 second sliding window\n    while (this.tasks.length > 0 && this.tasks[0].start + this.tasks[0].duration < cutoff) {\n      this.tasks.shift();\n    }\n  }\n\n  get value(): number {\n    const now = performance.now();\n    this.cleanOldTasks(now);\n    this.cleanOldTicks(now);\n\n    const cutoff = now - 2000;\n    \n    // 1. Long Tasks Busy Time\n    let taskBusyTime = 0;\n    for (const task of this.tasks) {\n      const taskStart = Math.max(task.start, cutoff);\n      const taskEnd = Math.min(task.start + task.duration, now);\n      if (taskEnd > taskStart) {\n        taskBusyTime += (taskEnd - taskStart);\n      }\n    }\n\n    // 2. Frame Lag Busy Time\n    let frameBusyTime = 0;\n    for (const tick of this.frameTicks) {\n      frameBusyTime += tick.busy;\n    }\n\n    const totalBusyTime = Math.max(taskBusyTime, frameBusyTime);\n    return Math.min(100, Math.round((totalBusyTime / 2000) * 100));\n  }\n\n  getDetails() {\n    const now = performance.now();\n    this.cleanOldTasks(now);\n    this.cleanOldTicks(now);\n\n    const cutoff = now - 2000;\n    let taskBusyTime = 0;\n    let maxDuration = 0;\n    let longTaskCount = 0;\n\n    for (const task of this.tasks) {\n      const taskStart = Math.max(task.start, cutoff);\n      const taskEnd = Math.min(task.start + task.duration, now);\n      if (taskEnd > taskStart) {\n        const overlap = taskEnd - taskStart;\n        taskBusyTime += overlap;\n        longTaskCount++;\n        if (task.duration > maxDuration) {\n          maxDuration = task.duration;\n        }\n      }\n    }\n\n    let frameBusyTime = 0;\n    let maxFrameDelay = 0;\n    for (const tick of this.frameTicks) {\n      frameBusyTime += tick.busy;\n      if (tick.busy > maxFrameDelay) {\n        maxFrameDelay = tick.busy;\n      }\n    }\n\n    const totalBusyTime = Math.max(taskBusyTime, frameBusyTime);\n    const percentage = Math.min(100, Math.round((totalBusyTime / 2000) * 100));\n    \n    const displayMaxDuration = Math.round(Math.max(maxDuration, maxFrameDelay));\n    const totalBlockingTime = Math.round(Math.max(\n      this.tasks.reduce((sum, t) => sum + Math.max(0, t.duration - 50), 0),\n      frameBusyTime\n    ));\n\n    return {\n      percentage,\n      longTaskCount: Math.max(longTaskCount, frameBusyTime > 80 ? 1 : 0),\n      maxDuration: displayMaxDuration,\n      totalBlockingTime\n    };\n  }\n\n  destroy(): void {\n    if (this.observer) {\n      this.observer.disconnect();\n    }\n  }\n}\n","export interface AngularDebugSummary {\n  available: boolean;\n  version?: string;\n  componentName?: string;\n  ownerName?: string;\n  directiveNames: string[];\n  listenerNames: string[];\n  rootName?: string;\n}\n\ntype AngularDebugGlobals = {\n  getComponent?: (element: Element) => unknown;\n  getOwningComponent?: (elementOrDir: Element | object) => unknown;\n  getDirectives?: (node: Node) => unknown[];\n  getListeners?: (element: Element) => Array<{ name?: string; type?: string }>;\n  getRootComponents?: (elementOrDir: Element | object) => unknown[];\n};\n\nexport function getAngularDebugSummary(element: Element): AngularDebugSummary {\n  const version = versionFromDom(element);\n  const ng = getAngularGlobals();\n  if (!ng) {\n    return {\n      available: false,\n      version,\n      directiveNames: [],\n      listenerNames: [],\n    };\n  }\n\n  const component = safeCall(() => ng.getComponent?.(element));\n  const owner = safeCall(() => ng.getOwningComponent?.(element));\n  const directives = safeCall(() => ng.getDirectives?.(element)) ?? [];\n  const listeners = safeCall(() => ng.getListeners?.(element)) ?? [];\n  const roots = safeCall(() => ng.getRootComponents?.(element)) ?? [];\n\n  return {\n    available: true,\n    version,\n    componentName: nameOf(component),\n    ownerName: nameOf(owner),\n    directiveNames: directives.map(nameOf).filter(isPresent),\n    listenerNames: listeners\n      .map((listener) => listener.name || listener.type)\n      .filter(isPresent),\n    rootName: nameOf(roots[0]),\n  };\n}\n\nfunction getAngularGlobals(): AngularDebugGlobals | undefined {\n  if (typeof window === \"undefined\") {\n    return undefined;\n  }\n\n  const ng = (window as Window & { ng?: AngularDebugGlobals }).ng;\n  if (!ng || typeof ng !== \"object\") {\n    return undefined;\n  }\n\n  return ng;\n}\n\nfunction versionFromDom(element: Element): string | undefined {\n  return (\n    element.closest(\"[ng-version]\")?.getAttribute(\"ng-version\") ||\n    document.querySelector(\"[ng-version]\")?.getAttribute(\"ng-version\") ||\n    undefined\n  );\n}\n\nfunction safeCall<T>(read: () => T): T | undefined {\n  try {\n    return read();\n  } catch {\n    return undefined;\n  }\n}\n\nfunction nameOf(value: unknown): string | undefined {\n  if (!value || (typeof value !== \"object\" && typeof value !== \"function\")) {\n    return undefined;\n  }\n\n  const candidate = value as { constructor?: { name?: string }; name?: string };\n  return candidate.constructor?.name || candidate.name;\n}\n\nfunction isPresent(value: string | undefined): value is string {\n  return Boolean(value);\n}\n","export interface RuntimeTelemetrySummary {\n  longTasks: {\n    count: number;\n    maxDuration: number;\n    totalBlockingTime: number;\n  };\n  interaction?: {\n    name: string;\n    duration: number;\n    inputDelay: number;\n  };\n  layoutShift: {\n    count: number;\n    score: number;\n  };\n  resources: {\n    slowCount: number;\n    repeatedCount: number;\n    maxDuration: number;\n    slowestName?: string;\n  };\n}\n\ntype StoredEntry = {\n  name: string;\n  startTime: number;\n  duration: number;\n  value?: number;\n  hadRecentInput?: boolean;\n  processingStart?: number;\n};\n\nconst BUFFER_LIMIT = 120;\nconst SLOW_RESOURCE_MS = 250;\n\nexport class RuntimeTelemetry {\n  private readonly observers: PerformanceObserver[] = [];\n  private readonly longTasks: StoredEntry[] = [];\n  private readonly interactions: StoredEntry[] = [];\n  private readonly layoutShifts: StoredEntry[] = [];\n  private readonly resources: StoredEntry[] = [];\n\n  constructor(private readonly onChange?: () => void) {\n    this.observe(\"longtask\", this.longTasks);\n    this.observe(\"event\", this.interactions);\n    this.observe(\"layout-shift\", this.layoutShifts);\n    this.observe(\"resource\", this.resources);\n  }\n\n  getSummary(startTime: number, endTime = performance.now()): RuntimeTelemetrySummary {\n    const longTasks = this.inWindow(this.longTasks, startTime, endTime);\n    const interactions = this.inWindow(this.interactions, startTime, endTime);\n    const shifts = this.inWindow(this.layoutShifts, startTime, endTime).filter(\n      (entry) => !entry.hadRecentInput,\n    );\n    const resources = this.inWindow(this.resources, startTime, endTime);\n    const slowResources = resources.filter(\n      (entry) => entry.duration >= SLOW_RESOURCE_MS,\n    );\n    const resourceCounts = new Map<string, number>();\n    for (const entry of resources) {\n      resourceCounts.set(entry.name, (resourceCounts.get(entry.name) ?? 0) + 1);\n    }\n\n    const latestInteraction = interactions\n      .slice()\n      .sort((a, b) => b.startTime - a.startTime)[0];\n    const slowestResource = slowResources\n      .slice()\n      .sort((a, b) => b.duration - a.duration)[0];\n\n    return {\n      longTasks: {\n        count: longTasks.length,\n        maxDuration: Math.round(max(longTasks.map((entry) => entry.duration))),\n        totalBlockingTime: Math.round(\n          longTasks.reduce(\n            (sum, entry) => sum + Math.max(0, entry.duration - 50),\n            0,\n          ),\n        ),\n      },\n      interaction: latestInteraction\n        ? {\n            name: latestInteraction.name,\n            duration: Math.round(latestInteraction.duration),\n            inputDelay: Math.round(\n              Math.max(\n                0,\n                (latestInteraction.processingStart ?? latestInteraction.startTime) -\n                  latestInteraction.startTime,\n              ),\n            ),\n          }\n        : undefined,\n      layoutShift: {\n        count: shifts.length,\n        score: Number(\n          shifts\n            .reduce((sum, entry) => sum + (entry.value ?? 0), 0)\n            .toFixed(4),\n        ),\n      },\n      resources: {\n        slowCount: slowResources.length,\n        repeatedCount: [...resourceCounts.values()].filter((count) => count > 1)\n          .length,\n        maxDuration: Math.round(max(slowResources.map((entry) => entry.duration))),\n        slowestName: slowestResource ? shortResourceName(slowestResource.name) : undefined,\n      },\n    };\n  }\n\n  destroy(): void {\n    for (const observer of this.observers) {\n      observer.disconnect();\n    }\n    this.observers.length = 0;\n  }\n\n  private observe(type: string, target: StoredEntry[]): void {\n    if (\n      typeof PerformanceObserver === \"undefined\" ||\n      !PerformanceObserver.supportedEntryTypes?.includes(type)\n    ) {\n      return;\n    }\n\n    try {\n      const observer = new PerformanceObserver((list) => {\n        for (const entry of list.getEntries()) {\n          target.push(toStoredEntry(entry));\n        }\n        trim(target);\n        this.onChange?.();\n      });\n      observer.observe({ type, buffered: true });\n      this.observers.push(observer);\n    } catch {\n      // Unsupported observer options or browser-specific failures should not break the overlay.\n    }\n  }\n\n  private inWindow(\n    entries: StoredEntry[],\n    startTime: number,\n    endTime: number,\n  ): StoredEntry[] {\n    return entries.filter((entry) => {\n      const entryEnd = entry.startTime + entry.duration;\n      return entry.startTime <= endTime && entryEnd >= startTime;\n    });\n  }\n}\n\nfunction toStoredEntry(entry: PerformanceEntry): StoredEntry {\n  const candidate = entry as PerformanceEntry & {\n    value?: number;\n    hadRecentInput?: boolean;\n    processingStart?: number;\n  };\n\n  return {\n    name: entry.name,\n    startTime: entry.startTime,\n    duration: entry.duration,\n    value: candidate.value,\n    hadRecentInput: candidate.hadRecentInput,\n    processingStart: candidate.processingStart,\n  };\n}\n\nfunction trim(entries: StoredEntry[]): void {\n  if (entries.length > BUFFER_LIMIT) {\n    entries.splice(0, entries.length - BUFFER_LIMIT);\n  }\n}\n\nfunction max(values: number[]): number {\n  return values.length ? Math.max(...values) : 0;\n}\n\nfunction shortResourceName(name: string): string {\n  try {\n    const url = new URL(name, window.location.href);\n    return url.pathname.split(\"/\").filter(Boolean).pop() || url.hostname;\n  } catch {\n    return name.split(\"/\").filter(Boolean).pop() || name;\n  }\n}\n","import { FpsMeter } from \"./fps\";\nimport { CpuMeter } from \"./cpu\";\nimport { getAngularDebugSummary } from \"./angular-debug\";\nimport { RuntimeTelemetry } from \"./runtime-telemetry\";\nimport {\n  clearRecording,\n  copyAIPrompt,\n  getRecording,\n  getSessionData,\n  getWastedStats,\n  getDetachedComponents,\n  getRegisteredComponents,\n  getOnPushCandidates,\n  getReferentialInstability,\n  getZonePollutionEvents,\n  getCdGraph,\n  beginInteraction,\n  endInteraction,\n  setInteractionBaseline,\n  compareInteractionReports,\n  formatInteractionReportMarkdown,\n  formatInteractionReportHtml,\n} from \"../../application/runtime\";\nimport type {\n  AngularRenderCycle,\n  AngularRenderEntry,\n  AngularRenderScanResolvedOptions,\n  BudgetViolation,\n  OnPushCandidate,\n  ZonePollutionEvent,\n  CdTriggerAttribution,\n  InteractionComparison,\n  InteractionReport,\n} from \"../../domain/entities\";\n\ninterface ActiveHighlight {\n  entry: AngularRenderEntry;\n  expiresAt: number;\n  rect: DOMRect;\n}\n\nconst TOOLBAR_POSITION_KEY = \"angular-render-scan:toolbar-position\";\nconst TOOLBAR_COMPACT_KEY = \"angular-render-scan:toolbar-compact\";\n\nconst TOOLBAR_CSS = `\n  :host {\n    all: initial;\n    display: block;\n    position: fixed;\n    z-index: 2147483647;\n    pointer-events: none;\n    --ars-bg: rgba(255, 255, 255, 0.85);\n    --ars-border: rgba(15, 23, 42, 0.08);\n    --ars-color: #0f172a;\n    --ars-label: #64748b;\n    --ars-panel-bg: rgba(255, 255, 255, 0.94);\n    --ars-card-bg: rgba(248, 250, 252, 0.86);\n    --ars-chip-bg: rgba(255, 255, 255, 0.72);\n    --ars-chip-border: rgba(15, 23, 42, 0.07);\n    --ars-accent-soft: rgba(37, 99, 235, 0.1);\n    --ars-shadow: 0 18px 48px rgba(15, 23, 42, 0.12), 0 1px 2px rgba(15, 23, 42, 0.08), inset 0 1px 0 rgba(255,255,255,0.7);\n  }\n  \n  :host(.dark) {\n    --ars-bg: rgba(15, 23, 42, 0.85);\n    --ars-border: rgba(255, 255, 255, 0.1);\n    --ars-color: #f8fafc;\n    --ars-label: #94a3b8;\n    --ars-panel-bg: rgba(15, 23, 42, 0.94);\n    --ars-card-bg: rgba(30, 41, 59, 0.84);\n    --ars-chip-bg: rgba(255, 255, 255, 0.07);\n    --ars-chip-border: rgba(255, 255, 255, 0.09);\n    --ars-accent-soft: rgba(96, 165, 250, 0.14);\n    --ars-shadow: 0 18px 48px rgba(0,0,0,0.38), 0 1px 2px rgba(0,0,0,0.28), inset 0 1px 0 rgba(255,255,255,0.08);\n  }\n\n  .toolbar {\n    position: fixed;\n    right: 16px;\n    bottom: 16px;\n    z-index: 2147483647;\n    display: flex;\n    align-items: center;\n    flex-wrap: wrap;\n    gap: 6px;\n    width: auto;\n    max-width: calc(100vw - 32px);\n    padding: 6px;\n    border: 1px solid rgba(15, 23, 42, 0.08);\n    border-radius: 12px;\n    background:\n      linear-gradient(135deg, rgba(255,255,255,0.97), rgba(248,250,252,0.92)),\n      var(--ars-bg);\n    box-shadow:\n      0 14px 36px rgba(15, 23, 42, 0.14),\n      0 2px 6px rgba(15, 23, 42, 0.08),\n      inset 0 1px 0 rgba(255,255,255,0.78);\n    color: var(--ars-color);\n    font: 500 11px/1.2 ui-sans-serif, system-ui, -apple-system, sans-serif;\n    pointer-events: auto;\n    backdrop-filter: blur(20px) saturate(1.2);\n    cursor: grab;\n    user-select: none;\n    transition: box-shadow 0.2s ease, border-color 0.2s ease;\n  }\n  :host(.dark) .toolbar {\n    border-color: rgba(148, 163, 184, 0.18);\n    background:\n      linear-gradient(135deg, rgba(15,23,42,0.96), rgba(30,41,59,0.9)),\n      var(--ars-bg);\n    box-shadow:\n      0 18px 44px rgba(0,0,0,0.48),\n      inset 0 1px 0 rgba(255,255,255,0.08);\n  }\n  .toolbar:hover {\n    border-color: rgba(37, 99, 235, 0.2);\n    box-shadow:\n      0 16px 40px rgba(15, 23, 42, 0.16),\n      0 2px 8px rgba(15, 23, 42, 0.08),\n      inset 0 1px 0 rgba(255,255,255,0.78);\n  }\n  .toolbar:active {\n    cursor: grabbing;\n  }\n  .toolbar.disabled {\n    opacity: 0.82;\n    pointer-events: auto;\n    cursor: grab;\n  }\n  .toolbar.disabled {\n    gap: 0;\n    padding: 5px;\n    border-radius: 999px;\n    box-shadow:\n      0 8px 20px rgba(15, 23, 42, 0.12),\n      inset 0 1px 0 rgba(255,255,255,0.7);\n  }\n  .toolbar-switch {\n    display: inline-flex;\n    flex-direction: column;\n    align-items: center;\n    gap: 2px;\n    padding: 3px 6px 5px;\n    border-radius: 9px;\n    background: rgba(15, 23, 42, 0.045);\n    box-shadow: inset 0 0 0 1px rgba(15, 23, 42, 0.055);\n    flex: 0 0 auto;\n  }\n  :host(.dark) .toolbar-switch {\n    background: rgba(255, 255, 255, 0.06);\n    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.08);\n  }\n  .toolbar.disabled .toolbar-switch {\n    padding: 5px;\n    border-radius: 999px;\n    background: transparent;\n    box-shadow: none;\n    min-width: 0;\n    gap: 6px;\n  }\n  .toolbar-main {\n    display: flex;\n    align-items: stretch;\n    flex-wrap: wrap;\n    gap: 5px;\n    min-width: 0;\n    max-width: calc(100vw - 230px);\n    overflow: visible;\n  }\n  .toolbar.compact .toolbar-main {\n    max-width: calc(100vw - 168px);\n  }\n  .toolbar-extended {\n    display: flex;\n    align-items: stretch;\n    flex-wrap: wrap;\n    gap: 5px;\n  }\n  .toolbar.compact .toolbar-extended {\n    display: none;\n  }\n  .toolbar.expanded .metric {\n    min-width: 56px;\n    padding: 6px 7px;\n  }\n  .toolbar.expanded .metric.slowest-metric {\n    min-width: 106px;\n    max-width: 128px;\n    flex-basis: 118px;\n  }\n  .toolbar-actions {\n    display: flex;\n    align-items: center;\n    gap: 5px;\n    justify-content: flex-end;\n    min-width: max-content;\n    flex: 0 0 auto;\n    padding-left: 2px;\n    border-left: 1px solid rgba(15, 23, 42, 0.08);\n  }\n  :host(.dark) .toolbar-actions {\n    border-left-color: rgba(255, 255, 255, 0.08);\n  }\n  .toolbar.compact .toolbar-actions {\n    gap: 4px;\n  }\n  .toolbar-size-toggle {\n    min-width: 30px;\n    justify-content: center;\n  }\n  .toolbar-actions .toolbar-size-toggle {\n    width: 28px;\n    height: 28px;\n    min-width: 28px;\n    padding: 0;\n  }\n  .toolbar.compact .toolbar-size-toggle {\n    min-width: 30px;\n  }\n  .toolbar-picker-toggle {\n    display: inline-grid;\n    place-items: center;\n  }\n  .toolbar-picker-toggle svg,\n  .toolbar-size-toggle svg {\n    width: 14px;\n    height: 14px;\n    display: block;\n    stroke: currentColor;\n  }\n  .switch, .details-toggle, .clear-btn, .action-btn {\n    cursor: pointer;\n  }\n  .switch {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    min-width: 34px;\n    user-select: none;\n  }\n  .details-toggle {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n    padding: 7px 10px;\n    border: 1px solid rgba(37, 99, 235, 0.14);\n    border-radius: 9px;\n    color: var(--ars-label);\n    font: inherit;\n    font-weight: 600;\n    background: rgba(37, 99, 235, 0.045);\n    user-select: none;\n    transition: all 0.15s ease;\n  }\n  .details-toggle:hover {\n    background: rgba(37, 99, 235, 0.08);\n    border-color: rgba(37, 99, 235, 0.24);\n    color: #2563eb;\n  }\n  .details-toggle input {\n    width: 13px;\n    height: 13px;\n    margin: 0;\n    accent-color: #2563eb;\n  }\n  .details-toggle.active {\n    border-color: rgba(37, 99, 235, 0.36);\n    color: #2563eb;\n    background: rgba(37, 99, 235, 0.1);\n  }\n  .switch input {\n    position: absolute;\n    opacity: 0;\n    pointer-events: none;\n  }\n  .track {\n    position: relative;\n    width: 28px;\n    height: 16px;\n    border-radius: 999px;\n    background: #e2e8f0;\n    transition: background 0.15s ease;\n  }\n  .track::after {\n    content: \"\";\n    position: absolute;\n    top: 2px;\n    left: 2px;\n    width: 12px;\n    height: 12px;\n    border-radius: 999px;\n    background: #ffffff;\n    box-shadow: 0 1px 3px rgba(15, 23, 42, 0.15);\n    transition: transform 0.15s cubic-bezier(0.4, 0, 0.2, 1);\n  }\n  input:checked + .track {\n    background: #2563eb;\n  }\n  input:checked + .track::after {\n    transform: translateX(12px);\n  }\n  .switch-text {\n    display: none;\n    color: var(--ars-color);\n    font-weight: 700;\n  }\n  .metric {\n    display: grid;\n    gap: 3px;\n    min-width: 62px;\n    flex: 0 0 auto;\n    padding: 7px 8px;\n    border: 1px solid var(--ars-chip-border);\n    border-radius: 8px;\n    background: var(--ars-chip-bg);\n    box-shadow:\n      inset 0 1px 0 rgba(255, 255, 255, 0.5),\n      0 1px 2px rgba(15, 23, 42, 0.025);\n    transition: background 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease;\n  }\n  .metric:hover {\n    background: rgba(255, 255, 255, 0.9);\n    border-color: rgba(37, 99, 235, 0.16);\n    box-shadow:\n      inset 0 1px 0 rgba(255, 255, 255, 0.62),\n      0 3px 8px rgba(15, 23, 42, 0.07);\n  }\n  :host(.dark) .metric {\n    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.06);\n  }\n  :host(.dark) .metric:hover {\n    background: rgba(255, 255, 255, 0.09);\n    border-color: rgba(96, 165, 250, 0.22);\n  }\n  .metric.slowest-metric {\n    min-width: 128px;\n    max-width: 160px;\n    flex: 0 0 140px;\n  }\n  .angular-version-chip {\n    flex: 0 0 auto;\n    max-width: 38px;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    padding: 1px 4px;\n    border: 1px solid rgba(37, 99, 235, 0.16);\n    border-radius: 999px;\n    background: rgba(37, 99, 235, 0.08);\n    color: #2563eb;\n    font: 850 7px/1 ui-monospace, SFMono-Regular, Menlo, monospace;\n    white-space: nowrap;\n  }\n  :host(.dark) .angular-version-chip {\n    border-color: rgba(96, 165, 250, 0.22);\n    background: rgba(96, 165, 250, 0.12);\n    color: #93c5fd;\n  }\n  .slowest-metric .value {\n    display: block;\n    width: 100%;\n    text-overflow: ellipsis;\n    overflow: hidden;\n    white-space: nowrap;\n  }\n  .label { color: var(--ars-label); font-size: 8px; font-weight: 850; text-transform: uppercase; letter-spacing: 0.07em; }\n  .value { color: var(--ars-color); font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 12px; font-weight: 850; white-space: nowrap; }\n  .value.fps-drop { color: #ef4444; }\n  .value.cpu-high { color: #ef4444; }\n  .value.cpu-medium { color: #f59e0b; }\n  .metric.cpu-interactive {\n    cursor: pointer;\n    transition: background 0.15s ease, transform 0.1s ease, box-shadow 0.15s ease;\n    border-radius: 9px;\n    padding: 6px 7px;\n    margin: 0;\n    user-select: none;\n    display: inline-grid;\n    flex-direction: column;\n    position: relative;\n  }\n  .metric.cpu-interactive:hover {\n    background: rgba(37, 99, 235, 0.08);\n    box-shadow:\n      inset 0 0 0 1px rgba(37, 99, 235, 0.22),\n      0 3px 8px rgba(15, 23, 42, 0.07);\n  }\n  .metric.cpu-interactive:active {\n    transform: scale(0.97);\n  }\n  .metric.cpu-interactive.active {\n    background: rgba(37, 99, 235, 0.08);\n    box-shadow: inset 0 0 0 1px rgba(37, 99, 235, 0.25);\n  }\n  .metric.cpu-interactive .value {\n    border-bottom: 1.5px dotted rgba(37, 99, 235, 0.4);\n    padding-bottom: 0.5px;\n  }\n  .metric.cpu-interactive:hover .value {\n    border-bottom: 1.5px solid rgba(37, 99, 235, 0.8);\n    color: #2563eb;\n  }\n  .cpu-details-panel {\n    position: fixed;\n    z-index: 2147483647;\n    pointer-events: auto;\n    width: 160px;\n    background: var(--ars-panel-bg);\n    border: 1px solid var(--ars-border);\n    border-radius: 10px;\n    padding: 10px;\n    backdrop-filter: blur(20px) saturate(1.15);\n    box-shadow: var(--ars-shadow);\n    display: grid;\n    gap: 6px;\n    font-family: Inter, system-ui, -apple-system, sans-serif;\n    color: var(--ars-color);\n    transition: all 0.2s ease;\n  }\n  .cpu-details-panel .title {\n    font-size: 9px;\n    font-weight: 800;\n    text-transform: uppercase;\n    color: var(--ars-label);\n    border-bottom: 1px solid var(--ars-border);\n    padding-bottom: 4px;\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    letter-spacing: 0.05em;\n  }\n  .cpu-details-panel .row {\n    display: flex;\n    justify-content: space-between;\n    font-size: 10px;\n    font-weight: 500;\n  }\n  .cpu-details-panel .row-val {\n    font-family: monospace;\n    font-weight: 700;\n  }\n  .cpu-details-panel .row-val.low { color: #10b981; }\n  .cpu-details-panel .row-val.medium { color: #f59e0b; }\n  .cpu-details-panel .row-val.high { color: #ef4444; }\n  \n  .cpu-bar-bg {\n    width: 100%;\n    height: 4px;\n    background: #e2e8f0;\n    border-radius: 2px;\n    overflow: hidden;\n    margin: 2px 0;\n  }\n  .cpu-bar-fill {\n    height: 100%;\n    transition: width 0.2s ease, background-color 0.2s ease;\n  }\n  .cpu-bar-fill.low { background: #10b981; }\n  .cpu-bar-fill.medium { background: #f59e0b; }\n  .cpu-bar-fill.high { background: #ef4444; }\n\n  .sparkline-toggle svg {\n    width: 86px;\n  }\n  .diagnostic-chip .value {\n    text-decoration: none !important;\n  }\n  .diagnostic-chip {\n    min-width: 42px;\n    padding-left: 7px;\n    padding-right: 7px;\n  }\n  .graph-toggle.active,\n  .sparkline-toggle.active,\n  .details-toggle.active,\n  .action-btn.active {\n    box-shadow: inset 0 0 0 1px rgba(37, 99, 235, 0.32);\n  }\n  @media (max-width: 720px) {\n    .toolbar {\n      width: calc(100vw - 32px);\n      align-items: center;\n    }\n    .toolbar-main {\n      max-width: none;\n      flex: 1 1 auto;\n      overflow: visible;\n      padding-bottom: 1px;\n    }\n  }\n  [data-tooltip] {\n    position: relative;\n  }\n  [data-tooltip]::after {\n    content: attr(data-tooltip);\n    position: absolute;\n    left: 50%;\n    bottom: calc(100% + 8px);\n    z-index: 2147483647;\n    width: max-content;\n    max-width: 240px;\n    transform: translateX(-50%) translateY(4px);\n    padding: 6px 10px;\n    border-radius: 8px;\n    background: #0f172a;\n    color: #ffffff;\n    box-shadow: 0 10px 25px rgba(15, 23, 42, 0.12);\n    font: 500 10px/1.35 Inter, system-ui, -apple-system, sans-serif;\n    opacity: 0;\n    pointer-events: none;\n    white-space: normal;\n    transition: opacity 120ms ease, transform 120ms ease;\n  }\n  [data-tooltip]::before {\n    content: \"\";\n    position: absolute;\n    left: 50%;\n    bottom: calc(100% + 3px);\n    z-index: 2147483647;\n    transform: translateX(-50%) translateY(4px);\n    border: 5px solid transparent;\n    border-top-color: #0f172a;\n    opacity: 0;\n    pointer-events: none;\n    transition: opacity 120ms ease, transform 120ms ease;\n  }\n  [data-tooltip]:hover::after,\n  [data-tooltip]:hover::before,\n  [data-tooltip]:focus-within::after,\n  [data-tooltip]:focus-within::before {\n    opacity: 1;\n    transform: translateX(-50%) translateY(0);\n  }\n  .clear-btn, .action-btn {\n    background: var(--ars-chip-bg);\n    border: 1px solid var(--ars-chip-border);\n    border-radius: 8px;\n    padding: 7px 10px;\n    font: inherit;\n    font-weight: 600;\n    color: var(--ars-label);\n    transition: background 0.15s ease, border-color 0.15s ease, color 0.15s ease;\n  }\n  .toolbar-actions .clear-btn,\n  .toolbar-actions .action-btn,\n  .toolbar-actions .details-toggle {\n    display: inline-grid;\n    place-items: center;\n    width: 30px;\n    height: 30px;\n    min-width: 30px;\n    padding: 0;\n    font-size: 13px;\n    line-height: 1;\n  }\n  .toolbar-actions svg {\n    width: 14px;\n    height: 14px;\n    display: block;\n    stroke: currentColor;\n  }\n  .toolbar-actions .details-toggle input {\n    position: absolute;\n    opacity: 0;\n    pointer-events: none;\n  }\n  .clear-btn:hover, .action-btn:hover {\n    background: var(--ars-accent-soft);\n    border-color: rgba(37, 99, 235, 0.22);\n    color: #2563eb;\n  }\n  .clear-btn:active, .action-btn:active {\n    filter: brightness(0.98);\n  }\n  .action-btn.active {\n    border-color: rgba(37, 99, 235, 0.24);\n    color: #2563eb;\n    background: var(--ars-accent-soft);\n  }\n  .status {\n    position: absolute;\n    bottom: calc(100% + 8px);\n    right: 16px;\n    z-index: 2147483647;\n    color: #ffffff;\n    background: linear-gradient(135deg, #2563eb, #0891b2);\n    font-size: 10px;\n    font-weight: 700;\n    padding: 4px 8px;\n    border-radius: 999px;\n    box-shadow: \n      0 1px 3px rgba(0,0,0,0.02),\n      0 8px 20px rgba(37, 99, 235, 0.15);\n    white-space: nowrap;\n    pointer-events: none;\n    animation: floatUp 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n  }\n  @keyframes floatUp {\n    from {\n      opacity: 0;\n      transform: translateY(4px);\n    }\n    to {\n      opacity: 1;\n      transform: translateY(0);\n    }\n  }\n  .inspect-panel {\n    position: fixed;\n    right: 16px;\n    bottom: 72px;\n    z-index: 2147483647;\n    width: min(280px, calc(100vw - 32px));\n    display: flex;\n    flex-direction: column;\n    gap: 7px;\n    padding: 11px;\n    border: 1px solid var(--ars-border);\n    border-top: 3px solid #3b82f6;\n    border-radius: 11px;\n    background: var(--ars-panel-bg);\n    box-shadow: var(--ars-shadow);\n    color: var(--ars-color);\n    font: 500 10px/1.3 Inter, system-ui, -apple-system, sans-serif;\n    pointer-events: auto;\n    backdrop-filter: blur(20px) saturate(1.15);\n    transition: border-top-color 0.2s ease;\n    max-height: calc(100vh - 100px);\n    overflow-y: auto;\n  }\n  .inspect-panel.slow { border-top-color: #ef4444; }\n  .inspect-panel.medium { border-top-color: #f59e0b; }\n  .inspect-panel.fast { border-top-color: #10b981; }\n  .panel-head {\n    display: grid;\n    grid-template-columns: minmax(0, 1fr) auto;\n    align-items: center;\n    gap: 8px;\n    border-bottom: 1px solid var(--ars-border);\n    padding-bottom: 6px;\n  }\n  .panel-head-main {\n    min-width: 0;\n  }\n  .panel-title {\n    font-size: 12px;\n    font-weight: 800;\n    color: var(--ars-color);\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n  .severity {\n    display: inline-flex;\n    width: fit-content;\n    padding: 1px 6px;\n    border-radius: 20px;\n    font-size: 8px;\n    font-weight: 700;\n    text-transform: uppercase;\n    letter-spacing: 0.02em;\n    margin-top: 2px;\n  }\n  .severity.slow {\n    color: #e11d48;\n    background: rgba(225, 29, 72, 0.08);\n    border: 1px solid rgba(225, 29, 72, 0.15);\n  }\n  .severity.medium {\n    color: #d97706;\n    background: rgba(217, 119, 6, 0.08);\n    border: 1px solid rgba(217, 119, 6, 0.15);\n  }\n  .severity.fast {\n    color: #059669;\n    background: rgba(5, 150, 105, 0.08);\n    border: 1px solid rgba(5, 150, 105, 0.15);\n  }\n  .panel-grid {\n    display: grid;\n    grid-template-columns: repeat(2, minmax(0, 1fr));\n    gap: 4px;\n    margin: 2px 0;\n  }\n  .panel-grid .panel-field,\n  .panel-summary-metrics .panel-field {\n    background: var(--ars-card-bg);\n    border: 1px solid var(--ars-border);\n    border-radius: 6px;\n    padding: 5px 4px;\n    text-align: center;\n    display: flex;\n    flex-direction: column;\n    justify-content: center;\n    min-height: 30px;\n    min-width: 0;\n  }\n  .panel-grid .panel-label,\n  .panel-summary-metrics .panel-label {\n    font-size: 8px;\n    font-weight: 700;\n    color: var(--ars-label);\n    text-transform: uppercase;\n    letter-spacing: 0.05em;\n  }\n  .panel-grid .panel-value,\n  .panel-summary-metrics .panel-value {\n    font-size: 10px;\n    font-weight: 700;\n    color: var(--ars-color);\n    margin-top: 1px;\n    min-width: 0;\n    overflow-wrap: anywhere;\n  }\n  .panel-summary {\n    display: grid;\n    gap: 4px;\n    margin: 2px 0;\n  }\n  .panel-summary-metrics {\n    display: grid;\n    grid-template-columns: repeat(3, minmax(0, 1fr));\n    gap: 4px;\n  }\n  .summary-metric,\n  .summary-context {\n    min-width: 0;\n    background: var(--ars-card-bg);\n    border: 1px solid var(--ars-border);\n    border-radius: 6px;\n    padding: 5px 6px;\n  }\n  .summary-metric {\n    display: grid;\n    gap: 1px;\n    text-align: center;\n  }\n  .summary-context {\n    display: flex;\n    align-items: center;\n    gap: 6px;\n    min-height: 24px;\n  }\n  .summary-context .panel-label {\n    flex: 0 0 auto;\n  }\n  .summary-context .panel-value {\n    min-width: 0;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n  .inspect-panel .panel-field:not(.panel-grid .panel-field) {\n    border-top: 1px solid var(--ars-border);\n    padding-top: 6px;\n    display: grid;\n    gap: 2px;\n  }\n  .inspect-panel .panel-label {\n    color: var(--ars-label);\n    font-size: 9px;\n    font-weight: 700;\n    text-transform: uppercase;\n    letter-spacing: 0.05em;\n  }\n  .inspect-panel .panel-value {\n    color: var(--ars-color);\n    font-size: 11px;\n    line-height: 1.35;\n    overflow-wrap: anywhere;\n  }\n  .panel-list {\n    display: grid;\n    gap: 6px;\n    margin-top: 2px;\n  }\n  .rec-card {\n    padding: 6px 10px;\n    border-radius: 6px;\n    border: 1px solid var(--ars-border);\n    border-left: 3px solid #3b82f6;\n    background: var(--ars-card-bg);\n    display: flex;\n    flex-direction: column;\n    gap: 2px;\n    transition: border-color 0.15s ease, background 0.15s ease;\n  }\n  .rec-card:hover {\n    border-color: rgba(15, 23, 42, 0.1);\n  }\n  .rec-card.slow {\n    border-left-color: #ef4444;\n    background: rgba(239, 68, 68, 0.015);\n  }\n  .rec-card.medium {\n    border-left-color: #f59e0b;\n    background: rgba(245, 158, 11, 0.015);\n  }\n  .rec-card.fast {\n    border-left-color: #10b981;\n    background: rgba(16, 185, 129, 0.015);\n  }\n  .rec-category {\n    font-size: 7.5px;\n    font-weight: 800;\n    text-transform: uppercase;\n    letter-spacing: 0.05em;\n  }\n  .rec-card.slow .rec-category { color: #e11d48; }\n  .rec-card.medium .rec-category { color: #d97706; }\n  .rec-card.fast .rec-category { color: #059669; }\n  .rec-action {\n    font-size: 10px;\n    line-height: 1.35;\n    color: var(--ars-color);\n    font-weight: 500;\n    margin: 0;\n  }\n\n  /* Compact product shell inspired by React Scan, using Angular's visual language. */\n  :host {\n    --ars-angular: #f6375b;\n    --ars-angular-soft: rgba(246, 55, 91, 0.14);\n    --ars-bg: rgba(18, 18, 22, 0.96);\n    --ars-panel-bg: rgba(18, 18, 22, 0.98);\n    --ars-card-bg: rgba(255, 255, 255, 0.045);\n    --ars-chip-bg: rgba(255, 255, 255, 0.055);\n    --ars-chip-border: rgba(255, 255, 255, 0.09);\n    --ars-border: rgba(255, 255, 255, 0.11);\n    --ars-color: #f7f7f8;\n    --ars-label: #9898a3;\n    --ars-shadow: 0 20px 55px rgba(0, 0, 0, 0.46), 0 2px 8px rgba(0, 0, 0, 0.3);\n  }\n  :host(:not(.dark)) {\n    --ars-bg: rgba(255, 255, 255, 0.97);\n    --ars-panel-bg: rgba(255, 255, 255, 0.98);\n    --ars-card-bg: #f7f7f9;\n    --ars-chip-bg: #f6f6f8;\n    --ars-chip-border: rgba(20, 20, 25, 0.09);\n    --ars-border: rgba(20, 20, 25, 0.12);\n    --ars-color: #18181c;\n    --ars-label: #71717b;\n    --ars-shadow: 0 20px 55px rgba(20, 20, 25, 0.16), 0 2px 8px rgba(20, 20, 25, 0.08);\n  }\n  .toolbar, :host(.dark) .toolbar {\n    gap: 4px; padding: 5px; border-color: var(--ars-border); border-radius: 10px;\n    background: var(--ars-bg); box-shadow: var(--ars-shadow); color: var(--ars-color);\n  }\n  .toolbar:hover { border-color: rgba(246,55,91,.38); box-shadow: var(--ars-shadow); }\n  .toolbar-switch, :host(.dark) .toolbar-switch {\n    flex-direction: row; gap: 5px; min-height: 30px; padding: 4px 7px;\n    background: var(--ars-angular-soft); box-shadow: inset 0 0 0 1px rgba(246,55,91,.2);\n  }\n  .angular-version-chip, :host(.dark) .angular-version-chip {\n    max-width: 48px; padding: 3px 5px; border: 0; background: transparent;\n    color: #ff8ba1; font-size: 8px;\n  }\n  input:checked + .track { background: var(--ars-angular); }\n  .toolbar-main, .toolbar-extended { gap: 4px; flex-wrap: nowrap; }\n  .metric, :host(.dark) .metric {\n    min-width: 54px; gap: 2px; padding: 5px 7px; border-color: var(--ars-chip-border);\n    border-radius: 7px; background: var(--ars-chip-bg); box-shadow: none;\n  }\n  .metric:hover, :host(.dark) .metric:hover {\n    border-color: rgba(246,55,91,.25); background: rgba(255,255,255,.08); box-shadow: none;\n  }\n  .label { color: var(--ars-label); font-size: 7px; letter-spacing: .08em; }\n  .value { color: var(--ars-color); font-size: 11px; }\n  .toolbar-actions { gap: 3px; border-left-color: var(--ars-border); }\n  .action-btn, .clear-btn, .details-toggle {\n    width: 28px; min-width: 28px; height: 28px; padding: 0; justify-content: center;\n    border-color: transparent; border-radius: 7px; background: transparent; color: #a9a9b2;\n  }\n  .action-btn:hover, .clear-btn:hover, .details-toggle:hover {\n    border-color: rgba(255,255,255,.08); background: rgba(255,255,255,.08); color: #fff;\n  }\n  .details-toggle.active, .action-btn.active {\n    border-color: rgba(246,55,91,.34); background: var(--ars-angular-soft);\n    color: #ff7892; box-shadow: none;\n  }\n  .inspect-panel, .cpu-details-panel, .waterfall-panel, .alerts-panel,\n  .onpush-panel, .zone-pollution-panel, .cd-graph-panel {\n    border-color: var(--ars-border) !important; background: var(--ars-panel-bg) !important;\n    box-shadow: var(--ars-shadow) !important; color: var(--ars-color) !important;\n  }\n  @media (max-width: 720px) {\n    .toolbar { width: auto; max-width: calc(100vw - 16px); right: 8px !important; }\n    .toolbar-main .cpu-interactive { display: none; }\n    .sparkline-toggle { min-width: 72px !important; }\n    .sparkline-toggle svg { width: 64px; }\n  }\n  .toolbar-extended, .toolbar-size-toggle { display: none !important; }\n  .inspect-panel.streamlined {\n    width: min(360px, calc(100vw - 24px)); padding: 0; overflow: hidden;\n    border-radius: 12px; font: 500 11px/1.4 ui-sans-serif, system-ui, sans-serif;\n  }\n  .stream-inspect-head { display:flex; align-items:flex-start; justify-content:space-between; gap:16px; padding:14px 15px 12px; border-bottom:1px solid var(--ars-border); }\n  .stream-eyebrow, .stream-section-label { color:var(--ars-label); font-size:8px; font-weight:800; letter-spacing:.09em; text-transform:uppercase; }\n  .stream-title { margin-top:2px; color:var(--ars-color); font-size:15px; font-weight:750; letter-spacing:-.02em; }\n  .stream-selector { margin-top:1px; color:var(--ars-label); font:500 9px ui-monospace, SFMono-Regular, Menlo, monospace; }\n  .stream-status { padding:4px 7px; border-radius:999px; font-size:8px; font-weight:800; white-space:nowrap; }\n  .stream-status.changed { color:#34d399; background:rgba(52,211,153,.11); }\n  .stream-status.no-change { color:#fbbf24; background:rgba(251,191,36,.11); }\n  .stream-metrics { display:grid; grid-template-columns:repeat(3,1fr); border-bottom:1px solid var(--ars-border); }\n  .stream-metrics > div { display:grid; gap:3px; padding:10px 14px; border-right:1px solid var(--ars-border); }\n  .stream-metrics > div:last-child { border-right:0; }\n  .stream-metrics span, .stream-row > span { color:var(--ars-label); font-size:8px; font-weight:700; text-transform:uppercase; letter-spacing:.05em; }\n  .stream-metrics strong { color:var(--ars-color); font:750 12px ui-monospace, SFMono-Regular, Menlo, monospace; }\n  .stream-row { display:flex; align-items:center; justify-content:space-between; gap:16px; padding:9px 14px; border-bottom:1px solid var(--ars-border); }\n  .stream-row strong { color:var(--ars-color); font:600 9px ui-monospace, SFMono-Regular, Menlo, monospace; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }\n  .stream-changes { display:grid; gap:6px; padding:11px 14px; border-bottom:1px solid var(--ars-border); }\n  .stream-change { display:grid; grid-template-columns:minmax(58px,auto) 1fr auto 1fr; align-items:center; gap:6px; min-width:0; }\n  .stream-change code { color:#ff7892; font:650 9px ui-monospace, SFMono-Regular, Menlo, monospace; }\n  .stream-change span { min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; color:var(--ars-label); font:500 9px ui-monospace, SFMono-Regular, Menlo, monospace; }\n  .stream-change b { color:var(--ars-label); }\n  .stream-change em { grid-column:2/-1; color:#fbbf24; font-size:8px; font-style:normal; }\n  .stream-empty-change { padding:10px 14px; border-bottom:1px solid var(--ars-border); color:var(--ars-label); font-size:9px; }\n  .stream-action { margin:10px 12px; padding:9px 10px; border:1px solid var(--ars-border); border-left:2px solid #f6375b; border-radius:7px; background:var(--ars-card-bg); }\n  .stream-action > span { color:#ff7892; font-size:8px; font-weight:800; letter-spacing:.06em; text-transform:uppercase; }\n  .stream-action.fast { border-left-color:#34d399; }\n  .stream-action.fast > span { color:#34d399; }\n  .stream-action p { margin:3px 0 0; color:var(--ars-color); font-size:10px; line-height:1.45; }\n  .stream-footer { display:flex; align-items:center; justify-content:space-between; gap:12px; padding:9px 12px; border-top:1px solid var(--ars-border); color:var(--ars-label); font-size:9px; }\n  .component-copy-btn { padding:5px 8px; border:1px solid var(--ars-border); border-radius:6px; background:transparent; color:var(--ars-color); font:650 9px inherit; cursor:pointer; }\n  .component-copy-btn:hover { border-color:rgba(246,55,91,.35); background:var(--ars-angular-soft); }\n\n  /* Inspector console: docked to the scanner so hovering never chases a tooltip. */\n  .inspect-panel.inspector-console {\n    padding:0; overflow:hidden; border:1px solid rgba(255,255,255,.12) !important;\n    border-radius:14px; background:#111116 !important;\n    box-shadow:0 28px 80px rgba(0,0,0,.58), 0 0 0 1px rgba(0,0,0,.35) !important;\n    color:#f7f7f8 !important; font:500 11px/1.45 ui-sans-serif,system-ui,-apple-system,sans-serif;\n    transform-origin:bottom right; animation:inspector-enter 140ms cubic-bezier(.2,.8,.2,1);\n  }\n  @keyframes inspector-enter { from { opacity:0; transform:translateY(7px) scale(.985); } to { opacity:1; transform:none; } }\n  .inspector-header { display:flex; align-items:center; justify-content:space-between; gap:16px; min-height:62px; padding:11px 13px; border-bottom:1px solid rgba(255,255,255,.08); background:linear-gradient(180deg,rgba(255,255,255,.035),transparent); }\n  .inspector-identity { display:flex; align-items:center; gap:10px; min-width:0; }\n  .inspector-identity > div { display:grid; min-width:0; }\n  .inspector-identity strong { overflow:hidden; color:#f7f7f8; font-size:13px; font-weight:720; letter-spacing:-.015em; text-overflow:ellipsis; white-space:nowrap; }\n  .inspector-identity span:last-child { overflow:hidden; color:#777782; font:500 9px ui-monospace,SFMono-Regular,Menlo,monospace; text-overflow:ellipsis; white-space:nowrap; }\n  .inspector-status { display:inline-flex; align-items:center; gap:6px; flex:0 0 auto; padding:5px 8px; border:1px solid rgba(255,255,255,.08); border-radius:999px; color:#a4a4ad; background:rgba(255,255,255,.035); font-size:8px; font-weight:700; }\n  .inspector-status i { width:6px; height:6px; border-radius:50%; }\n  .inspector-status.changed i { background:#34d399; box-shadow:0 0 0 3px rgba(52,211,153,.1); }\n  .inspector-status.no-change i { background:#fbbf24; box-shadow:0 0 0 3px rgba(251,191,36,.1); }\n  .inspector-body { display:grid; grid-template-columns:190px minmax(0,1fr); min-height:192px; }\n  .inspector-timing { padding:15px; border-right:1px solid rgba(255,255,255,.08); background:rgba(255,255,255,.018); }\n  .inspector-label { display:block; color:#74747e; font-size:8px; font-weight:750; letter-spacing:.09em; text-transform:uppercase; }\n  .inspector-duration { display:flex; align-items:baseline; gap:5px; margin-top:6px; }\n  .inspector-duration strong { color:#fff; font:650 30px/1 ui-monospace,SFMono-Regular,Menlo,monospace; letter-spacing:-.07em; }\n  .inspector-duration span { color:#777782; font:600 9px ui-monospace,SFMono-Regular,Menlo,monospace; }\n  .inspector-duration-track { height:4px; margin-top:13px; overflow:hidden; border-radius:999px; background:rgba(255,255,255,.07); }\n  .inspector-duration-track i { display:block; height:100%; min-width:2px; border-radius:inherit; background:#34d399; }\n  .inspector-console.medium .inspector-duration-track i { background:#fbbf24; }\n  .inspector-console.slow .inspector-duration-track i { background:#f6375b; }\n  .inspector-threshold { display:flex; justify-content:space-between; margin-top:4px; color:#606069; font:500 7px ui-monospace,SFMono-Regular,Menlo,monospace; }\n  .inspector-mini-stats { display:grid; gap:0; margin-top:14px; border:1px solid rgba(255,255,255,.07); border-radius:8px; overflow:hidden; }\n  .inspector-mini-stats > div { display:flex; align-items:center; justify-content:space-between; gap:8px; padding:6px 8px; border-bottom:1px solid rgba(255,255,255,.06); }\n  .inspector-mini-stats > div:last-child { border:0; }\n  .inspector-mini-stats span { color:#6e6e78; font-size:8px; }\n  .inspector-mini-stats strong { color:#c9c9cf; font:600 8px ui-monospace,SFMono-Regular,Menlo,monospace; }\n  .inspector-evidence { display:grid; align-content:start; min-width:0; }\n  .inspector-block { padding:14px 15px; border-bottom:1px solid rgba(255,255,255,.07); }\n  .inspector-block:last-child { border-bottom:0; }\n  .inspector-cause { display:block; overflow:hidden; margin-top:7px; padding:7px 8px; border:1px solid rgba(246,55,91,.18); border-radius:6px; background:rgba(246,55,91,.07); color:#ff8ba1; font:600 9px ui-monospace,SFMono-Regular,Menlo,monospace; text-overflow:ellipsis; white-space:nowrap; }\n  .inspector-diff-block { display:grid; gap:7px; }\n  .inspector-diff { display:grid; gap:5px; padding-top:2px; }\n  .inspector-diff > code { color:#e7e7ea; font:650 9px ui-monospace,SFMono-Regular,Menlo,monospace; }\n  .inspector-diff > div { display:grid; grid-template-columns:minmax(0,1fr) auto minmax(0,1fr); align-items:center; gap:6px; }\n  .inspector-diff del,.inspector-diff ins { overflow:hidden; padding:5px 6px; border-radius:5px; font:500 8px ui-monospace,SFMono-Regular,Menlo,monospace; text-decoration:none; text-overflow:ellipsis; white-space:nowrap; }\n  .inspector-diff del { color:#a1a1aa; background:rgba(255,255,255,.04); }\n  .inspector-diff ins { color:#b8f7dc; background:rgba(52,211,153,.07); }\n  .inspector-diff > div span { color:#5f5f68; }\n  .inspector-diff em { color:#fbbf24; font-size:8px; font-style:normal; }\n  .inspector-none { margin:7px 0 0; color:#777782; font-size:9px; }\n  .inspector-footer { display:flex; align-items:center; justify-content:space-between; gap:18px; min-height:66px; padding:10px 12px 10px 15px; border-top:1px solid rgba(255,255,255,.08); background:#0e0e12; }\n  .inspector-footer > div { min-width:0; }\n  .inspector-footer > div > span { color:#ff7892; font-size:8px; font-weight:750; letter-spacing:.08em; text-transform:uppercase; }\n  .inspector-footer p { display:-webkit-box; overflow:hidden; margin:2px 0 0; color:#a0a0a8; font-size:9px; line-height:1.35; -webkit-box-orient:vertical; -webkit-line-clamp:2; }\n  .inspector-footer .component-copy-btn { display:inline-flex; align-items:center; gap:6px; flex:0 0 auto; padding:7px 10px; border-color:rgba(255,255,255,.11); border-radius:7px; background:rgba(255,255,255,.045); color:#e7e7ea; font-size:9px; }\n  .inspector-footer .component-copy-btn:hover { border-color:rgba(246,55,91,.35); background:rgba(246,55,91,.1); color:#fff; }\n  @media (max-width:560px) {\n    .inspect-panel.inspector-console { overflow:auto; }\n    .inspector-body { grid-template-columns:1fr; }\n    .inspector-timing { border-right:0; border-bottom:1px solid rgba(255,255,255,.08); }\n    .inspector-mini-stats { grid-template-columns:repeat(3,1fr); }\n    .inspector-mini-stats > div { display:grid; gap:2px; border-right:1px solid rgba(255,255,255,.06); border-bottom:0; }\n  }\n\n  /* Draggable scanner control: one quiet command bar, not a row of cards. */\n  .toolbar, :host(.dark) .toolbar {\n    flex-wrap:nowrap; gap:0; min-height:46px; padding:5px 6px 5px 5px;\n    border:1px solid rgba(255,255,255,.12); border-radius:13px;\n    background:rgba(16,16,20,.97); box-shadow:0 18px 50px rgba(0,0,0,.5),0 0 0 1px rgba(0,0,0,.3);\n    backdrop-filter:blur(20px); cursor:grab;\n  }\n  :host(:not(.dark)) .toolbar {\n    border-color:rgba(20,20,25,.13); background:rgba(255,255,255,.98);\n    box-shadow:0 18px 50px rgba(20,20,25,.18),0 0 0 1px rgba(255,255,255,.8);\n  }\n  .toolbar:hover { border-color:rgba(255,255,255,.18); box-shadow:0 20px 56px rgba(0,0,0,.54); }\n  .toolbar-grip { display:grid; grid-template-columns:repeat(2,2px); grid-auto-rows:2px; gap:3px; padding:8px 7px 8px 5px; opacity:.38; }\n  .toolbar-grip i { width:2px; height:2px; border-radius:50%; background:currentColor; }\n  .scanner-brand { display:flex; align-items:center; gap:8px; padding-right:11px; }\n  .scanner-mark { display:grid; place-items:center; width:27px; height:27px; flex:0 0 27px; clip-path:polygon(50% 0,96% 18%,88% 78%,50% 100%,12% 78%,4% 18%); background:linear-gradient(145deg,#ff5d79,#d80031); color:#fff; font-size:10px; font-weight:800; }\n  .scanner-name { display:grid; color:var(--ars-color); font-size:10px; font-weight:720; line-height:1.15; white-space:nowrap; }\n  .scanner-name small { margin-top:2px; color:var(--ars-label); font:500 7px ui-monospace,SFMono-Regular,Menlo,monospace; }\n  .scanner-power { display:grid; place-items:center; min-width:27px; width:27px; height:27px; margin-right:5px; border:1px solid var(--ars-border); border-radius:8px; background:rgba(255,255,255,.035); }\n  .power-control { position:relative; display:block; width:12px; height:12px; border:1.5px solid #71717b; border-radius:50%; }\n  .power-control::before { content:\"\"; position:absolute; left:50%; top:-3px; width:1.5px; height:6px; transform:translateX(-50%); border-radius:2px; background:#71717b; box-shadow:0 0 0 2px #111116; }\n  .scanner-power input:checked + .power-control { border-color:#34d399; box-shadow:0 0 0 3px rgba(52,211,153,.08); }\n  .scanner-power input:checked + .power-control::before { background:#34d399; }\n  .toolbar-main, .toolbar.compact .toolbar-main {\n    display:flex; align-items:stretch; flex-wrap:nowrap; gap:0; min-width:0; max-width:none;\n    padding:0 4px; border-left:1px solid var(--ars-border); border-right:1px solid var(--ars-border);\n  }\n  .toolbar .metric, .toolbar.compact .metric, .toolbar.expanded .metric, :host(.dark) .toolbar .metric {\n    display:grid; align-content:center; gap:1px; min-width:64px; padding:2px 10px;\n    border:0; border-right:1px solid var(--ars-border); border-radius:0; background:transparent; box-shadow:none;\n  }\n  .toolbar .metric:last-child { border-right:0; }\n  .toolbar .metric:hover, :host(.dark) .toolbar .metric:hover { border-color:var(--ars-border); background:rgba(255,255,255,.025); box-shadow:none; }\n  .toolbar .metric .label { color:var(--ars-label); font-size:6.5px; letter-spacing:.09em; }\n  .toolbar .metric .value { color:var(--ars-color); font-size:10px; font-weight:680; }\n  .toolbar-actions { gap:2px; padding-left:5px; border-left:0; }\n  .toolbar .action-btn, .toolbar .clear-btn, .toolbar .details-toggle {\n    display:grid; place-items:center; width:29px; min-width:29px; height:29px; padding:0;\n    border:1px solid transparent; border-radius:8px; background:transparent; color:#85858f;\n  }\n  .toolbar .action-btn:hover, .toolbar .clear-btn:hover, .toolbar .details-toggle:hover { border-color:var(--ars-border); background:rgba(255,255,255,.055); color:var(--ars-color); }\n  .toolbar .toolbar-picker-toggle { display:flex; width:auto; min-width:auto; gap:6px; padding:0 9px; }\n  .toolbar-picker-toggle > span { font-size:9px; font-weight:650; }\n  .toolbar .toolbar-picker-toggle.active { border-color:rgba(246,55,91,.35); background:rgba(246,55,91,.13); color:#ff7892; box-shadow:none; }\n  .toolbar .action-btn svg, .toolbar .clear-btn svg, .toolbar .details-toggle svg { width:13px; height:13px; }\n  .toolbar.disabled { gap:0; min-height:42px; padding:4px 5px; border-radius:12px; opacity:1; }\n  .toolbar.disabled .scanner-brand { padding-right:8px; }\n  .toolbar.disabled .scanner-name { color:var(--ars-label); }\n  .toolbar.disabled .scanner-power { margin-right:0; }\n  @media (max-width:640px) {\n    .toolbar, :host(.dark) .toolbar { right:8px !important; max-width:calc(100vw - 16px); }\n    .scanner-name { display:none; }\n    .scanner-brand { padding-right:6px; }\n    .toolbar .metric { min-width:52px; padding-inline:7px; }\n    .toolbar .metric:last-child { display:none; }\n    .toolbar-picker-toggle > span { display:none; }\n    .toolbar .toolbar-picker-toggle { width:29px; padding:0; }\n  }\n\n  /* Final low-profile mode: intentionally easy to ignore until needed. */\n  .toolbar, :host(.dark) .toolbar {\n    min-height:30px; padding:2px 3px; gap:0; border-radius:8px;\n    border-color:rgba(255,255,255,.09); background:rgba(15,15,18,.9);\n    box-shadow:0 8px 24px rgba(0,0,0,.28); backdrop-filter:blur(14px);\n  }\n  .toolbar:hover { border-color:rgba(255,255,255,.14); box-shadow:0 10px 28px rgba(0,0,0,.34); }\n  .scanner-power {\n    display:flex; place-items:unset; align-items:center; gap:4px; width:auto; min-width:auto; height:24px;\n    margin:0; padding:0 6px 0 5px; border:0; border-radius:5px; background:transparent;\n  }\n  .power-control, .scanner-power input:checked + .power-control {\n    width:6px; height:6px; border:0; border-radius:50%; background:#71717b; box-shadow:none;\n  }\n  .scanner-power input:checked + .power-control { background:#34d399; }\n  .power-control::before { display:none; }\n  .power-label { color:#85858e; font-size:8px; font-weight:600; }\n  .minimal-version { padding:0 7px 0 2px; color:#686871; font:500 7px ui-monospace,SFMono-Regular,Menlo,monospace; white-space:nowrap; }\n  .toolbar-main, .toolbar.compact .toolbar-main {\n    height:20px; padding:0 2px; border-color:rgba(255,255,255,.07);\n  }\n  .toolbar .metric, .toolbar.compact .metric, .toolbar.expanded .metric, :host(.dark) .toolbar .metric {\n    display:flex; align-items:center; min-width:auto; padding:0 7px; border-color:rgba(255,255,255,.07);\n  }\n  .toolbar .metric .label { display:none; }\n  .toolbar .metric .value { color:#a6a6ae; font-size:8px; font-weight:600; }\n  .toolbar-actions { gap:0; padding-left:2px; }\n  .toolbar .action-btn, .toolbar .clear-btn, .toolbar .details-toggle,\n  .toolbar .toolbar-picker-toggle {\n    display:flex; width:auto; min-width:auto; height:24px; padding:0 7px;\n    border:0; border-radius:5px; background:transparent; color:#777780;\n    font:600 8px ui-sans-serif,system-ui,sans-serif;\n  }\n  .toolbar .action-btn:hover, .toolbar .clear-btn:hover, .toolbar .details-toggle:hover {\n    border:0; background:rgba(255,255,255,.05); color:#c8c8ce;\n  }\n  .toolbar .toolbar-picker-toggle { gap:0; }\n  .toolbar .toolbar-picker-toggle.active {\n    border:0; background:rgba(246,55,91,.1); color:#ff7892; box-shadow:none;\n  }\n  .toolbar.disabled { min-height:28px; padding:2px 3px; border-radius:8px; }\n  .toolbar.disabled .minimal-version { padding-right:3px; }\n  @media (max-width:480px) {\n    .minimal-version { display:none; }\n    .toolbar .metric { padding-inline:5px; }\n    .toolbar .clear-btn { display:none; }\n    .toolbar-picker-toggle > span { display:inline; }\n  }\n\n  /* Compact inspector sizing. */\n  .inspector-header { min-height:48px; padding:8px 10px; }\n  .inspector-identity { gap:0; }\n  .inspector-identity strong { font-size:11px; }\n  .inspector-status { padding:3px 6px; font-size:7px; }\n  .inspector-body { grid-template-columns:124px minmax(0,1fr); min-height:126px; }\n  .inspector-timing { padding:10px; }\n  .inspector-duration { margin-top:3px; }\n  .inspector-duration strong { font-size:20px; }\n  .inspector-duration-track { margin-top:8px; }\n  .inspector-mini-stats { margin-top:8px; }\n  .inspector-mini-stats > div { padding:4px 6px; }\n  .inspector-block { padding:9px 10px; }\n  .inspector-cause { margin-top:5px; padding:5px 6px; }\n  .inspector-diff-block { gap:4px; }\n  .inspector-none { margin-top:5px; }\n  .inspector-footer { min-height:48px; gap:10px; padding:7px 8px 7px 10px; }\n  .inspector-footer p { -webkit-line-clamp:1; }\n  .inspector-footer .component-copy-btn { padding:5px 7px; }\n\n\n`;\n\nexport class AngularRenderScanOverlay {\n  private readonly host = document.createElement(\"angular-render-scan-overlay\");\n  private readonly shadow = this.host.attachShadow({ mode: \"open\" });\n  private readonly canvas = document.createElement(\"canvas\");\n  private readonly context = this.canvas.getContext(\"2d\");\n  private readonly fps = new FpsMeter();\n  private readonly cpu = new CpuMeter(() => this.renderToolbar());\n  private readonly runtimeTelemetry = new RuntimeTelemetry(() =>\n    this.renderToolbar(),\n  );\n  private showCpuDetails = false;\n  private raf = 0;\n  private latestFps = 0;\n  private lastFpsSampleAt = 0;\n  private lastToolbarHtml = \"\";\n  private latestCycle?: AngularRenderCycle;\n  private highlights: Array<{ entry: AngularRenderEntry; expiresAt: number }> =\n    [];\n  private options: AngularRenderScanResolvedOptions;\n  private selectedEntry?: AngularRenderEntry;\n  private hoveredEntry?: AngularRenderEntry;\n  private hoveredRect?: DOMRect;\n  private hoverPointer?: { x: number; y: number };\n  private detailsHoverCursorActive = false;\n  private detailsMode = false;\n  private copyStatus = \"\";\n  private copyStatusTimer = 0;\n  private interactionCapturing = false;\n  private interactionReport?: InteractionReport;\n  private interactionBaseline?: InteractionReport;\n  private interactionComparison?: InteractionComparison;\n  private showDiagnosisPanel = false;\n\n  private toolbarX = 16;\n  private toolbarY = 16;\n  private isDragging = false;\n  private dragStartX = 0;\n  private dragStartY = 0;\n\n  // New feature state\n  private showOnPushPanel = false;\n  private showZonePollutionPanel = false;\n  private showGraphPanel = false;\n  private graphCollapsed = false;\n  private lastTrigger?: CdTriggerAttribution;\n  private zonePollutionListener?: (e: Event) => void;\n\n  private get slowThresholdMs(): number {\n    return this.options.budgets?.warnMs ?? 10;\n  }\n\n  private get fastThresholdMs(): number {\n    return (this.options.budgets?.warnMs ?? 10) / 2;\n  }\n\n  private readonly last30CycleDurations: Array<{\n    duration: number;\n    isSlow: boolean;\n  }> = [];\n  private budgetViolations: BudgetViolation[] = [];\n  private showAlertsPanel = false;\n  private showWaterfallPanel = false;\n  private compactToolbar = true;\n  private keyListener?: (e: KeyboardEvent) => void;\n  private budgetViolationListener?: (e: Event) => void;\n\n  constructor(\n    options: AngularRenderScanResolvedOptions,\n    private readonly onToggle: (enabled: boolean) => void,\n  ) {\n    this.options = options;\n    this.restoreToolbarPosition();\n    this.restoreToolbarCompact();\n    const recorded = getRecording();\n    if (recorded && recorded.length > 0) {\n      this.latestCycle = recorded[recorded.length - 1];\n      this.last30CycleDurations.push(\n        ...recorded.slice(-30).map((c) => ({\n          duration: c.duration,\n          isSlow: c.duration >= this.slowThresholdMs,\n        })),\n      );\n    }\n    this.host.style.pointerEvents = \"none\";\n    this.canvas.style.cssText = [\n      \"position:fixed\",\n      \"inset:0\",\n      \"z-index:2147483646\",\n      \"pointer-events:none\",\n    ].join(\";\");\n    this.shadow.innerHTML = `<style>${TOOLBAR_CSS}</style><div id=\"toolbar-container\"></div>`;\n    document.documentElement.append(this.canvas, this.host);\n    this.resize();\n    window.addEventListener(\"resize\", this.resize);\n    this.loop();\n    this.setupDragListeners();\n    this.updateDarkMode();\n\n    // Setup budget violation event listener\n    this.budgetViolationListener = (e: any) => {\n      if (e.detail) {\n        this.addBudgetViolation(e.detail);\n      }\n    };\n    window.addEventListener(\n      \"angular-render-scan:budget-violation\",\n      this.budgetViolationListener,\n    );\n\n    // Setup Zone pollution event listener\n    this.zonePollutionListener = (_e: Event) => {\n      // Just trigger a toolbar re-render to update the pollution badge count\n      this.renderToolbar();\n    };\n    window.addEventListener(\n      \"angular-render-scan:zone-pollution\",\n      this.zonePollutionListener,\n    );\n\n    // Setup keyboard shortcuts\n    this.keyListener = (e: KeyboardEvent) => {\n      if (e.altKey && e.shiftKey) {\n        const key = e.key.toLowerCase();\n        if (key === \"s\") {\n          e.preventDefault();\n          this.onToggle(!this.options.enabled);\n        } else if (key === \"d\") {\n          e.preventDefault();\n          this.detailsMode = !this.detailsMode;\n          this.hoveredEntry = undefined;\n          this.hoveredRect = undefined;\n          this.hoverPointer = undefined;\n          this.setDetailsHoverCursor(false);\n          if (!this.detailsMode) this.selectedEntry = undefined;\n          this.renderToolbar();\n        } else if (key === \"c\") {\n          e.preventDefault();\n          copyAIPrompt(this.latestFps || this.fps.value).then((copied) => {\n            this.setCopyStatus(copied ? \"Copied\" : \"No render data\");\n          });\n        } else if (key === \"x\") {\n          e.preventDefault();\n          import(\"../../application/stats\").then((m) => {\n            m.clearStats();\n            clearRecording();\n            this.latestCycle = undefined;\n            this.highlights = [];\n            this.selectedEntry = undefined;\n            this.hoveredEntry = undefined;\n            this.hoveredRect = undefined;\n            this.hoverPointer = undefined;\n            this.last30CycleDurations.length = 0;\n            this.showWaterfallPanel = false;\n            this.renderToolbar();\n          });\n        } else if (key === \"t\") {\n          e.preventDefault();\n          this.options.showToolbar = !this.options.showToolbar;\n          this.renderToolbar();\n        }\n      } else if (e.key === \"Escape\") {\n        if (\n          this.selectedEntry ||\n          this.showCpuDetails ||\n          this.showWaterfallPanel ||\n          this.showAlertsPanel ||\n          this.showOnPushPanel ||\n          this.showZonePollutionPanel\n        ) {\n          this.selectedEntry = undefined;\n          this.showCpuDetails = false;\n          this.showWaterfallPanel = false;\n          this.showAlertsPanel = false;\n          this.showOnPushPanel = false;\n          this.showZonePollutionPanel = false;\n          this.renderToolbar();\n        }\n      }\n    };\n    window.addEventListener(\"keydown\", this.keyListener);\n  }\n\n  private setupDragListeners(): void {\n    this.globalMoveListener = (e: MouseEvent) => {\n      if (!this.detailsMode || !this.options.enabled) {\n        this.hoveredEntry = undefined;\n        this.hoveredRect = undefined;\n        this.hoverPointer = undefined;\n        this.setDetailsHoverCursor(false);\n        return;\n      }\n\n      if (this.isOverlayTarget(e.target)) {\n        this.setDetailsHoverCursor(false);\n        return;\n      }\n\n      const previousHoveredId = this.hoveredEntry?.id;\n      const hovered = this.findPickerEntry(e.clientX, e.clientY);\n      this.hoveredEntry = hovered?.entry;\n      this.hoveredRect = hovered?.rect;\n      this.hoverPointer = hovered ? { x: e.clientX, y: e.clientY } : undefined;\n      this.setDetailsHoverCursor(Boolean(hovered));\n      if (previousHoveredId !== this.hoveredEntry?.id) {\n        this.renderToolbar();\n      }\n    };\n\n    this.globalClickListener = (e: MouseEvent) => {\n      if (!this.detailsMode || !this.options.enabled) return;\n      if (this.isOverlayTarget(e.target)) return;\n      this.hoveredEntry = undefined;\n      this.hoveredRect = undefined;\n      this.hoverPointer = undefined;\n      this.setDetailsHoverCursor(false);\n      this.renderToolbar();\n    };\n\n    document.addEventListener(\"mousemove\", this.globalMoveListener, {\n      passive: true,\n      capture: true,\n    });\n    document.addEventListener(\"click\", this.globalClickListener, {\n      capture: true,\n    });\n\n    // Add cleanup to destroy method later...\n\n    const handleDragStart = (e: Event) => {\n      const event = e as MouseEvent | TouchEvent;\n      const target = event.target as HTMLElement;\n      if (\n        this.options.enabled &&\n        (target.closest(\".switch\") ||\n          target.closest(\".clear-btn\") ||\n          target.closest(\".action-btn\"))\n      ) {\n        return; // Don't drag if clicking buttons\n      }\n      const toolbar = this.shadow.querySelector(\".toolbar\");\n      if (target.closest(\".toolbar\")) {\n        this.isDragging = true;\n        const clientX =\n          \"touches\" in event ? event.touches[0].clientX : event.clientX;\n        const clientY =\n          \"touches\" in event ? event.touches[0].clientY : event.clientY;\n        this.dragStartX = clientX - (window.innerWidth - this.toolbarX);\n        this.dragStartY = clientY - (window.innerHeight - this.toolbarY);\n      }\n    };\n\n    const handleDragMove = (e: MouseEvent | TouchEvent) => {\n      if (!this.isDragging) return;\n      e.preventDefault();\n      const clientX = \"touches\" in e ? e.touches[0].clientX : e.clientX;\n      const clientY = \"touches\" in e ? e.touches[0].clientY : e.clientY;\n\n      const toolbar = this.shadow.querySelector(\".toolbar\") as HTMLElement;\n      if (toolbar) {\n        const rect = toolbar.getBoundingClientRect();\n        this.toolbarX = window.innerWidth - (clientX - this.dragStartX);\n        this.toolbarY = window.innerHeight - (clientY - this.dragStartY);\n\n        // Bounds checking\n        this.toolbarX = Math.max(\n          16,\n          Math.min(this.toolbarX, window.innerWidth - rect.width - 16),\n        );\n        this.toolbarY = Math.max(\n          16,\n          Math.min(this.toolbarY, window.innerHeight - rect.height - 16),\n        );\n\n        toolbar.style.right = `${this.toolbarX}px`;\n        toolbar.style.bottom = `${this.toolbarY}px`;\n      }\n    };\n\n    const handleDragEnd = () => {\n      if (this.isDragging) {\n        this.saveToolbarPosition();\n      }\n      this.isDragging = false;\n    };\n\n    this.shadow.addEventListener(\"mousedown\", handleDragStart);\n    window.addEventListener(\"mousemove\", handleDragMove, { passive: false });\n    window.addEventListener(\"mouseup\", handleDragEnd);\n\n    this.shadow.addEventListener(\"touchstart\", handleDragStart, {\n      passive: true,\n    });\n    window.addEventListener(\"touchmove\", handleDragMove, { passive: false });\n    window.addEventListener(\"touchend\", handleDragEnd);\n  }\n\n  updateOptions(options: AngularRenderScanResolvedOptions): void {\n    this.options = options;\n    this.updateDarkMode();\n    this.renderToolbar();\n  }\n\n  showCycle(cycle: AngularRenderCycle): void {\n    this.latestCycle = cycle;\n    if (cycle.trigger) {\n      this.lastTrigger = cycle.trigger;\n    }\n\n    // Track sparkline durations\n    this.last30CycleDurations.push({\n      duration: cycle.duration,\n      isSlow: cycle.duration >= this.slowThresholdMs,\n    });\n    if (this.last30CycleDurations.length > 30) {\n      this.last30CycleDurations.shift();\n    }\n\n    const ttl = this.highlightTtl();\n    if (ttl > 0 && this.options.enabled) {\n      const expiresAt = performance.now() + ttl;\n      this.highlights.push(\n        ...cycle.entries.map((entry) => ({ entry, expiresAt })),\n      );\n    }\n    this.renderToolbar();\n  }\n\n  private globalClickListener?: (e: MouseEvent) => void;\n  private globalMoveListener?: (e: MouseEvent) => void;\n\n  destroy(): void {\n    this.cpu.destroy();\n    this.runtimeTelemetry.destroy();\n    cancelAnimationFrame(this.raf);\n    window.removeEventListener(\"resize\", this.resize);\n    if (this.globalClickListener) {\n      document.removeEventListener(\"click\", this.globalClickListener, {\n        capture: true,\n      });\n    }\n    if (this.globalMoveListener) {\n      document.removeEventListener(\"mousemove\", this.globalMoveListener, {\n        capture: true,\n      });\n    }\n    if (this.keyListener) {\n      window.removeEventListener(\"keydown\", this.keyListener);\n    }\n    if (this.budgetViolationListener) {\n      window.removeEventListener(\n        \"angular-render-scan:budget-violation\",\n        this.budgetViolationListener,\n      );\n    }\n    if (this.zonePollutionListener) {\n      window.removeEventListener(\n        \"angular-render-scan:zone-pollution\",\n        this.zonePollutionListener,\n      );\n    }\n    window.clearTimeout(this.copyStatusTimer);\n    this.setDetailsHoverCursor(false);\n    this.host.remove();\n    this.canvas.remove();\n  }\n\n  private readonly resize = (): void => {\n    const ratio = window.devicePixelRatio || 1;\n    this.canvas.width = Math.floor(window.innerWidth * ratio);\n    this.canvas.height = Math.floor(window.innerHeight * ratio);\n    this.canvas.style.width = `${window.innerWidth}px`;\n    this.canvas.style.height = `${window.innerHeight}px`;\n    this.context?.setTransform(ratio, 0, 0, ratio, 0, 0);\n    this.clampToolbarPosition();\n  };\n\n  private restoreToolbarPosition(): void {\n    try {\n      const raw = globalThis.localStorage?.getItem(TOOLBAR_POSITION_KEY);\n      if (!raw) {\n        return;\n      }\n\n      const parsed = JSON.parse(raw) as { right?: unknown; bottom?: unknown };\n      if (\n        typeof parsed.right === \"number\" &&\n        Number.isFinite(parsed.right) &&\n        typeof parsed.bottom === \"number\" &&\n        Number.isFinite(parsed.bottom)\n      ) {\n        this.toolbarX = parsed.right;\n        this.toolbarY = parsed.bottom;\n      }\n    } catch {\n      // Persisted position is a convenience; invalid storage should not break rendering.\n    }\n  }\n\n  private restoreToolbarCompact(): void {\n    this.compactToolbar = true;\n  }\n\n  private saveToolbarCompact(): void {\n    try {\n      globalThis.localStorage?.setItem(\n        TOOLBAR_COMPACT_KEY,\n        String(this.compactToolbar),\n      );\n    } catch {\n      // Ignore storage failures.\n    }\n  }\n\n  private saveToolbarPosition(): void {\n    try {\n      globalThis.localStorage?.setItem(\n        TOOLBAR_POSITION_KEY,\n        JSON.stringify({ right: this.toolbarX, bottom: this.toolbarY }),\n      );\n    } catch {\n      // Ignore storage failures in restricted host apps.\n    }\n  }\n\n  private clampToolbarPosition(): void {\n    const toolbar = this.shadow.querySelector(\".toolbar\") as HTMLElement | null;\n    const rect = toolbar?.getBoundingClientRect();\n    const width = rect?.width ?? 0;\n    const height = rect?.height ?? 0;\n\n    this.toolbarX = Math.max(\n      16,\n      Math.min(this.toolbarX, Math.max(16, window.innerWidth - width - 16)),\n    );\n    this.toolbarY = Math.max(\n      16,\n      Math.min(this.toolbarY, Math.max(16, window.innerHeight - height - 16)),\n    );\n\n    if (toolbar) {\n      toolbar.style.right = `${this.toolbarX}px`;\n      toolbar.style.bottom = `${this.toolbarY}px`;\n    }\n  }\n\n  private readonly loop = (): void => {\n    this.fps.mark();\n    this.cpu.markFrame();\n    const now = performance.now();\n    if (now - this.lastFpsSampleAt >= 500) {\n      this.latestFps = this.fps.value;\n      this.lastFpsSampleAt = now;\n      this.renderToolbar();\n    }\n    this.paint();\n    this.raf = requestAnimationFrame(this.loop);\n  };\n\n  private paint(): void {\n    if (!this.context) {\n      return;\n    }\n\n    this.context.clearRect(0, 0, window.innerWidth, window.innerHeight);\n    if (!this.options.enabled || this.options.animationSpeed === \"off\") {\n      this.highlights = [];\n      return;\n    }\n\n    const now = performance.now();\n    const activeHighlights = this.getActiveHighlights(now);\n    const labelledIds = this.getLabelledEntryIds(activeHighlights).slice(\n      0,\n      this.options.maxLabelCount,\n    );\n\n    const fadeDuration = this.highlightTtl() || 1;\n    for (const { entry, expiresAt, rect } of activeHighlights) {\n      const alpha = Math.max(\n        0.18,\n        Math.min(1, (expiresAt - now) / fadeDuration),\n      );\n\n      this.drawOutline(rect, alpha, entry);\n\n      if (this.detailsMode) {\n        this.drawDetailsAffordance(rect, entry, alpha);\n      }\n\n      if (labelledIds.includes(entry.id)) {\n        this.drawLabel(entry, rect, alpha, entry.latestDuration);\n      }\n    }\n\n    if (this.detailsMode && this.hoveredEntry && this.hoveredRect) {\n      this.drawHoverTarget(this.hoveredRect, this.hoveredEntry);\n    }\n  }\n\n  private getActiveHighlights(now: number): ActiveHighlight[] {\n    this.highlights = this.highlights.filter(\n      (highlight) =>\n        highlight.expiresAt > now && highlight.entry.element.isConnected,\n    );\n\n    return this.highlights\n      .flatMap((highlight) => {\n        const rect = highlight.entry.element.getBoundingClientRect();\n        if (rect.width <= 0 || rect.height <= 0) {\n          return [];\n        }\n\n        return [{ ...highlight, rect }];\n      })\n      .sort((a, b) => area(b.rect) - area(a.rect));\n  }\n\n  private findClickedEntry(x: number, y: number): ActiveHighlight | undefined {\n    const activeHighlights = this.getActiveHighlights(performance.now());\n    const activeMatch = this.smallestContainingHighlight(\n      activeHighlights,\n      x,\n      y,\n    );\n    if (activeMatch) {\n      return activeMatch;\n    }\n\n    const latestHighlights =\n      this.latestCycle?.entries.flatMap((entry) => {\n        if (!entry.element.isConnected) {\n          return [];\n        }\n        const rect = entry.element.getBoundingClientRect();\n        if (rect.width <= 0 || rect.height <= 0) {\n          return [];\n        }\n        return [{ entry, rect, expiresAt: 0 }];\n      }) ?? [];\n\n    return this.smallestContainingHighlight(latestHighlights, x, y);\n  }\n\n  private findPickerEntry(x: number, y: number): ActiveHighlight | undefined {\n    const hitElement = document.elementFromPoint(x, y);\n    if (!hitElement || this.isOverlayTarget(hitElement)) {\n      return undefined;\n    }\n\n    const matches = getRegisteredComponents()\n      .flatMap((entry) => {\n        if (!entry.element.isConnected || !entry.element.contains(hitElement)) {\n          return [];\n        }\n\n        const rect = entry.element.getBoundingClientRect();\n        if (\n          rect.width <= 0 ||\n          rect.height <= 0 ||\n          x < rect.left ||\n          x > rect.right ||\n          y < rect.top ||\n          y > rect.bottom\n        ) {\n          return [];\n        }\n\n        return [{ entry, rect, expiresAt: 0 }];\n      })\n      .sort((a, b) => area(a.rect) - area(b.rect));\n\n    return matches[0] ?? this.findClickedEntry(x, y);\n  }\n\n  private smallestContainingHighlight(\n    highlights: ActiveHighlight[],\n    x: number,\n    y: number,\n  ): ActiveHighlight | undefined {\n    return highlights\n      .filter(\n        (highlight) =>\n          x >= highlight.rect.left &&\n          x <= highlight.rect.right &&\n          y >= highlight.rect.top &&\n          y <= highlight.rect.bottom,\n      )\n      .sort((a, b) => area(a.rect) - area(b.rect))[0];\n  }\n\n  private highlightTtl(): number {\n    if (this.options.animationSpeed === \"slow\") {\n      return 2400;\n    }\n    if (this.options.animationSpeed === \"fast\") {\n      return 1200;\n    }\n    return 0;\n  }\n\n  private getLabelledEntryIds(highlights: ActiveHighlight[]): string[] {\n    return highlights\n      .slice()\n      .sort((a, b) => b.entry.latestDuration - a.entry.latestDuration)\n      .map((highlight) => highlight.entry.id);\n  }\n\n  private getColorForDuration(\n    duration: number,\n    type: \"stroke\" | \"bg\",\n  ): readonly [number, number, number] {\n    const { theme } = this.options;\n    if (duration >= this.slowThresholdMs)\n      return type === \"bg\" ? theme.labelBackgroundSlow! : theme.slow!;\n    if (duration > this.fastThresholdMs)\n      return type === \"bg\" ? theme.labelBackground! : theme.medium!;\n    return type === \"bg\" ? theme.labelBackground! : theme.fast!;\n  }\n\n  private getStrokeColorForMutation(\n    entry: AngularRenderEntry,\n  ): readonly [number, number, number] {\n    if (entry.element && !entry.element.isConnected) {\n      return this.options.theme.slow; // Red for leaked/disconnected components!\n    }\n    const maxDuration = Math.max(entry.latestDuration, entry.averageDuration);\n    if (maxDuration >= this.slowThresholdMs) {\n      return this.options.theme.slow; // Red for expensive/slow renders!\n    }\n    if (maxDuration > this.fastThresholdMs) {\n      return this.options.theme.medium; // Yellow/Warning for moderately expensive renders!\n    }\n    const type = entry.mutationType || \"none\";\n    if (type === \"none\") {\n      return [34, 197, 94]; // Green for wasted no-ops!\n    }\n    if (type === \"structural\") {\n      return [239, 68, 68]; // Red for structural template/DOM mutations\n    }\n    return [59, 130, 246]; // Blue for text/attribute mutations\n  }\n\n  private drawOutline(\n    rect: DOMRect,\n    alpha: number,\n    entry: AngularRenderEntry,\n  ): void {\n    if (!this.context) return;\n    const ctx = this.context;\n    const strokeColor = this.getStrokeColorForMutation(entry);\n    const r = 3; // corner radius\n\n    ctx.save();\n    ctx.strokeStyle = rgba(strokeColor, Math.min(0.85, alpha));\n    ctx.lineWidth = 1.5;\n    ctx.shadowBlur = 0;\n    ctx.beginPath();\n    ctx.roundRect(rect.left, rect.top, rect.width, rect.height, r);\n    ctx.stroke();\n    ctx.restore();\n  }\n\n  private drawHoverTarget(rect: DOMRect, entry: AngularRenderEntry): void {\n    if (!this.context) return;\n    const ctx = this.context;\n    const color = this.getStrokeColorForMutation(entry);\n    ctx.save();\n    ctx.strokeStyle = rgba(color, 0.9);\n    ctx.lineWidth = 2;\n    ctx.setLineDash([4, 3]);\n    ctx.beginPath();\n    ctx.roundRect(rect.left, rect.top, rect.width, rect.height, 3);\n    ctx.stroke();\n    ctx.restore();\n  }\n\n  private setDetailsHoverCursor(active: boolean): void {\n    if (this.detailsHoverCursorActive === active) {\n      return;\n    }\n\n    this.detailsHoverCursorActive = active;\n    document.body.style.cursor = active ? \"pointer\" : \"\";\n  }\n\n  private closeInteractivePanels(): void {\n    this.selectedEntry = undefined;\n    this.hoveredEntry = undefined;\n    this.hoveredRect = undefined;\n    this.hoverPointer = undefined;\n    this.detailsMode = false;\n    this.showCpuDetails = false;\n    this.showWaterfallPanel = false;\n    this.showAlertsPanel = false;\n    this.showOnPushPanel = false;\n    this.showZonePollutionPanel = false;\n    this.showGraphPanel = false;\n    this.setDetailsHoverCursor(false);\n  }\n\n  private drawDetailsAffordance(\n    rect: DOMRect,\n    entry: AngularRenderEntry,\n    alpha: number,\n  ): void {\n    if (!this.context) return;\n    const ctx = this.context;\n    const color = this.getStrokeColorForMutation(entry);\n    ctx.save();\n    ctx.strokeStyle = rgba(color, Math.min(0.22, alpha * 0.28));\n    ctx.lineWidth = 1;\n    ctx.setLineDash([5, 4]);\n    ctx.beginPath();\n    ctx.roundRect(rect.left - 1, rect.top - 1, rect.width + 2, rect.height + 2, 4);\n    ctx.stroke();\n    ctx.restore();\n  }\n\n  private drawLabel(\n    entry: AngularRenderEntry,\n    rect: DOMRect,\n    alpha: number,\n    _duration: number,\n  ): void {\n    if (!this.context) return;\n    const ctx = this.context;\n\n    const maxDuration = Math.max(entry.latestDuration, entry.averageDuration);\n    const strokeColor = this.getStrokeColorForMutation(entry);\n    const isLeak = entry.element && !entry.element.isConnected;\n\n    ctx.save();\n    ctx.font = \"600 10px ui-sans-serif, system-ui, sans-serif\";\n\n    // Build pill text: \"ComponentName · 12ms · ×4\"\n    const durationText = `${entry.latestDuration.toFixed(1)}ms`;\n    const label = truncateText(\n      ctx,\n      `${entry.name} · ${durationText} · ×${entry.count}`,\n      Math.max(56, Math.min(rect.width - 4, 200)),\n    );\n\n    const textW = ctx.measureText(label).width;\n    const pillW = textW + 14;\n    const pillH = 17;\n    const pillR = 4;\n    const pillX = Math.max(\n      4,\n      Math.min(rect.left + 4, window.innerWidth - pillW - 4),\n    );\n    const pillY = Math.max(4, rect.top + 4);\n\n    // Pill background — use stroke color with opacity\n    const pillAlpha = Math.min(0.92, alpha + 0.15);\n    ctx.fillStyle = isLeak\n      ? `rgba(239,68,68,${pillAlpha})`\n      : rgba(strokeColor, pillAlpha);\n\n    ctx.beginPath();\n    ctx.roundRect(pillX, pillY, pillW, pillH, pillR);\n    ctx.fill();\n\n    // Pill text — white\n    ctx.fillStyle = `rgba(255,255,255,${Math.min(1, alpha + 0.3)})`;\n    ctx.fillText(label, pillX + 7, pillY + pillH - 4, pillW - 10);\n    ctx.restore();\n  }\n\n  private renderToolbar(): void {\n    const container = this.shadow.getElementById(\"toolbar-container\");\n    if (!container) {\n      return;\n    }\n\n    if (!this.options.showToolbar) {\n      this.replaceToolbarHtml(container, \"\");\n      return;\n    }\n\n    const cycle = this.latestCycle;\n    const displayedFps = this.latestFps || this.fps.value;\n    const compactToolbar = this.compactToolbar || !this.options.enabled;\n    const cpuVal = this.cpu.value;\n    const cpuClass = cpuVal > 50 ? \"cpu-high\" : cpuVal > 20 ? \"cpu-medium\" : \"\";\n\n    const wasted = getWastedStats();\n    const detached = getDetachedComponents();\n    const onPushCandidates = getOnPushCandidates();\n    const pollutionEvents = getZonePollutionEvents();\n\n    // Generate timeline sparkline SVG\n    let sparklineSvg = \"\";\n    if (this.last30CycleDurations.length > 0) {\n      const maxDuration = Math.max(\n        ...this.last30CycleDurations.map((d) => d.duration),\n        1,\n      );\n      const bars = this.last30CycleDurations\n        .map((d, index) => {\n          const height = Math.max(\n            2,\n            Math.round((d.duration / maxDuration) * 16),\n          );\n          const y = 16 - height;\n          const x = index * 3;\n          const color =\n            d.duration >= this.slowThresholdMs\n              ? \"#ef4444\"\n              : d.duration > this.fastThresholdMs\n                ? \"#f59e0b\"\n                : \"#3b82f6\";\n          return `<rect x=\"${x}\" y=\"${y}\" width=\"2\" height=\"${height}\" fill=\"${color}\" rx=\"0.5\" />`;\n        })\n        .join(\"\");\n      sparklineSvg = `\n        <span class=\"metric sparkline-toggle ${this.showWaterfallPanel ? \"active\" : \"\"}\" style=\"min-width: 104px; cursor: pointer;\" data-tooltip=\"Render timeline sparkline (last 30 cycles). Click to toggle CD waterfall view.\">\n          <span class=\"label\">Timeline</span>\n          <svg width=\"90\" height=\"16\" style=\"display: block; margin-top: 2px;\">${bars}</svg>\n        </span>\n      `;\n    } else {\n      sparklineSvg = `<span class=\"metric\"><span class=\"label\">Timeline</span><span class=\"value\">-</span></span>`;\n    }\n\n    // Disconnected hosts are a lead for heap analysis, not proof of a leak.\n    const detachedChip =\n      detached.length > 0\n        ? `<span class=\"metric diagnostic-chip detached-toggle\" style=\"cursor: pointer;\" data-tooltip=\"${detached.length} component host element(s) were disconnected when sampled. This does not prove memory retention.\">\n          <span class=\"label\" style=\"color: #f59e0b;\">Detached</span>\n          <span class=\"value\" style=\"color: #f59e0b; font-weight: bold;\">${detached.length}</span>\n        </span>`\n        : \"\";\n\n    // Alerts metric chip\n    const hasError = this.budgetViolations.some(\n      (v) => v.type === \"error\" || v.type === \"render-rate\",\n    );\n    const alertsChip =\n      this.budgetViolations.length > 0\n        ? `<span class=\"metric diagnostic-chip alerts-toggle ${this.showAlertsPanel ? \"active\" : \"\"}\" style=\"cursor: pointer; position: relative;\" data-tooltip=\"Performance Budget Violations: detected ${this.budgetViolations.length} violations. Click to toggle alerts feed.\">\n          <span class=\"label\" style=\"color: ${hasError ? \"#ef4444\" : \"#f59e0b\"}; font-weight: bold;\">Alerts</span>\n          <span class=\"value\" style=\"color: ${hasError ? \"#ef4444\" : \"#f59e0b\"}; font-weight: bold;\">\n            ${this.budgetViolations.length}\n          </span>\n        </span>`\n        : \"\";\n\n    // CD Trigger badge\n    const triggerBadge = this.lastTrigger\n      ? this.triggerBadgeHtml(this.lastTrigger)\n      : \"\";\n\n    // OnPush candidates chip\n    const onPushChip =\n      onPushCandidates.length > 0\n        ? `<span class=\"metric diagnostic-chip onpush-toggle\" style=\"cursor: pointer;\" data-tooltip=\"OnPush experiments: ${onPushCandidates.length} component(s) had a high no-mutation check share. Verify with a before/after capture.\">\n          <span class=\"label\" style=\"color: #7c3aed;\">OnPush</span>\n          <span class=\"value\" style=\"color: #7c3aed; font-weight: bold;\">${onPushCandidates.length}</span>\n        </span>`\n        : \"\";\n\n    // Zone pollution chip\n    const pollutionChip =\n      pollutionEvents.length > 0\n        ? `<span class=\"metric diagnostic-chip pollution-toggle\" style=\"cursor: pointer;\" data-tooltip=\"Zone Pollution: ${pollutionEvents.length} CD cycles were triggered by async operations with no user interaction. Click to inspect.\">\n          <span class=\"label\" style=\"color: #f59e0b;\">Zone</span>\n          <span class=\"value\" style=\"color: #f59e0b; font-weight: bold;\">${pollutionEvents.length}</span>\n        </span>`\n        : \"\";\n\n    const cycleWasteText = cycle?.wastedCdStats ? ` (${cycle.wastedCdStats.wasteScore}% waste)` : '';\n\n    const htmlChanged = this.replaceToolbarHtml(\n      container,\n      `\n      ${this.options.enabled ? this.streamlinedInspectPanelHtml() : \"\"}\n      ${this.options.enabled ? this.diagnosisPanelHtml() : \"\"}\n      <div class=\"toolbar ${this.options.enabled ? (compactToolbar ? \"compact\" : \"expanded\") : \"disabled\"}\" style=\"right: ${this.toolbarX}px; bottom: ${this.toolbarY}px;\">\n        <label class=\"switch scanner-power\" data-tooltip=\"${this.options.enabled ? \"Pause render scanning\" : \"Resume render scanning\"}\">\n          <input type=\"checkbox\" ${this.options.enabled ? \"checked\" : \"\"} aria-label=\"Angular Render Scan enabled\" />\n          <span class=\"power-control\" aria-hidden=\"true\"></span>\n          <span class=\"power-label\">${this.options.enabled ? \"On\" : \"Off\"}</span>\n        </label>\n        ${this.options.enabled ? `\n        <div class=\"toolbar-main\">\n          ${this.metric(\"Cycle\", cycle ? `${cycle.duration.toFixed(1)}ms` : \"-\")}\n        </div>\n        ${compactToolbar ? \"\" : `\n        <div class=\"toolbar-extended\">\n          ${this.metric(\"Last cycle\", cycle ? `${cycle.duration.toFixed(1)}ms${cycleWasteText}` : \"-\")}\n          ${this.metric(\"Slowest\", cycle?.slowest ? cycle.slowest.name : \"-\", \"\", \"slowest-metric\")}\n          ${triggerBadge}\n          ${detachedChip}\n          ${alertsChip}\n          ${onPushChip}\n          ${pollutionChip}\n          ${this.metric(\"Context FPS\", this.options.showFPS ? String(displayedFps) : \"-\", this.getFpsClass(displayedFps))}\n        </div>\n        `}\n        <span class=\"toolbar-actions\">\n          <button class=\"action-btn interaction-capture-btn ${this.interactionCapturing ? \"active\" : \"\"}\" aria-pressed=\"${this.interactionCapturing}\" data-tooltip=\"${this.interactionCapturing ? \"Finish and rank this interaction\" : \"Start a named interaction capture\"}\">${this.interactionCapturing ? \"Finish\" : \"Capture\"}</button>\n          <button class=\"clear-btn\" aria-label=\"Clear stats\" data-tooltip=\"Clear current render stats.\">Reset</button>\n          <button class=\"action-btn details-toggle toolbar-picker-toggle ${this.detailsMode ? \"active\" : \"\"}\" aria-pressed=\"${this.detailsMode}\" aria-label=\"Enable component details panel\" data-tooltip=\"Use the picker to inspect a component on hover. Clicks continue to the app.\">\n            <span>Inspect</span>\n          </button>\n        </span>\n        ` : \"\"}\n        ${this.copyStatus ? `<span class=\"status\" aria-live=\"polite\">${escapeHtml(this.copyStatus)}</span>` : \"\"}\n      </div>\n    `,\n    );\n\n    if (!htmlChanged) {\n      return;\n    }\n\n    const toolbarEl = container.querySelector(\".toolbar\");\n\n    toolbarEl?.querySelector(\"input\")?.addEventListener(\n      \"change\",\n      (event) => {\n        const enabled = (event.target as HTMLInputElement).checked;\n        if (!enabled) {\n          this.closeInteractivePanels();\n        }\n        this.onToggle(enabled);\n      },\n      { once: true },\n    );\n\n    toolbarEl?.querySelector(\".cpu-interactive\")?.addEventListener(\n      \"click\",\n      () => {\n        this.showCpuDetails = !this.showCpuDetails;\n        this.renderToolbar();\n      },\n      { once: true },\n    );\n\n    toolbarEl?.querySelector(\".toolbar-size-toggle\")?.addEventListener(\n      \"click\",\n      () => {\n        this.compactToolbar = !this.compactToolbar;\n        this.closeInteractivePanels();\n        this.showWaterfallPanel = false;\n        this.showAlertsPanel = false;\n        this.showOnPushPanel = false;\n        this.showZonePollutionPanel = false;\n        this.showGraphPanel = false;\n        this.graphCollapsed = false;\n        this.saveToolbarCompact();\n        this.renderToolbar();\n        this.clampToolbarPosition();\n        this.saveToolbarPosition();\n      },\n      { once: true },\n    );\n\n    toolbarEl?.querySelector(\".toolbar-picker-toggle\")?.addEventListener(\n      \"click\",\n      () => {\n        this.detailsMode = !this.detailsMode;\n        this.selectedEntry = undefined;\n        this.hoveredEntry = undefined;\n        this.hoveredRect = undefined;\n        this.hoverPointer = undefined;\n        this.setDetailsHoverCursor(false);\n        this.renderToolbar();\n      },\n      { once: true },\n    );\n\n    toolbarEl?.querySelector(\".sparkline-toggle\")?.addEventListener(\n      \"click\",\n      () => {\n        this.showWaterfallPanel = !this.showWaterfallPanel;\n        this.renderToolbar();\n      },\n      { once: true },\n    );\n\n    toolbarEl?.querySelector(\".alerts-toggle\")?.addEventListener(\n      \"click\",\n      () => {\n        this.showAlertsPanel = !this.showAlertsPanel;\n        this.renderToolbar();\n      },\n      { once: true },\n    );\n\n    toolbarEl?.querySelector(\".detached-toggle\")?.addEventListener(\n      \"click\",\n      () => {\n        this.detailsMode = true;\n        if (detached.length > 0) {\n          this.selectedEntry = detached[0];\n        }\n        this.renderToolbar();\n      },\n      { once: true },\n    );\n\n    toolbarEl?.querySelector(\".interaction-capture-btn\")?.addEventListener(\n      \"click\",\n      () => {\n        if (!this.interactionCapturing) {\n          const name = window.prompt(\"Name the interaction to measure\", \"Primary interaction\")?.trim();\n          if (!name) return;\n          beginInteraction(name);\n          this.interactionCapturing = true;\n          this.interactionComparison = undefined;\n          this.showDiagnosisPanel = false;\n          this.setCopyStatus(\"Capture started\");\n        } else {\n          this.interactionReport = endInteraction();\n          this.interactionCapturing = false;\n          this.showDiagnosisPanel = true;\n          if (this.interactionBaseline) {\n            this.interactionComparison = compareInteractionReports(this.interactionBaseline, this.interactionReport);\n          }\n          this.renderToolbar();\n        }\n      },\n      { once: true },\n    );\n\n    container.querySelector(\".diagnosis-close-btn\")?.addEventListener(\"click\", () => { this.showDiagnosisPanel = false; this.renderToolbar(); }, { once: true });\n    container.querySelector(\".diagnosis-baseline-btn\")?.addEventListener(\"click\", () => {\n      if (!this.interactionReport) return;\n      this.interactionBaseline = this.interactionReport;\n      setInteractionBaseline(this.interactionReport);\n      this.interactionComparison = undefined;\n      this.setCopyStatus(\"Baseline saved\");\n      this.renderToolbar();\n    }, { once: true });\n    container.querySelector(\".diagnosis-copy-btn\")?.addEventListener(\"click\", async () => {\n      if (!this.interactionReport) return;\n      const copied = await navigator.clipboard.writeText(formatInteractionReportMarkdown(this.interactionReport)).then(() => true, () => false);\n      this.setCopyStatus(copied ? \"Report copied\" : \"Copy failed\");\n    }, { once: true });\n    container.querySelector(\".diagnosis-html-btn\")?.addEventListener(\"click\", () => {\n      if (!this.interactionReport) return;\n      const blob = new Blob([formatInteractionReportHtml(this.interactionReport)], { type: \"text/html\" });\n      const url = URL.createObjectURL(blob);\n      const anchor = document.createElement(\"a\");\n      anchor.href = url;\n      anchor.download = `angular-render-scan-${this.interactionReport.name.toLowerCase().replace(/[^a-z0-9]+/g, \"-\")}.html`;\n      anchor.click();\n      URL.revokeObjectURL(url);\n      this.setCopyStatus(\"HTML report exported\");\n    }, { once: true });\n\n    toolbarEl?.querySelector(\".clear-btn\")?.addEventListener(\n      \"click\",\n      () => {\n        import(\"../../application/stats\").then((m) => {\n          m.clearStats();\n          clearRecording();\n          this.latestCycle = undefined;\n          this.highlights = [];\n          this.selectedEntry = undefined;\n          this.hoveredEntry = undefined;\n          this.hoveredRect = undefined;\n          this.hoverPointer = undefined;\n          this.last30CycleDurations.length = 0;\n          this.showWaterfallPanel = false;\n          this.showCpuDetails = false;\n          this.showAlertsPanel = false;\n          this.budgetViolations = [];\n          this.renderToolbar();\n        });\n      },\n      { once: true },\n    );\n\n    toolbarEl?.querySelector(\".copy-prompt-btn\")?.addEventListener(\n      \"click\",\n      async () => {\n        const copied = await copyAIPrompt(this.latestFps || this.fps.value);\n        this.setCopyStatus(\n          copied\n            ? \"Copied\"\n            : this.latestCycle\n              ? \"Copy failed\"\n              : \"No render data\",\n        );\n      },\n      { once: true },\n    );\n\n    toolbarEl?.querySelector(\".export-btn\")?.addEventListener(\n      \"click\",\n      () => {\n        const data = getSessionData();\n        const blob = new Blob([JSON.stringify(data, null, 2)], {\n          type: \"application/json\",\n        });\n        const url = URL.createObjectURL(blob);\n        const a = document.createElement(\"a\");\n        a.href = url;\n        a.download = `angular-render-scan-session-${Date.now()}.json`;\n        a.click();\n        URL.revokeObjectURL(url);\n        this.setCopyStatus(\"Exported JSON\");\n      },\n      { once: true },\n    );\n\n    container.querySelector(\".waterfall-close-btn\")?.addEventListener(\n      \"click\",\n      () => {\n        this.showWaterfallPanel = false;\n        this.renderToolbar();\n      },\n      { once: true },\n    );\n\n    container.querySelector(\".component-copy-btn\")?.addEventListener(\n      \"click\",\n      async () => {\n        const entry = this.currentDetailsEntry();\n        if (!entry) return;\n        const copied = await this.copyComponentPrompt(entry, this.latestFps || this.fps.value);\n        this.setCopyStatus(copied ? \"Copied evidence\" : \"Copy failed\");\n      },\n      { once: true },\n    );\n\n    container.querySelector(\".open-editor-btn\")?.addEventListener(\n      \"click\",\n      async () => {\n        const entry = this.currentDetailsEntry();\n        if (!entry) {\n          return;\n        }\n        const query = `class ${entry.name}`;\n\n        try {\n          await navigator.clipboard.writeText(query);\n        } catch (err) {\n          console.warn(\"[angular-render-scan] Clipboard copy failed\", err);\n        }\n\n        const openInEditorUrl = this.getEditorUrl(entry);\n        if (openInEditorUrl) {\n          const w = window.open(openInEditorUrl, \"_blank\");\n          if (w) {\n            setTimeout(() => w.close(), 500);\n          }\n        }\n\n        this.setCopyStatus(\"Copied class search query!\");\n      },\n      { once: true },\n    );\n\n    container.querySelector(\".alerts-close-btn\")?.addEventListener(\n      \"click\",\n      () => {\n        this.showAlertsPanel = false;\n        this.renderToolbar();\n      },\n      { once: true },\n    );\n\n    container.querySelector(\".clear-alerts-btn\")?.addEventListener(\n      \"click\",\n      () => {\n        this.budgetViolations = [];\n        this.showAlertsPanel = false;\n        this.renderToolbar();\n      },\n      { once: true },\n    );\n\n    toolbarEl?.querySelector(\".onpush-toggle\")?.addEventListener(\n      \"click\",\n      () => {\n        this.showOnPushPanel = !this.showOnPushPanel;\n        this.renderToolbar();\n      },\n      { once: true },\n    );\n\n    toolbarEl?.querySelector(\".pollution-toggle\")?.addEventListener(\n      \"click\",\n      () => {\n        this.showZonePollutionPanel = !this.showZonePollutionPanel;\n        this.renderToolbar();\n      },\n      { once: true },\n    );\n\n    container.querySelector(\".onpush-close-btn\")?.addEventListener(\n      \"click\",\n      () => {\n        this.showOnPushPanel = false;\n        this.renderToolbar();\n      },\n      { once: true },\n    );\n\n    container.querySelector(\".zone-pollution-close-btn\")?.addEventListener(\n      \"click\",\n      () => {\n        this.showZonePollutionPanel = false;\n        this.renderToolbar();\n      },\n      { once: true },\n    );\n\n    toolbarEl?.querySelector(\".graph-toggle\")?.addEventListener(\n      \"click\",\n      () => {\n        this.showGraphPanel = !this.showGraphPanel;\n        this.graphCollapsed = false;\n        this.renderToolbar();\n      },\n      { once: true },\n    );\n\n    container.querySelector(\".graph-close-btn\")?.addEventListener(\n      \"click\",\n      () => {\n        this.showGraphPanel = false;\n        this.renderToolbar();\n      },\n      { once: true },\n    );\n\n    container.querySelector(\".graph-collapse-btn\")?.addEventListener(\n      \"click\",\n      () => {\n        this.graphCollapsed = !this.graphCollapsed;\n        this.renderToolbar();\n      },\n      { once: true },\n    );\n\n    container.querySelector(\".graph-refresh-btn\")?.addEventListener(\n      \"click\",\n      () => {\n        this.renderToolbar();\n      },\n      { once: true },\n    );\n  }\n\n  private metric(\n    label: string,\n    value: string,\n    extraClass = \"\",\n    containerClass = \"\",\n  ): string {\n    const cls = containerClass ? `metric ${containerClass}` : \"metric\";\n    const escapedValue = escapeHtml(value);\n    return `<span class=\"${cls}\"><span class=\"label\">${label}</span><span class=\"value ${extraClass}\" title=\"${escapedValue}\">${escapedValue}</span></span>`;\n  }\n\n  private getFpsClass(fps: number): string {\n    if (!this.options.showFPS || fps === 0) {\n      return \"\";\n    }\n    return fps < 50 ? \"fps-drop\" : \"\";\n  }\n\n  private angularVersionFromDom(): string | undefined {\n    return (\n      document.querySelector(\"[ng-version]\")?.getAttribute(\"ng-version\") ||\n      undefined\n    );\n  }\n\n  private replaceToolbarHtml(toolbar: HTMLElement, html: string): boolean {\n    if (this.lastToolbarHtml === html) {\n      return false;\n    }\n\n    this.lastToolbarHtml = html;\n    toolbar.innerHTML = html;\n    return true;\n  }\n\n  private streamlinedInspectPanelHtml(): string {\n    const entry = this.currentDetailsEntry();\n    if (!entry) return \"\";\n\n    const cause = entry.renderCause\n      ? `${entry.renderCause.trigger}${entry.renderCause.source ? ` → ${entry.renderCause.source}` : \"\"}`\n      : entry.reason ?? \"unknown\";\n    const changedInputs = entry.changedInputs?.slice(0, 3) ?? [];\n    const recommendation = this.recommendationsFor(entry)[0];\n    const didChangeDom = entry.mutationType !== \"none\";\n    const status = didChangeDom ? \"Changed\" : \"No visual change\";\n    const statusClass = didChangeDom ? \"changed\" : \"no-change\";\n    const durationRatio = Math.min(100, (entry.latestDuration / Math.max(this.slowThresholdMs, 0.1)) * 100);\n    const durationClass = entry.latestDuration >= this.slowThresholdMs\n      ? \"slow\"\n      : entry.latestDuration >= this.fastThresholdMs ? \"medium\" : \"fast\";\n\n    return `\n      <section class=\"inspect-panel inspector-console ${durationClass}\"\n        style=\"${this.inspectPanelPositionStyle(entry)}\" aria-label=\"${escapeHtml(entry.name)} render details\">\n        <header class=\"inspector-header\">\n          <div class=\"inspector-identity\">\n            <div>\n              <strong>${escapeHtml(entry.name)}</strong>\n              <span>${escapeHtml(entry.selector ?? entry.element.tagName.toLowerCase())}</span>\n            </div>\n          </div>\n          <span class=\"inspector-status ${statusClass}\"><i></i>${status}</span>\n        </header>\n        <div class=\"inspector-body\">\n          <section class=\"inspector-timing\">\n            <span class=\"inspector-label\">Last component check</span>\n            <div class=\"inspector-duration\"><strong>${entry.latestDuration.toFixed(2)}</strong><span>ms</span></div>\n            <div class=\"inspector-duration-track\"><i style=\"width:${durationRatio.toFixed(0)}%\"></i></div>\n            <div class=\"inspector-threshold\"><span>0</span><span>slow at ${this.slowThresholdMs.toFixed(0)} ms</span></div>\n            <div class=\"inspector-mini-stats\">\n              <div><span>Checks</span><strong>${entry.count}</strong></div>\n              <div><span>Strategy</span><strong>${escapeHtml(entry.cdStrategy ?? \"unknown\")}</strong></div>\n            </div>\n          </section>\n          <section class=\"inspector-evidence\">\n            <div class=\"inspector-block\">\n              <span class=\"inspector-label\">Why Angular checked it</span>\n              <code class=\"inspector-cause\">${escapeHtml(cause)}</code>\n            </div>\n            <div class=\"inspector-block inspector-diff-block\">\n              <span class=\"inspector-label\">Input evidence</span>\n              ${changedInputs.length ? changedInputs.map(input => `<div class=\"inspector-diff\">\n                <code>${escapeHtml(input.name)}</code>\n                <div><del>${escapeHtml(input.previous)}</del><span>→</span><ins>${escapeHtml(input.current)}</ins></div>\n                ${input.isReferentiallyUnstable ? '<em>Equal value, different reference</em>' : ''}\n              </div>`).join(\"\") : '<p class=\"inspector-none\">No input change captured in this check.</p>'}\n            </div>\n          </section>\n        </div>\n        <footer class=\"inspector-footer\">\n          <div><span>${recommendation ? escapeHtml(recommendation.category) : \"Assessment\"}</span><p>${recommendation ? escapeHtml(recommendation.action) : \"This sample is within the configured performance budget.\"}</p></div>\n          <button class=\"component-copy-btn\" type=\"button\" aria-label=\"Copy component evidence\"><span>⧉</span> Copy</button>\n        </footer>\n      </section>`;\n  }\n\n  private inspectPanelHtml(): string {\n    const entry = this.currentDetailsEntry();\n    if (!entry) {\n      return \"\";\n    }\n\n    const recentCycles = getRecording()\n      .filter((cycle) =>\n        cycle.entries.some((candidate) => candidate.id === entry.id),\n      )\n      .slice(-5)\n      .map(\n        (cycle) =>\n          `#${cycle.id} ${cycle.entries.find((candidate) => candidate.id === entry.id)?.latestDuration.toFixed(1)}ms`,\n      );\n    const severity = this.severityFor(entry);\n    const cost = this.costFor(entry);\n    const recommendations = this.recommendationsFor(entry);\n    const triggerReason = entry.reason ?? \"unknown\";\n    const mutationType = entry.mutationType ?? \"none\";\n    const cdStrategy = entry.cdStrategy ?? \"unknown\";\n    const angular = getAngularDebugSummary(entry.element);\n    const frameworkLabel = angular.version\n      ? `${cdStrategy} · Angular ${angular.version}`\n      : cdStrategy;\n    const panelStyle = this.inspectPanelPositionStyle(entry);\n    const changedInputs = entry.changedInputs?.length\n      ? entry.changedInputs\n          .map((input) => {\n            const unstableTag = input.isReferentiallyUnstable\n              ? ` <span style=\"color: #f59e0b; font-size: 8px; background: rgba(245,158,11,0.1); border: 1px solid rgba(245,158,11,0.3); padding: 1px 4px; border-radius: 3px;\">UNSTABLE REF</span>`\n              : \"\";\n            return `${escapeHtml(input.name)}: ${escapeHtml(input.previous)} → ${escapeHtml(input.current)}${unstableTag}`;\n          })\n          .join(\"<br>\")\n      : \"-\";\n\n    const openInEditorUrl = this.getEditorUrl(entry);\n    const openLinkHtml = openInEditorUrl\n      ? `<button class=\"open-editor-btn\" style=\"background: none; border: none; padding: 0; cursor: pointer; color: #2563eb; text-decoration: none; font-size: 10px; font-weight: 700; margin-top: 4px; display: inline-flex; align-items: center; gap: 4px; font-family: inherit;\">\n           <span>Open in Editor</span>\n           <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"></path><polyline points=\"15 3 21 3 21 9\"></polyline><line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"></line></svg>\n         </button>`\n      : \"\";\n\n    const leakWarningHtml = !entry.element?.isConnected\n      ? `<div style=\"background: rgba(245, 158, 11, 0.12); border: 1px solid #f59e0b; border-radius: 6px; padding: 6px 10px; color: #b45309; font-weight: bold; font-size: 10px; margin-bottom: 8px; display: flex; align-items: center; gap: 6px;\">\n          <span style=\"font-size: 14px;\">⚠️</span>\n          <span>Detached host observed. Confirm retention with a heap snapshot before calling this a memory leak.</span>\n         </div>`\n      : \"\";\n\n    return `\n      <section class=\"inspect-panel ${severity.kind}\" style=\"${panelStyle}\" aria-label=\"Component recommendation panel\">\n        ${leakWarningHtml}\n        <div class=\"panel-head\">\n          <div class=\"panel-head-main\">\n            <div class=\"panel-title\">${escapeHtml(entry.name)}</div>\n            ${openLinkHtml}\n            <div><span class=\"severity ${severity.kind}\">${escapeHtml(severity.label)}</span></div>\n          </div>\n        </div>\n        <div class=\"panel-summary\">\n          <div class=\"panel-summary-metrics\">\n            ${this.panelField(\"Last\", `${entry.latestDuration.toFixed(1)}ms`)}\n            ${this.panelField(\"Avg\", `${entry.averageDuration.toFixed(1)}ms`)}\n            ${this.panelField(\"Renders\", `${entry.count} · #${entry.latestCycleId}`)}\n          </div>\n          <div class=\"summary-context\">\n            <span class=\"panel-label\">CD</span>\n            <span class=\"panel-value\">${escapeHtml(frameworkLabel)} · ${escapeHtml(triggerReason)}</span>\n          </div>\n          <div class=\"summary-context\">\n            <span class=\"panel-label\">DOM</span>\n            <span class=\"panel-value\" style=\"text-transform: capitalize;\">${escapeHtml(mutationType)}</span>\n          </div>\n        </div>\n        ${\n          entry.renderCause\n            ? `\n        <div class=\"panel-field\" style=\"grid-column: span 2; background: rgba(59, 130, 246, 0.05); border: 1px dashed rgba(59, 130, 246, 0.2); border-radius: 6px; padding: 6px 10px; margin-bottom: 6px;\">\n          <span class=\"panel-label\" style=\"color: #3b82f6; font-weight: 600;\">Render Cause Chain</span>\n          <span class=\"panel-value\" style=\"font-family: inherit; font-size: 9px; line-height: 1.4; margin-top: 2px;\">\n            <strong>${escapeHtml(entry.renderCause.trigger.replace(\"signal:\", \"signal \").replace(\"zone:\", \"zone \"))}</strong>${entry.renderCause.source ? ` &rarr; ${escapeHtml(entry.renderCause.source)}` : \"\"}\n            ${\n              entry.renderCause.stack && entry.renderCause.stack.length > 0\n                ? `<div style=\"margin-top: 4px; padding-left: 10px;\">\n                    ${entry.renderCause.stack.slice(0, 3).map(f => `<div style=\"font-family: monospace; font-size: 8px; color: #94a3b8; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;\">└─ ${escapeHtml(f)}</div>`).join(\"\")}\n                   </div>`\n                : \"\"\n            }\n          </span>\n        </div>`\n            : \"\"\n        }\n        ${\n          entry.isOnPushCandidate\n            ? `\n        <div style=\"background: rgba(124, 58, 237, 0.08); border: 1px solid rgba(124, 58, 237, 0.2); border-radius: 6px; padding: 6px 10px; font-size: 9px; line-height: 1.4; color: #7c3aed; display: flex; gap: 6px; align-items: flex-start; margin-bottom: 2px;\">\n          <span style=\"font-size: 12px; flex-shrink: 0;\">⚡</span>\n          <span><strong>OnPush candidate:</strong> This component has ${entry.wastedPercentage}% wasted renders and uses Default CD. Adding <code style=\"background: rgba(0,0,0,0.06); padding: 1px 3px; border-radius: 2px;\">ChangeDetectionStrategy.OnPush</code> could eliminate most unnecessary checks.</span>\n        </div>`\n            : \"\"\n        }\n        <div class=\"panel-field\">\n          <span class=\"panel-label\">Skipped renders (no-ops)</span>\n          <span class=\"panel-value\">\n            ${entry.wastedChecks} of ${entry.count} were skipped — ${entry.wastedPercentage}% waste\n            <div style=\"width: 100%; height: 3px; background: #e2e8f0; border-radius: 2px; overflow: hidden; margin-top: 3px;\">\n              <div style=\"width: ${entry.wastedPercentage}%; height: 100%; background: ${entry.wastedPercentage > 60 ? \"#ef4444\" : \"#10b981\"};\"></div>\n            </div>\n          </span>\n        </div>\n        <div class=\"panel-field\">\n          <span class=\"panel-label\">Render cost estimate</span>\n          <span class=\"panel-value\">${escapeHtml(cost)}</span>\n        </div>\n        ${this.runtimeSignalsHtml(entry)}\n        ${\n          entry.changedInputs?.length\n            ? `<div class=\"panel-field\">\n          <span class=\"panel-label\">Inputs that changed</span>\n          <span class=\"panel-value\">${changedInputs}</span>\n        </div>`\n            : \"\"\n        }\n        ${\n          recentCycles.length > 0\n            ? `<div class=\"panel-field\">\n          <span class=\"panel-label\">Last 5 cycle durations</span>\n          <span class=\"panel-value\">${escapeHtml(recentCycles.join(\" · \"))}</span>\n        </div>`\n            : \"\"\n        }\n        ${\n          recommendations.length > 0\n            ? `<div class=\"panel-field\">\n          <span class=\"panel-label\">Recommendations</span>\n          <span class=\"panel-list\">\n            ${recommendations\n              .map(\n                (rec) => `\n              <div class=\"rec-card ${rec.severity}\">\n                <span class=\"rec-category\">${escapeHtml(rec.category)}</span>\n                <p class=\"rec-action\">${escapeHtml(rec.action)}</p>\n              </div>\n            `,\n              )\n              .join(\"\")}\n          </span>\n        </div>`\n            : \"\"\n        }\n      </section>\n    `;\n  }\n\n  private currentDetailsEntry(): AngularRenderEntry | undefined {\n    return this.hoveredEntry ?? this.selectedEntry;\n  }\n\n  private inspectPanelPositionStyle(_entry: AngularRenderEntry): string {\n    const margin = 12;\n    const width = Math.min(360, window.innerWidth - margin * 2);\n    const right = Math.max(margin, this.toolbarX);\n    const bottom = Math.max(margin, this.toolbarY + 58);\n    return `right:${Math.round(right)}px; bottom:${Math.round(bottom)}px; left:auto; top:auto; width:${Math.round(width)}px; max-width:calc(100vw - ${margin * 2}px); max-height:calc(100vh - ${Math.round(bottom + margin)}px);`;\n  }\n\n  private panelField(label: string, value: string): string {\n    return `<span class=\"panel-field\"><span class=\"panel-label\">${escapeHtml(label)}</span><span class=\"panel-value\">${escapeHtml(value)}</span></span>`;\n  }\n\n  private panelFieldHtml(label: string, value: string): string {\n    return `<span class=\"panel-field\"><span class=\"panel-label\">${escapeHtml(label)}</span><span class=\"panel-value\">${value}</span></span>`;\n  }\n\n  private runtimeSignalsHtml(entry: AngularRenderEntry): string {\n    const angular = getAngularDebugSummary(entry.element);\n    const runtime = this.runtimeTelemetry.getSummary(\n      this.latestComponentWindowStart(entry),\n    );\n    const signalFields: string[] = [];\n    const hierarchy = this.componentHierarchy(entry, angular);\n    const browserWarnings = this.browserSignalSummary(runtime);\n\n    if (hierarchy) {\n      signalFields.push(this.panelFieldHtml(\"Hierarchy\", hierarchy));\n    }\n    if (angular.directiveNames.length > 0) {\n      signalFields.push(\n        this.panelFieldHtml(\n          \"Directives\",\n          escapeHtml(angular.directiveNames.slice(0, 3).join(\", \")),\n        ),\n      );\n    }\n    if (angular.listenerNames.length > 0) {\n      signalFields.push(\n        this.panelFieldHtml(\n          \"Listeners\",\n          escapeHtml(angular.listenerNames.slice(0, 4).join(\", \")),\n        ),\n      );\n    }\n    if (browserWarnings) {\n      signalFields.push(this.panelFieldHtml(\"Browser\", browserWarnings));\n    }\n\n    if (signalFields.length === 0) {\n      return \"\";\n    }\n\n    return `<div class=\"panel-field\">\n      <span class=\"panel-label\">Runtime signals</span>\n      <span class=\"panel-list\">${signalFields.join(\"\")}</span>\n    </div>`;\n  }\n\n  private componentHierarchy(\n    entry: AngularRenderEntry,\n    angular: ReturnType<typeof getAngularDebugSummary>,\n  ): string {\n    const names = [\n      angular.rootName,\n      angular.ownerName,\n      angular.componentName || entry.name,\n    ]\n      .filter((name): name is string => Boolean(name))\n      .filter((name, index, list) => list.indexOf(name) === index);\n\n    return names.length > 1 ? escapeHtml(names.join(\" -> \")) : \"\";\n  }\n\n  private browserSignalSummary(\n    runtime: ReturnType<RuntimeTelemetry[\"getSummary\"]>,\n  ): string {\n    const warnings: string[] = [];\n    if (runtime.longTasks.count > 0) {\n      warnings.push(`${runtime.longTasks.maxDuration}ms long task`);\n    }\n    if (runtime.interaction && runtime.interaction.duration >= 100) {\n      warnings.push(`${runtime.interaction.duration}ms ${runtime.interaction.name}`);\n    }\n    if (runtime.layoutShift.score >= 0.01) {\n      warnings.push(`${runtime.layoutShift.score} layout shift`);\n    }\n    if (runtime.resources.slowCount > 0) {\n      warnings.push(`${runtime.resources.slowCount} slow resource(s)`);\n    }\n\n    return warnings.length ? escapeHtml(warnings.slice(0, 3).join(\" · \")) : \"\";\n  }\n\n  private latestComponentWindowStart(entry: AngularRenderEntry): number {\n    const matchingCycle = getRecording()\n      .slice()\n      .reverse()\n      .find((cycle) =>\n        cycle.entries.some((candidate) => candidate.id === entry.id),\n      );\n\n    return matchingCycle?.startedAt ?? Math.max(0, performance.now() - 2000);\n  }\n\n  private cpuDetailsHtml(): string {\n    if (!this.showCpuDetails) {\n      return \"\";\n    }\n    const details = this.cpu.getDetails();\n    const fillClass =\n      details.percentage > 50\n        ? \"high\"\n        : details.percentage > 20\n          ? \"medium\"\n          : \"low\";\n\n    return `\n      <div class=\"cpu-details-panel\" style=\"right: ${this.toolbarX + 120}px; bottom: ${this.toolbarY + 60}px;\" aria-label=\"CPU details breakdown\">\n        <div class=\"title\">\n          <span>CPU Usage</span>\n          <span style=\"font-size: 8px; font-weight: normal; color: #94a3b8;\">Main Thread</span>\n        </div>\n        <div class=\"cpu-bar-bg\">\n          <div class=\"cpu-bar-fill ${fillClass}\" style=\"width: ${details.percentage}%;\"></div>\n        </div>\n        <div class=\"row\">\n          <span style=\"color: #64748b;\">Busy Rate</span>\n          <span class=\"row-val ${fillClass}\">${details.percentage}%</span>\n        </div>\n        <div class=\"row\">\n          <span style=\"color: #64748b;\">Blocking Tasks</span>\n          <span class=\"row-val\">${details.longTaskCount}</span>\n        </div>\n        <div class=\"row\">\n          <span style=\"color: #64748b;\">Max Task Delay</span>\n          <span class=\"row-val\">${details.maxDuration}ms</span>\n        </div>\n        <div class=\"row\" data-tooltip=\"Total time tasks spent blocking the main thread beyond a 50ms budget in the last 2s\">\n          <span style=\"color: #64748b;\">Total Block Time</span>\n          <span class=\"row-val\">${details.totalBlockingTime}ms</span>\n        </div>\n      </div>\n    `;\n  }\n\n  private setCopyStatus(status: string): void {\n    this.copyStatus = status;\n    window.clearTimeout(this.copyStatusTimer);\n    this.renderToolbar();\n    this.copyStatusTimer = window.setTimeout(() => {\n      this.copyStatus = \"\";\n      this.renderToolbar();\n    }, 1800);\n  }\n\n  private isOverlayTarget(target: EventTarget | null): boolean {\n    return target instanceof Node && this.host.contains(target);\n  }\n\n  private severityFor(entry: AngularRenderEntry): {\n    kind: \"slow\" | \"medium\" | \"fast\";\n    label: string;\n  } {\n    if (entry.element && !entry.element.isConnected) {\n      return { kind: \"medium\", label: \"Detached\" };\n    }\n    const maxDuration = Math.max(entry.latestDuration, entry.averageDuration);\n    if (maxDuration >= this.slowThresholdMs) {\n      return { kind: \"slow\", label: \"Slow issue\" };\n    }\n    if (maxDuration > this.fastThresholdMs) {\n      return { kind: \"medium\", label: \"Watch\" };\n    }\n    return { kind: \"fast\", label: \"Healthy\" };\n  }\n\n  private costFor(entry: AngularRenderEntry): string {\n    const cycleDuration = this.latestCycle?.duration ?? 0;\n    const cycleShare =\n      cycleDuration > 0\n        ? Math.round((entry.latestDuration / cycleDuration) * 100)\n        : 0;\n    const totalCost = entry.averageDuration * entry.count;\n    return `${entry.latestDuration.toFixed(1)}ms latest, ${cycleShare}% of latest cycle, about ${totalCost.toFixed(1)}ms observed across ${entry.count} renders`;\n  }\n\n  private recommendationsFor(\n    entry: AngularRenderEntry,\n  ): Array<{\n    category: string;\n    action: string;\n    severity: \"slow\" | \"medium\" | \"fast\";\n  }> {\n    const recommendations: Array<{\n      category: string;\n      action: string;\n      severity: \"slow\" | \"medium\" | \"fast\";\n    }> = [];\n\n    if (entry.element && !entry.element.isConnected) {\n      recommendations.push({\n        category: \"Detached host\",\n        action: `The host is disconnected. Use a heap snapshot or allocation profile to verify the component is retained before changing cleanup logic.`,\n        severity: \"medium\",\n      });\n    }\n\n    const maxDuration = Math.max(entry.latestDuration, entry.averageDuration);\n    if (maxDuration >= this.slowThresholdMs) {\n      recommendations.push({\n        category: \"Threshold Spike\",\n        action: `Exceeded the slow threshold (max: ${maxDuration.toFixed(1)}ms). Audit template calculations, expensive computed values, or blocking synchronous logic in this component.`,\n        severity: \"slow\",\n      });\n    }\n    if (entry.reason === \"input\" || entry.changedInputs?.length) {\n      const inputNames =\n        entry.changedInputs?.map((input) => input.name).join(\", \") ||\n        \"unspecified inputs\";\n      recommendations.push({\n        category: \"Unstable Inputs\",\n        action: `Re-rendered due to input changes: [${inputNames}]. Check if parent passes new object/array/function references during change detection; use stable signals or memoization.`,\n        severity: \"medium\",\n      });\n    }\n    if (entry.count > 5) {\n      recommendations.push({\n        category: \"Render Fatigue\",\n        action: `Checked ${entry.count} times. Audit local subscriptions, interval timers, or event bindings triggering frequent CD ticks.`,\n        severity: \"medium\",\n      });\n    }\n    // OnPush candidate recommendation\n    if (entry.isOnPushCandidate) {\n      recommendations.push({\n        category: \"OnPush Candidate\",\n        action: `${entry.wastedPercentage}% of this component's renders are no-ops. Add ChangeDetectionStrategy.OnPush to prevent unnecessary checks triggered by parent CD cycles.`,\n        severity: \"medium\",\n      });\n    }\n\n    // Referential instability recommendation\n    const unstableInputs =\n      entry.changedInputs?.filter((i) => i.isReferentiallyUnstable) ?? [];\n    if (unstableInputs.length > 0) {\n      recommendations.push({\n        category: \"Referential Instability\",\n        action: `Input(s) [${unstableInputs.map((i) => i.name).join(\", \")}] received new object references with the same value. Use stable factories, pure pipes, or signals to avoid reference churn that bypasses OnPush.`,\n        severity: \"medium\",\n      });\n    }\n\n    return recommendations;\n  }\n\n  private async copyComponentPrompt(\n    entry: AngularRenderEntry,\n    fps?: number,\n  ): Promise<boolean> {\n    if (typeof navigator === \"undefined\" || !navigator.clipboard?.writeText) {\n      return false;\n    }\n\n    try {\n      await navigator.clipboard.writeText(this.componentPrompt(entry, fps));\n      return true;\n    } catch {\n      return false;\n    }\n  }\n\n  private componentPrompt(entry: AngularRenderEntry, fps?: number): string {\n    const recentCycles = getRecording()\n      .filter((cycle) =>\n        cycle.entries.some((candidate) => candidate.id === entry.id),\n      )\n      .slice(-8)\n      .map((cycle) => {\n        const match = cycle.entries.find(\n          (candidate) => candidate.id === entry.id,\n        );\n        return `- **Cycle #${cycle.id}**: Component rendered in \\`${match?.latestDuration.toFixed(1)}ms\\`, total cycle time \\`${cycle.duration.toFixed(1)}ms\\`, total rendered components: \\`${cycle.renderedCount}\\``;\n      });\n    const changedInputs = entry.changedInputs?.length\n      ? entry.changedInputs\n          .map(\n            (input) =>\n              `- \\`${input.name}\\`: \\`${input.previous}\\` -> \\`${input.current}\\``,\n          )\n          .join(\"\\n\")\n      : \"- none captured\";\n    const runtimeSignals = this.runtimeSignalPromptLines(entry);\n\n    return [\n      \"# ⚡️ Component Performance Optimization Request (via angular-render-scan)\",\n      \"I need help fixing one slow/error Angular component found by angular-render-scan. This prompt is scoped to only this component and its local evidence.\",\n      \"\",\n      \"---\",\n      \"\",\n      \"## 📊 Telemetry Diagnostics\",\n      \"Below is the diagnostic telemetry data captured for this component:\",\n      `* **Component Class:** \\`${entry.name}\\``,\n      `* **Selector:** \\`${entry.selector ?? \"-\"}\\``,\n      `* **Performance Severity:** **${this.severityFor(entry).label}**`,\n      `* **Trigger / Reason for Render:** \\`${entry.reason ?? \"unknown\"}\\``,\n      `* **Latest render duration:** \\`${entry.latestDuration.toFixed(1)}ms\\``,\n      `* **Average render duration:** \\`${entry.averageDuration.toFixed(1)}ms\\``,\n      `* **Total captured renders:** ${entry.count}`,\n      `* **Configured Thresholds:** Fast <= \\`${this.fastThresholdMs.toFixed(1)}ms\\` | Slow >= \\`${this.slowThresholdMs.toFixed(1)}ms\\``,\n      `* **Estimated cost:** ${this.costFor(entry)}`,\n      typeof fps === \"number\" && Number.isFinite(fps)\n        ? `* **FPS during performance spike:** \\`${fps} FPS\\``\n        : \"\",\n      \"\",\n      \"---\",\n      \"\",\n      \"## 📈 Input Mutations & Changed Properties\",\n      \"The scanner detected the following property/input changes triggering change detection:\",\n      \"Changed inputs:\",\n      changedInputs,\n      \"\",\n      \"Recent cycles for this component:\",\n      ...(recentCycles.length > 0 ? recentCycles : [\"- none captured\"]),\n      \"\",\n      ...(runtimeSignals.length > 0\n        ? [\n            \"---\",\n            \"\",\n            \"## Runtime signals near this render\",\n            ...runtimeSignals,\n          ]\n        : []),\n      \"\",\n      \"---\",\n      \"\",\n      \"## 🧠 Component-local recommendations from the scanner:\",\n      \"The scanner automatically analyzed this component and surfaced the following optimization recommendations:\",\n      ...this.recommendationsFor(entry).map(\n        (rec) => `- **[${rec.category}]** ${rec.action}`,\n      ),\n      \"\",\n      \"---\",\n      \"\",\n      \"## 🛠️ Requested Refactoring Instructions\",\n      \"You are a senior Angular performance engineer. Please suggest concrete optimization and refactoring steps for this component. Your goal is to drastically reduce its rendering cost and avoid redundant change detection cycles.\",\n      \"Focus on the following modern Angular practices:\",\n      \"1. **OnPush Change Detection Strategy:** Implement OnPush change detection to stop automatic parent-to-child render propagation.\",\n      \"2. **Angular Signals Migration:** Convert class inputs (`@Input`), output emitters (`@Output`), and component states to reactive signals and derived `computed()` selectors.\",\n      \"3. **Optimizing Templates:** Ensure templates do not execute expensive helper methods or getters by moving them to computed signals or component lifecycle caching.\",\n      \"4. **Stable Object/Array References:** Avoid instantiating array or object literals inside templates or parent component templates that feed into this component's inputs.\",\n      \"5. **Proper List Tracking:** Leverage optimized track expressions in `@for` control flow blocks.\",\n      \"\",\n      \"Please return highly descriptive explanations along with complete TypeScript and HTML code blocks illustrating the **Before (Current)** and **After (Optimized)** states of the component. Make all refactored code clean, robust, and ready for production!\",\n    ]\n      .filter(Boolean)\n      .join(\"\\n\");\n  }\n\n  private runtimeSignalPromptLines(entry: AngularRenderEntry): string[] {\n    const angular = getAngularDebugSummary(entry.element);\n    const runtime = this.runtimeTelemetry.getSummary(\n      this.latestComponentWindowStart(entry),\n    );\n    const lines: string[] = [];\n\n    if (angular.listenerNames.length > 0) {\n      lines.push(\n        `- Angular listeners on element: ${angular.listenerNames.join(\", \")}`,\n      );\n    }\n    if (angular.directiveNames.length > 0) {\n      lines.push(\n        `- Angular directives on element: ${angular.directiveNames.join(\", \")}`,\n      );\n    }\n    if (runtime.longTasks.count > 0) {\n      lines.push(\n        `- Long task overlap: ${runtime.longTasks.count} task(s), max ${runtime.longTasks.maxDuration}ms, total blocking ${runtime.longTasks.totalBlockingTime}ms.`,\n      );\n    }\n    if (runtime.interaction) {\n      lines.push(\n        `- Slow interaction near render: ${runtime.interaction.name} took ${runtime.interaction.duration}ms with ${runtime.interaction.inputDelay}ms input delay.`,\n      );\n    }\n    if (runtime.layoutShift.count > 0) {\n      lines.push(\n        `- Layout shift near render: ${runtime.layoutShift.score} across ${runtime.layoutShift.count} shift(s).`,\n      );\n    }\n    if (runtime.resources.slowCount > 0) {\n      lines.push(\n        `- Resource activity near render: ${runtime.resources.slowCount} slow request(s), max ${runtime.resources.maxDuration}ms${runtime.resources.slowestName ? ` (${runtime.resources.slowestName})` : \"\"}.`,\n      );\n    }\n\n    return lines;\n  }\n\n  private getEditorUrl(entry: AngularRenderEntry): string {\n    const protocol = this.options.editorProtocol || \"vscode\";\n    const query = encodeURIComponent(`class ${entry.name}`);\n    if (protocol === \"vscode\") {\n      return `vscode://vscode.code-search/search?query=${query}`;\n    }\n    if (protocol === \"cursor\") {\n      return `cursor://vscode.code-search/search?query=${query}`;\n    }\n    if (protocol === \"webstorm\") {\n      return `webstorm://search?query=${query}`;\n    }\n    return `${protocol}://search?query=${query}`;\n  }\n\n  private triggerBadgeHtml(trigger: CdTriggerAttribution): string {\n    const isUserInteraction = trigger.isUserInteraction;\n    const isPollution = trigger.isZonePollution;\n    const color = isPollution\n      ? \"#f59e0b\"\n      : isUserInteraction\n        ? \"#10b981\"\n        : \"#94a3b8\";\n    const icon = isPollution ? \"⚠\" : isUserInteraction ? \"●\" : \"○\";\n    const label = trigger.source\n      .replace(\"zone:\", \"\")\n      .replace(\"manual:\", \"\")\n      .replace(\"signal:\", \"signal\")\n      .replace(\"router:\", \"nav\");\n    const tooltip = `Last CD trigger: ${trigger.source}${trigger.detail ? ` (${trigger.detail})` : \"\"}${isPollution ? \" — Zone pollution suspected\" : \"\"}`;\n    return `\n      <span class=\"metric\" data-tooltip=\"${escapeHtml(tooltip)}\" style=\"min-width: 64px;\">\n        <span class=\"label\">CD trigger</span>\n        <span class=\"value\" style=\"color: ${color}; font-size: 10px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 80px; display: block;\">\n          ${icon} ${escapeHtml(label)}\n        </span>\n      </span>\n    `;\n  }\n\n  private diagnosisPanelHtml(): string {\n    const report = this.interactionReport;\n    if (!this.showDiagnosisPanel || !report) return \"\";\n    const comparison = this.interactionComparison;\n    const outcomeColor = comparison?.outcome === \"regressed\" ? \"#ef4444\" : comparison?.outcome === \"improved\" ? \"#10b981\" : \"#64748b\";\n    const comparisonHtml = comparison\n      ? `<div style=\"padding:8px;border:1px solid ${outcomeColor};border-radius:7px;background:var(--ars-card-bg)\">\n          <div style=\"font-size:10px;font-weight:850;color:${outcomeColor};text-transform:uppercase\">Candidate ${comparison.outcome}</div>\n          <div style=\"font-size:9px;color:var(--ars-label);margin-top:3px\">Total cycle time ${comparison.deltas.totalCycleDuration.absolute > 0 ? \"+\" : \"\"}${comparison.deltas.totalCycleDuration.absolute}ms · Max cycle ${comparison.deltas.maxCycleDuration.absolute > 0 ? \"+\" : \"\"}${comparison.deltas.maxCycleDuration.absolute}ms · No-mutation share ${comparison.deltas.wastedPercentage.absolute > 0 ? \"+\" : \"\"}${comparison.deltas.wastedPercentage.absolute}pt</div>\n          ${comparison.regressions.length ? `<div style=\"font-size:9px;color:#ef4444;margin-top:4px\">${escapeHtml(comparison.regressions.join(\" \"))}</div>` : \"\"}\n        </div>`\n      : \"\";\n    const findingRows = report.findings.slice(0, 5).map((item, index) => `\n      <div style=\"padding:8px;border:1px solid var(--ars-border);border-radius:7px;background:var(--ars-card-bg)\">\n        <div style=\"display:flex;gap:6px;align-items:flex-start\"><span style=\"font-size:9px;font-weight:850;color:#2563eb\">${index + 1}</span><div style=\"min-width:0\"><div style=\"font-size:10px;font-weight:800;color:var(--ars-color)\">${escapeHtml(item.title)}</div><div style=\"font-size:9px;color:var(--ars-label);line-height:1.4;margin-top:2px\">${escapeHtml(item.summary)}</div></div></div>\n        <div style=\"font-size:9px;color:var(--ars-color);line-height:1.35;margin-top:5px\"><strong>Next:</strong> ${escapeHtml(item.action)}</div>\n      </div>`).join(\"\");\n    return `\n      <section class=\"diagnosis-panel\" aria-label=\"Interaction diagnosis\" style=\"position:fixed;right:${this.toolbarX}px;bottom:${this.toolbarY + 56}px;width:min(360px,calc(100vw - 24px));max-height:min(560px,calc(100vh - 90px));overflow:auto;background:var(--ars-panel-bg);border:1px solid var(--ars-border);border-top:3px solid #2563eb;border-radius:12px;padding:10px;box-shadow:var(--ars-shadow);pointer-events:auto;z-index:2147483647;box-sizing:border-box\">\n        <header style=\"display:flex;justify-content:space-between;gap:8px;align-items:flex-start;border-bottom:1px solid var(--ars-border);padding-bottom:8px;margin-bottom:8px\">\n          <div><div style=\"font-size:12px;font-weight:850;color:var(--ars-color)\">${escapeHtml(report.name)}</div><div style=\"font-size:9px;color:var(--ars-label)\">${report.metrics.cycleCount} cycles · ${report.metrics.totalCycleDuration}ms total · ${report.metrics.wastedPercentage}% no-mutation</div></div>\n          <button class=\"diagnosis-close-btn\" aria-label=\"Close diagnosis\" style=\"border:0;background:none;color:var(--ars-label);font-size:16px;cursor:pointer\">×</button>\n        </header>\n        ${comparisonHtml}\n        <div style=\"display:flex;flex-direction:column;gap:6px;margin-top:${comparisonHtml ? 8 : 0}px\">${findingRows || `<div style=\"padding:14px;text-align:center;color:var(--ars-label);font-size:10px\">No actionable finding in this capture.</div>`}</div>\n        <footer style=\"display:flex;gap:6px;flex-wrap:wrap;border-top:1px solid var(--ars-border);padding-top:8px;margin-top:8px\">\n          <button class=\"diagnosis-baseline-btn action-btn\">Use as baseline</button>\n          <button class=\"diagnosis-copy-btn action-btn\">Copy Markdown</button>\n          <button class=\"diagnosis-html-btn action-btn\">Export HTML</button>\n        </footer>\n        <div style=\"font-size:8px;color:var(--ars-label);margin-top:7px;line-height:1.35\">CPU/FPS are context only. Detached hosts and OnPush opportunities require verification.</div>\n      </section>`;\n  }\n\n  private onPushPanelHtml(candidates: OnPushCandidate[]): string {\n    if (!this.showOnPushPanel || candidates.length === 0) return \"\";\n    const panelRight = this.toolbarX;\n    const items = candidates\n      .slice(0, 10)\n      .map((c) => {\n        const confColor =\n          c.confidence === \"high\"\n            ? \"#10b981\"\n            : c.confidence === \"medium\"\n              ? \"#f59e0b\"\n              : \"#94a3b8\";\n        const confLabel =\n          c.confidence === \"high\"\n            ? \"HIGH\"\n            : c.confidence === \"medium\"\n              ? \"MED\"\n              : \"LOW\";\n        return `\n        <div style=\"padding: 8px; border-radius: 6px; border: 1px solid var(--ars-border); background: var(--ars-card-bg); display: flex; flex-direction: column; gap: 4px; font-size: 10px;\">\n          <div style=\"display: flex; justify-content: space-between; align-items: flex-start; gap: 8px;\">\n            <div>\n              <div style=\"font-weight: 800; color: var(--ars-color); overflow-wrap: anywhere;\">${escapeHtml(c.name)}</div>\n              <div style=\"font-size: 8px; color: var(--ars-label); margin-top: 1px;\">${escapeHtml(c.selector)}</div>\n            </div>\n            <span style=\"font-size: 8px; font-weight: 800; color: ${confColor}; border: 1px solid ${confColor}; padding: 1px 4px; border-radius: 4px; white-space: nowrap; flex-shrink: 0;\">${confLabel}</span>\n          </div>\n          <div style=\"display: flex; gap: 6px; align-items: center;\">\n            <span style=\"color: #f59e0b; font-weight: 700;\">${c.opportunityPercentage}% no-mutation share</span>\n          </div>\n          <div style=\"color: var(--ars-label); line-height: 1.35; font-size: 9px;\">${escapeHtml(c.reason)}</div>\n          <div style=\"width: 100%; height: 3px; background: #e2e8f0; border-radius: 2px; overflow: hidden; margin-top: 2px;\">\n            <div style=\"width: ${c.wastedPercentage}%; height: 100%; background: #ef4444; opacity: 0.6;\"></div>\n          </div>\n        </div>\n      `;\n      })\n      .join(\"\");\n\n    return `\n      <div class=\"onpush-panel\" style=\"position: fixed; right: ${panelRight}px; bottom: ${this.toolbarY + 60}px; width: 250px; max-height: 300px; display: flex; flex-direction: column; gap: 6px; background: var(--ars-panel-bg); border: 1px solid var(--ars-border); border-top: 3px solid #7c3aed; border-radius: 11px; padding: 10px; z-index: 2147483647; box-shadow: var(--ars-shadow); pointer-events: auto; backdrop-filter: blur(20px) saturate(1.15);\">\n        <div style=\"font-size: 11px; font-weight: 800; text-transform: uppercase; color: var(--ars-color); border-bottom: 1px solid var(--ars-border); padding-bottom: 6px; display: flex; justify-content: space-between; align-items: center;\">\n          <span>⚡ OnPush Candidates</span>\n          <button class=\"onpush-close-btn\" style=\"background: none; border: none; color: var(--ars-label); cursor: pointer; font-size: 14px; font-weight: bold; line-height: 1;\">×</button>\n        </div>\n        <div style=\"font-size: 9px; color: var(--ars-label); line-height: 1.35; padding-bottom: 2px;\">\n          These are experiments, not predicted savings. Apply <code style=\"background: rgba(0,0,0,0.06); padding: 1px 3px; border-radius: 3px;\">ChangeDetectionStrategy.OnPush</code> only in a candidate change and verify the same interaction before and after.\n        </div>\n        <div style=\"display: flex; flex-direction: column; gap: 6px; overflow-y: auto; flex: 1;\">\n          ${items}\n        </div>\n      </div>\n    `;\n  }\n\n  private zonePollutionPanelHtml(events: ZonePollutionEvent[]): string {\n    if (!this.showZonePollutionPanel || events.length === 0) return \"\";\n    const panelRight = this.showOnPushPanel\n      ? this.toolbarX + 260\n      : this.toolbarX;\n    const items = events\n      .slice()\n      .reverse()\n      .slice(0, 15)\n      .map((e) => {\n        const timeStr = new Date(e.timestamp).toLocaleTimeString([], {\n          hour: \"2-digit\",\n          minute: \"2-digit\",\n          second: \"2-digit\",\n        });\n        const sourceLabel = e.source\n          .replace(\"zone:\", \"\")\n          .replace(\"manual:\", \"\")\n          .replace(\"signal:\", \"signal\");\n        return `\n        <div style=\"padding: 8px; border-radius: 6px; border: 1px solid var(--ars-border); background: var(--ars-card-bg); display: flex; flex-direction: column; gap: 4px; font-size: 10px;\">\n          <div style=\"display: flex; justify-content: space-between; align-items: center;\">\n            <span style=\"font-weight: 800; color: #f59e0b; font-size: 9px; text-transform: uppercase; background: rgba(245,158,11,0.1); border: 1px solid rgba(245,158,11,0.3); padding: 1px 5px; border-radius: 4px;\">${escapeHtml(sourceLabel)}</span>\n            <span style=\"color: var(--ars-label); font-size: 8px;\">${timeStr}</span>\n          </div>\n          ${e.detail ? `<div style=\"color: var(--ars-label); font-size: 9px; overflow-wrap: anywhere;\">${escapeHtml(e.detail)}</div>` : \"\"}\n          <div style=\"display: flex; gap: 8px; color: var(--ars-label);\">\n            <span>${e.componentCount} components</span>\n            <span style=\"color: ${e.cycleDuration > 10 ? \"#ef4444\" : \"#94a3b8\"};\">${e.cycleDuration.toFixed(1)}ms</span>\n          </div>\n          ${e.callSite ? `<div style=\"font-size: 8px; color: var(--ars-label); opacity: 0.7; overflow-wrap: anywhere; font-family: monospace;\">${escapeHtml(e.callSite)}</div>` : \"\"}\n        </div>\n      `;\n      })\n      .join(\"\");\n\n    return `\n      <div class=\"zone-pollution-panel\" style=\"position: fixed; right: ${panelRight}px; bottom: ${this.toolbarY + 60}px; width: 250px; max-height: 300px; display: flex; flex-direction: column; gap: 6px; background: var(--ars-panel-bg); border: 1px solid var(--ars-border); border-top: 3px solid #f59e0b; border-radius: 11px; padding: 10px; z-index: 2147483647; box-shadow: var(--ars-shadow); pointer-events: auto; backdrop-filter: blur(20px) saturate(1.15);\">\n        <div style=\"font-size: 11px; font-weight: 800; text-transform: uppercase; color: var(--ars-color); border-bottom: 1px solid var(--ars-border); padding-bottom: 6px; display: flex; justify-content: space-between; align-items: center;\">\n          <span>⚠ Zone Pollution</span>\n          <button class=\"zone-pollution-close-btn\" style=\"background: none; border: none; color: var(--ars-label); cursor: pointer; font-size: 14px; font-weight: bold; line-height: 1;\">×</button>\n        </div>\n        <div style=\"font-size: 9px; color: var(--ars-label); line-height: 1.35; padding-bottom: 2px;\">\n          Applies only to Zone.js applications. These cycles followed async work without a nearby user event; verify the source before using <code style=\"background: rgba(0,0,0,0.06); padding: 1px 3px; border-radius: 3px;\">NgZone.runOutsideAngular()</code>.\n        </div>\n        <div style=\"display: flex; flex-direction: column; gap: 6px; overflow-y: auto; flex: 1;\">\n          ${items}\n        </div>\n      </div>\n    `;\n  }\n\n  private addBudgetViolation(violation: BudgetViolation): void {\n    if (\n      this.budgetViolations.some(\n        (v) =>\n          v.componentName === violation.componentName &&\n          v.timestamp === violation.timestamp &&\n          v.type === violation.type,\n      )\n    ) {\n      return;\n    }\n    this.budgetViolations.push(violation);\n    if (this.budgetViolations.length > 50) {\n      this.budgetViolations.shift();\n    }\n    this.renderToolbar();\n  }\n\n  private updateDarkMode(): void {\n    const mode = this.options.darkMode;\n    let isDark = false;\n    if (mode === \"dark\") {\n      isDark = true;\n    } else if (mode === \"light\") {\n      isDark = false;\n    } else {\n      isDark =\n        typeof window !== \"undefined\" &&\n        window.matchMedia?.(\"(prefers-color-scheme: dark)\").matches;\n    }\n    if (isDark) {\n      this.host.classList.add(\"dark\");\n    } else {\n      this.host.classList.remove(\"dark\");\n    }\n  }\n\n  private cdGraphPanelHtml(): string {\n    if (!this.showGraphPanel) return \"\";\n    const graph = getCdGraph();\n    const nodes = graph.nodes;\n    const panelRight = this.toolbarX;\n\n    // Build child map for tree rendering\n    const childMap = new Map<string | null, typeof nodes>();\n    for (const n of nodes) {\n      const pid = n.parentId ?? null;\n      if (!childMap.has(pid)) childMap.set(pid, []);\n      childMap.get(pid)!.push(n);\n    }\n\n    const renderNode = (node: (typeof nodes)[0], depth: number): string => {\n      const children = childMap.get(node.id) ?? [];\n      const stratColor = node.cdStrategy === \"OnPush\" ? \"#10b981\" : \"#f59e0b\";\n      const countColor = node.wastedChecks > 0 ? \"#ef4444\" : \"#94a3b8\";\n      const indent = depth * 9;\n      const childRows = children.map((c) => renderNode(c, depth + 1)).join(\"\");\n      const edgeCount =\n        graph.edges.find((e) => e.toId === node.id)?.triggerCount ?? 0;\n      return `\n        <div style=\"display:flex;flex-direction:column;\">\n          <div style=\"display:flex;align-items:center;gap:4px;padding:2px 5px 2px ${indent + 5}px;border-radius:4px;transition:background .1s;\" onmouseover=\"this.style.background='rgba(0,0,0,.04)'\" onmouseout=\"this.style.background=''\">\n            ${depth > 0 ? `<span style=\"color:#cbd5e1;font-size:8px;flex-shrink:0;\">↳</span>` : \"\"}\n            <span style=\"font-size:9px;font-weight:650;color:var(--ars-color);flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;\" title=\"${escapeHtml(node.name)}\">${escapeHtml(node.name)}</span>\n            ${edgeCount > 0 ? `<span style=\"font-size:8px;color:#94a3b8;flex-shrink:0;\">${edgeCount}x</span>` : \"\"}\n            <span style=\"font-size:7px;font-weight:800;color:${stratColor};flex-shrink:0;border:1px solid ${stratColor};padding:0 2px;border-radius:3px;\">${node.cdStrategy === \"OnPush\" ? \"OP\" : \"D\"}</span>\n            <span style=\"font-size:8px;font-family:monospace;color:${countColor};flex-shrink:0;\">${node.renderCount}r${node.wastedChecks > 0 ? `/${node.wastedChecks}w` : \"\"}</span>\n          </div>\n          ${childRows}\n        </div>\n      `;\n    };\n\n    const roots = childMap.get(null) ?? nodes.filter((n) => !n.parentId);\n    const treeHtml = this.graphCollapsed\n      ? \"\"\n      : roots.length > 0\n        ? roots.map((n) => renderNode(n, 0)).join(\"\")\n        : `<div style=\"padding:12px;text-align:center;font-size:10px;color:var(--ars-label);\">No component data yet — interact with the app.</div>`;\n\n    const onPushCount = nodes.filter((n) => n.cdStrategy === \"OnPush\").length;\n    const defaultCount = nodes.filter((n) => n.cdStrategy !== \"OnPush\").length;\n    const wastedTotal = nodes.reduce((s, n) => s + n.wastedChecks, 0);\n\n    return `\n      <div class=\"cd-graph-panel\" style=\"position:fixed;right:${this.toolbarX}px;bottom:${this.toolbarY + 60}px;width:240px;max-height:${this.graphCollapsed ? \"auto\" : \"300px\"};display:flex;flex-direction:column;background:var(--ars-panel-bg);border:1px solid var(--ars-border);border-top:3px solid #06b6d4;border-radius:11px;z-index:2147483647;box-shadow:var(--ars-shadow);pointer-events:auto;backdrop-filter:blur(20px) saturate(1.15);overflow:hidden;\">\n        <div style=\"display:flex;align-items:center;justify-content:space-between;padding:6px 8px;border-bottom:${this.graphCollapsed ? \"none\" : \"1px solid var(--ars-border)\"}>\">\n          <div style=\"display:flex;align-items:center;gap:5px;min-width:0;\">\n            <span style=\"font-size:10px;font-weight:850;color:var(--ars-color);white-space:nowrap;\">CD Graph</span>\n            ${nodes.length > 0 ? `<span style=\"font-size:8px;color:var(--ars-label);white-space:nowrap;\">${nodes.length} cmp</span>` : \"\"}\n          </div>\n          <div style=\"display:flex;align-items:center;gap:4px;\">\n            <button class=\"graph-collapse-btn\" style=\"background:none;border:none;color:var(--ars-label);cursor:pointer;font-size:12px;line-height:1;padding:2px 4px;\">${this.graphCollapsed ? \"▼\" : \"▲\"}</button>\n            <button class=\"graph-close-btn\" style=\"background:none;border:none;color:var(--ars-label);cursor:pointer;font-size:14px;line-height:1;padding:2px 4px;\">×</button>\n          </div>\n        </div>\n        ${\n          !this.graphCollapsed\n            ? `\n        <div style=\"display:flex;gap:4px;padding:5px 8px;border-bottom:1px solid var(--ars-border);flex-shrink:0;overflow:hidden;\">\n          <span style=\"font-size:8px;font-weight:750;color:#10b981;background:rgba(16,185,129,.08);border:1px solid rgba(16,185,129,.2);padding:1px 5px;border-radius:4px;white-space:nowrap;\">OP ${onPushCount}</span>\n          <span style=\"font-size:8px;font-weight:750;color:#f59e0b;background:rgba(245,158,11,.08);border:1px solid rgba(245,158,11,.2);padding:1px 5px;border-radius:4px;white-space:nowrap;\">D ${defaultCount}</span>\n          ${wastedTotal > 0 ? `<span style=\"font-size:8px;font-weight:750;color:#ef4444;background:rgba(239,68,68,.08);border:1px solid rgba(239,68,68,.2);padding:1px 5px;border-radius:4px;white-space:nowrap;\">W ${wastedTotal}</span>` : \"\"}\n        </div>\n        <div style=\"overflow-y:auto;flex:1;padding:3px 3px 6px;\">\n          ${treeHtml}\n        </div>\n        <div style=\"padding:5px 8px;border-top:1px solid var(--ars-border);display:flex;justify-content:space-between;align-items:center;gap:6px;flex-shrink:0;\">\n          <span style=\"font-size:8px;color:var(--ars-label);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;\">r renders · w wasted</span>\n          <button class=\"graph-refresh-btn\" style=\"font-size:8px;font-weight:750;background:rgba(6,182,212,.1);border:1px solid rgba(6,182,212,.2);color:#06b6d4;border-radius:4px;padding:1px 5px;cursor:pointer;\">Refresh</button>\n        </div>\n        `\n            : \"\"\n        }\n      </div>\n    `;\n  }\n\n  private waterfallPanelHtml(): string {\n    if (!this.showWaterfallPanel || !this.latestCycle) return \"\";\n    const cycle = this.latestCycle;\n    const waterfall = cycle.waterfall || [];\n    const rightOffset = this.showCpuDetails\n      ? this.toolbarX + 290\n      : this.toolbarX + 120;\n    if (waterfall.length === 0) {\n      return `\n        <div class=\"waterfall-panel\" style=\"position: fixed; right: ${rightOffset}px; bottom: ${this.toolbarY + 60}px; width: 260px; background: var(--ars-panel-bg); border: 1px solid var(--ars-border); border-radius: 11px; padding: 10px; z-index: 2147483647; box-shadow: var(--ars-shadow); pointer-events: auto; backdrop-filter: blur(20px) saturate(1.15);\">\n          <div style=\"font-size: 11px; font-weight: 800; text-transform: uppercase; color: var(--ars-label); border-bottom: 1px solid var(--ars-border); padding-bottom: 6px; margin-bottom: 8px; display: flex; justify-content: space-between; align-items: center;\">\n            <span>CD Waterfall</span>\n            <button class=\"waterfall-close-btn\" style=\"background: none; border: none; color: var(--ars-label); cursor: pointer; font-size: 12px;\">×</button>\n          </div>\n          <div style=\"font-size: 10px; color: var(--ars-label); padding: 12px; text-align: center;\">No waterfall data for this cycle</div>\n        </div>\n      `;\n    }\n\n    const maxOffset = Math.max(\n      ...waterfall.map((w) => w.startOffset + w.totalDuration),\n      1,\n    );\n    const items = waterfall\n      .map((w) => {\n        const leftPct = (w.startOffset / maxOffset) * 100;\n        const widthPct = Math.max(2, (w.totalDuration / maxOffset) * 100);\n        const indent = w.depth * 8;\n        const color =\n          w.selfDuration >= this.slowThresholdMs\n            ? \"#ef4444\"\n            : w.selfDuration > this.fastThresholdMs\n              ? \"#f59e0b\"\n              : \"#3b82f6\";\n        return `\n        <div style=\"display: flex; align-items: center; justify-content: space-between; font-size: 9px; margin-bottom: 4px;\">\n          <span style=\"display: block; width: 100px; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; padding-left: ${indent}px; color: var(--ars-color); font-weight: ${w.depth === 1 ? \"700\" : \"normal\"}\">\n            ${escapeHtml(w.name)}\n          </span>\n          <div style=\"flex: 1; height: 8px; background: rgba(0,0,0,0.05); border-radius: 4px; position: relative; margin: 0 8px;\">\n            <div style=\"position: absolute; left: ${leftPct}%; width: ${widthPct}%; height: 100%; background: ${color}; border-radius: 4px;\" title=\"Total: ${w.totalDuration.toFixed(1)}ms (Self: ${w.selfDuration.toFixed(1)}ms)\"></div>\n          </div>\n          <span style=\"font-family: monospace; color: var(--ars-label); min-width: 36px; text-align: right;\">${w.selfDuration.toFixed(1)}ms</span>\n        </div>\n      `;\n      })\n      .join(\"\");\n\n    return `\n      <div class=\"waterfall-panel\" style=\"position: fixed; right: ${rightOffset}px; bottom: ${this.toolbarY + 60}px; width: 260px; max-height: 200px; overflow-y: auto; background: var(--ars-panel-bg); border: 1px solid var(--ars-border); border-radius: 11px; padding: 10px; z-index: 2147483647; box-shadow: var(--ars-shadow); pointer-events: auto; backdrop-filter: blur(20px) saturate(1.15);\">\n        <div style=\"font-size: 11px; font-weight: 800; text-transform: uppercase; color: var(--ars-label); border-bottom: 1px solid var(--ars-border); padding-bottom: 6px; margin-bottom: 8px; display: flex; justify-content: space-between; align-items: center;\">\n          <span>Waterfall (Cycle #${cycle.id})</span>\n          <button class=\"waterfall-close-btn\" style=\"background: none; border: none; color: var(--ars-label); cursor: pointer; font-size: 12px;\">×</button>\n        </div>\n        <div style=\"display: flex; flex-direction: column;\">\n          ${items}\n        </div>\n      </div>\n    `;\n  }\n\n  private alertsPanelHtml(): string {\n    if (!this.showAlertsPanel || this.budgetViolations.length === 0) return \"\";\n\n    const itemsHtml = this.budgetViolations\n      .slice()\n      .reverse()\n      .map((v) => {\n        const typeLabel =\n          v.type === \"error\"\n            ? \"ERROR\"\n            : v.type === \"render-rate\"\n              ? \"RATE\"\n              : \"WARN\";\n        const typeColor =\n          v.type === \"error\"\n            ? \"#ef4444\"\n            : v.type === \"render-rate\"\n              ? \"#3b82f6\"\n              : \"#f59e0b\";\n        const timeStr = new Date(v.timestamp).toLocaleTimeString([], {\n          hour: \"2-digit\",\n          minute: \"2-digit\",\n          second: \"2-digit\",\n        });\n        return `\n        <div style=\"padding: 8px; border-radius: 6px; border: 1px solid var(--ars-border); background: var(--ars-card-bg); display: flex; flex-direction: column; gap: 4px; font-size: 10px;\">\n          <div style=\"display: flex; justify-content: space-between; align-items: center;\">\n            <span style=\"font-weight: 800; color: ${typeColor}; font-size: 8px; text-transform: uppercase; border: 1px solid ${typeColor}; padding: 1px 4px; border-radius: 4px;\">\n              ${typeLabel}\n            </span>\n            <span style=\"color: var(--ars-label); font-size: 8px;\">${timeStr}</span>\n          </div>\n          <div style=\"font-weight: 700; color: var(--ars-color); overflow-wrap: anywhere;\">${escapeHtml(v.componentName)}</div>\n          <div style=\"color: var(--ars-label); line-height: 1.35;\">${escapeHtml(v.message)}</div>\n        </div>\n      `;\n      })\n      .join(\"\");\n\n    let alertsRight = this.toolbarX + 120;\n    if (this.showCpuDetails) {\n      alertsRight += 170;\n    }\n    if (this.showWaterfallPanel) {\n      alertsRight += 270;\n    }\n\n    return `\n      <div class=\"alerts-panel\" style=\"position: fixed; right: ${alertsRight}px; bottom: ${this.toolbarY + 60}px; width: 250px; max-height: 240px; display: flex; flex-direction: column; gap: 6px; background: var(--ars-panel-bg); border: 1px solid var(--ars-border); border-top: 3px solid #ef4444; border-radius: 11px; padding: 10px; z-index: 2147483647; box-shadow: var(--ars-shadow); pointer-events: auto; backdrop-filter: blur(20px) saturate(1.15);\">\n        <div style=\"font-size: 11px; font-weight: 800; text-transform: uppercase; color: var(--ars-color); border-bottom: 1px solid var(--ars-border); padding-bottom: 6px; display: flex; justify-content: space-between; align-items: center;\">\n          <span style=\"display: inline-flex; align-items: center; gap: 4px;\">\n            <span>⚠️ Budget Violations</span>\n          </span>\n          <div style=\"display: flex; align-items: center; gap: 8px;\">\n            <button class=\"clear-alerts-btn\" style=\"background: none; border: none; color: #ef4444; font-size: 9px; font-weight: 700; cursor: pointer; text-transform: uppercase; padding: 2px 6px; border: 1px solid rgba(239, 68, 68, 0.2); border-radius: 4px;\">Clear All</button>\n            <button class=\"alerts-close-btn\" style=\"background: none; border: none; color: var(--ars-label); cursor: pointer; font-size: 14px; font-weight: bold; line-height: 1;\">×</button>\n          </div>\n        </div>\n        <div class=\"alerts-list\" style=\"display: flex; flex-direction: column; gap: 6px; overflow-y: auto; flex: 1; padding-right: 2px;\">\n          ${itemsHtml}\n        </div>\n      </div>\n    `;\n  }\n\n}\n\nfunction rgba(color: readonly [number, number, number], alpha: number): string {\n  return `rgba(${color[0]}, ${color[1]}, ${color[2]}, ${alpha})`;\n}\n\nfunction area(rect: DOMRect): number {\n  return rect.width * rect.height;\n}\n\nfunction containsRect(outer: DOMRect, inner: DOMRect): boolean {\n  const tolerance = 1;\n  return (\n    inner.left >= outer.left - tolerance &&\n    inner.top >= outer.top - tolerance &&\n    inner.right <= outer.right + tolerance &&\n    inner.bottom <= outer.bottom + tolerance\n  );\n}\n\nfunction truncateText(\n  context: CanvasRenderingContext2D,\n  text: string,\n  maxWidth: number,\n): string {\n  if (context.measureText(text).width <= maxWidth) {\n    return text;\n  }\n\n  const ellipsis = \"...\";\n  let next = text;\n  while (\n    next.length > 0 &&\n    context.measureText(`${next}${ellipsis}`).width > maxWidth\n  ) {\n    next = next.slice(0, -1);\n  }\n\n  return next ? `${next}${ellipsis}` : ellipsis;\n}\n\nfunction escapeHtml(value: string): string {\n  return value\n    .replace(/&/g, \"&amp;\")\n    .replace(/</g, \"&lt;\")\n    .replace(/>/g, \"&gt;\")\n    .replace(/\"/g, \"&quot;\")\n    .replace(/'/g, \"&#39;\");\n}\n","import type { AngularRenderScanBudgets, AngularRenderScanOptions, AngularRenderScanResolvedOptions, AngularRenderScanTheme } from './entities';\n\nconst defaultTheme: AngularRenderScanTheme = {\n  fast: [147, 197, 253],          // blue-300\n  medium: [253, 224, 71],         // yellow-300\n  slow: [239, 68, 68],            // red-500\n  labelBackground: [124, 58, 237],     // violet-600\n  labelBackgroundSlow: [220, 38, 38],  // red-600\n};\n\nconst defaultBudgets: Required<AngularRenderScanBudgets> = {\n  warnMs: 10,\n  errorMs: 30,\n  maxRendersPerSecond: 20\n};\n\nconst STORAGE_ENABLED_KEY = 'angular-render-scan:enabled';\n\nconst defaultOptions: AngularRenderScanResolvedOptions = {\n  enabled: true,\n  showToolbar: true,\n  animationSpeed: 'fast',\n  showFPS: true,\n  log: false,\n  dangerouslyForceRunInProduction: false,\n  minDurationMs: 0,\n  minRenderCount: 0,\n  include: [],\n  exclude: [],\n  maxLabelCount: 20,\n  maxRecordedCycles: 30,\n  showCopyPrompt: true,\n  promptContext: '',\n  theme: defaultTheme,\n  budgets: defaultBudgets,\n  editorProtocol: 'vscode',\n  darkMode: 'auto',\n  showCdGraph: true,\n  maxZonePollutionEvents: 50,\n  trackComponents: [],\n  onPushCandidateThreshold: 40,\n  trackReferentialStability: true,\n  referentialStabilityDepth: 4,\n};\n\nlet options: AngularRenderScanResolvedOptions = { ...defaultOptions };\n\ninterface ResolveOptionsConfig {\n  preferStoredEnabled?: boolean;\n}\n\ninterface SetResolvedOptionsConfig extends ResolveOptionsConfig {\n  persistEnabled?: boolean;\n}\n\nexport function resolveOptions(next?: AngularRenderScanOptions, config: ResolveOptionsConfig = {}): AngularRenderScanResolvedOptions {\n  const merged = { ...options, ...next } as AngularRenderScanResolvedOptions;\n  const storedEnabled = readStoredEnabled();\n\n  merged.enabled = config.preferStoredEnabled\n    ? storedEnabled ?? (typeof next?.enabled === 'boolean' ? next.enabled : merged.enabled)\n    : typeof next?.enabled === 'boolean'\n    ? next.enabled\n    : storedEnabled ?? merged.enabled;\n\n  if (!['slow', 'fast', 'off'].includes(merged.animationSpeed)) {\n    merged.animationSpeed = defaultOptions.animationSpeed;\n  }\n\n  merged.minDurationMs = normalizeNonNegative(merged.minDurationMs, defaultOptions.minDurationMs);\n  merged.minRenderCount = normalizeNonNegative(merged.minRenderCount, defaultOptions.minRenderCount);\n  merged.maxLabelCount = normalizePositiveInteger(merged.maxLabelCount, defaultOptions.maxLabelCount);\n  merged.maxRecordedCycles = normalizePositiveInteger(merged.maxRecordedCycles, defaultOptions.maxRecordedCycles);\n  merged.maxZonePollutionEvents = normalizePositiveInteger(merged.maxZonePollutionEvents, defaultOptions.maxZonePollutionEvents);\n  merged.include = Array.isArray(merged.include) ? merged.include : defaultOptions.include;\n  merged.exclude = Array.isArray(merged.exclude) ? merged.exclude : defaultOptions.exclude;\n  merged.trackComponents = Array.isArray(merged.trackComponents) ? merged.trackComponents : defaultOptions.trackComponents;\n  merged.promptContext = typeof merged.promptContext === 'string' ? merged.promptContext : defaultOptions.promptContext;\n  merged.showCopyPrompt = typeof next?.showCopyPrompt === 'boolean' ? next.showCopyPrompt : options.showCopyPrompt;\n  merged.showCdGraph = typeof next?.showCdGraph === 'boolean' ? next.showCdGraph : options.showCdGraph;\n  merged.trackReferentialStability = typeof next?.trackReferentialStability === 'boolean' ? next.trackReferentialStability : options.trackReferentialStability;\n  merged.theme = { ...options.theme, ...(next?.theme || {}) };\n  merged.budgets = {\n    ...defaultBudgets,\n    ...options.budgets,\n    ...(next?.budgets || {}),\n  };\n  merged.editorProtocol = typeof next?.editorProtocol === 'string' ? next.editorProtocol : options.editorProtocol;\n  merged.darkMode = ['auto', 'dark', 'light'].includes(next?.darkMode as string) ? next!.darkMode! : options.darkMode;\n  merged.onPushCandidateThreshold = normalizeNonNegative(merged.onPushCandidateThreshold, defaultOptions.onPushCandidateThreshold);\n  merged.referentialStabilityDepth = normalizePositiveInteger(merged.referentialStabilityDepth, defaultOptions.referentialStabilityDepth);\n\n  return merged;\n}\n\nexport function setResolvedOptions(next: Partial<AngularRenderScanOptions>, config: SetResolvedOptionsConfig = {}): AngularRenderScanResolvedOptions {\n  options = resolveOptions(next, config);\n  if (config.persistEnabled !== false && typeof next.enabled === 'boolean') {\n    writeStoredEnabled(options.enabled);\n  }\n  return options;\n}\n\nexport function getResolvedOptions(): AngularRenderScanResolvedOptions {\n  return { ...options };\n}\n\nexport function resetOptionsForTest(): void {\n  options = { ...defaultOptions };\n  try {\n    globalThis.localStorage?.removeItem(STORAGE_ENABLED_KEY);\n  } catch {\n    // localStorage can be unavailable in non-browser test environments.\n  }\n}\n\nfunction readStoredEnabled(): boolean | undefined {\n  try {\n    const value = globalThis.localStorage?.getItem(STORAGE_ENABLED_KEY);\n    if (value === 'true') return true;\n    if (value === 'false') return false;\n  } catch {\n    // localStorage can be unavailable or blocked by the host app.\n  }\n  return undefined;\n}\n\nfunction writeStoredEnabled(enabled: boolean): void {\n  try {\n    globalThis.localStorage?.setItem(STORAGE_ENABLED_KEY, String(enabled));\n  } catch {\n    // Persisting preference should never break instrumentation.\n  }\n}\n\nfunction normalizeNonNegative(value: number, fallback: number): number {\n  return Number.isFinite(value) && value >= 0 ? value : fallback;\n}\n\nfunction normalizePositiveInteger(value: number, fallback: number): number {\n  return Number.isFinite(value) && value > 0 ? Math.floor(value) : fallback;\n}\n","/**\n * OnPush Candidate Analyzer\n *\n * Domain-layer module. Analyzes component stats to determine which components\n * that use ChangeDetectionStrategy.Default could safely migrate to OnPush.\n *\n * No Angular imports. No DOM access. Pure computation over component data.\n */\n\nimport type { OnPushCandidate } from '../domain/entities';\n\nexport interface ComponentStatsForOnPush {\n  id: string;\n  name: string;\n  selector: string;\n  totalChecks: number;\n  wastedChecks: number;\n  totalDuration: number;\n  cdStrategy: 'OnPush' | 'Default' | 'unknown';\n  inputChangeCount: number; // how many checks had input changes\n}\n\n/**\n * Analyze a set of component stats and return components that are good\n * candidates for ChangeDetectionStrategy.OnPush migration.\n *\n * A component is a candidate when:\n * 1. It uses Default CD (or unknown)\n * 2. Its wasted render % exceeds the threshold\n * 3. It has been checked enough times to be statistically meaningful\n */\nexport function analyzeOnPushCandidates(\n  components: ComponentStatsForOnPush[],\n  wastedThresholdPct: number = 40,\n  minChecks: number = 5\n): OnPushCandidate[] {\n  const candidates: OnPushCandidate[] = [];\n\n  for (const comp of components) {\n    // Skip already-OnPush components\n    if (comp.cdStrategy === 'OnPush') continue;\n    // Need enough data to be meaningful\n    if (comp.totalChecks < minChecks) continue;\n\n    const wastedPct = comp.totalChecks > 0\n      ? Math.round((comp.wastedChecks / comp.totalChecks) * 100)\n      : 0;\n\n    if (wastedPct < wastedThresholdPct) continue;\n\n    // This is an observed opportunity share, not a prediction of OnPush savings.\n    const opportunityPercentage = wastedPct;\n\n    let confidence: 'high' | 'medium' | 'low';\n    let reason: string;\n\n    if (wastedPct >= 80) {\n      confidence = 'high';\n      reason = `${wastedPct}% of observed checks produced no DOM mutation. Validate inputs, events, and side effects before trying OnPush.`;\n    } else if (wastedPct >= 60) {\n      confidence = 'medium';\n      reason = `${wastedPct}% of observed checks produced no DOM mutation. OnPush is worth testing, but the saving is not yet verified.`;\n    } else {\n      confidence = 'low';\n      reason = `${wastedPct}% wasted renders detected. Review whether this component has internal side effects before switching to OnPush.`;\n    }\n\n    candidates.push({\n      name: comp.name,\n      selector: comp.selector,\n      totalChecks: comp.totalChecks,\n      wastedChecks: comp.wastedChecks,\n      wastedPercentage: wastedPct,\n      opportunityPercentage,\n      estimatedSavingPct: opportunityPercentage,\n      confidence,\n      reason\n    });\n  }\n\n  // Sort by estimated saving desc, then confidence desc\n  return candidates.sort((a, b) => {\n    const confScore = { high: 3, medium: 2, low: 1 };\n    const byConf = confScore[b.confidence] - confScore[a.confidence];\n    if (byConf !== 0) return byConf;\n    return b.opportunityPercentage - a.opportunityPercentage;\n  });\n}\n","/**\n * Referential Input Stability Tracker\n *\n * Detects when an @Input() receives a new object reference but the value\n * is deeply equal to the previous one. This is the #1 cause of unexpected\n * re-renders on OnPush components and a very common Angular performance bug.\n *\n * Domain layer — no Angular imports, no DOM access.\n */\n\nimport type { ReferentialInstabilityReport } from '../domain/entities';\n\ninterface InputStabilityEntry {\n  componentName: string;\n  selector: string;\n  inputName: string;\n  /** Last serialized value for deep equality */\n  lastSerialized: string;\n  /** Last raw reference (for reference comparison) */\n  lastRef: unknown;\n  /** Times reference changed but value was equal */\n  unstableRefCount: number;\n  /** Total times we saw a changed input reference */\n  totalChangedRefCount: number;\n}\n\n// Map: `${componentId}:${inputName}` → entry\nconst stabilityMap = new Map<string, InputStabilityEntry>();\n\n/**\n * Serialize a value for deep equality comparison.\n * Uses JSON.stringify with a depth guard — not perfect but fast and\n * safe for the vast majority of Angular @Input() values.\n */\nfunction serializeDeep(value: unknown, maxDepth: number, currentDepth = 0): string {\n  if (value === null) return 'null';\n  if (value === undefined) return 'undefined';\n  if (typeof value !== 'object' && typeof value !== 'function') return String(value);\n  if (typeof value === 'function') return 'Function';\n  if (currentDepth >= maxDepth) return Array.isArray(value) ? `Array(${(value as unknown[]).length})` : 'Object';\n\n  try {\n    if (Array.isArray(value)) {\n      const items = (value as unknown[]).slice(0, 20).map(v => serializeDeep(v, maxDepth, currentDepth + 1));\n      return `[${items.join(',')}]`;\n    }\n\n    const obj = value as Record<string, unknown>;\n    const keys = Object.keys(obj).slice(0, 20).sort();\n    const pairs = keys.map(k => `${k}:${serializeDeep(obj[k], maxDepth, currentDepth + 1)}`);\n    return `{${pairs.join(',')}}`;\n  } catch {\n    return 'Object';\n  }\n}\n\n/**\n * Called during auto-instrumentation when an input changes reference.\n * Returns true if the new value is referentially unstable (same deep value, new ref).\n */\nexport function checkReferentialStability(\n  componentId: string,\n  componentName: string,\n  selector: string,\n  inputName: string,\n  newRef: unknown,\n  maxDepth: number = 4\n): boolean {\n  // Only objects/arrays can be referentially unstable\n  if (newRef === null || typeof newRef !== 'object') return false;\n\n  const key = `${componentId}:${inputName}`;\n  const entry = stabilityMap.get(key);\n\n  const newSerialized = serializeDeep(newRef, maxDepth);\n\n  if (!entry) {\n    stabilityMap.set(key, {\n      componentName,\n      selector,\n      inputName,\n      lastSerialized: newSerialized,\n      lastRef: newRef,\n      unstableRefCount: 0,\n      totalChangedRefCount: 1\n    });\n    return false;\n  }\n\n  // Reference changed (we're only called when reference changed)\n  entry.totalChangedRefCount++;\n\n  const isUnstable = entry.lastRef !== newRef && entry.lastSerialized === newSerialized;\n\n  if (isUnstable) {\n    entry.unstableRefCount++;\n  }\n\n  entry.lastSerialized = newSerialized;\n  entry.lastRef = newRef;\n\n  return isUnstable;\n}\n\nexport function getReferentialInstabilityReports(minUnstableRefs = 1): ReferentialInstabilityReport[] {\n  const reports: ReferentialInstabilityReport[] = [];\n  for (const entry of stabilityMap.values()) {\n    if (entry.unstableRefCount < minUnstableRefs) continue;\n    const unstableRefPct = entry.totalChangedRefCount > 0\n      ? Math.round((entry.unstableRefCount / entry.totalChangedRefCount) * 100)\n      : 0;\n    reports.push({\n      componentName: entry.componentName,\n      selector: entry.selector,\n      inputName: entry.inputName,\n      unstableRefCount: entry.unstableRefCount,\n      totalRenders: entry.totalChangedRefCount,\n      unstableRefPct,\n      lastValue: entry.lastSerialized.slice(0, 120)\n    });\n  }\n  return reports.sort((a, b) => b.unstableRefCount - a.unstableRefCount);\n}\n\nexport function resetReferentialStability(): void {\n  stabilityMap.clear();\n}\n\nexport function clearReferentialStabilityStats(): void {\n  for (const entry of stabilityMap.values()) {\n    entry.unstableRefCount = 0;\n    entry.totalChangedRefCount = 0;\n  }\n}\n","/**\n * Change Detection Graph Builder\n *\n * Builds a snapshot graph of the component tree showing how CD flows through\n * the application. Each node is a component, each edge is a parent→child\n * render relationship.\n *\n * Domain layer — no Angular imports, no DOM access.\n */\n\nimport type { CdGraph, CdGraphEdge, CdGraphNode, CdTriggerSource } from '../domain/entities';\n\nexport interface ComponentGraphData {\n  id: string;\n  name: string;\n  selector: string;\n  parentId: string | null;\n  depth: number;\n  renderCount: number;\n  totalDuration: number;\n  wastedChecks: number;\n  totalChecks: number;\n  cdStrategy: 'OnPush' | 'Default' | 'unknown';\n  isOnPushCandidate: boolean;\n  lastTrigger?: CdTriggerSource;\n}\n\n// Parent→child trigger counts across the session\nconst edgeTriggerCounts = new Map<string, number>();\n\nexport function recordParentChildRender(parentId: string, childId: string): void {\n  const key = `${parentId}→${childId}`;\n  edgeTriggerCounts.set(key, (edgeTriggerCounts.get(key) ?? 0) + 1);\n}\n\nexport function buildCdGraph(components: ComponentGraphData[]): CdGraph {\n  const nodes: CdGraphNode[] = components.map(c => ({\n    id: c.id,\n    name: c.name,\n    selector: c.selector,\n    parentId: c.parentId,\n    depth: c.depth,\n    renderCount: c.renderCount,\n    totalDuration: c.totalDuration,\n    wastedChecks: c.wastedChecks,\n    cdStrategy: c.cdStrategy,\n    isOnPushCandidate: c.isOnPushCandidate,\n    lastTrigger: c.lastTrigger\n  }));\n\n  const edges: CdGraphEdge[] = [];\n  for (const [key, count] of edgeTriggerCounts.entries()) {\n    const [fromId, toId] = key.split('→');\n    if (fromId && toId) {\n      edges.push({ fromId, toId, triggerCount: count });\n    }\n  }\n\n  return {\n    nodes,\n    edges,\n    capturedAt: performance.now()\n  };\n}\n\nexport function resetCdGraph(): void {\n  edgeTriggerCounts.clear();\n}\n","import type {\n  AngularRenderCycle,\n  AngularRenderEntry,\n  AngularRenderScanRegisteredComponent,\n  AngularRenderScanRenderDetails,\n  AngularRenderScanResolvedOptions,\n  AngularRenderMutationType,\n  WaterfallEntry,\n  OnPushCandidate,\n  ReferentialInstabilityReport,\n  CdTriggerSource,\n  RenderCause,\n  ComponentCostEntry\n} from '../domain/entities';\nimport { analyzeOnPushCandidates } from './onpush-analyzer';\nimport { getReferentialInstabilityReports, resetReferentialStability, clearReferentialStabilityStats } from './referential-stability';\nimport { buildCdGraph, recordParentChildRender, resetCdGraph } from './cd-graph';\nimport type { CdGraph } from '../domain/entities';\n\ninterface ComponentStats extends AngularRenderScanRegisteredComponent {\n  totalDuration: number;\n  totalChecks: number;\n  latestDuration: number;\n  latestCycleId: number;\n  latestDetails: AngularRenderScanRenderDetails;\n  wastedChecks: number;\n  inputChangeCount: number;\n  lastTrigger?: CdTriggerSource;\n  templateChanges: number;\n  renderCause?: RenderCause;\n}\n\nlet cycleId = 0;\nlet cycleStartedAt = 0;\nlet activeCycleWaterfall: WaterfallEntry[] = [];\nconst components = new Map<string, ComponentStats>();\n\n// Callback to resolve render cause from runtime to avoid circular dependency\nlet getRenderCauseCallback: ((componentName: string) => RenderCause | undefined) | null = null;\n\nexport function registerGetRenderCauseCallback(cb: (componentName: string) => RenderCause | undefined): void {\n  getRenderCauseCallback = cb;\n}\n\n// Track MutationObservers for connected elements to classify mutation types\nconst observers = new Map<string, { observer: MutationObserver, lastMutation: AngularRenderMutationType }>();\n\nexport function registerComponent(component: AngularRenderScanRegisteredComponent): void {\n  const existing = components.get(component.id);\n  components.set(component.id, {\n    ...existing,\n    ...component,\n    totalDuration: existing?.totalDuration ?? 0,\n    totalChecks: existing?.totalChecks ?? 0,\n    latestDuration: existing?.latestDuration ?? 0,\n    latestCycleId: existing?.latestCycleId ?? 0,\n    latestDetails: existing?.latestDetails ?? {},\n    wastedChecks: existing?.wastedChecks ?? 0,\n    templateChanges: existing?.templateChanges ?? 0,\n    inputChangeCount: existing?.inputChangeCount ?? 0,\n    cdStrategy: component.cdStrategy ?? existing?.cdStrategy ?? 'unknown',\n    parentId: component.parentId ?? existing?.parentId ?? null\n  });\n\n  if (component.element && typeof MutationObserver !== 'undefined' && !observers.has(component.id)) {\n    try {\n      const state = { lastMutation: 'none' as AngularRenderMutationType } as any;\n      const observer = new MutationObserver((mutations) => {\n        let highest: AngularRenderMutationType = 'none';\n        for (const m of mutations) {\n          if (m.addedNodes.length > 0 || m.removedNodes.length > 0) {\n            highest = 'structural';\n            break;\n          } else if (m.type === 'attributes') {\n            highest = 'attribute';\n          } else if (m.type === 'characterData') {\n            if (highest !== 'attribute') {\n              highest = 'text';\n            }\n          }\n        }\n        if (highest !== 'none') {\n          state.lastMutation = highest;\n        }\n      });\n      observer.observe(component.element, { attributes: true, characterData: true, childList: true, subtree: true });\n      state.observer = observer;\n      observers.set(component.id, state);\n    } catch {\n      // Ignore observer failures in test environments\n    }\n  }\n}\n\nexport function unregisterComponent(id: string): void {\n  components.delete(id);\n  const state = observers.get(id);\n  if (state) {\n    state.observer.disconnect();\n    observers.delete(id);\n  }\n}\n\nexport function recordComponentCheck(\n  id: string,\n  duration: number,\n  currentCycleId = cycleId,\n  details: AngularRenderScanRenderDetails = {},\n  timing?: { startTime: number; totalDuration: number; depth: number },\n  lastTrigger?: CdTriggerSource\n): AngularRenderEntry | undefined {\n  const stats = components.get(id);\n  if (!stats || !stats.element.isConnected) {\n    return undefined;\n  }\n\n  stats.totalChecks += 1;\n  stats.latestDuration = Math.max(0, duration);\n  stats.totalDuration += stats.latestDuration;\n  stats.latestCycleId = currentCycleId;\n  if (lastTrigger) stats.lastTrigger = lastTrigger;\n\n  // Track wasted checks vs template changes\n  const isWasted = details.mutationType === 'none';\n  if (isWasted) {\n    stats.wastedChecks += 1;\n  } else {\n    stats.templateChanges = (stats.templateChanges || 0) + 1;\n  }\n\n  // Resolve render cause using runtime callback\n  if (getRenderCauseCallback) {\n    stats.renderCause = getRenderCauseCallback(stats.name);\n  }\n\n  // Track input changes\n  if (details.changedInputs && details.changedInputs.length > 0) {\n    stats.inputChangeCount += 1;\n  }\n\n  // Record parent→child edge in CD graph\n  if (details.parentId && details.parentId !== id) {\n    recordParentChildRender(details.parentId, id);\n  }\n\n  // Determine final mutation type\n  const obsState = observers.get(id);\n  let finalMutationType: AngularRenderMutationType = 'none';\n  if (isWasted) {\n    finalMutationType = 'none';\n  } else {\n    finalMutationType = obsState ? obsState.lastMutation : 'text';\n    if (finalMutationType === 'none') {\n      finalMutationType = 'text';\n    }\n  }\n\n  if (obsState) {\n    obsState.lastMutation = 'none'; // reset for next check\n  }\n\n  stats.latestDetails = {\n    reason: details.reason ?? 'unknown',\n    changedInputs: details.changedInputs?.slice(0, 6),\n    mutationType: finalMutationType,\n    parentId: details.parentId ?? stats.parentId ?? null\n  };\n\n  // Add waterfall entry\n  if (timing) {\n    const startOffset = Math.max(0, timing.startTime - cycleStartedAt);\n    activeCycleWaterfall.push({\n      id: stats.id,\n      name: stats.name,\n      startOffset,\n      selfDuration: duration,\n      totalDuration: timing.totalDuration,\n      depth: timing.depth\n    });\n  }\n\n  return toEntry(stats);\n}\n\nexport function startCycle(): number {\n  cycleId += 1;\n  cycleStartedAt = performance.now();\n  activeCycleWaterfall = [];\n  return cycleId;\n}\n\nexport function finishCycle(\n  id: number,\n  startedAt: number,\n  finishedAt: number,\n  options?: AngularRenderScanResolvedOptions\n): AngularRenderCycle {\n  const cycleEntries = [...components.values()]\n    .filter((component) => component.latestCycleId === id && component.element.isConnected)\n    .map(toEntry)\n    .sort((a, b) => b.latestDuration - a.latestDuration);\n  const entries = cycleEntries\n    .filter((entry) => shouldIncludeEntry(entry, options))\n    .sort((a, b) => b.latestDuration - a.latestDuration);\n\n  const waterfall = [...activeCycleWaterfall];\n\n  // Filters control presentation, not the accuracy of cycle-level telemetry.\n  const checked = cycleEntries.length;\n  const changed = cycleEntries.filter((e) => e.mutationType !== 'none').length;\n  const wasteScore = checked === 0 ? 0 : Math.round(((checked - changed) / checked) * 100);\n\n  return {\n    id,\n    startedAt,\n    finishedAt,\n    duration: Math.max(0, finishedAt - startedAt),\n    renderedCount: entries.length,\n    slowest: entries[0],\n    entries,\n    waterfall,\n    wastedCdStats: {\n      checked,\n      changed,\n      wasteScore\n    }\n  };\n}\n\nexport function resetStats(): void {\n  cycleId = 0;\n  cycleStartedAt = 0;\n  activeCycleWaterfall = [];\n  for (const state of observers.values()) {\n    state.observer.disconnect();\n  }\n  observers.clear();\n  components.clear();\n  resetReferentialStability();\n  resetCdGraph();\n}\n\nexport function clearStats(): void {\n  activeCycleWaterfall = [];\n  for (const stats of components.values()) {\n    stats.totalChecks = 0;\n    stats.totalDuration = 0;\n    stats.latestDuration = 0;\n    stats.latestCycleId = 0;\n    stats.latestDetails = {};\n    stats.wastedChecks = 0;\n    stats.templateChanges = 0;\n    stats.inputChangeCount = 0;\n    stats.renderCause = undefined;\n  }\n  for (const state of observers.values()) {\n    state.lastMutation = 'none';\n  }\n  clearReferentialStabilityStats();\n  resetCdGraph();\n}\n\nexport function getWastedStats(): { totalChecks: number; wastedChecks: number; wastedPercentage: number } {\n  let totalChecks = 0;\n  let wastedChecks = 0;\n  for (const stats of components.values()) {\n    totalChecks += stats.totalChecks;\n    wastedChecks += stats.wastedChecks || 0;\n  }\n  const wastedPercentage = totalChecks === 0 ? 0 : Math.round((wastedChecks / totalChecks) * 100);\n  return { totalChecks, wastedChecks, wastedPercentage };\n}\n\nexport function getLeakedComponents(): AngularRenderEntry[] {\n  return getDetachedComponents();\n}\n\n/** Components whose host element is currently disconnected. This alone does not prove retention. */\nexport function getDetachedComponents(): AngularRenderEntry[] {\n  return [...components.values()]\n    .filter((stats) => !stats.element.isConnected)\n    .map(toEntry);\n}\n\nexport function getRegisteredComponentEntries(): AngularRenderEntry[] {\n  return [...components.values()]\n    .filter((stats) => stats.element.isConnected)\n    .map(toEntry);\n}\n\nexport function getOnPushCandidates(threshold = 40): OnPushCandidate[] {\n  const data = [...components.values()].map(c => ({\n    id: c.id,\n    name: c.name,\n    selector: c.selector ?? selectorFor(c.element),\n    totalChecks: c.totalChecks,\n    wastedChecks: c.wastedChecks,\n    totalDuration: c.totalDuration,\n    cdStrategy: c.cdStrategy ?? 'unknown',\n    inputChangeCount: c.inputChangeCount\n  }));\n  return analyzeOnPushCandidates(data, threshold);\n}\n\nexport function getReferentialInstability(minUnstable = 1): ReferentialInstabilityReport[] {\n  return getReferentialInstabilityReports(minUnstable);\n}\n\nexport function getCdGraph(): CdGraph {\n  const totalDurationAll = [...components.values()].reduce((s, c) => s + c.totalDuration, 0);\n  const data = [...components.values()].map(c => {\n    const wastedPct = c.totalChecks > 0 ? Math.round((c.wastedChecks / c.totalChecks) * 100) : 0;\n    return {\n      id: c.id,\n      name: c.name,\n      selector: c.selector ?? selectorFor(c.element),\n      parentId: c.parentId ?? null,\n      depth: 1,\n      renderCount: c.totalChecks,\n      totalDuration: c.totalDuration,\n      wastedChecks: c.wastedChecks,\n      totalChecks: c.totalChecks,\n      cdStrategy: c.cdStrategy ?? 'unknown',\n      isOnPushCandidate: wastedPct >= 40 && (c.cdStrategy === 'Default' || c.cdStrategy === 'unknown'),\n      lastTrigger: c.lastTrigger\n    };\n  });\n  return buildCdGraph(data);\n}\n\nexport function getComponentCostEntries(): ComponentCostEntry[] {\n  const totalDurationAll = [...components.values()].reduce((sum, c) => sum + c.totalDuration, 0);\n  \n  return [...components.values()]\n    .map(c => {\n      const totalDuration = c.totalDuration;\n      const averageDuration = c.totalChecks === 0 ? 0 : totalDuration / c.totalChecks;\n      const costPercentage = totalDurationAll === 0 ? 0 : Math.round((totalDuration / totalDurationAll) * 100);\n      \n      return {\n        name: c.name,\n        selector: c.selector ?? (c.element ? selectorFor(c.element) : ''),\n        totalDuration,\n        averageDuration,\n        renderCount: c.totalChecks,\n        costPercentage\n      };\n    })\n    .sort((a, b) => b.totalDuration - a.totalDuration);\n}\n\nfunction toEntry(stats: ComponentStats): AngularRenderEntry {\n  const count = stats.totalChecks;\n  const wastedChecks = stats.wastedChecks || 0;\n  const wastedPercentage = count === 0 ? 0 : Math.round((wastedChecks / count) * 100);\n  const isOnPushCandidate = (stats.cdStrategy === 'Default' || stats.cdStrategy === 'unknown') &&\n    wastedPercentage >= 40 && count >= 5;\n\n  return {\n    id: stats.id,\n    name: stats.name,\n    element: stats.element,\n    rect: stats.element && stats.element.isConnected\n      ? stats.element.getBoundingClientRect()\n      : { left: 0, top: 0, width: 0, height: 0 } as DOMRect,\n    count,\n    latestDuration: stats.latestDuration,\n    averageDuration: count === 0 ? 0 : stats.totalDuration / count,\n    latestCycleId: stats.latestCycleId,\n    reason: stats.latestDetails.reason ?? 'unknown',\n    changedInputs: stats.latestDetails.changedInputs,\n    selector: stats.selector ?? (stats.element ? selectorFor(stats.element) : ''),\n    wastedChecks,\n    wastedPercentage,\n    mutationType: stats.latestDetails.mutationType ?? 'none',\n    cdStrategy: stats.cdStrategy ?? 'unknown',\n    isOnPushCandidate,\n    parentId: stats.parentId ?? null,\n    renderCause: stats.renderCause,\n    templateChanges: stats.templateChanges ?? 0\n  };\n}\n\nfunction shouldIncludeEntry(entry: AngularRenderEntry, options?: AngularRenderScanResolvedOptions): boolean {\n  if (!options) {\n    return true;\n  }\n\n  if (entry.latestDuration < options.minDurationMs) {\n    return false;\n  }\n  if (entry.count < options.minRenderCount) {\n    return false;\n  }\n  if (options.include.length > 0 && !matchesAny(entry, options.include)) {\n    return false;\n  }\n  if (options.exclude.length > 0 && matchesAny(entry, options.exclude)) {\n    return false;\n  }\n  // trackComponents filter: if specified, only include matching components\n  if (options.trackComponents && options.trackComponents.length > 0 && !matchesAny(entry, options.trackComponents)) {\n    return false;\n  }\n\n  return true;\n}\n\nfunction matchesAny(entry: AngularRenderEntry, patterns: Array<string | RegExp>): boolean {\n  const haystack = `${entry.name} ${entry.selector ?? ''}`;\n  return patterns.some((pattern) => {\n    if (typeof pattern === 'string') {\n      return haystack.includes(pattern);\n    }\n    pattern.lastIndex = 0;\n    return pattern.test(haystack);\n  });\n}\n\nfunction selectorFor(element: Element): string {\n  if (!element) return '';\n  const tag = element.tagName.toLowerCase();\n  const id = element.id ? `#${element.id}` : '';\n  const className = element.classList.length > 0 ? `.${Array.from(element.classList).slice(0, 3).join('.')}` : '';\n  return `${tag}${id}${className}`;\n}\n","import type {\n  InteractionComparison,\n  InteractionFinding,\n  InteractionMetricDelta,\n  InteractionMetrics,\n  InteractionReport,\n  SessionCycleData,\n  SessionExportData\n} from '../domain/entities';\n\nconst severityScore = { critical: 4, high: 3, medium: 2, low: 1 } as const;\n\nfunction round(value: number): number {\n  return Math.round(value * 100) / 100;\n}\n\nfunction metricsFor(session: SessionExportData): InteractionMetrics {\n  const entries = session.cycles.flatMap((cycle) => cycle.entries);\n  // Session entry counters are cumulative; one entry represents one observed check in a cycle.\n  const totalChecks = entries.length;\n  const wastedChecks = entries.filter((entry) => entry.mutationType === 'none').length;\n  const totalCycleDuration = session.cycles.reduce((sum, cycle) => sum + cycle.duration, 0);\n  return {\n    cycleCount: session.cycles.length,\n    componentCheckCount: totalChecks,\n    totalCycleDuration: round(totalCycleDuration),\n    maxCycleDuration: round(Math.max(0, ...session.cycles.map((cycle) => cycle.duration))),\n    wastedChecks,\n    wastedPercentage: totalChecks === 0 ? 0 : Math.round((wastedChecks / totalChecks) * 100),\n    budgetViolationCount: session.budgetViolations.length\n  };\n}\n\nfunction finding(input: Omit<InteractionFinding, 'score'>): InteractionFinding {\n  const confidence = { high: 3, medium: 2, low: 1 }[input.confidence];\n  return { ...input, score: severityScore[input.severity] * 100 + confidence * 10 };\n}\n\nfunction rankedFindings(session: SessionExportData, metrics: InteractionMetrics): InteractionFinding[] {\n  const findings: InteractionFinding[] = [];\n  for (const violation of session.budgetViolations) {\n    findings.push(finding({\n      kind: 'budget-violation',\n      severity: violation.type === 'error' || violation.type === 'render-rate' ? 'critical' : 'high',\n      confidence: 'high',\n      title: `${violation.componentName} exceeded a configured budget`,\n      summary: violation.message,\n      componentName: violation.componentName,\n      evidence: [`Observed ${round(violation.actual)}; budget ${round(violation.budget)}`, `Selector: ${violation.selector || 'not captured'}`],\n      action: 'Profile this component in the captured interaction and reduce the measured work or revise the explicit budget.'\n    }));\n  }\n\n  const latestByComponent = new Map<string, SessionCycleData['entries'][number]>();\n  for (const entry of session.cycles.flatMap((cycle) => cycle.entries)) {\n    const current = latestByComponent.get(entry.name);\n    if (!current || entry.latestDuration > current.latestDuration) latestByComponent.set(entry.name, entry);\n  }\n  for (const entry of [...latestByComponent.values()].sort((a, b) => b.latestDuration - a.latestDuration).slice(0, 3)) {\n    if (entry.latestDuration < 8) continue;\n    findings.push(finding({\n      kind: 'slow-component', severity: entry.latestDuration >= 16 ? 'high' : 'medium', confidence: 'high',\n      title: `${entry.name} was expensive in this interaction`,\n      summary: `Its slowest observed check took ${round(entry.latestDuration)}ms.`, componentName: entry.name,\n      evidence: [`Average ${round(entry.averageDuration)}ms`, `Observed count ${entry.count}`, `Trigger: ${entry.reason ?? 'unknown'}`],\n      action: 'Measure the component template and synchronous work, apply one change, then recapture the same interaction.'\n    }));\n  }\n\n  if (metrics.wastedPercentage >= 30) {\n    findings.push(finding({\n      kind: 'wasted-checks', severity: metrics.wastedPercentage >= 70 ? 'high' : 'medium', confidence: 'medium',\n      title: 'Many observed checks produced no DOM mutation',\n      summary: `${metrics.wastedPercentage}% of checks in this capture had no observed DOM mutation.`,\n      evidence: [`${metrics.wastedChecks} checks classified as no-mutation`, `${metrics.componentCheckCount} component checks observed`],\n      action: 'Rank the affected components, then verify whether stable inputs, signals, or OnPush reduce checks without changing behavior.'\n    }));\n  }\n\n  for (const candidate of session.onPushCandidates.slice(0, 3)) {\n    findings.push(finding({\n      kind: 'onpush-opportunity', severity: candidate.opportunityPercentage >= 70 ? 'medium' : 'low', confidence: candidate.confidence,\n      title: `${candidate.name} is an OnPush experiment candidate`, summary: candidate.reason, componentName: candidate.name,\n      evidence: [`${candidate.opportunityPercentage}% observed no-mutation check share`, `${candidate.totalChecks} checks sampled`],\n      action: 'Try OnPush in a candidate branch and use a before/after interaction comparison to verify the result.'\n    }));\n  }\n\n  for (const report of session.referentialInstabilityReports.slice(0, 3)) {\n    findings.push(finding({\n      kind: 'referential-instability', severity: report.unstableRefPct >= 60 ? 'high' : 'medium', confidence: 'medium',\n      title: `${report.componentName}.${report.inputName} repeatedly changed reference`,\n      summary: 'A new reference was observed with a deeply equal sampled value.', componentName: report.componentName,\n      evidence: [`${report.unstableRefCount} unstable references`, `${report.unstableRefPct}% of sampled renders`],\n      action: 'Stabilize the input value at its producer and recapture to confirm fewer checks.'\n    }));\n  }\n\n  if (session.zonePollutionEvents.length) {\n    findings.push(finding({\n      kind: 'zone-pollution', severity: 'medium', confidence: 'medium', title: 'Async work triggered change detection without a nearby user event',\n      summary: 'This applies to Zone-based Angular applications; modern zoneless applications should ignore this finding.',\n      evidence: [`${session.zonePollutionEvents.length} suspected cycles`, ...session.zonePollutionEvents.slice(0, 2).map((event) => `${event.source}: ${round(event.cycleDuration)}ms`)],\n      action: 'If this app uses Zone.js, move noisy async work outside Angular or reduce its frequency, then compare the interaction again.'\n    }));\n  }\n\n  for (const name of session.detachedComponents ?? session.leakedComponents ?? []) {\n    findings.push(finding({\n      kind: 'detached-component', severity: 'low', confidence: 'low', title: `${name} had a disconnected host element`,\n      summary: 'A disconnected element was observed. This is not proof that the component is retained or leaking memory.', componentName: name,\n      evidence: ['Host element was disconnected when sampled'],\n      action: 'Confirm retention with heap snapshots or allocation profiling before treating this as a memory leak.'\n    }));\n  }\n  return findings.sort((a, b) => b.score - a.score || a.title.localeCompare(b.title));\n}\n\nexport function createInteractionReport(name: string, session: SessionExportData, startedAt?: string): InteractionReport {\n  const metrics = metricsFor(session);\n  return {\n    schemaVersion: 1, name: name.trim() || 'Captured interaction',\n    startedAt: startedAt ?? session.exportedAt, finishedAt: session.exportedAt,\n    url: session.url, viewport: session.viewport, metrics,\n    findings: rankedFindings(session, metrics), session\n  };\n}\n\nfunction delta(baseline: number, candidate: number): InteractionMetricDelta {\n  return { baseline, candidate, absolute: round(candidate - baseline), percentage: baseline === 0 ? null : round(((candidate - baseline) / baseline) * 100) };\n}\n\nexport function compareInteractionReports(baseline: InteractionReport, candidate: InteractionReport): InteractionComparison {\n  const deltas = {\n    totalCycleDuration: delta(baseline.metrics.totalCycleDuration, candidate.metrics.totalCycleDuration),\n    maxCycleDuration: delta(baseline.metrics.maxCycleDuration, candidate.metrics.maxCycleDuration),\n    wastedPercentage: delta(baseline.metrics.wastedPercentage, candidate.metrics.wastedPercentage),\n    budgetViolationCount: delta(baseline.metrics.budgetViolationCount, candidate.metrics.budgetViolationCount)\n  };\n  const regressions: string[] = [];\n  if (deltas.totalCycleDuration.percentage !== null && deltas.totalCycleDuration.percentage > 10) regressions.push(`Total cycle time increased ${deltas.totalCycleDuration.percentage}%.`);\n  if (deltas.maxCycleDuration.percentage !== null && deltas.maxCycleDuration.percentage > 10) regressions.push(`Maximum cycle time increased ${deltas.maxCycleDuration.percentage}%.`);\n  if (deltas.wastedPercentage.absolute > 5) regressions.push(`No-mutation check share increased ${deltas.wastedPercentage.absolute} points.`);\n  if (deltas.budgetViolationCount.absolute > 0) regressions.push(`${deltas.budgetViolationCount.absolute} additional budget violation(s).`);\n  const improvements = [deltas.totalCycleDuration.percentage, deltas.maxCycleDuration.percentage].filter((value) => value !== null && value < -10).length;\n  return { schemaVersion: 1, name: `${baseline.name}: baseline vs candidate`, outcome: regressions.length ? 'regressed' : improvements ? 'improved' : 'unchanged', baseline, candidate, deltas, regressions };\n}\n\nfunction escapeHtml(value: string): string {\n  return value.replace(/[&<>\"']/g, (character) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#039;' })[character] ?? character);\n}\n\nexport function formatInteractionReportMarkdown(report: InteractionReport): string {\n  const lines = [`# Angular Render Scan: ${report.name}`, '', `**Result:** ${report.findings.length ? `${report.findings.length} ranked finding(s)` : 'No actionable finding'}`, '',\n    `- Cycles: ${report.metrics.cycleCount}`, `- Total cycle time: ${report.metrics.totalCycleDuration}ms`, `- Maximum cycle: ${report.metrics.maxCycleDuration}ms`,\n    `- No-mutation check share: ${report.metrics.wastedPercentage}%`, `- Budget violations: ${report.metrics.budgetViolationCount}`, '', '## Ranked findings', ''];\n  if (!report.findings.length) lines.push('No actionable findings were observed in this interaction.');\n  report.findings.forEach((item, index) => lines.push(`### ${index + 1}. ${item.title}`, '', `${item.summary}`, '', `**Evidence:** ${item.evidence.join('; ')}`, '', `**Next action:** ${item.action}`, ''));\n  lines.push('> CPU and FPS are environmental context only. Disconnected elements and OnPush opportunity shares are signals to verify, not proven leaks or savings.');\n  return lines.join('\\n');\n}\n\nexport function formatInteractionReportHtml(report: InteractionReport): string {\n  const findings = report.findings.map((item, index) => `<section><h2>${index + 1}. ${escapeHtml(item.title)}</h2><p>${escapeHtml(item.summary)}</p><p><strong>Evidence:</strong> ${escapeHtml(item.evidence.join('; '))}</p><p><strong>Next action:</strong> ${escapeHtml(item.action)}</p></section>`).join('');\n  return `<!doctype html><html><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width\"><title>${escapeHtml(report.name)}</title><style>body{font:15px/1.5 system-ui;max-width:860px;margin:40px auto;padding:0 20px;color:#172033}header,section{border:1px solid #dbe2ea;border-radius:12px;padding:20px;margin:16px 0}dl{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px}dt{color:#667085}dd{font-size:22px;font-weight:700;margin:0}small{color:#667085}</style></head><body><header><h1>${escapeHtml(report.name)}</h1><dl><div><dt>Cycles</dt><dd>${report.metrics.cycleCount}</dd></div><div><dt>Total cycle time</dt><dd>${report.metrics.totalCycleDuration}ms</dd></div><div><dt>Maximum cycle</dt><dd>${report.metrics.maxCycleDuration}ms</dd></div><div><dt>No-mutation share</dt><dd>${report.metrics.wastedPercentage}%</dd></div></dl></header>${findings || '<section><h2>No actionable findings</h2></section>'}<small>CPU and FPS are context only. Disconnected elements and OnPush opportunity shares require verification.</small></body></html>`;\n}\n","import { AngularRenderScanOverlay } from '../infrastructure/ui/overlay';\nimport { getResolvedOptions, setResolvedOptions } from '../domain/options';\nimport {\n  finishCycle,\n  resetStats,\n  startCycle,\n  getWastedStats as statsGetWastedStats,\n  getLeakedComponents as statsGetLeakedComponents,\n  getDetachedComponents as statsGetDetachedComponents,\n  getOnPushCandidates as statsGetOnPushCandidates,\n  getReferentialInstability as statsGetReferentialInstability,\n  getCdGraph as statsGetCdGraph,\n  clearStats,\n  getComponentCostEntries,\n  getRegisteredComponentEntries,\n  registerGetRenderCauseCallback\n} from './stats';\nimport type {\n  AngularRenderCycle,\n  AngularRenderEntry,\n  AngularRenderScanOptions,\n  BudgetViolation,\n  CdTriggerAttribution,\n  OnPushCandidate,\n  ReferentialInstabilityReport,\n  SessionExportData,\n  WastedStats,\n  ZonePollutionEvent,\n  CdGraph,\n  RenderCause,\n  SignalDependencyGraph,\n  ComponentCostEntry,\n  InteractionComparison,\n  InteractionReport,\n  SignalDependencyNode,\n  SignalDependencyEdge\n} from '../domain/entities';\nimport {\n  compareInteractionReports,\n  createInteractionReport,\n  formatInteractionReportHtml,\n  formatInteractionReportMarkdown\n} from './interaction';\n\n// Register callback for stats to query render cause to avoid circular imports\nregisterGetRenderCauseCallback((name) => {\n  return findRenderCauseForComponent(name, activeCycleTrigger);\n});\n\nlet overlay: AngularRenderScanOverlay | undefined;\nlet activeCycleId = 0;\nlet activeCycleStartedAt = 0;\nlet lastCycle: AngularRenderCycle | undefined;\nlet implicitCycleScheduled = false;\nlet recentCycles: AngularRenderCycle[] = [];\nlet activeSessionBudgetViolations: BudgetViolation[] = [];\nlet activeZonePollutionEvents: ZonePollutionEvent[] = [];\nlet activeInteraction: { name: string; startedAt: string; startedAtMs: number; afterCycleId: number } | undefined;\nlet latestInteractionReport: InteractionReport | undefined;\nlet interactionBaseline: InteractionReport | undefined;\n\n// v0.2 state tracking\nlet activeCycleTrigger: CdTriggerAttribution | undefined;\nlet recentSignalWrites: { name: string; action: 'set' | 'update'; stack?: string[]; timestamp: number; isWasted: boolean }[] = [];\nlet activeCheckingComponentId: string | null = null;\nlet activeCheckingComponentName: string | null = null;\nlet activeComputedSignalName: string | null = null;\nconst dependencyEdges = new Set<string>();\nconst signalUpdateCounts = new Map<string, { total: number; wasted: number; kind: 'signal' | 'computed' }>();\n\n// Lazily-loaded Zone tracker references (avoid importing in test/non-Zone envs)\nlet _resolveTrigger: (() => CdTriggerAttribution) | null = null;\nlet _resetCycleTrigger: (() => void) | null = null;\nlet _notifySignalWrite: (() => void) | null = null;\n\nasync function ensureZoneTracker() {\n  if (_resolveTrigger) return;\n  try {\n    const mod = await import('../infrastructure/angular/zone-tracker');\n    _resolveTrigger = mod.resolveTriggerAttribution;\n    _resetCycleTrigger = mod.resetCycleTriggerState;\n    _notifySignalWrite = mod.notifySignalWrite;\n  } catch {\n    // Zone tracker unavailable\n  }\n}\n// Pre-load asynchronously so it's ready by the time the first cycle fires\nensureZoneTracker();\n\nlet scheduleTask = (fn: () => void) => queueMicrotask(fn);\n\nexport function setTaskScheduler(scheduler: (fn: () => void) => void) {\n  scheduleTask = scheduler;\n}\n\nexport function scan(options?: AngularRenderScanOptions): void {\n  const resolved = setResolvedOptions(options ?? {}, {\n    persistEnabled: false,\n    preferStoredEnabled: true\n  });\n  if (!overlay && typeof document !== 'undefined') {\n    overlay = new AngularRenderScanOverlay(resolved, (enabled) => setOptions({ enabled }));\n  }\n  overlay?.updateOptions(resolved);\n}\n\nexport function setOptions(options: Partial<AngularRenderScanOptions>): void {\n  const resolved = setResolvedOptions(options);\n  overlay?.updateOptions(resolved);\n}\n\nexport function getOptions() {\n  return getResolvedOptions();\n}\n\nexport function stop(): void {\n  overlay?.destroy();\n  overlay = undefined;\n  resetStats();\n  clearRecording();\n  lastCycle = undefined;\n  activeCycleId = 0;\n  activeCycleStartedAt = 0;\n  implicitCycleScheduled = false;\n  activeSessionBudgetViolations = [];\n  activeZonePollutionEvents = [];\n  activeInteraction = undefined;\n  latestInteractionReport = undefined;\n  interactionBaseline = undefined;\n}\n\nexport function beginCycle(): number {\n  const options = getResolvedOptions();\n  if (!options.enabled) {\n    return 0;\n  }\n\n  scan();\n  activeCycleId = startCycle();\n  activeCycleStartedAt = performance.now();\n\n  // Resolve trigger at the start of the cycle (when tick starts)\n  let trigger: CdTriggerAttribution | undefined;\n  if (_resolveTrigger) {\n    trigger = _resolveTrigger();\n  }\n  activeCycleTrigger = trigger;\n  _resetCycleTrigger?.();\n\n  options.onCycleStart?.();\n  return activeCycleId;\n}\n\nfunction getRendersInLastSecond(id: string, now: number): number {\n  // The cycle being finalized is not in recentCycles yet, so include it here.\n  let count = 1;\n  for (let i = recentCycles.length - 1; i >= 0; i--) {\n    const cycle = recentCycles[i];\n    if (now - cycle.finishedAt > 1000) {\n      break;\n    }\n    if (cycle.entries.some(e => e.id === id)) {\n      count++;\n    }\n  }\n  return count;\n}\n\nexport function endCycle(cycleId = activeCycleId): AngularRenderCycle | undefined {\n  if (!cycleId) {\n    return undefined;\n  }\n\n  const options = getResolvedOptions();\n  const finishedAt = performance.now();\n  const cycle = finishCycle(cycleId, activeCycleStartedAt, finishedAt, options);\n\n  // ─── CD Trigger Attribution ───────────────────────────────────────────────\n  const trigger = activeCycleTrigger;\n  if (trigger) {\n    cycle.trigger = trigger;\n    cycle.isZonePollution = trigger.isZonePollution;\n  }\n\n  // ─── Zone Pollution Detection ─────────────────────────────────────────────\n  if (trigger?.isZonePollution && cycle.entries.length > 0) {\n    const pollutionEvent: ZonePollutionEvent = {\n      timestamp: Date.now(),\n      source: trigger.source,\n      detail: trigger.detail,\n      callSite: trigger.callSite,\n      componentCount: cycle.entries.length,\n      cycleDuration: cycle.duration\n    };\n    const maxPollution = options.maxZonePollutionEvents ?? 50;\n    activeZonePollutionEvents.push(pollutionEvent);\n    if (activeZonePollutionEvents.length > maxPollution) {\n      activeZonePollutionEvents = activeZonePollutionEvents.slice(-maxPollution);\n    }\n    options.onZonePollution?.(pollutionEvent);\n    if (typeof window !== 'undefined') {\n      window.dispatchEvent(new CustomEvent('angular-render-scan:zone-pollution', { detail: pollutionEvent }));\n    }\n  }\n\n  lastCycle = cycle;\n  recordRecentCycle(cycle, options.maxRecordedCycles);\n\n  // ─── Budget validation ────────────────────────────────────────────────────\n  const now = performance.now();\n  const realNowTimestamp = Date.now();\n  if (options.budgets) {\n    const { warnMs, errorMs, maxRendersPerSecond } = options.budgets;\n    for (const entry of cycle.entries) {\n      if (warnMs !== undefined && entry.latestDuration > warnMs && entry.latestDuration <= (errorMs ?? Infinity)) {\n        const violation: BudgetViolation = {\n          componentName: entry.name,\n          selector: entry.selector ?? '',\n          type: 'warn',\n          actual: entry.latestDuration,\n          budget: warnMs,\n          message: `Component ${entry.name} exceeded warning budget of ${warnMs}ms (took ${entry.latestDuration.toFixed(1)}ms)`,\n          timestamp: realNowTimestamp\n        };\n        activeSessionBudgetViolations.push(violation);\n        options.onBudgetViolation?.(violation);\n        if (typeof window !== 'undefined') {\n          window.dispatchEvent(new CustomEvent('angular-render-scan:budget-violation', { detail: violation }));\n        }\n      }\n      if (errorMs !== undefined && entry.latestDuration > errorMs) {\n        const violation: BudgetViolation = {\n          componentName: entry.name,\n          selector: entry.selector ?? '',\n          type: 'error',\n          actual: entry.latestDuration,\n          budget: errorMs,\n          message: `Component ${entry.name} exceeded error budget of ${errorMs}ms (took ${entry.latestDuration.toFixed(1)}ms)`,\n          timestamp: realNowTimestamp\n        };\n        activeSessionBudgetViolations.push(violation);\n        options.onBudgetViolation?.(violation);\n        if (typeof window !== 'undefined') {\n          window.dispatchEvent(new CustomEvent('angular-render-scan:budget-violation', { detail: violation }));\n        }\n      }\n      if (maxRendersPerSecond !== undefined) {\n        const rendersInLastSec = getRendersInLastSecond(entry.id, now);\n        if (rendersInLastSec > maxRendersPerSecond) {\n          const violation: BudgetViolation = {\n            componentName: entry.name,\n            selector: entry.selector ?? '',\n            type: 'render-rate',\n            actual: rendersInLastSec,\n            budget: maxRendersPerSecond,\n            message: `Component ${entry.name} exceeded max render rate budget of ${maxRendersPerSecond}/sec (rendered ${rendersInLastSec} times in last second)`,\n            timestamp: realNowTimestamp\n          };\n          activeSessionBudgetViolations.push(violation);\n          options.onBudgetViolation?.(violation);\n          if (typeof window !== 'undefined') {\n            window.dispatchEvent(new CustomEvent('angular-render-scan:budget-violation', { detail: violation }));\n          }\n        }\n      }\n    }\n  }\n\n  for (const entry of cycle.entries) {\n    options.onRender?.(entry);\n  }\n  options.onCycleFinish?.(cycle);\n  overlay?.showCycle(cycle);\n\n  if (options.log && cycle.entries.length > 0) {\n    const triggerLabel = trigger\n      ? ` [${trigger.source}${trigger.isZonePollution ? ' ⚠️ POLLUTION' : ''}]`\n      : '';\n    console.groupCollapsed(\n      `%c[angular-render-scan] cycle ${cycle.id} - ${cycle.duration.toFixed(2)}ms, ${cycle.renderedCount} components${triggerLabel}`,\n      'color: #7c3aed; font-weight: bold;'\n    );\n    const tableData = cycle.entries.map((e) => ({\n      Name: e.name,\n      Count: e.count,\n      'Time (ms)': Number(e.latestDuration.toFixed(2)),\n      'Avg (ms)': Number(e.averageDuration.toFixed(2)),\n      Reason: e.reason ?? 'unknown',\n      CD: e.cdStrategy ?? 'unknown',\n      OnPush: e.isOnPushCandidate ? '⚡ candidate' : ''\n    }));\n    console.table(tableData);\n    if (trigger) {\n      console.log(\n        '%c[trigger]',\n        'color: #0ea5e9;',\n        trigger.source,\n        trigger.detail ?? '',\n        trigger.isZonePollution ? '⚠️ Zone Pollution' : ''\n      );\n    }\n    console.groupEnd();\n  }\n\n  if (activeCycleId === cycleId) {\n    activeCycleId = 0;\n    activeCycleStartedAt = 0;\n  }\n  implicitCycleScheduled = false;\n\n  return cycle;\n}\n\nexport function currentCycleId(): number {\n  return activeCycleId;\n}\n\nexport function ensureCycleForComponentCheck(): number {\n  if (activeCycleId) {\n    return activeCycleId;\n  }\n\n  const cycleId = beginCycle();\n  if (!cycleId || implicitCycleScheduled) {\n    return cycleId;\n  }\n\n  implicitCycleScheduled = true;\n  scheduleTask(() => {\n    if (activeCycleId === cycleId) {\n      endCycle(cycleId);\n    }\n  });\n  return cycleId;\n}\n\nexport function getLastCycle(): AngularRenderCycle | undefined {\n  return lastCycle;\n}\n\nexport function getRecording(): AngularRenderCycle[] {\n  return recentCycles.slice();\n}\n\nexport function getRegisteredComponents(): AngularRenderEntry[] {\n  return getRegisteredComponentEntries();\n}\n\nexport function clearRecording(): void {\n  recentCycles = [];\n  activeZonePollutionEvents = [];\n  activeSessionBudgetViolations = [];\n  recentSignalWrites = [];\n  dependencyEdges.clear();\n  signalUpdateCounts.clear();\n  activeCheckingComponentId = null;\n  activeCheckingComponentName = null;\n  activeComputedSignalName = null;\n  activeCycleTrigger = undefined;\n  clearStats();\n}\n\n// ─── v0.2 Signal dependency & cause tracking logic ────────────────────────────\n\nexport function setActiveCheckingComponent(id: string | null, name: string | null): void {\n  activeCheckingComponentId = id;\n  activeCheckingComponentName = name;\n}\n\nexport function setActiveComputedSignal(name: string | null): void {\n  activeComputedSignalName = name;\n}\n\nexport function recordSignalRead(name: string, kind: 'signal' | 'computed'): void {\n  if (!signalUpdateCounts.has(name)) {\n    signalUpdateCounts.set(name, { total: 0, wasted: 0, kind });\n  }\n\n  let consumer: string | null = null;\n  let consumerKind: 'component' | 'computed' | null = null;\n\n  if (activeComputedSignalName) {\n    consumer = activeComputedSignalName;\n    consumerKind = 'computed';\n  } else if (activeCheckingComponentName) {\n    consumer = activeCheckingComponentName;\n    consumerKind = 'component';\n  }\n\n  if (consumer && consumer !== name) {\n    const edgeKey = `${name}->${consumer}`;\n    dependencyEdges.add(edgeKey);\n\n    if (consumerKind === 'computed' && !signalUpdateCounts.has(consumer)) {\n      signalUpdateCounts.set(consumer, { total: 0, wasted: 0, kind: 'computed' });\n    }\n  }\n}\n\nexport function recordSignalWrite(name: string, action: 'set' | 'update', stack: string[], isWasted: boolean): void {\n  if (recentSignalWrites.length > 0) {\n    const last = recentSignalWrites[recentSignalWrites.length - 1];\n    if (last.name === name && last.action === 'update' && action === 'set' && Date.now() - last.timestamp < 2) {\n      return;\n    }\n  }\n\n  recentSignalWrites.push({\n    name,\n    action,\n    stack,\n    timestamp: Date.now(),\n    isWasted\n  });\n  if (recentSignalWrites.length > 200) {\n    recentSignalWrites = recentSignalWrites.slice(-200);\n  }\n\n  const stats = signalUpdateCounts.get(name) || { total: 0, wasted: 0, kind: 'signal' };\n  stats.total += 1;\n  if (isWasted) {\n    stats.wasted += 1;\n  }\n  signalUpdateCounts.set(name, stats);\n\n  // Notify the zone tracker\n  _notifySignalWrite?.();\n}\n\nfunction isSignalDependent(consumer: string, producer: string): boolean {\n  if (consumer === producer) return true;\n\n  const adj = new Map<string, string[]>();\n  for (const edge of dependencyEdges) {\n    const [from, to] = edge.split('->');\n    if (!adj.has(from)) adj.set(from, []);\n    adj.get(from)!.push(to);\n  }\n\n  const visited = new Set<string>();\n  const queue = [producer];\n  while (queue.length > 0) {\n    const curr = queue.shift()!;\n    if (curr === consumer) return true;\n    if (visited.has(curr)) continue;\n    visited.add(curr);\n\n    const next = adj.get(curr) || [];\n    for (const n of next) {\n      if (!visited.has(n)) {\n        queue.push(n);\n      }\n    }\n  }\n  return false;\n}\n\nexport function findRenderCauseForComponent(componentName: string, cycleTrigger: CdTriggerAttribution | undefined): RenderCause | undefined {\n  if (!cycleTrigger) return undefined;\n\n  if (cycleTrigger.source === 'signal:write') {\n    const now = Date.now();\n    const possibleWrites = recentSignalWrites\n      .filter(w => now - w.timestamp < 1000)\n      .reverse();\n\n    for (const write of possibleWrites) {\n      if (isSignalDependent(componentName, write.name)) {\n        return {\n          trigger: 'signal:write',\n          source: write.name,\n          stack: write.stack,\n          timestamp: write.timestamp\n        };\n      }\n    }\n\n    if (possibleWrites.length > 0) {\n      const write = possibleWrites[0];\n      return {\n        trigger: 'signal:write',\n        source: write.name,\n        stack: write.stack,\n        timestamp: write.timestamp\n      };\n    }\n  }\n\n  return {\n    trigger: cycleTrigger.source,\n    source: cycleTrigger.detail,\n    stack: cycleTrigger.callSite ? [cycleTrigger.callSite] : undefined,\n    timestamp: Date.now()\n  };\n}\n\nexport function getRenderCause(component: string | Element): RenderCause | null {\n  const name = typeof component === 'string' ? component : component.tagName.toLowerCase();\n  \n  // Find the component's entry from the last cycle or stats\n  for (let i = recentCycles.length - 1; i >= 0; i--) {\n    const entry = recentCycles[i].entries.find(e => e.name === name || e.selector?.includes(name));\n    if (entry && entry.renderCause) {\n      return entry.renderCause;\n    }\n  }\n  return null;\n}\n\nexport function getSignalDependencyGraph(): SignalDependencyGraph {\n  const nodes: SignalDependencyNode[] = [];\n  const edges: SignalDependencyEdge[] = [];\n\n  const nodeNames = new Set<string>();\n  for (const [name, stats] of signalUpdateCounts.entries()) {\n    nodeNames.add(name);\n    nodes.push({\n      id: name,\n      name,\n      kind: stats.kind,\n      updateCount: stats.total,\n      wastedCount: stats.wasted\n    });\n  }\n\n  for (const edge of dependencyEdges) {\n    const [from, to] = edge.split('->');\n    nodeNames.add(from);\n    nodeNames.add(to);\n    edges.push({ fromId: from, toId: to });\n  }\n\n  for (const name of nodeNames) {\n    if (!signalUpdateCounts.has(name)) {\n      const isComponent = !name.includes('.') && /^[A-Z]/.test(name);\n      nodes.push({\n        id: name,\n        name,\n        kind: isComponent ? 'component' : 'signal',\n        updateCount: 0,\n        wastedCount: 0\n      });\n    }\n  }\n\n  return { nodes, edges };\n}\n\n// ─── New public exports ────────────────────────────────────────────────────────\n\nexport function getOnPushCandidates(threshold?: number): OnPushCandidate[] {\n  const opts = getResolvedOptions();\n  return statsGetOnPushCandidates(threshold ?? opts.onPushCandidateThreshold);\n}\n\nexport function getReferentialInstability(minUnstable = 1): ReferentialInstabilityReport[] {\n  return statsGetReferentialInstability(minUnstable);\n}\n\nexport function getZonePollutionEvents(): ZonePollutionEvent[] {\n  return [...activeZonePollutionEvents];\n}\n\nexport function getCdGraph(): CdGraph {\n  return statsGetCdGraph();\n}\n\n// ─── AI prompt ────────────────────────────────────────────────────────────────\n\nexport function getAIPrompt(fps?: number): string {\n  const options = getResolvedOptions();\n  const cycles = recentCycles.length > 0 ? recentCycles : lastCycle ? [lastCycle] : [];\n  if (cycles.length === 0 || cycles.every((cycle) => cycle.entries.length === 0)) {\n    return '';\n  }\n\n  return buildAIPrompt(cycles, options, fps);\n}\n\nexport async function copyAIPrompt(fps?: number): Promise<boolean> {\n  const prompt = getAIPrompt(fps);\n  if (!prompt || typeof navigator === 'undefined' || !navigator.clipboard?.writeText) {\n    return false;\n  }\n\n  try {\n    await navigator.clipboard.writeText(prompt);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\nfunction recordRecentCycle(cycle: AngularRenderCycle, maxRecordedCycles: number): void {\n  recentCycles.push(cycle);\n  if (recentCycles.length > maxRecordedCycles) {\n    recentCycles = recentCycles.slice(-maxRecordedCycles);\n  }\n}\n\nfunction buildAIPrompt(cycles: AngularRenderCycle[], options = getResolvedOptions(), fps?: number): string {\n  const latest = cycles[cycles.length - 1];\n  const entries = topEntries(cycles, Math.min(options.maxLabelCount, 8));\n  const issueEntries = issueEntriesForPrompt(cycles, options);\n  const context = options.promptContext.trim();\n  const environment = getPromptEnvironment(fps);\n\n  const slowThreshold = options.budgets?.warnMs ?? 10;\n  const fastThreshold = slowThreshold / 2;\n\n  const onPushCandidates = statsGetOnPushCandidates(options.onPushCandidateThreshold);\n  const pollutionEvents = activeZonePollutionEvents.slice(-5);\n  const refInstability = statsGetReferentialInstability().slice(0, 5);\n\n  return [\n    '# ⚡️ Angular change-detection Performance Audit (via angular-render-scan)',\n    'This prompt is self-contained and includes the telemetry evidence of slow/actionable components in the application.',\n    context ? `* **Project context:** ${context}` : '',\n    '',\n    '## 💻 Environment:',\n    ...environment,\n    '',\n    '## ⏱️ Latest Render Cycle Details:',\n    `* **Cycle id:** #${latest.id}`,\n    `* **Duration:** \\`${formatMs(latest.duration)}\\``,\n    latest.trigger\n      ? `* **Trigger:** \\`${latest.trigger.source}\\`${latest.trigger.detail ? ` (${latest.trigger.detail})` : ''}${latest.trigger.isZonePollution ? ' ⚠️ Zone Pollution detected' : ''}`\n      : '',\n    `* **Rendered components count:** ${latest.renderedCount}`,\n    latest.slowest\n      ? `* **Slowest component:** \\`${latest.slowest.name}\\` (${formatMs(latest.slowest.latestDuration)}, reason: \\`${latest.slowest.reason ?? 'unknown'}\\`)`\n      : '',\n    `* **Thresholds:** Fast <= \\`${formatMs(fastThreshold)}\\` | Slow >= \\`${formatMs(slowThreshold)}\\``,\n    '',\n    '## 📈 Recent cycle history:',\n    ...cycles.slice(-8).map(formatPromptCycle),\n    '',\n    onPushCandidates.length > 0 ? '## ⚡️ OnPush Migration Candidates:' : '',\n    onPushCandidates.length > 0\n      ? 'These components have a high observed no-mutation check share. Treat OnPush as an experiment and verify it with the same interaction.'\n      : '',\n    ...onPushCandidates.slice(0, 5).map((c, i) =>\n      `${i + 1}. **${c.name}** (${c.selector}) — ${c.opportunityPercentage}% observed no-mutation share [${c.confidence} confidence] — ${c.reason}`\n    ),\n    '',\n    pollutionEvents.length > 0 ? '## ⚠️ Zone Pollution Events (last 5):' : '',\n    pollutionEvents.length > 0\n      ? 'For Zone.js applications only: these cycles followed async operations without a nearby user interaction.'\n      : '',\n    ...pollutionEvents.map(e =>\n      `- ${e.source}${e.detail ? ` (${e.detail})` : ''} — ${e.componentCount} components ran, ${formatMs(e.cycleDuration)}`\n    ),\n    '',\n    refInstability.length > 0 ? '## 🔄 Referentially Unstable Inputs:' : '',\n    refInstability.length > 0\n      ? 'These inputs receive new object references with the same value, causing unnecessary OnPush re-renders.'\n      : '',\n    ...refInstability.map(r =>\n      `- **${r.componentName}** \\`@Input() ${r.inputName}\\`: ${r.unstableRefCount}/${r.totalRenders} renders (${r.unstableRefPct}%) had same value, new reference`\n    ),\n    '',\n    '## 🚨 Slow/error component issues to fix:',\n    ...issueEntries.map((entry, index) => formatIssueEntry(entry, index + 1, latest.duration, slowThreshold)),\n    issueEntries.length === 0\n      ? '- No component exceeded the configured slow threshold in the captured cycles.'\n      : '',\n    '',\n    '## 📊 Reference metrics (top observed components):',\n    'Overall render footprint and frequencies for active components:',\n    ...entries.map((entry, index) => formatReferenceEntry(entry, index + 1)),\n    '',\n    '## 🛠️ Optimization Instructions:',\n    'Please identify the likely root causes for each slow/error component issue and suggest concrete Angular fixes. Focus on ChangeDetectionStrategy.OnPush, signal/computed usage, template calculations, input reference stabilization (memo patterns, pure pipes, stable factories), Zone.js pollution elimination (NgZone.runOutsideAngular), and list tracking (trackBy). For referentially unstable inputs, suggest using pure pipes or stable object factories. Prioritize resolving the highest estimated cost first. Generate complete, refactored TypeScript templates showing optimized before/after structures.'\n  ].filter(Boolean).join('\\n');\n}\n\nfunction topEntries(cycles: AngularRenderCycle[], limit: number): AngularRenderEntry[] {\n  const latestById = new Map<string, AngularRenderEntry>();\n  for (const cycle of cycles) {\n    for (const entry of cycle.entries) {\n      latestById.set(entry.id, entry);\n    }\n  }\n\n  return [...latestById.values()]\n    .sort((a, b) => (b.latestDuration - a.latestDuration) || (b.count - a.count))\n    .slice(0, limit);\n}\n\nfunction issueEntriesForPrompt(cycles: AngularRenderCycle[], options = getResolvedOptions()): AngularRenderEntry[] {\n  const entries = topEntries(cycles, Math.min(options.maxLabelCount, 8));\n  const slowThreshold = options.budgets?.warnMs ?? 10;\n  return entries.filter((entry) => entry.latestDuration >= slowThreshold);\n}\n\nfunction formatIssueEntry(\n  entry: AngularRenderEntry,\n  index: number,\n  latestCycleDuration: number,\n  slowThresholdMs: number\n): string {\n  const overBy = Math.max(0, entry.latestDuration - slowThresholdMs);\n  const cycleShare = latestCycleDuration > 0 ? (entry.latestDuration / latestCycleDuration) * 100 : 0;\n  const estimatedTotalCost = entry.averageDuration * entry.count;\n  const changedInputsStr = entry.changedInputs?.length\n    ? entry.changedInputs\n        .map((input) =>\n          `${input.name} ${input.previous} -> ${input.current}${input.isReferentiallyUnstable ? ' [UNSTABLE REF]' : ''}`\n        )\n        .join('; ')\n    : 'none captured';\n\n  return [\n    `### 🛑 Component #${index}: \\`${entry.name}\\``,\n    `   Selector: ${entry.selector ?? '-'}`,\n    `   CD Strategy: ${entry.cdStrategy ?? 'unknown'}${entry.isOnPushCandidate ? ' → OnPush candidate ⚡' : ''}`,\n    `   Performance Issue: latest render ${formatMs(entry.latestDuration)} exceeded slow threshold ${formatMs(slowThresholdMs)} by ${formatMs(overBy)}.`,\n    `   Cost: ${formatMs(entry.latestDuration)} in latest cycle, about ${cycleShare.toFixed(0)}% of latest cycle time, estimated observed total ${formatMs(estimatedTotalCost)} across ${entry.count} renders.`,\n    `   Average render: ${formatMs(entry.averageDuration)}`,\n    `   Render reason: ${entry.reason ?? 'unknown'}`,\n    `   Changed inputs: ${changedInputsStr}`\n  ].join('\\n');\n}\n\nfunction formatReferenceEntry(entry: AngularRenderEntry, index: number): string {\n  return `${index}. ${entry.name}: selector ${entry.selector ?? '-'}, latest ${formatMs(entry.latestDuration)}, avg ${formatMs(entry.averageDuration)}, renders ${entry.count}, reason ${entry.reason ?? 'unknown'}, CD: ${entry.cdStrategy ?? '?'}${entry.isOnPushCandidate ? ' ⚡' : ''}`;\n}\n\nfunction formatPromptCycle(cycle: AngularRenderCycle): string {\n  const slowest = cycle.slowest ? `${cycle.slowest.name} ${formatMs(cycle.slowest.latestDuration)}` : 'none';\n  const trigger = cycle.trigger\n    ? ` [${cycle.trigger.source}${cycle.isZonePollution ? ' ⚠️' : ''}]`\n    : '';\n  return `- #${cycle.id}: ${formatMs(cycle.duration)}, ${cycle.renderedCount} components, slowest ${slowest}${trigger}`;\n}\n\nfunction getPromptEnvironment(fps?: number): string[] {\n  const viewport =\n    typeof window !== 'undefined'\n      ? `${window.innerWidth}x${window.innerHeight} @${window.devicePixelRatio || 1}x`\n      : '';\n  const url = typeof window !== 'undefined' ? window.location.href : '';\n  const userAgent = typeof navigator !== 'undefined' ? navigator.userAgent : '';\n\n  return [\n    `- Captured at: ${new Date().toISOString()}`,\n    typeof fps === 'number' && Number.isFinite(fps) ? `- FPS: ${fps}` : '',\n    viewport ? `- Viewport: ${viewport}` : '',\n    url ? `- URL: ${url}` : '',\n    userAgent ? `- User agent: ${userAgent}` : ''\n  ].filter(Boolean);\n}\n\nfunction formatMs(value: number): string {\n  return `${value.toFixed(1)}ms`;\n}\n\nexport function getSessionData(): SessionExportData {\n  const options = getResolvedOptions();\n  const wasted = statsGetWastedStats();\n  const detached = statsGetDetachedComponents().map((c) => c.name);\n  const onPushCandidates = statsGetOnPushCandidates(options.onPushCandidateThreshold);\n  const refInstability = statsGetReferentialInstability();\n\n  const mappedCycles = recentCycles.map((cycle) => ({\n    id: cycle.id,\n    startedAt: cycle.startedAt,\n    finishedAt: cycle.finishedAt,\n    duration: cycle.duration,\n    renderedCount: cycle.renderedCount,\n    entries: cycle.entries.map((e) => ({\n      id: e.id,\n      name: e.name,\n      count: e.count,\n      latestDuration: e.latestDuration,\n      averageDuration: e.averageDuration,\n      latestCycleId: e.latestCycleId,\n      reason: e.reason,\n      changedInputs: e.changedInputs,\n      selector: e.selector,\n      wastedChecks: e.wastedChecks,\n      wastedPercentage: e.wastedPercentage,\n      mutationType: e.mutationType,\n      cdStrategy: e.cdStrategy,\n      isOnPushCandidate: e.isOnPushCandidate\n    })),\n    waterfall: cycle.waterfall,\n    trigger: cycle.trigger,\n    isZonePollution: cycle.isZonePollution\n  }));\n\n  const viewport =\n    typeof window !== 'undefined'\n      ? `${window.innerWidth}x${window.innerHeight} @${window.devicePixelRatio || 1}x`\n      : '';\n  const url = typeof window !== 'undefined' ? window.location.href : '';\n  const userAgent = typeof navigator !== 'undefined' ? navigator.userAgent : '';\n\n  return {\n    exportedAt: new Date().toISOString(),\n    url,\n    viewport,\n    userAgent,\n    options,\n    cycles: mappedCycles,\n    wastedStats: wasted,\n    budgetViolations: activeSessionBudgetViolations,\n    detachedComponents: detached,\n    leakedComponents: detached,\n    onPushCandidates,\n    zonePollutionEvents: [...activeZonePollutionEvents],\n    referentialInstabilityReports: refInstability\n  };\n}\n\n/** Start a named, user-visible interaction capture. Only subsequent cycles are included. */\nexport function beginInteraction(name: string): void {\n  activeInteraction = {\n    name: name.trim() || 'Captured interaction',\n    startedAt: new Date().toISOString(),\n    startedAtMs: Date.now(),\n    afterCycleId: recentCycles.at(-1)?.id ?? activeCycleId\n  };\n}\n\n/** Finish the active interaction and return ranked, portable evidence. */\nexport function endInteraction(): InteractionReport {\n  if (!activeInteraction) {\n    throw new Error('[angular-render-scan] No interaction capture is active. Call beginInteraction(name) first.');\n  }\n  const capture = activeInteraction;\n  activeInteraction = undefined;\n  const session = getSessionData();\n  const cycles = session.cycles.filter((cycle) => cycle.id > capture.afterCycleId);\n  const componentNames = new Set(cycles.flatMap((cycle) => cycle.entries.map((entry) => entry.name)));\n  const scoped: SessionExportData = {\n    ...session,\n    cycles,\n    budgetViolations: session.budgetViolations.filter((violation) => violation.timestamp >= capture.startedAtMs),\n    onPushCandidates: session.onPushCandidates.filter((candidate) => componentNames.has(candidate.name)),\n    referentialInstabilityReports: session.referentialInstabilityReports.filter((report) => componentNames.has(report.componentName)),\n    zonePollutionEvents: session.zonePollutionEvents.filter((event) => event.timestamp >= capture.startedAtMs)\n  };\n  latestInteractionReport = createInteractionReport(capture.name, scoped, capture.startedAt);\n  return latestInteractionReport;\n}\n\nexport function getInteractionReport(): InteractionReport | undefined {\n  return latestInteractionReport;\n}\n\nexport function setInteractionBaseline(report: InteractionReport): void {\n  interactionBaseline = report;\n}\n\nexport function compareWithInteractionBaseline(report = latestInteractionReport): InteractionComparison {\n  if (!interactionBaseline) throw new Error('[angular-render-scan] No baseline report is set.');\n  if (!report) throw new Error('[angular-render-scan] No candidate interaction report is available.');\n  return compareInteractionReports(interactionBaseline, report);\n}\n\nexport { compareInteractionReports, createInteractionReport, formatInteractionReportHtml, formatInteractionReportMarkdown };\n\nexport function setResolvedTriggerForTest(trigger: CdTriggerAttribution | undefined): void {\n  activeCycleTrigger = trigger;\n}\n\nexport {\n  statsGetWastedStats as getWastedStats,\n  statsGetLeakedComponents as getLeakedComponents,\n  statsGetDetachedComponents as getDetachedComponents,\n  getComponentCostEntries as getComponentCostAnalysis\n};\n","import {\n  beginCycle,\n  currentCycleId,\n  endCycle,\n  ensureCycleForComponentCheck,\n  setActiveCheckingComponent,\n  setActiveComputedSignal,\n  recordSignalRead,\n  recordSignalWrite\n} from '../../application/runtime';\nimport { recordComponentCheck, registerComponent, unregisterComponent } from '../../application/stats';\nimport { checkReferentialStability } from '../../application/referential-stability';\nimport { getResolvedOptions } from '../../domain/options';\nimport type { AngularRenderChangedInput, AngularRenderScanRenderDetails } from '../../domain/entities';\n\nconst ProfilerEventTemplateUpdateStart = 2;\nconst ProfilerEventTemplateUpdateEnd = 3;\n\n// How deep into a component's object graph we walk looking for nested signals.\nconst MAX_SIGNAL_PATCH_DEPTH = 3;\n\n// Constructor names we must never recurse into. Walking these mutates / wraps\n// Angular framework internals and corrupts them — e.g. reactive-forms controls\n// and router URL trees, whose children are plain-object containers that Angular\n// iterates with Object.keys(). See exclusions in the recursion branch below.\nconst FRAMEWORK_CTOR_EXCLUSIONS = [\n  'ElementRef',\n  'ViewContainerRef',\n  'ChangeDetectorRef',\n  'NgZone',\n  'ApplicationRef',\n  'Router',\n  'ActivatedRoute',\n  'UrlTree',\n  'UrlSegment',\n  'UrlSegmentGroup',\n  'AbstractControl',\n  'FormControl',\n  'FormGroup',\n  'FormArray',\n  'FormRecord',\n  'NgControl',\n  'EventEmitter'\n];\n\n// Per-prop scan for the signal symbol. Must NOT be cached across props: a cached\n// symbol would make us treat any later function-valued property as a signal.\nfunction getSignalSymbol(obj: any): symbol | undefined {\n  if (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) return undefined;\n  const sym = Reflect.ownKeys(obj).find(k => typeof k === 'symbol' && String(k).includes('SIGNAL'));\n  return sym as symbol | undefined;\n}\n\nexport function patchSignalsOnInstance(\n  instance: any,\n  compName: string,\n  visited: WeakSet<object> = new WeakSet(),\n  depth = 0\n): void {\n  if (!instance || typeof instance !== 'object') return;\n  // Track visited objects in a side WeakSet instead of writing a marker onto the\n  // instance. Writing an enumerable property pollutes Object.keys() of any object\n  // we touch, which breaks Angular containers (form controls, URL segments).\n  if (visited.has(instance)) return;\n  visited.add(instance);\n\n  const keys = Object.getOwnPropertyNames(instance);\n  for (const key of keys) {\n    let prop: any;\n    try {\n      prop = instance[key];\n    } catch {\n      continue;\n    }\n    if (!prop) continue;\n\n    const sym = getSignalSymbol(prop);\n    if (sym && typeof prop === 'function') {\n      const internalNode = prop[sym];\n      const debugName = internalNode?.debugName || `${compName}.${key}`;\n\n      if (!prop.__angularRenderScanPatched) {\n        const originalSignal = prop;\n        \n        const wrapped = function(this: any) {\n          const kind = typeof originalSignal.set === 'function' ? 'signal' : 'computed';\n          const previousComputed = (window as any).__angularActiveComputedSignalName || null;\n          if (kind === 'computed') {\n            (window as any).__angularActiveComputedSignalName = debugName;\n            setActiveComputedSignal(debugName);\n          }\n\n          recordSignalRead(debugName, kind);\n\n          try {\n            return originalSignal.apply(this, arguments);\n          } finally {\n            if (kind === 'computed') {\n              (window as any).__angularActiveComputedSignalName = previousComputed;\n              setActiveComputedSignal(previousComputed);\n            }\n          }\n        } as any;\n\n        Object.defineProperty(wrapped, '__angularRenderScanPatched', {\n          value: true,\n          enumerable: false,\n          configurable: true,\n          writable: true\n        });\n        wrapped[sym] = internalNode;\n        wrapped.toString = originalSignal.toString.bind(originalSignal);\n\n        if (typeof originalSignal.set === 'function') {\n          wrapped.set = function(val: any) {\n            const curVal = internalNode?.value;\n            const equal = internalNode?.equal || ((a: any, b: any) => a === b);\n            const isWasted = equal(curVal, val);\n\n            const err = new Error();\n            const stack = err.stack ? err.stack.split('\\n').slice(2) : [];\n            const cleanStack = stack\n              .map((f: any) => f.trim().replace(/^at\\s+/, ''))\n              .filter((f: any) => \n                !f.includes('angular-render-scan') && \n                !f.includes('zone.js') &&\n                !f.includes('node_modules')\n              );\n\n            recordSignalWrite(debugName, 'set', cleanStack, isWasted);\n            return originalSignal.set.apply(originalSignal, arguments);\n          };\n        }\n\n        if (typeof originalSignal.update === 'function') {\n          wrapped.update = function(fn: any) {\n            const curVal = internalNode?.value;\n            const newVal = fn(curVal);\n            const equal = internalNode?.equal || ((a: any, b: any) => a === b);\n            const isWasted = equal(curVal, newVal);\n\n            const err = new Error();\n            const stack = err.stack ? err.stack.split('\\n').slice(2) : [];\n            const cleanStack = stack\n              .map((f: any) => f.trim().replace(/^at\\s+/, ''))\n              .filter((f: any) => \n                !f.includes('angular-render-scan') && \n                !f.includes('zone.js') &&\n                !f.includes('node_modules')\n              );\n\n            recordSignalWrite(debugName, 'update', cleanStack, isWasted);\n            return originalSignal.update.apply(originalSignal, arguments);\n          };\n        }\n\n        if (typeof originalSignal.asReadonly === 'function') {\n          wrapped.asReadonly = originalSignal.asReadonly.bind(originalSignal);\n        }\n\n        instance[key] = wrapped;\n      }\n    } else if (depth < MAX_SIGNAL_PATCH_DEPTH && typeof prop === 'object' && prop !== null && !Array.isArray(prop)) {\n      // Only recurse into class instances that look like view models. Skip\n      // framework internals and plain-object containers (constructor `Object`),\n      // since those are the dictionaries Angular iterates with Object.keys().\n      const ctorName = prop.constructor?.name;\n      if (\n        ctorName &&\n        ctorName !== 'Object' &&\n        !ctorName.startsWith('ɵ') &&\n        !FRAMEWORK_CTOR_EXCLUSIONS.some(name => ctorName.startsWith(name)) &&\n        !(prop instanceof HTMLElement) &&\n        !(prop instanceof Date) &&\n        !(prop instanceof RegExp) &&\n        !(prop instanceof Map) &&\n        !(prop instanceof Set)\n      ) {\n        patchSignalsOnInstance(prop, ctorName, visited, depth + 1);\n      }\n    }\n  }\n}\n\nlet nextAutoComponentId = 0;\n\ninterface AutoCompData {\n  id: string;\n  name: string;\n  element: Element;\n  signature: string;\n  inputSnapshot: Map<string, string>;\n  inputRefSnapshot: Map<string, unknown>;\n  cdStrategy: 'OnPush' | 'Default' | 'unknown';\n  parentId: string | null;\n}\n\nconst instanceMap = new WeakMap<object, AutoCompData>();\n\n// Stack frame during template update traversal\ninterface StackFrame {\n  id: string;\n  parentId: string | null;\n  startTime: number;\n  childrenDuration: number;\n  details: AngularRenderScanRenderDetails;\n}\n\nfunction normalizeText(text: string): string {\n  return text.replace(/\\s+/g, ' ').trim();\n}\n\nfunction getRenderedSignature(element: Element): string {\n  const rect = element.getBoundingClientRect();\n  return [\n    normalizeText(element.textContent ?? ''),\n    Math.round(rect.left),\n    Math.round(rect.top),\n    Math.round(rect.width),\n    Math.round(rect.height),\n    element.childElementCount\n  ].join('|');\n}\n\nfunction getInputNames(instance: object): Array<{ publicName: string; propertyName: string }> {\n  const inputs = (instance as any)?.constructor?.ɵcmp?.inputs;\n  if (!inputs || typeof inputs !== 'object') {\n    return [];\n  }\n\n  return Object.entries(inputs).map(([publicName, metadata]) => {\n    if (Array.isArray(metadata) && typeof metadata[0] === 'string') {\n      return { publicName, propertyName: metadata[0] as string };\n    }\n    if (typeof metadata === 'string') {\n      return { publicName, propertyName: metadata };\n    }\n    return { publicName, propertyName: publicName };\n  });\n}\n\nfunction summarizeValue(value: unknown): string {\n  if (value === null) return 'null';\n  if (value === undefined) return 'undefined';\n  if (typeof value === 'string') return JSON.stringify(value.length > 80 ? `${value.slice(0, 77)}...` : value);\n  if (typeof value === 'number' || typeof value === 'boolean' || typeof value === 'bigint') return String(value);\n  if (Array.isArray(value)) return `Array(${(value as unknown[]).length})`;\n  if (typeof value === 'function') return 'Function';\n  if (typeof value === 'object') {\n    const ctor = (value as { constructor?: { name?: string } }).constructor?.name;\n    return ctor && ctor !== 'Object' ? ctor : 'Object';\n  }\n  return typeof value;\n}\n\n/**\n * Read the ChangeDetectionStrategy from Angular component metadata.\n * 0 = OnPush, 2 = Default (Angular internal enum values)\n */\nfunction readCdStrategy(instance: object): 'OnPush' | 'Default' | 'unknown' {\n  const cmp = (instance as any)?.constructor?.ɵcmp;\n  if (!cmp) return 'unknown';\n  // Modern Angular exposes the strategy as an explicit boolean.\n  if (cmp.onPush === true) return 'OnPush';\n  if (cmp.onPush === false) return 'Default';\n  // changeDetection: 0 = OnPush, 2 = Default\n  const cd = cmp.changeDetection;\n  if (cd === 0) return 'OnPush';\n  if (cd === 2) return 'Default';\n  return 'unknown';\n}\n\nfunction detectInputChanges(\n  instance: object,\n  compData: AutoCompData,\n  enableReferentialStability: boolean,\n  referentialStabilityDepth: number\n): AngularRenderChangedInput[] {\n  const changes: AngularRenderChangedInput[] = [];\n  for (const { publicName, propertyName } of getInputNames(instance)) {\n    const rawValue = (instance as any)[propertyName];\n    const current = summarizeValue(rawValue);\n    const previous = compData.inputSnapshot.get(publicName);\n\n    if (previous !== undefined && previous !== current) {\n      let isReferentiallyUnstable = false;\n\n      if (enableReferentialStability && rawValue !== null && typeof rawValue === 'object') {\n        // Check referential stability: new reference, but same deep value?\n        isReferentiallyUnstable = checkReferentialStability(\n          compData.id,\n          compData.name,\n          compData.element.tagName.toLowerCase(),\n          publicName,\n          rawValue,\n          referentialStabilityDepth\n        );\n      }\n\n      changes.push({ name: publicName, previous, current, isReferentiallyUnstable });\n    }\n\n    compData.inputSnapshot.set(publicName, current);\n    if (rawValue !== null && typeof rawValue === 'object') {\n      compData.inputRefSnapshot.set(publicName, rawValue);\n    }\n  }\n\n  return changes.slice(0, 6);\n}\n\nexport function setupAutoInstrumentation(): void {\n  let attempts = 0;\n\n  const trySetup = () => {\n    const globalNg = (window as any).ng;\n    if (!globalNg || !globalNg.ɵsetProfiler || !globalNg.getHostElement) {\n      if (attempts++ < 50) {\n        setTimeout(trySetup, 100);\n      }\n      return;\n    }\n\n    const componentCheckStack: StackFrame[] = [];\n\n    globalNg.ɵsetProfiler((event: number, instance: object) => {\n      if (!instance) return;\n\n      const options = getResolvedOptions();\n\n      if (event === ProfilerEventTemplateUpdateStart) {\n        ensureCycleForComponentCheck();\n\n        let compData = instanceMap.get(instance);\n        if (!compData) {\n          try {\n            const element = globalNg.getHostElement(instance);\n            if (element && element instanceof Element && !element.hasAttribute('angularRenderScanMark')) {\n              const rawName = (instance as any).constructor?.name || 'AnonymousComponent';\n              const name = rawName.replace(/^_+/, '').replace(/Component$/, '') || rawName;\n              const id = `ng-scan-auto-${++nextAutoComponentId}`;\n              const cdStrategy = readCdStrategy(instance);\n\n              // Determine parent from stack\n              const parentId = componentCheckStack.length > 0\n                ? componentCheckStack[componentCheckStack.length - 1].id\n                : null;\n\n              compData = {\n                id,\n                name,\n                element,\n                signature: '',\n                inputSnapshot: new Map(),\n                inputRefSnapshot: new Map(),\n                cdStrategy,\n                parentId\n              };\n              instanceMap.set(instance, compData);\n              registerComponent({\n                ...compData,\n                selector: element.tagName.toLowerCase(),\n                cdStrategy,\n                parentId\n              });\n            } else {\n              instanceMap.set(instance, {\n                id: '',\n                name: '',\n                element: null as any,\n                signature: '',\n                inputSnapshot: new Map(),\n                inputRefSnapshot: new Map(),\n                cdStrategy: 'unknown',\n                parentId: null\n              });\n            }\n          } catch {\n            instanceMap.set(instance, {\n              id: '',\n              name: '',\n              element: null as any,\n              signature: '',\n              inputSnapshot: new Map(),\n              inputRefSnapshot: new Map(),\n              cdStrategy: 'unknown',\n              parentId: null\n            });\n          }\n        }\n\n        if (compData && compData.element) {\n          patchSignalsOnInstance(instance, compData.name);\n          setActiveCheckingComponent(compData.id, compData.name);\n\n          const changedInputs = detectInputChanges(\n            instance,\n            compData,\n            options.trackReferentialStability,\n            options.referentialStabilityDepth\n          );\n\n          const parentId = componentCheckStack.length > 0\n            ? componentCheckStack[componentCheckStack.length - 1].id\n            : compData.parentId;\n\n          componentCheckStack.push({\n            id: compData.id,\n            parentId,\n            startTime: performance.now(),\n            childrenDuration: 0,\n            details: {\n              reason: changedInputs.length > 0 ? 'input' : 'unknown',\n              changedInputs,\n              parentId\n            }\n          });\n        }\n      } else if (event === ProfilerEventTemplateUpdateEnd) {\n        const compData = instanceMap.get(instance);\n        if (compData && compData.element && componentCheckStack.length > 0) {\n          const depth = componentCheckStack.length;\n          const frame = componentCheckStack.pop()!;\n          if (frame.id === compData.id) {\n            const cycleId = currentCycleId();\n            if (cycleId) {\n              const totalDuration = performance.now() - frame.startTime;\n              const selfDuration = Math.max(0, totalDuration - frame.childrenDuration);\n\n              // Propagate duration to parent\n              if (componentCheckStack.length > 0) {\n                componentCheckStack[componentCheckStack.length - 1].childrenDuration += totalDuration;\n              }\n\n              // Check if actual DOM mutation occurred\n              const nextSignature = getRenderedSignature(compData.element);\n              const signatureChanged = compData.signature !== nextSignature;\n              const isWasted = !signatureChanged && frame.details.reason !== 'input';\n\n              if (signatureChanged) {\n                compData.signature = nextSignature;\n              }\n\n              const entry = recordComponentCheck(\n                frame.id,\n                selfDuration,\n                cycleId,\n                {\n                  reason: frame.details.reason === 'input' ? 'input' : signatureChanged ? 'dom' : 'unknown',\n                  changedInputs: frame.details.changedInputs,\n                  mutationType: isWasted ? 'none' : undefined,\n                  parentId: frame.parentId\n                },\n                {\n                  startTime: frame.startTime,\n                  totalDuration,\n                  depth\n                }\n              );\n              if (entry) {\n                window.dispatchEvent(new CustomEvent('angular-render-scan:render', { detail: entry }));\n              }\n            }\n          } else {\n            // Stack mismatch — recover\n            componentCheckStack.length = 0;\n          }\n          setActiveCheckingComponent(null, null);\n        }\n      }\n    });\n  };\n\n  trySetup();\n}\n","/**\n * Zone.js Task Tracker\n *\n * Hooks into Zone.js task scheduling to attribute what triggered each\n * Angular change-detection cycle. Works by wrapping zone task lifecycle\n * callbacks (onScheduleTask / onInvokeTask) to record the \"last active task\"\n * right before ApplicationRef.tick() fires.\n *\n * IMPORTANT: This file contains NO Angular imports. It only touches Zone.js\n * globals and the browser runtime, so it can be used from the infrastructure\n * layer without creating circular dependencies.\n */\n\nimport type { CdTriggerAttribution, CdTriggerSource } from '../../domain/entities';\n\ninterface ZoneTaskSnapshot {\n  source: CdTriggerSource;\n  detail?: string;\n  callSite?: string;\n  isUserInteraction: boolean;\n}\n\n// The most recently executed Zone task before tick() fired\nlet lastTaskSnapshot: ZoneTaskSnapshot | null = null;\n// True while a user event is actively being processed\nlet activeUserEventSource: CdTriggerSource | null = null;\n// Whether a signal write occurred in the current microtask queue\nlet signalWriteDetected = false;\n// Whether a router navigation is in progress\nlet routerNavigationInProgress = false;\n// Whether markForCheck / detectChanges was called explicitly\nlet manualCdCallSite: string | null = null;\n\n// ─── Public write-side API (called from auto-instrumentation / angular.ts) ───\n\nexport function notifySignalWrite(): void {\n  signalWriteDetected = true;\n}\n\nexport function notifyRouterNavigation(): void {\n  routerNavigationInProgress = true;\n}\n\nexport function notifyManualCd(type: 'markForCheck' | 'detectChanges', callSite?: string): void {\n  manualCdCallSite = callSite ?? type;\n}\n\n// ─── Attribution resolution (called at the start of each cycle) ──────────────\n\nexport function resolveTriggerAttribution(): CdTriggerAttribution {\n  let source: CdTriggerSource = 'unknown';\n  let detail: string | undefined;\n  let callSite: string | undefined;\n  let isUserInteraction = false;\n\n  if (manualCdCallSite !== null) {\n    source = manualCdCallSite.startsWith('detectChanges') ? 'manual:detectChanges' : 'manual:markForCheck';\n    callSite = manualCdCallSite;\n  } else if (signalWriteDetected) {\n    source = 'signal:write';\n    isUserInteraction = activeUserEventSource !== null;\n  } else if (routerNavigationInProgress) {\n    source = 'router:navigation';\n  } else if (activeUserEventSource !== null) {\n    source = activeUserEventSource;\n    isUserInteraction = true;\n  } else if (lastTaskSnapshot !== null) {\n    source = lastTaskSnapshot.source;\n    detail = lastTaskSnapshot.detail;\n    callSite = lastTaskSnapshot.callSite;\n    isUserInteraction = lastTaskSnapshot.isUserInteraction;\n  } else {\n    source = 'unknown';\n  }\n\n  const isZonePollution =\n    !isUserInteraction &&\n    source !== 'signal:write' &&\n    source !== 'router:navigation' &&\n    source !== 'manual:markForCheck' &&\n    source !== 'manual:detectChanges' &&\n    source !== 'unknown';\n\n  return { source, detail, callSite, isUserInteraction, isZonePollution };\n}\n\n/** Reset per-cycle state after attribution is collected */\nexport function resetCycleTriggerState(): void {\n  lastTaskSnapshot = null;\n  signalWriteDetected = false;\n  routerNavigationInProgress = false;\n  manualCdCallSite = null;\n  // Note: activeUserEventSource is reset by the DOM event listener\n}\n\n// ─── Zone.js hook installation ────────────────────────────────────────────────\n\nconst USER_EVENTS = new Set(['click', 'mousedown', 'mouseup', 'keydown', 'keyup', 'keypress', 'input', 'change', 'submit', 'focus', 'blur', 'scroll', 'touchstart', 'touchend', 'pointerdown', 'pointerup']);\n\nfunction mapEventToSource(eventType: string): CdTriggerSource {\n  switch (eventType) {\n    case 'click': return 'zone:click';\n    case 'input': return 'zone:input';\n    case 'keydown': return 'zone:keydown';\n    case 'keyup': return 'zone:keyup';\n    case 'submit': return 'zone:submit';\n    case 'change': return 'zone:change';\n    case 'focus': return 'zone:focus';\n    case 'blur': return 'zone:blur';\n    case 'scroll': return 'zone:scroll';\n    default: return 'zone:eventTask';\n  }\n}\n\nfunction extractCallSite(error?: Error): string | undefined {\n  if (!error?.stack) return undefined;\n  // Grab first non-internal frame\n  const frames = error.stack.split('\\n').slice(2);\n  const frame = frames.find(f =>\n    !f.includes('zone-tracker') &&\n    !f.includes('zone.js') &&\n    !f.includes('zone-evergreen') &&\n    f.trim().length > 0\n  );\n  return frame?.trim().replace(/^at\\s+/, '').slice(0, 120);\n}\n\n// Use `any` for Zone.js globals since we don't want to add zone.js as a type dep\ndeclare const Zone: any;\n\nlet zoneHookInstalled = false;\n\nexport function installZoneHook(): void {\n  if (zoneHookInstalled) return;\n  if (typeof Zone === 'undefined') return;\n\n  // Track user DOM events to know the \"active event context\"\n  const trackEvent = (e: Event) => {\n    activeUserEventSource = mapEventToSource(e.type);\n    // Reset after the event has fully propagated + microtasks settled\n    Promise.resolve().then(() => {\n      setTimeout(() => { activeUserEventSource = null; }, 0);\n    });\n  };\n\n  for (const evType of USER_EVENTS) {\n    document.addEventListener(evType, trackEvent, { capture: true, passive: true });\n  }\n\n  // Hook into Zone.js task scheduling via Zone.current.fork\n  const spec = {\n    name: 'angular-render-scan',\n    onScheduleTask(delegate: any, current: any, target: any, task: any) {\n      return delegate.scheduleTask(target, task);\n    },\n    onInvokeTask(delegate: any, current: any, target: any, task: any, applyThis: any, applyArgs: any) {\n      // Record what task is being invoked just before it runs\n      const taskType: string = task.type;\n      const taskSource: string | undefined = task.source;\n\n      if (taskType === 'eventTask') {\n        const eventSource = taskSource ?? '';\n        // e.g. \"HTMLButtonElement.click\" → extract event name\n        const match = eventSource.match(/\\.(\\w+)$/);\n        const eventType = match ? match[1] : eventSource;\n        lastTaskSnapshot = {\n          source: mapEventToSource(eventType),\n          detail: eventSource,\n          isUserInteraction: USER_EVENTS.has(eventType)\n        };\n      } else if (taskType === 'macroTask') {\n        if (taskSource?.includes('setTimeout')) {\n          lastTaskSnapshot = { source: 'zone:setTimeout', isUserInteraction: false };\n        } else if (taskSource?.includes('setInterval')) {\n          lastTaskSnapshot = { source: 'zone:setInterval', isUserInteraction: false };\n        } else if (taskSource?.includes('XMLHttpRequest')) {\n          const xhrUrl = task.data?.url as string | undefined;\n          lastTaskSnapshot = { source: 'zone:xhr', detail: xhrUrl ? xhrUrl.slice(0, 80) : undefined, isUserInteraction: false };\n        } else if (taskSource?.includes('fetch')) {\n          const fetchUrl = task.data?.args?.[0];\n          const urlStr = typeof fetchUrl === 'string' ? fetchUrl.slice(0, 80) : undefined;\n          lastTaskSnapshot = { source: 'zone:fetch', detail: urlStr, isUserInteraction: false };\n        } else {\n          lastTaskSnapshot = { source: 'zone:macrotask', detail: taskSource?.slice(0, 80), isUserInteraction: false };\n        }\n      } else if (taskType === 'microTask') {\n        lastTaskSnapshot = { source: 'zone:microtask', detail: taskSource?.slice(0, 80), isUserInteraction: false };\n      }\n\n      return delegate.invokeTask(target, task, applyThis, applyArgs);\n    }\n  };\n\n  try {\n    Zone.current.fork(spec);\n    zoneHookInstalled = true;\n  } catch {\n    // Zone.js not available or already fully patched — silently skip\n  }\n}\n\nexport function resetZoneTracker(): void {\n  zoneHookInstalled = false;\n  lastTaskSnapshot = null;\n  activeUserEventSource = null;\n  signalWriteDetected = false;\n  routerNavigationInProgress = false;\n  manualCdCallSite = null;\n}\n","import {\n  APP_INITIALIZER,\n  ApplicationRef,\n  Directive,\n  ElementRef,\n  EnvironmentProviders,\n  InjectionToken,\n  input,\n  effect,\n  OnDestroy,\n  Provider,\n  inject,\n  makeEnvironmentProviders,\n  isDevMode,\n  NgZone,\n  ChangeDetectorRef\n} from '@angular/core';\nimport {\n  beginCycle,\n  copyAIPrompt,\n  currentCycleId,\n  endCycle,\n  ensureCycleForComponentCheck,\n  getAIPrompt,\n  scan,\n  setOptions,\n  setTaskScheduler,\n  getSessionData,\n  getWastedStats,\n  getLeakedComponents,\n  getOnPushCandidates,\n  getReferentialInstability,\n  getCdGraph,\n  beginInteraction,\n  endInteraction,\n  getInteractionReport,\n  setInteractionBaseline,\n  compareWithInteractionBaseline,\n  formatInteractionReportMarkdown,\n  formatInteractionReportHtml\n} from '../../application/runtime';\nimport { recordComponentCheck, registerComponent, unregisterComponent } from '../../application/stats';\nimport type { AngularRenderScanOptions } from '../../domain/entities';\nimport { setupAutoInstrumentation } from './auto-instrumentation';\nimport { installZoneHook, resetZoneTracker } from './zone-tracker';\n\nexport const ANGULAR_RENDER_SCAN_OPTIONS = new InjectionToken<AngularRenderScanOptions>('ANGULAR_RENDER_SCAN_OPTIONS');\n\nlet nextComponentId = 0;\n\n@Directive({\n  selector: '[angularRenderScanMark]',\n  standalone: true\n})\nexport class AngularRenderScanMarkDirective implements OnDestroy {\n  private readonly element = inject<ElementRef<Element>>(ElementRef).nativeElement;\n  private readonly parent = inject(AngularRenderScanMarkDirective, { optional: true, skipSelf: true });\n  private readonly id = `ng-scan-${++nextComponentId}`;\n  private checkStartedAt = 0;\n  private childrenDuration = 0;\n  private name = this.inferName();\n\n  readonly angularRenderScanMark = input<string | undefined>(undefined, { alias: 'angularRenderScanMark' });\n\n  constructor() {\n    effect(() => {\n      const customName = this.angularRenderScanMark();\n      this.name = customName || this.inferName();\n      this.register();\n    });\n  }\n\n  ngDoCheck(): void {\n    ensureCycleForComponentCheck();\n    this.checkStartedAt = performance.now();\n    this.childrenDuration = 0;\n  }\n\n  ngAfterViewChecked(): void {\n    const cycleId = currentCycleId();\n    const totalDuration = performance.now() - this.checkStartedAt;\n    const selfDuration = Math.max(0, totalDuration - this.childrenDuration);\n\n    if (this.parent) {\n      this.parent.childrenDuration += totalDuration;\n    }\n\n    if (!cycleId) {\n      return;\n    }\n\n    let depth = 1;\n    let curr = this.parent;\n    while (curr) {\n      depth++;\n      curr = curr.parent;\n    }\n\n    const parentId = this.parent ? (this.parent as any)['id'] as string : null;\n\n    const entry = recordComponentCheck(\n      this.id,\n      selfDuration,\n      cycleId,\n      { parentId },\n      {\n        startTime: this.checkStartedAt,\n        totalDuration,\n        depth\n      }\n    );\n    if (entry) {\n      window.dispatchEvent(new CustomEvent('angular-render-scan:render', { detail: entry }));\n    }\n  }\n\n  ngOnDestroy(): void {\n    unregisterComponent(this.id);\n  }\n\n  private register(): void {\n    registerComponent({\n      id: this.id,\n      name: this.name,\n      element: this.element,\n      selector: this.element.tagName.toLowerCase(),\n      parentId: this.parent ? (this.parent as any)['id'] as string : null\n    });\n  }\n\n  private inferName(): string {\n    const tagName = this.element.tagName.toLowerCase();\n    return tagName\n      .replace(/^app-/, '')\n      .split('-')\n      .map((part) => `${part.charAt(0).toUpperCase()}${part.slice(1)}`)\n      .join('');\n  }\n}\n\nexport function provideAngularRenderScan(options: AngularRenderScanOptions = {}): EnvironmentProviders {\n  return makeEnvironmentProviders([\n    { provide: ANGULAR_RENDER_SCAN_OPTIONS, useValue: options },\n    angularRenderScanInitializerProvider()\n  ]);\n}\n\nfunction angularRenderScanInitializerProvider(): Provider {\n  return {\n    provide: APP_INITIALIZER,\n    multi: true,\n    deps: [ApplicationRef, ANGULAR_RENDER_SCAN_OPTIONS, NgZone],\n    useFactory: (appRef: ApplicationRef, options: AngularRenderScanOptions, ngZone: NgZone) => () => {\n      if (!isDevMode() && !options.dangerouslyForceRunInProduction) {\n        return;\n      }\n\n      setTaskScheduler((fn) => {\n        ngZone.runOutsideAngular(() => {\n          Promise.resolve().then(fn);\n        });\n      });\n\n      ngZone.runOutsideAngular(() => {\n        scan(options);\n        // Install Zone.js hook for CD trigger attribution\n        installZoneHook();\n      });\n\n      patchApplicationRef(appRef);\n      registerGlobalApplicationRef(appRef);\n      setupAutoInstrumentation();\n    }\n  };\n}\n\nlet originalTick: (() => void) | null = null;\n\nfunction patchApplicationRef(appRef: ApplicationRef): void {\n  const candidate = appRef as ApplicationRef & { __angularRenderScanPatched?: boolean };\n  if (candidate.__angularRenderScanPatched) {\n    return;\n  }\n\n  originalTick = appRef.tick.bind(appRef);\n  candidate.tick = () => {\n    const cycleId = beginCycle();\n    try {\n      if (originalTick) return originalTick();\n    } finally {\n      endCycle(cycleId);\n    }\n  };\n  candidate.__angularRenderScanPatched = true;\n}\n\nexport function restoreApplicationRef(appRef: ApplicationRef): void {\n  const candidate = appRef as ApplicationRef & { __angularRenderScanPatched?: boolean };\n  if (candidate.__angularRenderScanPatched && originalTick) {\n    candidate.tick = originalTick;\n    candidate.__angularRenderScanPatched = false;\n    originalTick = null;\n  }\n  resetZoneTracker();\n}\n\nfunction registerGlobalApplicationRef(appRef: ApplicationRef): void {\n  const globalWindow = window as Window & {\n    __ANGULAR_RENDER_SCAN_APP_REF__?: ApplicationRef;\n    AngularRenderScan?: object;\n  };\n  globalWindow.__ANGULAR_RENDER_SCAN_APP_REF__ = appRef;\n  globalWindow.AngularRenderScan = {\n    ...(globalWindow.AngularRenderScan as object | undefined),\n    scan,\n    setOptions,\n    getAIPrompt,\n    copyAIPrompt,\n    getSessionData,\n    getWastedStats,\n    getLeakedComponents,\n    getOnPushCandidates,\n    getReferentialInstability,\n    getCdGraph,\n    beginInteraction,\n    endInteraction,\n    getInteractionReport,\n    setInteractionBaseline,\n    compareWithInteractionBaseline,\n    formatInteractionReportMarkdown,\n    formatInteractionReportHtml,\n    stop: () => {\n      import('../../application/runtime').then(m => m.stop());\n      restoreApplicationRef(appRef);\n    }\n  };\n}\n","import type { BudgetViolation, InteractionComparison, InteractionReport, SessionExportData } from './domain/entities';\nimport { compareInteractionReports, formatInteractionReportHtml, formatInteractionReportMarkdown } from './application/interaction';\n\ninterface BrowserScanApi {\n  scan(options: { enabled: boolean }): void;\n  stop(): void;\n  beginInteraction?(name: string): void;\n  endInteraction?(): InteractionReport;\n  getSessionData(): SessionExportData;\n}\n\nexport interface RenderAuditPage {\n  evaluate<Result>(pageFunction: () => Result | Promise<Result>): Promise<Awaited<Result>>;\n  evaluate<Result, Argument>(pageFunction: (argument: Argument) => Result | Promise<Result>, argument: Argument): Promise<Awaited<Result>>;\n}\n\nexport interface RenderAuditReport {\n  rendersFor(name: string): Promise<number>;\n  maxDurationFor(name: string): Promise<number>;\n  wastedRenderPercentage(): Promise<number>;\n  budgetViolations(): Promise<BudgetViolation[]>;\n  sessionData(): Promise<SessionExportData>;\n  interactionReport(): Promise<InteractionReport>;\n  compareWith(baseline: InteractionReport): Promise<InteractionComparison>;\n  toMarkdown(): Promise<string>;\n  toHtml(): Promise<string>;\n}\n\nexport interface RenderAuditSession {\n  stop(): Promise<RenderAuditReport>;\n}\n\n/** Starts a named, Playwright-compatible interaction audit. */\nexport async function startRenderAudit(page: RenderAuditPage, name = 'Playwright interaction'): Promise<RenderAuditSession> {\n  await page.evaluate(() => {\n    const scan = (window as Window & { AngularRenderScan?: BrowserScanApi }).AngularRenderScan;\n    scan?.scan({ enabled: true });\n  });\n  await page.evaluate((interactionName) => {\n    const scan = (window as Window & { AngularRenderScan?: BrowserScanApi }).AngularRenderScan;\n    scan?.beginInteraction?.(interactionName);\n  }, name);\n\n  return {\n    async stop(): Promise<RenderAuditReport> {\n      const payload = await page.evaluate(() => {\n        const scan = (window as Window & { AngularRenderScan?: BrowserScanApi }).AngularRenderScan;\n        if (!scan?.getSessionData) return null;\n        const interaction = scan.endInteraction?.();\n        const session = scan.getSessionData();\n        scan.stop();\n        return { interaction, session };\n      });\n      if (!payload) {\n        throw new Error('[angular-render-scan] Telemetry could not be fetched. Is the scanner enabled in development mode?');\n      }\n      const interaction = payload.interaction ?? {\n        schemaVersion: 1 as const,\n        name,\n        startedAt: payload.session.exportedAt,\n        finishedAt: payload.session.exportedAt,\n        url: payload.session.url,\n        viewport: payload.session.viewport,\n        metrics: { cycleCount: 0, componentCheckCount: 0, totalCycleDuration: 0, maxCycleDuration: 0, wastedChecks: 0, wastedPercentage: payload.session.wastedStats.wastedPercentage, budgetViolationCount: payload.session.budgetViolations.length },\n        findings: [],\n        session: payload.session\n      };\n      const sessionData = payload.session;\n      return {\n        async rendersFor(componentName) {\n          return Math.max(0, ...sessionData.cycles.flatMap((cycle) => cycle.entries.filter((entry) => entry.name === componentName).map((entry) => entry.count)));\n        },\n        async maxDurationFor(componentName) {\n          return Math.max(0, ...sessionData.cycles.flatMap((cycle) => cycle.entries.filter((entry) => entry.name === componentName).map((entry) => entry.latestDuration)));\n        },\n        async wastedRenderPercentage() { return interaction.metrics.wastedPercentage; },\n        async budgetViolations() { return interaction.session.budgetViolations; },\n        async sessionData() { return sessionData; },\n        async interactionReport() { return interaction; },\n        async compareWith(baseline) { return compareInteractionReports(baseline, interaction); },\n        async toMarkdown() { return formatInteractionReportMarkdown(interaction); },\n        async toHtml() { return formatInteractionReportHtml(interaction); }\n      };\n    }\n  };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["escapeHtml","getOnPushCandidates","getReferentialInstability","getCdGraph","statsGetOnPushCandidates","statsGetReferentialInstability","statsGetCdGraph","statsGetWastedStats","statsGetDetachedComponents"],"mappings":"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"}