{"version":3,"file":"PerformanceObservatory.mjs","sources":["../../../src/lib/performance/PerformanceObservatory.tsx"],"sourcesContent":["/**\n * @file Performance Observatory Dashboard\n * @description Real-time performance monitoring dashboard component for development\n * and debugging. Displays Core Web Vitals, resource timings, and performance insights.\n *\n * FEATURE 5: Performance Observatory\n *\n * NOTE: This file uses inline styles intentionally for self-contained portability\n * as a development-only monitoring tool. Inline styles allow this component to work\n * without external CSS dependencies.\n *\n * @webhint-disable no-inline-styles\n */\n\nimport React, {\n  useState,\n  useMemo,\n  useContext,\n  useLayoutEffect,\n  type ReactNode,\n  type CSSProperties,\n} from 'react';\nimport {\n  PerformanceObservatoryContext,\n  type PerformanceObservatoryContextValue,\n} from '../contexts/PerformanceObservatoryContext';\nimport {\n  getVitalsCollector,\n  type VitalMetricEntry,\n  type VitalsSnapshot,\n  type VitalMetricName,\n  type PerformanceRating,\n  type BudgetViolation,\n  formatMetricValue,\n  getRatingColor,\n  getMetricTarget,\n  DEFAULT_BUDGETS,\n} from './vitals';\nimport { formatBytes } from '../../config/performance.config';\nimport { isDev } from '@/lib/core/config/env-helper';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Resource statistics\n */\ninterface ResourceStats {\n  total: number;\n  totalSize: number;\n  totalDuration: number;\n  byType: Record<string, { count: number; size: number; duration: number }>;\n  slowResources: PerformanceResourceTiming[];\n}\n\n/**\n * Long task entry\n */\ninterface LongTaskEntry {\n  startTime: number;\n  duration: number;\n  name: string;\n}\n\n/**\n * Props for PerformanceObservatory\n */\nexport interface PerformanceObservatoryProps {\n  /** Show in development only */\n  devOnly?: boolean;\n  /** Initial collapsed state */\n  defaultCollapsed?: boolean;\n  /** Position on screen */\n  position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';\n  /** Enable analytics reporting */\n  reportToAnalytics?: boolean;\n  /** Analytics endpoint */\n  analyticsEndpoint?: string;\n  /** Sample rate for collection */\n  sampleRate?: number;\n  /** Enable debug mode */\n  debug?: boolean;\n  /** Custom z-index */\n  zIndex?: number;\n}\n\n/**\n * Props for PerformanceProvider\n */\nexport interface PerformanceProviderProps {\n  children: ReactNode;\n  /** Collector configuration */\n  reportToAnalytics?: boolean;\n  analyticsEndpoint?: string;\n  sampleRate?: number;\n  debug?: boolean;\n  /** Callback on metric update */\n  onMetric?: (metric: VitalMetricEntry, snapshot: VitalsSnapshot) => void;\n  /** Callback on budget violation */\n  onViolation?: (violation: BudgetViolation) => void;\n}\n\n// ============================================================================\n// Context\n// ============================================================================\n\n/**\n * Hook to access performance observatory context\n */\n// eslint-disable-next-line react-refresh/only-export-components\nexport function usePerformanceObservatory(): PerformanceObservatoryContextValue {\n  const context = useContext(PerformanceObservatoryContext);\n  if (!context) {\n    throw new Error('usePerformanceObservatory must be used within PerformanceProvider');\n  }\n  return context;\n}\n\n// ============================================================================\n// Provider Component\n// ============================================================================\n\n/**\n * Performance monitoring provider that collects Web Vitals and resource metrics\n */\nexport function PerformanceProvider({\n  children,\n  reportToAnalytics = false,\n  analyticsEndpoint,\n  sampleRate = 1,\n  debug = false,\n  onMetric,\n  onViolation,\n}: PerformanceProviderProps): React.JSX.Element {\n  const [isCollecting, setIsCollecting] = useState(true);\n\n  const collector = useMemo(\n    () =>\n      getVitalsCollector({\n        reportToAnalytics,\n        analyticsEndpoint,\n        sampleRate,\n        debug,\n        onMetric: (metric, snap) => {\n          onMetric?.(metric, snap);\n        },\n        onBudgetViolation: (violation) => {\n          onViolation?.(violation);\n        },\n      }),\n    [reportToAnalytics, analyticsEndpoint, sampleRate, debug, onMetric, onViolation]\n  );\n\n  // Initialize vitals collection\n  useLayoutEffect(() => {\n    const cleanup = collector.init();\n\n    return () => {\n      cleanup();\n      setIsCollecting(false);\n    };\n  }, [collector]);\n\n  const value = useMemo<PerformanceObservatoryContextValue>(\n    () => ({\n      metrics: [],\n      recordMetric: () => {},\n      clearMetrics: () => {},\n      getMetric: () => undefined,\n      getMetricsByName: () => [],\n      isObserving: isCollecting,\n      startObserving: () => setIsCollecting(true),\n      stopObserving: () => setIsCollecting(false),\n    }),\n    [isCollecting]\n  );\n\n  return (\n    <PerformanceObservatoryContext.Provider value={value}>\n      {children}\n    </PerformanceObservatoryContext.Provider>\n  );\n}\n\n// ============================================================================\n// Observatory Dashboard Component\n// ============================================================================\n\n/**\n * Metric gauge component\n */\nfunction MetricGauge({\n  name,\n  entry,\n}: {\n  name: VitalMetricName;\n  entry: VitalMetricEntry | undefined;\n}): React.JSX.Element {\n  const budget = DEFAULT_BUDGETS[name];\n  const value = entry?.value ?? 0;\n  const rating = entry?.rating ?? 'good';\n\n  // Calculate gauge percentage\n  const maxValue = budget.poor * 1.5;\n  const percentage = Math.min((value / maxValue) * 100, 100);\n\n  const badgeStyle = useMemo(\n    (): CSSProperties => ({\n      ...styles.metricBadge,\n      backgroundColor: getRatingColor(rating),\n    }),\n    [rating]\n  );\n\n  const gaugeFillStyle = useMemo(\n    (): CSSProperties => ({\n      ...styles.gaugeFill,\n      width: `${percentage}%`,\n      backgroundColor: getRatingColor(rating),\n    }),\n    [percentage, rating]\n  );\n\n  const goodMarkerStyle = useMemo(\n    (): CSSProperties => ({\n      ...styles.gaugeMarker,\n      left: `${(budget.good / maxValue) * 100}%`,\n    }),\n    [budget.good, maxValue]\n  );\n\n  const poorMarkerStyle = useMemo(\n    (): CSSProperties => ({\n      ...styles.gaugeMarker,\n      left: `${(budget.poor / maxValue) * 100}%`,\n    }),\n    [budget.poor, maxValue]\n  );\n\n  return (\n    <div style={styles.metricCard}>\n      <div style={styles.metricHeader}>\n        <span style={styles.metricName}>{name}</span>\n        <span style={badgeStyle}>\n          {rating === 'good' && 'Pass'}\n          {rating === 'needs-improvement' && 'Warn'}\n          {rating === 'poor' && 'Fail'}\n        </span>\n      </div>\n\n      <div style={styles.metricValue}>{entry != null ? formatMetricValue(name, value) : '--'}</div>\n\n      <div style={styles.gaugeContainer}>\n        <div style={gaugeFillStyle} />\n        {/* Threshold markers */}\n        <div style={goodMarkerStyle} />\n        <div style={poorMarkerStyle} />\n      </div>\n\n      <div style={styles.metricTarget}>Target: {getMetricTarget(name)}</div>\n    </div>\n  );\n}\n\n/**\n * Resource breakdown component\n */\nfunction ResourceBreakdown({ stats }: { stats: ResourceStats }): React.JSX.Element {\n  const sortedTypes = Object.entries(stats.byType).sort(([, a], [, b]) => b.size - a.size);\n\n  return (\n    <div style={styles.resourceSection}>\n      <div style={styles.sectionTitle}>Resources ({stats.total})</div>\n      <div style={styles.resourceTotal}>Total: {formatBytes(stats.totalSize)}</div>\n      <div style={styles.resourceList}>\n        {sortedTypes.slice(0, 5).map(([type, data]) => (\n          <div key={type} style={styles.resourceItem}>\n            <span style={styles.resourceType}>{type}</span>\n            <span style={styles.resourceCount}>{data.count}</span>\n            <span style={styles.resourceSize}>{formatBytes(data.size)}</span>\n          </div>\n        ))}\n      </div>\n      {stats.slowResources.length > 0 && (\n        <div style={styles.slowResources}>\n          <div style={styles.slowResourcesTitle}>Slow Resources ({stats.slowResources.length})</div>\n          {stats.slowResources.slice(0, 3).map((resource, i) => (\n            <div key={i} style={styles.slowResourceItem}>\n              <span style={styles.slowResourceName}>\n                {resource.name.split('/').pop()?.slice(0, 30)}\n              </span>\n              <span style={styles.slowResourceDuration}>{Math.round(resource.duration)}ms</span>\n            </div>\n          ))}\n        </div>\n      )}\n    </div>\n  );\n}\n\n/**\n * Long tasks monitor\n */\nfunction LongTasksMonitor({ tasks }: { tasks: LongTaskEntry[] }): React.JSX.Element {\n  const recentTasks = tasks.slice(-5);\n\n  if (recentTasks.length === 0) {\n    return (\n      <div style={styles.longTasksSection}>\n        <div style={styles.sectionTitle}>Long Tasks</div>\n        <div style={styles.emptyState}>No long tasks detected</div>\n      </div>\n    );\n  }\n\n  return (\n    <div style={styles.longTasksSection}>\n      <div style={styles.sectionTitle}>Long Tasks ({tasks.length})</div>\n      {recentTasks.map((task, i) => (\n        <div key={i} style={styles.longTaskItem}>\n          <span style={styles.longTaskDuration}>{Math.round(task.duration)}ms</span>\n          <span style={styles.longTaskTime}>at {Math.round(task.startTime)}ms</span>\n        </div>\n      ))}\n    </div>\n  );\n}\n\n/**\n * Overall score display\n */\nfunction ScoreDisplay({\n  score,\n  rating,\n}: {\n  score: number;\n  rating: PerformanceRating;\n}): React.JSX.Element {\n  const scoreCircleStyle = useMemo(\n    (): CSSProperties => ({\n      ...styles.scoreCircle,\n      borderColor: getRatingColor(rating),\n      color: getRatingColor(rating),\n    }),\n    [rating]\n  );\n\n  return (\n    <div style={styles.scoreContainer}>\n      <div style={scoreCircleStyle}>{score}</div>\n      <div style={styles.scoreLabel}>Performance Score</div>\n    </div>\n  );\n}\n\n/**\n * Performance Observatory dashboard component\n *\n * @example\n * ```tsx\n * <PerformanceProvider>\n *   <App />\n *   <PerformanceObservatory devOnly position=\"bottom-right\" />\n * </PerformanceProvider>\n * ```\n */\nexport function PerformanceObservatory({\n  devOnly = true,\n  defaultCollapsed = true,\n  position = 'bottom-right',\n  zIndex = 9999,\n}: PerformanceObservatoryProps): React.JSX.Element | null {\n  const { isObserving } = usePerformanceObservatory();\n  const [isCollapsed, setIsCollapsed] = useState(defaultCollapsed);\n  const [activeTab, setActiveTab] = useState<'vitals' | 'resources' | 'tasks'>('vitals');\n  const [snapshot] = useState<VitalsSnapshot | null>(null);\n  const [resourceStats] = useState<ResourceStats | null>(null);\n  const [longTasks] = useState<LongTaskEntry[]>([]);\n\n  const isCollecting = isObserving;\n  const positionStyles = getPositionStyles(position);\n\n  const collapsedButtonStyle = useMemo(\n    (): CSSProperties => ({\n      ...styles.collapsedButton,\n      ...positionStyles,\n      zIndex,\n    }),\n    [positionStyles, zIndex]\n  );\n\n  const containerStyle = useMemo(\n    (): CSSProperties => ({\n      ...styles.container,\n      ...positionStyles,\n      zIndex,\n    }),\n    [positionStyles, zIndex]\n  );\n\n  const scoreColorStyle = useMemo(\n    (): CSSProperties => ({\n      color: snapshot != null ? getRatingColor(snapshot.rating) : '#fff',\n    }),\n    [snapshot]\n  );\n\n  // Check if we should render\n  const isDevEnvironment = import.meta.env?.DEV ?? isDev();\n  if (devOnly && !isDevEnvironment) {\n    return null;\n  }\n\n  if (isCollapsed) {\n    return (\n      <button\n        onClick={() => setIsCollapsed(false)}\n        style={collapsedButtonStyle}\n        title=\"Open Performance Observatory\"\n      >\n        <span style={styles.collapsedIcon}>\n          {snapshot != null ? <span style={scoreColorStyle}>{snapshot.score}</span> : 'P'}\n        </span>\n      </button>\n    );\n  }\n\n  const getTabStyle = (tab: 'vitals' | 'resources' | 'tasks'): CSSProperties => ({\n    ...styles.tab,\n    ...(activeTab === tab ? styles.tabActive : {}),\n  });\n\n  return (\n    <div style={containerStyle}>\n      {/* Header */}\n      <div style={styles.header}>\n        <span style={styles.title}>Performance Observatory</span>\n        <div style={styles.headerActions}>\n          <span style={styles.status}>{isCollecting ? 'Collecting' : 'Idle'}</span>\n          <button onClick={() => setIsCollapsed(true)} style={styles.closeButton}>\n            x\n          </button>\n        </div>\n      </div>\n\n      {/* Tabs */}\n      <div style={styles.tabs}>\n        {(['vitals', 'resources', 'tasks'] as const).map((tab) => (\n          <button key={tab} onClick={() => setActiveTab(tab)} style={getTabStyle(tab)}>\n            {tab.charAt(0).toUpperCase() + tab.slice(1)}\n          </button>\n        ))}\n      </div>\n\n      {/* Content */}\n      <div style={styles.content}>\n        {activeTab === 'vitals' && (\n          <>\n            {snapshot != null && <ScoreDisplay score={snapshot.score} rating={snapshot.rating} />}\n            <div style={styles.metricsGrid}>\n              {(['LCP', 'INP', 'CLS', 'FCP', 'TTFB'] as VitalMetricName[]).map((name) => (\n                <MetricGauge key={name} name={name} entry={snapshot?.[name]} />\n              ))}\n            </div>\n          </>\n        )}\n\n        {activeTab === 'resources' && resourceStats != null && (\n          <ResourceBreakdown stats={resourceStats} />\n        )}\n\n        {activeTab === 'tasks' && <LongTasksMonitor tasks={longTasks} />}\n      </div>\n\n      {/* Footer */}\n      <div style={styles.footer}>\n        <span style={styles.footerPath}>{snapshot?.path ?? '/'}</span>\n        <span style={styles.footerTime}>\n          {snapshot != null ? new Date(snapshot.timestamp).toLocaleTimeString() : '--'}\n        </span>\n      </div>\n    </div>\n  );\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nfunction getPositionStyles(\n  position: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left'\n): React.CSSProperties {\n  switch (position) {\n    case 'bottom-right':\n      return { bottom: 16, right: 16 };\n    case 'bottom-left':\n      return { bottom: 16, left: 16 };\n    case 'top-right':\n      return { top: 16, right: 16 };\n    case 'top-left':\n      return { top: 16, left: 16 };\n  }\n}\n\nconst styles: Record<string, React.CSSProperties> = {\n  container: {\n    position: 'fixed',\n    width: 360,\n    maxHeight: '80vh',\n    backgroundColor: '#1a1a2e',\n    borderRadius: 12,\n    boxShadow: '0 4px 24px rgba(0, 0, 0, 0.4)',\n    fontFamily: 'system-ui, -apple-system, sans-serif',\n    fontSize: 13,\n    color: '#e0e0e0',\n    overflow: 'hidden',\n    display: 'flex',\n    flexDirection: 'column',\n  },\n  collapsedButton: {\n    position: 'fixed',\n    width: 48,\n    height: 48,\n    borderRadius: '50%',\n    backgroundColor: '#1a1a2e',\n    border: '2px solid #3b82f6',\n    cursor: 'pointer',\n    display: 'flex',\n    alignItems: 'center',\n    justifyContent: 'center',\n    boxShadow: '0 2px 12px rgba(0, 0, 0, 0.3)',\n  },\n  collapsedIcon: {\n    fontSize: 16,\n    fontWeight: 700,\n    color: '#fff',\n  },\n  header: {\n    display: 'flex',\n    justifyContent: 'space-between',\n    alignItems: 'center',\n    padding: '12px 16px',\n    backgroundColor: '#16213e',\n    borderBottom: '1px solid #2a2a4a',\n  },\n  title: {\n    fontWeight: 600,\n    fontSize: 14,\n    color: '#fff',\n  },\n  headerActions: {\n    display: 'flex',\n    alignItems: 'center',\n    gap: 12,\n  },\n  status: {\n    fontSize: 11,\n    color: '#22c55e',\n    textTransform: 'uppercase',\n    letterSpacing: 0.5,\n  },\n  closeButton: {\n    background: 'none',\n    border: 'none',\n    color: '#a0a0a0',\n    cursor: 'pointer',\n    fontSize: 18,\n    padding: 0,\n    lineHeight: 1,\n  },\n  tabs: {\n    display: 'flex',\n    backgroundColor: '#16213e',\n    borderBottom: '1px solid #2a2a4a',\n  },\n  tab: {\n    flex: 1,\n    padding: '8px 12px',\n    backgroundColor: 'transparent',\n    border: 'none',\n    color: '#a0a0a0',\n    cursor: 'pointer',\n    fontSize: 12,\n    borderBottom: '2px solid transparent',\n  },\n  tabActive: {\n    color: '#3b82f6',\n    borderBottomColor: '#3b82f6',\n  },\n  content: {\n    padding: 16,\n    overflow: 'auto',\n    flex: 1,\n  },\n  scoreContainer: {\n    display: 'flex',\n    flexDirection: 'column',\n    alignItems: 'center',\n    marginBottom: 16,\n  },\n  scoreCircle: {\n    width: 64,\n    height: 64,\n    borderRadius: '50%',\n    border: '3px solid',\n    display: 'flex',\n    alignItems: 'center',\n    justifyContent: 'center',\n    fontSize: 24,\n    fontWeight: 700,\n  },\n  scoreLabel: {\n    marginTop: 8,\n    fontSize: 11,\n    color: '#a0a0a0',\n    textTransform: 'uppercase',\n    letterSpacing: 0.5,\n  },\n  metricsGrid: {\n    display: 'grid',\n    gridTemplateColumns: 'repeat(2, 1fr)',\n    gap: 12,\n  },\n  metricCard: {\n    backgroundColor: '#16213e',\n    borderRadius: 8,\n    padding: 12,\n  },\n  metricHeader: {\n    display: 'flex',\n    justifyContent: 'space-between',\n    alignItems: 'center',\n    marginBottom: 8,\n  },\n  metricName: {\n    fontWeight: 600,\n    fontSize: 12,\n    color: '#fff',\n  },\n  metricBadge: {\n    fontSize: 9,\n    fontWeight: 600,\n    padding: '2px 6px',\n    borderRadius: 4,\n    color: '#fff',\n    textTransform: 'uppercase',\n  },\n  metricValue: {\n    fontSize: 20,\n    fontWeight: 700,\n    color: '#fff',\n    marginBottom: 8,\n  },\n  gaugeContainer: {\n    height: 4,\n    backgroundColor: '#2a2a4a',\n    borderRadius: 2,\n    position: 'relative',\n    overflow: 'hidden',\n    marginBottom: 8,\n  },\n  gaugeFill: {\n    height: '100%',\n    borderRadius: 2,\n    transition: 'width 0.3s ease',\n  },\n  gaugeMarker: {\n    position: 'absolute',\n    top: 0,\n    width: 2,\n    height: '100%',\n    backgroundColor: 'rgba(255, 255, 255, 0.3)',\n  },\n  metricTarget: {\n    fontSize: 10,\n    color: '#6b7280',\n  },\n  resourceSection: {\n    padding: 0,\n  },\n  sectionTitle: {\n    fontWeight: 600,\n    fontSize: 12,\n    color: '#fff',\n    marginBottom: 12,\n  },\n  resourceTotal: {\n    fontSize: 18,\n    fontWeight: 700,\n    color: '#fff',\n    marginBottom: 12,\n  },\n  resourceList: {\n    display: 'flex',\n    flexDirection: 'column',\n    gap: 8,\n  },\n  resourceItem: {\n    display: 'flex',\n    alignItems: 'center',\n    backgroundColor: '#16213e',\n    padding: '8px 12px',\n    borderRadius: 6,\n  },\n  resourceType: {\n    flex: 1,\n    fontWeight: 500,\n    textTransform: 'capitalize',\n  },\n  resourceCount: {\n    marginRight: 16,\n    color: '#6b7280',\n  },\n  resourceSize: {\n    fontWeight: 600,\n    color: '#3b82f6',\n  },\n  slowResources: {\n    marginTop: 16,\n    padding: 12,\n    backgroundColor: 'rgba(239, 68, 68, 0.1)',\n    borderRadius: 6,\n    border: '1px solid rgba(239, 68, 68, 0.2)',\n  },\n  slowResourcesTitle: {\n    fontSize: 11,\n    fontWeight: 600,\n    color: '#ef4444',\n    marginBottom: 8,\n  },\n  slowResourceItem: {\n    display: 'flex',\n    justifyContent: 'space-between',\n    fontSize: 11,\n    padding: '4px 0',\n  },\n  slowResourceName: {\n    color: '#a0a0a0',\n  },\n  slowResourceDuration: {\n    color: '#ef4444',\n    fontWeight: 600,\n  },\n  longTasksSection: {\n    padding: 0,\n  },\n  emptyState: {\n    color: '#6b7280',\n    fontStyle: 'italic',\n    fontSize: 12,\n  },\n  longTaskItem: {\n    display: 'flex',\n    justifyContent: 'space-between',\n    backgroundColor: '#16213e',\n    padding: '8px 12px',\n    borderRadius: 6,\n    marginBottom: 8,\n  },\n  longTaskDuration: {\n    fontWeight: 600,\n    color: '#f59e0b',\n  },\n  longTaskTime: {\n    color: '#6b7280',\n    fontSize: 11,\n  },\n  footer: {\n    display: 'flex',\n    justifyContent: 'space-between',\n    padding: '8px 16px',\n    backgroundColor: '#16213e',\n    borderTop: '1px solid #2a2a4a',\n    fontSize: 11,\n    color: '#6b7280',\n  },\n  footerPath: {\n    maxWidth: 200,\n    overflow: 'hidden',\n    textOverflow: 'ellipsis',\n    whiteSpace: 'nowrap',\n  },\n  footerTime: {},\n};\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport {\n  PerformanceObservatoryContext,\n  type PerformanceObservatoryContextValue,\n  type ResourceStats,\n  type LongTaskEntry,\n};\n"],"names":["usePerformanceObservatory","context","useContext","PerformanceObservatoryContext","PerformanceProvider","children","reportToAnalytics","analyticsEndpoint","sampleRate","debug","onMetric","onViolation","isCollecting","setIsCollecting","useState","collector","useMemo","getVitalsCollector","metric","snap","violation","useLayoutEffect","cleanup","value","MetricGauge","name","entry","budget","DEFAULT_BUDGETS","rating","maxValue","percentage","badgeStyle","styles","getRatingColor","gaugeFillStyle","goodMarkerStyle","poorMarkerStyle","jsx","jsxs","formatMetricValue","getMetricTarget","ResourceBreakdown","stats","sortedTypes","a","b","formatBytes","type","data","resource","i","LongTasksMonitor","tasks","recentTasks","task","ScoreDisplay","score","scoreCircleStyle","PerformanceObservatory","devOnly","defaultCollapsed","position","zIndex","isObserving","isCollapsed","setIsCollapsed","activeTab","setActiveTab","snapshot","resourceStats","longTasks","positionStyles","getPositionStyles","collapsedButtonStyle","containerStyle","scoreColorStyle","getTabStyle","tab","Fragment"],"mappings":"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"}