{"version":3,"file":"code-zetta-ng-profiler.mjs","sources":["../../../projects/ng-profiler/src/lib/services/recommendation.service.ts","../../../projects/ng-profiler/src/lib/services/profiler-store.service.ts","../../../projects/ng-profiler/src/lib/models/ng-profiler-config.ts","../../../projects/ng-profiler/src/lib/services/ng-profiler.service.ts","../../../projects/ng-profiler/src/lib/components/ng-profiler-overlay.component.ts","../../../projects/ng-profiler/src/lib/directives/ng-profiler.directive.ts","../../../projects/ng-profiler/src/lib/ng-profiler.module.ts","../../../projects/ng-profiler/src/lib/providers/ng-profiler.providers.ts","../../../projects/ng-profiler/src/lib/ng-profiler.ts","../../../projects/ng-profiler/src/public-api.ts","../../../projects/ng-profiler/src/code-zetta-ng-profiler.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport {\n  ProfilerStats,\n  ComponentRenderStats,\n  PerformanceRecommendation,\n} from '../models/ng-profiler-config';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class RecommendationService {\n  /**\n   * Analyze performance data and generate recommendations\n   */\n  analyzePerformance(stats: ProfilerStats): PerformanceRecommendation[] {\n    const recommendations: PerformanceRecommendation[] = [];\n\n    // Frame performance analysis\n    this.analyzeFramePerformance(stats, recommendations);\n\n    // Component render analysis\n    this.analyzeComponentRenders(stats, recommendations);\n\n    // Memory analysis (if available)\n    this.analyzeMemoryUsage(stats, recommendations);\n\n    // Best practices analysis\n    this.analyzeBestPractices(stats, recommendations);\n\n    // Sort by priority (highest first)\n    return recommendations.sort((a, b) => b.priority - a.priority);\n  }\n\n  /**\n   * Analyze frame performance issues\n   */\n  private analyzeFramePerformance(\n    stats: ProfilerStats,\n    recommendations: PerformanceRecommendation[]\n  ): void {\n    // Critical frame time issues\n    if (stats.lastFrameDuration > 50) {\n      recommendations.push({\n        id: 'critical-frame-time',\n        type: 'error',\n        title: 'Critical Frame Time Detected',\n        description: `Last frame took ${stats.lastFrameDuration.toFixed(\n          2\n        )}ms, which is significantly above the 16.67ms target for 60fps.`,\n        severity: 'critical',\n        category: 'performance',\n        suggestions: [\n          'Optimize heavy computations in your components',\n          'Use OnPush change detection strategy',\n          'Implement virtual scrolling for large lists',\n          'Consider using Web Workers for heavy calculations',\n          'Profile with Chrome DevTools to identify bottlenecks',\n        ],\n        impact: 'Severe impact on user experience and perceived performance',\n        priority: 100,\n      });\n    }\n\n    // High average frame time\n    if (stats.averageFrameDuration > 20) {\n      recommendations.push({\n        id: 'high-average-frame-time',\n        type: 'warning',\n        title: 'High Average Frame Time',\n        description: `Average frame time is ${stats.averageFrameDuration.toFixed(\n          2\n        )}ms, above the recommended 16.67ms.`,\n        severity: 'high',\n        category: 'performance',\n        suggestions: [\n          'Review components with frequent updates',\n          'Implement debouncing for rapid state changes',\n          'Use trackBy functions in ngFor loops',\n          'Consider lazy loading for heavy components',\n          'Optimize template expressions and bindings',\n        ],\n        impact: 'May cause noticeable lag and poor user experience',\n        priority: 80,\n      });\n    }\n\n    // Low frame count warning\n    if (stats.frameCount < 10) {\n      recommendations.push({\n        id: 'low-frame-count',\n        type: 'info',\n        title: 'Limited Performance Data',\n        description:\n          'Only a few frames have been measured. Consider interacting with the application to gather more data.',\n        severity: 'low',\n        category: 'performance',\n        suggestions: [\n          'Interact with various components in your application',\n          'Trigger different user actions to gather more data',\n          'Wait for more performance data to be collected',\n        ],\n        impact: 'Limited data may not reflect real-world performance',\n        priority: 20,\n      });\n    }\n  }\n\n  /**\n   * Analyze component render issues\n   */\n  private analyzeComponentRenders(\n    stats: ProfilerStats,\n    recommendations: PerformanceRecommendation[]\n  ): void {\n    const highRenderComponents = stats.topComponents.filter((comp) => comp.severity === 'high');\n    const mediumRenderComponents = stats.topComponents.filter((comp) => comp.severity === 'medium');\n\n    // Critical render issues\n    if (highRenderComponents.length > 0) {\n      const worstComponent = highRenderComponents[0];\n      recommendations.push({\n        id: 'critical-render-count',\n        type: 'error',\n        title: 'Excessive Component Renders',\n        description: `Component \"${worstComponent.name}\" has rendered ${worstComponent.renderCount} times, indicating potential performance issues.`,\n        severity: 'critical',\n        category: 'rendering',\n        suggestions: [\n          'Review change detection strategy for this component',\n          'Check for unnecessary template bindings',\n          'Implement OnPush change detection',\n          'Use pure pipes instead of methods in templates',\n          'Consider memoization for expensive calculations',\n          'Review parent component for unnecessary re-renders',\n        ],\n        impact: 'Excessive renders can cause significant performance degradation',\n        priority: 95,\n      });\n    }\n\n    // Multiple high-render components\n    if (highRenderComponents.length > 2) {\n      recommendations.push({\n        id: 'multiple-high-render-components',\n        type: 'warning',\n        title: 'Multiple Components with High Render Counts',\n        description: `${highRenderComponents.length} components are rendering excessively, indicating systemic performance issues.`,\n        severity: 'high',\n        category: 'rendering',\n        suggestions: [\n          'Review global state management patterns',\n          'Check for circular dependencies between components',\n          'Implement proper component architecture',\n          'Consider using a state management library (NgRx, Akita)',\n          'Review service injection patterns',\n        ],\n        impact: 'Systemic rendering issues affect overall application performance',\n        priority: 85,\n      });\n    }\n\n    // Medium render issues\n    if (mediumRenderComponents.length > 3) {\n      recommendations.push({\n        id: 'multiple-medium-render-components',\n        type: 'warning',\n        title: 'Several Components with Moderate Render Counts',\n        description: `${mediumRenderComponents.length} components have moderate render counts that could be optimized.`,\n        severity: 'medium',\n        category: 'rendering',\n        suggestions: [\n          'Review change detection triggers',\n          'Optimize template expressions',\n          'Use trackBy functions in loops',\n          'Consider component composition patterns',\n          'Review input/output binding patterns',\n        ],\n        impact: 'Moderate performance impact that can accumulate',\n        priority: 60,\n      });\n    }\n\n    // Advanced component analysis\n    this.analyzeComponentPatterns(stats, recommendations);\n    this.analyzeTemplateOptimization(stats, recommendations);\n  }\n\n  /**\n   * Analyze component patterns and architecture\n   */\n  private analyzeComponentPatterns(\n    stats: ProfilerStats,\n    recommendations: PerformanceRecommendation[]\n  ): void {\n    const allComponents = stats.topComponents;\n\n    // Check for potential component composition issues\n    if (allComponents.length > 5) {\n      recommendations.push({\n        id: 'component-composition',\n        type: 'optimization',\n        title: 'Component Composition Optimization',\n        description:\n          'Many components are being tracked, suggesting potential composition improvements.',\n        severity: 'low',\n        category: 'rendering',\n        suggestions: [\n          'Consider using smart/dumb component pattern',\n          'Implement proper component hierarchy',\n          'Review component responsibilities',\n          'Consider using content projection',\n          'Implement proper component interfaces',\n        ],\n        impact: 'Improves component maintainability and performance',\n        priority: 35,\n      });\n    }\n\n    // Check for potential over-engineering\n    if (allComponents.length > 10) {\n      recommendations.push({\n        id: 'component-over-engineering',\n        type: 'warning',\n        title: 'Potential Component Over-Engineering',\n        description:\n          'Many small components detected. Consider if this level of granularity is necessary.',\n        severity: 'medium',\n        category: 'rendering',\n        suggestions: [\n          'Review component granularity',\n          'Consider combining related components',\n          'Implement proper component boundaries',\n          'Review component communication patterns',\n          'Consider using feature modules',\n        ],\n        impact: 'Reduces complexity and improves maintainability',\n        priority: 45,\n      });\n    }\n  }\n\n  /**\n   * Analyze template optimization opportunities\n   */\n  private analyzeTemplateOptimization(\n    stats: ProfilerStats,\n    recommendations: PerformanceRecommendation[]\n  ): void {\n    // High render counts often indicate template optimization opportunities\n    const highRenderComponents = stats.topComponents.filter((comp) => comp.severity === 'high');\n\n    if (highRenderComponents.length > 0) {\n      recommendations.push({\n        id: 'template-optimization',\n        type: 'optimization',\n        title: 'Template Optimization Opportunities',\n        description: 'High render counts suggest template optimization opportunities.',\n        severity: 'medium',\n        category: 'rendering',\n        suggestions: [\n          'Use OnPush change detection strategy',\n          'Implement pure pipes for expensive calculations',\n          'Use trackBy functions in ngFor loops',\n          'Avoid function calls in templates',\n          'Use async pipe for observables',\n          'Consider using signals for reactive templates',\n        ],\n        impact: 'Reduces template evaluation overhead and improves performance',\n        priority: 70,\n      });\n    }\n  }\n\n  /**\n   * Analyze memory usage patterns\n   */\n  private analyzeMemoryUsage(\n    stats: ProfilerStats,\n    recommendations: PerformanceRecommendation[]\n  ): void {\n    // Enhanced memory analysis with more specific recommendations\n\n    // High frame count indicates potential memory pressure\n    if (stats.frameCount > 100) {\n      recommendations.push({\n        id: 'memory-best-practices',\n        type: 'optimization',\n        title: 'Memory Optimization Opportunities',\n        description: 'With significant application usage, consider memory optimization strategies.',\n        severity: 'medium',\n        category: 'memory',\n        suggestions: [\n          'Implement proper component destruction',\n          'Unsubscribe from observables in ngOnDestroy',\n          'Use weak references where appropriate',\n          'Consider using OnPush change detection',\n          'Implement proper cleanup for timers and intervals',\n          'Review for memory leaks in event listeners',\n        ],\n        impact: 'Prevents memory leaks and improves long-term performance',\n        priority: 50,\n      });\n    }\n\n    // Very high frame count suggests potential memory issues\n    if (stats.frameCount > 500) {\n      recommendations.push({\n        id: 'memory-pressure-detected',\n        type: 'warning',\n        title: 'Potential Memory Pressure Detected',\n        description:\n          'High frame count suggests potential memory pressure or performance degradation over time.',\n        severity: 'high',\n        category: 'memory',\n        suggestions: [\n          'Monitor memory usage with Chrome DevTools',\n          'Check for memory leaks in long-running operations',\n          'Implement memory profiling in development',\n          'Consider implementing memory monitoring',\n          'Review component lifecycle management',\n          'Use Angular DevTools for memory analysis',\n        ],\n        impact: 'Memory pressure can cause application crashes and poor performance',\n        priority: 75,\n      });\n    }\n\n    // Analyze component render patterns for memory implications\n    const highRenderComponents = stats.topComponents.filter((comp) => comp.severity === 'high');\n    if (highRenderComponents.length > 0) {\n      recommendations.push({\n        id: 'memory-render-correlation',\n        type: 'info',\n        title: 'Memory-Render Correlation',\n        description:\n          'High render counts may indicate memory allocation patterns that could be optimized.',\n        severity: 'medium',\n        category: 'memory',\n        suggestions: [\n          'Review object creation in frequently rendered components',\n          'Consider object pooling for frequently created objects',\n          'Implement memoization for expensive calculations',\n          'Use immutable data structures where possible',\n          'Review for unnecessary object allocations in templates',\n        ],\n        impact: 'Reduces garbage collection pressure and improves performance',\n        priority: 45,\n      });\n    }\n  }\n\n  /**\n   * Analyze best practices and advanced optimizations\n   */\n  private analyzeBestPractices(\n    stats: ProfilerStats,\n    recommendations: PerformanceRecommendation[]\n  ): void {\n    // General best practices based on data patterns\n    if (stats.frameCount > 50 && stats.averageFrameDuration > 10) {\n      recommendations.push({\n        id: 'performance-optimization',\n        type: 'optimization',\n        title: 'Performance Optimization Opportunities',\n        description: 'Application shows opportunities for performance improvements.',\n        severity: 'medium',\n        category: 'best-practice',\n        suggestions: [\n          'Use Angular DevTools for detailed analysis',\n          'Implement code splitting and lazy loading',\n          'Optimize bundle size with tree shaking',\n          'Use Angular Universal for SSR if applicable',\n          'Consider using Angular PWA features',\n          'Implement proper caching strategies',\n        ],\n        impact: 'Improves overall application performance and user experience',\n        priority: 70,\n      });\n    }\n\n    // Zone.js specific recommendations\n    if (stats.frameCount > 20) {\n      recommendations.push({\n        id: 'zone-optimization',\n        type: 'optimization',\n        title: 'Zone.js Optimization',\n        description: 'Consider optimizing Zone.js usage for better performance.',\n        severity: 'low',\n        category: 'best-practice',\n        suggestions: [\n          'Use NgZone.runOutsideAngular for heavy computations',\n          'Consider zoneless change detection for specific components',\n          'Optimize async operations to minimize change detection',\n          'Use trackBy functions in ngFor loops',\n          'Implement proper error boundaries',\n        ],\n        impact: 'Reduces unnecessary change detection cycles',\n        priority: 40,\n      });\n    }\n\n    // Network performance recommendations\n    this.analyzeNetworkPerformance(stats, recommendations);\n\n    // Bundle optimization recommendations\n    this.analyzeBundleOptimization(stats, recommendations);\n\n    // State management recommendations\n    this.analyzeStateManagement(stats, recommendations);\n  }\n\n  /**\n   * Analyze network performance patterns\n   */\n  private analyzeNetworkPerformance(\n    stats: ProfilerStats,\n    recommendations: PerformanceRecommendation[]\n  ): void {\n    // High frame times might indicate network-related issues\n    if (stats.averageFrameDuration > 25) {\n      recommendations.push({\n        id: 'network-performance',\n        type: 'warning',\n        title: 'Potential Network Performance Issues',\n        description: 'High frame times may indicate network-related performance bottlenecks.',\n        severity: 'medium',\n        category: 'best-practice',\n        suggestions: [\n          'Implement request caching strategies',\n          'Use HTTP interceptors for request optimization',\n          'Consider implementing request deduplication',\n          'Optimize API response payloads',\n          'Implement progressive loading for large datasets',\n          'Use service workers for offline capabilities',\n        ],\n        impact: 'Improves data loading performance and user experience',\n        priority: 65,\n      });\n    }\n  }\n\n  /**\n   * Analyze bundle optimization opportunities\n   */\n  private analyzeBundleOptimization(\n    stats: ProfilerStats,\n    recommendations: PerformanceRecommendation[]\n  ): void {\n    if (stats.frameCount > 30) {\n      recommendations.push({\n        id: 'bundle-optimization',\n        type: 'optimization',\n        title: 'Bundle Optimization Opportunities',\n        description: 'Consider optimizing your application bundle for better performance.',\n        severity: 'medium',\n        category: 'best-practice',\n        suggestions: [\n          'Implement dynamic imports for code splitting',\n          'Use Angular CLI build optimization flags',\n          'Analyze bundle with webpack-bundle-analyzer',\n          'Remove unused dependencies',\n          'Optimize third-party library imports',\n          'Consider using standalone components for better tree-shaking',\n        ],\n        impact: 'Reduces initial load time and improves perceived performance',\n        priority: 55,\n      });\n    }\n  }\n\n  /**\n   * Analyze state management patterns\n   */\n  private analyzeStateManagement(\n    stats: ProfilerStats,\n    recommendations: PerformanceRecommendation[]\n  ): void {\n    const highRenderComponents = stats.topComponents.filter((comp) => comp.severity === 'high');\n\n    if (highRenderComponents.length > 1) {\n      recommendations.push({\n        id: 'state-management',\n        type: 'optimization',\n        title: 'State Management Optimization',\n        description:\n          'Multiple components with high render counts suggest state management improvements.',\n        severity: 'medium',\n        category: 'best-practice',\n        suggestions: [\n          'Consider implementing NgRx or similar state management',\n          'Review service injection patterns',\n          'Implement proper state isolation',\n          'Use BehaviorSubject for reactive state',\n          'Consider using signals for fine-grained reactivity',\n          'Review component communication patterns',\n        ],\n        impact: 'Improves state predictability and reduces unnecessary renders',\n        priority: 60,\n      });\n    }\n  }\n\n  /**\n   * Get recommendation by ID\n   */\n  getRecommendationById(id: string, stats: ProfilerStats): PerformanceRecommendation | null {\n    const recommendations = this.analyzePerformance(stats);\n    return recommendations.find((rec) => rec.id === id) || null;\n  }\n\n  /**\n   * Get recommendations by category\n   */\n  getRecommendationsByCategory(\n    category: string,\n    stats: ProfilerStats\n  ): PerformanceRecommendation[] {\n    const recommendations = this.analyzePerformance(stats);\n    return recommendations.filter((rec) => rec.category === category);\n  }\n\n  /**\n   * Get critical recommendations only\n   */\n  getCriticalRecommendations(stats: ProfilerStats): PerformanceRecommendation[] {\n    const recommendations = this.analyzePerformance(stats);\n    return recommendations.filter((rec) => rec.severity === 'critical' || rec.severity === 'high');\n  }\n\n  /**\n   * Check if performance is within acceptable thresholds\n   */\n  isPerformanceAcceptable(stats: ProfilerStats): boolean {\n    return (\n      stats.lastFrameDuration <= 16.67 &&\n      stats.averageFrameDuration <= 16.67 &&\n      stats.topComponents.filter((comp) => comp.severity === 'high').length === 0\n    );\n  }\n\n  /**\n   * Get performance score (0-100)\n   */\n  getPerformanceScore(stats: ProfilerStats): number {\n    let score = 100;\n\n    // Deduct points for frame time issues\n    if (stats.lastFrameDuration > 50) score -= 30;\n    else if (stats.lastFrameDuration > 33) score -= 20;\n    else if (stats.lastFrameDuration > 16.67) score -= 10;\n\n    if (stats.averageFrameDuration > 33) score -= 25;\n    else if (stats.averageFrameDuration > 16.67) score -= 15;\n\n    // Deduct points for render issues\n    const highRenderComponents = stats.topComponents.filter((comp) => comp.severity === 'high');\n    score -= highRenderComponents.length * 10;\n\n    const mediumRenderComponents = stats.topComponents.filter((comp) => comp.severity === 'medium');\n    score -= mediumRenderComponents.length * 5;\n\n    // Ensure score doesn't go below 0\n    return Math.max(0, score);\n  }\n\n  /**\n   * Get performance health status\n   */\n  getPerformanceHealth(stats: ProfilerStats): 'excellent' | 'good' | 'fair' | 'poor' | 'critical' {\n    const score = this.getPerformanceScore(stats);\n\n    if (score >= 90) return 'excellent';\n    if (score >= 75) return 'good';\n    if (score >= 60) return 'fair';\n    if (score >= 40) return 'poor';\n    return 'critical';\n  }\n\n  /**\n   * Get performance summary\n   */\n  getPerformanceSummary(stats: ProfilerStats): {\n    score: number;\n    health: string;\n    acceptable: boolean;\n    criticalIssues: number;\n    warnings: number;\n  } {\n    const score = this.getPerformanceScore(stats);\n    const health = this.getPerformanceHealth(stats);\n    const acceptable = this.isPerformanceAcceptable(stats);\n    const recommendations = this.analyzePerformance(stats);\n\n    const criticalIssues = recommendations.filter((rec) => rec.severity === 'critical').length;\n    const warnings = recommendations.filter(\n      (rec) => rec.severity === 'high' || rec.severity === 'medium'\n    ).length;\n\n    return {\n      score,\n      health,\n      acceptable,\n      criticalIssues,\n      warnings,\n    };\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport {\n  ProfilerStats,\n  ComponentRenderStats,\n  FrameMeasurement,\n  PerformanceRecommendation,\n} from '../models/ng-profiler-config';\nimport { RecommendationService } from './recommendation.service';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class ProfilerStore {\n  private renderCounts = new Map<string, number>();\n  private elementMap = new Map<string, HTMLElement>();\n  private frameMeasurements: FrameMeasurement[] = [];\n  private maxFrameHistory = 100;\n  private isPaused = false;\n\n  constructor(private recommendationService: RecommendationService) {}\n\n  private statsSubject = new BehaviorSubject<ProfilerStats>({\n    lastFrameDuration: 0,\n    averageFrameDuration: 0,\n    frameCount: 0,\n    topComponents: [],\n    lastMeasurement: Date.now(),\n  });\n\n  public stats$: Observable<ProfilerStats> = this.statsSubject.asObservable();\n\n  /**\n   * Increment render count for a component\n   */\n  incrementRenderCount(name: string, element?: HTMLElement): void {\n    if (this.isPaused) {\n      return; // Don't count renders when paused\n    }\n\n    const currentCount = this.renderCounts.get(name) || 0;\n    const newCount = currentCount + 1;\n    this.renderCounts.set(name, newCount);\n\n    if (element) {\n      this.elementMap.set(name, element);\n    }\n\n    this.updateStats();\n  }\n\n  /**\n   * Add frame measurement\n   */\n  addFrameMeasurement(duration: number): void {\n    if (this.isPaused) {\n      return; // Don't add frame measurements when paused\n    }\n\n    const measurement: FrameMeasurement = {\n      duration,\n      timestamp: Date.now(),\n    };\n\n    this.frameMeasurements.push(measurement);\n\n    // Keep only the last N measurements\n    if (this.frameMeasurements.length > this.maxFrameHistory) {\n      this.frameMeasurements.shift();\n    }\n\n    this.updateStats();\n  }\n\n  /**\n   * Get severity level based on render count\n   */\n  private getSeverity(renderCount: number): 'low' | 'medium' | 'high' {\n    if (renderCount <= 5) return 'low';\n    if (renderCount <= 20) return 'medium';\n    return 'high';\n  }\n\n  /**\n   * Update statistics\n   */\n  private updateStats(): void {\n    const currentStats = this.statsSubject.value;\n\n    // Calculate frame statistics\n    const lastFrame = this.frameMeasurements[this.frameMeasurements.length - 1];\n    const lastFrameDuration = lastFrame ? lastFrame.duration : 0;\n\n    const averageFrameDuration =\n      this.frameMeasurements.length > 0\n        ? this.frameMeasurements.reduce((sum, m) => sum + m.duration, 0) /\n          this.frameMeasurements.length\n        : 0;\n\n    // Get top components by render count\n    const topComponents: ComponentRenderStats[] = Array.from(this.renderCounts.entries())\n      .map(([name, count]) => ({\n        name,\n        renderCount: count,\n        severity: this.getSeverity(count),\n        element: this.elementMap.get(name),\n      }))\n      .sort((a, b) => b.renderCount - a.renderCount)\n      .slice(0, 10);\n\n    const newStats: ProfilerStats = {\n      lastFrameDuration,\n      averageFrameDuration,\n      frameCount: this.frameMeasurements.length,\n      topComponents,\n      lastMeasurement: Date.now(),\n    };\n\n    // Add recommendations after creating the stats object\n    newStats.recommendations = this.recommendationService.analyzePerformance(newStats);\n\n    this.statsSubject.next(newStats);\n  }\n\n  /**\n   * Reset all statistics\n   */\n  reset(): void {\n    this.renderCounts.clear();\n    this.elementMap.clear();\n    this.frameMeasurements = [];\n    this.updateStats();\n  }\n\n  /**\n   * Export current statistics as JSON\n   */\n  exportStats(): string {\n    const stats = this.statsSubject.value;\n\n    // Create a clean version of topComponents without circular references\n    const cleanTopComponents = stats.topComponents.map((component) => ({\n      name: component.name,\n      renderCount: component.renderCount,\n      severity: component.severity,\n      // Remove the element property to avoid circular references\n    }));\n\n    // Get performance summary and analysis\n    const performanceSummary = this.recommendationService.getPerformanceSummary(stats);\n    const criticalRecommendations = this.recommendationService.getCriticalRecommendations(stats);\n    const recommendationsByCategory = {\n      performance: this.recommendationService.getRecommendationsByCategory('performance', stats),\n      rendering: this.recommendationService.getRecommendationsByCategory('rendering', stats),\n      memory: this.recommendationService.getRecommendationsByCategory('memory', stats),\n      'best-practice': this.recommendationService.getRecommendationsByCategory('best-practice', stats)\n    };\n\n    const exportData = {\n      // Basic stats\n      lastFrameDuration: stats.lastFrameDuration,\n      averageFrameDuration: stats.averageFrameDuration,\n      frameCount: stats.frameCount,\n      topComponents: cleanTopComponents,\n      lastMeasurement: stats.lastMeasurement,\n      renderCounts: Object.fromEntries(this.renderCounts),\n      frameMeasurements: this.frameMeasurements,\n      \n      // Enhanced performance analysis\n      performanceSummary: {\n        score: performanceSummary.score,\n        health: performanceSummary.health,\n        acceptable: performanceSummary.acceptable,\n        criticalIssues: performanceSummary.criticalIssues,\n        warnings: performanceSummary.warnings,\n        isPerformanceAcceptable: this.recommendationService.isPerformanceAcceptable(stats)\n      },\n      \n      // Comprehensive recommendations\n      recommendations: stats.recommendations,\n      criticalRecommendations: criticalRecommendations,\n      recommendationsByCategory: recommendationsByCategory,\n      \n      // Performance thresholds and standards\n      performanceThresholds: {\n        targetFrameTime: 16.67, // 60fps\n        acceptableFrameTime: 33.33, // 30fps\n        criticalFrameTime: 50,\n        excellentScore: 90,\n        goodScore: 75,\n        fairScore: 60,\n        poorScore: 40\n      },\n      \n      // Export metadata\n      exportTimestamp: new Date().toISOString(),\n      profilerVersion: '1.0.0',\n      exportFormat: 'enhanced-json'\n    };\n\n    return JSON.stringify(exportData, null, 2);\n  }\n\n  /**\n   * Get current render count for a component\n   */\n  getRenderCount(name: string): number {\n    return this.renderCounts.get(name) || 0;\n  }\n\n  /**\n   * Get all render counts\n   */\n  getAllRenderCounts(): Map<string, number> {\n    return new Map(this.renderCounts);\n  }\n\n  /**\n   * Pause render counting\n   */\n  pauseRenderCounting(): void {\n    this.isPaused = true;\n  }\n\n  /**\n   * Resume render counting\n   */\n  resumeRenderCounting(): void {\n    this.isPaused = false;\n  }\n}\n","import { InjectionToken } from '@angular/core';\n\nexport interface NgProfilerConfig {\n  /** Enable profiler in production (default: false) */\n  enableInProduction?: boolean;\n\n  /** Hotkey to toggle overlay (default: 'Ctrl+Shift+P') */\n  hotkey?: string;\n\n  /** Position of overlay (default: 'top-right') */\n  position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\n\n  /** Threshold for render count warnings (default: 10) */\n  renderCountThreshold?: number;\n\n  /** Threshold for frame duration warnings in ms (default: 16.67) */\n  frameDurationThreshold?: number;\n\n  /** Enable heatmap outlines (default: true) */\n  enableHeatmap?: boolean;\n\n  /** Enable performance measurement (default: true) */\n  enableMeasurement?: boolean;\n}\n\nexport const NG_PROFILER_CONFIG = new InjectionToken<NgProfilerConfig>('NgProfilerConfig');\n\nexport interface ProfilerStats {\n  /** Last tick/frame duration in ms */\n  lastFrameDuration: number;\n\n  /** Average frame duration in ms */\n  averageFrameDuration: number;\n\n  /** Total number of frames measured */\n  frameCount: number;\n\n  /** Top components by render count */\n  topComponents: ComponentRenderStats[];\n\n  /** Timestamp of last measurement */\n  lastMeasurement: number;\n\n  /** Performance recommendations */\n  recommendations?: PerformanceRecommendation[];\n}\n\nexport interface ComponentRenderStats {\n  /** Component name or element tag */\n  name: string;\n\n  /** Number of renders */\n  renderCount: number;\n\n  /** Severity level */\n  severity: 'low' | 'medium' | 'high';\n\n  /** Element reference for heatmap */\n  element?: HTMLElement;\n}\n\nexport interface FrameMeasurement {\n  duration: number;\n  timestamp: number;\n}\n\nexport interface PerformanceRecommendation {\n  id: string;\n  type: 'warning' | 'error' | 'info' | 'optimization';\n  title: string;\n  description: string;\n  severity: 'low' | 'medium' | 'high' | 'critical';\n  category: 'performance' | 'memory' | 'rendering' | 'best-practice';\n  suggestions: string[];\n  impact: string;\n  priority: number;\n}\n\n// Zone.js type declaration\ndeclare global {\n  interface Window {\n    Zone?: any;\n  }\n}\n","import { Injectable, Inject, ApplicationRef } from '@angular/core';\nimport { ProfilerStore } from './profiler-store.service';\nimport { NgProfilerConfig, NG_PROFILER_CONFIG } from '../models/ng-profiler-config';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class NgProfilerService {\n  private isEnabled = false;\n  private isZoned = false;\n  private originalTick: any;\n  private frameStartTime = 0;\n  private longTaskObserver: PerformanceObserver | null = null;\n  private animationFrameId: number | null = null;\n\n  constructor(\n    private appRef: ApplicationRef,\n    private profilerStore: ProfilerStore,\n    @Inject(NG_PROFILER_CONFIG) private config: NgProfilerConfig\n  ) {\n    this.detectZone();\n    this.setupHotkey();\n  }\n\n  /**\n   * Initialize the profiler\n   */\n  initialize(): void {\n    console.log('NgProfiler: Initializing profiler...');\n    console.log('NgProfiler: shouldEnable() =', this.shouldEnable());\n    console.log('NgProfiler: isProduction() =', this.isProduction());\n    console.log('NgProfiler: isZoned =', this.isZoned);\n\n    if (!this.shouldEnable()) {\n      console.log('NgProfiler: Profiler disabled');\n      return;\n    }\n\n    console.log('NgProfiler: Profiler enabled');\n    this.isEnabled = true;\n\n    if (this.isZoned) {\n      console.log('NgProfiler: Setting up zoned measurement');\n      this.patchApplicationRef();\n    } else {\n      console.log('NgProfiler: Setting up zoneless measurement');\n      this.setupZonelessMeasurement();\n    }\n  }\n\n  /**\n   * Check if profiler should be enabled\n   */\n  private shouldEnable(): boolean {\n    if (this.config.enableInProduction) {\n      return true;\n    }\n\n    // Disable in production unless forced\n    return !this.isProduction();\n  }\n\n  /**\n   * Check if running in production\n   */\n  private isProduction(): boolean {\n    return (\n      typeof window !== 'undefined' &&\n      window.location.hostname !== 'localhost' &&\n      window.location.hostname !== '127.0.0.1' &&\n      window.location.protocol !== 'file:'\n    );\n  }\n\n  /**\n   * Detect if Zone.js is present\n   */\n  private detectZone(): void {\n    this.isZoned = typeof (window as any).Zone !== 'undefined' && (window as any).Zone.current;\n  }\n\n  /**\n   * Patch ApplicationRef.tick() for zoned applications\n   */\n  private patchApplicationRef(): void {\n    if (this.originalTick) {\n      return; // Already patched\n    }\n\n    this.originalTick = this.appRef.tick;\n\n    this.appRef.tick = () => {\n      const startTime = performance.now();\n\n      try {\n        const result = this.originalTick.call(this.appRef);\n        const endTime = performance.now();\n        const duration = endTime - startTime;\n\n        if (this.isEnabled) {\n          this.profilerStore.addFrameMeasurement(duration);\n        }\n        return result;\n      } catch (error) {\n        const endTime = performance.now();\n        const duration = endTime - startTime;\n        if (this.isEnabled) {\n          this.profilerStore.addFrameMeasurement(duration);\n        }\n        throw error;\n      }\n    };\n  }\n\n  /**\n   * Setup measurement for zoneless applications\n   */\n  private setupZonelessMeasurement(): void {\n    // Use requestAnimationFrame to measure frame timing\n    const measureFrame = () => {\n      const currentTime = performance.now();\n\n      if (this.frameStartTime > 0 && this.isEnabled) {\n        const frameDuration = currentTime - this.frameStartTime;\n        this.profilerStore.addFrameMeasurement(frameDuration);\n      }\n\n      this.frameStartTime = currentTime;\n      this.animationFrameId = requestAnimationFrame(measureFrame);\n    };\n\n    this.animationFrameId = requestAnimationFrame(measureFrame);\n\n    // Setup PerformanceObserver for long tasks\n    if ('PerformanceObserver' in window) {\n      try {\n        this.longTaskObserver = new PerformanceObserver((list) => {\n          for (const entry of list.getEntries()) {\n            if (entry.entryType === 'longtask' && this.isEnabled) {\n              const duration = entry.duration;\n              this.profilerStore.addFrameMeasurement(duration);\n            }\n          }\n        });\n\n        this.longTaskObserver.observe({ entryTypes: ['longtask'] });\n      } catch (error) {\n        console.warn('NgProfiler: PerformanceObserver not supported');\n      }\n    }\n  }\n\n  /**\n   * Setup hotkey listener\n   */\n  private setupHotkey(): void {\n    const hotkey = this.config.hotkey || 'Ctrl+Shift+P';\n\n    document.addEventListener('keydown', (event) => {\n      const isCtrl = event.ctrlKey || event.metaKey;\n      const isShift = event.shiftKey;\n      const isP = event.key === 'p' || event.key === 'P';\n\n      if (isCtrl && isShift && isP) {\n        event.preventDefault();\n        console.log('NgProfiler: Hotkey detected, toggling overlay');\n        this.toggleOverlay();\n      }\n    });\n  }\n\n  /**\n   * Toggle overlay visibility\n   */\n  toggleOverlay(): void {\n    // This will be handled by the overlay component\n    console.log('NgProfiler: Dispatching toggle event');\n    const event = new CustomEvent('ng-profiler-toggle');\n    document.dispatchEvent(event);\n  }\n\n  /**\n   * Cleanup resources\n   */\n  destroy(): void {\n    if (this.originalTick && this.appRef.tick !== this.originalTick) {\n      this.appRef.tick = this.originalTick;\n    }\n\n    if (this.animationFrameId) {\n      cancelAnimationFrame(this.animationFrameId);\n    }\n\n    if (this.longTaskObserver) {\n      this.longTaskObserver.disconnect();\n    }\n  }\n\n  /**\n   * Get current configuration\n   */\n  getConfig(): NgProfilerConfig {\n    return { ...this.config };\n  }\n\n  /**\n   * Check if profiler is enabled\n   */\n  isProfilerEnabled(): boolean {\n    return this.isEnabled;\n  }\n\n  /**\n   * Check if running in zoned mode\n   */\n  isZonedMode(): boolean {\n    return this.isZoned;\n  }\n\n  /**\n   * Pause profiling temporarily\n   */\n  pauseProfiling(): void {\n    this.isEnabled = false;\n\n    // Also stop any ongoing measurements\n    if (this.animationFrameId) {\n      cancelAnimationFrame(this.animationFrameId);\n      this.animationFrameId = null;\n    }\n\n    if (this.longTaskObserver) {\n      this.longTaskObserver.disconnect();\n    }\n  }\n\n  /**\n   * Resume profiling\n   */\n  resumeProfiling(): void {\n    if (this.shouldEnable()) {\n      this.isEnabled = true;\n\n      // Restart measurements if they were stopped\n      if (!this.isZoned && !this.animationFrameId) {\n        this.setupZonelessMeasurement();\n      }\n    }\n  }\n}\n","import { Component, OnInit, OnDestroy, HostListener, ElementRef, ViewChild } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Subscription } from 'rxjs';\nimport { ProfilerStore } from '../services/profiler-store.service';\nimport { NgProfilerService } from '../services/ng-profiler.service';\nimport {\n  ProfilerStats,\n  ComponentRenderStats,\n  PerformanceRecommendation,\n} from '../models/ng-profiler-config';\n\n@Component({\n  selector: 'codezetta-ng-profiler-overlay',\n  standalone: true,\n  imports: [CommonModule],\n  template: `\n    <div\n      class=\"ng-profiler-overlay\"\n      [class.visible]=\"isVisible\"\n      [class.top-left]=\"position === 'top-left'\"\n      [class.top-right]=\"position === 'top-right'\"\n      [class.bottom-left]=\"position === 'bottom-left'\"\n      [class.bottom-right]=\"position === 'bottom-right'\"\n      (click)=\"$event.stopPropagation()\"\n    >\n      <div class=\"ng-profiler-header\">\n        <h3>Angular Profiler</h3>\n        <div class=\"ng-profiler-controls\">\n          <button\n            class=\"ng-profiler-btn ng-profiler-btn-small\"\n            (click)=\"resetStats()\"\n            title=\"Reset Statistics\"\n          >\n            🔄\n          </button>\n          <button\n            class=\"ng-profiler-btn ng-profiler-btn-small\"\n            (click)=\"exportStats()\"\n            title=\"Export JSON Statistics\"\n          >\n            📊\n          </button>\n          <button\n            class=\"ng-profiler-btn ng-profiler-btn-small\"\n            (click)=\"exportPDF()\"\n            title=\"Export PDF Report\"\n          >\n            📄\n          </button>\n          <button\n            class=\"ng-profiler-btn ng-profiler-btn-small\"\n            (click)=\"toggleVisibility()\"\n            title=\"Close\"\n          >\n            ✕\n          </button>\n        </div>\n      </div>\n\n      <div class=\"ng-profiler-content\">\n        <!-- Frame Statistics -->\n        <div class=\"ng-profiler-section\">\n          <h4>Frame Performance</h4>\n          <div class=\"ng-profiler-stats\">\n            <div class=\"ng-profiler-stat\">\n              <span class=\"ng-profiler-label\">Last Frame:</span>\n              <span\n                class=\"ng-profiler-value\"\n                [class.warning]=\"stats.lastFrameDuration > 16.67\"\n                [class.error]=\"stats.lastFrameDuration > 33.33\"\n              >\n                {{ stats.lastFrameDuration.toFixed(2) }}ms\n              </span>\n            </div>\n            <div class=\"ng-profiler-stat\">\n              <span class=\"ng-profiler-label\">Average:</span>\n              <span\n                class=\"ng-profiler-value\"\n                [class.warning]=\"stats.averageFrameDuration > 16.67\"\n                [class.error]=\"stats.averageFrameDuration > 33.33\"\n              >\n                {{ stats.averageFrameDuration.toFixed(2) }}ms\n              </span>\n            </div>\n            <div class=\"ng-profiler-stat\">\n              <span class=\"ng-profiler-label\">Frames:</span>\n              <span class=\"ng-profiler-value\">{{ stats.frameCount }}</span>\n            </div>\n          </div>\n        </div>\n\n        <!-- Top Components -->\n        <div class=\"ng-profiler-section\">\n          <h4>Top Components by Render Count</h4>\n          <div class=\"ng-profiler-components\">\n            <div\n              *ngFor=\"let component of stats.topComponents; trackBy: trackByComponent\"\n              class=\"ng-profiler-component\"\n              [class.severity-low]=\"component.severity === 'low'\"\n              [class.severity-medium]=\"component.severity === 'medium'\"\n              [class.severity-high]=\"component.severity === 'high'\"\n            >\n              <span class=\"ng-profiler-component-name\">{{ component.name }}</span>\n              <span class=\"ng-profiler-component-count\">{{ component.renderCount }}</span>\n            </div>\n            <div *ngIf=\"stats.topComponents.length === 0\" class=\"ng-profiler-empty\">\n              No components tracked yet\n            </div>\n          </div>\n        </div>\n\n        <!-- Mode Indicator -->\n        <div class=\"ng-profiler-section\">\n          <div class=\"ng-profiler-mode\">\n            <span class=\"ng-profiler-label\">Mode:</span>\n            <span class=\"ng-profiler-value\">\n              {{ profilerService.isZonedMode() ? 'Zoned' : 'Zoneless' }}\n            </span>\n          </div>\n        </div>\n\n        <!-- Performance Recommendations -->\n        <div\n          class=\"ng-profiler-section\"\n          *ngIf=\"stats.recommendations && stats.recommendations.length > 0\"\n        >\n          <h4>Performance Recommendations</h4>\n          <div class=\"ng-profiler-recommendations\">\n            <div\n              *ngFor=\"let rec of stats.recommendations.slice(0, 3); trackBy: trackByRecommendation\"\n              class=\"ng-profiler-recommendation\"\n              [class.severity-critical]=\"rec.severity === 'critical'\"\n              [class.severity-high]=\"rec.severity === 'high'\"\n              [class.severity-medium]=\"rec.severity === 'medium'\"\n              [class.severity-low]=\"rec.severity === 'low'\"\n            >\n              <div class=\"ng-profiler-recommendation-header\">\n                <span class=\"ng-profiler-recommendation-title\">{{ rec.title }}</span>\n                <span class=\"ng-profiler-recommendation-severity\">{{\n                  rec.severity.toUpperCase()\n                }}</span>\n              </div>\n              <div class=\"ng-profiler-recommendation-description\">{{ rec.description }}</div>\n              <div class=\"ng-profiler-recommendation-impact\">\n                <strong>Impact:</strong> {{ rec.impact }}\n              </div>\n            </div>\n            <div\n              *ngIf=\"stats.recommendations && stats.recommendations.length > 3\"\n              class=\"ng-profiler-more-recommendations\"\n            >\n              <button\n                class=\"ng-profiler-btn ng-profiler-btn-small\"\n                (click)=\"showAllRecommendations()\"\n              >\n                Show All ({{ stats.recommendations.length }})\n              </button>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  `,\n  styles: [\n    `\n      .ng-profiler-overlay {\n        position: fixed;\n        z-index: 9999;\n        background: rgba(0, 0, 0, 0.9);\n        color: white;\n        border-radius: 8px;\n        padding: 16px;\n        min-width: 300px;\n        max-width: 400px;\n        font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n        font-size: 14px;\n        line-height: 1.4;\n        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);\n        backdrop-filter: blur(10px);\n        border: 1px solid rgba(255, 255, 255, 0.1);\n        transform: translateY(-100%);\n        opacity: 0;\n        visibility: hidden;\n        transition: all 0.3s ease;\n        pointer-events: none;\n      }\n\n      .ng-profiler-overlay.visible {\n        transform: translateY(0);\n        opacity: 1;\n        visibility: visible;\n        pointer-events: all;\n      }\n\n      .ng-profiler-overlay.top-right {\n        top: 20px;\n        right: 20px;\n      }\n\n      .ng-profiler-overlay.top-left {\n        top: 20px;\n        left: 20px;\n      }\n\n      .ng-profiler-overlay.bottom-right {\n        bottom: 20px;\n        right: 20px;\n      }\n\n      .ng-profiler-overlay.bottom-left {\n        bottom: 20px;\n        left: 20px;\n      }\n\n      .ng-profiler-header {\n        display: flex;\n        justify-content: space-between;\n        align-items: center;\n        margin-bottom: 16px;\n        padding-bottom: 8px;\n        border-bottom: 1px solid rgba(255, 255, 255, 0.2);\n      }\n\n      .ng-profiler-header h3 {\n        margin: 0;\n        font-size: 16px;\n        font-weight: 600;\n        color: #fff;\n      }\n\n      .ng-profiler-controls {\n        display: flex;\n        gap: 4px;\n      }\n\n      .ng-profiler-btn {\n        background: rgba(255, 255, 255, 0.1);\n        border: 1px solid rgba(255, 255, 255, 0.2);\n        color: white;\n        border-radius: 4px;\n        cursor: pointer;\n        transition: all 0.2s ease;\n        font-size: 12px;\n        padding: 4px 8px;\n      }\n\n      .ng-profiler-btn:hover {\n        background: rgba(255, 255, 255, 0.2);\n      }\n\n      .ng-profiler-btn-small {\n        padding: 2px 6px;\n        font-size: 10px;\n      }\n\n      .ng-profiler-content {\n        display: flex;\n        flex-direction: column;\n        gap: 16px;\n      }\n\n      .ng-profiler-section {\n        display: flex;\n        flex-direction: column;\n        gap: 8px;\n      }\n\n      .ng-profiler-section h4 {\n        margin: 0;\n        font-size: 14px;\n        font-weight: 600;\n        color: #fff;\n      }\n\n      .ng-profiler-stats {\n        display: flex;\n        flex-direction: column;\n        gap: 4px;\n      }\n\n      .ng-profiler-stat {\n        display: flex;\n        justify-content: space-between;\n        align-items: center;\n      }\n\n      .ng-profiler-label {\n        color: rgba(255, 255, 255, 0.7);\n        font-size: 12px;\n      }\n\n      .ng-profiler-value {\n        font-weight: 600;\n        font-family: 'Monaco', 'Menlo', monospace;\n        font-size: 12px;\n      }\n\n      .ng-profiler-value.warning {\n        color: #ffd700;\n      }\n\n      .ng-profiler-value.error {\n        color: #ff6b6b;\n      }\n\n      .ng-profiler-components {\n        display: flex;\n        flex-direction: column;\n        gap: 4px;\n        max-height: 200px;\n        overflow-y: auto;\n      }\n\n      .ng-profiler-component {\n        display: flex;\n        justify-content: space-between;\n        align-items: center;\n        padding: 4px 8px;\n        border-radius: 4px;\n        background: rgba(255, 255, 255, 0.05);\n        border-left: 3px solid transparent;\n      }\n\n      .ng-profiler-component.severity-low {\n        border-left-color: #4caf50;\n      }\n\n      .ng-profiler-component.severity-medium {\n        border-left-color: #ff9800;\n      }\n\n      .ng-profiler-component.severity-high {\n        border-left-color: #f44336;\n      }\n\n      .ng-profiler-component-name {\n        font-size: 12px;\n        color: rgba(255, 255, 255, 0.9);\n        flex: 1;\n        overflow: hidden;\n        text-overflow: ellipsis;\n        white-space: nowrap;\n      }\n\n      .ng-profiler-component-count {\n        font-weight: 600;\n        font-family: 'Monaco', 'Menlo', monospace;\n        font-size: 12px;\n        color: #fff;\n        margin-left: 8px;\n      }\n\n      .ng-profiler-empty {\n        color: rgba(255, 255, 255, 0.5);\n        font-style: italic;\n        text-align: center;\n        padding: 8px;\n      }\n\n      .ng-profiler-mode {\n        display: flex;\n        justify-content: space-between;\n        align-items: center;\n        padding: 8px;\n        background: rgba(255, 255, 255, 0.05);\n        border-radius: 4px;\n      }\n\n      /* Scrollbar styling */\n      .ng-profiler-components::-webkit-scrollbar {\n        width: 4px;\n      }\n\n      .ng-profiler-components::-webkit-scrollbar-track {\n        background: rgba(255, 255, 255, 0.1);\n        border-radius: 2px;\n      }\n\n      .ng-profiler-components::-webkit-scrollbar-thumb {\n        background: rgba(255, 255, 255, 0.3);\n        border-radius: 2px;\n      }\n\n      .ng-profiler-components::-webkit-scrollbar-thumb:hover {\n        background: rgba(255, 255, 255, 0.5);\n      }\n\n      /* Recommendations Styles */\n      .ng-profiler-recommendations {\n        max-height: 200px;\n        overflow-y: auto;\n      }\n\n      .ng-profiler-recommendation {\n        background: rgba(255, 255, 255, 0.05);\n        border-radius: 6px;\n        padding: 12px;\n        margin-bottom: 8px;\n        border-left: 4px solid rgba(255, 255, 255, 0.3);\n      }\n\n      .ng-profiler-recommendation.severity-critical {\n        border-left-color: #dc3545;\n        background: rgba(220, 53, 69, 0.1);\n      }\n\n      .ng-profiler-recommendation.severity-high {\n        border-left-color: #fd7e14;\n        background: rgba(253, 126, 20, 0.1);\n      }\n\n      .ng-profiler-recommendation.severity-medium {\n        border-left-color: #ffc107;\n        background: rgba(255, 193, 7, 0.1);\n      }\n\n      .ng-profiler-recommendation.severity-low {\n        border-left-color: #28a745;\n        background: rgba(40, 167, 69, 0.1);\n      }\n\n      .ng-profiler-recommendation-header {\n        display: flex;\n        justify-content: space-between;\n        align-items: center;\n        margin-bottom: 8px;\n      }\n\n      .ng-profiler-recommendation-title {\n        font-weight: 600;\n        font-size: 13px;\n        color: #fff;\n      }\n\n      .ng-profiler-recommendation-severity {\n        font-size: 10px;\n        font-weight: bold;\n        padding: 2px 6px;\n        border-radius: 3px;\n        text-transform: uppercase;\n      }\n\n      .ng-profiler-recommendation.severity-critical .ng-profiler-recommendation-severity {\n        background: #dc3545;\n        color: white;\n      }\n\n      .ng-profiler-recommendation.severity-high .ng-profiler-recommendation-severity {\n        background: #fd7e14;\n        color: white;\n      }\n\n      .ng-profiler-recommendation.severity-medium .ng-profiler-recommendation-severity {\n        background: #ffc107;\n        color: black;\n      }\n\n      .ng-profiler-recommendation.severity-low .ng-profiler-recommendation-severity {\n        background: #28a745;\n        color: white;\n      }\n\n      .ng-profiler-recommendation-description {\n        font-size: 12px;\n        color: rgba(255, 255, 255, 0.8);\n        margin-bottom: 8px;\n        line-height: 1.4;\n      }\n\n      .ng-profiler-recommendation-impact {\n        font-size: 11px;\n        color: rgba(255, 255, 255, 0.7);\n        font-style: italic;\n      }\n\n      .ng-profiler-more-recommendations {\n        text-align: center;\n        margin-top: 8px;\n      }\n    `,\n  ],\n})\nexport class NgProfilerOverlayComponent implements OnInit, OnDestroy {\n  isVisible = true; // Show by default in development\n  stats: ProfilerStats = {\n    lastFrameDuration: 0,\n    averageFrameDuration: 0,\n    frameCount: 0,\n    topComponents: [],\n    lastMeasurement: Date.now(),\n  };\n\n  private subscription: Subscription | null = null;\n  position: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' = 'top-right';\n\n  constructor(private profilerStore: ProfilerStore, public profilerService: NgProfilerService) {\n    this.position = this.profilerService.getConfig().position || 'top-right';\n  }\n\n  ngOnInit(): void {\n    console.log('NgProfiler: Overlay component initialized, isVisible:', this.isVisible);\n\n    this.subscription = this.profilerStore.stats$.subscribe((stats) => {\n      this.stats = stats;\n    });\n\n    // Listen for toggle events\n    document.addEventListener('ng-profiler-toggle', () => {\n      console.log('NgProfiler: Toggle event received, toggling visibility');\n      this.toggleVisibility();\n    });\n  }\n\n  ngOnDestroy(): void {\n    if (this.subscription) {\n      this.subscription.unsubscribe();\n    }\n  }\n\n  @HostListener('document:keydown.escape')\n  onEscapeKey(): void {\n    if (this.isVisible) {\n      this.isVisible = false;\n    }\n  }\n\n  toggleVisibility(): void {\n    this.isVisible = !this.isVisible;\n    console.log('NgProfiler: Overlay visibility toggled to:', this.isVisible);\n\n    // Force change detection and DOM update\n    setTimeout(() => {\n      const overlay = document.querySelector('.ng-profiler-overlay');\n      if (overlay) {\n        // Manually update classes to ensure they're correct\n        if (this.isVisible) {\n          overlay.classList.add('visible');\n        } else {\n          overlay.classList.remove('visible');\n        }\n\n        console.log('NgProfiler: Overlay classes after manual update:', overlay.className);\n        console.log(\n          'NgProfiler: Overlay computed style visibility:',\n          getComputedStyle(overlay).visibility\n        );\n        console.log(\n          'NgProfiler: Overlay computed style opacity:',\n          getComputedStyle(overlay).opacity\n        );\n        console.log(\n          'NgProfiler: Overlay computed style transform:',\n          getComputedStyle(overlay).transform\n        );\n      }\n    }, 50);\n  }\n\n  resetStats(): void {\n    this.profilerStore.reset();\n  }\n\n  exportStats(): void {\n    console.log('NgProfiler: Export button clicked');\n\n    try {\n      // Take a snapshot of stats BEFORE starting the export process\n      const statsSnapshot = this.profilerStore.exportStats();\n      console.log('NgProfiler: Stats snapshot taken before JSON export');\n\n      // Temporarily pause profiling to avoid counting export renders\n      this.profilerService.pauseProfiling();\n      this.profilerStore.pauseRenderCounting();\n      console.log('NgProfiler: Profiling paused during JSON export');\n\n      // Use the snapshot data instead of calling exportStats again\n      const blob = new Blob([statsSnapshot], { type: 'application/json' });\n      const url = URL.createObjectURL(blob);\n\n      const a = document.createElement('a');\n      a.href = url;\n      a.download = `ng-profiler-stats-${new Date()\n        .toISOString()\n        .slice(0, 19)\n        .replace(/:/g, '-')}.json`;\n\n      document.body.appendChild(a);\n      a.click();\n      document.body.removeChild(a);\n      URL.revokeObjectURL(url);\n      console.log('NgProfiler: Export completed successfully');\n    } catch (error) {\n      console.error('NgProfiler: Export failed:', error);\n    } finally {\n      // Always resume profiling, even if export failed\n      this.profilerService.resumeProfiling();\n      this.profilerStore.resumeRenderCounting();\n      console.log('NgProfiler: Profiling resumed after JSON export');\n    }\n  }\n\n  async exportPDF(): Promise<void> {\n    try {\n      // Take a snapshot of stats BEFORE starting ANY export process\n      const statsSnapshot = this.profilerStore.exportStats();\n      const statsData = JSON.parse(statsSnapshot);\n\n      // Completely disable the profiler during export\n      this.profilerService.pauseProfiling();\n      this.profilerStore.pauseRenderCounting();\n\n      // Wait for any pending operations to complete\n      await new Promise((resolve) => setTimeout(resolve, 200));\n\n      // Force garbage collection if available\n      if ((window as any).gc) {\n        (window as any).gc();\n      }\n\n      // Dynamically import jsPDF only (no html2canvas to avoid DOM manipulation)\n      // Use a more robust dynamic import approach\n      let jsPDF: any;\n      try {\n        // Try multiple import strategies\n        try {\n          // Strategy 1: Direct dynamic import\n          jsPDF = await import('jspdf').then((m: any) => m.default);\n        } catch (e1) {\n          try {\n            // Strategy 2: Function constructor approach\n            const importJspdf = new Function('return import(\"jspdf\")');\n            jsPDF = await importJspdf().then((m: any) => m.default);\n          } catch (e2) {\n            try {\n              // Strategy 3: Try to access from window object\n              jsPDF = (window as any).jsPDF;\n              if (!jsPDF) {\n                throw new Error('jsPDF not found in window object');\n              }\n            } catch (e3) {\n              throw new Error('All import strategies failed');\n            }\n          }\n        }\n      } catch (importError) {\n        console.error('NgProfiler: jspdf import failed:', importError);\n        alert(\n          'PDF export requires jspdf and html2canvas packages. Please install them with: npm install jspdf html2canvas'\n        );\n        return;\n      }\n\n      // Create PDF directly from data (no DOM manipulation)\n      const pdf = new jsPDF('p', 'mm', 'a4');\n      const pageWidth = pdf.internal.pageSize.getWidth();\n      const pageHeight = pdf.internal.pageSize.getHeight();\n      const margin = 20;\n      const contentWidth = pageWidth - 2 * margin;\n      let yPosition = margin;\n\n      // Helper function to check if we need a new page\n      const checkNewPage = (requiredSpace: number) => {\n        if (yPosition + requiredSpace > pageHeight - margin) {\n          pdf.addPage();\n          yPosition = margin;\n          return true;\n        }\n        return false;\n      };\n\n      // Helper function to add text with word wrapping\n      const addWrappedText = (text: string, fontSize: number, y: number, isBold = false) => {\n        pdf.setFontSize(fontSize);\n        if (isBold) pdf.setFont('helvetica', 'bold');\n        else pdf.setFont('helvetica', 'normal');\n\n        const lines = pdf.splitTextToSize(text, contentWidth);\n\n        // Check if we need a new page for this text\n        const textHeight = lines.length * fontSize * 0.4;\n        checkNewPage(textHeight);\n\n        pdf.text(lines, margin, yPosition);\n        yPosition += textHeight;\n        return yPosition;\n      };\n\n      // Helper function to add a section\n      const addSection = (title: string) => {\n        checkNewPage(50); // Space for title + spacing\n        yPosition = addWrappedText(title, 16, yPosition, true);\n        yPosition += 20; // Increased spacing after section title\n        return yPosition;\n      };\n\n      // Title\n      yPosition = addWrappedText('Angular Profiler Report', 24, yPosition, true);\n      yPosition = addWrappedText(`Generated on ${new Date().toLocaleString()}`, 12, yPosition);\n      yPosition += 20;\n\n      // Performance Score and Health\n      if (statsData.performanceSummary) {\n        yPosition = addSection('Performance Health Score');\n        const score = statsData.performanceSummary.score;\n        const health = statsData.performanceSummary.health;\n        const healthColor =\n          health === 'excellent'\n            ? [40, 167, 69]\n            : health === 'good'\n            ? [0, 122, 204]\n            : health === 'fair'\n            ? [255, 193, 7]\n            : health === 'poor'\n            ? [255, 152, 0]\n            : [220, 53, 69];\n\n        // Score circle\n        const centerX = pageWidth / 2;\n        const centerY = yPosition + 20;\n        const radius = 30;\n        pdf.setFillColor(healthColor[0], healthColor[1], healthColor[2]);\n        pdf.circle(centerX, centerY, radius, 'F');\n        pdf.setFontSize(18);\n        pdf.setFont('helvetica', 'bold');\n        pdf.setTextColor(255, 255, 255);\n        pdf.text(score.toString(), centerX - 10, centerY + 6);\n\n        // Health label - Fixed positioning and visibility\n        pdf.setFontSize(16);\n        pdf.setFont('helvetica', 'bold');\n        pdf.setTextColor(healthColor[0], healthColor[1], healthColor[2]);\n        pdf.text(health.toUpperCase(), centerX - 30, centerY + 40);\n\n        // Status indicators - Fixed layout and values\n        const statusY = yPosition + 70;\n        const statusItems = [\n          {\n            label: 'Performance Acceptable',\n            value: statsData.performanceSummary.acceptable ? 'YES' : 'NO',\n            color: statsData.performanceSummary.acceptable ? [40, 167, 69] : [220, 53, 69],\n          },\n          {\n            label: 'Critical Issues',\n            value: statsData.performanceSummary.criticalIssues.toString(),\n            color: [220, 53, 69],\n          },\n          {\n            label: 'Warnings',\n            value: statsData.performanceSummary.warnings.toString(),\n            color: [255, 193, 7],\n          },\n        ];\n\n        statusItems.forEach((item, index) => {\n          const x = margin + index * (contentWidth / 3);\n\n          // Draw background box for better visibility - Increased height for text\n          pdf.setFillColor(248, 249, 250);\n          pdf.rect(x - 5, statusY - 5, contentWidth / 3 - 10, 35, 'F');\n          pdf.setDrawColor(221, 221, 221);\n          pdf.rect(x - 5, statusY - 5, contentWidth / 3 - 10, 35);\n\n          // Value (YES/NO or number) - Fixed positioning\n          pdf.setFontSize(14);\n          pdf.setFont('helvetica', 'bold');\n          pdf.setTextColor(item.color[0], item.color[1], item.color[2]);\n          pdf.text(item.value, x + 8, statusY + 8);\n\n          // Label - Fixed positioning and size - Moved down to fit in box\n          pdf.setFontSize(9);\n          pdf.setFont('helvetica', 'normal');\n          pdf.setTextColor(102, 102, 102);\n          pdf.text(item.label, x + 8, statusY + 25);\n        });\n        yPosition += 90;\n      }\n\n      // Add more spacing between Performance Health Score and Performance Metrics to prevent overlap\n      yPosition += 20;\n\n      // Performance Metrics\n      yPosition = addSection('Performance Metrics');\n\n      // // Add minimal spacing after section title\n      // yPosition += 5;\n\n      const metrics = [\n        { label: 'Last Frame', value: `${statsData.lastFrameDuration.toFixed(2)}ms` },\n        { label: 'Average Frame', value: `${statsData.averageFrameDuration.toFixed(2)}ms` },\n        { label: 'Total Frames', value: statsData.frameCount.toString() },\n      ];\n\n      // Check if we need a new page for metrics\n      checkNewPage(50);\n\n      metrics.forEach((metric, index) => {\n        const x = margin + index * (contentWidth / 3);\n        const boxY = yPosition;\n\n        // Draw box with better styling\n        pdf.setFillColor(248, 249, 250);\n        pdf.rect(x, boxY, contentWidth / 3 - 5, 35, 'F');\n        pdf.setDrawColor(0, 122, 204);\n        pdf.setLineWidth(0.5);\n        pdf.rect(x, boxY, contentWidth / 3 - 5, 35);\n\n        // Add value text\n        pdf.setFontSize(18);\n        pdf.setFont('helvetica', 'bold');\n        pdf.setTextColor(0, 122, 204);\n        pdf.text(metric.value, x + 5, boxY + 15);\n\n        // Add label text - Fixed size and positioning\n        pdf.setFontSize(11);\n        pdf.setFont('helvetica', 'normal');\n        pdf.setTextColor(102, 102, 102);\n        pdf.text(metric.label, x + 5, boxY + 28);\n      });\n\n      yPosition += 45;\n\n      // Top Components\n      yPosition = addSection('Top Components by Render Count');\n\n      if (statsData.topComponents.length > 0) {\n        // Check space for table\n        const tableHeight = 12 + statsData.topComponents.length * 12;\n        checkNewPage(tableHeight);\n\n        // Table header\n        const colWidth = contentWidth / 3;\n        const headerY = yPosition;\n\n        pdf.setFillColor(0, 122, 204);\n        pdf.rect(margin, headerY, colWidth, 12, 'F');\n        pdf.rect(margin + colWidth, headerY, colWidth, 12, 'F');\n        pdf.rect(margin + 2 * colWidth, headerY, colWidth, 12, 'F');\n\n        pdf.setFontSize(11);\n        pdf.setFont('helvetica', 'bold');\n        pdf.setTextColor(255, 255, 255);\n        pdf.text('Component', margin + 3, headerY + 8);\n        pdf.text('Render Count', margin + colWidth + 3, headerY + 8);\n        pdf.text('Severity', margin + 2 * colWidth + 3, headerY + 8);\n\n        yPosition += 14;\n\n        // Table rows\n        statsData.topComponents.forEach((comp: any, index: number) => {\n          const rowY = yPosition;\n          const bgColor = index % 2 === 0 ? [248, 249, 250] : [255, 255, 255];\n\n          pdf.setFillColor(bgColor[0], bgColor[1], bgColor[2]);\n          pdf.rect(margin, rowY, colWidth, 12, 'F');\n          pdf.rect(margin + colWidth, rowY, colWidth, 12, 'F');\n          pdf.rect(margin + 2 * colWidth, rowY, colWidth, 12, 'F');\n\n          pdf.setDrawColor(221, 221, 221);\n          pdf.setLineWidth(0.3);\n          pdf.rect(margin, rowY, colWidth, 12);\n          pdf.rect(margin + colWidth, rowY, colWidth, 12);\n          pdf.rect(margin + 2 * colWidth, rowY, colWidth, 12);\n\n          pdf.setFontSize(10);\n          pdf.setFont('helvetica', 'normal');\n          pdf.setTextColor(0, 0, 0);\n\n          // Truncate component name if too long\n          const componentName =\n            comp.name.length > 15 ? comp.name.substring(0, 12) + '...' : comp.name;\n          pdf.text(componentName, margin + 3, rowY + 8);\n          pdf.text(comp.renderCount.toString(), margin + colWidth + 3, rowY + 8);\n\n          // Severity badge\n          const severityColor =\n            comp.severity === 'high'\n              ? [220, 53, 69]\n              : comp.severity === 'medium'\n              ? [255, 193, 7]\n              : [40, 167, 69];\n          pdf.setFillColor(severityColor[0], severityColor[1], severityColor[2]);\n          pdf.roundedRect(margin + 2 * colWidth + 3, rowY + 3, 25, 6, 2, 2, 'F');\n          pdf.setTextColor(\n            comp.severity === 'high' ? 255 : 0,\n            comp.severity === 'high' ? 255 : 0,\n            comp.severity === 'high' ? 255 : 0\n          );\n          pdf.setFontSize(8);\n          pdf.setFont('helvetica', 'bold');\n          pdf.text(comp.severity.toUpperCase(), margin + 2 * colWidth + 5, rowY + 7);\n\n          yPosition += 14;\n        });\n      } else {\n        yPosition = addWrappedText('No components tracked yet', 12, yPosition);\n      }\n\n      yPosition += 15;\n\n      // All Recommendations Summary - Always show this section\n      yPosition = addSection('Performance Recommendations Summary');\n\n      // Show total recommendations count\n      const totalRecs = statsData.recommendations ? statsData.recommendations.length : 0;\n      const criticalRecs = statsData.recommendations\n        ? statsData.recommendations.filter((r: any) => r.severity === 'critical').length\n        : 0;\n      const highRecs = statsData.recommendations\n        ? statsData.recommendations.filter((r: any) => r.severity === 'high').length\n        : 0;\n      const mediumRecs = statsData.recommendations\n        ? statsData.recommendations.filter((r: any) => r.severity === 'medium').length\n        : 0;\n\n      yPosition = addWrappedText(`Total Recommendations: ${totalRecs}`, 12, yPosition);\n      yPosition = addWrappedText(\n        `Critical: ${criticalRecs} | High: ${highRecs} | Medium: ${mediumRecs}`,\n        10,\n        yPosition\n      );\n\n      // Add a note if no recommendations\n      if (totalRecs === 0) {\n        yPosition = addWrappedText(\n          'No performance issues detected. Your application is performing well!',\n          10,\n          yPosition\n        );\n      }\n\n      yPosition += 10;\n\n      // Critical Recommendations - Always show this section\n      yPosition = addSection('Critical Performance Issues');\n\n      if (statsData.criticalRecommendations && statsData.criticalRecommendations.length > 0) {\n        statsData.criticalRecommendations.forEach((rec: any, index: number) => {\n          if (index < 5) {\n            // Show top 5 critical issues\n            // Check space for this recommendation\n            checkNewPage(50);\n\n            // Recommendation header with severity badge\n            pdf.setFontSize(12);\n            pdf.setFont('helvetica', 'bold');\n            pdf.setTextColor(220, 53, 69); // Red for critical\n\n            // Draw severity badge\n            const badgeX = margin;\n            const badgeY = yPosition - 2;\n            pdf.setFillColor(220, 53, 69);\n            pdf.roundedRect(badgeX, badgeY, 25, 8, 2, 2, 'F');\n            pdf.setTextColor(255, 255, 255);\n            pdf.setFontSize(8);\n            pdf.setFont('helvetica', 'bold');\n            pdf.text('CRITICAL', badgeX + 2, badgeY + 5);\n\n            // Title\n            pdf.setFontSize(12);\n            pdf.setFont('helvetica', 'bold');\n            pdf.setTextColor(220, 53, 69);\n            yPosition = addWrappedText(`${rec.title}`, 12, yPosition);\n\n            // Description\n            pdf.setFontSize(10);\n            pdf.setFont('helvetica', 'normal');\n            pdf.setTextColor(0, 0, 0);\n            yPosition = addWrappedText(rec.description, 10, yPosition);\n\n            // Impact\n            pdf.setFontSize(9);\n            pdf.setFont('helvetica', 'italic');\n            pdf.setTextColor(102, 102, 102);\n            yPosition = addWrappedText(`Impact: ${rec.impact}`, 9, yPosition);\n\n            // Suggestions (show first 2)\n            if (rec.suggestions && rec.suggestions.length > 0) {\n              pdf.setFontSize(9);\n              pdf.setFont('helvetica', 'normal');\n              pdf.setTextColor(0, 0, 0);\n              yPosition = addWrappedText('Suggestions:', 9, yPosition);\n\n              rec.suggestions.slice(0, 2).forEach((suggestion: string) => {\n                yPosition = addWrappedText(`• ${suggestion}`, 8, yPosition);\n              });\n            }\n\n            yPosition += 8;\n          }\n        });\n      } else {\n        yPosition = addWrappedText('No critical performance issues detected.', 10, yPosition);\n      }\n      yPosition += 10;\n\n      // Recommendations by Category - Always show this section\n      yPosition = addSection('Detailed Recommendations by Category');\n\n      if (statsData.recommendationsByCategory) {\n        const categories = ['performance', 'rendering', 'memory', 'best-practice'];\n        let hasAnyRecommendations = false;\n\n        categories.forEach((category) => {\n          const categoryRecs = statsData.recommendationsByCategory[category];\n          if (categoryRecs && categoryRecs.length > 0) {\n            hasAnyRecommendations = true;\n            const categoryTitle =\n              category.charAt(0).toUpperCase() + category.slice(1).replace('-', ' ');\n            yPosition = addSection(`${categoryTitle} Recommendations`);\n\n            categoryRecs.slice(0, 3).forEach((rec: any) => {\n              // Show top 3 per category\n              // Check space for this recommendation\n              checkNewPage(40);\n\n              // Recommendation title with severity color\n              pdf.setFontSize(11);\n              pdf.setFont('helvetica', 'bold');\n              const severityColor =\n                rec.severity === 'critical'\n                  ? [220, 53, 69]\n                  : rec.severity === 'high'\n                  ? [255, 152, 0]\n                  : rec.severity === 'medium'\n                  ? [255, 193, 7]\n                  : [40, 167, 69];\n              pdf.setTextColor(severityColor[0], severityColor[1], severityColor[2]);\n              yPosition = addWrappedText(`• ${rec.title}`, 11, yPosition);\n\n              // Description\n              pdf.setFontSize(9);\n              pdf.setFont('helvetica', 'normal');\n              pdf.setTextColor(0, 0, 0);\n              yPosition = addWrappedText(rec.description, 9, yPosition);\n\n              // Impact\n              pdf.setFontSize(8);\n              pdf.setFont('helvetica', 'italic');\n              pdf.setTextColor(102, 102, 102);\n              yPosition = addWrappedText(`Impact: ${rec.impact}`, 8, yPosition);\n\n              yPosition += 5;\n            });\n            yPosition += 8;\n          }\n        });\n\n        if (!hasAnyRecommendations) {\n          yPosition = addWrappedText(\n            'No specific recommendations in any category. Your application is performing well across all areas.',\n            10,\n            yPosition\n          );\n        }\n      } else {\n        yPosition = addWrappedText('No categorized recommendations available.', 10, yPosition);\n      }\n\n      // Application Mode\n      yPosition = addSection('Application Mode');\n      const modeText = this.profilerService.isZonedMode()\n        ? 'Zoned (with Zone.js)'\n        : 'Zoneless (without Zone.js)';\n      yPosition = addWrappedText(`Mode: ${modeText}`, 12, yPosition);\n\n      yPosition += 20;\n\n      // Performance Thresholds\n      if (statsData.performanceThresholds) {\n        yPosition = addSection('Performance Standards');\n        const thresholds = [\n          {\n            label: 'Target Frame Time (60fps)',\n            value: `${statsData.performanceThresholds.targetFrameTime}ms`,\n          },\n          {\n            label: 'Acceptable Frame Time (30fps)',\n            value: `${statsData.performanceThresholds.acceptableFrameTime}ms`,\n          },\n          {\n            label: 'Critical Frame Time',\n            value: `${statsData.performanceThresholds.criticalFrameTime}ms`,\n          },\n        ];\n\n        thresholds.forEach((threshold) => {\n          yPosition = addWrappedText(`${threshold.label}: ${threshold.value}`, 10, yPosition);\n        });\n        yPosition += 10;\n      }\n\n      // Footer\n      yPosition = addWrappedText('Generated by @codezetta/ng-profiler', 10, yPosition);\n      yPosition = addWrappedText(\n        'For more information, visit: https://github.com/codezetta/ng-profiler',\n        10,\n        yPosition\n      );\n\n      // Save PDF\n      const filename = `ng-profiler-report-${new Date()\n        .toISOString()\n        .slice(0, 19)\n        .replace(/:/g, '-')}.pdf`;\n\n      pdf.save(filename);\n    } catch (error) {\n      console.error('NgProfiler: PDF export failed:', error);\n      alert('PDF export failed. Please check the browser console for details.');\n    } finally {\n      // Always resume profiling, even if export failed\n      this.profilerService.resumeProfiling();\n      this.profilerStore.resumeRenderCounting();\n    }\n  }\n\n  trackByComponent(index: number, component: ComponentRenderStats): string {\n    return component.name;\n  }\n\n  trackByRecommendation(index: number, recommendation: PerformanceRecommendation): string {\n    return recommendation.id;\n  }\n\n  showAllRecommendations(): void {\n    // This could open a modal or expand the recommendations section\n    // For now, just a placeholder for future implementation\n  }\n}\n","import { Directive, ElementRef, OnInit, OnDestroy, Input, NgZone } from '@angular/core';\nimport { ProfilerStore } from '../services/profiler-store.service';\n\n@Directive({\n  selector: '[codezettaNgProfiler]',\n  standalone: true,\n})\nexport class NgProfilerDirective implements OnInit, OnDestroy {\n  @Input('codezettaNgProfiler') componentName?: string;\n\n  private renderCount = 0;\n  private elementName: string;\n  private isDestroyed = false;\n  private observer: MutationObserver | null = null;\n  private resizeObserver: ResizeObserver | null = null;\n\n  constructor(\n    private elementRef: ElementRef<HTMLElement>,\n    private profilerStore: ProfilerStore,\n    private ngZone: NgZone\n  ) {\n    this.elementName = this.getComponentName();\n  }\n\n  ngOnInit(): void {\n    this.setupPassiveObservation();\n    this.updateHeatmapAttribute();\n  }\n\n  ngOnDestroy(): void {\n    this.isDestroyed = true;\n    this.cleanupObservers();\n  }\n\n  /**\n   * Setup passive observation using MutationObserver and ResizeObserver\n   */\n  private setupPassiveObservation(): void {\n    if (this.isDestroyed) return;\n\n    const element = this.elementRef.nativeElement;\n\n    // Use MutationObserver to detect DOM changes (passive observation)\n    this.observer = new MutationObserver((mutations) => {\n      if (this.isDestroyed) return;\n\n      // Only count mutations that indicate actual content changes\n      const hasSignificantChanges = mutations.some(\n        (mutation) =>\n          mutation.type === 'childList' ||\n          mutation.type === 'attributes' ||\n          (mutation.type === 'characterData' && mutation.target.textContent?.trim())\n      );\n\n      if (hasSignificantChanges) {\n        this.ngZone.runOutsideAngular(() => {\n          this.renderCount++;\n          this.profilerStore.incrementRenderCount(this.elementName, element);\n          this.updateHeatmapAttribute();\n        });\n      }\n    });\n\n    // Use ResizeObserver to detect size changes (another indicator of re-renders)\n    if (window.ResizeObserver) {\n      this.resizeObserver = new ResizeObserver((entries) => {\n        if (this.isDestroyed) return;\n\n        // Only count significant size changes\n        const hasSignificantResize = entries.some((entry) => {\n          const { width, height } = entry.contentRect;\n          return width > 0 && height > 0; // Only count if element has actual dimensions\n        });\n\n        if (hasSignificantResize) {\n          this.ngZone.runOutsideAngular(() => {\n            this.renderCount++;\n            this.profilerStore.incrementRenderCount(this.elementName, element);\n            this.updateHeatmapAttribute();\n          });\n        }\n      });\n    }\n\n    // Start observing\n    this.observer.observe(element, {\n      childList: true,\n      subtree: true,\n      attributes: true,\n      characterData: true,\n    });\n\n    if (this.resizeObserver) {\n      this.resizeObserver.observe(element);\n    }\n  }\n\n  /**\n   * Cleanup observers to prevent memory leaks\n   */\n  private cleanupObservers(): void {\n    if (this.observer) {\n      this.observer.disconnect();\n      this.observer = null;\n    }\n    if (this.resizeObserver) {\n      this.resizeObserver.disconnect();\n      this.resizeObserver = null;\n    }\n  }\n\n  /**\n   * Get component name for tracking\n   */\n  private getComponentName(): string {\n    if (this.componentName) {\n      return this.componentName;\n    }\n\n    const element = this.elementRef.nativeElement;\n\n    // Try to get component name from various sources\n    if (element.tagName) {\n      return element.tagName.toLowerCase();\n    }\n\n    if (element.className) {\n      return element.className.split(' ')[0];\n    }\n\n    return 'unknown-component';\n  }\n\n  /**\n   * Update heatmap attribute based on render count\n   */\n  private updateHeatmapAttribute(): void {\n    const element = this.elementRef.nativeElement;\n    const severity = this.getSeverityLevel();\n\n    if (severity) {\n      element.setAttribute('data-ng-profiler', severity);\n    } else {\n      element.removeAttribute('data-ng-profiler');\n    }\n  }\n\n  /**\n   * Get severity level based on render count\n   */\n  private getSeverityLevel(): 'low' | 'medium' | 'high' | null {\n    if (this.renderCount <= 5) return null; // No heatmap for low counts\n    if (this.renderCount <= 20) return 'low';\n    if (this.renderCount <= 50) return 'medium';\n    return 'high';\n  }\n\n  /**\n   * Get current render count\n   */\n  getRenderCount(): number {\n    return this.renderCount;\n  }\n}\n","import { NgModule, ModuleWithProviders } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgProfilerOverlayComponent } from './components/ng-profiler-overlay.component';\nimport { NgProfilerDirective } from './directives/ng-profiler.directive';\nimport { NgProfilerService } from './services/ng-profiler.service';\nimport { ProfilerStore } from './services/profiler-store.service';\nimport { NgProfilerConfig, NG_PROFILER_CONFIG } from './models/ng-profiler-config';\n\n@NgModule({\n  imports: [\n    CommonModule,\n    NgProfilerOverlayComponent,\n    NgProfilerDirective\n  ],\n  exports: [\n    NgProfilerOverlayComponent,\n    NgProfilerDirective\n  ]\n})\nexport class NgProfilerModule {\n  static forRoot(config?: NgProfilerConfig): ModuleWithProviders<NgProfilerModule> {\n    return {\n      ngModule: NgProfilerModule,\n      providers: [\n        ProfilerStore,\n        NgProfilerService,\n        {\n          provide: NG_PROFILER_CONFIG,\n          useValue: config || {}\n        }\n      ]\n    };\n  }\n}\n","import { Provider } from '@angular/core';\nimport { ProfilerStore } from '../services/profiler-store.service';\nimport { NgProfilerService } from '../services/ng-profiler.service';\nimport { NgProfilerConfig, NG_PROFILER_CONFIG } from '../models/ng-profiler-config';\n\n/**\n * Provides the NgProfiler services for standalone components\n * @param config Optional configuration for the profiler\n * @returns Array of providers for dependency injection\n */\nexport function provideNgProfiler(config?: NgProfilerConfig): Provider[] {\n  return [\n    ProfilerStore,\n    NgProfilerService,\n    {\n      provide: NG_PROFILER_CONFIG,\n      useValue: config || {},\n    },\n  ];\n}\n","/*\n * Public API Surface of ng-profiler\n */\n\n// NgModule approach\nexport * from './ng-profiler.module';\n\n// Standalone components\nexport * from './components/ng-profiler-overlay.component';\nexport * from './directives/ng-profiler.directive';\n\n// Services\nexport * from './services/ng-profiler.service';\nexport * from './services/profiler-store.service';\nexport * from './services/recommendation.service';\n\n// Models and types\nexport * from './models/ng-profiler-config';\n\n// Standalone providers\nexport * from './providers/ng-profiler.providers';\n","/*\n * Public API Surface of ng-profiler\n */\n\nexport * from './lib/ng-profiler';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.RecommendationService","i1.ProfilerStore","i2.NgProfilerService"],"mappings":"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"}